From a4f5a4459b68e6850a4ba8f8451128608c93c73e Mon Sep 17 00:00:00 2001 From: rob Date: Thu, 31 Jan 2013 11:12:45 +0100 Subject: [PATCH 01/52] Added convenience method to remove all children from an ActorContainer --- src/Foundation/ActorContainer.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Foundation/ActorContainer.js b/src/Foundation/ActorContainer.js index bbda20a3..67f160a7 100644 --- a/src/Foundation/ActorContainer.js +++ b/src/Foundation/ActorContainer.js @@ -440,6 +440,18 @@ CAAT.Module({ } return -1; }, + /** + * Removed all Actors from this ActorContainer. + * + * @return array of former children + */ + removeAllChildren: function() { + var cl = this.childrenList.slice(); // Make a shalow copy + for (var pos = cl.length-1;pos>=0;pos--) { + this.removeChildAt(pos); + } + return cl; + }, removeChildAt:function (pos) { var cl = this.childrenList; var rm; @@ -457,7 +469,7 @@ CAAT.Module({ return null; }, /** - * Removed an Actor form this ActorContainer. + * Removed an Actor from this ActorContainer. * If the Actor is not contained into this Container, nothing happends. * * @param child a CAAT.Foundation.Actor object instance. From 1fb5ce6437cba31e162f003dee3c9cb09a8bf3cd Mon Sep 17 00:00:00 2001 From: rob Date: Thu, 31 Jan 2013 11:15:58 +0100 Subject: [PATCH 02/52] CAAT Path incorrectly assumed the starting point is always the first point of the first path segment. EG: when creating a path consisting of arcTo path segments, the first point is NOT the first arcTo path segment point. Path.beginPath should register the specified starting point (like documented...) and use that as a starting point, with a fallback to the first path segment point when the starting point was not specified. --- src/PathUtil/Path.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/PathUtil/Path.js b/src/PathUtil/Path.js index af88ea0c..e0bb25d9 100644 --- a/src/PathUtil/Path.js +++ b/src/PathUtil/Path.js @@ -40,6 +40,7 @@ CAAT.Module( { */ beginPathX: -1, beginPathY: -1, + beginPoint: null, /* last path coordinates position (using when building the path). @@ -96,9 +97,10 @@ CAAT.Module( { director.modelViewMatrix.transformRenderingContext( ctx ); ctx.beginPath(); ctx.globalCompositeOperation= 'source-out'; + var startPos = this.startCurvePosition(); ctx.moveTo( - this.getFirstPathSegment().startCurvePosition().x, - this.getFirstPathSegment().startCurvePosition().y + startPos.x, + startPos.y ); for( var i=0; i Date: Fri, 8 Feb 2013 19:26:27 +0100 Subject: [PATCH 03/52] if we already set a width on a label and don't supply it in setText, take the previously defined width --- src/Foundation/UI/Label.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Foundation/UI/Label.js b/src/Foundation/UI/Label.js index 0d144ad2..794f1e63 100644 --- a/src/Foundation/UI/Label.js +++ b/src/Foundation/UI/Label.js @@ -924,6 +924,7 @@ CAAT.Module( { if ( null===_text ) { return; } + width = width || this.width; var cached= this.cached; if ( cached ) { From f6f89f434f43619dbc42e6645678d99454be81c7 Mon Sep 17 00:00:00 2001 From: Rob Boerman Date: Fri, 15 Feb 2013 11:01:40 +0100 Subject: [PATCH 04/52] Added Observable pattern to Actor. Any Actor and descendent can now accept listeners to events and have events fired on it. --- src/Foundation/Actor.js | 79 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/Foundation/Actor.js b/src/Foundation/Actor.js index f122b44b..8d735cb2 100644 --- a/src/Foundation/Actor.js +++ b/src/Foundation/Actor.js @@ -42,6 +42,7 @@ CAAT.Module({ __init:function () { this.behaviorList = []; this.lifecycleListenerList = []; + this.eventListeners = {}; this.AABB = new CAAT.Math.Rectangle(); this.viewVertices = [ new CAAT.Math.Point(0, 0, 0), @@ -2227,6 +2228,84 @@ CAAT.Module({ findActorById : function(id) { return this.id===id ? this : null; + }, + + + /** + * Add multiple event listeners to this Actor + * + * @param event listeners in the form { 'eventname': callbackFunction, 'othereventName': otherCallback } + */ + + addEventListeners: function(object) { + var event; + + for (event in object) { + if (!this.eventListeners[event]) { + this.eventListeners[event] = []; + } + this.eventListeners[event].push(object[event]); + } + return this; + }, + + /** + * Remove a single event listener from this Actor + * + * @param event name + * @param specified callback to be removed, a single event name can have multiple callbacks + */ + removeEventListener: function(event, callback) { + for (var i=0;i< this.eventListeners[event].length;i++) { + if(this.eventListeners[event][i] == callback) { + this.eventListeners[event].splice(i, 1); + return this; + } + } + return this; + }, + + /** + * Remove all event listeners from this Actor + * Can either remove all listeners on a single event name, or everything + * + * @param event name, if not specified, will remove every single event listener + */ + removeAllEventListeners: function(event) { + if (event) { + if (this.eventListeners[event]) { + this.eventListeners[event] = []; + } + } else { + this.eventListeners = {}; // remove everything + } + }, + + /** + * Shorthand method for adding a single event listener + * + * @param event name + * @param callback function + */ + on: function(event, callback, options) { // TODO: allow single: true in options to remove after first fire + var args = {}; + args[event] = callback; + return this.addEventListeners(args); + }, + + /** + * Fire an event on this object, calling all registered event listeners in turn + * + * @param event name + * @param callback functions will be called with this object as a single argument + */ + emit: function(event, params) { + if (!this.eventListeners || !this.eventListeners[event]) return this; + + for (var i=0;i< this.eventListeners[event].length;i++) { + this.eventListeners[event][i].call(null, params); + } + return this; } } } From 2be98e271c9c1486bc9185e55020aeb16e6a43a4 Mon Sep 17 00:00:00 2001 From: Rob Boerman Date: Mon, 11 Mar 2013 23:08:12 +0100 Subject: [PATCH 05/52] Path incorrectly transforms rendering context when used as a clipPath (Actor's paintActor method already does that). This causes actors with a clipMask to be scaled twice --- src/PathUtil/Path.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/PathUtil/Path.js b/src/PathUtil/Path.js index e0bb25d9..9fa084d7 100644 --- a/src/PathUtil/Path.js +++ b/src/PathUtil/Path.js @@ -94,7 +94,10 @@ CAAT.Module( { applyAsPath : function(director) { var ctx= director.ctx; - director.modelViewMatrix.transformRenderingContext( ctx ); + if (this.parent) { + director.modelViewMatrix.transformRenderingContext( ctx ); + } + ctx.beginPath(); ctx.globalCompositeOperation= 'source-out'; var startPos = this.startCurvePosition(); From 2625f386bef012d8e9e8ed8e225ebb5d33536c71 Mon Sep 17 00:00:00 2001 From: Rob Boerman Date: Tue, 26 Mar 2013 10:23:39 +0100 Subject: [PATCH 06/52] Added convenience method for removing all timers --- src/Foundation/Timer/TimerManager.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Foundation/Timer/TimerManager.js b/src/Foundation/Timer/TimerManager.js index 5aa46101..9c953765 100644 --- a/src/Foundation/Timer/TimerManager.js +++ b/src/Foundation/Timer/TimerManager.js @@ -128,6 +128,16 @@ CAAT.Module({ tl.splice(i, 1); } } + }, + /** + * Removes all timers. + */ + removeAllTimers:function () { + var i; + var tl = this.timerList; + for (i = tl.length-1; i >= 0; i--) { + tl.splice(i, 1); + } } } }); From b234c6418c74c31d9b91e3c31364cec71bd7b83b Mon Sep 17 00:00:00 2001 From: Rob Boerman Date: Tue, 26 Mar 2013 10:24:39 +0100 Subject: [PATCH 07/52] Fixed removeBehaviour (while (INTEGER) does not work cross browser) added convenience method for removing all behaviors --- src/Foundation/Actor.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Foundation/Actor.js b/src/Foundation/Actor.js index 44257d23..9e2dd3a2 100644 --- a/src/Foundation/Actor.js +++ b/src/Foundation/Actor.js @@ -1451,8 +1451,7 @@ CAAT.Module({ */ removeBehaviour:function (behavior) { var c = this.behaviorList; - var n = c.length - 1; - while (n) { + for (var n = 0; n < c.length; n++) { if (c[n] === behavior) { c.splice(n, 1); return this; @@ -1460,6 +1459,20 @@ CAAT.Module({ } return this; }, + + /** + * Remove all Behaviors from the Actor. + * + * @return this + */ + removeAllBehaviors: function() { + var bl = this.behaviorList; + for (var pos = bl.length - 1; pos >= 0; pos--) { + this.removeBehaviour(bl[pos]); + } + // console.log(this.behaviorList); + return this; + }, /** * Remove a Behavior with id param as behavior identifier from this actor. * This function will remove ALL behavior instances with the given id. From acc852689e77d403ca3d51647a18385df8a92ce2 Mon Sep 17 00:00:00 2001 From: ibon tolosana Date: Mon, 1 Apr 2013 00:17:33 -0700 Subject: [PATCH 08/52] Modified Spine parser. Now better control on attachements and animation skin attachments (visibility keyframing). --- src/Modules/Image/Preloader/Preloader.js | 2 + src/Modules/Skeleton/Bone.js | 173 +++++++++++++++-------- src/Modules/Skeleton/BoneActor.js | 47 +++++- src/Modules/Skeleton/Skeleton.js | 169 ++++++++++++++++++---- src/Modules/Skeleton/SkeletonActor.js | 77 +++++----- 5 files changed, 341 insertions(+), 127 deletions(-) diff --git a/src/Modules/Image/Preloader/Preloader.js b/src/Modules/Image/Preloader/Preloader.js index 893f85d3..dea264a6 100644 --- a/src/Modules/Image/Preloader/Preloader.js +++ b/src/Modules/Image/Preloader/Preloader.js @@ -71,6 +71,8 @@ CAAT.Module( { return this; }, + currentGroup : null, + /** * a list of elements to load. * @type {Array.<{ id, image }>} diff --git a/src/Modules/Skeleton/Bone.js b/src/Modules/Skeleton/Bone.js index 7e11fc97..5a2d2996 100644 --- a/src/Modules/Skeleton/Bone.js +++ b/src/Modules/Skeleton/Bone.js @@ -24,6 +24,18 @@ CAAT.Module({ var cscale; var cpoint; + function fntr(behavior, orgtime, time, actor, value) { + cpoint= value; + } + + function fnsc(behavior, orgtime, time, actor, value) { + cscale= value; + } + + function fnrt(behavior, orgtime, time, actor, value) { + cangle= value; + } + return { id : null, @@ -102,38 +114,65 @@ CAAT.Module({ */ keyframesRotate : null, + /** + * @type object + */ + keyframesByAnimation : null, + + currentAnimation : null, + /** * @type Array. */ children : null, + behaviorApplicationTime : -1, + __init : function(id) { this.id= id; this.matrix= new CAAT.Math.Matrix(); this.wmatrix= new CAAT.Math.Matrix(); this.parent= null; this.children= []; - this.keyframesTranslate= new CAAT.Behavior.ContainerBehavior(true).setCycle(true).setId("keyframes_tr"); - this.keyframesScale= new CAAT.Behavior.ContainerBehavior(true).setCycle(true).setId("keyframes_sc"); - this.keyframesRotate= new CAAT.Behavior.ContainerBehavior(true).setCycle(true).setId("keyframes_rt"); - function fntr(behavior, orgtime, time, actor, value) { - cpoint= value; - } + this.keyframesByAnimation = {}; - function fnsc(behavior, orgtime, time, actor, value) { - cscale= value; - } + return this; + }, - function fnrt(behavior, orgtime, time, actor, value) { - cangle= value; - } + setBehaviorApplicationTime : function(t) { + this.behaviorApplicationTime= t; + return this; + }, - this.keyframesTranslate.addListener( { behaviorApplied : fntr }); - this.keyframesScale.addListener( { behaviorApplied : fnsc }); - this.keyframesRotate.addListener( { behaviorApplied : fnrt }); + __createAnimation : function(name) { - return this; + var keyframesTranslate= new CAAT.Behavior.ContainerBehavior(true).setCycle(true).setId("keyframes_tr"); + var keyframesScale= new CAAT.Behavior.ContainerBehavior(true).setCycle(true).setId("keyframes_sc"); + var keyframesRotate= new CAAT.Behavior.ContainerBehavior(true).setCycle(true).setId("keyframes_rt"); + + keyframesTranslate.addListener( { behaviorApplied : fntr }); + keyframesScale.addListener( { behaviorApplied : fnsc }); + keyframesRotate.addListener( { behaviorApplied : fnrt }); + + var animData= { + keyframesTranslate : keyframesTranslate, + keyframesScale : keyframesScale, + keyframesRotate : keyframesRotate + }; + + this.keyframesByAnimation[name]= animData; + + return animData; + }, + + __getAnimation : function(name) { + var animation= this.keyframesByAnimation[ name ]; + if (!animation) { + animation= this.__createAnimation(name); + } + + return animation; }, /** @@ -159,17 +198,6 @@ CAAT.Module({ } }, - /** - * - * @param keyframes {CAAT.Behavior.ContainerBehavior} - * @returns {*} - */ - setTranslationKeyframes : function( keyframes ) { - this.keyframesTranslate= keyframes; - this.__noValue( keyframes ); - return this; - }, - __setInterpolator : function(behavior, curve) { if (curve && curve!=="stepped") { behavior.setInterpolator( @@ -184,6 +212,7 @@ CAAT.Module({ /** * + * @param name {string} keyframe animation name * @param angleStart {number} rotation start angle * @param angleEnd {number} rotation end angle * @param timeStart {number} keyframe start time @@ -191,17 +220,21 @@ CAAT.Module({ * @param curve {Array.=} 4 numbers definint a quadric bezier info. two first points * assumed to be 0,0. */ - addRotationKeyframe : function( angleStart, angleEnd, timeStart, timeEnd, curve ) { + addRotationKeyframe : function( name, angleStart, angleEnd, timeStart, timeEnd, curve ) { var as= 2*Math.PI*angleStart/360; var ae= 2*Math.PI*angleEnd/360; + // minimum distant between two angles. + if ( as<-Math.PI ) { if (Math.abs(as+this.rotationAngle)>2*Math.PI) { as= -(as+Math.PI); } else { as= (as+Math.PI); } + } else if (as > Math.PI) { + as -= 2 * Math.PI; } if ( ae<-Math.PI ) { @@ -211,12 +244,18 @@ CAAT.Module({ } else { ae= (ae+Math.PI); } + } else if ( ae>Math.PI ) { + ae-=2*Math.PI; } angleStart= -as; angleEnd= -ae; +// angleStart= 2*Math.PI*angleStart/360; + + + var behavior= new CAAT.Behavior.RotateBehavior(). setFrameTime( timeStart, timeEnd-timeStart+1). setValues( angleStart, angleEnd, 0, .5). @@ -224,14 +263,15 @@ CAAT.Module({ this.__setInterpolator( behavior, curve ); - this.keyframesRotate.addBehavior(behavior); + var animation= this.__getAnimation(name); + animation.keyframesRotate.addBehavior(behavior); }, - endRotationKeyframes : function() { + endRotationKeyframes : function(name) { }, - addTranslationKeyframe : function( startX, startY, endX, endY, timeStart, timeEnd, curve ) { + addTranslationKeyframe : function( name, startX, startY, endX, endY, timeStart, timeEnd, curve ) { var behavior= new CAAT.Behavior.PathBehavior(). setFrameTime( timeStart, timeEnd-timeStart+1). setValues( new CAAT.PathUtil.Path(). @@ -241,42 +281,33 @@ CAAT.Module({ this.__setInterpolator( behavior, curve ); - this.keyframesTranslate.addBehavior( behavior ); + var animation= this.__getAnimation(name); + animation.keyframesTranslate.addBehavior( behavior ); }, - endTranslationKeyframes : function() { + addScaleKeyframe : function( name, scaleX, endScaleX, scaleY, endScaleY, timeStart, timeEnd, curve ) { + var behavior= new CAAT.Behavior.ScaleBehavior(). + setFrameTime( timeStart, timeEnd-timeStart+1). + setValues( scaleX, endScaleX, scaleY, endScaleY ). + setValueApplication(false); - }, + this.__setInterpolator( behavior, curve ); - setSize : function(s) { - this.width= s; - this.height= 0; + var animation= this.__getAnimation(name); + animation.keyframesScale.addBehavior( behavior ); }, - endScaleKeyframes : function() { + endTranslationKeyframes : function(name) { }, - /** - * - * @param keyframes {CAAT.Behavior.ContainerBehavior} - * @returns {*} - */ - setRotationKeyframes : function( keyframes ) { - this.keyframesRotate= keyframes; - this.__noValue( keyframes ); - return this; + setSize : function(s) { + this.width= s; + this.height= 0; }, - /** - * - * @param keyframes {CAAT.Behavior.ContainerBehavior} - * @returns {*} - */ - setScaleKeyframes : function( keyframes ) { - this.keyframesScale= keyframes; - this.__noValue( keyframes ); - return this; + endScaleKeyframes : function(name) { + }, setPosition : function( x, y ) { @@ -331,7 +362,7 @@ CAAT.Module({ mm2 = this.wx - this.positionAnchorX * this.width; mm5 = this.wy - this.positionAnchorY * this.height; - if (this.rotationAngle) { + if (this.wrotationAngle) { var rx = this.rotationAnchorX * this.width; var ry = this.rotationAnchorY * this.height; @@ -385,6 +416,19 @@ CAAT.Module({ } }, + setAnimation : function(name) { + var animation= this.keyframesByAnimation[name]; + if (animation) { + this.keyframesRotate= animation.keyframesRotate; + this.keyframesScale= animation.keyframesScale; + this.keyframesTranslate= animation.keyframesTranslate; + } + + for( var i= 0, l=this.children.length; i=sdkf.start && time<=sdkf.start+sdkf.duration ) { + this.currentSkinInfo= this.skinInfoByName[ sdkf.name ]; + break; + } + } + } + + return this.currentSkinInfo; + }, + paint : function( director, time ) { var ctx= director.ctx; - for( var i= 0, l=this.skinInfo.length; i Date: Tue, 2 Apr 2013 21:42:24 -0700 Subject: [PATCH 09/52] Fixed error for Drag threshold. --- src/Foundation/Director.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Foundation/Director.js b/src/Foundation/Director.js index b16268a3..c3ed3cc6 100644 --- a/src/Foundation/Director.js +++ b/src/Foundation/Director.js @@ -2111,7 +2111,7 @@ CAAT.Module({ // check for mouse move threshold. if (!this.dragging) { - if (Math.abs(this.prevMousePoint.x - pos.x) < CAAT.DRAG_THRESHOLD_X || + if (Math.abs(this.prevMousePoint.x - pos.x) < CAAT.DRAG_THRESHOLD_X && Math.abs(this.prevMousePoint.y - pos.y) < CAAT.DRAG_THRESHOLD_Y) { return; } From 110eb6cadd926811575c5811e31d0ed7e4481132 Mon Sep 17 00:00:00 2001 From: ibon tolosana Date: Tue, 2 Apr 2013 23:54:56 -0700 Subject: [PATCH 10/52] complete spine format support: multi skin, multi animation files, visibility keyframes. --- src/Modules/Skeleton/Bone.js | 11 +++--- src/Modules/Skeleton/BoneActor.js | 11 ++++-- src/Modules/Skeleton/SkeletonActor.js | 49 ++++++++++++++++++++------- 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/src/Modules/Skeleton/Bone.js b/src/Modules/Skeleton/Bone.js index 5a2d2996..1f8ed25c 100644 --- a/src/Modules/Skeleton/Bone.js +++ b/src/Modules/Skeleton/Bone.js @@ -251,11 +251,6 @@ CAAT.Module({ angleStart= -as; angleEnd= -ae; - -// angleStart= 2*Math.PI*angleStart/360; - - - var behavior= new CAAT.Behavior.RotateBehavior(). setFrameTime( timeStart, timeEnd-timeStart+1). setValues( angleStart, angleEnd, 0, .5). @@ -474,10 +469,12 @@ CAAT.Module({ ctx.save(); this.transformContext(ctx); - ctx.strokeStyle= 'red'; + ctx.strokeStyle= 'blue'; ctx.beginPath(); - ctx.moveTo(0,0); + ctx.moveTo(0,-2); ctx.lineTo(this.width,this.height); + ctx.lineTo(0,2); + ctx.lineTo(0,-2); ctx.stroke(); ctx.restore(); diff --git a/src/Modules/Skeleton/BoneActor.js b/src/Modules/Skeleton/BoneActor.js index 93d73967..d533916e 100644 --- a/src/Modules/Skeleton/BoneActor.js +++ b/src/Modules/Skeleton/BoneActor.js @@ -43,6 +43,10 @@ CAAT.Module({ return this; }, + emptySkinDataKeyframe : function() { + this.skinDataKeyframes= []; + }, + addSkinDataKeyframe : function( name, start, duration ) { this.skinDataKeyframes.push( { name : name, @@ -58,10 +62,11 @@ CAAT.Module({ for( var i=0, l=this.skinDataKeyframes.length; i=sdkf.start && time<=sdkf.start+sdkf.duration ) { - this.currentSkinInfo= this.skinInfoByName[ sdkf.name ]; - break; + return this.currentSkinInfo= this.skinInfoByName[ sdkf.name ]; } } + + return null; } return this.currentSkinInfo; @@ -72,7 +77,7 @@ CAAT.Module({ var skinInfo= this.__getCurrentSkinInfo(time); - if (!skinInfo.image) { + if (!skinInfo || !skinInfo.image) { return; } diff --git a/src/Modules/Skeleton/SkeletonActor.js b/src/Modules/Skeleton/SkeletonActor.js index f1bbda71..1fd85af5 100644 --- a/src/Modules/Skeleton/SkeletonActor.js +++ b/src/Modules/Skeleton/SkeletonActor.js @@ -13,16 +13,18 @@ CAAT.Module( { slotInfo : null, slotInfoArray : null, skinByName : null, + director : null, __init : function( director, skeleton ) { this.__super(); + this.director= director; this.skeleton= skeleton; this.slotInfo= {}; this.slotInfoArray= []; this.skinByName= {}; - this.__setSkinInfo( skeleton.getSkeletonDataFromFile(), director ); + this.setSkin( ); this.setAnimation("default"); @@ -33,16 +35,23 @@ CAAT.Module( { this.skeleton.calculate(time, this.childrenList); return CAAT.Module.Skeleton.SkeletonActor.superclass.animate.call(this, director, time); }, -/* - paint : function( director, time ) { + + postPaint : function( director, time ) { + if (!this.skeleton) { return; } this.skeleton.paint(this.worldModelViewMatrix, director.ctx); }, -*/ - __setSkinInfo : function( skeletonData, director ) { + + setSkin : function( skin ) { + + this.emptyChildren(); + this.slotInfoArray= []; + this.slotInfo= {}; + + var skeletonData= this.skeleton.getSkeletonDataFromFile(); // slots info for( var slot=0; slot Date: Tue, 2 Apr 2013 23:55:46 -0700 Subject: [PATCH 11/52] Multiple commints. --- build/caat-box2d.js | 6 +- build/caat-css.js | 126 ++++++++-- build/caat.js | 130 ++++++++-- documentation/demos/demo34/index.html | 236 +++++++++++------- .../demos/demo34/spineboy/skeleton.json | 8 +- src/Foundation/ActorContainer.js | 4 + version.compile.pack.sh | 1 + 7 files changed, 378 insertions(+), 133 deletions(-) diff --git a/build/caat-box2d.js b/build/caat-box2d.js index dc81886f..e43ddd35 100644 --- a/build/caat-box2d.js +++ b/build/caat-box2d.js @@ -21,11 +21,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 30 +Version: 0.6 build: 33 Created on: -DATE: 2013-03-18 -TIME: 23:03:06 +DATE: 2013-04-02 +TIME: 23:55:20 */ diff --git a/build/caat-css.js b/build/caat-css.js index e755735d..49c2e81a 100644 --- a/build/caat-css.js +++ b/build/caat-css.js @@ -21,11 +21,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 30 +Version: 0.6 build: 33 Created on: -DATE: 2013-03-18 -TIME: 23:03:06 +DATE: 2013-04-02 +TIME: 23:55:19 */ @@ -4035,6 +4035,27 @@ CAAT.Module({ */ discardable:false, + /** + * does this behavior apply relative values ?? + */ + isRelative : false, + + /** + * Set this behavior as relative value application to some other measures. + * Each Behavior will define its own. + * @param bool + * @returns {*} + */ + setRelative : function( bool ) { + this.isRelative= bool; + return this; + }, + + setRelativeValues : function() { + this.isRelative= true; + return this; + }, + /** * Parse a behavior of this type. * @param obj {object} an object with a behavior definition. @@ -4591,13 +4612,19 @@ CAAT.Module({ */ behaviors:null, // contained behaviors array + conforming : false, + /** + * @param conforming {bool=} conform this behavior duration to that of its children. * @inheritDoc * @private */ - __init:function () { + __init:function ( conforming ) { this.__super(); this.behaviors = []; + if ( conforming ) { + this.conforming= true; + } return this; }, @@ -4640,6 +4667,15 @@ CAAT.Module({ addBehavior:function (behavior) { this.behaviors.push(behavior); behavior.addListener(this); + + if ( this.conforming ) { + var len= behavior.behaviorDuration + behavior.behaviorStartTime; + if ( this.behaviorDuration < len ) { + this.behaviorDuration= len; + this.behaviorStartTime= 0; + } + } + return this; }, @@ -4660,9 +4696,9 @@ CAAT.Module({ time += this.timeOffset * this.behaviorDuration; if (this.isBehaviorInTime(time, actor)) { - time -= this.getStartTime(); + time -= this.behaviorStartTime; if (this.cycleBehavior) { - time %= this.getDuration(); + time %= this.behaviorDuration; } var bh = this.behaviors; @@ -4685,6 +4721,10 @@ CAAT.Module({ } }, + behaviorApplied : function(behavior, scenetime, time, actor, value ) { + this.fireBehaviorAppliedEvent(actor, scenetime, time, value); + }, + /** * Implementation method of the behavior. * Just call implementation method for its contained behaviors. @@ -4692,12 +4732,13 @@ CAAT.Module({ * @param actor{CAAT.Foundation.Actor} an actor the behavior is being applied to. */ setForTime:function (time, actor) { + var retValue= null; var bh = this.behaviors; for (var i = 0; i < bh.length; i++) { - bh[i].setForTime(time, actor); + retValue= bh[i].setForTime(time, actor); } - return null; + return retValue; }, /** @@ -5152,6 +5193,9 @@ CAAT.Module({ isOpenContour : false, + relativeX : 0, + relativeY : 0, + setOpenContour : function(b) { this.isOpenContour= b; return this; @@ -5164,6 +5208,14 @@ CAAT.Module({ return "translate"; }, + setRelativeValues : function( x, y ) { + this.relativeX= x; + this.relativeY= y; + this.isRelative= true; + return this; + }, + + /** * Sets an actor rotation to be heading from past to current path's point. * Take into account that this will be incompatible with rotation Behaviors @@ -5288,6 +5340,10 @@ CAAT.Module({ } var point = this.path.getPosition(time, this.isOpenContour,.001); + if (this.isRelative ) { + point.x+= this.relativeX; + point.y+= this.relativeY; + } if (this.autoRotate) { @@ -5440,6 +5496,14 @@ CAAT.Module({ */ anchorY:.50, + rotationRelative: 0, + + setRelativeValues : function(r) { + this.rotationRelative= r; + this.isRelative= true; + return this; + }, + /** * @inheritDoc */ @@ -5453,6 +5517,16 @@ CAAT.Module({ setForTime:function (time, actor) { var angle = this.startAngle + time * (this.endAngle - this.startAngle); + if ( this.isRelative ) { + angle+= this.rotationRelative; + if (angle>=Math.PI) { + angle= (angle-2*Math.PI) + } + if ( angle<-2*Math.PI) { + angle= (angle+2*Math.PI); + } + } + if (this.doValueApplication) { actor.setRotationAnchored(angle, this.anchorX, this.anchorY); } @@ -8583,9 +8657,12 @@ CAAT.Module( { __init : function() { this.elements= []; + this.baseURL= ""; return this; }, + currentGroup : null, + /** * a list of elements to load. * @type {Array.<{ id, image }>} @@ -8617,8 +8694,10 @@ CAAT.Module( { */ loadedCount: 0, + baseURL : null, + addElement : function( id, path ) { - this.elements.push( new descriptor(id,path,this) ); + this.elements.push( new descriptor(id,this.baseURL+path,this) ); return this; }, @@ -8648,6 +8727,11 @@ CAAT.Module( { } }, + setBaseURL : function( base ) { + this.baseURL= base; + return this; + }, + load: function( onfinished, onload_one, onerror ) { this.cfinished= onfinished; @@ -12189,8 +12273,8 @@ CAAT.Module( { * @param time {number} a value between 0 and 1 both inclusive. 0 will return path's starting coordinate. * 1 will return path's end coordinate. * @param open_contour {boolean=} treat this path as an open contour. It is intended for - * open paths, and interpolators which give values above 1. see @link - * @param tangent_threshold {number=} + * open paths, and interpolators which give values above 1. see tutorial 7.1. + * @link{../../documentation/tutorials/t7-1.html} * * @return {CAAT.Foundation.Point} */ @@ -16350,7 +16434,6 @@ CAAT.Module({ this.width= image.mapInfo[0].width; this.height= image.mapInfo[0].height; - } else { this.image = image; this.width = image.width; @@ -16419,6 +16502,12 @@ CAAT.Module({ return this; }, + copy : function( other ) { + this.initialize(other,1,1); + this.mapInfo= other.mapInfo; + return this; + }, + /** * Must be used to draw actor background and the actor should have setClip(true) so that the image tiles * properly. @@ -20260,6 +20349,7 @@ CAAT.Module({ this.browserInfo = CAAT.Module.Runtime.BrowserInfo; this.audioManager = new CAAT.Module.Audio.AudioManager().initialize(8); this.scenes = []; + this.imagesCache= []; // input related variables initialization this.mousePoint = new CAAT.Math.Point(0, 0, 0); @@ -20956,6 +21046,10 @@ CAAT.Module({ }, setImagesCache:function (imagesCache, tpW, tpH) { + if (!imagesCache || !imagesCache.length ) { + return this; + } + var i; if (null !== this.glTextureManager) { @@ -21019,7 +21113,8 @@ CAAT.Module({ */ addImage:function (id, image, noUpdateGL) { if (this.getImage(id)) { - for (var i = 0; i < this.imagesCache.length; i++) { +// for (var i = 0; i < this.imagesCache.length; i++) { + for( var i in this.imagesCache ) { if (this.imagesCache[i].id === id) { this.imagesCache[i].image = image; break; @@ -21927,7 +22022,8 @@ CAAT.Module({ return ret; } - for (var i = 0; i < this.imagesCache.length; i++) { + //for (var i = 0; i < this.imagesCache.length; i++) { + for( var i in this.imagesCache ) { if (this.imagesCache[i].id === sId) { return this.imagesCache[i].image; } @@ -22290,7 +22386,7 @@ CAAT.Module({ // check for mouse move threshold. if (!this.dragging) { - if (Math.abs(this.prevMousePoint.x - pos.x) < CAAT.DRAG_THRESHOLD_X || + if (Math.abs(this.prevMousePoint.x - pos.x) < CAAT.DRAG_THRESHOLD_X && Math.abs(this.prevMousePoint.y - pos.y) < CAAT.DRAG_THRESHOLD_Y) { return; } diff --git a/build/caat.js b/build/caat.js index 2c2ad9fd..f62cfc9f 100644 --- a/build/caat.js +++ b/build/caat.js @@ -21,11 +21,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 30 +Version: 0.6 build: 33 Created on: -DATE: 2013-03-18 -TIME: 23:03:05 +DATE: 2013-04-02 +TIME: 23:55:19 */ @@ -4034,6 +4034,27 @@ CAAT.Module({ */ discardable:false, + /** + * does this behavior apply relative values ?? + */ + isRelative : false, + + /** + * Set this behavior as relative value application to some other measures. + * Each Behavior will define its own. + * @param bool + * @returns {*} + */ + setRelative : function( bool ) { + this.isRelative= bool; + return this; + }, + + setRelativeValues : function() { + this.isRelative= true; + return this; + }, + /** * Parse a behavior of this type. * @param obj {object} an object with a behavior definition. @@ -4590,13 +4611,19 @@ CAAT.Module({ */ behaviors:null, // contained behaviors array + conforming : false, + /** + * @param conforming {bool=} conform this behavior duration to that of its children. * @inheritDoc * @private */ - __init:function () { + __init:function ( conforming ) { this.__super(); this.behaviors = []; + if ( conforming ) { + this.conforming= true; + } return this; }, @@ -4639,6 +4666,15 @@ CAAT.Module({ addBehavior:function (behavior) { this.behaviors.push(behavior); behavior.addListener(this); + + if ( this.conforming ) { + var len= behavior.behaviorDuration + behavior.behaviorStartTime; + if ( this.behaviorDuration < len ) { + this.behaviorDuration= len; + this.behaviorStartTime= 0; + } + } + return this; }, @@ -4659,9 +4695,9 @@ CAAT.Module({ time += this.timeOffset * this.behaviorDuration; if (this.isBehaviorInTime(time, actor)) { - time -= this.getStartTime(); + time -= this.behaviorStartTime; if (this.cycleBehavior) { - time %= this.getDuration(); + time %= this.behaviorDuration; } var bh = this.behaviors; @@ -4684,6 +4720,10 @@ CAAT.Module({ } }, + behaviorApplied : function(behavior, scenetime, time, actor, value ) { + this.fireBehaviorAppliedEvent(actor, scenetime, time, value); + }, + /** * Implementation method of the behavior. * Just call implementation method for its contained behaviors. @@ -4691,12 +4731,13 @@ CAAT.Module({ * @param actor{CAAT.Foundation.Actor} an actor the behavior is being applied to. */ setForTime:function (time, actor) { + var retValue= null; var bh = this.behaviors; for (var i = 0; i < bh.length; i++) { - bh[i].setForTime(time, actor); + retValue= bh[i].setForTime(time, actor); } - return null; + return retValue; }, /** @@ -5151,6 +5192,9 @@ CAAT.Module({ isOpenContour : false, + relativeX : 0, + relativeY : 0, + setOpenContour : function(b) { this.isOpenContour= b; return this; @@ -5163,6 +5207,14 @@ CAAT.Module({ return "translate"; }, + setRelativeValues : function( x, y ) { + this.relativeX= x; + this.relativeY= y; + this.isRelative= true; + return this; + }, + + /** * Sets an actor rotation to be heading from past to current path's point. * Take into account that this will be incompatible with rotation Behaviors @@ -5287,6 +5339,10 @@ CAAT.Module({ } var point = this.path.getPosition(time, this.isOpenContour,.001); + if (this.isRelative ) { + point.x+= this.relativeX; + point.y+= this.relativeY; + } if (this.autoRotate) { @@ -5439,6 +5495,14 @@ CAAT.Module({ */ anchorY:.50, + rotationRelative: 0, + + setRelativeValues : function(r) { + this.rotationRelative= r; + this.isRelative= true; + return this; + }, + /** * @inheritDoc */ @@ -5452,6 +5516,16 @@ CAAT.Module({ setForTime:function (time, actor) { var angle = this.startAngle + time * (this.endAngle - this.startAngle); + if ( this.isRelative ) { + angle+= this.rotationRelative; + if (angle>=Math.PI) { + angle= (angle-2*Math.PI) + } + if ( angle<-2*Math.PI) { + angle= (angle+2*Math.PI); + } + } + if (this.doValueApplication) { actor.setRotationAnchored(angle, this.anchorX, this.anchorY); } @@ -8582,9 +8656,12 @@ CAAT.Module( { __init : function() { this.elements= []; + this.baseURL= ""; return this; }, + currentGroup : null, + /** * a list of elements to load. * @type {Array.<{ id, image }>} @@ -8616,8 +8693,10 @@ CAAT.Module( { */ loadedCount: 0, + baseURL : null, + addElement : function( id, path ) { - this.elements.push( new descriptor(id,path,this) ); + this.elements.push( new descriptor(id,this.baseURL+path,this) ); return this; }, @@ -8647,6 +8726,11 @@ CAAT.Module( { } }, + setBaseURL : function( base ) { + this.baseURL= base; + return this; + }, + load: function( onfinished, onload_one, onerror ) { this.cfinished= onfinished; @@ -12365,8 +12449,8 @@ CAAT.Module( { * @param time {number} a value between 0 and 1 both inclusive. 0 will return path's starting coordinate. * 1 will return path's end coordinate. * @param open_contour {boolean=} treat this path as an open contour. It is intended for - * open paths, and interpolators which give values above 1. see @link - * @param tangent_threshold {number=} + * open paths, and interpolators which give values above 1. see tutorial 7.1. + * @link{../../documentation/tutorials/t7-1.html} * * @return {CAAT.Foundation.Point} */ @@ -16526,7 +16610,6 @@ CAAT.Module({ this.width= image.mapInfo[0].width; this.height= image.mapInfo[0].height; - } else { this.image = image; this.width = image.width; @@ -16595,6 +16678,12 @@ CAAT.Module({ return this; }, + copy : function( other ) { + this.initialize(other,1,1); + this.mapInfo= other.mapInfo; + return this; + }, + /** * Must be used to draw actor background and the actor should have setClip(true) so that the image tiles * properly. @@ -20104,6 +20193,10 @@ CAAT.Module({ } } + if (this.postPaint) { + this.postPaint( director, time ); + } + ctx.restore(); return true; @@ -21214,6 +21307,7 @@ CAAT.Module({ this.browserInfo = CAAT.Module.Runtime.BrowserInfo; this.audioManager = new CAAT.Module.Audio.AudioManager().initialize(8); this.scenes = []; + this.imagesCache= []; // input related variables initialization this.mousePoint = new CAAT.Math.Point(0, 0, 0); @@ -21910,6 +22004,10 @@ CAAT.Module({ }, setImagesCache:function (imagesCache, tpW, tpH) { + if (!imagesCache || !imagesCache.length ) { + return this; + } + var i; if (null !== this.glTextureManager) { @@ -21973,7 +22071,8 @@ CAAT.Module({ */ addImage:function (id, image, noUpdateGL) { if (this.getImage(id)) { - for (var i = 0; i < this.imagesCache.length; i++) { +// for (var i = 0; i < this.imagesCache.length; i++) { + for( var i in this.imagesCache ) { if (this.imagesCache[i].id === id) { this.imagesCache[i].image = image; break; @@ -22881,7 +22980,8 @@ CAAT.Module({ return ret; } - for (var i = 0; i < this.imagesCache.length; i++) { + //for (var i = 0; i < this.imagesCache.length; i++) { + for( var i in this.imagesCache ) { if (this.imagesCache[i].id === sId) { return this.imagesCache[i].image; } @@ -23244,7 +23344,7 @@ CAAT.Module({ // check for mouse move threshold. if (!this.dragging) { - if (Math.abs(this.prevMousePoint.x - pos.x) < CAAT.DRAG_THRESHOLD_X || + if (Math.abs(this.prevMousePoint.x - pos.x) < CAAT.DRAG_THRESHOLD_X && Math.abs(this.prevMousePoint.y - pos.y) < CAAT.DRAG_THRESHOLD_Y) { return; } diff --git a/documentation/demos/demo34/index.html b/documentation/demos/demo34/index.html index af952eb6..cfc46f61 100755 --- a/documentation/demos/demo34/index.html +++ b/documentation/demos/demo34/index.html @@ -71,91 +71,130 @@ // this function will be firer every time all dependencies have been solved. // if you call again bring, this function could be fired again. onReady( function() { - new CAAT.Module.Preloader.XHR().load( - function( result, content ) { - if (result==="ok" ) { - - new CAAT.Module.Preloader.XHR().load( - function( result, content2 ) { - ffl( JSON.parse(content), JSON.parse(content2) ); - }, - "spineboy/animation.json", -// "pawly/skeleton-Running.json", - true, - "GET"); - - } else { - alert("Error loading library"); - } - }, - "spineboy/skeleton.json", -// "pawly/skeleton-skeleton.json", - true, - "GET" - ); + ffl(); } ); } - function ffl(skeleton, animation) { + function ffl() { new CAAT.Module.Preloader.Preloader(). setBaseURL("spineboy/"). - addElement( "eyes", "eyes.png"). - addElement( "eyes-closed", "eyes-closed.png"). - addElement( "head", "head.png"). - addElement( "left-ankle", "left-ankle.png"). - addElement( "left-arm", "left-arm.png"). - addElement( "left-foot", "left-foot.png"). - addElement( "left-hand", "left-hand.png"). - addElement( "left-lower-leg", "left-lower-leg.png"). - addElement( "left-pant-bottom", "left-pant-bottom.png"). - addElement( "left-shoulder", "left-shoulder.png"). - addElement( "left-upper-leg", "left-upper-leg.png"). - addElement( "neck", "neck.png"). - addElement( "pelvis", "pelvis.png"). - addElement( "right-ankle", "right-ankle.png"). - addElement( "right-arm", "right-arm.png"). - addElement( "right-foot", "right-foot.png"). - addElement( "right-hand", "right-hand.png"). - addElement( "right-lower-leg", "right-lower-leg.png"). - addElement( "right-pant-bottom", "right-pant-bottom.png"). - addElement( "right-shoulder", "right-shoulder.png"). - addElement( "right-upper-leg", "right-upper-leg.png"). - addElement( "torso", "torso.png"). - load( function(images) { - ff( skeleton, animation, images ); - }); - + addElement( "eyes", "eyes.png"). + addElement( "eyes-closed", "eyes-closed.png"). + addElement( "headboy", "head.png"). + addElement( "left-ankle", "left-ankle.png"). + addElement( "left-arm", "left-arm.png"). + addElement( "left-foot", "left-foot.png"). + addElement( "left-hand", "left-hand.png"). + addElement( "left-lower-leg", "left-lower-leg.png"). + addElement( "left-pant-bottom", "left-pant-bottom.png"). + addElement( "left-shoulder", "left-shoulder.png"). + addElement( "left-upper-leg", "left-upper-leg.png"). + addElement( "neck", "neck.png"). + addElement( "pelvis", "pelvis.png"). + addElement( "right-ankle", "right-ankle.png"). + addElement( "right-arm", "right-arm.png"). + addElement( "right-foot", "right-foot.png"). + addElement( "right-hand", "right-hand.png"). + addElement( "right-lower-leg", "right-lower-leg.png"). + addElement( "right-pant-bottom", "right-pant-bottom.png"). + addElement( "right-shoulder", "right-shoulder.png"). + addElement( "right-upper-leg", "right-upper-leg.png"). + addElement( "torso", "torso.png"). + + setBaseURL("goblins/"). + addElement( "dagger", "dagger.png"). + addElement( "spear", "spear.png"). + + addElement( "goblin/eyes-closed", "goblin/eyes-closed.png"). + addElement( "goblin/head", "goblin/head.png"). + addElement( "goblin/left-arm", "goblin/left-arm.png"). + addElement( "goblin/left-foot", "goblin/left-foot.png"). + addElement( "goblin/left-hand", "goblin/left-hand.png"). + addElement( "goblin/left-lower-leg", "goblin/left-lower-leg.png"). + addElement( "goblin/left-shoulder", "goblin/left-shoulder.png"). + addElement( "goblin/left-upper-leg", "goblin/left-upper-leg.png"). + addElement( "goblin/right-arm", "goblin/right-arm.png"). + addElement( "goblin/right-foot", "goblin/right-foot.png"). + addElement( "goblin/right-hand", "goblin/right-hand.png"). + addElement( "goblin/right-lower-leg", "goblin/right-lower-leg.png"). + addElement( "goblin/right-shoulder", "goblin/right-shoulder.png"). + addElement( "goblin/right-upper-leg", "goblin/right-upper-leg.png"). + addElement( "goblin/neck", "goblin/neck.png"). + addElement( "goblin/pelvis", "goblin/pelvis.png"). + addElement( "goblin/torso", "goblin/torso.png"). + addElement( "goblin/undie-straps", "goblin/undie-straps.png"). + addElement( "goblin/undies", "goblin/undies.png"). + + addElement( "goblingirl/eyes-closed", "goblingirl/eyes-closed.png"). + addElement( "goblingirl/head", "goblingirl/head.png"). + addElement( "goblingirl/left-arm", "goblingirl/left-arm.png"). + addElement( "goblingirl/left-foot", "goblingirl/left-foot.png"). + addElement( "goblingirl/left-hand", "goblingirl/left-hand.png"). + addElement( "goblingirl/left-lower-leg", "goblingirl/left-lower-leg.png"). + addElement( "goblingirl/left-shoulder", "goblingirl/left-shoulder.png"). + addElement( "goblingirl/left-upper-leg", "goblingirl/left-upper-leg.png"). + addElement( "goblingirl/right-arm", "goblingirl/right-arm.png"). + addElement( "goblingirl/right-foot", "goblingirl/right-foot.png"). + addElement( "goblingirl/right-hand", "goblingirl/right-hand.png"). + addElement( "goblingirl/right-lower-leg", "goblingirl/right-lower-leg.png"). + addElement( "goblingirl/right-shoulder", "goblingirl/right-shoulder.png"). + addElement( "goblingirl/right-upper-leg", "goblingirl/right-upper-leg.png"). + addElement( "goblingirl/neck", "goblingirl/neck.png"). + addElement( "goblingirl/pelvis", "goblingirl/pelvis.png"). + addElement( "goblingirl/torso", "goblingirl/torso.png"). + addElement( "goblingirl/undie-straps", "goblingirl/undie-straps.png"). + addElement( "goblingirl/undies", "goblingirl/undies.png"). + + setBaseURL("dragon/"). + addElement( "back", "back.png"). + addElement( "chest", "chest.png"). + addElement( "chin", "chin.png"). + addElement( "front_toeA", "front_toeA.png"). + addElement( "front_toeB", "front_toeB.png"). + addElement( "head", "head.png"). + addElement( "L_front_leg", "L_front_leg.png"). + addElement( "L_front_thigh", "L_front_thigh.png"). + addElement( "L_rear_leg", "L_rear_leg.png"). + addElement( "L_rear_thigh", "L_rear_thigh.png"). + addElement( "L_wing01", "L_wing01.png"). + addElement( "L_wing02", "L_wing02.png"). + addElement( "L_wing03", "L_wing03.png"). + addElement( "L_wing04", "L_wing04.png"). + addElement( "L_wing05", "L_wing05.png"). + addElement( "L_wing06", "L_wing06.png"). + addElement( "L_wing07", "L_wing07.png"). + addElement( "L_wing08", "L_wing08.png"). + addElement( "L_wing09", "L_wing09.png"). + addElement( "R_front_leg", "R_front_leg.png"). + addElement( "R_front_thigh","R_front_thigh.png"). + addElement( "R_rear_leg", "R_rear_leg.png"). + addElement( "R_rear_thigh", "R_rear_thigh.png"). + addElement( "R_wing01", "R_wing01.png"). + addElement( "R_wing02", "R_wing02.png"). + addElement( "R_wing03", "R_wing03.png"). + addElement( "R_wing04", "R_wing04.png"). + addElement( "R_wing05", "R_wing05.png"). + addElement( "R_wing06", "R_wing06.png"). + addElement( "R_wing07", "R_wing07.png"). + addElement( "R_wing08", "R_wing08.png"). + addElement( "R_wing09", "R_wing09.png"). + addElement( "rear-toe", "rear-toe.png"). + addElement( "tail01", "tail01.png"). + addElement( "tail02", "tail02.png"). + addElement( "tail03", "tail03.png"). + addElement( "tail04", "tail04.png"). + addElement( "tail05", "tail05.png"). + addElement( "tail06", "tail06.png"). - /* - new CAAT.Module.Preloader.Preloader(). - setBaseURL("pawly/pawly/"). - addElement( "pawly/gun", "gun.png"). - addElement( "pawly/head", "head.png"). - addElement( "pawly/larm", "larm.png"). - addElement( "pawly/larm-hi", "larm-hi.png"). - addElement( "pawly/larm-lo", "larm-lo.png"). - addElement( "pawly/lhand", "lhand.png"). - addElement( "pawly/lleg-hi", "lleg-hi.png"). - addElement( "pawly/lleg-lo", "lleg-lo.png"). - addElement( "pawly/lshoe", "lshoe.png"). - addElement( "pawly/pelvis", "pelvis.png"). - addElement( "pawly/rarm-hi", "rarm-hi.png"). - addElement( "pawly/rarm-lo", "rarm-lo.png"). - addElement( "pawly/rhand", "rhand.png"). - addElement( "pawly/rleg-hi", "rleg-hi.png"). - addElement( "pawly/rleg-lo", "rleg-lo.png"). - addElement( "pawly/rshoe", "rshoe.png"). - addElement( "pawly/torso", "torso.png"). load( function(images) { - ff( skeleton, animation, images ); + ff( images ); }); -*/ } - function ff( skeleton, animation, images ) { + function ff( images ) { CAAT.DEBUG=1; @@ -164,37 +203,42 @@ var scene= director.createScene(); - var _skeleton= new CAAT.Module.Skeleton.Skeleton(skeleton, animation); - + var _skeleton1= new CAAT.Module.Skeleton.Skeleton(). + setSkeletonFromFile("dragon/dragon-skeleton.json"). + addAnimationFromFile( "default", "dragon/dragon-flying.json" ); - for( var i=0; i<5; i+=1) { + var skeletonActordragon = new CAAT.Module.Skeleton.SkeletonActor(director, _skeleton1). + setLocation( 500, 400). + setScale(.7,.7); + scene.addChild(skeletonActordragon); - var scale= .25+Math.random()*.5; - var x0=100; - var y0=200+Math.random()*(director.height-200); - var x1=director.width-200; - var y1=200+Math.random()*(director.height-200); + var _skeletonBoy= new CAAT.Module.Skeleton.Skeleton(). + setSkeletonFromFile("spineboy/skeleton.json"). + addAnimationFromFile( "default", "spineboy/animation.json" ); + var skeletonActorBoy = new CAAT.Module.Skeleton.SkeletonActor(director, _skeletonBoy). + setLocation( 600, 500). + setScale(.7,.7); + scene.addChild(skeletonActorBoy); - var skeletonActor = new CAAT.Module.Skeleton.SkeletonActor(director, _skeleton). - setScale( scale, scale). - setSkinInfo(skeleton, director). - addBehavior( - new CAAT.Behavior.PathBehavior(). - setDelayTime(0,10000+Math.random()*10000). - setValues( new CAAT.PathUtil.Path().setLinear(x0,y0,x1,y1)). - setCycle(true). - setInterpolator( - new CAAT.Behavior.Interpolator().createLinearInterpolator( - true, Math.random() <.5 - )). - setAutoRotate( 0 ) - ); + var _skeleton= new CAAT.Module.Skeleton.Skeleton(). + setSkeletonFromFile("goblins/goblins-skeleton.json"). + addAnimationFromFile( "default", "goblins/goblins-walk.json" ); - scene.addChild(skeletonActor); - } + var skeletonActor = new CAAT.Module.Skeleton.SkeletonActor(director, _skeleton). + setLocation( 200, 500). + setScale(.7,.7). + setSkin("goblin"). + setAnimation("default"); + scene.addChild(skeletonActor); + var skeletonActorgirl = new CAAT.Module.Skeleton.SkeletonActor(director, _skeleton). + setLocation( 400, 500). + setScale(.7,.7). + setSkin("goblingirl"). + setAnimation("default"); + scene.addChild(skeletonActorgirl); director.loop(1); } diff --git a/documentation/demos/demo34/spineboy/skeleton.json b/documentation/demos/demo34/spineboy/skeleton.json index 99b9a7d1..49a4cef5 100755 --- a/documentation/demos/demo34/spineboy/skeleton.json +++ b/documentation/demos/demo34/spineboy/skeleton.json @@ -205,9 +205,9 @@ "attachment": "neck" }, { - "name": "head", + "name": "headboy", "bone": "head", - "attachment": "head" + "attachment": "headboy" }, { "name": "eyes", @@ -346,8 +346,8 @@ "height": 28 } }, - "head": { - "head": { + "headboy": { + "headboy": { "x": 53.94, "y": -5.75, "rotation": -86.9, diff --git a/src/Foundation/ActorContainer.js b/src/Foundation/ActorContainer.js index e1395e34..4e45777c 100644 --- a/src/Foundation/ActorContainer.js +++ b/src/Foundation/ActorContainer.js @@ -263,6 +263,10 @@ CAAT.Module({ } } + if (this.postPaint) { + this.postPaint( director, time ); + } + ctx.restore(); return true; diff --git a/version.compile.pack.sh b/version.compile.pack.sh index e5bfa42e..5a495b44 100755 --- a/version.compile.pack.sh +++ b/version.compile.pack.sh @@ -6,6 +6,7 @@ VERSION=`cat version.nfo` echo "New generated version: ${VERSION}" +CAAT_DST="CAAT" DST_FILE_NAME="${CAAT_DST}"; From a947ab953747099f62e252e6119005ea0f2a3e01 Mon Sep 17 00:00:00 2001 From: ibon tolosana Date: Wed, 3 Apr 2013 21:58:12 -0700 Subject: [PATCH 12/52] * 04/02/2013 0.6 Build 49 * --------------------------- * Added. Skeletal animation based on Spine (by @EsotericSoft) format. * Added Demo34 to show its capabilites. --- build/caat-box2d-min.js | 6 +- build/caat-box2d.js | 6 +- build/caat-css-min.js | 196 +- build/caat-css.js | 6 +- build/caat-min.js | 231 +- build/caat.js | 6 +- changelog | 6 + .../demos/demo34/dragon/L_front_leg.png | Bin 0 -> 5203 bytes .../demos/demo34/dragon/L_front_thigh.png | Bin 0 -> 6458 bytes .../demos/demo34/dragon/L_rear_leg.png | Bin 0 -> 14818 bytes .../demos/demo34/dragon/L_rear_thigh.png | Bin 0 -> 4090 bytes .../demos/demo34/dragon/L_wing01.png | Bin 0 -> 5550 bytes .../demos/demo34/dragon/L_wing02.png | Bin 0 -> 5799 bytes .../demos/demo34/dragon/L_wing03.png | Bin 0 -> 4926 bytes .../demos/demo34/dragon/L_wing04.png | Bin 0 -> 4521 bytes .../demos/demo34/dragon/L_wing05.png | Bin 0 -> 5683 bytes .../demos/demo34/dragon/L_wing06.png | Bin 0 -> 6855 bytes .../demos/demo34/dragon/L_wing07.png | Bin 0 -> 5380 bytes .../demos/demo34/dragon/L_wing08.png | Bin 0 -> 4331 bytes .../demos/demo34/dragon/L_wing09.png | Bin 0 -> 5291 bytes .../demos/demo34/dragon/R_front_leg.png | Bin 0 -> 9765 bytes .../demos/demo34/dragon/R_front_thigh.png | Bin 0 -> 13171 bytes .../demos/demo34/dragon/R_rear_leg.png | Bin 0 -> 9722 bytes .../demos/demo34/dragon/R_rear_thigh.png | Bin 0 -> 18440 bytes .../demos/demo34/dragon/R_wing01.png | Bin 0 -> 51348 bytes .../demos/demo34/dragon/R_wing02.png | Bin 0 -> 46201 bytes .../demos/demo34/dragon/R_wing03.png | Bin 0 -> 46075 bytes .../demos/demo34/dragon/R_wing04.png | Bin 0 -> 27403 bytes .../demos/demo34/dragon/R_wing05.png | Bin 0 -> 27892 bytes .../demos/demo34/dragon/R_wing06.png | Bin 0 -> 31996 bytes .../demos/demo34/dragon/R_wing07.png | Bin 0 -> 25147 bytes .../demos/demo34/dragon/R_wing08.png | Bin 0 -> 31830 bytes .../demos/demo34/dragon/R_wing09.png | Bin 0 -> 39744 bytes documentation/demos/demo34/dragon/back.png | Bin 0 -> 49820 bytes documentation/demos/demo34/dragon/chest.png | Bin 0 -> 20897 bytes documentation/demos/demo34/dragon/chin.png | Bin 0 -> 40756 bytes .../demos/demo34/dragon/dragon-flying.json | 1833 ++++++ .../demos/demo34/dragon/dragon-skeleton.json | 813 +++ .../demos/demo34/dragon/front_toeA.png | Bin 0 -> 3380 bytes .../demos/demo34/dragon/front_toeB.png | Bin 0 -> 4640 bytes documentation/demos/demo34/dragon/head.png | Bin 0 -> 98503 bytes documentation/demos/demo34/dragon/license.txt | 5 + documentation/demos/demo34/dragon/logo.png | Bin 0 -> 21289 bytes .../demos/demo34/dragon/rear-toe.png | Bin 0 -> 8188 bytes documentation/demos/demo34/dragon/tail01.png | Bin 0 -> 23285 bytes documentation/demos/demo34/dragon/tail02.png | Bin 0 -> 15928 bytes documentation/demos/demo34/dragon/tail03.png | Bin 0 -> 10996 bytes documentation/demos/demo34/dragon/tail04.png | Bin 0 -> 7683 bytes documentation/demos/demo34/dragon/tail05.png | Bin 0 -> 6382 bytes documentation/demos/demo34/dragon/tail06.png | Bin 0 -> 8004 bytes .../demos/demo34/dragon/template.png | Bin 0 -> 182918 bytes documentation/demos/demo34/goblins/dagger.png | Bin 0 -> 6583 bytes .../demo34/goblins/goblin/eyes-closed.png | Bin 0 -> 2387 bytes .../demos/demo34/goblins/goblin/head.png | Bin 0 -> 13908 bytes .../demos/demo34/goblins/goblin/left-arm.png | Bin 0 -> 4335 bytes .../demos/demo34/goblins/goblin/left-foot.png | Bin 0 -> 5684 bytes .../demos/demo34/goblins/goblin/left-hand.png | Bin 0 -> 4632 bytes .../demo34/goblins/goblin/left-lower-leg.png | Bin 0 -> 6111 bytes .../demo34/goblins/goblin/left-shoulder.png | Bin 0 -> 4008 bytes .../demo34/goblins/goblin/left-upper-leg.png | Bin 0 -> 5738 bytes .../demos/demo34/goblins/goblin/neck.png | Bin 0 -> 4488 bytes .../demos/demo34/goblins/goblin/pelvis.png | Bin 0 -> 6039 bytes .../demos/demo34/goblins/goblin/right-arm.png | Bin 0 -> 3749 bytes .../demo34/goblins/goblin/right-foot.png | Bin 0 -> 5998 bytes .../demo34/goblins/goblin/right-hand.png | Bin 0 -> 4174 bytes .../demo34/goblins/goblin/right-lower-leg.png | Bin 0 -> 6365 bytes .../demo34/goblins/goblin/right-shoulder.png | Bin 0 -> 4754 bytes .../demo34/goblins/goblin/right-upper-leg.png | Bin 0 -> 5802 bytes .../demos/demo34/goblins/goblin/torso.png | Bin 0 -> 14342 bytes .../demo34/goblins/goblin/undie-straps.png | Bin 0 -> 3871 bytes .../demos/demo34/goblins/goblin/undies.png | Bin 0 -> 3890 bytes .../demo34/goblins/goblingirl/eyes-closed.png | Bin 0 -> 2955 bytes .../demos/demo34/goblins/goblingirl/head.png | Bin 0 -> 18178 bytes .../demo34/goblins/goblingirl/left-arm.png | Bin 0 -> 4133 bytes .../demo34/goblins/goblingirl/left-foot.png | Bin 0 -> 5536 bytes .../demo34/goblins/goblingirl/left-hand.png | Bin 0 -> 4357 bytes .../goblins/goblingirl/left-lower-leg.png | Bin 0 -> 5862 bytes .../goblins/goblingirl/left-shoulder.png | Bin 0 -> 4144 bytes .../goblins/goblingirl/left-upper-leg.png | Bin 0 -> 5417 bytes .../demos/demo34/goblins/goblingirl/neck.png | Bin 0 -> 4663 bytes .../demo34/goblins/goblingirl/pelvis.png | Bin 0 -> 6251 bytes .../demo34/goblins/goblingirl/right-arm.png | Bin 0 -> 4312 bytes .../demo34/goblins/goblingirl/right-foot.png | Bin 0 -> 5813 bytes .../demo34/goblins/goblingirl/right-hand.png | Bin 0 -> 4050 bytes .../goblins/goblingirl/right-lower-leg.png | Bin 0 -> 6070 bytes .../goblins/goblingirl/right-shoulder.png | Bin 0 -> 4492 bytes .../goblins/goblingirl/right-upper-leg.png | Bin 0 -> 5317 bytes .../demos/demo34/goblins/goblingirl/torso.png | Bin 0 -> 14125 bytes .../goblins/goblingirl/undie-straps.png | Bin 0 -> 3823 bytes .../demo34/goblins/goblingirl/undies.png | Bin 0 -> 3894 bytes .../demo34/goblins/goblins-skeleton.json | 201 + .../demos/demo34/goblins/goblins-walk.json | 296 + documentation/demos/demo34/goblins/spear.png | Bin 0 -> 15868 bytes documentation/demos/demo34/index.html | 59 +- documentation/demos/menu/menu.html | 1 + documentation/jsdoc/files.html | 80 +- documentation/jsdoc/index.html | 74 +- .../symbols/CAAT.Behavior.AlphaBehavior.html | 36 +- .../CAAT.Behavior.BasaeBehavior.Status.html | 513 ++ .../CAAT.Behavior.BaseBehavior.Status.html | 32 +- .../symbols/CAAT.Behavior.BaseBehavior.html | 183 +- .../CAAT.Behavior.ContainerBehavior.html | 120 +- .../CAAT.Behavior.GenericBehavior.html | 36 +- .../symbols/CAAT.Behavior.Interpolator.html | 32 +- ...CAAT.Behavior.PathBehavior.AUTOROTATE.html | 56 +- .../symbols/CAAT.Behavior.PathBehavior.html | 87 +- .../symbols/CAAT.Behavior.RotateBehavior.html | 81 +- .../CAAT.Behavior.Scale1Behavior.Axis.html | 52 +- .../symbols/CAAT.Behavior.Scale1Behavior.html | 36 +- .../symbols/CAAT.Behavior.ScaleBehavior.html | 36 +- .../jsdoc/symbols/CAAT.Behavior.html | 32 +- documentation/jsdoc/symbols/CAAT.CSS.html | 32 +- .../jsdoc/symbols/CAAT.Event.KeyEvent.html | 32 +- .../jsdoc/symbols/CAAT.Event.MouseEvent.html | 32 +- .../jsdoc/symbols/CAAT.Event.TouchEvent.html | 32 +- .../jsdoc/symbols/CAAT.Event.TouchInfo.html | 32 +- documentation/jsdoc/symbols/CAAT.Event.html | 32 +- .../jsdoc/symbols/CAAT.Foundation.Actor.html | 32 +- ...AAT.Foundation.ActorContainer.AddHint.html | 105 +- .../CAAT.Foundation.ActorContainer.html | 32 +- .../CAAT.Foundation.Box2D.B2DBodyActor.html | 32 +- ...CAAT.Foundation.Box2D.B2DCircularBody.html | 32 +- .../CAAT.Foundation.Box2D.B2DPolygonBody.html | 32 +- .../jsdoc/symbols/CAAT.Foundation.Box2D.html | 32 +- .../symbols/CAAT.Foundation.Director.html | 32 +- .../jsdoc/symbols/CAAT.Foundation.Scene.html | 32 +- .../symbols/CAAT.Foundation.SpriteImage.html | 77 +- ...Foundation.SpriteImageAnimationHelper.html | 32 +- .../CAAT.Foundation.SpriteImageHelper.html | 32 +- .../CAAT.Foundation.Timer.TimerManager.html | 32 +- .../CAAT.Foundation.Timer.TimerTask.html | 32 +- .../jsdoc/symbols/CAAT.Foundation.Timer.html | 32 +- .../symbols/CAAT.Foundation.UI.Dock.html | 32 +- .../symbols/CAAT.Foundation.UI.IMActor.html | 32 +- .../CAAT.Foundation.UI.InterpolatorActor.html | 32 +- .../symbols/CAAT.Foundation.UI.Label.html | 32 +- ...AAT.Foundation.UI.Layout.BorderLayout.html | 32 +- .../CAAT.Foundation.UI.Layout.BoxLayout.html | 32 +- .../CAAT.Foundation.UI.Layout.GridLayout.html | 32 +- ...AT.Foundation.UI.Layout.LayoutManager.html | 32 +- .../symbols/CAAT.Foundation.UI.Layout.html | 32 +- .../symbols/CAAT.Foundation.UI.PathActor.html | 32 +- .../CAAT.Foundation.UI.ShapeActor.html | 32 +- .../symbols/CAAT.Foundation.UI.StarActor.html | 32 +- .../symbols/CAAT.Foundation.UI.TextActor.html | 32 +- .../jsdoc/symbols/CAAT.Foundation.UI.html | 32 +- .../jsdoc/symbols/CAAT.Foundation.html | 32 +- documentation/jsdoc/symbols/CAAT.KEYS.html | 32 +- .../jsdoc/symbols/CAAT.KEY_MODIFIERS.html | 32 +- .../jsdoc/symbols/CAAT.Math.Bezier.html | 32 +- .../jsdoc/symbols/CAAT.Math.CatmullRom.html | 32 +- .../jsdoc/symbols/CAAT.Math.Curve.html | 32 +- .../jsdoc/symbols/CAAT.Math.Dimension.html | 32 +- .../jsdoc/symbols/CAAT.Math.Matrix.html | 32 +- .../jsdoc/symbols/CAAT.Math.Matrix3.html | 32 +- .../jsdoc/symbols/CAAT.Math.Point.html | 32 +- .../jsdoc/symbols/CAAT.Math.Rectangle.html | 32 +- documentation/jsdoc/symbols/CAAT.Math.html | 32 +- .../CAAT.Module.Audio.AudioManager.html | 32 +- .../jsdoc/symbols/CAAT.Module.Audio.html | 32 +- ...AAT.Module.CircleManager.PackedCircle.html | 32 +- ...ule.CircleManager.PackedCircleManager.html | 32 +- .../symbols/CAAT.Module.CircleManager.html | 32 +- .../CAAT.Module.Collision.QuadTree.html | 32 +- .../CAAT.Module.Collision.SpatialHash.html | 32 +- .../jsdoc/symbols/CAAT.Module.Collision.html | 32 +- .../symbols/CAAT.Module.ColorUtil.Color.html | 32 +- .../jsdoc/symbols/CAAT.Module.ColorUtil.html | 32 +- .../symbols/CAAT.Module.Debug.Debug.html | 32 +- .../jsdoc/symbols/CAAT.Module.Debug.html | 32 +- .../jsdoc/symbols/CAAT.Module.Font.Font.html | 32 +- .../jsdoc/symbols/CAAT.Module.Font.html | 32 +- ...le.Image.ImageProcessor.IMBumpMapping.html | 32 +- ....Module.Image.ImageProcessor.IMPlasma.html | 32 +- ...odule.Image.ImageProcessor.IMRotoZoom.html | 32 +- ...e.Image.ImageProcessor.ImageProcessor.html | 32 +- .../CAAT.Module.Image.ImageProcessor.html | 32 +- .../symbols/CAAT.Module.Image.ImageUtil.html | 32 +- .../jsdoc/symbols/CAAT.Module.Image.html | 32 +- .../CAAT.Module.Locale.ResourceBundle.html | 32 +- .../jsdoc/symbols/CAAT.Module.Locale.html | 32 +- .../CAAT.Module.Preloader.ImagePreloader.html | 32 +- .../CAAT.Module.Preloader.Preloader.html | 77 +- .../jsdoc/symbols/CAAT.Module.Preloader.html | 32 +- .../CAAT.Module.Runtime.BrowserInfo.html | 32 +- .../jsdoc/symbols/CAAT.Module.Runtime.html | 32 +- .../symbols/CAAT.Module.Skeleton.Bone.html | 2215 +++++++ .../CAAT.Module.Skeleton.BoneActor.html | 952 +++ .../CAAT.Module.Skeleton.Skeleton.html | 1466 +++++ .../CAAT.Module.Skeleton.SkeletonActor.html | 1138 ++++ .../jsdoc/symbols/CAAT.Module.Skeleton.html | 539 ++ .../CAAT.Module.Storage.LocalStorage.html | 32 +- .../jsdoc/symbols/CAAT.Module.Storage.html | 32 +- ...T.Module.TexturePacker.TextureElement.html | 32 +- ...CAAT.Module.TexturePacker.TexturePage.html | 32 +- ...dule.TexturePacker.TexturePageManager.html | 32 +- ...CAAT.Module.TexturePacker.TextureScan.html | 32 +- ...T.Module.TexturePacker.TextureScanMap.html | 32 +- .../symbols/CAAT.Module.TexturePacker.html | 32 +- .../jsdoc/symbols/CAAT.ModuleManager.html | 32 +- .../jsdoc/symbols/CAAT.PathUtil.ArcPath.html | 32 +- .../symbols/CAAT.PathUtil.CurvePath.html | 32 +- .../symbols/CAAT.PathUtil.LinearPath.html | 32 +- .../jsdoc/symbols/CAAT.PathUtil.Path.html | 44 +- .../symbols/CAAT.PathUtil.PathSegment.html | 32 +- .../jsdoc/symbols/CAAT.PathUtil.RectPath.html | 32 +- .../jsdoc/symbols/CAAT.PathUtil.SVGPath.html | 32 +- .../jsdoc/symbols/CAAT.PathUtil.html | 32 +- .../symbols/CAAT.WebGL.ColorProgram.html | 32 +- .../jsdoc/symbols/CAAT.WebGL.GLU.html | 32 +- .../jsdoc/symbols/CAAT.WebGL.Program.html | 32 +- .../symbols/CAAT.WebGL.TextureProgram.html | 32 +- documentation/jsdoc/symbols/CAAT.WebGL.html | 32 +- documentation/jsdoc/symbols/CAAT.html | 32 +- documentation/jsdoc/symbols/String.html | 32 +- documentation/jsdoc/symbols/_global_.html | 32 +- ..._js_CAAT_src_Behavior_BaseBehavior.js.html | 755 +-- ...AAT_src_Behavior_ContainerBehavior.js.html | 730 +-- ..._js_CAAT_src_Behavior_PathBehavior.js.html | 439 +- ...s_CAAT_src_Behavior_RotateBehavior.js.html | 248 +- ...CAAT_src_Foundation_ActorContainer.js.html | 852 +-- ...on_js_CAAT_src_Foundation_Director.js.html | 5671 +++++++++-------- ...js_CAAT_src_Foundation_SpriteImage.js.html | 1459 ++--- ..._Modules_Image_Preloader_Preloader.js.html | 170 +- ...ers_ibon_js_CAAT_src_PathUtil_Path.js.html | 4 +- ..._Users_ibon_js_CAAT_src_core_class.js.html | 498 +- src/Modules/Skeleton/Bone.js | 20 +- src/Modules/Skeleton/BoneActor.js | 13 + src/Modules/Skeleton/Skeleton.js | 16 +- src/Modules/Skeleton/SkeletonActor.js | 283 +- version.compile.doc.sh | 4 + version.compile.pack.sh | 2 +- version.compile.sh | 9 +- version.incremental | 2 +- version.nfo | 2 +- 235 files changed, 18784 insertions(+), 7229 deletions(-) create mode 100755 documentation/demos/demo34/dragon/L_front_leg.png create mode 100755 documentation/demos/demo34/dragon/L_front_thigh.png create mode 100755 documentation/demos/demo34/dragon/L_rear_leg.png create mode 100755 documentation/demos/demo34/dragon/L_rear_thigh.png create mode 100755 documentation/demos/demo34/dragon/L_wing01.png create mode 100755 documentation/demos/demo34/dragon/L_wing02.png create mode 100755 documentation/demos/demo34/dragon/L_wing03.png create mode 100755 documentation/demos/demo34/dragon/L_wing04.png create mode 100755 documentation/demos/demo34/dragon/L_wing05.png create mode 100755 documentation/demos/demo34/dragon/L_wing06.png create mode 100755 documentation/demos/demo34/dragon/L_wing07.png create mode 100755 documentation/demos/demo34/dragon/L_wing08.png create mode 100755 documentation/demos/demo34/dragon/L_wing09.png create mode 100755 documentation/demos/demo34/dragon/R_front_leg.png create mode 100755 documentation/demos/demo34/dragon/R_front_thigh.png create mode 100755 documentation/demos/demo34/dragon/R_rear_leg.png create mode 100755 documentation/demos/demo34/dragon/R_rear_thigh.png create mode 100755 documentation/demos/demo34/dragon/R_wing01.png create mode 100755 documentation/demos/demo34/dragon/R_wing02.png create mode 100755 documentation/demos/demo34/dragon/R_wing03.png create mode 100755 documentation/demos/demo34/dragon/R_wing04.png create mode 100755 documentation/demos/demo34/dragon/R_wing05.png create mode 100755 documentation/demos/demo34/dragon/R_wing06.png create mode 100755 documentation/demos/demo34/dragon/R_wing07.png create mode 100755 documentation/demos/demo34/dragon/R_wing08.png create mode 100755 documentation/demos/demo34/dragon/R_wing09.png create mode 100755 documentation/demos/demo34/dragon/back.png create mode 100755 documentation/demos/demo34/dragon/chest.png create mode 100755 documentation/demos/demo34/dragon/chin.png create mode 100644 documentation/demos/demo34/dragon/dragon-flying.json create mode 100644 documentation/demos/demo34/dragon/dragon-skeleton.json create mode 100755 documentation/demos/demo34/dragon/front_toeA.png create mode 100755 documentation/demos/demo34/dragon/front_toeB.png create mode 100755 documentation/demos/demo34/dragon/head.png create mode 100755 documentation/demos/demo34/dragon/license.txt create mode 100755 documentation/demos/demo34/dragon/logo.png create mode 100755 documentation/demos/demo34/dragon/rear-toe.png create mode 100755 documentation/demos/demo34/dragon/tail01.png create mode 100755 documentation/demos/demo34/dragon/tail02.png create mode 100755 documentation/demos/demo34/dragon/tail03.png create mode 100755 documentation/demos/demo34/dragon/tail04.png create mode 100755 documentation/demos/demo34/dragon/tail05.png create mode 100755 documentation/demos/demo34/dragon/tail06.png create mode 100755 documentation/demos/demo34/dragon/template.png create mode 100755 documentation/demos/demo34/goblins/dagger.png create mode 100755 documentation/demos/demo34/goblins/goblin/eyes-closed.png create mode 100755 documentation/demos/demo34/goblins/goblin/head.png create mode 100755 documentation/demos/demo34/goblins/goblin/left-arm.png create mode 100755 documentation/demos/demo34/goblins/goblin/left-foot.png create mode 100755 documentation/demos/demo34/goblins/goblin/left-hand.png create mode 100755 documentation/demos/demo34/goblins/goblin/left-lower-leg.png create mode 100755 documentation/demos/demo34/goblins/goblin/left-shoulder.png create mode 100755 documentation/demos/demo34/goblins/goblin/left-upper-leg.png create mode 100755 documentation/demos/demo34/goblins/goblin/neck.png create mode 100755 documentation/demos/demo34/goblins/goblin/pelvis.png create mode 100755 documentation/demos/demo34/goblins/goblin/right-arm.png create mode 100755 documentation/demos/demo34/goblins/goblin/right-foot.png create mode 100755 documentation/demos/demo34/goblins/goblin/right-hand.png create mode 100755 documentation/demos/demo34/goblins/goblin/right-lower-leg.png create mode 100755 documentation/demos/demo34/goblins/goblin/right-shoulder.png create mode 100755 documentation/demos/demo34/goblins/goblin/right-upper-leg.png create mode 100755 documentation/demos/demo34/goblins/goblin/torso.png create mode 100755 documentation/demos/demo34/goblins/goblin/undie-straps.png create mode 100755 documentation/demos/demo34/goblins/goblin/undies.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/eyes-closed.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/head.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/left-arm.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/left-foot.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/left-hand.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/left-lower-leg.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/left-shoulder.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/left-upper-leg.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/neck.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/pelvis.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/right-arm.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/right-foot.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/right-hand.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/right-lower-leg.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/right-shoulder.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/right-upper-leg.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/torso.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/undie-straps.png create mode 100755 documentation/demos/demo34/goblins/goblingirl/undies.png create mode 100644 documentation/demos/demo34/goblins/goblins-skeleton.json create mode 100644 documentation/demos/demo34/goblins/goblins-walk.json create mode 100755 documentation/demos/demo34/goblins/spear.png create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.BasaeBehavior.Status.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Skeleton.Bone.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Skeleton.BoneActor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Skeleton.Skeleton.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Skeleton.SkeletonActor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Skeleton.html diff --git a/build/caat-box2d-min.js b/build/caat-box2d-min.js index 1324a6d9..5525b801 100644 --- a/build/caat-box2d-min.js +++ b/build/caat-box2d-min.js @@ -22,11 +22,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 29 +Version: 0.6 build: 50 Created on: -DATE: 2013-03-18 -TIME: 23:02:29 +DATE: 2013-04-03 +TIME: 21:50:58 */ diff --git a/build/caat-box2d.js b/build/caat-box2d.js index e43ddd35..db368572 100644 --- a/build/caat-box2d.js +++ b/build/caat-box2d.js @@ -21,11 +21,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 33 +Version: 0.6 build: 49 Created on: -DATE: 2013-04-02 -TIME: 23:55:20 +DATE: 2013-04-03 +TIME: 21:50:58 */ diff --git a/build/caat-css-min.js b/build/caat-css-min.js index 5f5a776e..2a15bbc5 100644 --- a/build/caat-css-min.js +++ b/build/caat-css-min.js @@ -22,11 +22,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 29 +Version: 0.6 build: 50 Created on: -DATE: 2013-03-18 -TIME: 23:02:29 +DATE: 2013-04-03 +TIME: 21:50:58 */ @@ -114,36 +114,38 @@ a);return this.interpolated.set(d,a*Math.pow(2,-10*d)*Math.sin((d-e)*2*Math.PI/b 2:b=1-(b-0.5)*2);return this.bounce(b)};return this},createBounceInInterpolator:function(a){this.getPosition=function(b){a&&(b<0.5?b*=2:b=1-(b-0.5)*2);b=this.bounce(1-b);b.y=1-b.y;return b};return this},createBounceInOutInterpolator:function(a){this.getPosition=function(b){a&&(b<0.5?b*=2:b=1-(b-0.5)*2);if(b<0.5)return b=this.bounce(1-b*2),b.y=(1-b.y)*0.5,b;b=this.bounce(b*2-1,a);b.y=b.y*0.5+0.5;return b};return this},paint:function(a){a.save();a.beginPath();a.moveTo(0,this.getPosition(0).y*this.paintScale); for(var b=0;b<=this.paintScale;b++)a.lineTo(b,this.getPosition(b/this.paintScale).y*this.paintScale);a.strokeStyle="black";a.stroke();a.restore()},getContour:function(a){for(var b=[],c=0;c<=a;c++)b.push({x:c/a,y:this.getPosition(c/a).y});return b}}}}); CAAT.Module({defines:"CAAT.Behavior.BaseBehavior",constants:{Status:{NOT_STARTED:0,STARTED:1,EXPIRED:2},parse:function(a){function b(a){for(var a=a.split("."),b=window,c=0;c=this.behaviorStartTime&&(a=(a-this.behaviorStartTime)%this.behaviorDuration+this.behaviorStartTime);if(a>this.behaviorStartTime+this.behaviorDuration)return this.status!==e.EXPIRED&&this.setExpired(b,a),false;if(this.status===e.NOT_STARTED)this.status=e.STARTED,this.fireBehaviorStartedEvent(b,a);return this.behaviorStartTime<=a},fireBehaviorStartedEvent:function(a,b){for(var e= -0,f=this.lifecycleListenerList.length;e=this.behaviorStartTime&&(a=(a-this.behaviorStartTime)%this.behaviorDuration+this.behaviorStartTime);if(a>this.behaviorStartTime+this.behaviorDuration)return this.status!==e.EXPIRED&&this.setExpired(b,a),false;if(this.status=== +e.NOT_STARTED)this.status=e.STARTED,this.fireBehaviorStartedEvent(b,a);return this.behaviorStartTime<=a},fireBehaviorStartedEvent:function(a,b){for(var e=0,f=this.lifecycleListenerList.length;e>=0;for(var d= "@-"+a+"-keyframes "+b+" {",a=0;a<=c;a++)b=""+a/c*100+"%{opacity: "+this.calculateKeyFrameData(a/c)+"}",d+=b;d+="}";return d}}}}); -CAAT.Module({defines:"CAAT.Behavior.ContainerBehavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Behavior.GenericBehavior"],aliases:["CAAT.ContainerBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){if(a.behaviors&&a.behaviors.length)for(var b=0;b=d)){d=(d-c.behaviorStartTime)/c.behaviorDuration;c=c.getKeyFrameDataValues(d); -for(var f in c)e[f]=c[f]}return e},calculateKeyFrameData:function(a,b){function c(a){if(f[a])h+=f[a];else if(prevValues&&(i=prevValues[a]))h+=i,f[a]=i}var d,e,f={},g;for(d=0;d=g&&(g=(g-e.behaviorStartTime)/e.behaviorDuration,g=e.calculateKeyFrameData(g),e=e.getPropertyName(b), -typeof f[e]==="undefined"&&(f[e]=""),f[e]+=g+" "));var h="",i;c("translate");c("rotate");c("scale");d="";h&&(d="-"+b+"-transform: "+h+";");h="";c("opacity");h&&(d+=" opacity: "+h+";");d+=" -webkit-transform-origin: 0% 0%";return{rules:d,ret:f}},calculateKeyFramesData:function(a,b,c,d,e){if(this.duration===Number.MAX_VALUE)return"";typeof d==="undefined"&&(d=0.5);typeof e==="undefined"&&(e=0.5);typeof c==="undefined"&&(c=100);for(var f="@-"+a+"-keyframes "+b+" {",g,h={},b=0;b<=c;b++){g=this.interpolator.getPosition(b/ -c).y;g=this.getKeyFrameDataValues(g);var i=""+b/c*100+"%{",j=g,k=void 0;for(k in h)j[k]||(j[k]=h[k]);h="-"+a+"-transform:";if(j.x||j.y)h+="translate("+(j.x||0)+"px,"+(j.y||0)+"px)";j.angle&&(h+=" rotate("+j.angle+"rad)");if(j.scaleX!==1||j.scaleY!==1)h+=" scale("+j.scaleX+","+j.scaleY+")";h+=";";j.alpha&&(h+=" opacity: "+j.alpha+";");if(d!==0.5||e!==0.5)h+=" -"+a+"-transform-origin:"+d*100+"% "+e*100+"%;";f+=i+h+"}\n";h=g}f+="}\n";return f}}}}); +CAAT.Module({defines:"CAAT.Behavior.ContainerBehavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Behavior.GenericBehavior"],aliases:["CAAT.ContainerBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){if(a.behaviors&&a.behaviors.length)for(var b=0;b=d)){d=(d-c.behaviorStartTime)/c.behaviorDuration;c=c.getKeyFrameDataValues(d);for(var f in c)e[f]=c[f]}return e},calculateKeyFrameData:function(a,b){function c(a){if(f[a])h+=f[a];else if(prevValues&&(i=prevValues[a]))h+=i,f[a]=i}var d,e,f={},g;for(d=0;d=g&&(g=(g-e.behaviorStartTime)/e.behaviorDuration,g=e.calculateKeyFrameData(g),e=e.getPropertyName(b),typeof f[e]==="undefined"&&(f[e]=""),f[e]+=g+" "));var h="",i;c("translate");c("rotate");c("scale");d="";h&&(d="-"+b+"-transform: "+h+";");h="";c("opacity");h&&(d+=" opacity: "+h+";");d+=" -webkit-transform-origin: 0% 0%";return{rules:d,ret:f}},calculateKeyFramesData:function(a, +b,c,d,e){if(this.duration===Number.MAX_VALUE)return"";typeof d==="undefined"&&(d=0.5);typeof e==="undefined"&&(e=0.5);typeof c==="undefined"&&(c=100);for(var f="@-"+a+"-keyframes "+b+" {",g,h={},b=0;b<=c;b++){g=this.interpolator.getPosition(b/c).y;g=this.getKeyFrameDataValues(g);var i=""+b/c*100+"%{",j=g,k=void 0;for(k in h)j[k]||(j[k]=h[k]);h="-"+a+"-transform:";if(j.x||j.y)h+="translate("+(j.x||0)+"px,"+(j.y||0)+"px)";j.angle&&(h+=" rotate("+j.angle+"rad)");if(j.scaleX!==1||j.scaleY!==1)h+=" scale("+ +j.scaleX+","+j.scaleY+")";h+=";";j.alpha&&(h+=" opacity: "+j.alpha+";");if(d!==0.5||e!==0.5)h+=" -"+a+"-transform-origin:"+d*100+"% "+e*100+"%;";f+=i+h+"}\n";h=g}f+="}\n";return f}}}}); CAAT.Module({defines:"CAAT.Behavior.GenericBehavior",depends:["CAAT.Behavior.BaseBehavior"],aliases:["CAAT.GenericBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{start:0,end:0,target:null,property:null,callback:null,setForTime:function(a,b){var c=this.start+a*(this.end-this.start);this.callback&&this.callback(c,this.target,b);this.property&&(this.target[this.property]=c)},setValues:function(a,b,c,d,e){this.start=a;this.end=b;this.target=c;this.property=d;this.callback= e;return this}}}}); CAAT.Module({defines:"CAAT.Behavior.PathBehavior",aliases:["CAAT.PathBehavior"],depends:["CAAT.Behavior.BaseBehavior","CAAT.Foundation.SpriteImage"],constants:{AUTOROTATE:{LEFT_TO_RIGHT:0,RIGHT_TO_LEFT:1,FREE:2},autorotate:{LEFT_TO_RIGHT:0,RIGHT_TO_LEFT:1,FREE:2}},extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){CAAT.Behavior.PathBehavior.superclass.parse.call(this,a);a.SVG&&this.setValues((new CAAT.PathUtil.SVGPath).parsePath(a.SVG));if(a.autoRotate)this.autoRotate=a.autoRotate}, -path:null,autoRotate:false,prevX:-1,prevY:-1,autoRotateOp:CAAT.Behavior.PathBehavior.autorotate.FREE,isOpenContour:false,setOpenContour:function(a){this.isOpenContour=a;return this},getPropertyName:function(){return"translate"},setAutoRotate:function(a,b){this.autoRotate=a;if(b!==void 0)this.autoRotateOp=b;return this},setPath:function(a){this.path=a;return this},setValues:function(a){return this.setPath(a)},setTranslation:function(){return this},calculateKeyFrameData:function(a){a=this.interpolator.getPosition(a).y; -a=this.path.getPosition(a);return"translateX("+a.x+"px) translateY("+a.y+"px)"},getKeyFrameDataValues:function(a){var a=this.interpolator.getPosition(a).y,b=this.path.getPosition(a),c={x:b.x,y:b.y};if(this.autoRotate)a=a===0?b:this.path.getPosition(a-0.0010),b=Math.atan2(b.y-a.y,b.x-a.x),c.angle=b;return c},calculateKeyFramesData:function(a,b,c){typeof c==="undefined"&&(c=100);c>>=0;for(var d,e="@-"+a+"-keyframes "+b+" {",b=0;b<=c;b++)d=""+b/c*100+"%{-"+a+"-transform:"+this.calculateKeyFrameData(b/ -c)+"}",e+=d;e+="}";return e},setForTime:function(a,b){if(!this.path)return{x:b.x,y:b.y};var c=this.path.getPosition(a,this.isOpenContour,0.0010);if(this.autoRotate){if(-1===this.prevX&&-1===this.prevY)this.prevX=c.x,this.prevY=c.y;var d=c.x-this.prevX,e=c.y-this.prevY;if(d===0&&e===0)return b.setLocation(c.x,c.y),{x:b.x,y:b.y};var f=Math.atan2(e,d),g=CAAT.Foundation.SpriteImage,h=CAAT.Behavior.PathBehavior.AUTOROTATE;this.autoRotateOp===h.LEFT_TO_RIGHT?this.prevX<=c.x?b.setImageTransformation(g.TR_NONE): -(b.setImageTransformation(g.TR_FLIP_HORIZONTAL),f+=Math.PI):this.autoRotateOp===h.RIGHT_TO_LEFT&&(this.prevX<=c.x?b.setImageTransformation(g.TR_FLIP_HORIZONTAL):(b.setImageTransformation(g.TR_NONE),f-=Math.PI));b.setRotation(f);this.prevX=c.x;this.prevY=c.y;Math.sqrt(d*d+e*e)}return this.doValueApplication?(b.setLocation(c.x,c.y),{x:b.x,y:b.y}):{x:c.x,y:c.y}},positionOnTime:function(a){return this.isBehaviorInTime(a,null)?(a=this.normalizeTime(a),this.path.getPosition(a)):{x:-1,y:-1}}}}}); +path:null,autoRotate:false,prevX:-1,prevY:-1,autoRotateOp:CAAT.Behavior.PathBehavior.autorotate.FREE,isOpenContour:false,relativeX:0,relativeY:0,setOpenContour:function(a){this.isOpenContour=a;return this},getPropertyName:function(){return"translate"},setRelativeValues:function(a,b){this.relativeX=a;this.relativeY=b;this.isRelative=true;return this},setAutoRotate:function(a,b){this.autoRotate=a;if(b!==void 0)this.autoRotateOp=b;return this},setPath:function(a){this.path=a;return this},setValues:function(a){return this.setPath(a)}, +setTranslation:function(){return this},calculateKeyFrameData:function(a){a=this.interpolator.getPosition(a).y;a=this.path.getPosition(a);return"translateX("+a.x+"px) translateY("+a.y+"px)"},getKeyFrameDataValues:function(a){var a=this.interpolator.getPosition(a).y,b=this.path.getPosition(a),c={x:b.x,y:b.y};if(this.autoRotate)a=a===0?b:this.path.getPosition(a-0.0010),b=Math.atan2(b.y-a.y,b.x-a.x),c.angle=b;return c},calculateKeyFramesData:function(a,b,c){typeof c==="undefined"&&(c=100);c>>=0;for(var d, +e="@-"+a+"-keyframes "+b+" {",b=0;b<=c;b++)d=""+b/c*100+"%{-"+a+"-transform:"+this.calculateKeyFrameData(b/c)+"}",e+=d;e+="}";return e},setForTime:function(a,b){if(!this.path)return{x:b.x,y:b.y};var c=this.path.getPosition(a,this.isOpenContour,0.0010);this.isRelative&&(c.x+=this.relativeX,c.y+=this.relativeY);if(this.autoRotate){if(-1===this.prevX&&-1===this.prevY)this.prevX=c.x,this.prevY=c.y;var d=c.x-this.prevX,e=c.y-this.prevY;if(d===0&&e===0)return b.setLocation(c.x,c.y),{x:b.x,y:b.y};var f= +Math.atan2(e,d),g=CAAT.Foundation.SpriteImage,h=CAAT.Behavior.PathBehavior.AUTOROTATE;this.autoRotateOp===h.LEFT_TO_RIGHT?this.prevX<=c.x?b.setImageTransformation(g.TR_NONE):(b.setImageTransformation(g.TR_FLIP_HORIZONTAL),f+=Math.PI):this.autoRotateOp===h.RIGHT_TO_LEFT&&(this.prevX<=c.x?b.setImageTransformation(g.TR_FLIP_HORIZONTAL):(b.setImageTransformation(g.TR_NONE),f-=Math.PI));b.setRotation(f);this.prevX=c.x;this.prevY=c.y;Math.sqrt(d*d+e*e)}return this.doValueApplication?(b.setLocation(c.x, +c.y),{x:b.x,y:b.y}):{x:c.x,y:c.y}},positionOnTime:function(a){return this.isBehaviorInTime(a,null)?(a=this.normalizeTime(a),this.path.getPosition(a)):{x:-1,y:-1}}}}}); CAAT.Module({defines:"CAAT.Behavior.RotateBehavior",extendsClass:"CAAT.Behavior.BaseBehavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Foundation.Actor"],aliases:["CAAT.RotateBehavior"],extendsWith:function(){return{__init:function(){this.__super();this.anchor=CAAT.Foundation.Actor.ANCHOR_CENTER;return this},parse:function(a){CAAT.Behavior.RotateBehavior.superclass.parse.call(this,a);this.startAngle=a.start||0;this.endAngle=a.end||0;this.anchorX=typeof a.anchorX!=="undefined"?parseInt(a.anchorX): -0.5;this.anchorY=typeof a.anchorY!=="undefined"?parseInt(a.anchorY):0.5},startAngle:0,endAngle:0,anchorX:0.5,anchorY:0.5,getPropertyName:function(){return"rotate"},setForTime:function(a,b){var c=this.startAngle+a*(this.endAngle-this.startAngle);this.doValueApplication&&b.setRotationAnchored(c,this.anchorX,this.anchorY);return c},setValues:function(a,b,c,d){this.startAngle=a;this.endAngle=b;if(typeof c!=="undefined"&&typeof d!=="undefined")this.anchorX=c,this.anchorY=d;return this},setAngles:function(a, -b){return this.setValues(a,b)},setAnchor:function(a,b,c){this.anchorX=b/a.width;this.anchorY=c/a.height;return this},calculateKeyFrameData:function(a){a=this.interpolator.getPosition(a).y;return"rotate("+(this.startAngle+a*(this.endAngle-this.startAngle))+"rad)"},getKeyFrameDataValues:function(a){a=this.interpolator.getPosition(a).y;return{angle:this.startAngle+a*(this.endAngle-this.startAngle)}},calculateKeyFramesData:function(a,b,c){typeof c==="undefined"&&(c=100);c>>=0;for(var d,e="@-"+a+"-keyframes "+ -b+" {",b=0;b<=c;b++)d=""+b/c*100+"%{-"+a+"-transform:"+this.calculateKeyFrameData(b/c)+"; -"+a+"-transform-origin:"+this.anchorX*100+"% "+this.anchorY*100+"% }\n",e+=d;e+="}\n";return e}}}}); +0.5;this.anchorY=typeof a.anchorY!=="undefined"?parseInt(a.anchorY):0.5},startAngle:0,endAngle:0,anchorX:0.5,anchorY:0.5,rotationRelative:0,setRelativeValues:function(a){this.rotationRelative=a;this.isRelative=true;return this},getPropertyName:function(){return"rotate"},setForTime:function(a,b){var c=this.startAngle+a*(this.endAngle-this.startAngle);this.isRelative&&(c+=this.rotationRelative,c>=Math.PI&&(c-=2*Math.PI),c<-2*Math.PI&&(c+=2*Math.PI));this.doValueApplication&&b.setRotationAnchored(c, +this.anchorX,this.anchorY);return c},setValues:function(a,b,c,d){this.startAngle=a;this.endAngle=b;if(typeof c!=="undefined"&&typeof d!=="undefined")this.anchorX=c,this.anchorY=d;return this},setAngles:function(a,b){return this.setValues(a,b)},setAnchor:function(a,b,c){this.anchorX=b/a.width;this.anchorY=c/a.height;return this},calculateKeyFrameData:function(a){a=this.interpolator.getPosition(a).y;return"rotate("+(this.startAngle+a*(this.endAngle-this.startAngle))+"rad)"},getKeyFrameDataValues:function(a){a= +this.interpolator.getPosition(a).y;return{angle:this.startAngle+a*(this.endAngle-this.startAngle)}},calculateKeyFramesData:function(a,b,c){typeof c==="undefined"&&(c=100);c>>=0;for(var d,e="@-"+a+"-keyframes "+b+" {",b=0;b<=c;b++)d=""+b/c*100+"%{-"+a+"-transform:"+this.calculateKeyFrameData(b/c)+"; -"+a+"-transform-origin:"+this.anchorX*100+"% "+this.anchorY*100+"% }\n",e+=d;e+="}\n";return e}}}}); CAAT.Module({defines:"CAAT.Behavior.Scale1Behavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Foundation.Actor"],aliases:["CAAT.Scale1Behavior"],constants:{AXIS:{X:0,Y:1},Axis:{X:0,Y:1}},extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{__init:function(){this.__super();this.anchor=CAAT.Foundation.Actor.ANCHOR_CENTER;return this},startScale:1,endScale:1,anchorX:0.5,anchorY:0.5,applyOnX:true,parse:function(a){CAAT.Behavior.Scale1Behavior.superclass.parse.call(this,a);this.startScale= a.start||0;this.endScale=a.end||0;this.anchorX=typeof a.anchorX!=="undefined"?parseInt(a.anchorX):0.5;this.anchorY=typeof a.anchorY!=="undefined"?parseInt(a.anchorY):0.5;this.applyOnX=a.axis?a.axis.toLowerCase()==="x":true},applyOnAxis:function(a){this.applyOnX=a===CAAT.Behavior.Scale1Behavior.AXIS.X?false:true},getPropertyName:function(){return"scale"},setForTime:function(a,b){var c=this.startScale+a*(this.endScale-this.startScale);0===c&&(c=0.01);this.doValueApplication&&(this.applyOnX?b.setScaleAnchored(c, b.scaleY,this.anchorX,this.anchorY):b.setScaleAnchored(b.scaleX,c,this.anchorX,this.anchorY));return c},setValues:function(a,b,c,d,e){this.startScale=a;this.endScale=b;this.applyOnX=!!c;if(typeof d!=="undefined"&&typeof e!=="undefined")this.anchorX=d,this.anchorY=e;return this},setAnchor:function(a,b,c){this.anchorX=b/a.width;this.anchorY=c/a.height;return this},calculateKeyFrameData:function(a){a=this.interpolator.getPosition(a).y;a=this.startScale+a*(this.endScale-this.startScale);return this.applyOnX? @@ -198,8 +200,8 @@ e;if(b&4&&d-f>this.bounds.bottom)a.position.y=this.bounds.top-e;else if(b&4&&d+f null,f=Number.MAX_VALUE,g=0;gd?e=-1:c=0;a--)this.allCircles[a]===null&&this.allCircles.splice(a,1)},initialize:function(a){if(a)for(var b in a)this[b]=a[b];return this}}}); CAAT.Module({defines:"CAAT.Module.Preloader.Preloader",extendsWith:function(){var a=function(a,c,d){this.id=a;this.path=c;this.image=new Image;this.loader=d;this.image.onload=this.onload.bind(this);this.image.onerror=this.onerror.bind(this);return this};a.prototype={id:null,path:null,image:null,loader:null,onload:function(){this.loader.__onload(this);this.image.onload=null;this.image.onerror=null},onerror:function(){this.loader.__onerror(this)},load:function(){this.image.src=this.path},clear:function(){this.loader= -null}};return{__init:function(){this.elements=[];return this},elements:null,imageCounter:0,cfinished:null,cloaded:null,cerrored:null,loadedCount:0,addElement:function(b,c){this.elements.push(new a(b,c,this));return this},clear:function(){for(var a=0;a>0)*e;var k=i+(d/h>>0)*f,m=g+e,o=k+f;g=(new CAAT.Foundation.SpriteImageHelper(g,k,m-g,o-k,j.width,j.height)).setGL(g/j.width,k/j.height,m/j.width,o/j.height);this.mapInfo[d]=g}}else for(d=0;d0&&(f-=d);var g=(this.offsetY-this.ownerActor.y)%e;g>0&&(g-=e);for(var d=((c.width-f)/d>>0)+1,e=((c.height-g)/e>>0)+1,h,i=a.ctx, -a=0;a>0,c.y-this.ownerActor.y+g+a*b.height>>0,b.width,b.height)},paintInvertedH:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate((c|0)+b.width,d|0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedV:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save(); -a.translate(c|0,d+b.height|0);a.scale(1,-1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedHV:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.translate(b.width,0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintN:function(a,b,c,d){b=this.mapInfo[this.spriteIndex]; -a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintAtRect:function(a,b,c,d,e,f){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,e,f);return this},paintScaledWidth:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,b.height);return this},paintChunk:function(a, -b,c,d,e,f,g){a.drawImage(this.image,d,e,f,g,b,c,f,g)},paintTile:function(a,b,c,d){b=this.mapInfo[b];a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintScaled:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,this.ownerActor.height);return this},getCurrentSpriteImageCSSPosition:function(){var a=this.mapInfo[this.spriteIndex]; -return""+-(a.x+this.parentOffsetX-this.offsetX)+"px "+-(a.y+this.parentOffsetY-this.offsetY)+"px "+(this.ownerActor.transformation===CAAT.Foundation.SpriteImage.TR_TILE?"repeat":"no-repeat")},getNumImages:function(){return this.rows*this.columns},setUV:function(a,b){var c=this.image;if(c.__texturePage){var d=b,e=this.mapInfo[this.spriteIndex],f=e.u,g=e.v,h=e.u1,e=e.v1;if(this.offsetX||this.offsetY)f=c.__texturePage,g=-this.offsetY/f.height,h=(this.ownerActor.width-this.offsetX)/f.width,e=(this.ownerActor.height- -this.offsetY)/f.height,f=-this.offsetX/f.width+c.__u,g+=c.__v,h+=c.__u,e+=c.__v;c.inverted?(a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e,a[d++]=f,a[d++]=g):(a[d++]=f,a[d++]=g,a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e)}},setChangeFPS:function(a){this.changeFPS=a;return this},setSpriteTransformation:function(a){this.transformation=a;var b=CAAT.Foundation.SpriteImage;switch(a){case b.TR_FLIP_HORIZONTAL:this.paint=this.paintInvertedH;break;case b.TR_FLIP_VERTICAL:this.paint=this.paintInvertedV; -break;case b.TR_FLIP_ALL:this.paint=this.paintInvertedHV;break;case b.TR_FIXED_TO_SIZE:this.paint=this.paintScaled;break;case b.TR_FIXED_WIDTH_TO_SIZE:this.paint=this.paintScaledWidth;break;case b.TR_TILE:this.paint=this.paintTiled;break;default:this.paint=this.paintN}this.ownerActor.invalidate();return this},resetAnimationTime:function(){this.prevAnimationTime=-1;return this},setAnimationImageIndex:function(a){this.animationImageIndex=a;this.spriteIndex=a[0];this.prevAnimationTime=-1;return this}, -setSpriteIndex:function(a){this.spriteIndex=a;return this},setSpriteIndexAtTime:function(a){if(this.animationImageIndex.length>1){if(this.prevAnimationTime===-1)this.prevAnimationTime=a,this.spriteIndex=this.animationImageIndex[0],this.prevIndex=0;else{var b=a;b-=this.prevAnimationTime;b/=this.changeFPS;b%=this.animationImageIndex.length;b=Math.floor(b);b0&&(f-=d);var g=(this.offsetY-this.ownerActor.y)%e; +g>0&&(g-=e);for(var d=((c.width-f)/d>>0)+1,e=((c.height-g)/e>>0)+1,h,i=a.ctx,a=0;a>0,c.y-this.ownerActor.y+g+a*b.height>>0,b.width,b.height)},paintInvertedH:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate((c|0)+b.width,d|0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedV:function(a, +b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedHV:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.translate(b.width,0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this}, +paintN:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintAtRect:function(a,b,c,d,e,f){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,e,f);return this},paintScaledWidth:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+ +d>>0,this.ownerActor.width,b.height);return this},paintChunk:function(a,b,c,d,e,f,g){a.drawImage(this.image,d,e,f,g,b,c,f,g)},paintTile:function(a,b,c,d){b=this.mapInfo[b];a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintScaled:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,this.ownerActor.height);return this},getCurrentSpriteImageCSSPosition:function(){var a= +this.mapInfo[this.spriteIndex];return""+-(a.x+this.parentOffsetX-this.offsetX)+"px "+-(a.y+this.parentOffsetY-this.offsetY)+"px "+(this.ownerActor.transformation===CAAT.Foundation.SpriteImage.TR_TILE?"repeat":"no-repeat")},getNumImages:function(){return this.rows*this.columns},setUV:function(a,b){var c=this.image;if(c.__texturePage){var d=b,e=this.mapInfo[this.spriteIndex],f=e.u,g=e.v,h=e.u1,e=e.v1;if(this.offsetX||this.offsetY)f=c.__texturePage,g=-this.offsetY/f.height,h=(this.ownerActor.width-this.offsetX)/ +f.width,e=(this.ownerActor.height-this.offsetY)/f.height,f=-this.offsetX/f.width+c.__u,g+=c.__v,h+=c.__u,e+=c.__v;c.inverted?(a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e,a[d++]=f,a[d++]=g):(a[d++]=f,a[d++]=g,a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e)}},setChangeFPS:function(a){this.changeFPS=a;return this},setSpriteTransformation:function(a){this.transformation=a;var b=CAAT.Foundation.SpriteImage;switch(a){case b.TR_FLIP_HORIZONTAL:this.paint=this.paintInvertedH;break;case b.TR_FLIP_VERTICAL:this.paint= +this.paintInvertedV;break;case b.TR_FLIP_ALL:this.paint=this.paintInvertedHV;break;case b.TR_FIXED_TO_SIZE:this.paint=this.paintScaled;break;case b.TR_FIXED_WIDTH_TO_SIZE:this.paint=this.paintScaledWidth;break;case b.TR_TILE:this.paint=this.paintTiled;break;default:this.paint=this.paintN}this.ownerActor.invalidate();return this},resetAnimationTime:function(){this.prevAnimationTime=-1;return this},setAnimationImageIndex:function(a){this.animationImageIndex=a;this.spriteIndex=a[0];this.prevAnimationTime= +-1;return this},setSpriteIndex:function(a){this.spriteIndex=a;return this},setSpriteIndexAtTime:function(a){if(this.animationImageIndex.length>1){if(this.prevAnimationTime===-1)this.prevAnimationTime=a,this.spriteIndex=this.animationImageIndex[0],this.prevIndex=0;else{var b=a;b-=this.prevAnimationTime;b/=this.changeFPS;b%=this.animationImageIndex.length;b=Math.floor(b);b=0;b--){var c=this.childrenList[b],d=new CAAT.Math.Point(a.x,a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},resetStats:function(){this.statistics.size_total=0;this.statistics.size_active= -0;this.statistics.draws=0;this.statistics.size_discarded_by_dirty_rects=0},render:function(a){if(!this.currentScene||!this.currentScene.isPaused()){this.time+=a;for(e=0,l=this.childrenList.length;e0&&!navigator.isCocoonJS&&CAAT.DEBUG&&CAAT.DEBUG_DIRTYRECTS){f.beginPath();this.nDirtyRects=0;b=this.cDirtyRects;for(e=0;e=this.dirtyRects.length)for(b=0;b<32;b++)this.dirtyRects.push(new CAAT.Math.Rectangle);b=this.dirtyRects[this.dirtyRectsIndex];b.x=a.x;b.y=a.y;b.x1=a.x1;b.y1=a.y1;b.width=a.width;b.height=a.height;this.cDirtyRects.push(b)}},renderToContext:function(a,b){if(b.isInAnimationFrame(this.time)){a.setTransform(1,0,0,1,0,0);a.globalAlpha=1;a.globalCompositeOperation= -"source-over";a.clearRect(0,0,this.width,this.height);var c=this.ctx;this.ctx=a;a.save();var d=this.modelViewMatrix,e=this.worldModelViewMatrix;this.modelViewMatrix=this.worldModelViewMatrix=new CAAT.Math.Matrix;this.wdirty=true;b.animate(this,b.time);if(b.onRenderStart)b.onRenderStart(b.time);b.paintActor(this,b.time);if(b.onRenderEnd)b.onRenderEnd(b.time);this.worldModelViewMatrix=e;this.modelViewMatrix=d;a.restore();this.ctx=c}},addScene:function(a){a.setBounds(0,0,this.width,this.height);this.scenes.push(a); -a.setEaseListener(this);null===this.currentScene&&this.setScene(0)},getNumScenes:function(){return this.scenes.length},easeInOut:function(a,b,c,d,e,f,g,h,i,j){if(a!==this.getCurrentSceneIndex()){a=this.scenes[a];d=this.scenes[d];if(!CAAT.__CSS__&&CAAT.CACHE_SCENE_ON_CHANGE)this.renderToContext(this.transitionScene.ctx,d),d=this.transitionScene;a.setExpired(false);d.setExpired(false);a.mouseEnabled=false;d.mouseEnabled=false;a.resetTransform();d.resetTransform();a.setLocation(0,0);d.setLocation(0, -0);a.alpha=1;d.alpha=1;b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(g,h,c,i):b===CAAT.Foundation.Scene.EASE_SCALE?a.easeScaleIn(0,g,h,c,i):a.easeTranslationIn(g,h,c,i);e===CAAT.Foundation.Scene.EASE_ROTATION?d.easeRotationOut(g,h,f,j):e===CAAT.Foundation.Scene.EASE_SCALE?d.easeScaleOut(0,g,h,f,j):d.easeTranslationOut(g,h,f,j);this.childrenList=[];d.goOut(a);a.getIn(d);this.addChild(d);this.addChild(a)}},easeInOutRandom:function(a,b,c,d){var e=Math.random(),f=Math.random(),g;e<0.33?(e= -CAAT.Foundation.Scene.EASE_ROTATION,g=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):e<0.66?(e=CAAT.Foundation.Scene.EASE_SCALE,g=(new CAAT.Behavior.Interpolator).createElasticOutInterpolator(1.1,0.4)):(e=CAAT.Foundation.Scene.EASE_TRANSLATE,g=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator());var h;f<0.33?(f=CAAT.Foundation.Scene.EASE_ROTATION,h=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):f<0.66?(f=CAAT.Foundation.Scene.EASE_SCALE, -h=(new CAAT.Behavior.Interpolator).createExponentialOutInterpolator(4)):(f=CAAT.Foundation.Scene.EASE_TRANSLATE,h=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator());this.easeInOut(a,e,Math.random()*8.99>>0,b,f,Math.random()*8.99>>0,c,d,g,h)},easeIn:function(a,b,c,d,e,f){a=this.scenes[a];b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(c,d,e,f):b===CAAT.Foundation.Scene.EASE_SCALE?a.easeScaleIn(0,c,d,e,f):a.easeTranslationIn(c,d,e,f);this.childrenList=[];this.addChild(a);a.resetTransform(); -a.setLocation(0,0);a.alpha=1;a.mouseEnabled=false;a.setExpired(false)},setScene:function(a){a=this.scenes[a];this.childrenList=[];this.addChild(a);this.currentScene=a;a.setExpired(false);a.mouseEnabled=true;a.resetTransform();a.setLocation(0,0);a.alpha=1;a.getIn();a.activated()},switchToScene:function(a,b,c,d){var e=this.getSceneIndex(this.currentScene);d?this.easeInOutRandom(a,e,b,c):this.setScene(a)},switchToPrevScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<= -1||d===0||(c?this.easeInOutRandom(d-1,d,a,b):this.setScene(d-1))},switchToNextScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<=1||d===this.getNumScenes()-1||(c?this.easeInOutRandom(d+1,d,a,b):this.setScene(d+1))},mouseEnter:function(){},mouseExit:function(){},mouseMove:function(){},mouseDown:function(){},mouseUp:function(){},mouseDrag:function(){},easeEnd:function(a,b){b?(this.currentScene=a,this.currentScene.activated()):a.setExpired(true);a.mouseEnabled=true; -a.emptyBehaviorList()},getSceneIndex:function(a){for(var b=0;b500&&(b=500);if(this.onRenderStart)this.onRenderStart(b);this.render(b);this.debugInfo&&this.debugInfo(this.statistics);this.timeline=a;if(this.onRenderEnd)this.onRenderEnd(b);this.needsRepaint=false}},resetTimeline:function(){this.timeline=(new Date).getTime()},endLoop:function(){},setClear:function(a){this.clear=a;this.dirtyRectsEnabled= -this.clear===CAAT.Foundation.Director.CLEAR_DIRTY_RECTS?true:false;return this},getAudioManager:function(){return this.audioManager},cumulateOffset:function(a,b,c){var d=c+"Left";c+="Top";for(var e=0,f=0,g;navigator.browser!=="iOS"&&a&&a.style;)if(g=a.currentStyle?a.currentStyle.position:(g=(a.ownerDocument.defaultView||a.ownerDocument.parentWindow).getComputedStyle(a,null))?g.getPropertyValue("position"):null,/^(fixed)$/.test(g))break;else e+=a[d],f+=a[c],a=a[b];return{x:e,y:f,style:g}},getOffset:function(a){var b= -this.cumulateOffset(a,"offsetParent","offset");return b.style==="fixed"?(a=this.cumulateOffset(a,a.parentNode?"parentNode":"parentElement","scroll"),{x:b.x+a.x,y:b.y+a.y}):{x:b.x,y:b.y}},getCanvasCoord:function(a,b){var c=new CAAT.Math.Point,d=0,e=0;if(!b)b=window.event;if(b.pageX||b.pageY)d=b.pageX,e=b.pageY;else if(b.clientX||b.clientY)d=b.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,e=b.clientY+document.body.scrollTop+document.documentElement.scrollTop;var f=this.getOffset(this.canvas); -d-=f.x;e-=f.y;d*=this.SCREEN_RATIO;e*=this.SCREEN_RATIO;c.x=d;c.y=e;if(!this.modelViewMatrixI)this.modelViewMatrixI=this.modelViewMatrix.getInverse();this.modelViewMatrixI.transformCoord(c);d=c.x;e=c.y;a.set(d,e);this.screenMousePoint.set(d,e)},__mouseDownHandler:function(a){if(this.dragging&&this.lastSelectedActor)this.__mouseUpHandler(a);else{this.getCanvasCoord(this.mousePoint,a);this.isMouseDown=true;var b=this.findActorAtPosition(this.mousePoint);if(null!==b){var c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x, -this.screenMousePoint.y,0));b.mouseDown((new CAAT.Event.MouseEvent).init(c.x,c.y,a,b,new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y)))}this.lastSelectedActor=b}},__mouseUpHandler:function(a){this.isMouseDown=false;this.getCanvasCoord(this.mousePoint,a);var b=null,c=this.lastSelectedActor;null!==c&&(b=c.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0)),c.actionPerformed&&c.contains(b.x,b.y)&&c.actionPerformed(a),c.mouseUp((new CAAT.Event.MouseEvent).init(b.x, -b.y,a,c,this.screenMousePoint,this.currentScene.time)));!this.dragging&&null!==c&&c.contains(b.x,b.y)&&c.mouseClick((new CAAT.Event.MouseEvent).init(b.x,b.y,a,c,this.screenMousePoint,this.currentScene.time));this.in_=this.dragging=false},__mouseMoveHandler:function(a){var b,c,d=this.currentScene?this.currentScene.time:0;if(this.isMouseDown&&null!==this.lastSelectedActor){if(b=this.lastSelectedActor,c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0)),this.dragging|| -!(Math.abs(this.prevMousePoint.x-c.x)=this.width||b.y>=this.height))this.touching=true,this.__mouseDownHandler(a)}},__touchEndHandler:function(a){if(this.touching)a.preventDefault(), -a.returnValue=false,a=a.changedTouches[0],this.getCanvasCoord(this.mousePoint,a),this.touching=false,this.__mouseUpHandler(a)},__touchMoveHandler:function(a){if(this.touching&&(a.preventDefault(),a.returnValue=false,!this.gesturing))for(var b=0;b=this.width||f.y>=this.height)){var g=this.findActorAtPosition(f);g!==null&&(f=g.viewToModel(f),this.touches[e]||(this.touches[e]={actor:g,touch:new CAAT.Event.TouchInfo(e,f.x,f.y,g)},c.push(e)))}}e={};for(b=0;b=b.width||d.y>=b.height))b.touching=true,b.__mouseDownHandler(c)}},false);window.addEventListener("mouseover",function(c){if(c.target===a&&!b.dragging){c.preventDefault();c.cancelBubble=true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width||d.y>=b.height||b.__mouseOverHandler(c)}},false);window.addEventListener("mouseout",function(c){if(c.target=== -a&&!b.dragging)c.preventDefault(),c.cancelBubble=true,c.stopPropagation&&c.stopPropagation(),b.getCanvasCoord(b.mousePoint,c),b.__mouseOutHandler(c)},false);window.addEventListener("mousemove",function(a){a.preventDefault();a.cancelBubble=true;a.stopPropagation&&a.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,a);(b.dragging||!(d.x<0||d.y<0||d.x>=b.width||d.y>=b.height))&&b.__mouseMoveHandler(a)},false);window.addEventListener("dblclick",function(c){if(c.target===a){c.preventDefault();c.cancelBubble= -true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width||d.y>=b.height||b.__mouseDBLClickHandler(c)}},false);CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MOUSE?(a.addEventListener("touchstart",this.__touchStartHandler.bind(this),false),a.addEventListener("touchmove",this.__touchMoveHandler.bind(this),false),a.addEventListener("touchend",this.__touchEndHandler.bind(this),false),a.addEventListener("gesturestart",function(c){if(c.target===a)c.preventDefault(), -c.returnValue=false,b.__gestureStart(c.scale,c.rotation)},false),a.addEventListener("gestureend",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureEnd(c.scale,c.rotation)},false),a.addEventListener("gesturechange",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureChange(c.scale,c.rotation)},false)):CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MULTITOUCH&&(a.addEventListener("touchstart",this.__touchStartHandlerMT.bind(this),false),a.addEventListener("touchmove", -this.__touchMoveHandlerMT.bind(this),false),a.addEventListener("touchend",this.__touchEndHandlerMT.bind(this),false),a.addEventListener("touchcancel",this.__touchCancelHandleMT.bind(this),false),a.addEventListener("gesturestart",this.__touchGestureStartHandleMT.bind(this),false),a.addEventListener("gestureend",this.__touchGestureEndHandleMT.bind(this),false),a.addEventListener("gesturechange",this.__touchGestureChangeHandleMT.bind(this),false))},enableEvents:function(a){CAAT.RegisterDirector(this); -this.in_=false;this.createEventHandler(a)},createEventHandler:function(a){this.in_=false;this.addHandlers(a)}}},onCreate:function(){if(typeof CAAT.__CSS__!=="undefined")CAAT.Foundation.Director.prototype.clip=true,CAAT.Foundation.Director.prototype.glEnabled=false,CAAT.Foundation.Director.prototype.getRenderType=function(){return"CSS"},CAAT.Foundation.Director.prototype.setScaleProportional=function(a,b){var c=Math.min(a/this.referenceWidth,b/this.referenceHeight);this.setScaleAnchored(c,c,0,0);this.eventHandler.style.width= -""+this.referenceWidth+"px";this.eventHandler.style.height=""+this.referenceHeight+"px"},CAAT.Foundation.Director.prototype.setBounds=function(a,b,c,d){CAAT.Foundation.Director.superclass.setBounds.call(this,a,b,c,d);for(a=0;a=0;b--){var c=this.childrenList[b],d=new CAAT.Math.Point(a.x,a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},resetStats:function(){this.statistics.size_total=0;this.statistics.size_active=0;this.statistics.draws= +0;this.statistics.size_discarded_by_dirty_rects=0},render:function(a){if(!this.currentScene||!this.currentScene.isPaused()){this.time+=a;for(e=0,l=this.childrenList.length;e +0&&!navigator.isCocoonJS&&CAAT.DEBUG&&CAAT.DEBUG_DIRTYRECTS){f.beginPath();this.nDirtyRects=0;b=this.cDirtyRects;for(e=0;e=this.dirtyRects.length)for(b=0;b<32;b++)this.dirtyRects.push(new CAAT.Math.Rectangle);b=this.dirtyRects[this.dirtyRectsIndex];b.x=a.x;b.y=a.y;b.x1=a.x1;b.y1=a.y1;b.width=a.width;b.height=a.height;this.cDirtyRects.push(b)}},renderToContext:function(a,b){if(b.isInAnimationFrame(this.time)){a.setTransform(1,0,0,1,0,0);a.globalAlpha=1;a.globalCompositeOperation="source-over";a.clearRect(0,0,this.width,this.height);var c=this.ctx;this.ctx=a;a.save(); +var d=this.modelViewMatrix,e=this.worldModelViewMatrix;this.modelViewMatrix=this.worldModelViewMatrix=new CAAT.Math.Matrix;this.wdirty=true;b.animate(this,b.time);if(b.onRenderStart)b.onRenderStart(b.time);b.paintActor(this,b.time);if(b.onRenderEnd)b.onRenderEnd(b.time);this.worldModelViewMatrix=e;this.modelViewMatrix=d;a.restore();this.ctx=c}},addScene:function(a){a.setBounds(0,0,this.width,this.height);this.scenes.push(a);a.setEaseListener(this);null===this.currentScene&&this.setScene(0)},getNumScenes:function(){return this.scenes.length}, +easeInOut:function(a,b,c,d,e,f,g,h,i,j){if(a!==this.getCurrentSceneIndex()){a=this.scenes[a];d=this.scenes[d];if(!CAAT.__CSS__&&CAAT.CACHE_SCENE_ON_CHANGE)this.renderToContext(this.transitionScene.ctx,d),d=this.transitionScene;a.setExpired(false);d.setExpired(false);a.mouseEnabled=false;d.mouseEnabled=false;a.resetTransform();d.resetTransform();a.setLocation(0,0);d.setLocation(0,0);a.alpha=1;d.alpha=1;b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(g,h,c,i):b===CAAT.Foundation.Scene.EASE_SCALE? +a.easeScaleIn(0,g,h,c,i):a.easeTranslationIn(g,h,c,i);e===CAAT.Foundation.Scene.EASE_ROTATION?d.easeRotationOut(g,h,f,j):e===CAAT.Foundation.Scene.EASE_SCALE?d.easeScaleOut(0,g,h,f,j):d.easeTranslationOut(g,h,f,j);this.childrenList=[];d.goOut(a);a.getIn(d);this.addChild(d);this.addChild(a)}},easeInOutRandom:function(a,b,c,d){var e=Math.random(),f=Math.random(),g;e<0.33?(e=CAAT.Foundation.Scene.EASE_ROTATION,g=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):e<0.66?(e=CAAT.Foundation.Scene.EASE_SCALE, +g=(new CAAT.Behavior.Interpolator).createElasticOutInterpolator(1.1,0.4)):(e=CAAT.Foundation.Scene.EASE_TRANSLATE,g=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator());var h;f<0.33?(f=CAAT.Foundation.Scene.EASE_ROTATION,h=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):f<0.66?(f=CAAT.Foundation.Scene.EASE_SCALE,h=(new CAAT.Behavior.Interpolator).createExponentialOutInterpolator(4)):(f=CAAT.Foundation.Scene.EASE_TRANSLATE,h=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator()); +this.easeInOut(a,e,Math.random()*8.99>>0,b,f,Math.random()*8.99>>0,c,d,g,h)},easeIn:function(a,b,c,d,e,f){a=this.scenes[a];b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(c,d,e,f):b===CAAT.Foundation.Scene.EASE_SCALE?a.easeScaleIn(0,c,d,e,f):a.easeTranslationIn(c,d,e,f);this.childrenList=[];this.addChild(a);a.resetTransform();a.setLocation(0,0);a.alpha=1;a.mouseEnabled=false;a.setExpired(false)},setScene:function(a){a=this.scenes[a];this.childrenList=[];this.addChild(a);this.currentScene= +a;a.setExpired(false);a.mouseEnabled=true;a.resetTransform();a.setLocation(0,0);a.alpha=1;a.getIn();a.activated()},switchToScene:function(a,b,c,d){var e=this.getSceneIndex(this.currentScene);d?this.easeInOutRandom(a,e,b,c):this.setScene(a)},switchToPrevScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<=1||d===0||(c?this.easeInOutRandom(d-1,d,a,b):this.setScene(d-1))},switchToNextScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<= +1||d===this.getNumScenes()-1||(c?this.easeInOutRandom(d+1,d,a,b):this.setScene(d+1))},mouseEnter:function(){},mouseExit:function(){},mouseMove:function(){},mouseDown:function(){},mouseUp:function(){},mouseDrag:function(){},easeEnd:function(a,b){b?(this.currentScene=a,this.currentScene.activated()):a.setExpired(true);a.mouseEnabled=true;a.emptyBehaviorList()},getSceneIndex:function(a){for(var b=0;b500&&(b=500);if(this.onRenderStart)this.onRenderStart(b);this.render(b);this.debugInfo&&this.debugInfo(this.statistics);this.timeline=a;if(this.onRenderEnd)this.onRenderEnd(b);this.needsRepaint=false}},resetTimeline:function(){this.timeline=(new Date).getTime()},endLoop:function(){},setClear:function(a){this.clear=a;this.dirtyRectsEnabled=this.clear===CAAT.Foundation.Director.CLEAR_DIRTY_RECTS?true:false;return this},getAudioManager:function(){return this.audioManager},cumulateOffset:function(a, +b,c){var d=c+"Left";c+="Top";for(var e=0,f=0,g;navigator.browser!=="iOS"&&a&&a.style;)if(g=a.currentStyle?a.currentStyle.position:(g=(a.ownerDocument.defaultView||a.ownerDocument.parentWindow).getComputedStyle(a,null))?g.getPropertyValue("position"):null,/^(fixed)$/.test(g))break;else e+=a[d],f+=a[c],a=a[b];return{x:e,y:f,style:g}},getOffset:function(a){var b=this.cumulateOffset(a,"offsetParent","offset");return b.style==="fixed"?(a=this.cumulateOffset(a,a.parentNode?"parentNode":"parentElement", +"scroll"),{x:b.x+a.x,y:b.y+a.y}):{x:b.x,y:b.y}},getCanvasCoord:function(a,b){var c=new CAAT.Math.Point,d=0,e=0;if(!b)b=window.event;if(b.pageX||b.pageY)d=b.pageX,e=b.pageY;else if(b.clientX||b.clientY)d=b.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,e=b.clientY+document.body.scrollTop+document.documentElement.scrollTop;var f=this.getOffset(this.canvas);d-=f.x;e-=f.y;d*=this.SCREEN_RATIO;e*=this.SCREEN_RATIO;c.x=d;c.y=e;if(!this.modelViewMatrixI)this.modelViewMatrixI=this.modelViewMatrix.getInverse(); +this.modelViewMatrixI.transformCoord(c);d=c.x;e=c.y;a.set(d,e);this.screenMousePoint.set(d,e)},__mouseDownHandler:function(a){if(this.dragging&&this.lastSelectedActor)this.__mouseUpHandler(a);else{this.getCanvasCoord(this.mousePoint,a);this.isMouseDown=true;var b=this.findActorAtPosition(this.mousePoint);if(null!==b){var c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0));b.mouseDown((new CAAT.Event.MouseEvent).init(c.x,c.y,a,b,new CAAT.Math.Point(this.screenMousePoint.x, +this.screenMousePoint.y)))}this.lastSelectedActor=b}},__mouseUpHandler:function(a){this.isMouseDown=false;this.getCanvasCoord(this.mousePoint,a);var b=null,c=this.lastSelectedActor;null!==c&&(b=c.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0)),c.actionPerformed&&c.contains(b.x,b.y)&&c.actionPerformed(a),c.mouseUp((new CAAT.Event.MouseEvent).init(b.x,b.y,a,c,this.screenMousePoint,this.currentScene.time)));!this.dragging&&null!==c&&c.contains(b.x,b.y)&&c.mouseClick((new CAAT.Event.MouseEvent).init(b.x, +b.y,a,c,this.screenMousePoint,this.currentScene.time));this.in_=this.dragging=false},__mouseMoveHandler:function(a){var b,c,d=this.currentScene?this.currentScene.time:0;if(this.isMouseDown&&null!==this.lastSelectedActor){if(b=this.lastSelectedActor,c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0)),this.dragging||!(Math.abs(this.prevMousePoint.x-c.x)=this.width||b.y>=this.height))this.touching=true,this.__mouseDownHandler(a)}},__touchEndHandler:function(a){if(this.touching)a.preventDefault(),a.returnValue=false,a=a.changedTouches[0],this.getCanvasCoord(this.mousePoint,a),this.touching= +false,this.__mouseUpHandler(a)},__touchMoveHandler:function(a){if(this.touching&&(a.preventDefault(),a.returnValue=false,!this.gesturing))for(var b=0;b=this.width||f.y>=this.height)){var g= +this.findActorAtPosition(f);g!==null&&(f=g.viewToModel(f),this.touches[e]||(this.touches[e]={actor:g,touch:new CAAT.Event.TouchInfo(e,f.x,f.y,g)},c.push(e)))}}e={};for(b=0;b=b.width|| +d.y>=b.height))b.touching=true,b.__mouseDownHandler(c)}},false);window.addEventListener("mouseover",function(c){if(c.target===a&&!b.dragging){c.preventDefault();c.cancelBubble=true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width||d.y>=b.height||b.__mouseOverHandler(c)}},false);window.addEventListener("mouseout",function(c){if(c.target===a&&!b.dragging)c.preventDefault(),c.cancelBubble=true,c.stopPropagation&&c.stopPropagation(),b.getCanvasCoord(b.mousePoint, +c),b.__mouseOutHandler(c)},false);window.addEventListener("mousemove",function(a){a.preventDefault();a.cancelBubble=true;a.stopPropagation&&a.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,a);(b.dragging||!(d.x<0||d.y<0||d.x>=b.width||d.y>=b.height))&&b.__mouseMoveHandler(a)},false);window.addEventListener("dblclick",function(c){if(c.target===a){c.preventDefault();c.cancelBubble=true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width|| +d.y>=b.height||b.__mouseDBLClickHandler(c)}},false);CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MOUSE?(a.addEventListener("touchstart",this.__touchStartHandler.bind(this),false),a.addEventListener("touchmove",this.__touchMoveHandler.bind(this),false),a.addEventListener("touchend",this.__touchEndHandler.bind(this),false),a.addEventListener("gesturestart",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureStart(c.scale,c.rotation)},false),a.addEventListener("gestureend",function(c){if(c.target=== +a)c.preventDefault(),c.returnValue=false,b.__gestureEnd(c.scale,c.rotation)},false),a.addEventListener("gesturechange",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureChange(c.scale,c.rotation)},false)):CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MULTITOUCH&&(a.addEventListener("touchstart",this.__touchStartHandlerMT.bind(this),false),a.addEventListener("touchmove",this.__touchMoveHandlerMT.bind(this),false),a.addEventListener("touchend",this.__touchEndHandlerMT.bind(this),false), +a.addEventListener("touchcancel",this.__touchCancelHandleMT.bind(this),false),a.addEventListener("gesturestart",this.__touchGestureStartHandleMT.bind(this),false),a.addEventListener("gestureend",this.__touchGestureEndHandleMT.bind(this),false),a.addEventListener("gesturechange",this.__touchGestureChangeHandleMT.bind(this),false))},enableEvents:function(a){CAAT.RegisterDirector(this);this.in_=false;this.createEventHandler(a)},createEventHandler:function(a){this.in_=false;this.addHandlers(a)}}},onCreate:function(){if(typeof CAAT.__CSS__!== +"undefined")CAAT.Foundation.Director.prototype.clip=true,CAAT.Foundation.Director.prototype.glEnabled=false,CAAT.Foundation.Director.prototype.getRenderType=function(){return"CSS"},CAAT.Foundation.Director.prototype.setScaleProportional=function(a,b){var c=Math.min(a/this.referenceWidth,b/this.referenceHeight);this.setScaleAnchored(c,c,0,0);this.eventHandler.style.width=""+this.referenceWidth+"px";this.eventHandler.style.height=""+this.referenceHeight+"px"},CAAT.Foundation.Director.prototype.setBounds= +function(a,b,c,d){CAAT.Foundation.Director.superclass.setBounds.call(this,a,b,c,d);for(a=0;a=this.behaviorStartTime&&(a=(a-this.behaviorStartTime)%this.behaviorDuration+this.behaviorStartTime);if(a>this.behaviorStartTime+this.behaviorDuration)return this.status!==e.EXPIRED&&this.setExpired(b,a),false;if(this.status===e.NOT_STARTED)this.status=e.STARTED,this.fireBehaviorStartedEvent(b,a);return this.behaviorStartTime<=a},fireBehaviorStartedEvent:function(a,b){for(var e= -0,f=this.lifecycleListenerList.length;e=this.behaviorStartTime&&(a=(a-this.behaviorStartTime)%this.behaviorDuration+this.behaviorStartTime);if(a>this.behaviorStartTime+this.behaviorDuration)return this.status!==e.EXPIRED&&this.setExpired(b,a),false;if(this.status=== +e.NOT_STARTED)this.status=e.STARTED,this.fireBehaviorStartedEvent(b,a);return this.behaviorStartTime<=a},fireBehaviorStartedEvent:function(a,b){for(var e=0,f=this.lifecycleListenerList.length;e>=0;for(var d= "@-"+a+"-keyframes "+b+" {",a=0;a<=c;a++)b=""+a/c*100+"%{opacity: "+this.calculateKeyFrameData(a/c)+"}",d+=b;d+="}";return d}}}}); -CAAT.Module({defines:"CAAT.Behavior.ContainerBehavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Behavior.GenericBehavior"],aliases:["CAAT.ContainerBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){if(a.behaviors&&a.behaviors.length)for(var b=0;b=d)){d=(d-c.behaviorStartTime)/c.behaviorDuration;c=c.getKeyFrameDataValues(d); -for(var f in c)e[f]=c[f]}return e},calculateKeyFrameData:function(a,b){function c(a){if(f[a])h+=f[a];else if(prevValues&&(i=prevValues[a]))h+=i,f[a]=i}var d,e,f={},g;for(d=0;d=g&&(g=(g-e.behaviorStartTime)/e.behaviorDuration,g=e.calculateKeyFrameData(g),e=e.getPropertyName(b), -typeof f[e]==="undefined"&&(f[e]=""),f[e]+=g+" "));var h="",i;c("translate");c("rotate");c("scale");d="";h&&(d="-"+b+"-transform: "+h+";");h="";c("opacity");h&&(d+=" opacity: "+h+";");d+=" -webkit-transform-origin: 0% 0%";return{rules:d,ret:f}},calculateKeyFramesData:function(a,b,c,d,e){if(this.duration===Number.MAX_VALUE)return"";typeof d==="undefined"&&(d=0.5);typeof e==="undefined"&&(e=0.5);typeof c==="undefined"&&(c=100);for(var f="@-"+a+"-keyframes "+b+" {",g,h={},b=0;b<=c;b++){g=this.interpolator.getPosition(b/ -c).y;g=this.getKeyFrameDataValues(g);var i=""+b/c*100+"%{",j=g,k=void 0;for(k in h)j[k]||(j[k]=h[k]);h="-"+a+"-transform:";if(j.x||j.y)h+="translate("+(j.x||0)+"px,"+(j.y||0)+"px)";j.angle&&(h+=" rotate("+j.angle+"rad)");if(j.scaleX!==1||j.scaleY!==1)h+=" scale("+j.scaleX+","+j.scaleY+")";h+=";";j.alpha&&(h+=" opacity: "+j.alpha+";");if(d!==0.5||e!==0.5)h+=" -"+a+"-transform-origin:"+d*100+"% "+e*100+"%;";f+=i+h+"}\n";h=g}f+="}\n";return f}}}}); +CAAT.Module({defines:"CAAT.Behavior.ContainerBehavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Behavior.GenericBehavior"],aliases:["CAAT.ContainerBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){if(a.behaviors&&a.behaviors.length)for(var b=0;b=d)){d=(d-c.behaviorStartTime)/c.behaviorDuration;c=c.getKeyFrameDataValues(d);for(var f in c)e[f]=c[f]}return e},calculateKeyFrameData:function(a,b){function c(a){if(f[a])h+=f[a];else if(prevValues&&(i=prevValues[a]))h+=i,f[a]=i}var d,e,f={},g;for(d=0;d=g&&(g=(g-e.behaviorStartTime)/e.behaviorDuration,g=e.calculateKeyFrameData(g),e=e.getPropertyName(b),typeof f[e]==="undefined"&&(f[e]=""),f[e]+=g+" "));var h="",i;c("translate");c("rotate");c("scale");d="";h&&(d="-"+b+"-transform: "+h+";");h="";c("opacity");h&&(d+=" opacity: "+h+";");d+=" -webkit-transform-origin: 0% 0%";return{rules:d,ret:f}},calculateKeyFramesData:function(a, +b,c,d,e){if(this.duration===Number.MAX_VALUE)return"";typeof d==="undefined"&&(d=0.5);typeof e==="undefined"&&(e=0.5);typeof c==="undefined"&&(c=100);for(var f="@-"+a+"-keyframes "+b+" {",g,h={},b=0;b<=c;b++){g=this.interpolator.getPosition(b/c).y;g=this.getKeyFrameDataValues(g);var i=""+b/c*100+"%{",j=g,k=void 0;for(k in h)j[k]||(j[k]=h[k]);h="-"+a+"-transform:";if(j.x||j.y)h+="translate("+(j.x||0)+"px,"+(j.y||0)+"px)";j.angle&&(h+=" rotate("+j.angle+"rad)");if(j.scaleX!==1||j.scaleY!==1)h+=" scale("+ +j.scaleX+","+j.scaleY+")";h+=";";j.alpha&&(h+=" opacity: "+j.alpha+";");if(d!==0.5||e!==0.5)h+=" -"+a+"-transform-origin:"+d*100+"% "+e*100+"%;";f+=i+h+"}\n";h=g}f+="}\n";return f}}}}); CAAT.Module({defines:"CAAT.Behavior.GenericBehavior",depends:["CAAT.Behavior.BaseBehavior"],aliases:["CAAT.GenericBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{start:0,end:0,target:null,property:null,callback:null,setForTime:function(a,b){var c=this.start+a*(this.end-this.start);this.callback&&this.callback(c,this.target,b);this.property&&(this.target[this.property]=c)},setValues:function(a,b,c,d,e){this.start=a;this.end=b;this.target=c;this.property=d;this.callback= e;return this}}}}); CAAT.Module({defines:"CAAT.Behavior.PathBehavior",aliases:["CAAT.PathBehavior"],depends:["CAAT.Behavior.BaseBehavior","CAAT.Foundation.SpriteImage"],constants:{AUTOROTATE:{LEFT_TO_RIGHT:0,RIGHT_TO_LEFT:1,FREE:2},autorotate:{LEFT_TO_RIGHT:0,RIGHT_TO_LEFT:1,FREE:2}},extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){CAAT.Behavior.PathBehavior.superclass.parse.call(this,a);a.SVG&&this.setValues((new CAAT.PathUtil.SVGPath).parsePath(a.SVG));if(a.autoRotate)this.autoRotate=a.autoRotate}, -path:null,autoRotate:false,prevX:-1,prevY:-1,autoRotateOp:CAAT.Behavior.PathBehavior.autorotate.FREE,isOpenContour:false,setOpenContour:function(a){this.isOpenContour=a;return this},getPropertyName:function(){return"translate"},setAutoRotate:function(a,b){this.autoRotate=a;if(b!==void 0)this.autoRotateOp=b;return this},setPath:function(a){this.path=a;return this},setValues:function(a){return this.setPath(a)},setTranslation:function(){return this},calculateKeyFrameData:function(a){a=this.interpolator.getPosition(a).y; -a=this.path.getPosition(a);return"translateX("+a.x+"px) translateY("+a.y+"px)"},getKeyFrameDataValues:function(a){var a=this.interpolator.getPosition(a).y,b=this.path.getPosition(a),c={x:b.x,y:b.y};if(this.autoRotate)a=a===0?b:this.path.getPosition(a-0.0010),b=Math.atan2(b.y-a.y,b.x-a.x),c.angle=b;return c},calculateKeyFramesData:function(a,b,c){typeof c==="undefined"&&(c=100);c>>=0;for(var d,e="@-"+a+"-keyframes "+b+" {",b=0;b<=c;b++)d=""+b/c*100+"%{-"+a+"-transform:"+this.calculateKeyFrameData(b/ -c)+"}",e+=d;e+="}";return e},setForTime:function(a,b){if(!this.path)return{x:b.x,y:b.y};var c=this.path.getPosition(a,this.isOpenContour,0.0010);if(this.autoRotate){if(-1===this.prevX&&-1===this.prevY)this.prevX=c.x,this.prevY=c.y;var d=c.x-this.prevX,e=c.y-this.prevY;if(d===0&&e===0)return b.setLocation(c.x,c.y),{x:b.x,y:b.y};var f=Math.atan2(e,d),g=CAAT.Foundation.SpriteImage,h=CAAT.Behavior.PathBehavior.AUTOROTATE;this.autoRotateOp===h.LEFT_TO_RIGHT?this.prevX<=c.x?b.setImageTransformation(g.TR_NONE): -(b.setImageTransformation(g.TR_FLIP_HORIZONTAL),f+=Math.PI):this.autoRotateOp===h.RIGHT_TO_LEFT&&(this.prevX<=c.x?b.setImageTransformation(g.TR_FLIP_HORIZONTAL):(b.setImageTransformation(g.TR_NONE),f-=Math.PI));b.setRotation(f);this.prevX=c.x;this.prevY=c.y;Math.sqrt(d*d+e*e)}return this.doValueApplication?(b.setLocation(c.x,c.y),{x:b.x,y:b.y}):{x:c.x,y:c.y}},positionOnTime:function(a){return this.isBehaviorInTime(a,null)?(a=this.normalizeTime(a),this.path.getPosition(a)):{x:-1,y:-1}}}}}); +path:null,autoRotate:false,prevX:-1,prevY:-1,autoRotateOp:CAAT.Behavior.PathBehavior.autorotate.FREE,isOpenContour:false,relativeX:0,relativeY:0,setOpenContour:function(a){this.isOpenContour=a;return this},getPropertyName:function(){return"translate"},setRelativeValues:function(a,b){this.relativeX=a;this.relativeY=b;this.isRelative=true;return this},setAutoRotate:function(a,b){this.autoRotate=a;if(b!==void 0)this.autoRotateOp=b;return this},setPath:function(a){this.path=a;return this},setValues:function(a){return this.setPath(a)}, +setTranslation:function(){return this},calculateKeyFrameData:function(a){a=this.interpolator.getPosition(a).y;a=this.path.getPosition(a);return"translateX("+a.x+"px) translateY("+a.y+"px)"},getKeyFrameDataValues:function(a){var a=this.interpolator.getPosition(a).y,b=this.path.getPosition(a),c={x:b.x,y:b.y};if(this.autoRotate)a=a===0?b:this.path.getPosition(a-0.0010),b=Math.atan2(b.y-a.y,b.x-a.x),c.angle=b;return c},calculateKeyFramesData:function(a,b,c){typeof c==="undefined"&&(c=100);c>>=0;for(var d, +e="@-"+a+"-keyframes "+b+" {",b=0;b<=c;b++)d=""+b/c*100+"%{-"+a+"-transform:"+this.calculateKeyFrameData(b/c)+"}",e+=d;e+="}";return e},setForTime:function(a,b){if(!this.path)return{x:b.x,y:b.y};var c=this.path.getPosition(a,this.isOpenContour,0.0010);this.isRelative&&(c.x+=this.relativeX,c.y+=this.relativeY);if(this.autoRotate){if(-1===this.prevX&&-1===this.prevY)this.prevX=c.x,this.prevY=c.y;var d=c.x-this.prevX,e=c.y-this.prevY;if(d===0&&e===0)return b.setLocation(c.x,c.y),{x:b.x,y:b.y};var f= +Math.atan2(e,d),g=CAAT.Foundation.SpriteImage,h=CAAT.Behavior.PathBehavior.AUTOROTATE;this.autoRotateOp===h.LEFT_TO_RIGHT?this.prevX<=c.x?b.setImageTransformation(g.TR_NONE):(b.setImageTransformation(g.TR_FLIP_HORIZONTAL),f+=Math.PI):this.autoRotateOp===h.RIGHT_TO_LEFT&&(this.prevX<=c.x?b.setImageTransformation(g.TR_FLIP_HORIZONTAL):(b.setImageTransformation(g.TR_NONE),f-=Math.PI));b.setRotation(f);this.prevX=c.x;this.prevY=c.y;Math.sqrt(d*d+e*e)}return this.doValueApplication?(b.setLocation(c.x, +c.y),{x:b.x,y:b.y}):{x:c.x,y:c.y}},positionOnTime:function(a){return this.isBehaviorInTime(a,null)?(a=this.normalizeTime(a),this.path.getPosition(a)):{x:-1,y:-1}}}}}); CAAT.Module({defines:"CAAT.Behavior.RotateBehavior",extendsClass:"CAAT.Behavior.BaseBehavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Foundation.Actor"],aliases:["CAAT.RotateBehavior"],extendsWith:function(){return{__init:function(){this.__super();this.anchor=CAAT.Foundation.Actor.ANCHOR_CENTER;return this},parse:function(a){CAAT.Behavior.RotateBehavior.superclass.parse.call(this,a);this.startAngle=a.start||0;this.endAngle=a.end||0;this.anchorX=typeof a.anchorX!=="undefined"?parseInt(a.anchorX): -0.5;this.anchorY=typeof a.anchorY!=="undefined"?parseInt(a.anchorY):0.5},startAngle:0,endAngle:0,anchorX:0.5,anchorY:0.5,getPropertyName:function(){return"rotate"},setForTime:function(a,b){var c=this.startAngle+a*(this.endAngle-this.startAngle);this.doValueApplication&&b.setRotationAnchored(c,this.anchorX,this.anchorY);return c},setValues:function(a,b,c,d){this.startAngle=a;this.endAngle=b;if(typeof c!=="undefined"&&typeof d!=="undefined")this.anchorX=c,this.anchorY=d;return this},setAngles:function(a, -b){return this.setValues(a,b)},setAnchor:function(a,b,c){this.anchorX=b/a.width;this.anchorY=c/a.height;return this},calculateKeyFrameData:function(a){a=this.interpolator.getPosition(a).y;return"rotate("+(this.startAngle+a*(this.endAngle-this.startAngle))+"rad)"},getKeyFrameDataValues:function(a){a=this.interpolator.getPosition(a).y;return{angle:this.startAngle+a*(this.endAngle-this.startAngle)}},calculateKeyFramesData:function(a,b,c){typeof c==="undefined"&&(c=100);c>>=0;for(var d,e="@-"+a+"-keyframes "+ -b+" {",b=0;b<=c;b++)d=""+b/c*100+"%{-"+a+"-transform:"+this.calculateKeyFrameData(b/c)+"; -"+a+"-transform-origin:"+this.anchorX*100+"% "+this.anchorY*100+"% }\n",e+=d;e+="}\n";return e}}}}); +0.5;this.anchorY=typeof a.anchorY!=="undefined"?parseInt(a.anchorY):0.5},startAngle:0,endAngle:0,anchorX:0.5,anchorY:0.5,rotationRelative:0,setRelativeValues:function(a){this.rotationRelative=a;this.isRelative=true;return this},getPropertyName:function(){return"rotate"},setForTime:function(a,b){var c=this.startAngle+a*(this.endAngle-this.startAngle);this.isRelative&&(c+=this.rotationRelative,c>=Math.PI&&(c-=2*Math.PI),c<-2*Math.PI&&(c+=2*Math.PI));this.doValueApplication&&b.setRotationAnchored(c, +this.anchorX,this.anchorY);return c},setValues:function(a,b,c,d){this.startAngle=a;this.endAngle=b;if(typeof c!=="undefined"&&typeof d!=="undefined")this.anchorX=c,this.anchorY=d;return this},setAngles:function(a,b){return this.setValues(a,b)},setAnchor:function(a,b,c){this.anchorX=b/a.width;this.anchorY=c/a.height;return this},calculateKeyFrameData:function(a){a=this.interpolator.getPosition(a).y;return"rotate("+(this.startAngle+a*(this.endAngle-this.startAngle))+"rad)"},getKeyFrameDataValues:function(a){a= +this.interpolator.getPosition(a).y;return{angle:this.startAngle+a*(this.endAngle-this.startAngle)}},calculateKeyFramesData:function(a,b,c){typeof c==="undefined"&&(c=100);c>>=0;for(var d,e="@-"+a+"-keyframes "+b+" {",b=0;b<=c;b++)d=""+b/c*100+"%{-"+a+"-transform:"+this.calculateKeyFrameData(b/c)+"; -"+a+"-transform-origin:"+this.anchorX*100+"% "+this.anchorY*100+"% }\n",e+=d;e+="}\n";return e}}}}); CAAT.Module({defines:"CAAT.Behavior.Scale1Behavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Foundation.Actor"],aliases:["CAAT.Scale1Behavior"],constants:{AXIS:{X:0,Y:1},Axis:{X:0,Y:1}},extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{__init:function(){this.__super();this.anchor=CAAT.Foundation.Actor.ANCHOR_CENTER;return this},startScale:1,endScale:1,anchorX:0.5,anchorY:0.5,applyOnX:true,parse:function(a){CAAT.Behavior.Scale1Behavior.superclass.parse.call(this,a);this.startScale= a.start||0;this.endScale=a.end||0;this.anchorX=typeof a.anchorX!=="undefined"?parseInt(a.anchorX):0.5;this.anchorY=typeof a.anchorY!=="undefined"?parseInt(a.anchorY):0.5;this.applyOnX=a.axis?a.axis.toLowerCase()==="x":true},applyOnAxis:function(a){this.applyOnX=a===CAAT.Behavior.Scale1Behavior.AXIS.X?false:true},getPropertyName:function(){return"scale"},setForTime:function(a,b){var c=this.startScale+a*(this.endScale-this.startScale);0===c&&(c=0.01);this.doValueApplication&&(this.applyOnX?b.setScaleAnchored(c, b.scaleY,this.anchorX,this.anchorY):b.setScaleAnchored(b.scaleX,c,this.anchorX,this.anchorY));return c},setValues:function(a,b,c,d,e){this.startScale=a;this.endScale=b;this.applyOnX=!!c;if(typeof d!=="undefined"&&typeof e!=="undefined")this.anchorX=d,this.anchorY=e;return this},setAnchor:function(a,b,c){this.anchorX=b/a.width;this.anchorY=c/a.height;return this},calculateKeyFrameData:function(a){a=this.interpolator.getPosition(a).y;a=this.startScale+a*(this.endScale-this.startScale);return this.applyOnX? @@ -198,8 +200,8 @@ e;if(b&4&&d-f>this.bounds.bottom)a.position.y=this.bounds.top-e;else if(b&4&&d+f null,f=Number.MAX_VALUE,g=0;gd?e=-1:c=0;a--)this.allCircles[a]===null&&this.allCircles.splice(a,1)},initialize:function(a){if(a)for(var b in a)this[b]=a[b];return this}}}); CAAT.Module({defines:"CAAT.Module.Preloader.Preloader",extendsWith:function(){var a=function(a,c,d){this.id=a;this.path=c;this.image=new Image;this.loader=d;this.image.onload=this.onload.bind(this);this.image.onerror=this.onerror.bind(this);return this};a.prototype={id:null,path:null,image:null,loader:null,onload:function(){this.loader.__onload(this);this.image.onload=null;this.image.onerror=null},onerror:function(){this.loader.__onerror(this)},load:function(){this.image.src=this.path},clear:function(){this.loader= -null}};return{__init:function(){this.elements=[];return this},elements:null,imageCounter:0,cfinished:null,cloaded:null,cerrored:null,loadedCount:0,addElement:function(b,c){this.elements.push(new a(b,c,this));return this},clear:function(){for(var a=0;a>0)*e;var k=i+(d/h>>0)*f,m=g+e,o=k+f;g=(new CAAT.Foundation.SpriteImageHelper(g,k,m-g,o-k,j.width,j.height)).setGL(g/j.width,k/j.height,m/j.width,o/j.height);this.mapInfo[d]=g}}else for(d=0;d0&&(f-=d);var g=(this.offsetY-this.ownerActor.y)%e;g>0&&(g-=e);for(var d=((c.width-f)/d>>0)+1,e=((c.height-g)/e>>0)+1,h,i=a.ctx, -a=0;a>0,c.y-this.ownerActor.y+g+a*b.height>>0,b.width,b.height)},paintInvertedH:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate((c|0)+b.width,d|0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedV:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save(); -a.translate(c|0,d+b.height|0);a.scale(1,-1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedHV:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.translate(b.width,0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintN:function(a,b,c,d){b=this.mapInfo[this.spriteIndex]; -a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintAtRect:function(a,b,c,d,e,f){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,e,f);return this},paintScaledWidth:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,b.height);return this},paintChunk:function(a, -b,c,d,e,f,g){a.drawImage(this.image,d,e,f,g,b,c,f,g)},paintTile:function(a,b,c,d){b=this.mapInfo[b];a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintScaled:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,this.ownerActor.height);return this},getCurrentSpriteImageCSSPosition:function(){var a=this.mapInfo[this.spriteIndex]; -return""+-(a.x+this.parentOffsetX-this.offsetX)+"px "+-(a.y+this.parentOffsetY-this.offsetY)+"px "+(this.ownerActor.transformation===CAAT.Foundation.SpriteImage.TR_TILE?"repeat":"no-repeat")},getNumImages:function(){return this.rows*this.columns},setUV:function(a,b){var c=this.image;if(c.__texturePage){var d=b,e=this.mapInfo[this.spriteIndex],f=e.u,g=e.v,h=e.u1,e=e.v1;if(this.offsetX||this.offsetY)f=c.__texturePage,g=-this.offsetY/f.height,h=(this.ownerActor.width-this.offsetX)/f.width,e=(this.ownerActor.height- -this.offsetY)/f.height,f=-this.offsetX/f.width+c.__u,g+=c.__v,h+=c.__u,e+=c.__v;c.inverted?(a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e,a[d++]=f,a[d++]=g):(a[d++]=f,a[d++]=g,a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e)}},setChangeFPS:function(a){this.changeFPS=a;return this},setSpriteTransformation:function(a){this.transformation=a;var b=CAAT.Foundation.SpriteImage;switch(a){case b.TR_FLIP_HORIZONTAL:this.paint=this.paintInvertedH;break;case b.TR_FLIP_VERTICAL:this.paint=this.paintInvertedV; -break;case b.TR_FLIP_ALL:this.paint=this.paintInvertedHV;break;case b.TR_FIXED_TO_SIZE:this.paint=this.paintScaled;break;case b.TR_FIXED_WIDTH_TO_SIZE:this.paint=this.paintScaledWidth;break;case b.TR_TILE:this.paint=this.paintTiled;break;default:this.paint=this.paintN}this.ownerActor.invalidate();return this},resetAnimationTime:function(){this.prevAnimationTime=-1;return this},setAnimationImageIndex:function(a){this.animationImageIndex=a;this.spriteIndex=a[0];this.prevAnimationTime=-1;return this}, -setSpriteIndex:function(a){this.spriteIndex=a;return this},setSpriteIndexAtTime:function(a){if(this.animationImageIndex.length>1){if(this.prevAnimationTime===-1)this.prevAnimationTime=a,this.spriteIndex=this.animationImageIndex[0],this.prevIndex=0;else{var b=a;b-=this.prevAnimationTime;b/=this.changeFPS;b%=this.animationImageIndex.length;b=Math.floor(b);b0&&(f-=d);var g=(this.offsetY-this.ownerActor.y)%e; +g>0&&(g-=e);for(var d=((c.width-f)/d>>0)+1,e=((c.height-g)/e>>0)+1,h,i=a.ctx,a=0;a>0,c.y-this.ownerActor.y+g+a*b.height>>0,b.width,b.height)},paintInvertedH:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate((c|0)+b.width,d|0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedV:function(a, +b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedHV:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.translate(b.width,0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this}, +paintN:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintAtRect:function(a,b,c,d,e,f){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,e,f);return this},paintScaledWidth:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+ +d>>0,this.ownerActor.width,b.height);return this},paintChunk:function(a,b,c,d,e,f,g){a.drawImage(this.image,d,e,f,g,b,c,f,g)},paintTile:function(a,b,c,d){b=this.mapInfo[b];a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintScaled:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,this.ownerActor.height);return this},getCurrentSpriteImageCSSPosition:function(){var a= +this.mapInfo[this.spriteIndex];return""+-(a.x+this.parentOffsetX-this.offsetX)+"px "+-(a.y+this.parentOffsetY-this.offsetY)+"px "+(this.ownerActor.transformation===CAAT.Foundation.SpriteImage.TR_TILE?"repeat":"no-repeat")},getNumImages:function(){return this.rows*this.columns},setUV:function(a,b){var c=this.image;if(c.__texturePage){var d=b,e=this.mapInfo[this.spriteIndex],f=e.u,g=e.v,h=e.u1,e=e.v1;if(this.offsetX||this.offsetY)f=c.__texturePage,g=-this.offsetY/f.height,h=(this.ownerActor.width-this.offsetX)/ +f.width,e=(this.ownerActor.height-this.offsetY)/f.height,f=-this.offsetX/f.width+c.__u,g+=c.__v,h+=c.__u,e+=c.__v;c.inverted?(a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e,a[d++]=f,a[d++]=g):(a[d++]=f,a[d++]=g,a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e)}},setChangeFPS:function(a){this.changeFPS=a;return this},setSpriteTransformation:function(a){this.transformation=a;var b=CAAT.Foundation.SpriteImage;switch(a){case b.TR_FLIP_HORIZONTAL:this.paint=this.paintInvertedH;break;case b.TR_FLIP_VERTICAL:this.paint= +this.paintInvertedV;break;case b.TR_FLIP_ALL:this.paint=this.paintInvertedHV;break;case b.TR_FIXED_TO_SIZE:this.paint=this.paintScaled;break;case b.TR_FIXED_WIDTH_TO_SIZE:this.paint=this.paintScaledWidth;break;case b.TR_TILE:this.paint=this.paintTiled;break;default:this.paint=this.paintN}this.ownerActor.invalidate();return this},resetAnimationTime:function(){this.prevAnimationTime=-1;return this},setAnimationImageIndex:function(a){this.animationImageIndex=a;this.spriteIndex=a[0];this.prevAnimationTime= +-1;return this},setSpriteIndex:function(a){this.spriteIndex=a;return this},setSpriteIndexAtTime:function(a){if(this.animationImageIndex.length>1){if(this.prevAnimationTime===-1)this.prevAnimationTime=a,this.spriteIndex=this.animationImageIndex[0],this.prevIndex=0;else{var b=a;b-=this.prevAnimationTime;b/=this.changeFPS;b%=this.animationImageIndex.length;b=Math.floor(b);b=this.childrenList.length)b=this.childrenList.length;a.parent=this;a.dirty=true;this.childrenList.splice(b, -0,a);this.invalidateLayout();return this},findActorById:function(a){if(CAAT.Foundation.ActorContainer.superclass.findActorById.call(this,a))return this;for(var b=this.childrenList,c=0,d=b.length;c=0&&a=0;b--){var c=this.childrenList[b],d=new CAAT.Math.Point(a.x,a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},destroy:function(){for(var a=this.childrenList,b=a.length-1;b>=0;b--)a[b].destroy();h.call(this);return this}, -getNumChildren:function(){return this.childrenList.length},getNumActiveChildren:function(){return this.activeChildren.length},getChildAt:function(a){return this.childrenList[a]},setZOrder:function(a,b){var c=this.findChild(a);if(-1!==c){var d=this.childrenList;if(b!==c){if(b>=d.length)d.splice(c,1),d.push(a);else{c=d.splice(c,1);if(b<0)b=0;else if(b>d.length)b=d.length;d.splice(b,0,c[0])}this.invalidateLayout()}}}}}}); +this.parent?this.parent.frameAlpha:1;for(var g=0,f=this.activeChildren.length;g=this.childrenList.length)b=this.childrenList.length;a.parent=this; +a.dirty=true;this.childrenList.splice(b,0,a);this.invalidateLayout();return this},findActorById:function(a){if(CAAT.Foundation.ActorContainer.superclass.findActorById.call(this,a))return this;for(var b=this.childrenList,c=0,d=b.length;c=0&&a=0;b--){var c=this.childrenList[b],d=new CAAT.Math.Point(a.x,a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},destroy:function(){for(var a=this.childrenList,b=a.length-1;b>=0;b--)a[b].destroy(); +h.call(this);return this},getNumChildren:function(){return this.childrenList.length},getNumActiveChildren:function(){return this.activeChildren.length},getChildAt:function(a){return this.childrenList[a]},setZOrder:function(a,b){var c=this.findChild(a);if(-1!==c){var d=this.childrenList;if(b!==c){if(b>=d.length)d.splice(c,1),d.push(a);else{c=d.splice(c,1);if(b<0)b=0;else if(b>d.length)b=d.length;d.splice(b,0,c[0])}this.invalidateLayout()}}}}}}); CAAT.Module({defines:"CAAT.Foundation.Scene",depends:"CAAT.Math.Point,CAAT.Math.Matrix,CAAT.PathUtil.Path,CAAT.Behavior.GenericBehavior,CAAT.Behavior.ContainerBehavior,CAAT.Behavior.ScaleBehavior,CAAT.Behavior.AlphaBehavior,CAAT.Behavior.RotateBehavior,CAAT.Behavior.PathBehavior,CAAT.Foundation.ActorContainer,CAAT.Foundation.Timer.TimerManager".split(","),aliases:["CAAT.Scene"],extendsClass:"CAAT.Foundation.ActorContainer",constants:{EASE_ROTATION:1,EASE_SCALE:2,EASE_TRANSLATE:3},extendsWith:function(){return{__init:function(){this.__super(); this.timerManager=new CAAT.TimerManager;this.fillStyle=null;this.isGlobalAlpha=true;return this},easeContainerBehaviour:null,easeContainerBehaviourListener:null,easeIn:false,paused:false,timerManager:null,isPaused:function(){return this.paused},setPaused:function(a){this.paused=a},createTimer:function(a,b,c,d,e){return this.timerManager.createTimer(a,b,c,d,e,this)},setTimeout:function(a,b,c,d){return this.timerManager.createTimer(this.time,a,b,c,d,this)},createAlphaBehaviour:function(a,b){var c=new CAAT.Behavior.AlphaBehavior; c.setFrameTime(0,a);c.startAlpha=b?0:1;c.endAlpha=b?1:0;this.easeContainerBehaviour.addBehavior(c)},easeTranslationIn:function(a,b,c,d){this.easeTranslation(a,b,c,true,d)},easeTranslationOut:function(a,b,c,d){this.easeTranslation(a,b,c,false,d)},easeTranslation:function(a,b,c,d,e){this.easeContainerBehaviour=new CAAT.Behavior.ContainerBehavior;this.easeIn=d;var f=new CAAT.Behavior.PathBehavior;e&&f.setInterpolator(e);f.setFrameTime(0,a);c<1?c=1:c>4&&(c=4);switch(c){case CAAT.Foundation.Actor.ANCHOR_TOP:d? @@ -456,74 +458,75 @@ behaviorExpired:function(){this.easeContainerBehaviourListener.easeEnd(this,this f[c].contains(d.x,d.y)))return f[c]}}d.set(a.x,a.y);return CAAT.Foundation.Scene.superclass.findActorAtPosition.call(this,d)},enableInputList:function(a){this.inputList=[];for(var b=0;b=this.inputList.length&&(b=this.inputList.length-1);b=this.inputList[b];typeof c==="undefined"||c>=b.length?b.push(a):c<=0?b.unshift(a):b.splice(c,0,a);return this},emptyInputList:function(a){a<0?a=0:a>=this.inputList.length&& (a=this.inputList.length-1);this.inputList[a]=[];return this},removeActorFromInputList:function(a,b){if(typeof b==="undefined"){var c,d;for(c=0;c=this.inputList.length&&(b=this.inputList.length-1);e=this.inputList[b];for(d=0;d=0;b--){var c=this.childrenList[b],d=new CAAT.Math.Point(a.x,a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},resetStats:function(){this.statistics.size_total=0;this.statistics.size_active= -0;this.statistics.draws=0;this.statistics.size_discarded_by_dirty_rects=0},render:function(a){if(!this.currentScene||!this.currentScene.isPaused()){this.time+=a;for(e=0,l=this.childrenList.length;e0&&!navigator.isCocoonJS&&CAAT.DEBUG&&CAAT.DEBUG_DIRTYRECTS){f.beginPath();this.nDirtyRects=0;b=this.cDirtyRects;for(e=0;e=this.dirtyRects.length)for(b=0;b<32;b++)this.dirtyRects.push(new CAAT.Math.Rectangle);b=this.dirtyRects[this.dirtyRectsIndex];b.x=a.x;b.y=a.y;b.x1=a.x1;b.y1=a.y1;b.width=a.width;b.height=a.height;this.cDirtyRects.push(b)}},renderToContext:function(a,b){if(b.isInAnimationFrame(this.time)){a.setTransform(1,0,0,1,0,0);a.globalAlpha=1;a.globalCompositeOperation= -"source-over";a.clearRect(0,0,this.width,this.height);var c=this.ctx;this.ctx=a;a.save();var d=this.modelViewMatrix,e=this.worldModelViewMatrix;this.modelViewMatrix=this.worldModelViewMatrix=new CAAT.Math.Matrix;this.wdirty=true;b.animate(this,b.time);if(b.onRenderStart)b.onRenderStart(b.time);b.paintActor(this,b.time);if(b.onRenderEnd)b.onRenderEnd(b.time);this.worldModelViewMatrix=e;this.modelViewMatrix=d;a.restore();this.ctx=c}},addScene:function(a){a.setBounds(0,0,this.width,this.height);this.scenes.push(a); -a.setEaseListener(this);null===this.currentScene&&this.setScene(0)},getNumScenes:function(){return this.scenes.length},easeInOut:function(a,b,c,d,e,f,g,h,i,j){if(a!==this.getCurrentSceneIndex()){a=this.scenes[a];d=this.scenes[d];if(!CAAT.__CSS__&&CAAT.CACHE_SCENE_ON_CHANGE)this.renderToContext(this.transitionScene.ctx,d),d=this.transitionScene;a.setExpired(false);d.setExpired(false);a.mouseEnabled=false;d.mouseEnabled=false;a.resetTransform();d.resetTransform();a.setLocation(0,0);d.setLocation(0, -0);a.alpha=1;d.alpha=1;b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(g,h,c,i):b===CAAT.Foundation.Scene.EASE_SCALE?a.easeScaleIn(0,g,h,c,i):a.easeTranslationIn(g,h,c,i);e===CAAT.Foundation.Scene.EASE_ROTATION?d.easeRotationOut(g,h,f,j):e===CAAT.Foundation.Scene.EASE_SCALE?d.easeScaleOut(0,g,h,f,j):d.easeTranslationOut(g,h,f,j);this.childrenList=[];d.goOut(a);a.getIn(d);this.addChild(d);this.addChild(a)}},easeInOutRandom:function(a,b,c,d){var e=Math.random(),f=Math.random(),g;e<0.33?(e= -CAAT.Foundation.Scene.EASE_ROTATION,g=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):e<0.66?(e=CAAT.Foundation.Scene.EASE_SCALE,g=(new CAAT.Behavior.Interpolator).createElasticOutInterpolator(1.1,0.4)):(e=CAAT.Foundation.Scene.EASE_TRANSLATE,g=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator());var h;f<0.33?(f=CAAT.Foundation.Scene.EASE_ROTATION,h=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):f<0.66?(f=CAAT.Foundation.Scene.EASE_SCALE, -h=(new CAAT.Behavior.Interpolator).createExponentialOutInterpolator(4)):(f=CAAT.Foundation.Scene.EASE_TRANSLATE,h=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator());this.easeInOut(a,e,Math.random()*8.99>>0,b,f,Math.random()*8.99>>0,c,d,g,h)},easeIn:function(a,b,c,d,e,f){a=this.scenes[a];b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(c,d,e,f):b===CAAT.Foundation.Scene.EASE_SCALE?a.easeScaleIn(0,c,d,e,f):a.easeTranslationIn(c,d,e,f);this.childrenList=[];this.addChild(a);a.resetTransform(); -a.setLocation(0,0);a.alpha=1;a.mouseEnabled=false;a.setExpired(false)},setScene:function(a){a=this.scenes[a];this.childrenList=[];this.addChild(a);this.currentScene=a;a.setExpired(false);a.mouseEnabled=true;a.resetTransform();a.setLocation(0,0);a.alpha=1;a.getIn();a.activated()},switchToScene:function(a,b,c,d){var e=this.getSceneIndex(this.currentScene);d?this.easeInOutRandom(a,e,b,c):this.setScene(a)},switchToPrevScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<= -1||d===0||(c?this.easeInOutRandom(d-1,d,a,b):this.setScene(d-1))},switchToNextScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<=1||d===this.getNumScenes()-1||(c?this.easeInOutRandom(d+1,d,a,b):this.setScene(d+1))},mouseEnter:function(){},mouseExit:function(){},mouseMove:function(){},mouseDown:function(){},mouseUp:function(){},mouseDrag:function(){},easeEnd:function(a,b){b?(this.currentScene=a,this.currentScene.activated()):a.setExpired(true);a.mouseEnabled=true; -a.emptyBehaviorList()},getSceneIndex:function(a){for(var b=0;b500&&(b=500);if(this.onRenderStart)this.onRenderStart(b);this.render(b);this.debugInfo&&this.debugInfo(this.statistics);this.timeline=a;if(this.onRenderEnd)this.onRenderEnd(b);this.needsRepaint=false}},resetTimeline:function(){this.timeline=(new Date).getTime()},endLoop:function(){},setClear:function(a){this.clear=a;this.dirtyRectsEnabled= -this.clear===CAAT.Foundation.Director.CLEAR_DIRTY_RECTS?true:false;return this},getAudioManager:function(){return this.audioManager},cumulateOffset:function(a,b,c){var d=c+"Left";c+="Top";for(var e=0,f=0,g;navigator.browser!=="iOS"&&a&&a.style;)if(g=a.currentStyle?a.currentStyle.position:(g=(a.ownerDocument.defaultView||a.ownerDocument.parentWindow).getComputedStyle(a,null))?g.getPropertyValue("position"):null,/^(fixed)$/.test(g))break;else e+=a[d],f+=a[c],a=a[b];return{x:e,y:f,style:g}},getOffset:function(a){var b= -this.cumulateOffset(a,"offsetParent","offset");return b.style==="fixed"?(a=this.cumulateOffset(a,a.parentNode?"parentNode":"parentElement","scroll"),{x:b.x+a.x,y:b.y+a.y}):{x:b.x,y:b.y}},getCanvasCoord:function(a,b){var c=new CAAT.Math.Point,d=0,e=0;if(!b)b=window.event;if(b.pageX||b.pageY)d=b.pageX,e=b.pageY;else if(b.clientX||b.clientY)d=b.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,e=b.clientY+document.body.scrollTop+document.documentElement.scrollTop;var f=this.getOffset(this.canvas); -d-=f.x;e-=f.y;d*=this.SCREEN_RATIO;e*=this.SCREEN_RATIO;c.x=d;c.y=e;if(!this.modelViewMatrixI)this.modelViewMatrixI=this.modelViewMatrix.getInverse();this.modelViewMatrixI.transformCoord(c);d=c.x;e=c.y;a.set(d,e);this.screenMousePoint.set(d,e)},__mouseDownHandler:function(a){if(this.dragging&&this.lastSelectedActor)this.__mouseUpHandler(a);else{this.getCanvasCoord(this.mousePoint,a);this.isMouseDown=true;var b=this.findActorAtPosition(this.mousePoint);if(null!==b){var c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x, -this.screenMousePoint.y,0));b.mouseDown((new CAAT.Event.MouseEvent).init(c.x,c.y,a,b,new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y)))}this.lastSelectedActor=b}},__mouseUpHandler:function(a){this.isMouseDown=false;this.getCanvasCoord(this.mousePoint,a);var b=null,c=this.lastSelectedActor;null!==c&&(b=c.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0)),c.actionPerformed&&c.contains(b.x,b.y)&&c.actionPerformed(a),c.mouseUp((new CAAT.Event.MouseEvent).init(b.x, -b.y,a,c,this.screenMousePoint,this.currentScene.time)));!this.dragging&&null!==c&&c.contains(b.x,b.y)&&c.mouseClick((new CAAT.Event.MouseEvent).init(b.x,b.y,a,c,this.screenMousePoint,this.currentScene.time));this.in_=this.dragging=false},__mouseMoveHandler:function(a){var b,c,d=this.currentScene?this.currentScene.time:0;if(this.isMouseDown&&null!==this.lastSelectedActor){if(b=this.lastSelectedActor,c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0)),this.dragging|| -!(Math.abs(this.prevMousePoint.x-c.x)=this.width||b.y>=this.height))this.touching=true,this.__mouseDownHandler(a)}},__touchEndHandler:function(a){if(this.touching)a.preventDefault(), -a.returnValue=false,a=a.changedTouches[0],this.getCanvasCoord(this.mousePoint,a),this.touching=false,this.__mouseUpHandler(a)},__touchMoveHandler:function(a){if(this.touching&&(a.preventDefault(),a.returnValue=false,!this.gesturing))for(var b=0;b=this.width||f.y>=this.height)){var g=this.findActorAtPosition(f);g!==null&&(f=g.viewToModel(f),this.touches[e]||(this.touches[e]={actor:g,touch:new CAAT.Event.TouchInfo(e,f.x,f.y,g)},c.push(e)))}}e={};for(b=0;b=b.width||d.y>=b.height))b.touching=true,b.__mouseDownHandler(c)}},false);window.addEventListener("mouseover",function(c){if(c.target===a&&!b.dragging){c.preventDefault();c.cancelBubble=true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width||d.y>=b.height||b.__mouseOverHandler(c)}},false);window.addEventListener("mouseout",function(c){if(c.target=== -a&&!b.dragging)c.preventDefault(),c.cancelBubble=true,c.stopPropagation&&c.stopPropagation(),b.getCanvasCoord(b.mousePoint,c),b.__mouseOutHandler(c)},false);window.addEventListener("mousemove",function(a){a.preventDefault();a.cancelBubble=true;a.stopPropagation&&a.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,a);(b.dragging||!(d.x<0||d.y<0||d.x>=b.width||d.y>=b.height))&&b.__mouseMoveHandler(a)},false);window.addEventListener("dblclick",function(c){if(c.target===a){c.preventDefault();c.cancelBubble= -true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width||d.y>=b.height||b.__mouseDBLClickHandler(c)}},false);CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MOUSE?(a.addEventListener("touchstart",this.__touchStartHandler.bind(this),false),a.addEventListener("touchmove",this.__touchMoveHandler.bind(this),false),a.addEventListener("touchend",this.__touchEndHandler.bind(this),false),a.addEventListener("gesturestart",function(c){if(c.target===a)c.preventDefault(), -c.returnValue=false,b.__gestureStart(c.scale,c.rotation)},false),a.addEventListener("gestureend",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureEnd(c.scale,c.rotation)},false),a.addEventListener("gesturechange",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureChange(c.scale,c.rotation)},false)):CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MULTITOUCH&&(a.addEventListener("touchstart",this.__touchStartHandlerMT.bind(this),false),a.addEventListener("touchmove", -this.__touchMoveHandlerMT.bind(this),false),a.addEventListener("touchend",this.__touchEndHandlerMT.bind(this),false),a.addEventListener("touchcancel",this.__touchCancelHandleMT.bind(this),false),a.addEventListener("gesturestart",this.__touchGestureStartHandleMT.bind(this),false),a.addEventListener("gestureend",this.__touchGestureEndHandleMT.bind(this),false),a.addEventListener("gesturechange",this.__touchGestureChangeHandleMT.bind(this),false))},enableEvents:function(a){CAAT.RegisterDirector(this); -this.in_=false;this.createEventHandler(a)},createEventHandler:function(a){this.in_=false;this.addHandlers(a)}}},onCreate:function(){if(typeof CAAT.__CSS__!=="undefined")CAAT.Foundation.Director.prototype.clip=true,CAAT.Foundation.Director.prototype.glEnabled=false,CAAT.Foundation.Director.prototype.getRenderType=function(){return"CSS"},CAAT.Foundation.Director.prototype.setScaleProportional=function(a,b){var c=Math.min(a/this.referenceWidth,b/this.referenceHeight);this.setScaleAnchored(c,c,0,0);this.eventHandler.style.width= -""+this.referenceWidth+"px";this.eventHandler.style.height=""+this.referenceHeight+"px"},CAAT.Foundation.Director.prototype.setBounds=function(a,b,c,d){CAAT.Foundation.Director.superclass.setBounds.call(this,a,b,c,d);for(a=0;a=0;b--){var c=this.childrenList[b],d=new CAAT.Math.Point(a.x, +a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},resetStats:function(){this.statistics.size_total=0;this.statistics.size_active=0;this.statistics.draws=0;this.statistics.size_discarded_by_dirty_rects=0},render:function(a){if(!this.currentScene||!this.currentScene.isPaused()){this.time+=a;for(e=0,l=this.childrenList.length;e0&&!navigator.isCocoonJS&&CAAT.DEBUG&&CAAT.DEBUG_DIRTYRECTS){f.beginPath();this.nDirtyRects=0;b=this.cDirtyRects;for(e=0;e=this.dirtyRects.length)for(b=0;b<32;b++)this.dirtyRects.push(new CAAT.Math.Rectangle);b=this.dirtyRects[this.dirtyRectsIndex];b.x=a.x;b.y=a.y;b.x1=a.x1;b.y1=a.y1;b.width=a.width;b.height=a.height; +this.cDirtyRects.push(b)}},renderToContext:function(a,b){if(b.isInAnimationFrame(this.time)){a.setTransform(1,0,0,1,0,0);a.globalAlpha=1;a.globalCompositeOperation="source-over";a.clearRect(0,0,this.width,this.height);var c=this.ctx;this.ctx=a;a.save();var d=this.modelViewMatrix,e=this.worldModelViewMatrix;this.modelViewMatrix=this.worldModelViewMatrix=new CAAT.Math.Matrix;this.wdirty=true;b.animate(this,b.time);if(b.onRenderStart)b.onRenderStart(b.time);b.paintActor(this,b.time);if(b.onRenderEnd)b.onRenderEnd(b.time); +this.worldModelViewMatrix=e;this.modelViewMatrix=d;a.restore();this.ctx=c}},addScene:function(a){a.setBounds(0,0,this.width,this.height);this.scenes.push(a);a.setEaseListener(this);null===this.currentScene&&this.setScene(0)},getNumScenes:function(){return this.scenes.length},easeInOut:function(a,b,c,d,e,f,g,h,i,j){if(a!==this.getCurrentSceneIndex()){a=this.scenes[a];d=this.scenes[d];if(!CAAT.__CSS__&&CAAT.CACHE_SCENE_ON_CHANGE)this.renderToContext(this.transitionScene.ctx,d),d=this.transitionScene; +a.setExpired(false);d.setExpired(false);a.mouseEnabled=false;d.mouseEnabled=false;a.resetTransform();d.resetTransform();a.setLocation(0,0);d.setLocation(0,0);a.alpha=1;d.alpha=1;b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(g,h,c,i):b===CAAT.Foundation.Scene.EASE_SCALE?a.easeScaleIn(0,g,h,c,i):a.easeTranslationIn(g,h,c,i);e===CAAT.Foundation.Scene.EASE_ROTATION?d.easeRotationOut(g,h,f,j):e===CAAT.Foundation.Scene.EASE_SCALE?d.easeScaleOut(0,g,h,f,j):d.easeTranslationOut(g,h,f,j);this.childrenList= +[];d.goOut(a);a.getIn(d);this.addChild(d);this.addChild(a)}},easeInOutRandom:function(a,b,c,d){var e=Math.random(),f=Math.random(),g;e<0.33?(e=CAAT.Foundation.Scene.EASE_ROTATION,g=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):e<0.66?(e=CAAT.Foundation.Scene.EASE_SCALE,g=(new CAAT.Behavior.Interpolator).createElasticOutInterpolator(1.1,0.4)):(e=CAAT.Foundation.Scene.EASE_TRANSLATE,g=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator());var h;f<0.33?(f=CAAT.Foundation.Scene.EASE_ROTATION, +h=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):f<0.66?(f=CAAT.Foundation.Scene.EASE_SCALE,h=(new CAAT.Behavior.Interpolator).createExponentialOutInterpolator(4)):(f=CAAT.Foundation.Scene.EASE_TRANSLATE,h=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator());this.easeInOut(a,e,Math.random()*8.99>>0,b,f,Math.random()*8.99>>0,c,d,g,h)},easeIn:function(a,b,c,d,e,f){a=this.scenes[a];b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(c,d,e,f):b===CAAT.Foundation.Scene.EASE_SCALE? +a.easeScaleIn(0,c,d,e,f):a.easeTranslationIn(c,d,e,f);this.childrenList=[];this.addChild(a);a.resetTransform();a.setLocation(0,0);a.alpha=1;a.mouseEnabled=false;a.setExpired(false)},setScene:function(a){a=this.scenes[a];this.childrenList=[];this.addChild(a);this.currentScene=a;a.setExpired(false);a.mouseEnabled=true;a.resetTransform();a.setLocation(0,0);a.alpha=1;a.getIn();a.activated()},switchToScene:function(a,b,c,d){var e=this.getSceneIndex(this.currentScene);d?this.easeInOutRandom(a,e,b,c):this.setScene(a)}, +switchToPrevScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<=1||d===0||(c?this.easeInOutRandom(d-1,d,a,b):this.setScene(d-1))},switchToNextScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<=1||d===this.getNumScenes()-1||(c?this.easeInOutRandom(d+1,d,a,b):this.setScene(d+1))},mouseEnter:function(){},mouseExit:function(){},mouseMove:function(){},mouseDown:function(){},mouseUp:function(){},mouseDrag:function(){},easeEnd:function(a, +b){b?(this.currentScene=a,this.currentScene.activated()):a.setExpired(true);a.mouseEnabled=true;a.emptyBehaviorList()},getSceneIndex:function(a){for(var b=0;b500&&(b=500);if(this.onRenderStart)this.onRenderStart(b);this.render(b);this.debugInfo&&this.debugInfo(this.statistics);this.timeline=a;if(this.onRenderEnd)this.onRenderEnd(b);this.needsRepaint=false}},resetTimeline:function(){this.timeline= +(new Date).getTime()},endLoop:function(){},setClear:function(a){this.clear=a;this.dirtyRectsEnabled=this.clear===CAAT.Foundation.Director.CLEAR_DIRTY_RECTS?true:false;return this},getAudioManager:function(){return this.audioManager},cumulateOffset:function(a,b,c){var d=c+"Left";c+="Top";for(var e=0,f=0,g;navigator.browser!=="iOS"&&a&&a.style;)if(g=a.currentStyle?a.currentStyle.position:(g=(a.ownerDocument.defaultView||a.ownerDocument.parentWindow).getComputedStyle(a,null))?g.getPropertyValue("position"): +null,/^(fixed)$/.test(g))break;else e+=a[d],f+=a[c],a=a[b];return{x:e,y:f,style:g}},getOffset:function(a){var b=this.cumulateOffset(a,"offsetParent","offset");return b.style==="fixed"?(a=this.cumulateOffset(a,a.parentNode?"parentNode":"parentElement","scroll"),{x:b.x+a.x,y:b.y+a.y}):{x:b.x,y:b.y}},getCanvasCoord:function(a,b){var c=new CAAT.Math.Point,d=0,e=0;if(!b)b=window.event;if(b.pageX||b.pageY)d=b.pageX,e=b.pageY;else if(b.clientX||b.clientY)d=b.clientX+document.body.scrollLeft+document.documentElement.scrollLeft, +e=b.clientY+document.body.scrollTop+document.documentElement.scrollTop;var f=this.getOffset(this.canvas);d-=f.x;e-=f.y;d*=this.SCREEN_RATIO;e*=this.SCREEN_RATIO;c.x=d;c.y=e;if(!this.modelViewMatrixI)this.modelViewMatrixI=this.modelViewMatrix.getInverse();this.modelViewMatrixI.transformCoord(c);d=c.x;e=c.y;a.set(d,e);this.screenMousePoint.set(d,e)},__mouseDownHandler:function(a){if(this.dragging&&this.lastSelectedActor)this.__mouseUpHandler(a);else{this.getCanvasCoord(this.mousePoint,a);this.isMouseDown= +true;var b=this.findActorAtPosition(this.mousePoint);if(null!==b){var c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0));b.mouseDown((new CAAT.Event.MouseEvent).init(c.x,c.y,a,b,new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y)))}this.lastSelectedActor=b}},__mouseUpHandler:function(a){this.isMouseDown=false;this.getCanvasCoord(this.mousePoint,a);var b=null,c=this.lastSelectedActor;null!==c&&(b=c.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x, +this.screenMousePoint.y,0)),c.actionPerformed&&c.contains(b.x,b.y)&&c.actionPerformed(a),c.mouseUp((new CAAT.Event.MouseEvent).init(b.x,b.y,a,c,this.screenMousePoint,this.currentScene.time)));!this.dragging&&null!==c&&c.contains(b.x,b.y)&&c.mouseClick((new CAAT.Event.MouseEvent).init(b.x,b.y,a,c,this.screenMousePoint,this.currentScene.time));this.in_=this.dragging=false},__mouseMoveHandler:function(a){var b,c,d=this.currentScene?this.currentScene.time:0;if(this.isMouseDown&&null!==this.lastSelectedActor){if(b= +this.lastSelectedActor,c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0)),this.dragging||!(Math.abs(this.prevMousePoint.x-c.x)=this.width||b.y>=this.height))this.touching=true,this.__mouseDownHandler(a)}},__touchEndHandler:function(a){if(this.touching)a.preventDefault(),a.returnValue=false,a=a.changedTouches[0],this.getCanvasCoord(this.mousePoint,a),this.touching=false,this.__mouseUpHandler(a)},__touchMoveHandler:function(a){if(this.touching&&(a.preventDefault(),a.returnValue=false,!this.gesturing))for(var b=0;b=this.width||f.y>=this.height)){var g=this.findActorAtPosition(f);g!==null&&(f=g.viewToModel(f),this.touches[e]||(this.touches[e]={actor:g,touch:new CAAT.Event.TouchInfo(e,f.x,f.y,g)},c.push(e)))}}e={};for(b=0;b=b.width||d.y>=b.height))b.touching=true,b.__mouseDownHandler(c)}},false);window.addEventListener("mouseover",function(c){if(c.target===a&&!b.dragging){c.preventDefault();c.cancelBubble=true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint; +b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width||d.y>=b.height||b.__mouseOverHandler(c)}},false);window.addEventListener("mouseout",function(c){if(c.target===a&&!b.dragging)c.preventDefault(),c.cancelBubble=true,c.stopPropagation&&c.stopPropagation(),b.getCanvasCoord(b.mousePoint,c),b.__mouseOutHandler(c)},false);window.addEventListener("mousemove",function(a){a.preventDefault();a.cancelBubble=true;a.stopPropagation&&a.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,a);(b.dragging||!(d.x< +0||d.y<0||d.x>=b.width||d.y>=b.height))&&b.__mouseMoveHandler(a)},false);window.addEventListener("dblclick",function(c){if(c.target===a){c.preventDefault();c.cancelBubble=true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width||d.y>=b.height||b.__mouseDBLClickHandler(c)}},false);CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MOUSE?(a.addEventListener("touchstart",this.__touchStartHandler.bind(this),false),a.addEventListener("touchmove",this.__touchMoveHandler.bind(this), +false),a.addEventListener("touchend",this.__touchEndHandler.bind(this),false),a.addEventListener("gesturestart",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureStart(c.scale,c.rotation)},false),a.addEventListener("gestureend",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureEnd(c.scale,c.rotation)},false),a.addEventListener("gesturechange",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureChange(c.scale,c.rotation)}, +false)):CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MULTITOUCH&&(a.addEventListener("touchstart",this.__touchStartHandlerMT.bind(this),false),a.addEventListener("touchmove",this.__touchMoveHandlerMT.bind(this),false),a.addEventListener("touchend",this.__touchEndHandlerMT.bind(this),false),a.addEventListener("touchcancel",this.__touchCancelHandleMT.bind(this),false),a.addEventListener("gesturestart",this.__touchGestureStartHandleMT.bind(this),false),a.addEventListener("gestureend",this.__touchGestureEndHandleMT.bind(this), +false),a.addEventListener("gesturechange",this.__touchGestureChangeHandleMT.bind(this),false))},enableEvents:function(a){CAAT.RegisterDirector(this);this.in_=false;this.createEventHandler(a)},createEventHandler:function(a){this.in_=false;this.addHandlers(a)}}},onCreate:function(){if(typeof CAAT.__CSS__!=="undefined")CAAT.Foundation.Director.prototype.clip=true,CAAT.Foundation.Director.prototype.glEnabled=false,CAAT.Foundation.Director.prototype.getRenderType=function(){return"CSS"},CAAT.Foundation.Director.prototype.setScaleProportional= +function(a,b){var c=Math.min(a/this.referenceWidth,b/this.referenceHeight);this.setScaleAnchored(c,c,0,0);this.eventHandler.style.width=""+this.referenceWidth+"px";this.eventHandler.style.height=""+this.referenceHeight+"px"},CAAT.Foundation.Director.prototype.setBounds=function(a,b,c,d){CAAT.Foundation.Director.superclass.setBounds.call(this,a,b,c,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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/L_front_thigh.png b/documentation/demos/demo34/dragon/L_front_thigh.png new file mode 100755 index 0000000000000000000000000000000000000000..5b691a879e8bd1805e6422b7aa09173f6999eec8 GIT binary patch literal 6458 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/L_rear_leg.png b/documentation/demos/demo34/dragon/L_rear_leg.png new file mode 100755 index 0000000000000000000000000000000000000000..fc00ab6ea2d21bd2457754fb353e97321aef82a5 GIT binary patch literal 14818 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 Sy!zK4R2vI>^ZHZ1N&f?Nd}iMO literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/L_wing02.png b/documentation/demos/demo34/dragon/L_wing02.png new file mode 100755 index 0000000000000000000000000000000000000000..831d7ca9af92c37cbc489fa934b161a3e93b46c3 GIT binary patch literal 5799 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 VIppGD?{e@*3u$O!P>XPj`5&KO<_rJ; literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/L_wing04.png b/documentation/demos/demo34/dragon/L_wing04.png new file mode 100755 index 0000000000000000000000000000000000000000..5cba4670be6ccfc9722f97de32162d4078baed80 GIT binary patch literal 4521 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ⅅT7dh;GGtC*Gx@AwapF~SsKGqHmRBPZXn--j_l>- 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 wE*u!0EqWIqW&L4`eu4nx-K{V2gA8B!~g&Q literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/L_wing06.png b/documentation/demos/demo34/dragon/L_wing06.png new file mode 100755 index 0000000000000000000000000000000000000000..788c70b3f95736d05d6c14ac400cd5f2500ec66f GIT binary patch literal 6855 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 Dw1_dJ literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/L_wing07.png b/documentation/demos/demo34/dragon/L_wing07.png new file mode 100755 index 0000000000000000000000000000000000000000..c055793f72a9497d90dcb266f0125369ad42001f GIT binary patch literal 5380 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 NU~YN|)qwQ8{@+g1p*{cr literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/L_wing09.png b/documentation/demos/demo34/dragon/L_wing09.png new file mode 100755 index 0000000000000000000000000000000000000000..97e915803d71537122a56aaa737e2082c3c69914 GIT binary patch literal 5291 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 MVsfGt!Uq2T2e^S}xc~qF literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/R_front_thigh.png b/documentation/demos/demo34/dragon/R_front_thigh.png new file mode 100755 index 0000000000000000000000000000000000000000..fbf13cfe010dcf6027ad6a51aa677869cd89036a GIT binary patch literal 13171 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
|3@SU^mzzieJzqzWgu4cZ|wjfnNK zdB0jBwSh71NFcF#BV!i=EfQHheykMhIrR>mSGaL|kZs#zO*^TnyhMZ|433@me%5z) zMzFjX@hF51HH<8jjG$5nHC6+X9l@)Tg_QD5e(U4&E4bFY1UF`Ot}M7uhRM^pum#4B z_DPZs{~1~pZg_zzKzIf6)sa>(dO;r zA^8rwc7!PbQ2iC?boaAw_ZqWb7IEg(HfwDby;jY|lbeuJ1$tGMoFq>|Snc~^$+pfVN9aJbFUanAss=%ANG=kC$QrVUeKS%3%|gk9(p1HN^dP z_FAhbTwL4U-3nnk4fF z(aZ_x;1k7H^6Efy%4Hr0mjW#>jPxnWCwNAr;+(M;Y*hwX$`tgr8H&0D#ZQ6f$S9Fp z@Wh+8nxpo#Ur~oHw2wKpk6qQMSgpsfw7M*iE|@e4NWf*NW+ktFVVZ_m3S7#1{9$Ib z^jJ6oqKS>d$KNM`gJqr!y^k{|o3jfa1>X^xfPP(&)84k-cM|T5<8|tS1L$VlOZR~- zlKyV$?)IwVc*-hVqa+Hbx>;<_8jiDTq727LK;BWvG>-H?d=thvau2_Sl@vqUBMsHs zv=0{4^;lMW1a!M8FWE@8c{^AbS}mWx)LQVxBBQJRnm6-eM;igffmZa+sBsg{JeX40 zC$A!CQc>qhA~O=dkBgGBFr2L2HD+;@D?@A0cnyaq?NMUvCl@%LVz3&l|M_L}Wwaux z3pal4`;UpN_rKfxjZ;*C@8ReDV!f>tqZjY{#=XukMOO>qEgEOtm(^BK^RthReLG&= z82!p26{j+4`_+35v6Tu0{F6^*jiB;V3ZzF8OjPY`+7nBGRQU1En31Q-M9;e9bNdR_ zxA@vE`P|Q^!QrJ>OS5ON{<_<;ckoI>`2D~MTKu%}eYkg7U)e2O5d8ZWV;{+|6Az6P z9DeW;ckhx4YLv4(BCquyRT*3r#v8ZrbU~Y&CseR`6$0t<85|rc&WpnUYfu9za@HC_ zyjA1&a7@GN&BVEHbyt_x#;o3Te@**RlZjQL5r0c(dh*;f=*DHIpvtd2!HiY2+Kv0M zTmRP!65wURMXme!K6%b(ihL`8zuBQKFG`x`VJGp*q3t_scX4=wIRA4~QXVX#&uf%7 zZlNm!&{ebs__Z}fZ<*#=qSy#rG+pzkInTpUAGSrtgfOo4 z^{t$by^J+8L=6{FVND+l49HQ=HQ}QIo-UG#-)inI>}}w-P3(PovbkDxkbf6X?G($+ zOz%1^O77+e}v1O3|_kf-MQ{J@3Qk3>6KF9s;dtYVpyR`0mlo$kleBE5WNb= zi`v&;qU?kxE5r{uJ?CH-Rj=kPkKmEG%PbysB64+qnaT@)Rt*`+OOEc=Uv9Vk$hOx8zx$%A*W-g2c_J`)@+W0% zDJKf$51#hvp#h5`A=Z;>;Q}SM#v1-b)g|`mPDdxZP2mwPG#24+&zTRx?2|=YK$Mav zT+Rip$Mc+5UDG@0JRJSPWnT>1v8qa2`i3C|e2A%sj^WN{4{?OH^V(W$W4u7GzujSq z3F%Q|CUtA2Fz5cQfrz6019{C?;58_+^YTV4rPj-+HM}PF1&{l<3fE_F@*N^7VOG4? zFzo*18|u;xf5nz8ym9TR&TdYGmD})osjUa9ovtqU`XZd`ywk$^a=tpo82JN8 z_q^)Jasz&SI>OU*zq&KB*)od#ooG#MRWCDtO;Ydvl%cjekGkaVA!m7A8+{#QeUW2& zvrlq0Ssowq8BC)+#X86n?kiyt;P{2dZX4b%KLvwgmi^^rk*-$}SLZY??FN3f;Pdi6 zsFN=P@K%%G1%9zz&q8hP#bx#c32tNRrUTEwdwY`Mr}O#P*czZzJ}O@;+@=q+JZVP0 zdRI)d?ju+WPWoo=o@P7EHaIAh$RG1a(WpmxaOi=ioW$b^^m1N|lDmm+N$??kIP_%W z(7W{G+qRV|8F&x>Jb8oK+p?;@dc3{*ikoPAboKjIlxay83;0J=QkKhQ8|%nA^m{=1A2ZIYybcN literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/R_rear_leg.png b/documentation/demos/demo34/dragon/R_rear_leg.png new file mode 100755 index 0000000000000000000000000000000000000000..c2cc5e72f49eedf4cf7786136f58efde4504e69e GIT binary patch literal 9722 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/R_wing01.png b/documentation/demos/demo34/dragon/R_wing01.png new file mode 100755 index 0000000000000000000000000000000000000000..873bf075f6aea465309ac80764d7ffc60703a82c GIT binary patch literal 51348 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 z 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 FV1k8fHeUb$ literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/R_wing02.png b/documentation/demos/demo34/dragon/R_wing02.png new file mode 100755 index 0000000000000000000000000000000000000000..60dd18943afaac5b9d8bd6eed1adc6758c84006f GIT binary patch literal 46201 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/R_wing03.png b/documentation/demos/demo34/dragon/R_wing03.png new file mode 100755 index 0000000000000000000000000000000000000000..1cf2e1c7930396e5ed7886678e613cf3dab96ded GIT binary patch literal 46075 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 X?zAw?RM!2600000NkvXXu0mjf{=-e^ literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/R_wing05.png b/documentation/demos/demo34/dragon/R_wing05.png new file mode 100755 index 0000000000000000000000000000000000000000..73fdb42e6e77ea53c062cc3b328d952460bcbaa9 GIT binary patch literal 27892 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/R_wing07.png b/documentation/demos/demo34/dragon/R_wing07.png new file mode 100755 index 0000000000000000000000000000000000000000..3d7af824b88d00973f7f81074a1cf7da5ef17a2c GIT binary patch literal 25147 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

@7w_*_oI_Gmk;ISAps2H=>C*}M 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

gfo3p{4wijFzwR_2A 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/chest.png b/documentation/demos/demo34/dragon/chest.png new file mode 100755 index 0000000000000000000000000000000000000000..6e3ba44ece4c041ba7108dbc5886c2e4584713f7 GIT binary patch literal 20897 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/chin.png b/documentation/demos/demo34/dragon/chin.png new file mode 100755 index 0000000000000000000000000000000000000000..68c76488a585487e6aad92884b7faa71199d2dd8 GIT binary patch literal 40756 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/dragon-flying.json b/documentation/demos/demo34/dragon/dragon-flying.json new file mode 100644 index 00000000..68aff275 --- /dev/null +++ b/documentation/demos/demo34/dragon/dragon-flying.json @@ -0,0 +1,1833 @@ +{ + "bones": { + "back": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": 17.39 + }, + { + "time": 0.5, + "angle": 0 + }, + { + "time": 0.8333, + "angle": 7 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "neck": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": -8.18 + }, + { + "time": 0.3333, + "angle": -23.16 + }, + { + "time": 0.5, + "angle": -18.01 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "chest": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "angle": 0, + "curve": "stepped" + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "tail1": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": -2.42 + }, + { + "time": 0.3333, + "angle": -26.2 + }, + { + "time": 0.5, + "angle": -29.65 + }, + { + "time": 0.6666, + "angle": -23.15 + }, + { + "time": 0.8333, + "angle": -55.46 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "R_rear_thigh": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "angle": 0, + "curve": "stepped" + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "tail2": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": -1.12 + }, + { + "time": 0.3333, + "angle": 10.48 + }, + { + "time": 0.5, + "angle": 7.89 + }, + { + "time": 0.8333, + "angle": -10.38 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "tail3": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": 8.24 + }, + { + "time": 0.3333, + "angle": 15.21 + }, + { + "time": 0.5, + "angle": 14.84 + }, + { + "time": 0.8333, + "angle": -18.9 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "tail4": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": 17.46 + }, + { + "time": 0.3333, + "angle": 22.15 + }, + { + "time": 0.5, + "angle": 22.76 + }, + { + "time": 0.8333, + "angle": -4.37 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "tail5": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": 7.4 + }, + { + "time": 0.3333, + "angle": 28.5 + }, + { + "time": 0.5, + "angle": 21.33 + }, + { + "time": 0.8333, + "angle": -1.27 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "tail6": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": 45.99 + }, + { + "time": 0.4, + "angle": 43.53 + }, + { + "time": 0.5, + "angle": 61.79 + }, + { + "time": 0.8333, + "angle": 13.28 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "R_rear_leg": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": -14.21 + }, + { + "time": 0.5, + "angle": 47.17 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "R_rear_toe3": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.5, + "angle": -36.06 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "R_rear_toe2": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.5, + "angle": -20.32 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "R_rear_toe1": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.5, + "angle": -18.71 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "head": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [0.408, 1.36, 0.675, 1.43] + }, + { + "time": 0.5, + "angle": 1.03 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "chin": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [0.416, 1.15, 0.494, 1.27] + }, + { + "time": 0.3333, + "angle": -5.15 + }, + { + "time": 0.5, + "angle": 9.79 + }, + { + "time": 0.6666, + "angle": 18.94 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "L_front_thigh": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": -19.18 + }, + { + "time": 0.3333, + "angle": -32.02 + }, + { + "time": 0.5, + "angle": -19.62 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "R_front_thigh": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": -12.96 + }, + { + "time": 0.5, + "angle": 16.2 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "L_front_leg": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": 37.77 + }, + { + "time": 0.5, + "angle": 0, + "curve": "stepped" + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "L_front_toe1": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": -16.08 + }, + { + "time": 0.5, + "angle": 0, + "curve": "stepped" + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "L_front_toe2": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "angle": 0, + "curve": "stepped" + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1 + }, + { + "time": 0.5, + "x": 1.33, + "y": 1.029 + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "L_front_toe4": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.5, + "angle": 26.51 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1 + }, + { + "time": 0.5, + "x": 1.239, + "y": 0.993 + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "L_front_toe3": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.5, + "angle": 16.99 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1 + }, + { + "time": 0.5, + "x": 1.402, + "y": 1.007 + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "R_front_leg": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": 26.07 + }, + { + "time": 0.5, + "angle": -21.6 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 1, + "y": 1, + "curve": "stepped" + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "R_front_toe1": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": 29.23 + }, + { + "time": 0.5, + "angle": 34.83 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1 + }, + { + "time": 0.5, + "x": 1.412, + "y": 1 + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "R_front_toe2": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": 24.89 + }, + { + "time": 0.5, + "angle": 23.16 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1 + }, + { + "time": 0.5, + "x": 1.407, + "y": 1.057 + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "R_front_toe3": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.1666, + "angle": 11.01 + }, + { + "time": 0.5, + "angle": 0, + "curve": "stepped" + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 0.5, + "x": 0, + "y": 0, + "curve": "stepped" + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1 + }, + { + "time": 0.5, + "x": 1.329, + "y": 1.181 + }, + { + "time": 1, + "x": 1, + "y": 1 + } + ] + }, + "L_rear_leg": { + "rotate": [ + { + "time": 0, + "angle": 0 + }, + { + "time": 0.3666, + "angle": 25.19 + }, + { + "time": 0.6666, + "angle": -15.65 + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0 + } + ], + "scale": [ + { + "time": 0, + "x": 1, + "y": 1 + } + ] + }, + "COG": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [0.456, 0.2, 0.422, 1.06] + }, + { + "time": 0.3333, + "angle": 23.93 + }, + { + "time": 0.6666, + "angle": 337.8, + "curve": [0.41, 0, 0.887, 0.75] + }, + { + "time": 1, + "angle": 0 + } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [0.33, 1, 0.816, 1.33] + }, + { + "time": 0.5, + "x": 0, + "y": 113.01, + "curve": [0.396, 0, 0.709, 2.03] + }, + { + "time": 1, + "x": 0, + "y": 0 + } + ] + } +}, + "slots": { + "R_wing": { + "attachment": [ + { + "time": 0, + "name": "R_wing01" + }, + { + "time": 0.0666, + "name": "R_wing02" + }, + { + "time": 0.1333, + "name": "R_wing03" + }, + { + "time": 0.2, + "name": "R_wing04" + }, + { + "time": 0.2666, + "name": "R_wing05" + }, + { + "time": 0.3333, + "name": "R_wing06" + }, + { + "time": 0.4, + "name": "R_wing07" + }, + { + "time": 0.4666, + "name": "R_wing08" + }, + { + "time": 0.5333, + "name": "R_wing09" + }, + { + "time": 0.6, + "name": "R_wing01" + }, + { + "time": 0.7333, + "name": "R_wing02" + }, + { + "time": 0.7666, + "name": "R_wing02" + }, + { + "time": 0.8, + "name": "R_wing03" + }, + { + "time": 0.8333, + "name": "R_wing04" + }, + { + "time": 0.8666, + "name": "R_wing05" + }, + { + "time": 0.9, + "name": "R_wing06" + }, + { + "time": 0.9333, + "name": "R_wing07" + }, + { + "time": 0.9666, + "name": "R_wing08" + }, + { + "time": 1, + "name": "R_wing09" + } + ] + }, + "L_wing": { + "attachment": [ + { + "time": 0, + "name": "L_wing01" + }, + { + "time": 0.0666, + "name": "L_wing02" + }, + { + "time": 0.1333, + "name": "L_wing03" + }, + { + "time": 0.2, + "name": "L_wing04" + }, + { + "time": 0.2666, + "name": "L_wing05" + }, + { + "time": 0.3333, + "name": "L_wing06" + }, + { + "time": 0.4, + "name": "L_wing07" + }, + { + "time": 0.4666, + "name": "L_wing08" + }, + { + "time": 0.5333, + "name": "L_wing09" + }, + { + "time": 0.6, + "name": "L_wing01" + }, + { + "time": 0.7333, + "name": "L_wing02" + }, + { + "time": 0.8, + "name": "L_wing03" + }, + { + "time": 0.8333, + "name": "L_wing04" + }, + { + "time": 0.8666, + "name": "L_wing05" + }, + { + "time": 0.9, + "name": "L_wing06" + }, + { + "time": 0.9333, + "name": "L_wing07" + }, + { + "time": 0.9666, + "name": "L_wing08" + }, + { + "time": 1, + "name": "L_wing09" + } + ] + } +}} \ No newline at end of file diff --git a/documentation/demos/demo34/dragon/dragon-skeleton.json b/documentation/demos/demo34/dragon/dragon-skeleton.json new file mode 100644 index 00000000..0d3adfbc --- /dev/null +++ b/documentation/demos/demo34/dragon/dragon-skeleton.json @@ -0,0 +1,813 @@ +{"bones": [ + { + "name": "root", + "y": -176.12 + }, + { + "name": "COG", + "parent": "root", + "y": 176.12 + }, + { + "name": "neck", + "parent": "COG", + "length": 41.36, + "x": 64.75, + "y": 11.98, + "rotation": 39.05 + }, + { + "name": "back", + "parent": "COG", + "length": 115.37, + "x": 16.03, + "y": 27.94, + "rotation": 151.83 + }, + { + "name": "chest", + "parent": "COG", + "length": 31.24, + "x": 52.52, + "y": 15.34, + "rotation": 161.7 + }, + { + "name": "head", + "parent": "neck", + "length": 188.83, + "x": 69.96, + "y": 2.49, + "rotation": 8.06 + }, + { + "name": "chin", + "parent": "neck", + "length": 153.15, + "x": 64.62, + "y": -6.99, + "rotation": -69.07 + }, + { + "name": "R_wing", + "parent": "head", + "length": 359.5, + "x": -74.68, + "y": 20.9, + "rotation": 83.21 + }, + { + "name": "tail1", + "parent": "back", + "length": 65.65, + "x": 115.37, + "y": -0.19, + "rotation": 44.31 + }, + { + "name": "R_rear_thigh", + "parent": "back", + "length": 123.46, + "x": 65.31, + "y": 59.89, + "rotation": 104.87 + }, + { + "name": "tail2", + "parent": "tail1", + "length": 54.5, + "x": 65.65, + "y": 0.22, + "rotation": 12 + }, + { + "name": "tail3", + "parent": "tail2", + "length": 41.78, + "x": 54.5, + "y": 0.37, + "rotation": 1.8 + }, + { + "name": "tail4", + "parent": "tail3", + "length": 34.19, + "x": 41.78, + "y": 0.16, + "rotation": -1.8 + }, + { + "name": "tail5", + "parent": "tail4", + "length": 32.32, + "x": 34.19, + "y": -0.19, + "rotation": -3.15 + }, + { + "name": "tail6", + "parent": "tail5", + "length": 80.08, + "x": 32.32, + "y": -0.23, + "rotation": -29.55 + }, + { + "name": "L_rear_thigh", + "parent": "R_rear_thigh", + "length": 88.05, + "x": -8.59, + "y": 30.18, + "rotation": 28.35 + }, + { + "name": "R_rear_leg", + "parent": "R_rear_thigh", + "length": 91.06, + "x": 123.46, + "y": -0.26, + "rotation": -129.04 + }, + { + "name": "L_rear_leg", + "parent": "L_rear_thigh", + "length": 103.74, + "x": 96.04, + "y": -0.97, + "rotation": -122.41 + }, + { + "name": "R_rear_toe3", + "parent": "R_rear_leg", + "length": 103.45, + "x": 91.06, + "y": -0.35, + "rotation": 112.26 + }, + { + "name": "R_rear_toe2", + "parent": "R_rear_leg", + "length": 99.29, + "x": 89.6, + "y": 1.52, + "rotation": 125.32 + }, + { + "name": "R_rear_toe1", + "parent": "R_rear_leg", + "length": 94.99, + "x": 90.06, + "y": 2.12, + "rotation": 141.98 + }, + { + "name": "L_wing", + "parent": "chest", + "length": 301.12, + "x": -7.24, + "y": -24.65, + "rotation": -75.51 + }, + { + "name": "L_front_thigh", + "parent": "chest", + "length": 67.42, + "x": -45.58, + "y": 7.92, + "rotation": 138.94 + }, + { + "name": "R_front_thigh", + "parent": "chest", + "length": 81.63, + "x": -10.89, + "y": 28.25, + "rotation": 67.96 + }, + { + "name": "L_front_leg", + "parent": "L_front_thigh", + "length": 51.57, + "x": 67.42, + "y": 0.02, + "rotation": 43.36 + }, + { + "name": "L_front_toe1", + "parent": "L_front_leg", + "length": 51.44, + "x": 45.53, + "y": 2.43, + "rotation": -98 + }, + { + "name": "L_front_toe2", + "parent": "L_front_leg", + "length": 61.97, + "x": 51.57, + "y": -0.12, + "rotation": -55.26 + }, + { + "name": "L_front_toe4", + "parent": "L_front_leg", + "length": 53.47, + "x": 50.6, + "y": 7.08, + "scaleX": 1.134, + "rotation": 19.42 + }, + { + "name": "L_front_toe3", + "parent": "L_front_leg", + "length": 45.65, + "x": 54.19, + "y": 0.6, + "scaleX": 1.134, + "rotation": -11.13 + }, + { + "name": "R_front_leg", + "parent": "R_front_thigh", + "length": 66.52, + "x": 83.04, + "y": -0.3, + "rotation": 92.7 + }, + { + "name": "R_front_toe1", + "parent": "R_front_leg", + "length": 46.65, + "x": 70.03, + "y": 5.31, + "rotation": 8.59 + }, + { + "name": "R_front_toe2", + "parent": "R_front_leg", + "length": 53.66, + "x": 66.52, + "y": 0.33, + "rotation": -35.02 + }, + { + "name": "R_front_toe3", + "parent": "R_front_leg", + "length": 58.38, + "x": 62.1, + "y": -0.79, + "rotation": -74.67 + } +], + "slots": [ + { + "name": "L_rear_leg", + "bone": "L_rear_leg", + "attachment": "L_rear_leg" + }, + { + "name": "L_rear_thigh", + "bone": "L_rear_thigh", + "attachment": "L_rear_thigh" + }, + { + "name": "L_wing", + "bone": "L_wing", + "attachment": "L_wing01" + }, + { + "name": "tail6", + "bone": "tail6", + "attachment": "tail06" + }, + { + "name": "tail5", + "bone": "tail5", + "attachment": "tail05" + }, + { + "name": "tail4", + "bone": "tail4", + "attachment": "tail04" + }, + { + "name": "tail3", + "bone": "tail3", + "attachment": "tail03" + }, + { + "name": "tail2", + "bone": "tail2", + "attachment": "tail02" + }, + { + "name": "tail1", + "bone": "tail1", + "attachment": "tail01" + }, + { + "name": "back", + "bone": "back", + "attachment": "back" + }, + { + "name": "L_front_thigh", + "bone": "L_front_thigh", + "attachment": "L_front_thigh" + }, + { + "name": "L_front_leg", + "bone": "L_front_leg", + "attachment": "L_front_leg" + }, + { + "name": "L_front_toe1", + "bone": "L_front_toe1", + "attachment": "front_toeA" + }, + { + "name": "L_front_toe4", + "bone": "L_front_toe4", + "attachment": "front_toeB" + }, + { + "name": "L_front_toe3", + "bone": "L_front_toe3", + "attachment": "front_toeB" + }, + { + "name": "L_front_toe2", + "bone": "L_front_toe2", + "attachment": "front_toeB" + }, + { + "name": "chest", + "bone": "chest", + "attachment": "chest" + }, + { + "name": "R_rear_toe1", + "bone": "R_rear_toe1", + "attachment": "rear-toe" + }, + { + "name": "R_rear_toe2", + "bone": "R_rear_toe2", + "attachment": "rear-toe" + }, + { + "name": "R_rear_toe3", + "bone": "R_rear_toe3", + "attachment": "rear-toe" + }, + { + "name": "R_rear_leg", + "bone": "R_rear_leg", + "attachment": "R_rear_leg" + }, + { + "name": "R_rear_thigh", + "bone": "R_rear_thigh", + "attachment": "R_rear_thigh" + }, + { + "name": "R_front_toe1", + "bone": "R_front_toe1", + "attachment": "front_toeB" + }, + { + "name": "R_front_thigh", + "bone": "R_front_thigh", + "attachment": "R_front_thigh" + }, + { + "name": "R_front_leg", + "bone": "R_front_leg", + "attachment": "R_front_leg" + }, + { + "name": "R_front_toe2", + "bone": "R_front_toe2", + "attachment": "front_toeB" + }, + { + "name": "R_front_toe3", + "bone": "R_front_toe3", + "attachment": "front_toeB" + }, + { + "name": "chin", + "bone": "chin", + "attachment": "chin" + }, + { + "name": "R_wing", + "bone": "R_wing", + "attachment": "R_wing01" + }, + { + "name": "head", + "bone": "head", + "attachment": "head" + }, + { + "name": "logo", + "bone": "root", + "attachment": "logo" + } +], "skins": { + "default": { + "L_rear_leg": { + "L_rear_leg": { + "x": 67.29, + "y": 12.62, + "rotation": -162.65, + "width": 206, + "height": 177 + } + }, + "L_rear_thigh": { + "L_rear_thigh": { + "x": 56.03, + "y": 27.38, + "rotation": 74.93, + "width": 91, + "height": 149 + } + }, + "L_wing": { + "L_wing01": { + "x": 129.21, + "y": -45.49, + "rotation": -83.7, + "width": 191, + "height": 256 + }, + "L_wing02": { + "x": 126.37, + "y": -31.69, + "rotation": -86.18, + "width": 179, + "height": 269 + }, + "L_wing03": { + "x": 110.26, + "y": -90.89, + "rotation": -86.18, + "width": 186, + "height": 207 + }, + "L_wing04": { + "x": -61.61, + "y": -83.26, + "rotation": -86.18, + "width": 188, + "height": 135 + }, + "L_wing05": { + "x": -90.01, + "y": -78.14, + "rotation": -86.18, + "width": 218, + "height": 213 + }, + "L_wing06": { + "x": -143.76, + "y": -83.71, + "rotation": -86.18, + "width": 192, + "height": 331 + }, + "L_wing07": { + "x": -133.04, + "y": -33.89, + "rotation": -86.18, + "width": 159, + "height": 255 + }, + "L_wing08": { + "x": 50.15, + "y": -15.71, + "rotation": -86.18, + "width": 164, + "height": 181 + }, + "L_wing09": { + "x": 85.94, + "y": -11.32, + "rotation": -86.18, + "width": 204, + "height": 167 + } + }, + "tail6": { + "tail06": { + "x": 28.02, + "y": -16.83, + "rotation": -175.44, + "width": 95, + "height": 68 + } + }, + "tail5": { + "tail05": { + "x": 15.05, + "y": -3.57, + "rotation": 155, + "width": 52, + "height": 59 + } + }, + "tail4": { + "tail04": { + "x": 15.34, + "y": -2.17, + "rotation": 151.84, + "width": 56, + "height": 71 + } + }, + "tail3": { + "tail03": { + "x": 16.94, + "y": -2, + "rotation": 150.04, + "width": 73, + "height": 92 + } + }, + "tail2": { + "tail02": { + "x": 18.11, + "y": -1.75, + "rotation": 151.84, + "width": 95, + "height": 120 + } + }, + "tail1": { + "tail01": { + "x": 22.59, + "y": -4.5, + "rotation": 163.85, + "width": 120, + "height": 153 + } + }, + "back": { + "back": { + "x": 35.84, + "y": 19.99, + "rotation": -151.83, + "width": 190, + "height": 185 + } + }, + "L_front_thigh": { + "L_front_thigh": { + "x": 27.66, + "y": -11.58, + "rotation": 58.66, + "width": 84, + "height": 72 + } + }, + "L_front_leg": { + "L_front_leg": { + "x": 14.68, + "y": 0.48, + "rotation": 15.99, + "width": 84, + "height": 57 + } + }, + "L_front_toe1": { + "front_toeA": { + "x": 31.92, + "y": 0.61, + "rotation": 109.55, + "width": 29, + "height": 50 + } + }, + "L_front_toe4": { + "front_toeB": { + "x": 23.21, + "y": -11.68, + "scaleX": 0.881, + "rotation": 79.89, + "width": 56, + "height": 57 + } + }, + "L_front_toe3": { + "front_toeB": { + "x": 18.21, + "y": -7.21, + "scaleX": 0.881, + "scaleY": 0.94, + "rotation": 99.71, + "width": 56, + "height": 57 + } + }, + "L_front_toe2": { + "front_toeB": { + "x": 26.83, + "y": -4.94, + "rotation": 109.51, + "width": 56, + "height": 57 + } + }, + "chest": { + "chest": { + "x": -14.6, + "y": 24.78, + "rotation": -161.7, + "width": 136, + "height": 122 + } + }, + "R_rear_toe1": { + "rear-toe": { + "x": 54.75, + "y": -5.72, + "rotation": 134.79, + "width": 109, + "height": 77 + } + }, + "R_rear_toe2": { + "rear-toe": { + "x": 57.02, + "y": -7.22, + "rotation": 134.42, + "width": 109, + "height": 77 + } + }, + "R_rear_toe3": { + "rear-toe": { + "x": 47.46, + "y": -7.64, + "rotation": 134.34, + "width": 109, + "height": 77 + } + }, + "R_rear_leg": { + "R_rear_leg": { + "x": 60.87, + "y": -5.72, + "rotation": -127.66, + "width": 116, + "height": 100 + } + }, + "R_rear_thigh": { + "R_rear_thigh": { + "x": 53.25, + "y": 12.58, + "rotation": 103.29, + "width": 91, + "height": 149 + } + }, + "R_front_toe1": { + "front_toeB": { + "x": 24.49, + "y": -2.61, + "rotation": 104.18, + "width": 56, + "height": 57 + } + }, + "R_front_thigh": { + "R_front_thigh": { + "x": 35.28, + "y": 2.11, + "rotation": 130.33, + "width": 108, + "height": 108 + } + }, + "R_front_leg": { + "R_front_leg": { + "x": 17.79, + "y": 4.22, + "rotation": 37.62, + "width": 101, + "height": 89 + } + }, + "R_front_toe2": { + "front_toeB": { + "x": 26.39, + "y": 1.16, + "rotation": 104.57, + "width": 56, + "height": 57 + } + }, + "R_front_toe3": { + "front_toeB": { + "x": 30.66, + "y": -0.06, + "rotation": 112.29, + "width": 56, + "height": 57 + } + }, + "chin": { + "chin": { + "x": 66.55, + "y": 7.32, + "rotation": 30.01, + "width": 214, + "height": 146 + } + }, + "R_wing": { + "R_wing01": { + "x": 170.08, + "y": -23.67, + "rotation": -130.33, + "width": 219, + "height": 310 + }, + "R_wing02": { + "x": 171.14, + "y": -19.33, + "rotation": -130.33, + "width": 203, + "height": 305 + }, + "R_wing03": { + "x": 166.46, + "y": 29.23, + "rotation": -130.33, + "width": 272, + "height": 247 + }, + "R_wing04": { + "x": 42.94, + "y": 134.05, + "rotation": -130.33, + "width": 279, + "height": 144 + }, + "R_wing05": { + "x": -8.83, + "y": 142.59, + "rotation": -130.33, + "width": 251, + "height": 229 + }, + "R_wing06": { + "x": -123.33, + "y": 111.22, + "rotation": -130.33, + "width": 200, + "height": 366 + }, + "R_wing07": { + "x": -40.17, + "y": 118.03, + "rotation": -130.33, + "width": 200, + "height": 263 + }, + "R_wing08": { + "x": 48.01, + "y": 28.76, + "rotation": -130.33, + "width": 234, + "height": 254 + }, + "R_wing09": { + "x": 128.1, + "y": 21.12, + "rotation": -130.33, + "width": 248, + "height": 204 + } + }, + "head": { + "head": { + "x": 76.68, + "y": 32.21, + "rotation": -47.12, + "width": 296, + "height": 260 + } + }, + "logo": { + "logo": { + "y": -176.72, + "width": 897, + "height": 92 + } + } + } +}} \ No newline at end of file diff --git a/documentation/demos/demo34/dragon/front_toeA.png b/documentation/demos/demo34/dragon/front_toeA.png new file mode 100755 index 0000000000000000000000000000000000000000..f021032ecbf393dc1996e3129d6b909dbb9f6304 GIT binary patch literal 3380 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 Gv;P7AiS--+ literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/front_toeB.png b/documentation/demos/demo34/dragon/front_toeB.png new file mode 100755 index 0000000000000000000000000000000000000000..0b48c237c392989eaf39e353c0122c8b41dfb34b GIT binary patch literal 4640 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⁢}-S81*aXQY|fUVTQ}^u?eqV6V>VH& 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/rear-toe.png b/documentation/demos/demo34/dragon/rear-toe.png new file mode 100755 index 0000000000000000000000000000000000000000..e4c7fa870f1bf352c1018588deeb2d0060488c5b GIT binary patch literal 8188 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/tail01.png b/documentation/demos/demo34/dragon/tail01.png new file mode 100755 index 0000000000000000000000000000000000000000..e9bcef7fc559edef4102bbfa02263f4d03872f67 GIT binary patch literal 23285 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/tail03.png b/documentation/demos/demo34/dragon/tail03.png new file mode 100755 index 0000000000000000000000000000000000000000..aa09539f8c71e3d0e30da4e9db414236cb46a129 GIT binary patch literal 10996 zcmaKSbx<5%x9tq>7Tn$4g1fs6?lQOqcMl#I26uN2?u6j(?wa5M5+q1oe&4;{z3-3r zy{_&)QfsZf_u0EnRd=0O4K;am6k-$r0D!KjAfxrSRs8!HBO&~KQ`=?!{M!(D%IbS+ zyV`jASh#}$lGd)4U`j=23tO-j*uvWH!#G$30Dz^o2kCq2tEvcDxjM63{DWclb$0v9 z1^`6Fecddq9KoKHmS9_Z7g6f#?tW@Yduvf@Jw8=VRX1s{oxOs;J6PLa4P@o-XeDS( zEiOhW;w$u5z!~gmLFw!4^y8%oLpR#{QT@(ynOupT&$GboLt--oPTeAHZEQvK7JwY_muyAQUA5(Zfzr^B_sFW zw*HPpsqH*H-Gn$ee0+S^eR$Yi-EBFz1O)~E(ctE0`-@=n@N@CB@MUxHp!v6g4A{fU z-QLa9-qnTjA4LmGS1(Ud>c5`;R|w8-|0C<-@!!kzcfmM(E!;S`*g5|R>EA$A)&D=# z+4+Ca9-dm@|MmC(DeM9Aa|3f|fjwNk+^zm5&W7e6Q*J`i?qCZ~S9g%BtJA+%QNzyF z)78Vy)s0eGo1ccdwXjkS!r$oSwU&p z_neY)TwJo;f>Kg^vV4LvQhZW!l6->v|K`fLT6sBxT|EEIwf)^hHy&XoTOS;+oB`y%}x_5Pb{{hxi2`Hx(Vzs_*{li2?&(f^+MTRs1D|EFyK z4*sX`!7hKR-TiM_CYX3p9Odfhm8o?t5Y+5~r`9BmW3kk_GtQxDe(bkyv4wH%>`~hDuCYP+?G= zEO0*jG!CLz_S#KL>zus<>w0-PdWPD-m25}mR@YA)KIdPH=0A)<@8|MG-O1Wb*3`}4 zA0g~)t)721HF-|8$POyEb4?=&Tx=NRYd`C{PvTqr-Og^Z8`gjRUPxip5c-Do{Kt3p zRan-iyLL9{`8yAF`b&tSJHKkmELNeY)%NYoZjb7Wv0){@3JYCB*k!f?w0>MqRhfKe zi3HNV-Gz)WPGegRC7*0MYk-IR)Wd+>%ff4f=wJ0#DGSj^GG?-uIhYKtK4l1qKK_AG z2(dI=asB1}czoH8rZjhsukE8aZKu#{amI1-8+etp)peh|Dx}c;`42&Ze1^|%pQIFd zyNYcMv@Y9HDqSUpK&8!(?+))apby#2_0HcoYn4|463OuNyL|hc7XQbXR3G)|x7&j| z-`)J z`)<3~FBz8G1#SA#rc*rsplOc<3^{D?^#+)xK;cxx>TG(7q<2L^pyC|*hsU5K`kPK`qb z!{G*>5d*ikDDVhq8O-=-wX0bYLGTht%QB-|d?p#7&uB*~MCYHBLi1HRL!y`;DbV;m zm@WCOH{CdP9O}LD!jf!mJ44#3usyuwVA{7TDW6En%a+Uqu&K?VOsi=FD|U@!I)__c zp)ILQD4E5N#xCp4%lHXObwvsOeOkwoC_{F7Dnehy>Wu3sc!{GzzO4x%KZzKHknzBB zAeIJ&4je`uUrD#@0vHWKW$a=womy}29*GhCtlgP7PMv^r{zo$={28nu*6|ES=oCI) zO{wbF0r%1AK`1*h%8;v~LWOt5SOOghIwm{rP?A3JkXCv-YJcE3xE zeS4cG!Jy5|6UHlwMa1RA!y4iCE{^VGDVpOgmvw4ok!}k1c9HWFXc(pOxu(!AAgJjw z&NhUse*_EshUmYDkwUhuUb$P1NA|rs5BGHadsPKQ0eamspv6Szu7vj5iWPGz8RL+q?cBv+;1oSJ3tGS$RZ zetVnW-9Gue1EeyZnfMcU&?xd$qK$KF*HkY|86;|Q;1NKV!ZB$n)Nqk`i#2CE5~8Q+ zhpJ`#F&$sRG{rY>xNbJX;Y4vS2q7Bam-VDmrsR)|waiL>%NQ&}Q^SCC;DzUtJ#=V#WcC(VCOM8g}={Z!_MJqqyFF;jw*%B~v6pHKEB?KxD1=>w5$gRug{)kI_an^#e3`9(w)C>|zP z1~O?;bqrXSmVC!skW<%b=g~A(l>H=%PrN&6br@qw5HEI+qu~j}8~fz@9;S%05M9sY zczqYUDq+#^^hayzZ?&e;{8+TvowH2CN3K1m#b6$;hpDef&?aB4$Y7YD>nb|KDMvo( zsup5!9HQaUn1?}Eh7q1T_dd1P$dmfiwG!0HPK=-1CEfAY@}tH9?I?;|7LnV`teqkm zsg*_<$v3|i5C@(7MBNWwYDrCNCkAt@4s`t(=y)t09`i#78tq*W{lX6cB>)}3XGt@%3yKIpoGI2*HCd$+u^<3KAuk1p8`f)<%=;a8S zYr;Aiwx4-c*(jJ%wiK1Zc2q-I(FIkp1RLthRHGk>} z7jFrxXp6H6H{Qt+=7~GN${t(CM!RV}s25jV$lilg8oiI{)i7tio+~3VlQpGgVrC!1 z?`QobRK7K*0KD)UpPa&2JRM5}74tfE2ss>`ao z6o{pOY1!OGYiS`U#KpoeqY_R5hf5N&8PvUmp5K=`z{lF!P4uvb5O{fh4G>%?OMs{L zHO57lLrXm;oQ+C$IX#P2!h=dZ>wmFKYkUu&rJFnViC7CLWjIJnhOjrF8Z4Zf9ve&f zJ{1Y9ub3gwqLUsQ^aN*yM1GLQfZF3^G`qhCn5DNH47qow^#(-d5anm=1}r6{pb1x3fz&U)2c z?+egCh!#%6YU~xw7)|RVDk}3`d>Kx>iNHF(p++|3tiF1@jYr5a2L(CnER9B>JjH zg!|OTQM{ILrMy3IvT$qZGG&%jY231{I8zxnfAE{6lQ}OgjT(4zp*DZYM)`+>`B6H1 z!LxWY`0lru-+9Ty*qXWV+bya%NuV9C4$MguDt9L&YmKtch{-w*b?yTU$| zZWM-(2=-=XvaM%jA}Ot!w{HS+S)j8N47Sz)#$dM#Uy-GbaYV7X%r96P1L89|CHX$& z0x=E3nlmT0wVcc|b0+p%BR?-we)O6P6$-b}M$TSGDM3o5Al58qFpedD0i3z?ybZ>O z@nUe?#u}|gAN2|g;~7L?hwt+quV)oI#dVY=ge|uD{t$v4uiSfmn`f6rNP)xjVLT`( zoMmAsPcMZ`jP=zG7DtD3FHmH(Z*`hDWd1M+tQd)sRj`nH<*X0hV*l=?NP7?wM|k!I zd@(6=07Af|?r*OcAxL-;F5jPU+ZvbCXqMO8ao)8|CbF2;TXf-= zJk|6x(Jp5XsdS(&kU!P{c*{V%r7*`Z%Fd<$FL6mk0)Ppo)KA}j@0yBuwaI2Xt2TiH zN`>u#R8I&2@NPR(Z4DLlK))kLGF}*BkMqY@@un;H#B_W+1X*`*GXv6bkOJD#%ncOF zZ^~1l9Gy33VOx6|-3k#OR)1s<<}}$WgCG)hE?E9F_p>ddfvS+NobDmru0i@&+k`sM zdFw9rt?xMWACTsS<0Y;j>VEC9r=*S!O(b#w_|IHx2PxYl-(`p>y{pzs*5u_NuYA-sly8?1z;qJb&aU5s9|%g+%O8o zeN)-$^IOgN^_&BipZ%3_se+ViVe7are3jJh+qa${*>wq}*MY8Kk$VPOs4@zt>gA>XLY? zjNTE#y}NMx!jXaBY`&dgjkK`Tj2*Alz@p`MUS|Xjc9CSC1}`hAQ+H9Ib(PWVrPHGQ zu&l4w;?W7UmJBCE^0qwQ$HuhAIE`h$6DzU88}C6?&TFzOMiGOWpw6C*T} zK0egek_7e{6bTEeM}}6szjzWQJb3j%i$10w5}hCy3}d)Nct;dnjsgv1F55HBuuGy8 zG>Wo3h}hPj5|(U;`*tDe$aWu(hyDm6Ix_$)19iyBNoaNS9@d)udP#+Xu#1#*KGNSw z6rnINOUA9~Dy-I9*^YfiOIENfhOb~4tP^A+k*9`vY+Q6^GLnw95Rl?e=W)i$9yMGc zhLM9>dFe; zL?Z4~`GT5rbThdd^jvZKT2W9kuf;#HOO&?j_gGkrzXj#|q79kC1=S!~HNhQn#UA(T zFI&qgMxe`aYzaKLgi4wFH~Ms5{s8YZ0*kXX=^PV>b$6x>x%Sdw5=~d2p>5f`2SN`# zr)zLbFx(Xr(?2oNt&&SZw!g| zC9`MdV+C)_2Io_F|RI2Fh<9~1oy7Bzp0Me8Fg7H=$kJBjMTMF)-))ot(x+Ol*BO=-Dfw2 zL^IRWip1QHX|iA9A6?Hi8qmT8s!Qu^0%$i#3%G}{e5wfn#i=T*7rGP~_b&;I1YHg_ z%F1;|%vp=x_Bae)vZuf7SZtTr98v4y>c6yHL|Zq};wrJ{))u7j|Jtu)9}*V(W*$XL z>z}yS3U$f8hh7SMBZUpS1#I2+S`nD*#GhG*@FrlD2k0!9VHP@RNiumCRBb)dE>+Rr zOX=iAp({y^Cl`l0f^S#iMOGHzAXe-HxRBPQ;h-jAY<;4LvJEm91_gW49_t8e9zfo;=<+#I!u{kui}`60!UbDT>-ifB0v zX4d06n==-i6;c!+v#^uURU6%G;}KZ&LHblt+COkEW|c-PaMagW@q0Gf7n_BAFr?8w zm@}=ex~9D}Mv}^kyhqoQK!)sUEBS-mrO3=QuY*x?qVU~hJ;7(#9+{8%D6lX4<19@+ z*B#rh_&@8QrKf*4ZBW`!OW9~iU5wQBjlS6NrBkTQ+5M5pM*OmotRfF^9qqI;fRXxq zzqel`IfbX{%<%MDyGXUp!sH0i!=T)jq?%$u3$z1zB36=PHLua*nc*UCducS&a-Hmk z$jzmgs6J%7=;=kkNiK=rmMm)DjvNwLlhS(Fj5FEoQ6>$B-O5e!Zfw;sSy;-KYUbfs z%Rlfm>fm|EF4VV4h!n)X3+wFgU}QvG`Iw6Q=qjJC<7F6)xN3a0^7Wkgvvh_LcfNz# z!IqY+H)e-nTlBo(VG((wxwzb!do|(N6E>^Cm%}EKj$Ay;>XI+kxvj(u7>S_)Yc+7x zr-K>WH;_^f!KVq#q>0|)Vi6CACU~4dba2P7G~$BeBky9Y#mq^YWn)73;wQdpU!7B6 z*HlxYhCjj}_riW!Nj%=uL|G4teKF@o@K93x$nu?HMW72AS2dAXr$%ZHQTF$?d3t>r zp}4tH5}I-dC=aU?>F8-p21(x*%bdG+63q!f1Lps-OfSifM(IFw0Osou23)%;3Tdb2 zYiP`(^!{EnjtW~!i*wHpsOl%V zIlY9XYPBm6O-pV@3i6DX0fD5r8s%WejI$}T#4@}Qk_Y=1#0S9umi7>!I3Pc?JE=Jtt4)!4o0(SLqpLG{a}sdtE(+Oc1gl( zSJ42|d{G{@QHFHqn<(cEBw^EG(FHUQ(qB$-;!Izl7V@{Mrbh})&l>Fa$K_iOaJ z?c7}bcwGOB>Nu!BP>f|X{Zc<=K4SI*f=T8(I{wZRDgC5xhEJtkuZ-WXHPNDrnqRqG zSysl=E?#c@E5|ViyG(Qa(YR+cz>{vqQUFH1DwbbX@9Xzd`>VW9%X)4juX}Al%il6} zEe?Vm26XGV2%Ydre4NRltGj(B7%pT`3K1Vg9dSaQ-=1~wGAZ%cq^ry0L6ZWuTU9R<9mIAH9Erd^M6Y2Gp__d>{UBc zxM`P~d?7E=@#0wC1wtE@0MzQit9qrtXtye;=<)bOQ?8NlJM#2lefJ*OoG|Ym2FlCS*TUe3&K+^xdtt(g>4X59{lzD zP7O$rjDk0Y4>RJIi({Pnvg`qKw@wvt(f4%AN~+#m0g8odz32C1+X16T6|;GN|1g$U zGm!_C@$5M)46-2}NMHNUYUp24Br-DJ`Y6z90kc=Gl z>(1XqcY7yn{xDbPH-R1a-c04@#{bwQvEwXynl_6D)_E}&jlVJZ~gw;hbNw*i%*W>E%H*a!za)echby zBS~4zQ#F6dtFSepqq36t;K%g+gYID7-REN=vW81y}m8fT7@SosDSLg%` zt>T_NTZXWzZjVnpeT7@VRkhQX8Y`x8fdX+M;%QgKa9P`PK*aM#{F!Fg9Kt?nNL1+ z>BmR-80xbs;N&}g=%gjExe$x|{8mYJC^#$+RScJosBKEOd@t2#7MlELSL~*?bgh#F zy_(%bkCrhu5n@GAtD`Ae#sE7fJg`e1`62k#O+P=IZJeRdl!%p7yO)YowOC;7GGh}! zN!M?!U(=K|9fkSUYy5sQ#f2hx0EN9{a5N{v7vti2%F~p63ja$N$%G>p_+TGE%5gYI z`;65z^jXRfxll`oG#oeSNyf~6R4Y{qea@H$TcD4J6v8r|D{`M#GL4kYg<&UW8l;Z7 zmJ8~0c|f=bZx14beyu$jO)A^haC0qGmm~MahsH}U2&_;fzXk!9%cX7SASW2yaT-$+ zTWd}*AJ%bx9>u41a!4Pu|Cl~iF*zB?iIUuXs83=fIUMDE`1#wSdCLLdo7^#3pV+at zY#fL(4z%ae_S$%^)qRV_u{NAd8o9(U>lg7lh*L4ne0Lf@`D8^vm&Fo~p-3ljRadOBnJ@Cp}smoDI3a_uN}Y z&jjx}U@w+{`I9%3|4+IAAf+tDp=0&P38VHpeZ;a3;jxQ?imj~%b0Z!0kOdmv-UTj? zOWXS{QdnV3qp!sI4uTP_*17V(np&2jOQ~2Cr4?|PPj@WwT3wth6mLWCareXk>YIze z>JNyP^@#7~j;IOW7}RaR7&AlgM~6!Oo|~*5GA6KQQ8z9x{|SM<7&pcL0Yfb$|Ez`mVu4l$l|9=92Kc@{e-+z^asq^$5Oq^z747P&1e9vsoJ{Sb(_Ss#Hdosu6XF^5uVAEIRj$f$jUAN}f8!JpX z)a;!-#+s#z4RuRi`%#oMu5`DAI z@iEAvC=0NAoFGD;7a?Ro+txopyo^K)TvpqJq~*V)C`{ zpDzbFIPW9JhUzs_Bw7NLyW1ke^71*xKNG=qCdv=4?vCzLJjn*opSxjE86S8}!90>0 zSX(r%*_DgyGAy$hympfuQSeo64|n#kmQOAe#8evo2`s7>Tg}af<(CCD$#M-`MZl8HT?l@*ILYiJgsO&X|V3`u?ITLIv3lkc*{ecally$W`Ep!A~Ep8Mr4=aE9%B z@GYJ@e%boLnP+$tE-sO}5asQMHD!miG}qI?Y|4T@(Rt8X|HGvBF7dt9usg-wIO}IgE2>q>CY#J&OyT*@(h!3fXg|1Rsu@~5gch;RxD@C=q*!4;5F*%ok!%0Vn4Eh9-d`yQw zzInA#NAG`*DmGR8qB>0p7blsfUsNQCA;4sn{hWQ+sV_ur4~9t;&1z5d8t;M_0cB_2 zh1YM&B5S7|M+Zo`Ki@|N9(x*oV2kDrMz{L?s<$z^oqH%KMkMi?*mX&nOeCI>vd6Wu z)B&QJZHZ52ZXbGcB3-4p9lMv2_-!#%u?G$oF-!MbgJv3m#yAP-+^A~($)eUZPIc?* z0<8^Mg5*?S&ti4c#w`mKg0#V{YgWrQwc2>`m7t6jfzkk}Befx(qPi!j zLt3sIhEu%UzwfxO&ZNm!fWAPuiE(k=FlA?o@1latbY-^6zW+*JS{JIMEyK^Sr4a1VDf3_TN0)QqTxsLF#JTc9`#u}dy^r1q^@2%h zf4)2Sy1UoY?uz8-(k)>m)i1S(p4wDZ$L6`yeGon772j#6Vr~EARV`acc>BUZW&+iY zFQZpHxeM3~PX2aiT2EU=+OuZz^V)dCnmzofsVHt=4y{lokUfp0_;In9Tz&b7RQJlW zt9$`J$>~a?ce5gW0!6{SynK{9FR)c_TH=WIV$s#4(cRZsJC=) zLtV(kG3Cf_QWG(c{~fBX@ej zu*d>xck`EW^-9gu+>zK47)W{t!2lDzztd-G*X@lekr}2AXPpv9e7>9~veA(vi(d@@ zxBP%-ed7cN6JS}lvBoT(dewWLgzP-J*38W)IIoYQ%+o3F4bf$4^^#fh`^jg!d$Bak zzJ3x1y_=Th+TEl$;7FZd?LlEsBWMs#(qn8CP-^=P97AmPR04XRIW?iZzig_CgvI?< zI`hDJ!F3F(X3nvQd~k|UDuIb8XnD>eJkDWDEU&^adAA@ehMT7OqmYJ2HqF-~;Z<<* z?QUq%@f(?|lkkHrmi~(+8ueXaR6TG}|-^K04D8f40Zs*#Hz3Nq~w7;4+$r_yr zZqyedo+YjR;ZEKvB~u4SMeD^04B<^aRw`RM(lY~cTm+Zin?c%M8t~y=1S19hv?*?^!F$=@t~4!3Ecv@;W&f)8!>l_PSGR$?ZK#flG?+GO-BTl8_U8ZSvw==u)i z(T0#_m9O5A$JjP4vl_wtcyqAZEtSHEoWhc+0sqiA6J?Fq3 zs%)n-Eq%_jR1;ERIS@CtJ->G4K8~=bgL8{iZiqKYXtwsbztR-;T(8oIVLDbnXSN^AqZ9lVoHlwVlm73Pz<@ z>D&vSG~=x!w{Awdg(Zpn(4$AHoGfc~_+x$fA&S0sU9y-xJTiZf&j+?r6EZScNL(P^ zQb?}ht#II>p8%^jiTtW0=^px<{-mkIZbDb=uAeL_@VW5SdVo$PKgo{klZBA11kPQ& zh9<{%UW|f=sU6!2Mnm% zgdlvIOk?ylM;Lr40m{!;nAA(;7zb6&@3e-%WdtDZypm5kvgSz}qBwX)^uud&WL9*>`2`-S=qPfu+L5X}vu5%~HR@FHs;Vx3o23jsLOx6kvyiG1_Z<(Dpyx!E^dx)M_$xfj; z?}7z8nAn3f233maJ1tGbQ+P2=J_a0HAWR%gn=$+^c!Z4%PF^m=xC3%z(y$hmuqE7VQMHwZC-h(iL zAbg(v?q|Q>k8gkXahFxj^SrLL*7;+tOurV-X75u%x_O4Jkn;q2A*+Y)~g22u2!k30 z>KWSyy4p)Y*cIg2Wc{Td1l*x;Fq^--n}?6Iza0C&bfq84e>V%Vv;7MKca>xRpQOxn zU$7~A!k}zo0wVnOLO>v!xVQjNR7_kP2w)Qy0tyQXJ>25_Kv8KiacN-*wtrvj57A%{ z2WdkUwSUKYsL8QA!Qo!gf`SMHLI5Em;0bdS1WHLs{jDJ^%>RJk_X+TTgZ=qEd^rA5 zP=Wf`!<@a~&Ym7@e=CCRJbmGE><^j#&k)?b{v+$*^Y3YTm@q+qu$LfEKf`APvwv7P2adl(c}Xk7pkTNs%-GY@?VnkE z;p7ST^l|d^VpBE}XX7z*_JDXIe0cwb*VUEQ^zea$J?x>HDst=(3Ifi~5NS10VG*E; zu$Y99q8bpWDy$@~rlzc_rX(gVEFrEaEcy>u#nax`9qIx9hYR^%uK0iD{%r+!uZPGg zP?)nH6ru+6bZ7h5kfojfdoCjXRqx+i$bZj8^uKZiACeLLdtv{th5o1M!99N$|6|*S z%72Ux^>}bQ?7`O6#_x|XFc=YTYoaV?!JAg*JL1No z-p$=}bv`5H^5Z2nSUGN!b9SBU6T^FlojHeNuHJ?f zhbDH;c}2ZCPYbyJa`_(GVI&fZ_}LPt{nKX(!chj{0%cW!-%83xi< zSKBGGX+z}lo;&;60z?sp?6^VB;T%&+;b`jl3? z_@0a^eY;`9OV3Pb0(TR%yEboSO7j2giDAFMmN%BDay>SeVfq~A!JG@ob8&V`FOK+# z&K_M&7o3-0WIexVH^smkVk7fw4)XeCi-SKPBAHswM*mZcztnf4<>FVkoV!iHje8At zUHpA0Hry)DRbK6IJ-1?)-JsNNeqR(TUuX@+`-n1F-?fL>`eyQS^*1uNtRM>3`27Y{ zyY{+er=WwJJ%sKe-VvBmLnZ2o;@|#4GLy+gm-wQS{-<;S`isnmXUWcrGd{!Eg;Ak= zH%n%d1B-Bm-ZJ5FNZyMlHM2|v{?=8yaG>vUvx{Qiy0_#M#o3#PE#xfb1T=!5C6gs= zwQLho|Cb?3CA^si*S0S9jm1&b`KfM=HsVq>Tl#GX5{W|(TWD0 zYxy<;m#ncb{wt!ME71Uj6%c)fm1fM@Kc7A7xs^qG)eSxG*P@p-#LSh!#Q z_-0pz4nr#}r&T{(^8*wll)-O1RsUw6NmfAlkl;GS@qm68ZU`UGwTU{uB4jW2i8cL>rk7LU5T=^(tYZ~{fnRkDEz(KB6zS1)@ zr{{X{`P#uqK)S>%;qr;^#5$LmjWEU`Z8c1W1gD)8x7vyhwjN+~R$wdSmpbi^FoR_I^PK7OT5M2{50H|2{!}krQh_wGl#m?gt3Pb@^(B zvj#o0_v?Gdr)yd&Zfjv`gwP5G{X`NI526=Bt{MuKf{t4Zt$l9YNcE58Mw~d_AmtWn z12Oq?RG(UORcd%qcy^{`IT;%$fS(+iQRQ76f@otq^}nii{=E2wO%O!z4UIxwb?7jwqdu2!YPGUY1M%D!!apFLr6(ud3MtkHlI? zs_b}En}`{(9b3DR^;@%zBFT|A(I)6!lbOJW ze%17Ikt@im~ zWSnNHyhO}8?BnNF#$1MBd-Rm3-EckUqTtBR^v~Y%$Vv3o?=+V1+mV;Uz8lerCjd*M z3WcFuhOlZa1k~+qFe@{w_WG_qi?ROAP>_eA^4*VIc5|UKJS@>|f$&}5@00hUy>~9d z8945|EwX;}dnA(HHyeJzzbAfQ{b1T%J0opoq8`}ul$jbD_F1SF+itgQ_j5UVMfYwY|W#Q)iMoCJuD zX#s;}_Uy8$_0oIu3v$i~?HQop(4q0+`dROG!@(;jJdTn? zg2teAxRk+mE2ZOS9dCU@CBav-nmE{E8hZHzyiIA-nE?D zt?^zfXX=gKd{qr&K z{gtC9cMz@5%W1nSnKiRV1}jFl89kuxEsmmZ)~P=Euf?1g;TY=BB=C#Y3W}2|KI{(J zu(c$*Sc&nOxL&u;HpwffDmKLqmtiT+uN9oks$V1IZN*G5a)qUnBIUJ>7)-u(O7AwUWsRMY=BnrO%!FjwQ z$QTYU>9g%Sx~gCb;^}4fhj@JQpIp6;dokyL!N>%$e%t~X}?B*7s}u(r6tX(hNi?D>!~o*$duvw;mR&Q?M0 zGYzySVIs)XE{m6g_j2kLu74ELbfd}P5nlw{TOw%ubqPC8Yxd1a4u0*p{jE=#L-oyN z^SIIRo{!Yeq(8h@8pP80=Id14k}(^4OadnZ=BXywD;gr%lH$328Ah8ee!s}^T2~r9 zDEK0UAiZ#HMKaS>4)bN3Yu~DruUUtZZ>F`Io5FE zBbU#pv2b??@Y|Jlw=}H8H{&bIyOn)*bY!w%%@HznTL~E$By;`>$deJhKf=hQfpn4d z5F43gwKSreG_XVcLcE)7^VrT65m^} zWOC)AiLH;k+G6EFQ@xAYR9=~LJkvIlJ52Q3eJNWAq*tXIIMx7IE%cax68aQ5QF#L}4~gLLUj zOqFv@GuOb;*nWJ)4fyjowvEodS)%#ph2BnJuozB$TtQ7C8Ju15B zR6wqCqCvt9XlZX3_Gq|s{QNua%YGp-Va2KkU&rh&aM5{Esy2Luf`{DCWB}R40fxnY zFmN@>X=Y6Igx8S2vgYHr;ieIo+!y7Gm;e`q#7%?HM*nqIU)V@|V*m9cXa-6+yE>g1 z^i1ujGb^ca|N=(;5WxzW&Wf~q;aM7rJcLDts37Ab$C1^bw)K))?DT?uymH| zbCQ_yL`*981LRJE`drwF*vD!vt>)e|%E`xWxrju=T%SuY?Ude9YMW#_ilL;F(y8Yw z#j%kS=F}hbNKG-MNi3N%cZ2J6F$#SX4dPM*+;)NKpQxA{@EfT-RWx(Nt;8ycAiAzvPcu1CX3QemBjNd?+&iO_?;U*nRi(hAfVb zpumXaCCWbdxkOR&>Q@>cvCPzDholTM32kl6?dwNIfRwOvZ8@D0k7GKuFbxOT)%-_y z`*EksVE)Es2OY~XmmOeTs!$0}5`aH2b4-)faNo`$R@+8gdDfbFi60$KU!Wa=wpFv3 zD4n0$2MUR8z9Jj6?L(uhJ_Vq=R1DIrw&8nCwL9TTqOa&Wfy17B=F+faT?$jIPt+Z- z_wQDZE0@|0wOfk`L)*0!*Axr+yIfxX=HKl~ZRZ#g#vd`ik;KsanyCLL^EIVcDi&`5 zV4xwvdBN1jxpO2n04s^e@dzOJT~aVY(&ElDSGQDHpi7g+EN9<9c7h>*->Q(dJ!|Lq zC5rC3dRLJZP<=HwPmMW>Ec9g})wB@QaUzKG^iVu~jqEn3ho-ii_WAj-zS8SB<$;U@Yt z#K5$72F|w`%r_?Cy}mq%G@#}|iYyZkd@={|9iKyJ+bJGezWE{S8049N!tUR!y%S{3N4D$S4qSEq$y)BvL2NPSN8HX z9SD9VI&nvLjTTOp6Me=ar8dMhY4^0686?UpwgaxAHwGtJdgser*bZqt=&CI`u@vsk z{=}+FL??Sc#jn}Qa40E4{}q7^mha`qR&--@8JrWr4USwZbf-kQkK$gnE3VM8sxlTW zLxSW_bPC?M^M^_Ai!}@b@eVSKGaAiE7U6Gj3+6?bA^dY#KG7 zh$q&3F&^gf+O19I9V0$=6ghk2}7oas|&>ezg*i{TU^5glXYdgObKiCuiZd zj=D!A-3gwYZ7|^*`TNylCH;^cb$*1qAHdkw|;QR zK}7{#JWmuDi&YTB=O=3PJ-TiMnr`ABNk%;&>;07bFwFcjTlqICquB~x3E0UvR?aS#_#bCzNZ0ZQ5u3lQxv$7SW~+oE z1|LZ`wYqSrY;ajD>#V6MnUp$fOtry%5Q z(sGV;Gq=d`RHISA_p7meS+%D`P9-rzuY23dC$$xJl>;-xkt>WY4TfAs^%V}hiN2^H z*IydNOSkoGo9GtmSD}Y>Ip_Jp7Txbw)F*o?Q7NS~HRR9mrND0CSjjvrOA$WxS6j0bJFn%Cx0t4SU&`>n|i8$D*(p zmoQ9xfWrfvc{qhPb(5<`V3V;7Z$OGi3Rj+|Q4cK_x{E*m@Ct-&xeq3BSt9WXck(1R zZ;gGEht09kd|{YUY2O#Jd64KasyK-k-A$>RumMoZxG%IYhGc%|F>bJ{;$2r!C$bOz zIX9Y4>oVJ5BCC*T!e}tU>-hPATpQFd2k69CkB|RkSZ@0|si|S+6QD!Jpw0-3P#Z*^ z1EDDSbNpWG3d|dnOfJNm>$}`28m3pFhiTAHdLWmOiL_>F9uGzww@rw11NwkANd-%i zgj%3?(@Wk`ofq^oQ$Yz)vH?>L;hD4a^BlKkkS zEi&OM@j_km+t0*j8D#TKGIa?*TEelZ-vWeE50)dS?Z=uCGs1PlSjCb_^6%tX)Hi_a zFK%V&Y>71vVe=}4_}tM|(E5+wvZ1e@xKfc!Sbcb2Lu*T^pJ)S$$$jsG!H1d&(5DzBf7jB8r~v9w5wTK0A%?y)0wM zQAC&PxtWi!ztHx~cGhzZ9g5=lRn>R2Ubw?$ zGe2AU@)Qj0a4hrq_?B-nWeD4Kx0z!i>YIqE(|g2lYxVDf3T-=PJ*zN#WMenJlr8UX zuCly0HtyFN$4P57!f!d{QCcs$qD*vVr}CJLMDOd|bcZ`r3?$-oX(=G`G=6Z`rgzE7 znNwf8eG*r5Sq0adM%mL>*Spt;DWfX#zum*eO=37oC3E}(Ip-NGDw*VeC#FtjYOP6u zjzUajyCZezkbGv0d{JrCJWNGdO{tjLN0MoCiFh^rE>BWDZ4*^X`^*%7DT@MroEOZW zbS0=T2!Lu)6t$TRyBj!azuUZ#LwY+K&6PiT$ouaIHZ5K{FAlA0pU2v;>Nd6==m(rg zygbt;5Rsqel~&A&&TK17_K(IyKYQ_gl+cDVzH!{0eyST@BfxpOCs`VbSZK?(s;B;fm<- z@46TeM$V}wFxKU~o+RC%E_8Plb=IXCmpV{NG;UNg2LUyV2iRnhg5J;OFQx$DM&ScaH0Q<;J?Yn&#BO zS^6p`{(4AN5d3koT%UX^%PFlR^Q%;6aI8RDp{#Jx-nNuAkp<|PE^B9!s33H7A8yfF zjk3~6x!J=mkKva(%c=O{oxHzB9IxzQkF0};Wql>ZdqtOlIzfQZQL!Ly=MKy>G5Hha znmw5%<{9ai=?PDdQdU^4fHHZY@B&>KdZsf0=g0Q7iUzk;)<*uL^*rp5iD8Elyh}ENK%3RRDJtvG*hnw>~|Zh;k%&z!sJ5aMrm^EV z%|z0cWj$tFCBF(>Ufr@xycJ)CqWSU49=czVb!l}RjhW4ah5*!ds#yWkLdiL|7u}-4 zwY;HJWd>Ex+AZnrPYqDJ{P>Gl%Zt&5_?Kfb&joSwg4Om^-|^H+6ist23t)3(FoSz& zplpNktQv@8UXbTZwBEVuAIYBSXT2@IGeHU+ATf~$fC%;|}e*A0G_m2zjkI+j! zyL$~#U1GztL}WG2ub_Fqe36Yoi#m4hF6|0Wnan<_x*zbFsFugY!23Nro3@~SfMmEu zQ3Incs#3;pKzNUH$x7Yy2Wb#$iM+UNhwJH+A^TIJN+pY^ZT>M=1-TElD`w7^OFA_z zSxe#53W2Cqy7s>&w>hUBAxDMbZml6N>6P0%TTmjqA}0HI zRnBP_e Q{w=Gis;5$|WE=K>0Gcg8-T(jq literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/tail05.png b/documentation/demos/demo34/dragon/tail05.png new file mode 100755 index 0000000000000000000000000000000000000000..f41005c534383d3b5a875aabc9d7bdc75bd5ddf7 GIT binary patch literal 6382 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/tail06.png b/documentation/demos/demo34/dragon/tail06.png new file mode 100755 index 0000000000000000000000000000000000000000..31f68a4d2ccf72d2ec9ff97f8a1edb89d9c71b60 GIT binary patch literal 8004 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�jy zj5C*YRa;;Tj5(}7clCB{kahJL%(RV~-aLk#>|p9)=H|UYVzP@-B8f{L1WCb_Ug;ag z4lm|1n`Q6SwTFtIn#@O`$lL!u<{hAu&|1Qnx{Te`t~!a?pe?sO+eE#TR7zNhiqvp` zy|K01m*Vd)$>|%u8_nH4(9Ww#2{{t1RPfj$^tg=Gc<<^Y7@G641iU2#cu(4766HNe zpPx%^kQC{wku%Odc>s)@k(u}XO2(a{=mXicp@+1ai(e(ViKQ4_RRa4|{4_JSbq&c~+qs9yG3> z#pU;Kg_S#@$&dF7j0Z%J8eH#`0`^5>Cx_+cCJ#9IJ8s>bF150EiR`3wSy}-RO9Y6` zb1(p{;1e^ys(g@+%quv!l>c0S=lu1@Y;`skeu|9o=yGN_5!963j8u!8OI1ah#J=eT ztRBK1EEO}_O5HtllCh79`A?Ls3e*G7dXTmusEw$iRtVLrH&pp0 zb_0$3Ic{@+Ez0j@`1nYoVnOT}IPSu~X>$pnDsLCwS?)Kuj2gv=ysY4;W;04U22PGh zGg0L{_B5KgRC+r!MEaJ}g30y%*7qjU_vdie7Yzu$Wk_n`##C&#tuCb+z^!oGaAy&d z-@@Hple97uC0!+r55N$Wv?dIy#Fo(+c|j=QDcX{@Gopy{gUN17*IEaSNI#64=>{K` zMxN*`C#D~w{{F0_DmB|i9n0a`pLCC!IhHwQQ4G{u8+plYCN`G$DPVxCU1*BoN%vPaZC#4gqA#wR4D?<9=vz^q*IA$i>0j|cIcnbu9YdFpDB3+{5p4~g;3^fCo z5XCDd*t$A&ew|t=F?jS0y_{1GJEf9fO(=)4s%UnFfT_w6FF&W^$e=!q4c-;U*;U0= z01p?e7E!rR+F(s=%A#JLC)b-L8D_pZ^oOX+aQ6IIb>i(;*XKx{?i=r@EsmwC&`bkZ zEL{rOs((v|1I6yL8e+OcS2m{1b`ngU&>rk{;@Fys?7Irqa;40AW8JWTX&m}x{7OHr z2~|KpV?NI>OYkQ|M*8Oz<&55NQ25(9;uNTx@?43! zkE@6K@z9ZoBu?Gv)Y34-RTb%fUc4woU9`I9FiR}{g$E?6%N}-etkKbv0Q|B}e1sVA z((dm;rclrbGs-2C0D%W?v$JJ1;g9O$kkxD2cy(i+Yaa$59{SscGzOr?gTN$C-N2y0 zi}E{FO5ZJn+SQdajv9Tw_$N1j zRBAOss+QASsecECq%BH_`djSOmgg#yufRMvpVa4cr*i3$n#D&n$rJbSDujC&BrJLc zeN@|y7GTMasiMAWt1xxTGlrPPtR?V!2vy6mT754-vO+x(b2#Hua$s}6QIs+m`K#Sl zFfz29AK|&Gp;pNLK*gxZLYk}-A^fENy)CU#C-JFXz+-3b@?7$6>NP*C1NAzz<{>8o z>9wuJJ%}ZELKpMVl*ESRutyU-x5{datZ#|;ZI3cOlI!8EP7$Sc-K>3aIQ5SI-98$o z@(@g7%K!qAPi;({VGSus6 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/dragon/template.png b/documentation/demos/demo34/dragon/template.png new file mode 100755 index 0000000000000000000000000000000000000000..3f2ef650865458abfa181753bbf68db9eab0822b GIT binary patch literal 182918 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/head.png b/documentation/demos/demo34/goblins/goblin/head.png new file mode 100755 index 0000000000000000000000000000000000000000..82b49f7fa77b76d306cb91f9af9c32ce155b8cad GIT binary patch literal 13908 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 CfDK3h literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/left-arm.png b/documentation/demos/demo34/goblins/goblin/left-arm.png new file mode 100755 index 0000000000000000000000000000000000000000..42f60e0aad6542cc6c98de4b1bdee1b04e7cf3e5 GIT binary patch literal 4335 zcmbVQc{r4N`yaA}Y}qAaERk(y48~-eO~}5}!Z2e@n8A#YERC`hootnCWhWwgMq=ad7|uEclkyIHn>&!#dOKC|)kzh-};X?yD33>p)Aup1> zGtJq;9N|gvQ^y_HsE7FZGtmHmo?(bT&eMlL19}jMB(gqesqr}oNW$xboU|;!7XE00 zH_7C3Ai?gkrM>56A5UF8$j|_&7lL3C_z`G0V2GbDnTiO}2mQ&5V9E!_8X(}GCNv*? z&|g70TUZ0plt2PdOI=gV6AXa>wYAkDFfDCuh$;{YhCnsI%v)Ox0z+tNBcM9Kzb_Ee zTOi&GVT&>T+ZR*Q2YJ(I{s;|?;NW2OU`=&OAW;LNtE+p!0fnkDE!3!?WEw6+jZBsM z#egADJp)PpG!lgjJYd9mP=aXsAZDb0rQqjpVetFChx!vVYzb6KP@pHXA6|05z|7kHcSi??%xDl+fh1;AaK0FdXOJI( zOf$vkgP32`@gzI~h0#HRbs)NEZ72#0g+P!f2n>Tl>%ukRSREZG`WMH)VYRUkw3ZGW zrG-H;JAsAjYU&tcP*4~e1~bNhwPC-orerD&NA@KA@=Id+{Tqw?uUG^+kbt960_`aj z-(M48?MgCQ6s90LXYjm7^jHPc`Qqj4}C|1m7Tj+hg8ApSG@Oy!^D zA&{9H6UbbRj>$C|b6sUjF-ZH6cK{OL4ui#qf&xrVtp~E~18zx4@dDO2b^xpk3%e0& zDnf}c9Z|;gw{?I39~Xdi?m{td0UOdjh;&gpA%MP(a}Yj>BVq<%_Ta} zea=9x@1zWrN>qn0&+U6p>>P%(xw=)V8ZJlPv^}d3%k{>G&oZU)QsI1co45jGT+j1! zhT7zZjJ*bsqJx9%+b+&)OEI%8Y?ar7UMT}QR+H&K;TYW3;A-sMZdE!$L|Ej!xA2j( zrqSBxq$=YFIdgpgU+xe zH(V=|zZHvY8ejW1x=SVI!_^XT%~i<8aIsL?&LBII_-kYIV2$*Vn=ZuhXT|_ot49jk zzlmS*H8mI()T^$WJ>hP?5b!v*?4ika&!BUNAq!l-F)ijQkUM7_e{_X-_KBhO+5CDl z4Yn62mIs`cCD`1$#RMxlc#x2hngPWg26^Od_X00*<_d9aYEb&v-99(Bx`HX!$Ol4n zPrVHr9W~#Z(JF5XGOH^x-glCr>#&Ew+jEZ;4mHKs+1Q*mDT(cXw)#(89NgRM1ZQoF z_h(&c^x-2ESdVg7Io!*MbyjCBf3#?zA^#c9*~g=0p3MEK2J50E$7M+Ke`*kR3-t=a z5)l-B!~08R{boY0Qox7N{IT_KM?Tyfj-Q!-Xe_|h?RdO-ieBInU7GyGy!GB3qWpX6 z>#*#^FL_`Fy{8ag=k99uIkndP*da1`Y|tHRZuZ84i>H&)!zJIcJh2U8h(*O*eCsC} zmm93NkuZKIUtU0A^2q~iu1MPNUTuX^&1^$zZf#=AoRuE&Lxyo?vLw2xYXP!7K4lAX zyf>@myvs_~soCsTarLtm%3O!I^Y=t9R;YxxiqJXQ@^u(l(rA_)H}k+pwNsUWkhdIb zBn48FdM7_>{7HcX&*36R(Ly1{s3P%8HH18Ts_>Z~W%+LGD zw^g~(hw)eMonNYOV6EIR@);4p49c=Geip{+N0@0xQ{nqrcKUjJxI9RuAq{2UT6 z7a$k6YGo+}JEr=bb|-A?Q(@PdLt}aK;%M5bd?OftHPFmGa)wK4#ig`Nf6m}twZPQM zXO9(B=5s?i84ICIll;dFHDsmPNovtphL>IB09VROBat1lcx=}csirB)uz$Cgp?mI+ zXh+QExBEAOruA|`MvnJiI?WR|4qKL7BA(!x)RTGh^j)uiuBohn<%xMtw-#=x*9f&T zDLk+pegT0E)lxWQe7kQ^8z7rqcWM%Bq4qIR&1z0pGp2dMmMe-)Q%4s+>bxpi@}djN zD8r;HZ#~RAVjCmblX4Cwb-(^F_uez7K`wiv^Z82^fP^~`%AmFI^@^OSb_>r_rfAZ` z+#9yniZM8MBmr-<$6$Ag!2Kh>^pbxI@QouLxj<8%6BrxLWEY&1n@rEFm;FfpncoNEcXGCD*t z&kyxurp=vSGGkMcB5G+Q$5Jh;4gT1w+E8I2c3&|S{V;jFLby4c5A10T>Q!x zkXMKFqpQ^HmdzA2zJ247V%KP##LewwQ$^@nrei8jcN(^|<`(+8i_h8# zoG4DmvOY*N;<=X5%SDEzu^AY&c5nSy4V$fYeJmO$By}@~Og>V!U`+9eTLiC1z_qbf z{xSIEx(nZ`caRgoJZIPqr#Nplgr1d=?hvByEi~B#H40u(x;yR#IK14jmV2EHeGtUm zH`ujVbwq@IJIcaVRTmoku|op(v!3b?uiCHKQSt_jlkqhjvwS!Dx?kI+Bcrc!CmAS6 z=Xtt-OB?21U(w>vQ5g8vG16@5&w#iO)5nQXOON#DN{z`5hyaV`bx$QuEnsMc(IdbPUxar2Dh2P^~F-@hdDv zp(8RaHE%3uKLEOW`3A6dHHp?mEnWA2x4zfp?@MwNO^Gq?{e8nv>>Q`UvOKNq0_q0) z@RLk|0Nv(}VOe5JWRjTZ8#Q8`xQ zS}qXBr`AKq9LlBNVvR3%Zm&10j1#%aEicLK{ovt)hb&hCHa6BsRe8lh-i`osLQ_@(Mg{BF@jU8!tqShe?NIcXULB zH2Z}wanHXiA=t24<~k$g`!vZ3d$F|W;>Zd*dxewv$=ugA`czFSKZeW8kAEf5xJmD4Vk}L|-kl!3+vOF*A$#t;%A+)6 zrFNK5j*qm{B(>JjItVURy}Ich5ERPSH1m}$-7`lvym?4`x6Axc*Rs__;n5yOnbeN}ic~);WDDa-+SJ8a{G@^Xl=!yi1QNS_L%u zK|i-0T5?Q{DneW35zawY3LQQ0<^WO;cly!mcK z6kjNiH=J0KIIHwl4qIHNcttR^r1-{kFFTH!6+CdAuU09AXEgHDF3Yt?>yIb~C*9U$ zTLtbz67klRkbGy>at}kD2v(U_BB>e~}_P4G!-JFqQ+oXw0LdL5k z_+H%NY0dTRM!S^MCWKHkh>8;ou9b*9H|;5Tk&Wx|*QSOZYrf%gv;G$K zVSf>v9hoXCq_@99o-Iz~PoKUn=HR-Xb>O>x9>mSa&8+}sl-LcEwcPw7_ z1Q%ZKr_Vc|Qz}8d?#MhUA?If<7 zuaorXT3~g8gqSX?h1b!s8h&5xb=L0ZFXh$;CXuvZupjhktL;&*i`g~dUx%{WH~Yx) z^H~-m&3OO`fe)>9pRA52Od-pKg*U`RZ)Be?g4L~5DO%LzyA>fchkCD>OYsPYNQX5= z_=9&&&OAGw_pO-N+m&c-)m*6?eOnk9bvSNF(NUTL6#P6Sa;Sj)6XPbbol>9o{tWe_ zdX_ID-Gp1;YWkj&RYCHo*j5v7bK}bdQ@=p@6Zy7ITc>$Ni_T23bzc5<$um^KqbwM8 z>Xh!AU=f4*&q>4OBgj*1M?n%?npNPRemF=E zItEg}aAoPNg?mQ@Tc<1iyecj$*=oKz`L@jR2K;3GQNE3XUl68POUz@GJN^FvTR51= literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/left-foot.png b/documentation/demos/demo34/goblins/goblin/left-foot.png new file mode 100755 index 0000000000000000000000000000000000000000..89c142b7cfb27cdd003d399da5e44e52ef2d55a6 GIT binary patch literal 5684 zcmbVQXE5t@J7x>zamyW#OZa7oF)z(8=IG#HC>m4qlLDE#4oLO~ZAAip3C-jM*p_zC>O zfI#~>0ZU1Gd;f{+ zFKs`(G5UYq_>bCtCP6-ENn^Ah)*t75Q4be^f4~>H`|pPSC|-C2H^8}H6vfdCfpzxx zMq}{W2xb0@6EMmh1y@JNsY%H}6f|H^btDu5QB#M=Ak;M!naV779~` zO3BJe%Ocbv5C{^gCMT<@p)Mz@4n?TJkPx|lu-X_uyd%aL{f}Mu3%h?~q5l;N*TA72 z@mQP*7VGs-2N=3x@mN1MtPfD*HVi0g?v6oW1O3GQl;>a3BG5SZ05nPyhxG>jm0!5~ zf3T0#KqA!SU@~e5S;U{X6_A=x#D%OO1wp9EBcS|$V^RN~oJn3dBl)K}{!g>~vvtvd zf5d;c{>9?o!-K|LObqT~G~QO4SpxtpC~btA31M3I9fToLl}U3U{GM&5Xo{+g;E@%l zCu5=3E}VB@>=b5mW``j$9gi^RRa}%mi7p_t%{jPm4mcD= z-83wXt_J81snK*wF;RR}$q|%=p>D5P?b7jf5<|#+pVIoe7J^L3c-j?n-mWszwWN#= zA;#`Z@&{56^+qSU=UbTv$Cvgp!APFGvcfD`o=e=xQyPm)Sjrnew)9(0v6YmxY{I#- zFS86I-b$Iso6caRoeUKZ-nNnMAkN|RWDw5Z;8L4&oqCy%@i!%;_~4KLWQFZ@;m7eJ zjt+~m+03N(SWT|#rNt_`4a#%Xp!#b;r>jGYCoU21njCG0pkn;RDTw@-x>oHX&$ca% zm&QUP*LaHy3=8UJJAO!N58+K*$}IZ6Nwg~FaVTa)Cml|#2k(>h(|`4y%RuYrRbx44 z83uyWY&MkT6?oK`VuGG;nF?kN8Dz-xJf5t)zmzb@BGK!zscL6vRD4hl66#yqYg}2Ky#6{r;lP+Vc$fc}rY!=y7)99S3T04ZLhL$GjHWkE$mrF5J3kgG zAgpy<&78#stem!$<9{Z&q#2biEk^Qr8>6OnHmzf9*P?0E)>s{tK)-k2>=0qEb;wF? z6-c1^cR=KsbROx2vfgxgavy2xh%+=E-F$^cD=gd9qb47}w0O!_-)3scqqSHQ)26*E zv#S}#TR%(T=lSEUP9*BV4VBFL@IJl7y40RM`BSnk{^gC0V417nn;xtmR*N=Oi-c@k z6gWk0OVuIk2uR1Z99(?0d>zfgNB;gk|1eySk)|~$D>%e%h?D>u(ssCFn34-Bi+q$; zgG?wC`GS;CryV9bp z^cJO9f5LqC#q}v~?$}6dYooKG`-rgKs98~wX-pZD@?COLu+2b(xJcF2cNBcPTsHE+ zU5;;os)_Et-f^nUl#-XCj(1)ZsU39VU-`E&Ii9xxckD%z}mm;Jlz_3j3P>tX!cC3Lw;?R z(mq=5atX0W&O)(n{Bo^u`b_n3OP$9GYVy1&V%_dKT0hlj_i|e>?)#wnjCDo3)}A3- zFpT<{bvWQ`=<5zWw6Nr>Ftyimp-0?JqQUr#*=YOBqa;lI^f|lA!D_LHeR)eLxPX?U z^IC5_10%~iKI(9s2pV-GSlh6X_1xami>)g<_w_AZD2wle;63F;-Mt$)4qhSKBt>u0 z5Pwq7WUi7&q)(tRm9^FHWIIH`iwnQhQJtzITXSm-xn-qV8Uh`)mR9a87SZbTkAU3L zQrpy0D`L3MqkJEHG&QTpX-~SE`6?@5r$38}ZNAEIJ}V}9NK2zCi$w{uTp|rEuM8kC z`Mk8uw@jT1*2ZwlMC~OHretG9#Sa zDZ4(|_7rTgC9aGvKrv27Uq{-|RVNm{D<5CSWA2hkQ?z|xLHgzoL-s!H^AIx@fS;ve z>U{U7`Na<0e%#VsDzfP5tgap1jMWE?O-`WwI{2sFQMKXjS)U+IeC8b`)xy$ z!`POewcYpb+yAm{U)9*UDq72I>B8sF+0kUBIe!v1=`fp$>=vI3Z|s|A2nLmCI8g^g zf^=qwtJE^D)K1eVfEvooTz5KbB9P9ym^K@_l^5lT>&7_y?V@KZ0uX-o$b2g*K zUYIE#_dLH#${#C|`ys%I16;Ffmh*XA>1q2E;n``#YEB^NT(r`x0mgLq2tt%fwl+3) z3p@a^B*a*40;~Y68AqSID^ACuV)`W=aTFl?DZ6%-#+k+_2$IUQ7{mF>;90U;$(L@2 zfzUJ;wdFGTo>07ytxxF7+Zp5cnX*`UoAM(Aw5_z82Orxji^jiO!d`p@EJ+Yy9E<|A zx>4uy3@4R|A%${Ol0`zjZ|-@^EO?Kk#ov6M8f*ezMDN?EupX5?BL$ld)Sb_h9>+IF zaH~-;cG${%kwq+hH(Iv6&vh1i|15eoJc@K$;_k1N3XNE%YSt$2)XVD!Ia4PQAvuxh z=$P3nrQ|i^nkt6T7*3%Sp-b^OU#Yl-bqc1xzn#l?H!XV-@xYh=CMG?IZ$|Qy(Cx(= zOciBkU6E9E;fCZczsLF~O5V;i%e)SB!-+00%+AnF6w!Rjd1!jtoa0s7CnLowTIYX< zopE?EowQyjEIz-cQPuACrAzq>sAR`LcbAyn7D)}_e*I;l1d*P>%W$BWWm52-zE?dF z)7$>-SW}WiY$BKVlOdmdUHi*^4l0Ls$b1NM#2kZjm9cYpdL;1>S+b@}bI!QEF>o^u zqwTHv%bYTA1Z9Z)I)0@iySx6GqJvp)%y`ILgM%0B64jD3)o<|3u_8}Pzy-ngwU2_Dm-sSY)mjG|-JQ@ZEKfY25+x7)HfVa z7)!nJhii`w5~#%om-pu+OmB8Kl``E0JIs?yCboLC^^LL2TRO}YgKDqiqV!(k>dzLY zEi#mLzEIeI44=ssu1w^R%2jiT;kgB1P(0_9KI1K1zW3q)o+qsRljhzDL$EKiIq&_K z9e$;K#JuBn>aaSbnc;NYxypUkVUhsOQOCExA&C z()HLPLH`>y=8i~nh1{M)M=PCFR^RlMtFB?9LOX(reY@3$&3?pl_5xYYxXS18MXULz zAx|2&cc;z8jA`FyGfBMxQWjC)i_;XM!vo@|g?r@j5^=2e@4aFei@SY^!M}i-H1R4Y z>yoNYaeY18Nyz+ZdsV}b_fHQ)_q~xHdt1ss@>?hELMqP=%H@(eCj^V`T>F}&msk`n zOqWdpqZ7>D>+RDuGc{z;45F9~8X+tUYF_-+o}RoD)2om;IQlQerT$ee-ZpZmq%h zBf!QK=(BrfRG{c^IWBr}9zUZ+O&XUj&*OPQ6XUkKhW0)Q_!gOz zp@9F*;#`sKmux%Ew4@wMbocV#z38MQ;Df>|~#rMswDeHZ=8p&|hs^-agnskH9Y213}h|}+v3&0yI+@;p#K}D(3 zQy@4HD#%#f5WEpyB>1Z8!(F4z0KLlD#4XN;AwcT2rQBg78lx`FVn+x1Lw@3$2$LgP zXXB-bQEDe!HAmS7 zZtZOpnq=JC4yRby(y0C1INZ0gs<@YfBBym9zN7|&u3V$^U?8+LGhTj5Z(@>M!Zumu za%DI{EgyTg>BwU!U#HVc1;rgXkXTtV41G#RHR*Eiw#*m7NT@2Xe2b_$b&T41*Nrk% z&9@~pZ%rV#jrXCizO-Vaqi?9+$z-b8(C5e`E@J%Z+#o;sQ`CC1r`=}=I@PL&r>LQZ zR#h@A;kQT$bxp!>0Nl!o!Epc-TYBA=XRnS>KoQ_m2RtPgNMq+r@p#=96_??C3xMkdtvw23$x@TS<;mENcRME zQV$%M`GV)^@*;f>(^f|Oa4#K8Oh#%&-5u3j|y-DhB2Qdl4Q(b<^3gk$5gc*dwi;3&k2~*rhlI~8FhElYkE62 z*=k(D?g>|GCz+~>O~mpIqU~AQ?d-@)B|@dbf}JSCxXX`XC_Uh2vvUB@?awJexA}4IE@|^q#|>N~!m1!1*9?l&Lj?^=`J6*T#UD?iWl9T}D+LHDDT! zJ3@SdD>8)r7@XkNErWvc&^zd$}S|09i+J%jHlZ#c)! z`^L=xRQ4r{)0!gV$;Lq{SGZm#$^5Nmy^7>LGSHKlB}*`#VuCB(->b{n)gY!Iat85P zH++!mQKdf!7AHxs)fem<)Wb9q^32M^wR!Nt$G|Zz!5{AvO3qy;t189GzuoE;ztN!) zV(rwGGh25H^nreSE@0qV_0RspyxF3p`^@jkzB8(!?teo?(*&#TLi72D_%`z$&4+?X6g>A;^CKX)Kp+(OHKdunBDj&D7xlt^?Qb!)6cGsx+#7! zF?QL2S8c?QSXr!>+264@9(YOV!B*Kv5}=$#ZeLdVjC;t`=C@6CT3bo$FL9rMjg8#L zg8ez4!V37_*V%>m^hTD{UQz%2(5a6lKdRVO zdYP;*P;Sj+^&B&QwQRhhkkiKMjc6m8AH!`YD$umzSR?9*E#EC^HMTPbW$GyH(&`Ek zmc&%g{$E_Tq}dmhdjTCOW8 z1&Z3^*w$`FItesyu&~bT6%k?GMZ_l9Kq5ce^_Y5-KNtz+o(DM( qhZI;c3c8<@npfV5&arkWJ*6!{uk-}uz99MYA6FZxkEl|2i2NVE2SQ{3 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/left-hand.png b/documentation/demos/demo34/goblins/goblin/left-hand.png new file mode 100755 index 0000000000000000000000000000000000000000..39700f0140ee3215fa7b068cb30b3e86bd4f360f GIT binary patch literal 4632 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 RQ$NpYtjz2Q)ux^a{{sYl5!(O& literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/left-lower-leg.png b/documentation/demos/demo34/goblins/goblin/left-lower-leg.png new file mode 100755 index 0000000000000000000000000000000000000000..dd3e83b671edb3654d39b95814a3a69751bf016e GIT binary patch literal 6111 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 A00000 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/left-shoulder.png b/documentation/demos/demo34/goblins/goblin/left-shoulder.png new file mode 100755 index 0000000000000000000000000000000000000000..220b09cbf6d646dbfc4a2829554f5d5fdfc7542e GIT binary patch literal 4008 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 N+1|zxUyk#O{~ye~>+%2q literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/left-upper-leg.png b/documentation/demos/demo34/goblins/goblin/left-upper-leg.png new file mode 100755 index 0000000000000000000000000000000000000000..a031cf6827610f352c4eae6dff6a561dcba20345 GIT binary patch literal 5738 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/neck.png b/documentation/demos/demo34/goblins/goblin/neck.png new file mode 100755 index 0000000000000000000000000000000000000000..f4f3f04dc929d19aadba6c314e50886261edbf0b GIT binary patch literal 4488 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 byQInE@AZ~bSh4N*uW}Uy4b(e1%i#Y3y`S)W literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/right-arm.png b/documentation/demos/demo34/goblins/goblin/right-arm.png new file mode 100755 index 0000000000000000000000000000000000000000..c7b752bb2edd0cf780526d91860e2fbe5e70b5ec GIT binary patch literal 3749 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 JE3JLw{sY=bZL0tP literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/right-foot.png b/documentation/demos/demo34/goblins/goblin/right-foot.png new file mode 100755 index 0000000000000000000000000000000000000000..ce982d31000a558e330238254b28a425c654f346 GIT binary patch literal 5998 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/right-hand.png b/documentation/demos/demo34/goblins/goblin/right-hand.png new file mode 100755 index 0000000000000000000000000000000000000000..2363fba02c8eee201e3376f175bb94b54ff75af3 GIT binary patch literal 4174 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 Vt!`t?@6Llid}F*ht{m$U@jv&|GVA~V literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/right-lower-leg.png b/documentation/demos/demo34/goblins/goblin/right-lower-leg.png new file mode 100755 index 0000000000000000000000000000000000000000..b9bb49654ad69ffeab9264d1633f63339fa7b2ab GIT binary patch literal 6365 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 Awg3PC literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/right-shoulder.png b/documentation/demos/demo34/goblins/goblin/right-shoulder.png new file mode 100755 index 0000000000000000000000000000000000000000..48baa266cea39c9423c2f8e264c65ebfb3771550 GIT binary patch literal 4754 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblin/torso.png b/documentation/demos/demo34/goblins/goblin/torso.png new file mode 100755 index 0000000000000000000000000000000000000000..f9b4314aea092a045c832b11b6516f233072c05d GIT binary patch literal 14342 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 XMqO17bCb(If9A1ONcQKJ0Of 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 ATL1t6 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/eyes-closed.png b/documentation/demos/demo34/goblins/goblingirl/eyes-closed.png new file mode 100755 index 0000000000000000000000000000000000000000..d6826843c2e707f96c3f7473348e2e01d2b9cef5 GIT binary patch literal 2955 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/left-foot.png b/documentation/demos/demo34/goblins/goblingirl/left-foot.png new file mode 100755 index 0000000000000000000000000000000000000000..e1adb405eba201d73810c0c78dc57368446c6fc4 GIT binary patch literal 5536 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/left-hand.png b/documentation/demos/demo34/goblins/goblingirl/left-hand.png new file mode 100755 index 0000000000000000000000000000000000000000..e070bf29bfe180494b4e5dfce9d54ef2c7b984ff GIT binary patch literal 4357 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 H4iWzcLnWt> literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/left-lower-leg.png b/documentation/demos/demo34/goblins/goblingirl/left-lower-leg.png new file mode 100755 index 0000000000000000000000000000000000000000..346866ffcb76c6aceaa9dfab4ed0eb590da495c6 GIT binary patch literal 5862 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 G*#7_)g`2_v literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/left-shoulder.png b/documentation/demos/demo34/goblins/goblingirl/left-shoulder.png new file mode 100755 index 0000000000000000000000000000000000000000..0cb53d4596af7b216673591f26c4aab5c5aeb1d4 GIT binary patch literal 4144 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 F{{R(WR@MLj literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/left-upper-leg.png b/documentation/demos/demo34/goblins/goblingirl/left-upper-leg.png new file mode 100755 index 0000000000000000000000000000000000000000..be09a93033b6514ec317040fc7c5687f684bac92 GIT binary patch literal 5417 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/neck.png b/documentation/demos/demo34/goblins/goblingirl/neck.png new file mode 100755 index 0000000000000000000000000000000000000000..14b62b3cf2e27d7be0cf19a4547b697c79bfcd2d GIT binary patch literal 4663 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
    p^Wm%Lg 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/right-arm.png b/documentation/demos/demo34/goblins/goblingirl/right-arm.png new file mode 100755 index 0000000000000000000000000000000000000000..5818fc62743642eb2be63b0239570e79bcad2f94 GIT binary patch literal 4312 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 UJ!UHS^IwB0)(Uga$UXZ104v~v&Hw-a literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/right-foot.png b/documentation/demos/demo34/goblins/goblingirl/right-foot.png new file mode 100755 index 0000000000000000000000000000000000000000..716f4f0928549bdcbffd4e5ea7b487fb190893da GIT binary patch literal 5813 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/right-hand.png b/documentation/demos/demo34/goblins/goblingirl/right-hand.png new file mode 100755 index 0000000000000000000000000000000000000000..cd5eadce4464014918d161af81c2881dc90de74a GIT binary patch literal 4050 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 HkGTH>(3kyT literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/right-lower-leg.png b/documentation/demos/demo34/goblins/goblingirl/right-lower-leg.png new file mode 100755 index 0000000000000000000000000000000000000000..f1357209cfd69a5e7079fec24b3f663faaad3934 GIT binary patch literal 6070 zcmbVQXEC+!yqY=Q2qeA)seNwxrx~Qi4h^Vd0e0Y0C^>Xhn>9(77s#W9i813z*{dnz#wOg0@zGSS4`JK z73<`z8Q_IA3eYpQ4{))EVZcg?AbEo91%VqDZwDf{xw?DH5){CH@ycGT|F}iLpua-! zE(+kkMVadwfK+i_Sdf&6gs{DsxHt$36%m(|fiR3%8;`>NuZ;f~?QQJuffYqzy>UKX_80r%!2J*SqIds2(VxHzHM06%&KH|v z=Ze7D`?z7<@koRM_~MHQ#u+0EM@XxPNsGf&p%AzlL|j}2E-s0HtHNX?WYnakA*%my z{3k3zLK3c~CIy#5s9qq|ATSvzF&Ioj8YXe!gu)^JV3F?LcsqA{>_2&(FY^8itMXs5 zvZ`KKJ3P+I7>9HHX95hIaCn@z6V3yqY6J!GnK`>-aDLwWf41lEY7tm3XJ0Hv-3#Xi z`m4XP&i^65Dgr7EgGoVDAySAxb;H!uAqd2U8ZmK%iVWgH``=j1|EFi77h**J49EW& zmVaCq6ZmKO@6o?7{(X3`?iVM<>*8qafunW-0Oqeqgo-g?iZi~CzEcdSb{_wOPcDfm zB8D%7mcjsmFfvw^wo)d(ruPKI5$tl3&NydnzRBnssB>Gt+DvMouOFs~@eBn~Y;nm5 zL>3ipJ#B)rn)suIl_j>G6_8OpUfuV#g)7fC_?-lFeJU0zlc?(h=A7D;&+??Lf|5O$``9J99~mQyo)-lSdnbm8(UBYA zAt}&=xS-S7&CA@NYG$RB^|CF39Mn_?@u{wb~iovm!p^8mY=jk{LXk}=$-CxHV zc~Y9DwyIj=jgm`{;a&1(uIzoZ{SUJIC76ZB1zRbp7$*1Z%F!57$XMm3Vp&>>@eWCc zQmbC${2kM^qMD;e(pBSqbMuDgTu zCXvkA4}%`G25!wfT-vQO7+#B&TPqFXc~}z0|cLB0OgcsfaVIAmd{TEk`DrnQ=>TR zcgMt*vg_KKQI#Aoisk}|LMk7qUk=gie&@BY-%R%x#4{gKyGKu(+ur%Yf6dm;&9;sf zXxw#`we2ir5ecksTB2IihDPWlR71V zoA2Xc=B3BqKYzKdfCPo{eqb_AN{C9QX?F;pbST+oxwi3RS|;b|-Bu}oy(`yVvrr(3 z18iJFm7X8Fo|2&^$9j6hz9%nMYLhxKNgBUBR7cxkGI9 z?pW<$?vsHs1@@sAfOyjucOw;+Tz_0z)73Bd%Y00QMT=yKN1-hID5IgFuNo*LR1w^G zo051+PC-w_BNMx{A}o>P-TTP3)4`u8-;pWj2RqDpmiIe~_G}wg>jOK`^=7c&o}Bi* z%8c1N&l+BPH71{voAMGan$gX@ZHv4|zOI!1=+-Ox+u;1|+x0WXUv#M2D_vYk^v-G@ zSy^iY<4DV$G<(BH^LHZ4pW*z|@=Owoa_+rpojwMnzQYTtbE_r9s3!8E=lUg{iPyVu zB*3f(*gkqLvd<9bYV2ddD8OXxZOeK)ULY+?YLy9BK=DiSzChz`=Z(%zpnD)}p!S
    ?e3A?L%*sttXRlpwe0yhxo0(b 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/right-upper-leg.png b/documentation/demos/demo34/goblins/goblingirl/right-upper-leg.png new file mode 100755 index 0000000000000000000000000000000000000000..d6dae75c556d8b52b5c390914e61c1ea119e0b94 GIT binary patch literal 5317 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/torso.png b/documentation/demos/demo34/goblins/goblingirl/torso.png new file mode 100755 index 0000000000000000000000000000000000000000..2a92320d0831e4fd2cbbca508c5838172d4f38c6 GIT binary patch literal 14125 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 NNs7ve)C&C!{6CoMhS&fA literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/goblins/goblingirl/undie-straps.png b/documentation/demos/demo34/goblins/goblingirl/undie-straps.png new file mode 100755 index 0000000000000000000000000000000000000000..36913d570360e2d547d5db7dcad07556d0f0554c GIT binary patch literal 3823 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 E02^Ip?eTK8nPP^^6~(<+&KOM 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 literal 0 HcmV?d00001 diff --git a/documentation/demos/demo34/index.html b/documentation/demos/demo34/index.html index cfc46f61..c088d5a1 100755 --- a/documentation/demos/demo34/index.html +++ b/documentation/demos/demo34/index.html @@ -1,10 +1,51 @@ + + + + + + + +

    + + + + CAAT example: UI.Label + + + + + + + +
    + + +
    + +
    +
    +

    Label

    +
    +
    + +
    +
    +
    +

    Controls:

    +
      +
    • None.
    • +
    +
    +
    +

    + This demo features the following elements: +

    +
      +
    • UI.Label object
    • +
    • Defining styles
    • +
    • Adding anchors
    • +
    • Mixing images and text
    • +
    +
    +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/documentation/demos/demo36/spritemap.html b/documentation/demos/demo36/spritemap.html new file mode 100644 index 00000000..49644bd3 --- /dev/null +++ b/documentation/demos/demo36/spritemap.html @@ -0,0 +1,262 @@ + + + + + CAAT example: UI.Label + + + + + + + +
    + + +
    + +
    +
    +

    Label

    +
    +
    + +
    +
    +
    +

    Controls:

    +
      +
    • None.
    • +
    +
    +
    +

    + This demo features the following elements: +

    +
      +
    • UI.Label object
    • +
    • Defining styles
    • +
    • Adding anchors
    • +
    • Mixing images and text
    • +
    +
    +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/documentation/jsdoc/symbols/CAAT.Class.html b/documentation/jsdoc/symbols/CAAT.Class.html new file mode 100644 index 00000000..d21ea68f --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Class.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Class + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Class +

    + + +

    + + + + + + +
    Defined in: ModuleManager.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      +
    + CAAT.Class() +
    +
    +
    + + + + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Class() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:22:41 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton#SkeletonActor.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton#SkeletonActor.html new file mode 100644 index 00000000..ca3c1705 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Skeleton#SkeletonActor.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.Skeleton#SkeletonActor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Skeleton#SkeletonActor +

    + + +

    + + + + + + +
    Defined in: SkeletonActor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Skeleton#SkeletonActor() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:22:45 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Bone.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Bone.js.html new file mode 100644 index 00000000..6894ed9e --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Bone.js.html @@ -0,0 +1,514 @@ +
      1 /**
    +  2  * Created with JetBrains WebStorm.
    +  3  * User: ibon
    +  4  * Date: 3/21/13
    +  5  * Time: 7:51 PM
    +  6  * To change this template use File | Settings | File Templates.
    +  7  */
    +  8 CAAT.Module({
    +  9 
    + 10     /**
    + 11      * @name Skeleton
    + 12      * @memberof CAAT.Module
    + 13      * @namespace
    + 14      */
    + 15 
    + 16     /**
    + 17      * @name Bone
    + 18      * @memberof CAAT.Module.Skeleton
    + 19      * @constructor
    + 20      */
    + 21 
    + 22     defines : "CAAT.Module.Skeleton.Bone",
    + 23     depends : [
    + 24         "CAAT.Behavior.Interpolator",
    + 25         "CAAT.Behavior.RotateBehavior",
    + 26         "CAAT.Behavior.PathBehavior",
    + 27         "CAAT.Behavior.ScaleBehavior",
    + 28         "CAAT.Behavior.ContainerBehavior"
    + 29     ],
    + 30     extendsWith : function() {
    + 31 
    + 32 
    + 33         /**
    + 34          * @lends CAAT.Module.Skeleton.Bone.prototype
    + 35          */
    + 36 
    + 37         var defPoint = { x: 0, y: 0 };
    + 38         var defScale = { scaleX: 1, scaleY: 1 };
    + 39         var defAngle = 0;
    + 40 
    + 41         var cangle;
    + 42         var cscale;
    + 43         var cpoint;
    + 44 
    + 45         function fntr(behavior, orgtime, time, actor, value) {
    + 46             cpoint= value;
    + 47         }
    + 48 
    + 49         function fnsc(behavior, orgtime, time, actor, value) {
    + 50             cscale= value;
    + 51         }
    + 52 
    + 53         function fnrt(behavior, orgtime, time, actor, value) {
    + 54             cangle= value;
    + 55         }
    + 56 
    + 57         return {
    + 58             id : null,
    + 59 
    + 60             wx : 0,
    + 61             wy : 0,
    + 62             wrotationAngle : 0,
    + 63             wscaleX : 0,
    + 64             wscaleY : 0,
    + 65 
    + 66             /**
    + 67              * Bone x position relative parent
    + 68              * @type number
    + 69              */
    + 70             x : 0,
    + 71 
    + 72             /**
    + 73              * Bone y position relative parent
    + 74              * @type {number}
    + 75              */
    + 76             y : 0,
    + 77 
    + 78             positionAnchorX : 0,
    + 79             positionAnchorY : 0,
    + 80 
    + 81             /**
    + 82              * Bone rotation angle
    + 83              * @type {number}
    + 84              */
    + 85             rotationAngle : 0,
    + 86             rotationAnchorX : 0,
    + 87             rotationAnchorY : 0.5,
    + 88 
    + 89             scaleX : 1,
    + 90             scaleY : 1,
    + 91             scaleAnchorX : .5,
    + 92             scaleAnchorY : .5,
    + 93 
    + 94             /**
    + 95              * Bone size.
    + 96              * @type number
    + 97              */
    + 98             size : 0,
    + 99 
    +100             /**
    +101              * @type CAAT.Math.Matrix
    +102              */
    +103             matrix : null,
    +104 
    +105             /**
    +106              * @type CAAT.Math.Matrix
    +107              */
    +108             wmatrix : null,
    +109 
    +110             /**
    +111              * @type CAAT.Skeleton.Bone
    +112              */
    +113             parent : null,
    +114 
    +115             /**
    +116              * @type CAAT.Behavior.ContainerBehavior
    +117              */
    +118             keyframesTranslate : null,
    +119 
    +120             /**
    +121              * @type CAAT.PathUtil.Path
    +122              */
    +123             keyframesTranslatePath : null,
    +124 
    +125             /**
    +126              * @type CAAT.Behavior.ContainerBehavior
    +127              */
    +128             keyframesScale : null,
    +129 
    +130             /**
    +131              * @type CAAT.Behavior.ContainerBehavior
    +132              */
    +133             keyframesRotate : null,
    +134 
    +135             /**
    +136              * @type object
    +137              */
    +138             keyframesByAnimation : null,
    +139 
    +140             currentAnimation : null,
    +141 
    +142             /**
    +143              * @type Array.<CAAT.Skeleton.Bone>
    +144              */
    +145             children : null,
    +146 
    +147             behaviorApplicationTime : -1,
    +148 
    +149             __init : function(id) {
    +150                 this.id= id;
    +151                 this.matrix= new CAAT.Math.Matrix();
    +152                 this.wmatrix= new CAAT.Math.Matrix();
    +153                 this.parent= null;
    +154                 this.children= [];
    +155 
    +156                 this.keyframesByAnimation = {};
    +157 
    +158                 return this;
    +159             },
    +160 
    +161             setBehaviorApplicationTime : function(t) {
    +162                 this.behaviorApplicationTime= t;
    +163                 return this;
    +164             },
    +165 
    +166             __createAnimation : function(name) {
    +167 
    +168                 var keyframesTranslate= new CAAT.Behavior.ContainerBehavior(true).setCycle(true, true).setId("keyframes_tr");
    +169                 var keyframesScale= new CAAT.Behavior.ContainerBehavior(true).setCycle(true, true).setId("keyframes_sc");
    +170                 var keyframesRotate= new CAAT.Behavior.ContainerBehavior(true).setCycle(true, true).setId("keyframes_rt");
    +171 
    +172                 keyframesTranslate.addListener( { behaviorApplied : fntr });
    +173                 keyframesScale.addListener( { behaviorApplied : fnsc });
    +174                 keyframesRotate.addListener( { behaviorApplied : fnrt });
    +175 
    +176                 var animData= {
    +177                     keyframesTranslate  : keyframesTranslate,
    +178                     keyframesScale      : keyframesScale,
    +179                     keyframesRotate     : keyframesRotate
    +180                 };
    +181 
    +182                 this.keyframesByAnimation[name]= animData;
    +183 
    +184                 return animData;
    +185             },
    +186 
    +187             __getAnimation : function(name) {
    +188                 var animation= this.keyframesByAnimation[ name ];
    +189                 if (!animation) {
    +190                     animation= this.__createAnimation(name);
    +191                 }
    +192 
    +193                 return animation;
    +194             },
    +195 
    +196             /**
    +197              *
    +198              * @param parent {CAAT.Skeleton.Bone}
    +199              * @returns {*}
    +200              */
    +201             __setParent : function( parent ) {
    +202                 this.parent= parent;
    +203                 return this;
    +204             },
    +205 
    +206             addBone : function( bone ) {
    +207                 this.children.push(bone);
    +208                 bone.__setParent(this);
    +209                 return this;
    +210             },
    +211 
    +212             __noValue : function( keyframes ) {
    +213                 keyframes.doValueApplication= false;
    +214                 if ( keyframes instanceof CAAT.Behavior.ContainerBehavior ) {
    +215                     this.__noValue( keyframes );
    +216                 }
    +217             },
    +218 
    +219             __setInterpolator : function(behavior, curve) {
    +220                 if (curve && curve!=="stepped") {
    +221                     behavior.setInterpolator(
    +222                             new CAAT.Behavior.Interpolator().createQuadricBezierInterpolator(
    +223                                     new CAAT.Math.Point(0,0),
    +224                                     new CAAT.Math.Point(curve[0], curve[1]),
    +225                                     new CAAT.Math.Point(curve[2], curve[3])
    +226                             )
    +227                     );
    +228                 }
    +229             },
    +230 
    +231             /**
    +232              *
    +233              * @param name {string} keyframe animation name
    +234              * @param angleStart {number} rotation start angle
    +235              * @param angleEnd {number} rotation end angle
    +236              * @param timeStart {number} keyframe start time
    +237              * @param timeEnd {number} keyframe end time
    +238              * @param curve {Array.<number>=} 4 numbers definint a quadric bezier info. two first points
    +239              *  assumed to be 0,0.
    +240              */
    +241             addRotationKeyframe : function( name, angleStart, angleEnd, timeStart, timeEnd, curve ) {
    +242 
    +243                 var as= 2*Math.PI*angleStart/360;
    +244                 var ae= 2*Math.PI*angleEnd/360;
    +245 
    +246                 // minimum distant between two angles.
    +247 
    +248                 if ( as<-Math.PI ) {
    +249                     if (Math.abs(as+this.rotationAngle)>2*Math.PI) {
    +250                         as= -(as+Math.PI);
    +251                     } else {
    +252                         as= (as+Math.PI);
    +253                     }
    +254                 } else if (as > Math.PI) {
    +255                     as -= 2 * Math.PI;
    +256                 }
    +257 
    +258                 if ( ae<-Math.PI ) {
    +259 
    +260                     if (Math.abs(ae+this.rotationAngle)>2*Math.PI) {
    +261                         ae= -(ae+Math.PI);
    +262                     } else {
    +263                         ae= (ae+Math.PI);
    +264                     }
    +265                 } else if ( ae>Math.PI ) {
    +266                     ae-=2*Math.PI;
    +267                 }
    +268 
    +269                 angleStart= -as;
    +270                 angleEnd= -ae;
    +271 
    +272                 var behavior= new CAAT.Behavior.RotateBehavior().
    +273                         setFrameTime( timeStart, timeEnd-timeStart+1).
    +274                         setValues( angleStart, angleEnd, 0, .5).
    +275                         setValueApplication(false);
    +276 
    +277                 this.__setInterpolator( behavior, curve );
    +278 
    +279                 var animation= this.__getAnimation(name);
    +280                 animation.keyframesRotate.addBehavior(behavior);
    +281             },
    +282 
    +283             endRotationKeyframes : function(name) {
    +284 
    +285             },
    +286 
    +287             addTranslationKeyframe : function( name, startX, startY, endX, endY, timeStart, timeEnd, curve ) {
    +288                 var behavior= new CAAT.Behavior.PathBehavior().
    +289                     setFrameTime( timeStart, timeEnd-timeStart+1).
    +290                     setValues( new CAAT.PathUtil.Path().
    +291                         setLinear( startX, startY, endX, endY )
    +292                     ).
    +293                     setValueApplication(false);
    +294 
    +295                 this.__setInterpolator( behavior, curve );
    +296 
    +297                 var animation= this.__getAnimation(name);
    +298                 animation.keyframesTranslate.addBehavior( behavior );
    +299             },
    +300 
    +301             addScaleKeyframe : function( name, scaleX, endScaleX, scaleY, endScaleY, timeStart, timeEnd, curve ) {
    +302                 var behavior= new CAAT.Behavior.ScaleBehavior().
    +303                     setFrameTime( timeStart, timeEnd-timeStart+1).
    +304                     setValues( scaleX, endScaleX, scaleY, endScaleY ).
    +305                     setValueApplication(false);
    +306 
    +307                 this.__setInterpolator( behavior, curve );
    +308 
    +309                 var animation= this.__getAnimation(name);
    +310                 animation.keyframesScale.addBehavior( behavior );
    +311             },
    +312 
    +313             endTranslationKeyframes : function(name) {
    +314 
    +315             },
    +316 
    +317             setSize : function(s) {
    +318                 this.width= s;
    +319                 this.height= 0;
    +320             },
    +321 
    +322             endScaleKeyframes : function(name) {
    +323 
    +324             },
    +325 
    +326             setPosition : function( x, y ) {
    +327                 this.x= x;
    +328                 this.y= -y;
    +329                 return this;
    +330             } ,
    +331 
    +332             /**
    +333              * default anchor values are for spine tool.
    +334              * @param angle {number}
    +335              * @param anchorX {number=}
    +336              * @param anchorY {number=}
    +337              * @returns {*}
    +338              */
    +339             setRotateTransform : function( angle, anchorX, anchorY ) {
    +340                 this.rotationAngle= -angle*2*Math.PI/360;
    +341                 this.rotationAnchorX= typeof anchorX!=="undefined" ? anchorX : 0;
    +342                 this.rotationAnchorY= typeof anchorY!=="undefined" ? anchorY : .5;
    +343                 return this;
    +344             },
    +345 
    +346             /**
    +347              *
    +348              * @param sx {number}
    +349              * @param sy {number}
    +350              * @param anchorX {number=} anchorX: .5 by default
    +351              * @param anchorY {number=} anchorY. .5 by default
    +352              * @returns {*}
    +353              */
    +354             setScaleTransform : function( sx, sy, anchorX, anchorY ) {
    +355                 this.scaleX= sx;
    +356                 this.scaleY= sy;
    +357                 this.scaleAnchorX= typeof anchorX!=="undefined" ? anchorX : .5;
    +358                 this.scaleAnchorY= typeof anchorY!=="undefined" ? anchorY : .5;
    +359                 return this;
    +360             },
    +361 
    +362 
    +363             __setModelViewMatrix : function() {
    +364                 var c, s, _m00, _m01, _m10, _m11;
    +365                 var mm0, mm1, mm2, mm3, mm4, mm5;
    +366                 var mm;
    +367 
    +368                 var mm = this.matrix.matrix;
    +369 
    +370                 mm0 = 1;
    +371                 mm1 = 0;
    +372                 mm3 = 0;
    +373                 mm4 = 1;
    +374 
    +375                 mm2 = this.wx - this.positionAnchorX * this.width;
    +376                 mm5 = this.wy - this.positionAnchorY * this.height;
    +377 
    +378                 if (this.wrotationAngle) {
    +379 
    +380                     var rx = this.rotationAnchorX * this.width;
    +381                     var ry = this.rotationAnchorY * this.height;
    +382 
    +383                     mm2 += mm0 * rx + mm1 * ry;
    +384                     mm5 += mm3 * rx + mm4 * ry;
    +385 
    +386                     c = Math.cos(this.wrotationAngle);
    +387                     s = Math.sin(this.wrotationAngle);
    +388                     _m00 = mm0;
    +389                     _m01 = mm1;
    +390                     _m10 = mm3;
    +391                     _m11 = mm4;
    +392                     mm0 = _m00 * c + _m01 * s;
    +393                     mm1 = -_m00 * s + _m01 * c;
    +394                     mm3 = _m10 * c + _m11 * s;
    +395                     mm4 = -_m10 * s + _m11 * c;
    +396 
    +397                     mm2 += -mm0 * rx - mm1 * ry;
    +398                     mm5 += -mm3 * rx - mm4 * ry;
    +399                 }
    +400                 if (this.wscaleX != 1 || this.wscaleY != 1) {
    +401 
    +402                     var sx = this.scaleAnchorX * this.width;
    +403                     var sy = this.scaleAnchorY * this.height;
    +404 
    +405                     mm2 += mm0 * sx + mm1 * sy;
    +406                     mm5 += mm3 * sx + mm4 * sy;
    +407 
    +408                     mm0 = mm0 * this.wscaleX;
    +409                     mm1 = mm1 * this.wscaleY;
    +410                     mm3 = mm3 * this.wscaleX;
    +411                     mm4 = mm4 * this.wscaleY;
    +412 
    +413                     mm2 += -mm0 * sx - mm1 * sy;
    +414                     mm5 += -mm3 * sx - mm4 * sy;
    +415                 }
    +416 
    +417                 mm[0] = mm0;
    +418                 mm[1] = mm1;
    +419                 mm[2] = mm2;
    +420                 mm[3] = mm3;
    +421                 mm[4] = mm4;
    +422                 mm[5] = mm5;
    +423 
    +424                 if (this.parent) {
    +425                     this.wmatrix.copy(this.parent.wmatrix);
    +426                     this.wmatrix.multiply(this.matrix);
    +427                 } else {
    +428                     this.wmatrix.identity();
    +429                 }
    +430             },
    +431 
    +432             setAnimation : function(name) {
    +433                 var animation= this.keyframesByAnimation[name];
    +434                 if (animation) {
    +435                     this.keyframesRotate= animation.keyframesRotate;
    +436                     this.keyframesScale= animation.keyframesScale;
    +437                     this.keyframesTranslate= animation.keyframesTranslate;
    +438                 }
    +439 
    +440                 for( var i= 0, l=this.children.length; i<l; i+=1 ) {
    +441                     this.children[i].setAnimation(name);
    +442                 }
    +443             },
    +444 
    +445             /**
    +446              * @param time {number}
    +447              */
    +448             apply : function( time, animationTime ) {
    +449 
    +450                 cpoint= defPoint;
    +451                 cangle= defAngle;
    +452                 cscale= defScale;
    +453 
    +454                 if (this.keyframesTranslate) {
    +455                     this.keyframesTranslate.apply(time);
    +456                 }
    +457 
    +458                 if ( this.keyframesRotate ) {
    +459                     this.keyframesRotate.apply(time);
    +460                 }
    +461 
    +462                 if ( this.keyframesScale ) {
    +463                     this.keyframesScale.apply(time);
    +464                 }
    +465 
    +466                 this.wx= cpoint.x + this.x;
    +467                 this.wy= cpoint.y + this.y;
    +468 
    +469                 this.wrotationAngle = cangle + this.rotationAngle;
    +470 
    +471                 this.wscaleX= cscale.scaleX * this.scaleX;
    +472                 this.wscaleY= cscale.scaleY * this.scaleY;
    +473 
    +474                 this.__setModelViewMatrix();
    +475 
    +476                 for( var i=0; i<this.children.length; i++ ) {
    +477                     this.children[i].apply(time);
    +478                 }
    +479             },
    +480 
    +481             transformContext : function(ctx) {
    +482                 var m= this.wmatrix.matrix;
    +483                 ctx.transform( m[0], m[3], m[1], m[4], m[2], m[5] );
    +484             },
    +485 
    +486             paint : function( actorMatrix, ctx ) {
    +487                 ctx.save();
    +488                     this.transformContext(ctx);
    +489 
    +490                     ctx.strokeStyle= 'blue';
    +491                     ctx.beginPath();
    +492                     ctx.moveTo(0,-2);
    +493                     ctx.lineTo(this.width,this.height);
    +494                     ctx.lineTo(0,2);
    +495                     ctx.lineTo(0,-2);
    +496                     ctx.stroke();
    +497                 ctx.restore();
    +498 
    +499                 for( var i=0; i<this.children.length; i++ ) {
    +500                     this.children[i].paint(actorMatrix, ctx);
    +501                 }
    +502 
    +503 
    +504             }
    +505         }
    +506     }
    +507 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_BoneActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_BoneActor.js.html new file mode 100644 index 00000000..c67f389d --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_BoneActor.js.html @@ -0,0 +1,265 @@ +
      1 CAAT.Module({
    +  2 
    +  3 
    +  4     /**
    +  5      * @name BoneActor
    +  6      * @memberof CAAT.Module.Skeleton
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Module.Skeleton.BoneActor",
    + 11     depends : [
    + 12         "CAAT.Module.Skeleton.BoneActorAttachment"
    + 13     ],
    + 14     extendsWith : function() {
    + 15 
    + 16         return {
    + 17 
    + 18             /**
    + 19              * @lends CAAT.Module.Skeleton.BoneActor.prototype
    + 20              */
    + 21 
    + 22             bone    : null,
    + 23             skinInfo : null,
    + 24             skinInfoByName : null,
    + 25             currentSkinInfo : null,
    + 26             skinDataKeyframes : null,
    + 27             parent : null,
    + 28             worldModelViewMatrix : null,
    + 29             skinMatrix : null,  // compositon of bone + skin info
    + 30             AABB : null,
    + 31 
    + 32             /**
    + 33              * @type {object}
    + 34              * @map {string}, { x:{number}, y: {number} }
    + 35              */
    + 36             attachments : null,
    + 37 
    + 38             __init : function() {
    + 39                 this.skinInfo= [];
    + 40                 this.worldModelViewMatrix= new CAAT.Math.Matrix();
    + 41                 this.skinMatrix= new CAAT.Math.Matrix();
    + 42                 this.skinInfoByName= {};
    + 43                 this.skinDataKeyframes= [];
    + 44                 this.attachments= [];
    + 45                 this.AABB= new CAAT.Math.Rectangle();
    + 46             },
    + 47 
    + 48             addAttachment : function( id, normalized_x, normalized_y, callback ) {
    + 49 
    + 50                 this.attachments.push( new CAAT.Module.Skeleton.BoneActorAttachment(id, normalized_x, normalized_y, callback) );
    + 51             },
    + 52 
    + 53             addAttachmentListener : function( al ) {
    + 54 
    + 55             },
    + 56 
    + 57             setBone : function(bone) {
    + 58                 this.bone= bone;
    + 59                 return this;
    + 60             },
    + 61 
    + 62             addSkinInfo : function( si ) {
    + 63                 if (null===this.currentSkinInfo) {
    + 64                     this.currentSkinInfo= si;
    + 65                 }
    + 66                 this.skinInfo.push( si );
    + 67                 this.skinInfoByName[ si.name ]= si;
    + 68                 return this;
    + 69             },
    + 70 
    + 71             setDefaultSkinInfoByName : function( name ) {
    + 72                 var v= this.skinInfoByName[name];
    + 73                 if (v) {
    + 74                     this.currentSkinInfo= v;
    + 75                 }
    + 76 
    + 77                 return this;
    + 78             },
    + 79 
    + 80             emptySkinDataKeyframe : function() {
    + 81                 this.skinDataKeyframes= [];
    + 82             },
    + 83 
    + 84             addSkinDataKeyframe : function( name, start, duration ) {
    + 85                 this.skinDataKeyframes.push( {
    + 86                     name : name,
    + 87                     start : start,
    + 88                     duration : duration
    + 89                 });
    + 90             },
    + 91 
    + 92             __getCurrentSkinInfo : function(time) {
    + 93                 if ( this.skinDataKeyframes.length ) {
    + 94                     time=(time%1000)/1000;
    + 95 
    + 96                     for( var i=0, l=this.skinDataKeyframes.length; i<l; i+=1 ) {
    + 97                         var sdkf= this.skinDataKeyframes[i];
    + 98                         if ( time>=sdkf.start && time<=sdkf.start+sdkf.duration ) {
    + 99                             return this.currentSkinInfo= this.skinInfoByName[ sdkf.name ];
    +100                         }
    +101                     }
    +102 
    +103                     return null;
    +104                 }
    +105 
    +106                 return this.currentSkinInfo;
    +107             },
    +108 
    +109             paint : function( ctx, time ) {
    +110 
    +111                 var skinInfo= this.__getCurrentSkinInfo(time);
    +112 
    +113                 if (!skinInfo || !skinInfo.image) {
    +114                     return;
    +115                 }
    +116 
    +117                 /*
    +118                     var w= skinInfo.width*.5;
    +119                     var h= skinInfo.height*.5;
    +120 
    +121                     ctx.translate(skinInfo.x, skinInfo.y );
    +122                     ctx.rotate(skinInfo.angle);
    +123                     ctx.scale(skinInfo.scaleX, skinInfo.scaleY);
    +124                     ctx.translate( -w, -h);
    +125                 */
    +126 
    +127                 this.worldModelViewMatrix.transformRenderingContextSet(ctx);
    +128                 skinInfo.matrix.transformRenderingContext( ctx );
    +129                 ctx.drawImage( skinInfo.image, 0, 0, skinInfo.image.width, skinInfo.image.height );
    +130 
    +131             },
    +132 
    +133             setupAnimation : function(time) {
    +134                 this.setModelViewMatrix();
    +135                 this.prepareAABB(time);
    +136                 this.__setupAttachments();
    +137             },
    +138 
    +139             prepareAABB : function(time) {
    +140                 var skinInfo= this.__getCurrentSkinInfo(time);
    +141                 var x=0, y=0, w, h;
    +142 
    +143                 if ( skinInfo ) {
    +144                     w= skinInfo.width;
    +145                     h= skinInfo.height;
    +146                 } else {
    +147                     w= h= 1;
    +148                 }
    +149 
    +150                 var vv= [
    +151                     new CAAT.Math.Point(x,y),
    +152                     new CAAT.Math.Point(x+w,0),
    +153                     new CAAT.Math.Point(x+w, y+h),
    +154                     new CAAT.Math.Point(x, y + h)
    +155                 ];
    +156 
    +157                 var AABB= this.AABB;
    +158                 var vvv;
    +159 
    +160                 /**
    +161                  * cache the bone+skin matrix for later usage in attachment calculations.
    +162                  */
    +163                 var amatrix= this.skinMatrix;
    +164                 amatrix.copy( this.worldModelViewMatrix );
    +165                 amatrix.multiply( this.currentSkinInfo.matrix );
    +166 
    +167                 for( var i=0; i<vv.length; i++ ) {
    +168                     vv[i]= amatrix.transformCoord(vv[i]);
    +169                 }
    +170 
    +171                 var xmin = Number.MAX_VALUE, xmax = -Number.MAX_VALUE;
    +172                 var ymin = Number.MAX_VALUE, ymax = -Number.MAX_VALUE;
    +173 
    +174                 vvv = vv[0];
    +175                 if (vvv.x < xmin) {
    +176                     xmin = vvv.x;
    +177                 }
    +178                 if (vvv.x > xmax) {
    +179                     xmax = vvv.x;
    +180                 }
    +181                 if (vvv.y < ymin) {
    +182                     ymin = vvv.y;
    +183                 }
    +184                 if (vvv.y > ymax) {
    +185                     ymax = vvv.y;
    +186                 }
    +187                 vvv = vv[1];
    +188                 if (vvv.x < xmin) {
    +189                     xmin = vvv.x;
    +190                 }
    +191                 if (vvv.x > xmax) {
    +192                     xmax = vvv.x;
    +193                 }
    +194                 if (vvv.y < ymin) {
    +195                     ymin = vvv.y;
    +196                 }
    +197                 if (vvv.y > ymax) {
    +198                     ymax = vvv.y;
    +199                 }
    +200                 vvv = vv[2];
    +201                 if (vvv.x < xmin) {
    +202                     xmin = vvv.x;
    +203                 }
    +204                 if (vvv.x > xmax) {
    +205                     xmax = vvv.x;
    +206                 }
    +207                 if (vvv.y < ymin) {
    +208                     ymin = vvv.y;
    +209                 }
    +210                 if (vvv.y > ymax) {
    +211                     ymax = vvv.y;
    +212                 }
    +213                 vvv = vv[3];
    +214                 if (vvv.x < xmin) {
    +215                     xmin = vvv.x;
    +216                 }
    +217                 if (vvv.x > xmax) {
    +218                     xmax = vvv.x;
    +219                 }
    +220                 if (vvv.y < ymin) {
    +221                     ymin = vvv.y;
    +222                 }
    +223                 if (vvv.y > ymax) {
    +224                     ymax = vvv.y;
    +225                 }
    +226 
    +227                 AABB.x = xmin;
    +228                 AABB.y = ymin;
    +229                 AABB.x1 = xmax;
    +230                 AABB.y1 = ymax;
    +231                 AABB.width = (xmax - xmin);
    +232                 AABB.height = (ymax - ymin);
    +233             },
    +234 
    +235             setModelViewMatrix : function() {
    +236 
    +237                 if (this.parent) {
    +238                     this.worldModelViewMatrix.copy(this.parent.worldModelViewMatrix);
    +239                     this.worldModelViewMatrix.multiply(this.bone.wmatrix);
    +240 
    +241                 } else {
    +242                     this.worldModelViewMatrix.identity();
    +243                 }
    +244             },
    +245 
    +246             __setupAttachments : function( ) {
    +247                 for( var i= 0, l=this.attachments.length; i<l; i+=1 ) {
    +248                     var attachment= this.attachments[ i ];
    +249                     attachment.transform( this.skinMatrix, this.currentSkinInfo.width, this.currentSkinInfo.height );
    +250                 }
    +251             },
    +252 
    +253             getAttachment : function( id ) {
    +254                 return this.attachments[id];
    +255             }
    +256         }
    +257     }
    +258 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Skeleton.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Skeleton.js.html new file mode 100644 index 00000000..099388a2 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Skeleton.js.html @@ -0,0 +1,290 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name Skeleton
    +  5      * @memberof CAAT.Module.Skeleton
    +  6      * @constructor
    +  7      */
    +  8 
    +  9     defines : "CAAT.Module.Skeleton.Skeleton",
    + 10     depends : [
    + 11         "CAAT.Module.Skeleton.Bone"
    + 12     ],
    + 13     extendsWith : {
    + 14 
    + 15         /**
    + 16          * @lends CAAT.Module.Skeleton.Skeleton.prototype
    + 17          */
    + 18 
    + 19         bones : null,
    + 20         bonesArray : null,
    + 21         animation : null,
    + 22         root  : null,
    + 23         currentAnimationName : null,
    + 24         skeletonDataFromFile : null,
    + 25 
    + 26         __init : function(skeletonDataFromFile) {
    + 27             this.bones= {};
    + 28             this.bonesArray= [];
    + 29             this.animations= {};
    + 30 
    + 31             // bones
    + 32             if (skeletonDataFromFile) {
    + 33                 this.__setSkeleton( skeletonDataFromFile );
    + 34             }
    + 35         },
    + 36 
    + 37         getSkeletonDataFromFile : function() {
    + 38             return this.skeletonDataFromFile;
    + 39         },
    + 40 
    + 41         __setSkeleton : function( skeletonDataFromFile ) {
    + 42             this.skeletonDataFromFile= skeletonDataFromFile;
    + 43             for ( var i=0; i<skeletonDataFromFile.bones.length; i++ ) {
    + 44                 var boneInfo= skeletonDataFromFile.bones[i];
    + 45                 this.addBone(boneInfo);
    + 46             }
    + 47         },
    + 48 
    + 49         setSkeletonFromFile : function(url) {
    + 50             var me= this;
    + 51             new CAAT.Module.Preloader.XHR().load(
    + 52                     function( result, content ) {
    + 53                         if (result==="ok" ) {
    + 54                             me.__setSkeleton( JSON.parse(content) );
    + 55                         }
    + 56                     },
    + 57                     url,
    + 58                     false,
    + 59                     "GET"
    + 60             );
    + 61 
    + 62             return this;
    + 63         },
    + 64 
    + 65         addAnimationFromFile : function(name, url) {
    + 66             var me= this;
    + 67             new CAAT.Module.Preloader.XHR().load(
    + 68                     function( result, content ) {
    + 69                         if (result==="ok" ) {
    + 70                             me.addAnimation( name, JSON.parse(content) );
    + 71                         }
    + 72                     },
    + 73                     url,
    + 74                     false,
    + 75                     "GET"
    + 76             );
    + 77 
    + 78             return this;
    + 79         },
    + 80 
    + 81         addAnimation : function(name, animation) {
    + 82 
    + 83             // bones animation
    + 84             for( var bonename in animation.bones ) {
    + 85 
    + 86                 var boneanimation= animation.bones[bonename];
    + 87 
    + 88                 if ( boneanimation.rotate ) {
    + 89 
    + 90                     for( var i=0; i<boneanimation.rotate.length-1; i++ ) {
    + 91                         this.addRotationKeyframe(
    + 92                             name,
    + 93                             {
    + 94                                 boneId : bonename,
    + 95                                 angleStart : boneanimation.rotate[i].angle,
    + 96                                 angleEnd : boneanimation.rotate[i+1].angle,
    + 97                                 timeStart : boneanimation.rotate[i].time*1000,
    + 98                                 timeEnd : boneanimation.rotate[i+1].time*1000,
    + 99                                 curve : boneanimation.rotate[i].curve
    +100                             } );
    +101                     }
    +102                 }
    +103 
    +104                 if (boneanimation.translate) {
    +105 
    +106                     for( var i=0; i<boneanimation.translate.length-1; i++ ) {
    +107 
    +108                         this.addTranslationKeyframe(
    +109                             name,
    +110                             {
    +111                                 boneId      : bonename,
    +112                                 startX      : boneanimation.translate[i].x,
    +113                                 startY      : -boneanimation.translate[i].y,
    +114                                 endX        : boneanimation.translate[i+1].x,
    +115                                 endY        : -boneanimation.translate[i+1].y,
    +116                                 timeStart   : boneanimation.translate[i].time * 1000,
    +117                                 timeEnd     : boneanimation.translate[i+1].time * 1000,
    +118                                 curve       : "stepped" //boneanimation.translate[i].curve
    +119 
    +120                             });
    +121                     }
    +122                 }
    +123 
    +124                 if ( boneanimation.scale ) {
    +125                     for( var i=0; i<boneanimation.scale.length-1; i++ ) {
    +126                         this.addScaleKeyframe(
    +127                             name,
    +128                             {
    +129                                 boneId : bonename,
    +130                                 startScaleX : boneanimation.rotate[i].x,
    +131                                 endScaleX : boneanimation.rotate[i+1].x,
    +132                                 startScaleY : boneanimation.rotate[i].y,
    +133                                 endScaleY : boneanimation.rotate[i+1].y,
    +134                                 timeStart : boneanimation.rotate[i].time*1000,
    +135                                 timeEnd : boneanimation.rotate[i+1].time*1000,
    +136                                 curve : boneanimation.rotate[i].curve
    +137                             } );
    +138                     }
    +139                 }
    +140 
    +141                 this.endKeyframes( name, bonename );
    +142 
    +143             }
    +144 
    +145             if ( null===this.currentAnimationName ) {
    +146                 this.animations[name]= animation;
    +147                 this.setAnimation(name);
    +148             }
    +149 
    +150             return this;
    +151         },
    +152 
    +153         setAnimation : function(name) {
    +154             this.root.setAnimation( name );
    +155             this.currentAnimationName= name;
    +156         },
    +157 
    +158         getCurrentAnimationData : function() {
    +159             return this.animations[ this.currentAnimationName ];
    +160         },
    +161 
    +162         getAnimationDataByName : function(name) {
    +163             return this.animations[name];
    +164         },
    +165 
    +166         getNumBones : function() {
    +167             return this.bonesArray.length;
    +168         },
    +169 
    +170         getRoot : function() {
    +171             return this.root;
    +172         },
    +173 
    +174         calculate : function(time, animationTime) {
    +175             this.root.apply(time, animationTime);
    +176         },
    +177 
    +178         getBoneById : function(id) {
    +179             return this.bones[id];
    +180         },
    +181 
    +182         getBoneByIndex : function(index) {
    +183             return this.bonesArray[ index ];
    +184         },
    +185 
    +186         addBone : function( boneInfo ) {
    +187             var bone= new CAAT.Module.Skeleton.Bone(boneInfo.name);
    +188 
    +189             bone.setPosition(
    +190                 typeof boneInfo.x!=="undefined" ? boneInfo.x : 0,
    +191                 typeof boneInfo.y!=="undefined" ? boneInfo.y : 0 );
    +192             bone.setRotateTransform( boneInfo.rotation ? boneInfo.rotation : 0 );
    +193             bone.setSize( boneInfo.length ? boneInfo.length : 0, 0 );
    +194 
    +195             this.bones[boneInfo.name]= bone;
    +196 
    +197             if (boneInfo.parent) {
    +198 
    +199                 var parent= this.bones[boneInfo.parent];
    +200                 if ( parent ) {
    +201                     parent.addBone(bone);
    +202                 } else {
    +203                     console.log("Referenced parent Bone '"+boneInfo.parent+"' which does not exist");
    +204                 }
    +205             }
    +206 
    +207             this.bonesArray.push(bone);
    +208 
    +209             // BUGBUG should be an explicit root bone identification.
    +210             if (!this.root) {
    +211                 this.root= bone;
    +212             }
    +213         },
    +214 
    +215         addRotationKeyframe : function( name, keyframeInfo ) {
    +216             var bone= this.bones[ keyframeInfo.boneId ];
    +217             if ( bone ) {
    +218                 bone.addRotationKeyframe(
    +219                     name,
    +220                     keyframeInfo.angleStart,
    +221                     keyframeInfo.angleEnd,
    +222                     keyframeInfo.timeStart,
    +223                     keyframeInfo.timeEnd,
    +224                     keyframeInfo.curve
    +225                 )
    +226             } else {
    +227                 console.log("Rotation Keyframe for non-existant bone: '"+keyframeInfo.boneId+"'" );
    +228             }
    +229         },
    +230 
    +231         addScaleKeyframe : function( name, keyframeInfo ) {
    +232             var bone= this.bones[ keyframeInfo.boneId ];
    +233             if ( bone ) {
    +234                 bone.addRotationKeyframe(
    +235                     name,
    +236                     keyframeInfo.startScaleX,
    +237                     keyframeInfo.endScaleX,
    +238                     keyframeInfo.startScaleY,
    +239                     keyframeInfo.endScaleY,
    +240                     keyframeInfo.timeStart,
    +241                     keyframeInfo.timeEnd,
    +242                     keyframeInfo.curve
    +243                 )
    +244             } else {
    +245                 console.log("Scale Keyframe for non-existant bone: '"+keyframeInfo.boneId+"'" );
    +246             }
    +247         },
    +248 
    +249         addTranslationKeyframe : function( name, keyframeInfo ) {
    +250 
    +251             var bone= this.bones[ keyframeInfo.boneId ];
    +252             if ( bone ) {
    +253 
    +254                 bone.addTranslationKeyframe(
    +255                     name,
    +256                     keyframeInfo.startX,
    +257                     keyframeInfo.startY,
    +258                     keyframeInfo.endX,
    +259                     keyframeInfo.endY,
    +260                     keyframeInfo.timeStart,
    +261                     keyframeInfo.timeEnd,
    +262                     keyframeInfo.curve
    +263                 )
    +264             } else {
    +265                 console.log("Translation Keyframe for non-existant bone: '"+keyframeInfo.boneId+"'" );
    +266             }
    +267         },
    +268 
    +269         endKeyframes : function( name, boneId ) {
    +270             var bone= this.bones[boneId];
    +271             if (bone) {
    +272                 bone.endTranslationKeyframes(name);
    +273                 bone.endRotationKeyframes(name);
    +274                 bone.endScaleKeyframes(name);
    +275             }
    +276         },
    +277 
    +278         paint : function( actorMatrix, ctx ) {
    +279             this.root.paint(actorMatrix,ctx);
    +280         }
    +281 
    +282     }
    +283 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_SkeletonActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_SkeletonActor.js.html new file mode 100644 index 00000000..947f7677 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_SkeletonActor.js.html @@ -0,0 +1,389 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name SkeletonActor
    +  5      * @memberof CAAT.Module.Skeleton.prototype
    +  6      * @constructor
    +  7      */
    +  8 
    +  9     defines: "CAAT.Module.Skeleton.SkeletonActor",
    + 10     extendsClass: "CAAT.Foundation.Actor",
    + 11     depends: [
    + 12         "CAAT.Module.Skeleton.Skeleton",
    + 13         "CAAT.Module.Skeleton.BoneActor",
    + 14         "CAAT.Foundation.Actor"
    + 15     ],
    + 16     extendsWith: function () {
    + 17 
    + 18 
    + 19 
    + 20         /**
    + 21          * Holder to keep animation slots information.
    + 22          */
    + 23         function SlotInfoData( sortId, attachment, name, bone ) {
    + 24 
    + 25             this.sortId= sortId;
    + 26             this.attachment= attachment;
    + 27             this.name= name;
    + 28             this.bone= bone;
    + 29 
    + 30             return this;
    + 31         }
    + 32 
    + 33         return {
    + 34 
    + 35             /**
    + 36              * @lends CAAT.Module.Skeleton.SkeletonActor
    + 37              */
    + 38 
    + 39             skeleton: null,
    + 40 
    + 41             /**
    + 42              * @type object
    + 43              * @map < boneId{string}, SlotInfoData >
    + 44              */
    + 45             slotInfo: null,
    + 46 
    + 47             /**
    + 48              * @type Array.<SlotInfoData>
    + 49              */
    + 50             slotInfoArray: null,
    + 51 
    + 52             /**
    + 53              * @type object
    + 54              * @map
    + 55              */
    + 56             skinByName: null,
    + 57 
    + 58             /**
    + 59              * @type CAAT.Foundation.Director
    + 60              */
    + 61             director: null,
    + 62 
    + 63             /**
    + 64              * @type boolean
    + 65              */
    + 66             _showBones: false,
    + 67 
    + 68             /**
    + 69              * Currently selected animation play time.
    + 70              * Zero to make it last for its default value.
    + 71              * @type number
    + 72              */
    + 73             animationDuration : 0,
    + 74 
    + 75             showAABB : false,
    + 76             bonesActor : null,
    + 77 
    + 78             __init: function (director, skeleton) {
    + 79                 this.__super();
    + 80 
    + 81                 this.director = director;
    + 82                 this.skeleton = skeleton;
    + 83                 this.slotInfo = {};
    + 84                 this.slotInfoArray = [];
    + 85                 this.bonesActor= [];
    + 86                 this.skinByName = {};
    + 87 
    + 88                 this.setSkin();
    + 89                 this.setAnimation("default");
    + 90 
    + 91                 return this;
    + 92             },
    + 93 
    + 94             showBones: function (show) {
    + 95                 this._showBones = show;
    + 96                 return this;
    + 97             },
    + 98 
    + 99             /**
    +100              * build an sprite-sheet composed of numSprites elements and organized in rows x columns
    +101              * @param numSprites {number}
    +102              * @param rows {number=}
    +103              * @param columns {number=}
    +104              */
    +105             buildSheet : function( numSprites, rows, columns ) {
    +106 
    +107                 var i, j,l;
    +108                 var AABBs= [];
    +109                 var maxTime= 1000;  // BUGBUG search for animation time.
    +110                 var ssItemWidth, ssItemHeight;  // sprite sheet item width and height
    +111                 var ssItemMinX= Number.MAX_VALUE, ssItemMinY= Number.MAX_VALUE;
    +112                 var ssItemMaxOffsetY, ssItemMaxOffsetX;
    +113 
    +114                 // prepare this actor's world model view matrix, but with no position.
    +115                 var px= this.x;
    +116                 var py= this.y;
    +117                 this.x= this.y= 0;
    +118                 this.setModelViewMatrix();
    +119 
    +120 
    +121                 rows= rows || 1;
    +122                 columns= columns || 1;
    +123 
    +124                 // calculate all sprite sheet frames aabb.
    +125                 for( j=0; j<numSprites; j++ ) {
    +126                     var aabb= new CAAT.Math.Rectangle();
    +127                     var time= maxTime/numSprites*j;
    +128                     AABBs.push( aabb );
    +129                     this.skeleton.calculate( time, this.animationDuration );
    +130 
    +131                     for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    +132                         var bone= this.bonesActor[i];
    +133                         var boneAABB;
    +134                         bone.setupAnimation(time);
    +135                         boneAABB= bone.AABB;
    +136                         aabb.unionRectangle(boneAABB);
    +137                         if ( boneAABB.x < ssItemMinX ) {
    +138                             ssItemMinX= boneAABB.x;
    +139                         }
    +140                     }
    +141                 }
    +142 
    +143                 // calculate offsets for each aabb and sprite-sheet element size.
    +144                 ssItemWidth= 0;
    +145                 ssItemHeight= 0;
    +146                 ssItemMinX= Number.MAX_VALUE;
    +147                 ssItemMinY= Number.MAX_VALUE;
    +148                 for( i=0; i<AABBs.length; i++ ) {
    +149                     if ( AABBs[i].x < ssItemMinX ) {
    +150                         ssItemMinX= AABBs[i].x;
    +151                     }
    +152                     if ( AABBs[i].y < ssItemMinY ) {
    +153                         ssItemMinY= AABBs[i].y;
    +154                     }
    +155                     if ( AABBs[i].width>ssItemWidth ) {
    +156                         ssItemWidth= AABBs[i].width;
    +157                     }
    +158                     if ( AABBs[i].height>ssItemHeight ) {
    +159                         ssItemHeight= AABBs[i].height;
    +160                     }
    +161                 }
    +162                 ssItemWidth= (ssItemWidth|0)+1;
    +163                 ssItemHeight= (ssItemHeight|0)+1;
    +164 
    +165                 // calculate every animation offset against biggest animation size.
    +166                 ssItemMaxOffsetY= -Number.MAX_VALUE;
    +167                 ssItemMaxOffsetX= -Number.MAX_VALUE;
    +168                 var offsetMinX=Number.MAX_VALUE, offsetMaxX=-Number.MAX_VALUE;
    +169                 for( i=0; i<AABBs.length; i++ ) {
    +170                     var offsetX= (ssItemWidth - AABBs[i].width)/2;
    +171                     var offsetY= (ssItemHeight - AABBs[i].height)/2;
    +172 
    +173                     if ( offsetY>ssItemMaxOffsetY ) {
    +174                         ssItemMaxOffsetY= offsetY;
    +175                     }
    +176 
    +177                     if ( offsetX>ssItemMaxOffsetX ) {
    +178                         ssItemMaxOffsetX= offsetX;
    +179                     }
    +180                 }
    +181 
    +182 
    +183                 // create a canvas of the neccessary size
    +184                 var canvas= document.createElement("canvas");
    +185                 canvas.width= ssItemWidth * numSprites;
    +186                 canvas.height= ssItemHeight;
    +187                 var ctx= canvas.getContext("2d");
    +188 
    +189                 // draw animation into canvas.
    +190                 for( j=0; j<numSprites; j++ ) {
    +191 
    +192                     //this.x= j*ssItemWidth + offsetMaxX - ssItemMaxOffsetX ;
    +193                     this.x= j*ssItemWidth - ssItemMinX;
    +194                     this.y= ssItemHeight - ssItemMaxOffsetY/2 - 1;
    +195 
    +196                     this.setModelViewMatrix();
    +197 
    +198                     var time= maxTime/numSprites*j;
    +199                     this.skeleton.calculate( time, this.animationDuration );
    +200 
    +201                     // prepare bones
    +202                     for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    +203                         this.bonesActor[i].setupAnimation(time);
    +204                         this.bonesActor[i].paint( ctx, time );
    +205                     }
    +206 
    +207                     ctx.restore();
    +208                 }
    +209 
    +210                 this.x= px;
    +211                 this.y= py;
    +212 
    +213                 return canvas;
    +214             },
    +215 
    +216             animate: function (director, time) {
    +217                 var i,l;
    +218 
    +219                 var ret= CAAT.Module.Skeleton.SkeletonActor.superclass.animate.call( this, director, time );
    +220 
    +221                 this.skeleton.calculate( time, this.animationDuration );
    +222 
    +223                 for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    +224                     this.bonesActor[i].setupAnimation(time);
    +225                 }
    +226 
    +227                 this.AABB.setEmpty();
    +228                 for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    +229                     this.AABB.unionRectangle(this.bonesActor[i].AABB);
    +230                 }
    +231 
    +232                 return ret;
    +233             },
    +234 
    +235             paint : function( director, time ) {
    +236                 CAAT.Module.Skeleton.SkeletonActor.superclass.paint.call(this,director,time);
    +237                 for( var i= 0, l=this.bonesActor.length; i<l; i+=1 ) {
    +238                     this.bonesActor[i].paint( director.ctx, time );
    +239                 }
    +240 
    +241 
    +242                 if (this._showBones && this.skeleton) {
    +243                     this.worldModelViewMatrix.transformRenderingContextSet(director.ctx);
    +244                     this.skeleton.paint(this.worldModelViewMatrix, director.ctx);
    +245                 }
    +246             },
    +247 
    +248             __addBoneActor : function( boneActor ) {
    +249                 this.bonesActor.push( boneActor );
    +250                 boneActor.parent= this;
    +251                 return this;
    +252             },
    +253 
    +254             setSkin: function (skin) {
    +255 
    +256                 this.bonesActor= [];
    +257                 this.slotInfoArray = [];
    +258                 this.slotInfo = {};
    +259 
    +260                 var skeletonData = this.skeleton.getSkeletonDataFromFile();
    +261 
    +262                 // slots info
    +263                 for (var slot = 0; slot < skeletonData.slots.length; slot++) {
    +264                     var slotInfo = skeletonData.slots[slot];
    +265                     var bone = this.skeleton.getBoneById(slotInfo.bone);
    +266                     if (bone) {
    +267                         var slotInfoData = new SlotInfoData(
    +268                                 slot,
    +269                                 slotInfo.attachment,
    +270                                 slotInfo.name,
    +271                                 slotInfo.bone );
    +272 
    +273                         this.slotInfo[ bone.id ] = slotInfoData;
    +274                         this.slotInfoArray.push(slotInfoData);
    +275 
    +276 
    +277                         var skinData = null;
    +278                         if (skin) {
    +279                             skinData = skeletonData.skins[skin][slotInfo.name];
    +280                         }
    +281                         if (!skinData) {
    +282                             skinData = skeletonData.skins["default"][slotInfo.name];
    +283                         }
    +284                         if (skinData) {
    +285 
    +286                             //create an actor for each slot data found.
    +287                             var boneActorSkin = new CAAT.Module.Skeleton.BoneActor();
    +288                             boneActorSkin.id = slotInfo.name;
    +289                             boneActorSkin.setBone(bone);
    +290 
    +291                             this.__addBoneActor(boneActorSkin);
    +292                             this.skinByName[slotInfo.name] = boneActorSkin;
    +293 
    +294                             // add skining info for each slot data.
    +295                             for (var skinDef in skinData) {
    +296                                 var skinInfo = skinData[skinDef];
    +297                                 var angle= -(skinInfo.rotation || 0) * 2 * Math.PI / 360;
    +298                                 var x= skinInfo.x|0;
    +299                                 var y= -skinInfo.y|0;
    +300                                 var w= skinInfo.width|0;
    +301                                 var h= skinInfo.height|0;
    +302                                 var scaleX= skinInfo.scaleX|1;
    +303                                 var scaleY= skinInfo.scaleY|1;
    +304 
    +305                                 var matrix= CAAT.Math.Matrix.translate( -skinInfo.width/2, -skinInfo.height/2 );
    +306                                 matrix.premultiply( CAAT.Math.Matrix.rotate( angle ) );
    +307                                 matrix.premultiply( CAAT.Math.Matrix.scale( scaleX, scaleY ) );
    +308                                 matrix.premultiply( CAAT.Math.Matrix.translate( x, y ) );
    +309 
    +310                                 /*
    +311                                 only needed values are:
    +312                                   + image
    +313                                   + matrix
    +314                                   + name
    +315 
    +316                                   all the rest are just to keep original values.
    +317                                  */
    +318                                 boneActorSkin.addSkinInfo({
    +319                                     angle: angle,
    +320                                     x: x,
    +321                                     y: y,
    +322                                     width: w,
    +323                                     height: h,
    +324                                     image: this.director.getImage(skinData[skinDef].name ? skinData[skinDef].name : skinDef),
    +325                                     matrix : matrix,
    +326                                     scaleX : scaleX,
    +327                                     scaleY : scaleY,
    +328                                     name: skinDef
    +329                                 });
    +330                             }
    +331 
    +332                             boneActorSkin.setDefaultSkinInfoByName(slotInfo.attachment);
    +333                         }
    +334                     } else {
    +335                         console.log("Unknown bone to apply skin: " + slotInfo.bone);
    +336                     }
    +337                 }
    +338 
    +339                 return this;
    +340             },
    +341 
    +342             setAnimation: function (name, animationDuration ) {
    +343 
    +344                 this.animationDuration= animationDuration||0;
    +345 
    +346                 var animationInfo = this.skeleton.getAnimationDataByName(name);
    +347                 if (!animationInfo) {
    +348                     return;
    +349                 }
    +350 
    +351                 var animationSlots = animationInfo.slots;
    +352                 for (var animationSlot in animationSlots) {
    +353                     var attachments = animationSlots[animationSlot].attachment;
    +354                     var boneActor = this.skinByName[ animationSlot ];
    +355                     if (boneActor) {
    +356                         boneActor.emptySkinDataKeyframe();
    +357                         for (var i = 0, l = attachments.length - 1; i < l; i += 1) {
    +358                             var start = attachments[i].time;
    +359                             var len = attachments[i + 1].time - attachments[i].time;
    +360                             boneActor.addSkinDataKeyframe(attachments[i].name, start, len);
    +361                         }
    +362                     } else {
    +363                         console.log("Adding skinDataKeyframe to unkown boneActor: " + animationSlot);
    +364                     }
    +365                 }
    +366 
    +367                 return this;
    +368             },
    +369 
    +370             getBoneActorById : function( id ) {
    +371                 return this.skinByName[id];
    +372             },
    +373 
    +374             addAttachment : function( slotId, normalized_x, normalized_y, callback ) {
    +375                 var slotBoneActor= this.getBoneActorById(slotId);
    +376                 if ( slotBoneActor ) {
    +377                     slotBoneActor.addAttachment(slotId,normalized_x,normalized_y,callback);
    +378                 }
    +379             }
    +380         }
    +381     }
    +382 });
    \ No newline at end of file From 7b14c54149bd0c7fa44176f766c12aaed3208ce7 Mon Sep 17 00:00:00 2001 From: ibon tolosana Date: Mon, 1 Jul 2013 04:52:47 -0700 Subject: [PATCH 46/52] * 07/01/2013 0.7 Build 3 * --------------------------- * Added functionality to AudioManager. The method director.setAudioFormatExtensions which proxies to audioManager.setAudioFormatExtensions sets a default audio object extension set. By default is [ 'ogg', 'mp3', 'wav', 'x-wav', 'mp4' ]. This means CAAT by default will try to find ogg files, then mp3, etc. It is not important whether the audio files add to director.addAudio have extension or not. CAAT will add the first suitable extension to be played from the supplied or default audioFormatExtension array. * Added __CLASS attribute to Class function. Now all objects are identified. * Fixed Director dynamic scale behavior. * Enhanced Skeletal animation support (Spine). * Fixed. Font error which prevented fonts to draw on screen. * Added. Method SpriteImage.addElementsAsImages which turns all subelements, either a grid defined by rows and columns or a JSON map into available images for director.getImage calls. * Fixed. Label object made tags to be incorrectly set in the document. * Fixed. Label now accepts images set by calling Label.setImage or images with names matching director.getImage calls. * Added demo35: Label usage. * Added demo36: Sprite maps. * Added. Method SpriteImage.initializeFromTexturePackerJSON which adds map sub-images as valid director.getImage values. --- build/caat-box2d-min.js | 6 +- build/caat-css-min.js | 342 +- build/caat-css.js | 412 +- build/caat.js | 438 +- changelog | 21 + documentation/demos/demo34/index.html | 54 +- documentation/demos/demo35/label.html | 12 +- documentation/demos/demo36/spritemap.html | 15 +- documentation/demos/menu/menu.html | 2 + documentation/jsdoc/files.html | 8 +- documentation/jsdoc/index.html | 18 +- .../symbols/CAAT.Behavior.AlphaBehavior.html | 10 +- .../CAAT.Behavior.BaseBehavior.Status.html | 8 +- .../symbols/CAAT.Behavior.BaseBehavior.html | 42 +- .../CAAT.Behavior.ContainerBehavior.html | 61 +- .../CAAT.Behavior.GenericBehavior.html | 10 +- .../symbols/CAAT.Behavior.Interpolator.html | 8 +- ...CAAT.Behavior.PathBehavior.AUTOROTATE.html | 8 +- .../symbols/CAAT.Behavior.PathBehavior.html | 10 +- .../symbols/CAAT.Behavior.RotateBehavior.html | 10 +- .../CAAT.Behavior.Scale1Behavior.Axis.html | 8 +- .../symbols/CAAT.Behavior.Scale1Behavior.html | 10 +- .../symbols/CAAT.Behavior.ScaleBehavior.html | 10 +- .../jsdoc/symbols/CAAT.Behavior.html | 8 +- documentation/jsdoc/symbols/CAAT.Class.html | 2 +- .../jsdoc/symbols/CAAT.Event.KeyEvent.html | 8 +- .../jsdoc/symbols/CAAT.Event.MouseEvent.html | 8 +- .../jsdoc/symbols/CAAT.Event.TouchEvent.html | 8 +- .../jsdoc/symbols/CAAT.Event.TouchInfo.html | 8 +- .../jsdoc/symbols/CAAT.Foundation.Actor.html | 121 +- ...AAT.Foundation.ActorContainer.AddHint.html | 81 +- .../CAAT.Foundation.Box2D.B2DBodyActor.html | 12 +- ...CAAT.Foundation.Box2D.B2DCircularBody.html | 12 +- .../CAAT.Foundation.Box2D.B2DPolygonBody.html | 12 +- .../jsdoc/symbols/CAAT.Foundation.Box2D.html | 8 +- .../symbols/CAAT.Foundation.Director.html | 57 +- .../jsdoc/symbols/CAAT.Foundation.Scene.html | 12 +- .../symbols/CAAT.Foundation.SpriteImage.html | 151 +- ...Foundation.SpriteImageAnimationHelper.html | 8 +- .../CAAT.Foundation.SpriteImageHelper.html | 8 +- .../CAAT.Foundation.Timer.TimerManager.html | 8 +- .../CAAT.Foundation.Timer.TimerTask.html | 8 +- .../jsdoc/symbols/CAAT.Foundation.Timer.html | 8 +- .../symbols/CAAT.Foundation.UI.Dock.html | 12 +- .../symbols/CAAT.Foundation.UI.IMActor.html | 12 +- .../symbols/CAAT.Foundation.UI.Label.html | 78 +- ...AAT.Foundation.UI.Layout.BorderLayout.html | 8 +- .../CAAT.Foundation.UI.Layout.BoxLayout.html | 8 +- .../CAAT.Foundation.UI.Layout.GridLayout.html | 8 +- ...AT.Foundation.UI.Layout.LayoutManager.html | 8 +- .../symbols/CAAT.Foundation.UI.Layout.html | 8 +- .../CAAT.Foundation.UI.ShapeActor.html | 12 +- .../symbols/CAAT.Foundation.UI.StarActor.html | 12 +- .../symbols/CAAT.Foundation.UI.TextActor.html | 12 +- .../jsdoc/symbols/CAAT.Foundation.UI.html | 8 +- .../jsdoc/symbols/CAAT.Foundation.html | 8 +- documentation/jsdoc/symbols/CAAT.KEYS.html | 8 +- .../jsdoc/symbols/CAAT.KEY_MODIFIERS.html | 8 +- .../jsdoc/symbols/CAAT.Math.Bezier.html | 8 +- .../jsdoc/symbols/CAAT.Math.CatmullRom.html | 8 +- .../jsdoc/symbols/CAAT.Math.Curve.html | 8 +- .../jsdoc/symbols/CAAT.Math.Dimension.html | 8 +- .../jsdoc/symbols/CAAT.Math.Matrix.html | 8 +- .../jsdoc/symbols/CAAT.Math.Point.html | 8 +- .../jsdoc/symbols/CAAT.Math.Rectangle.html | 8 +- documentation/jsdoc/symbols/CAAT.Math.html | 8 +- .../CAAT.Module.Audio.AudioManager.html | 153 +- .../jsdoc/symbols/CAAT.Module.Audio.html | 8 +- ...AAT.Module.CircleManager.PackedCircle.html | 8 +- ...ule.CircleManager.PackedCircleManager.html | 8 +- .../symbols/CAAT.Module.CircleManager.html | 8 +- .../CAAT.Module.Collision.QuadTree.html | 8 +- .../CAAT.Module.Collision.SpatialHash.html | 8 +- .../jsdoc/symbols/CAAT.Module.Collision.html | 8 +- .../symbols/CAAT.Module.ColorUtil.Color.html | 8 +- .../jsdoc/symbols/CAAT.Module.ColorUtil.html | 8 +- .../symbols/CAAT.Module.Debug.Debug.html | 8 +- .../jsdoc/symbols/CAAT.Module.Debug.html | 8 +- .../jsdoc/symbols/CAAT.Module.Font.html | 8 +- ...le.Image.ImageProcessor.IMBumpMapping.html | 8 +- ....Module.Image.ImageProcessor.IMPlasma.html | 8 +- ...odule.Image.ImageProcessor.IMRotoZoom.html | 8 +- ...e.Image.ImageProcessor.ImageProcessor.html | 8 +- .../symbols/CAAT.Module.Image.ImageUtil.html | 8 +- .../jsdoc/symbols/CAAT.Module.Image.html | 8 +- .../jsdoc/symbols/CAAT.Module.Locale.html | 8 +- .../CAAT.Module.Preloader.ImagePreloader.html | 8 +- .../CAAT.Module.Preloader.Preloader.html | 8 +- .../jsdoc/symbols/CAAT.Module.Preloader.html | 8 +- .../CAAT.Module.Runtime.BrowserInfo.html | 8 +- .../jsdoc/symbols/CAAT.Module.Runtime.html | 8 +- .../CAAT.Module.Skeleton#SkeletonActor.html | 2 +- .../symbols/CAAT.Module.Skeleton.Bone.html | 8 +- .../CAAT.Module.Skeleton.BoneActor.html | 250 +- .../jsdoc/symbols/CAAT.Module.Skeleton.html | 8 +- .../CAAT.Module.Storage.LocalStorage.html | 8 +- .../jsdoc/symbols/CAAT.Module.Storage.html | 8 +- ...T.Module.TexturePacker.TextureElement.html | 8 +- ...CAAT.Module.TexturePacker.TexturePage.html | 8 +- ...dule.TexturePacker.TexturePageManager.html | 8 +- ...CAAT.Module.TexturePacker.TextureScan.html | 8 +- ...T.Module.TexturePacker.TextureScanMap.html | 8 +- .../symbols/CAAT.Module.TexturePacker.html | 8 +- .../jsdoc/symbols/CAAT.ModuleManager.html | 567 +- .../jsdoc/symbols/CAAT.PathUtil.ArcPath.html | 8 +- .../symbols/CAAT.PathUtil.CurvePath.html | 8 +- .../symbols/CAAT.PathUtil.LinearPath.html | 8 +- .../symbols/CAAT.PathUtil.PathSegment.html | 8 +- .../jsdoc/symbols/CAAT.PathUtil.RectPath.html | 8 +- .../jsdoc/symbols/CAAT.PathUtil.SVGPath.html | 8 +- .../jsdoc/symbols/CAAT.PathUtil.html | 8 +- .../symbols/CAAT.WebGL.ColorProgram.html | 8 +- .../jsdoc/symbols/CAAT.WebGL.GLU.html | 8 +- .../jsdoc/symbols/CAAT.WebGL.Program.html | 8 +- .../symbols/CAAT.WebGL.TextureProgram.html | 8 +- documentation/jsdoc/symbols/CAAT.WebGL.html | 8 +- documentation/jsdoc/symbols/CAAT.html | 111 +- documentation/jsdoc/symbols/String.html | 8 +- documentation/jsdoc/symbols/_global_.html | 8 +- ..._js_CAAT_src_Behavior_BaseBehavior.js.html | 428 +- ...AAT_src_Behavior_ContainerBehavior.js.html | 666 +-- ..._ibon_js_CAAT_src_Foundation_Actor.js.html | 4873 ++++++++-------- ...CAAT_src_Foundation_ActorContainer.js.html | 589 +- ...on_js_CAAT_src_Foundation_Director.js.html | 4953 +++++++++-------- ...js_CAAT_src_Foundation_SpriteImage.js.html | 2105 +++---- ...on_js_CAAT_src_Foundation_UI_Label.js.html | 2293 ++++---- ...Users_ibon_js_CAAT_src_Math_Matrix.js.html | 751 +-- ...AAT_src_Modules_Audio_AudioManager.js.html | 1012 ++-- documentation/tutorials/index.html | 6 + src/Foundation/ActorContainer.js | 9 + src/Foundation/ActorContainerCSS.js | 9 + src/Foundation/SpriteImage.js | 71 +- src/Foundation/UI/Label.js | 44 +- version.compile.pack.sh | 2 + version.incremental | 2 +- version.nfo | 2 +- 136 files changed, 11548 insertions(+), 10079 deletions(-) diff --git a/build/caat-box2d-min.js b/build/caat-box2d-min.js index 3a92cfca..707a7284 100644 --- a/build/caat-box2d-min.js +++ b/build/caat-box2d-min.js @@ -22,11 +22,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 52 +Version: 0.6 build: 4 Created on: -DATE: 2013-04-07 -TIME: 11:05:51 +DATE: 2013-07-01 +TIME: 04:32:54 */ diff --git a/build/caat-css-min.js b/build/caat-css-min.js index d9770b8c..183ba9fe 100644 --- a/build/caat-css-min.js +++ b/build/caat-css-min.js @@ -22,32 +22,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 52 +Version: 0.6 build: 4 Created on: -DATE: 2013-04-07 -TIME: 11:05:51 +DATE: 2013-07-01 +TIME: 04:32:54 */ -(function(a){function b(b){for(var b=b.split("."),c=a,d=0;d NOT solved."))},removeDependency:function(a){for(var b=0;b Can't extend non-existant class: "+this.baseClass);return}}else b= -e;b.extend(this.extendWith,this.constants,this.name,this.aliases,{decorated:this.decorated});console.log("Created module: "+this.name);this.callback&&this.callback()}};var g=function(a,b){this.path=a;this.module=b;return this};g.prototype={path:null,processed:false,module:null,setProcessed:function(){this.processed=true},isProcessed:function(){return this.processed}};var h=function(){this.nodes=[];this.loadedFiles=[];this.path={};this.solveListener=[];this.orderedSolvedModules=[];this.readyListener= -[];return this};h.baseURL="";h.modulePath={};h.sortedModulePath=[];h.symbol={};h.prototype={nodes:null,loadedFiles:null,solveListener:null,readyListener:null,orderedSolvedModules:null,addSolvedListener:function(a,b){this.solveListener.push({name:a,callback:b})},solved:function(a){var b;for(b=0;b catched "+d+" on module "+a.defines+" preCreation.")}if(!a.depends)a.depends= -[];if((b=a.depends)&&!isArray(b))b=[b],a.depends=b;for(c=0;c NOT solved."))},removeDependency:function(a){for(var b=0;b Can't extend non-existant class: "+this.baseClass);return}}else b=f;b.extend(this.extendWith,this.constants,this.name,this.aliases,{decorated:this.decorated});console.log("Created module: "+this.name);this.callback&&this.callback()}};var h=function(a,b){this.path=a;this.module=b;return this};h.prototype={path:null,processed:false,module:null,setProcessed:function(){this.processed=true},isProcessed:function(){return this.processed}};var i=function(){this.nodes=[];this.loadedFiles=[]; +this.path={};this.solveListener=[];this.orderedSolvedModules=[];this.readyListener=[];return this};i.baseURL="";i.modulePath={};i.sortedModulePath=[];i.symbol={};i.prototype={nodes:null,loadedFiles:null,solveListener:null,readyListener:null,orderedSolvedModules:null,addSolvedListener:function(a,b){this.solveListener.push({name:a,callback:b})},solved:function(a){var b;for(b=0;b catched "+ +d+" on module "+a.defines+" preCreation.")}if(!a.depends)a.depends=[];if((b=a.depends)&&!isArray(b))b=[b],a.depends=b;for(c=0;c>0,b[5]>>0);return this},transformRenderingContext_Clamp:function(a){var b=this.matrix;a.transform(b[0],b[3],b[1],b[4],b[2]>>0,b[5]>>0);return this},setModelViewMatrix:function(a,b,c,d,e){var f,g,h,i,j,k;k= @@ -79,9 +79,9 @@ CAAT.Module({defines:"CAAT.Math.Matrix3",aliases:["CAAT.Matrix3"],extendsWith:fu d*this.matrix[2][2]+this.matrix[2][3];return a},initialize:function(a,b,c,d,e,f,g,h,i){this.identity();this.matrix[0][0]=a;this.matrix[0][1]=b;this.matrix[0][2]=c;this.matrix[1][0]=d;this.matrix[1][1]=e;this.matrix[1][2]=f;this.matrix[2][0]=g;this.matrix[2][1]=h;this.matrix[2][2]=i;return this},initWithMatrix:function(a){this.matrix=a;return this},flatten:function(){var a=this.fmatrix,b=this.matrix;a[0]=b[0][0];a[1]=b[1][0];a[2]=b[2][0];a[3]=b[3][0];a[4]=b[0][1];a[5]=b[1][1];a[6]=b[2][1];a[7]=b[2][1]; a[8]=b[0][2];a[9]=b[1][2];a[10]=b[2][2];a[11]=b[3][2];a[12]=b[0][3];a[13]=b[1][3];a[14]=b[2][3];a[15]=b[3][3];return this.fmatrix},identity:function(){for(var a=0;a<4;a++)for(var b=0;b<4;b++)this.matrix[a][b]=a===b?1:0;return this},getMatrix:function(){return this.matrix},rotateXY:function(a){return this.rotate(a,0,0)},rotateXZ:function(a){return this.rotate(0,a,0)},rotateYZ:function(a){return this.rotate(0,0,a)},setRotate:function(a,b,c){this.copy(this.rotate(a,b,c));return this},rotate:function(a, b,c){var d=new CAAT.Math.Matrix3,e,f;a!==0&&(f=new CAAT.Math.Math.Matrix3,e=Math.sin(a),a=Math.cos(a),f.matrix[1][1]=a,f.matrix[1][2]=-e,f.matrix[2][1]=e,f.matrix[2][2]=a,d.multiply(f));b!==0&&(f=new CAAT.Math.Matrix3,e=Math.sin(b),a=Math.cos(b),f.matrix[0][0]=a,f.matrix[0][2]=-e,f.matrix[2][0]=e,f.matrix[2][2]=a,d.multiply(f));c!==0&&(f=new CAAT.Math.Matrix3,e=Math.sin(c),a=Math.cos(c),f.matrix[0][0]=a,f.matrix[0][1]=-e,f.matrix[1][0]=e,f.matrix[1][1]=a,d.multiply(f));return d},getClone:function(){var a= -new CAAT.Math.Matrix3;a.copy(this);return a},multiply:function(a){var b=this.getClone().matrix,c=b[0][0],d=b[0][1],e=b[0][2],f=b[0][3],g=b[1][0],h=b[1][1],i=b[1][2],j=b[1][3],k=b[2][0],m=b[2][1],o=b[2][2],b=b[2][3],n=a.matrix,a=n[0][0],p=n[0][1],q=n[0][2],r=n[0][3],t=n[1][0],s=n[1][1],u=n[1][2],v=n[1][3],w=n[2][0],x=n[2][1],y=n[2][2],z=n[2][3],A=n[3][0],B=n[3][1],C=n[3][2],n=n[3][3];this.matrix[0][0]=c*a+d*t+e*w+f*A;this.matrix[0][1]=c*p+d*s+e*x+f*B;this.matrix[0][2]=c*q+d*u+e*y+f*C;this.matrix[0][3]= -c*r+d*v+e*z+f*n;this.matrix[1][0]=g*a+h*t+i*w+j*A;this.matrix[1][1]=g*p+h*s+i*x+j*B;this.matrix[1][2]=g*q+h*u+i*y+j*C;this.matrix[1][3]=g*r+h*v+i*z+j*n;this.matrix[2][0]=k*a+m*t+o*w+b*A;this.matrix[2][1]=k*p+m*s+o*x+b*B;this.matrix[2][2]=k*q+m*u+o*y+b*C;this.matrix[2][3]=k*r+m*v+o*z+b*n;return this},premultiply:function(a){var b=this.getClone().matrix,c=b[0][0],d=b[0][1],e=b[0][2],f=b[0][3],g=b[1][0],h=b[1][1],i=b[1][2],j=b[1][3],k=b[2][0],m=b[2][1],o=b[2][2],b=b[2][3],n=a.matrix,a=n[0][0],p=n[0][1], -q=n[0][2],r=n[0][3],t=n[1][0],s=n[1][1],u=n[1][2],v=n[1][3],w=n[2][0],x=n[2][1],y=n[2][2],n=n[2][3];this.matrix[0][0]=c*a+d*t+e*w;this.matrix[0][1]=c*p+d*s+e*x;this.matrix[0][2]=c*q+d*u+e*y;this.matrix[0][3]=c*r+d*v+e*n+f;this.matrix[1][0]=g*a+h*t+i*w;this.matrix[1][1]=g*p+h*s+i*x;this.matrix[1][2]=g*q+h*u+i*y;this.matrix[1][3]=g*r+h*v+i*n+j;this.matrix[2][0]=k*a+m*t+o*w;this.matrix[2][1]=k*p+m*s+o*x;this.matrix[2][2]=k*q+m*u+o*y;this.matrix[2][3]=k*r+m*v+o*n+b;return this},setTranslate:function(a, +new CAAT.Math.Matrix3;a.copy(this);return a},multiply:function(a){var b=this.getClone().matrix,c=b[0][0],d=b[0][1],e=b[0][2],f=b[0][3],g=b[1][0],h=b[1][1],i=b[1][2],j=b[1][3],k=b[2][0],m=b[2][1],o=b[2][2],b=b[2][3],n=a.matrix,a=n[0][0],p=n[0][1],q=n[0][2],r=n[0][3],u=n[1][0],t=n[1][1],s=n[1][2],w=n[1][3],v=n[2][0],x=n[2][1],y=n[2][2],z=n[2][3],A=n[3][0],B=n[3][1],C=n[3][2],n=n[3][3];this.matrix[0][0]=c*a+d*u+e*v+f*A;this.matrix[0][1]=c*p+d*t+e*x+f*B;this.matrix[0][2]=c*q+d*s+e*y+f*C;this.matrix[0][3]= +c*r+d*w+e*z+f*n;this.matrix[1][0]=g*a+h*u+i*v+j*A;this.matrix[1][1]=g*p+h*t+i*x+j*B;this.matrix[1][2]=g*q+h*s+i*y+j*C;this.matrix[1][3]=g*r+h*w+i*z+j*n;this.matrix[2][0]=k*a+m*u+o*v+b*A;this.matrix[2][1]=k*p+m*t+o*x+b*B;this.matrix[2][2]=k*q+m*s+o*y+b*C;this.matrix[2][3]=k*r+m*w+o*z+b*n;return this},premultiply:function(a){var b=this.getClone().matrix,c=b[0][0],d=b[0][1],e=b[0][2],f=b[0][3],g=b[1][0],h=b[1][1],i=b[1][2],j=b[1][3],k=b[2][0],m=b[2][1],o=b[2][2],b=b[2][3],n=a.matrix,a=n[0][0],p=n[0][1], +q=n[0][2],r=n[0][3],u=n[1][0],t=n[1][1],s=n[1][2],w=n[1][3],v=n[2][0],x=n[2][1],y=n[2][2],n=n[2][3];this.matrix[0][0]=c*a+d*u+e*v;this.matrix[0][1]=c*p+d*t+e*x;this.matrix[0][2]=c*q+d*s+e*y;this.matrix[0][3]=c*r+d*w+e*n+f;this.matrix[1][0]=g*a+h*u+i*v;this.matrix[1][1]=g*p+h*t+i*x;this.matrix[1][2]=g*q+h*s+i*y;this.matrix[1][3]=g*r+h*w+i*n+j;this.matrix[2][0]=k*a+m*u+o*v;this.matrix[2][1]=k*p+m*t+o*x;this.matrix[2][2]=k*q+m*s+o*y;this.matrix[2][3]=k*r+m*w+o*n+b;return this},setTranslate:function(a, b,c){this.identity();this.matrix[0][3]=a;this.matrix[1][3]=b;this.matrix[2][3]=c;return this},translate:function(a,b,c){var d=new CAAT.Math.Matrix3;d.setTranslate(a,b,c);return d},setScale:function(a,b,c){this.identity();this.matrix[0][0]=a;this.matrix[1][1]=b;this.matrix[2][2]=c;return this},scale:function(a,b,c){var d=new CAAT.Math.Matrix3;d.setScale(a,b,c);return d},rotateModelView:function(a,b,c){var d=Math.sin(a),e=Math.sin(b),f=Math.sin(c),a=Math.cos(a),b=Math.cos(b),c=Math.cos(c);this.matrix[0][0]= b*a;this.matrix[0][1]=-b*d;this.matrix[0][2]=e;this.matrix[0][3]=0;this.matrix[1][0]=f*e*a+d*c;this.matrix[1][1]=c*a-f*e*d;this.matrix[1][2]=-f*b;this.matrix[1][3]=0;this.matrix[2][0]=f*d-c*e*a;this.matrix[2][1]=c*e*d+f*a;this.matrix[2][2]=c*b;this.matrix[2][3]=0;this.matrix[3][0]=0;this.matrix[3][1]=0;this.matrix[3][2]=0;this.matrix[3][3]=1;return this},copy:function(a){for(var b=0;b<4;b++)for(var c=0;c<4;c++)this.matrix[b][c]=a.matrix[b][c];return this},calculateDeterminant:function(){var a=this.matrix, b=a[0][0],c=a[0][1],d=a[0][2],e=a[0][3],f=a[1][0],g=a[1][1],h=a[1][2],i=a[1][3],j=a[2][0],k=a[2][1],m=a[2][2],o=a[2][3],n=a[3][0],p=a[3][1],q=a[3][2],a=a[3][3];return e*g*m*n+c*i*m*n+e*h*j*p+d*i*j*p+d*f*o*p+b*h*o*p+e*f*k*q+b*i*k*q+d*g*j*a+c*h*j*a+c*f*m*a+b*g*m*a+e*h*k*n-d*i*k*n-d*g*o*n-c*h*o*n-e*f*m*p-b*i*m*p-e*g*j*q-c*i*j*q-c*f*o*q-b*g*o*q-d*f*k*a-b*h*k*a},getInverse:function(){var a=this.matrix,b=a[0][0],c=a[0][1],d=a[0][2],e=a[0][3],f=a[1][0],g=a[1][1],h=a[1][2],i=a[1][3],j=a[2][0],k=a[2][1],m= @@ -117,23 +117,23 @@ CAAT.Module({defines:"CAAT.Behavior.BaseBehavior",constants:{Status:{NOT_STARTED b=(new CAAT.Behavior.Interpolator).createLinearInterpolator(true);return{__init:function(){this.lifecycleListenerList=[];this.setDefaultInterpolator();return this},lifecycleListenerList:null,behaviorStartTime:-1,behaviorDuration:-1,cycleBehavior:false,status:CAAT.Behavior.BaseBehavior.Status.NOT_STARTED,interpolator:null,actor:null,id:0,timeOffset:0,doValueApplication:true,solved:true,discardable:false,isRelative:false,setRelative:function(a){this.isRelative=a;return this},setRelativeValues:function(){this.isRelative= true;return this},parse:function(a){a.pingpong&&this.setPingPong();a.cycle&&this.setCycle(true);this.setDelayTime(a.delay||0,a.duration||1E3);a.interpolator&&this.setInterpolator(CAAT.Behavior.Interpolator.parse(a.interpolator))},setValueApplication:function(a){this.doValueApplication=a;return this},setTimeOffset:function(a){this.timeOffset=a;return this},setStatus:function(a){this.status=a;return this},setId:function(a){this.id=a;return this},setDefaultInterpolator:function(){this.interpolator=a; return this},setPingPong:function(){this.interpolator=b;return this},setFrameTime:function(a,b){this.behaviorStartTime=a;this.behaviorDuration=b;this.status=CAAT.Behavior.BaseBehavior.Status.NOT_STARTED;return this},setDelayTime:function(a,b){this.behaviorStartTime=a;this.behaviorDuration=b;this.status=CAAT.Behavior.BaseBehavior.Status.NOT_STARTED;this.expired=this.solved=false;return this},setOutOfFrameTime:function(){this.status=CAAT.Behavior.BaseBehavior.Status.EXPIRED;this.behaviorStartTime=Number.MAX_VALUE; -this.behaviorDuration=0;return this},setInterpolator:function(a){this.interpolator=a;return this},apply:function(a,b){if(!this.solved)this.behaviorStartTime+=a,this.solved=true;a+=this.timeOffset*this.behaviorDuration;var e=a;this.isBehaviorInTime(a,b)&&(a=this.normalizeTime(a),this.fireBehaviorAppliedEvent(b,e,a,this.setForTime(a,b)))},setCycle:function(a){this.cycleBehavior=a;return this},addListener:function(a){this.lifecycleListenerList.push(a);return this},emptyListenerList:function(){this.lifecycleListenerList= -[];return this},getStartTime:function(){return this.behaviorStartTime},getDuration:function(){return this.behaviorDuration},isBehaviorInTime:function(a,b){var e=CAAT.Behavior.BaseBehavior.Status;if(this.status===e.EXPIRED||this.behaviorStartTime<0)return false;this.cycleBehavior&&a>=this.behaviorStartTime&&(a=(a-this.behaviorStartTime)%this.behaviorDuration+this.behaviorStartTime);if(a>this.behaviorStartTime+this.behaviorDuration)return this.status!==e.EXPIRED&&this.setExpired(b,a),false;if(this.status=== -e.NOT_STARTED)this.status=e.STARTED,this.fireBehaviorStartedEvent(b,a);return this.behaviorStartTime<=a},fireBehaviorStartedEvent:function(a,b){for(var e=0,f=this.lifecycleListenerList.length;e=this.behaviorStartTime&&(a=(a-this.behaviorStartTime)%this.behaviorDuration+this.behaviorStartTime);if(a>this.behaviorStartTime+this.behaviorDuration)return this.status!== +e.EXPIRED&&this.setExpired(b,a),false;if(this.status===e.NOT_STARTED)this.status=e.STARTED,this.fireBehaviorStartedEvent(b,a);return this.behaviorStartTime<=a},fireBehaviorStartedEvent:function(a,b){for(var e=0,f=this.lifecycleListenerList.length;e>=0;for(var d= "@-"+a+"-keyframes "+b+" {",a=0;a<=c;a++)b=""+a/c*100+"%{opacity: "+this.calculateKeyFrameData(a/c)+"}",d+=b;d+="}";return d}}}}); -CAAT.Module({defines:"CAAT.Behavior.ContainerBehavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Behavior.GenericBehavior"],aliases:["CAAT.ContainerBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){if(a.behaviors&&a.behaviors.length)for(var b=0;b=d)){d=(d-c.behaviorStartTime)/c.behaviorDuration;c=c.getKeyFrameDataValues(d);for(var f in c)e[f]=c[f]}return e},calculateKeyFrameData:function(a,b){function c(a){if(f[a])h+=f[a];else if(prevValues&&(i=prevValues[a]))h+=i,f[a]=i}var d,e,f={},g;for(d=0;d=g&&(g=(g-e.behaviorStartTime)/e.behaviorDuration,g=e.calculateKeyFrameData(g),e=e.getPropertyName(b),typeof f[e]==="undefined"&&(f[e]=""),f[e]+=g+" "));var h="",i;c("translate");c("rotate");c("scale");d="";h&&(d="-"+b+"-transform: "+h+";");h="";c("opacity");h&&(d+=" opacity: "+h+";");d+=" -webkit-transform-origin: 0% 0%";return{rules:d,ret:f}},calculateKeyFramesData:function(a, -b,c,d,e){if(this.duration===Number.MAX_VALUE)return"";typeof d==="undefined"&&(d=0.5);typeof e==="undefined"&&(e=0.5);typeof c==="undefined"&&(c=100);for(var f="@-"+a+"-keyframes "+b+" {",g,h={},b=0;b<=c;b++){g=this.interpolator.getPosition(b/c).y;g=this.getKeyFrameDataValues(g);var i=""+b/c*100+"%{",j=g,k=void 0;for(k in h)j[k]||(j[k]=h[k]);h="-"+a+"-transform:";if(j.x||j.y)h+="translate("+(j.x||0)+"px,"+(j.y||0)+"px)";j.angle&&(h+=" rotate("+j.angle+"rad)");if(j.scaleX!==1||j.scaleY!==1)h+=" scale("+ -j.scaleX+","+j.scaleY+")";h+=";";j.alpha&&(h+=" opacity: "+j.alpha+";");if(d!==0.5||e!==0.5)h+=" -"+a+"-transform-origin:"+d*100+"% "+e*100+"%;";f+=i+h+"}\n";h=g}f+="}\n";return f}}}}); +CAAT.Module({defines:"CAAT.Behavior.ContainerBehavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Behavior.GenericBehavior"],aliases:["CAAT.ContainerBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){if(a.behaviors&&a.behaviors.length)for(var b=0;b=d)){d=(d-c.behaviorStartTime)/c.behaviorDuration; +c=c.getKeyFrameDataValues(d);for(var f in c)e[f]=c[f]}return e},calculateKeyFrameData:function(a,b){function c(a){if(f[a])h+=f[a];else if(prevValues&&(i=prevValues[a]))h+=i,f[a]=i}var d,e,f={},g;for(d=0;d=g&&(g=(g-e.behaviorStartTime)/e.behaviorDuration,g=e.calculateKeyFrameData(g), +e=e.getPropertyName(b),typeof f[e]==="undefined"&&(f[e]=""),f[e]+=g+" "));var h="",i;c("translate");c("rotate");c("scale");d="";h&&(d="-"+b+"-transform: "+h+";");h="";c("opacity");h&&(d+=" opacity: "+h+";");d+=" -webkit-transform-origin: 0% 0%";return{rules:d,ret:f}},calculateKeyFramesData:function(a,b,c,d,e){if(this.duration===Number.MAX_VALUE)return"";typeof d==="undefined"&&(d=0.5);typeof e==="undefined"&&(e=0.5);typeof c==="undefined"&&(c=100);for(var f="@-"+a+"-keyframes "+b+" {",g,h={},b=0;b<= +c;b++){g=this.interpolator.getPosition(b/c).y;g=this.getKeyFrameDataValues(g);var i=""+b/c*100+"%{",j=g,k=void 0;for(k in h)j[k]||(j[k]=h[k]);h="-"+a+"-transform:";if(j.x||j.y)h+="translate("+(j.x||0)+"px,"+(j.y||0)+"px)";j.angle&&(h+=" rotate("+j.angle+"rad)");if(j.scaleX!==1||j.scaleY!==1)h+=" scale("+j.scaleX+","+j.scaleY+")";h+=";";j.alpha&&(h+=" opacity: "+j.alpha+";");if(d!==0.5||e!==0.5)h+=" -"+a+"-transform-origin:"+d*100+"% "+e*100+"%;";f+=i+h+"}\n";h=g}f+="}\n";return f}}}}); CAAT.Module({defines:"CAAT.Behavior.GenericBehavior",depends:["CAAT.Behavior.BaseBehavior"],aliases:["CAAT.GenericBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{start:0,end:0,target:null,property:null,callback:null,setForTime:function(a,b){var c=this.start+a*(this.end-this.start);this.callback&&this.callback(c,this.target,b);this.property&&(this.target[this.property]=c)},setValues:function(a,b,c,d,e){this.start=a;this.end=b;this.target=c;this.property=d;this.callback= e;return this}}}}); CAAT.Module({defines:"CAAT.Behavior.PathBehavior",aliases:["CAAT.PathBehavior"],depends:["CAAT.Behavior.BaseBehavior","CAAT.Foundation.SpriteImage"],constants:{AUTOROTATE:{LEFT_TO_RIGHT:0,RIGHT_TO_LEFT:1,FREE:2},autorotate:{LEFT_TO_RIGHT:0,RIGHT_TO_LEFT:1,FREE:2}},extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){CAAT.Behavior.PathBehavior.superclass.parse.call(this,a);a.SVG&&this.setValues((new CAAT.PathUtil.SVGPath).parsePath(a.SVG));if(a.autoRotate)this.autoRotate=a.autoRotate}, @@ -159,19 +159,20 @@ CAAT.Module({defines:"CAAT.Module.Runtime.BrowserInfo",constants:function(){func {string:navigator.platform,subString:"Mac",identity:"Mac"},{string:navigator.userAgent,subString:"iPhone",identity:"iPhone/iPod"},{string:navigator.platform,subString:"Linux",identity:"Linux"}],d=a([{string:navigator.userAgent,subString:"Chrome",identity:"Chrome"},{string:navigator.userAgent,subString:"OmniWeb",versionSearch:"OmniWeb/",identity:"OmniWeb"},{string:navigator.vendor,subString:"Apple",identity:"Safari",versionSearch:"Version"},{prop:window.opera,identity:"Opera"},{string:navigator.vendor, subString:"iCab",identity:"iCab"},{string:navigator.vendor,subString:"KDE",identity:"Konqueror"},{string:navigator.userAgent,subString:"Firefox",identity:"Firefox"},{string:navigator.vendor,subString:"Camino",identity:"Camino"},{string:navigator.userAgent,subString:"Netscape",identity:"Netscape"},{string:navigator.userAgent,subString:"MSIE",identity:"Explorer",versionSearch:"MSIE"},{string:navigator.userAgent,subString:"Explorer",identity:"Explorer",versionSearch:"Explorer"},{string:navigator.userAgent, subString:"Gecko",identity:"Mozilla",versionSearch:"rv"},{string:navigator.userAgent,subString:"Mozilla",identity:"Netscape",versionSearch:"Mozilla"}])||"An unknown browser",e=b(navigator.userAgent)||b(navigator.appVersion)||"an unknown version",c=a(c)||"an unknown OS";return{browser:d,version:e,OS:c,DevicePixelRatio:window.devicePixelRatio||1}}}); -CAAT.Module({defines:"CAAT.Module.Audio.AudioManager",depends:["CAAT.Module.Runtime.BrowserInfo"],extendsWith:function(){return{__init:function(){this.browserInfo=CAAT.Module.Runtime.BrowserInfo;return this},musicChannel:null,browserInfo:null,musicEnabled:true,fxEnabled:true,audioCache:null,channels:null,workingChannels:null,loopingChannels:[],audioTypes:{mp3:"audio/mpeg;",ogg:'audio/ogg; codecs="vorbis"',wav:'audio/wav; codecs="1"',mp4:'audio/mp4; codecs="mp4a.40.2"'},initialize:function(a){this.audioCache= -[];this.channels=[];this.workingChannels=[];for(var b=0;b<=a;b++){var c=document.createElement("audio");if(null!==c){c.finished=-1;this.channels.push(c);var d=this;c.addEventListener("ended",function(a){var a=a.target,b;for(b=0;b0){var b= -this.channels.shift();b.src=a.src;b.volume=a.volume;b.play();this.workingChannels.push(b)}return a},cancelPlay:function(a){for(var b=0;this.workingChannels.length;b++){var c=this.workingChannels[b];c.caat_id===a&&(c.pause(),this.channels.push(c),this.workingChannels.splice(b,1))}return this},cancelPlayByChannel:function(a){for(var b=0;this.workingChannels.length;b++)if(this.workingChannels[b]===a){this.channels.push(a);this.workingChannels.splice(b,1);break}return this},loop:function(a){if(!this.musicEnabled)return null; -a=this.getAudio(a);if(null!==a){var b=document.createElement("audio");if(null!==b)return b.src=a.src,b.preload="auto",this.browserInfo.browser==="Firefox"?b.addEventListener("ended",function(a){a.target.currentTime=0},false):b.loop=true,b.load(),b.play(),this.loopingChannels.push(b),b}return null},endSound:function(){var a;for(a=0;a0?(a=this.channels.shift(),a.src=b.src,a.volume=b.volume,a.play(),this.workingChannels.push(a)):console.log("Can't play audio: "+a);return b},cancelPlay:function(a){for(var b=0;this.workingChannels.length;b++){var c=this.workingChannels[b];c.caat_id===a&&(c.pause(),this.channels.push(c),this.workingChannels.splice(b,1))}return this},cancelPlayByChannel:function(a){for(var b=0;this.workingChannels.length;b++)if(this.workingChannels[b]=== +a){this.channels.push(a);this.workingChannels.splice(b,1);break}return this},loop:function(a){if(!this.musicEnabled)return null;a=this.getAudio(a);if(null!==a){var b=document.createElement("audio");if(null!==b)return b.src=a.src,b.preload="auto",this.isFirefox?b.addEventListener("ended",function(a){a.target.currentTime=0},false):b.loop=true,b.load(),b.play(),this.loopingChannels.push(b),b}return null},endSound:function(){var a;for(a=0;a=g)return{r:d,g:e,b:f};a=a+(d-a)/g*h>>0;b=b+(e-b)/g*h>>0;c=c+(f-c)/g*h>>0;a>255?a=255:a<0&&(a=0);b>255?b=255:b<0&&(b=0);c>255?c=255:c<0&&(c=0);return{r:a,g:b,b:c}},makeRGBColorRamp:function(a,b,c){var d= -[],e=a.length-1;b/=e;var f,g,h,i,j,k,m,o,n,p,q,r,t,s;for(f=0;f>24&255;n=(m&16711680)>>16;p=(m&65280)>>8;m&=255;g=a[f+1];q=g>>24&255;r=(g&16711680)>>16;t=(g&65280)>>8;g&=255;q=(q-o)/b;r=(r-n)/b;t=(t-p)/b;s=(g-m)/b;for(g=0;g>0;i=n+r*g>>0;j=p+t*g>>0;k=m+s*g>>0;var u=CAAT.Module.ColorUtil.Color.RampEnumeration;switch(c){case u.RAMP_RGBA:d.push("argb("+h+","+i+","+j+","+k+")");break;case u.RAMP_RGB:d.push("rgb("+i+","+j+","+k+")");break;case u.RAMP_CHANNEL_RGB:d.push(4278190080| -i<<16|j<<8|k);break;case u.RAMP_CHANNEL_RGBA:d.push(h<<24|i<<16|j<<8|k);break;case u.RAMP_CHANNEL_RGBA_ARRAY:d.push([i,j,k,h]);break;case u.RAMP_CHANNEL_RGB_ARRAY:d.push([i,j,k])}}}return d},random:function(){for(var a="#",b=0;b<3;b++)a+="0123456789abcdef"[Math.random()*16>>0];return a}},extendsWith:{__init:function(a,b,c){this.r=a||255;this.g=b||255;this.b=c||255;return this},r:255,g:255,b:255,toHex:function(){return("000000"+((this.r<<16)+(this.g<<8)+this.b).toString(16)).slice(-6)}}}); +[],e=a.length-1;b/=e;var f,g,h,i,j,k,m,o,n,p,q,r,u,t;for(f=0;f>24&255;n=(m&16711680)>>16;p=(m&65280)>>8;m&=255;g=a[f+1];q=g>>24&255;r=(g&16711680)>>16;u=(g&65280)>>8;g&=255;q=(q-o)/b;r=(r-n)/b;u=(u-p)/b;t=(g-m)/b;for(g=0;g>0;i=n+r*g>>0;j=p+u*g>>0;k=m+t*g>>0;var s=CAAT.Module.ColorUtil.Color.RampEnumeration;switch(c){case s.RAMP_RGBA:d.push("argb("+h+","+i+","+j+","+k+")");break;case s.RAMP_RGB:d.push("rgb("+i+","+j+","+k+")");break;case s.RAMP_CHANNEL_RGB:d.push(4278190080| +i<<16|j<<8|k);break;case s.RAMP_CHANNEL_RGBA:d.push(h<<24|i<<16|j<<8|k);break;case s.RAMP_CHANNEL_RGBA_ARRAY:d.push([i,j,k,h]);break;case s.RAMP_CHANNEL_RGB_ARRAY:d.push([i,j,k])}}}return d},random:function(){for(var a="#",b=0;b<3;b++)a+="0123456789abcdef"[Math.random()*16>>0];return a}},extendsWith:{__init:function(a,b,c){this.r=a||255;this.g=b||255;this.b=c||255;return this},r:255,g:255,b:255,toHex:function(){return("000000"+((this.r<<16)+(this.g<<8)+this.b).toString(16)).slice(-6)}}}); CAAT.Module({defines:"CAAT.Module.Debug.Debug",depends:["CAAT.Event.AnimationLoop"],extendsWith:{width:0,height:0,canvas:null,ctx:null,statistics:null,framerate:null,textContainer:null,textFPS:null,textEntitiesTotal:null,textEntitiesActive:null,textDraws:null,textDrawTime:null,textRAFTime:null,textDirtyRects:null,textDiscardDR:null,frameTimeAcc:0,frameRAFAcc:0,canDebug:false,SCALE:60,debugTpl:'
    CAAT Debug panel Performance Controls Draw Time: 5.46 ms. FPS: 48
    RAF Time: 20.76 ms. Entities Total: 41 Entities Active: 37 Draws: 0 DirtyRects: 0 Discard DR: 0
    Sound
    Music
    AA Bounding Boxes
    Bounding Boxes
    Dirty Rects
    ', setScale:function(a){this.scale=a;return this},initialize:function(a,b){this.width=a=window.innerWidth;this.height=b;this.framerate={refreshInterval:CAAT.FPS_REFRESH||500,frames:0,timeLastRefresh:0,fps:0,prevFps:-1,fpsMin:1E3,fpsMax:0};if(!document.getElementById("caat-debug")){var c=document.createElement("div");c.innerHTML=this.debugTpl;document.body.appendChild(c);eval(' var __x= CAAT; function initCheck( name, bool, callback ) { var elem= document.getElementById(name); if ( elem ) { elem.className= (bool) ? "checkbox_enabled" : "checkbox_disabled"; if ( callback ) { elem.addEventListener( "click", (function(elem, callback) { return function(e) { elem.__value= !elem.__value; elem.className= (elem.__value) ? "checkbox_enabled" : "checkbox_disabled"; callback(e,elem.__value); } })(elem, callback), false ); } elem.__value= bool; } } function setupTabs() { var numTabs=0; var elem; var elemContent; do { elem= document.getElementById("caat-debug-tab"+numTabs); if ( elem ) { elemContent= document.getElementById("caat-debug-tab"+numTabs+"-content"); if ( elemContent ) { elemContent.style.display= numTabs===0 ? \'block\' : \'none\'; elem.className= numTabs===0 ? "debug_tab debug_tab_selected" : "debug_tab debug_tab_not_selected"; elem.addEventListener( "click", (function(tabIndex) { return function(e) { for( var i=0; i>0)-0.5;b.moveTo(0.5,c);b.lineTo(this.width+0.5,c);b.stroke();b.strokeStyle="#aa2";b.beginPath();c=this.height-(30/this.SCALE*this.height>>0)-0.5;b.moveTo(0.5,c);b.lineTo(this.width+0.5,c);b.stroke();c=Math.min(this.height-this.framerate.fps/this.SCALE*this.height,59);if(-1===this.framerate.prevFps)this.framerate.prevFps=c|0;b.strokeStyle= "#0ff";b.beginPath();b.moveTo(this.width,(c|0)-0.5);b.lineTo(this.width,this.framerate.prevFps-0.5);b.stroke();this.framerate.prevFps=c;a=(this.height-a/this.SCALE*this.height>>0)-0.5;b.strokeStyle="#ff0";b.beginPath();b.moveTo(this.width,a);b.lineTo(this.width,a);b.stroke()}}}); -CAAT.Module({defines:"CAAT.Module.Font.Font",aliases:"CAAT.Font",depends:["CAAT.Foundation.SpriteImage"],constants:{getFontMetrics:function(a){var b;if(CAAT.CSS_TEXT_METRICS)try{return b=CAAT.Module.Font.Font.getFontMetricsCSS(a)}catch(c){}return CAAT.Module.Font.Font.getFontMetricsNoCSS(a)},getFontMetricsNoCSS:function(a){var a=/(\d+)p[x|t]/i.exec(a),b;b=a?a[1]|0:32;a=b-1;b=b+b*0.2|0;return{height:b,ascent:a,descent:b-a}},getFontMetricsCSS:function(a){function b(a){var b,c,d;d=a&&a.ownerDocument; +CAAT.Module({defines:"CAAT.Module.Font.Font",aliases:"CAAT.Font",depends:["CAAT.Foundation.SpriteImage"],constants:{getFontMetrics:function(a){var b;if(CAAT.CSS_TEXT_METRICS)try{return b=CAAT.Module.Font.Font.getFontMetricsCSS(a)}catch(c){}return CAAT.Module.Font.Font.getFontMetricsNoCSS(a)},getFontMetricsNoCSS:function(a){var a=/(\d+)p[x|t]\s*/i.exec(a),b;b=a?a[1]|0:32;a=b-1;b=b+b*0.2|0;return{height:b,ascent:a,descent:b-a}},getFontMetricsCSS:function(a){function b(a){var b,c,d;d=a&&a.ownerDocument; b=d.documentElement;a=a.getBoundingClientRect();c=document.body;d=d.nodeType===9?d.defaultView||d.parentWindow:false;return{top:a.top+(d.pageYOffset||b.scrollTop)-(b.clientTop||c.clientTop||0),left:a.left+(d.pageXOffset||b.scrollLeft)-(b.clientLeft||c.clientLeft||0)}}try{var c=document.createElement("span");c.style.font=a;c.innerHTML="Hg";var d=document.createElement("div");d.style.display="inline-block";d.style.width="1px";d.style.heigh="0px";var e=document.createElement("div");e.appendChild(c); e.appendChild(d);var f=document.body;f.appendChild(e);try{return a={},d.style.verticalAlign="baseline",a.ascent=b(d).top-b(c).top,d.style.verticalAlign="bottom",a.height=b(d).top-b(c).top,a.ascent=Math.ceil(a.ascent),a.height=Math.ceil(a.height),a.descent=a.height-a.ascent,a}finally{f.removeChild(e)}}catch(g){return null}}},extendsWith:function(){return{fontSize:10,fontSizeUnit:"px",font:"Sans-Serif",fontStyle:"",fillStyle:"#fff",strokeStyle:null,strokeSize:1,padding:0,image:null,charMap:null,height:0, ascent:0,descent:0,setPadding:function(a){this.padding=a;return this},setFontStyle:function(a){this.fontStyle=a;return this},setStrokeSize:function(a){this.strokeSize=a;return this},setFontSize:function(a){this.fontSize=a;this.fontSizeUnit="px";return this},setFont:function(a){this.font=a;return this},setFillStyle:function(a){this.fillStyle=a;return this},setStrokeStyle:function(a){this.strokeStyle=a;return this},createDefault:function(a){for(var b="",c=32;c<128;c++)b+=String.fromCharCode(c);return this.create(b, a)},create:function(a,b){b|=0;this.padding=b;var c=document.createElement("canvas"),d=c.getContext("2d");d.textBaseline="bottom";d.font=this.fontStyle+" "+this.fontSize+""+this.fontSizeUnit+" "+this.font;var e=0,f=[],g,h;for(g=0;g>0)+1)+2*b;f.push(i);e+=i}g=CAAT.Font.getFontMetrics(d.font);d=g.height;this.ascent=g.ascent;this.descent=g.descent;this.height=g.height;i=g.ascent;c.width=e;c.height=d;d=c.getContext("2d");d.textBaseline= -"alphabetic";d.font=this.fontStyle+" "+this.fontSize+""+this.fontSizeUnit+" "+this.font;d.fillStyle=this.fillStyle;d.strokeStyle=this.strokeStyle;this.charMap={};for(g=e=0;g0&&g.height>0&&b.drawImage(this.image,g.x,0,h,i,c,d,h,i),c+=h):(b.strokeStyle="#f00",b.strokeRect(c,d,10,i),c+=10)},save:function(){var a=this.image.toDataURL("image/png");document.location.href=a.replace("image/png","image/octet-stream")},drawSpriteText:function(a,b){this.spriteImage.drawSpriteText(a,b)}}}}); +"alphabetic";d.font=this.fontStyle+" "+this.fontSize+""+this.fontSizeUnit+" "+this.font;d.fillStyle=this.fillStyle;d.strokeStyle=this.strokeStyle;this.charMap={};for(g=e=0;g0&&g.height>0&&b.drawImage(this.image,g.x,0,h,i,c,d,h,i),c+=h):(b.strokeStyle="#f00",b.strokeRect(c,d,10,i),c+=10)},save:function(){var a=this.image.toDataURL("image/png");document.location.href=a.replace("image/png","image/octet-stream")},drawSpriteText:function(a,b){this.spriteImage.drawSpriteText(a,b)}}}}); CAAT.Module({defines:"CAAT.Module.CircleManager.PackedCircle",depends:["CAAT.Module.CircleManager.PackedCircle","CAAT.Math.Point"],constants:{BOUNDS_RULE_WRAP:1,BOUNDS_RULE_CONSTRAINT:2,BOUNDS_RULE_DESTROY:4,BOUNDS_RULE_IGNORE:8},extendsWith:{__init:function(){this.boundsRule=CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_IGNORE;this.position=new CAAT.Math.Point(0,0,0);this.offset=new CAAT.Math.Point(0,0,0);this.targetPosition=new CAAT.Math.Point(0,0,0);return this},id:0,delegate:null,position:null, offset:null,targetPosition:null,targetChaseSpeed:0.02,isFixed:false,boundsRule:0,collisionMask:0,collisionGroup:0,containsPoint:function(a){return this.position.getDistanceSquared(a)>=0;var d=true,e=true,f=true,g=true;if(typeof c!== "undefined"){if(typeof c.top!=="undefined")d=c.top;if(typeof c.bottom!=="undefined")e=c.bottom;if(typeof c.left!=="undefined")f=c.left;if(typeof c.right!=="undefined")g=c.right}c=document.createElement("canvas");c.width=a.width;c.height=a.height;var h=c.getContext("2d");h.fillStyle="rgba(0,0,0,0)";h.fillRect(0,0,a.width,a.height);h.drawImage(a,0,0);var i=h.getImageData(0,0,a.width,a.height).data,j,a=0,k=c.height-1,m=0,o=c.width-1,n=false;if(d){for(d=0;d0?c=Math.ceil((d+b-1)/b):b=Math.ceil((d+c-1)/c) e=0,f=0,g;b>0?c=Math.ceil((d+b-1)/b):b=Math.ceil((d+c-1)/c);for(g=0;g>0)*e;var k=i+(d/h>>0)*f,m=g+e,o=k+f;g=(new CAAT.Foundation.SpriteImageHelper(g,k,m-g,o-k,j.width,j.height)).setGL(g/j.width,k/j.height,m/j.width,o/j.height);this.mapInfo[d]=g}}else for(d=0;d0&&(f-=d);var g=(this.offsetY-this.ownerActor.y)%e; -g>0&&(g-=e);for(var d=((c.width-f)/d>>0)+1,e=((c.height-g)/e>>0)+1,h,i=a.ctx,a=0;a>0,c.y-this.ownerActor.y+g+a*b.height>>0,b.width,b.height)},paintInvertedH:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate((c|0)+b.width,d|0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedV:function(a, -b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedHV:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.translate(b.width,0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this}, -paintN:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintAtRect:function(a,b,c,d,e,f){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,e,f);return this},paintScaledWidth:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+ -d>>0,this.ownerActor.width,b.height);return this},paintChunk:function(a,b,c,d,e,f,g){a.drawImage(this.image,d,e,f,g,b,c,f,g)},paintTile:function(a,b,c,d){b=this.mapInfo[b];a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintScaled:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,this.ownerActor.height);return this},getCurrentSpriteImageCSSPosition:function(){var a= -this.mapInfo[this.spriteIndex];return""+-(a.x+this.parentOffsetX-this.offsetX)+"px "+-(a.y+this.parentOffsetY-this.offsetY)+"px "+(this.ownerActor.transformation===CAAT.Foundation.SpriteImage.TR_TILE?"repeat":"no-repeat")},getNumImages:function(){return this.rows*this.columns},setUV:function(a,b){var c=this.image;if(c.__texturePage){var d=b,e=this.mapInfo[this.spriteIndex],f=e.u,g=e.v,h=e.u1,e=e.v1;if(this.offsetX||this.offsetY)f=c.__texturePage,g=-this.offsetY/f.height,h=(this.ownerActor.width-this.offsetX)/ -f.width,e=(this.ownerActor.height-this.offsetY)/f.height,f=-this.offsetX/f.width+c.__u,g+=c.__v,h+=c.__u,e+=c.__v;c.inverted?(a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e,a[d++]=f,a[d++]=g):(a[d++]=f,a[d++]=g,a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e)}},setChangeFPS:function(a){this.changeFPS=a;return this},setSpriteTransformation:function(a){this.transformation=a;var b=CAAT.Foundation.SpriteImage;switch(a){case b.TR_FLIP_HORIZONTAL:this.paint=this.paintInvertedH;break;case b.TR_FLIP_VERTICAL:this.paint= -this.paintInvertedV;break;case b.TR_FLIP_ALL:this.paint=this.paintInvertedHV;break;case b.TR_FIXED_TO_SIZE:this.paint=this.paintScaled;break;case b.TR_FIXED_WIDTH_TO_SIZE:this.paint=this.paintScaledWidth;break;case b.TR_TILE:this.paint=this.paintTiled;break;default:this.paint=this.paintN}this.ownerActor.invalidate();return this},resetAnimationTime:function(){this.prevAnimationTime=-1;return this},setAnimationImageIndex:function(a){this.animationImageIndex=a;this.spriteIndex=a[0];this.prevAnimationTime= --1;return this},setSpriteIndex:function(a){this.spriteIndex=a;return this},setSpriteIndexAtTime:function(a){if(this.animationImageIndex.length>1){if(this.prevAnimationTime===-1)this.prevAnimationTime=a,this.spriteIndex=this.animationImageIndex[0],this.prevIndex=0;else{var b=a;b-=this.prevAnimationTime;b/=this.changeFPS;b%=this.animationImageIndex.length;b=Math.floor(b);b>0,f=0;fa&&(a=c)}this.fontHeight=a;return this.fontHeight*this.fontScale},drawText:function(a,b,c,d){var e,f,g;for(e=0;e0&&f.height>0&&b.drawImage(this.image,f.x,f.y,g,f.height,c+f.xoffset*this.fontScale,d+f.yoffset*this.fontScale,g*this.fontScale,f.height*this.fontScale),c+=f.xadvance*this.fontScale},getFontData:function(){var a=this.stringHeight()*0.8>>0; -return{height:this.stringHeight(),ascent:a,descent:this.stringHeight()-a}}}}}); +CAAT.Module({defines:"CAAT.Foundation.SpriteImage",aliases:["CAAT.SpriteImage"],depends:["CAAT.Foundation.SpriteImageHelper","CAAT.Foundation.SpriteImageAnimationHelper","CAAT.Math.Rectangle"],constants:{TR_NONE:0,TR_FLIP_HORIZONTAL:1,TR_FLIP_VERTICAL:2,TR_FLIP_ALL:3,TR_FIXED_TO_SIZE:4,TR_FIXED_WIDTH_TO_SIZE:6,TR_TILE:5},extendsWith:function(){return{__init:function(){this.paint=this.paintN;this.setAnimationImageIndex([0]);this.mapInfo={};this.animationsMap={};arguments.length===1?this.initialize.call(this, +arguments[0],1,1):arguments.length===3&&this.initialize.apply(this,arguments);return this},animationImageIndex:null,prevAnimationTime:-1,changeFPS:1E3,transformation:0,spriteIndex:0,prevIndex:0,currentAnimation:null,image:null,rows:1,columns:1,width:0,height:0,singleWidth:0,singleHeight:0,scaleX:1,scaleY:1,offsetX:0,offsetY:0,parentOffsetX:0,parentOffsetY:0,ownerActor:null,mapInfo:null,map:null,animationsMap:null,callback:null,fontScale:1,getOwnerActor:function(){return this.ownerActor},addAnimation:function(a, +b,c,d){this.animationsMap[a]=new CAAT.Foundation.SpriteImageAnimationHelper(b,c,d);return this},setAnimationEndCallback:function(a){this.callback=a},playAnimation:function(a){if(a===this.currentAnimation)return this;var b=this.animationsMap[a];if(!b)return this;this.currentAnimation=a;this.setAnimationImageIndex(b.animation);this.changeFPS=b.time;this.callback=b.onEndPlayCallback;return this},setOwner:function(a){this.ownerActor=a;return this},getRows:function(){return this.rows},getColumns:function(){return this.columns}, +getWidth:function(){return this.mapInfo[this.spriteIndex].width},getHeight:function(){return this.mapInfo[this.spriteIndex].height},getWrappedImageWidth:function(){return this.image.width},getWrappedImageHeight:function(){return this.image.height},getRef:function(){var a=new CAAT.Foundation.SpriteImage;a.image=this.image;a.rows=this.rows;a.columns=this.columns;a.width=this.width;a.height=this.height;a.singleWidth=this.singleWidth;a.singleHeight=this.singleHeight;a.mapInfo=this.mapInfo;a.offsetX=this.offsetX; +a.offsetY=this.offsetY;a.scaleX=this.scaleX;a.scaleY=this.scaleY;a.animationsMap=this.animationsMap;a.parentOffsetX=this.parentOffsetX;a.parentOffsetY=this.parentOffsetY;a.scaleFont=this.scaleFont;return a},setOffsetX:function(a){this.offsetX=a;return this},setOffsetY:function(a){this.offsetY=a;return this},setOffset:function(a,b){this.offsetX=a;this.offsetY=b;return this},initialize:function(a,b,c){a||console.log("Null image for SpriteImage.");isString(a)&&(a=CAAT.currentDirector.getImage(a));this.parentOffsetY= +this.parentOffsetX=0;this.rows=b;this.columns=c;if(a instanceof CAAT.Foundation.SpriteImage||a instanceof CAAT.SpriteImage){this.image=a.image;var d=a.mapInfo[0];this.width=d.width;this.height=d.height;this.parentOffsetX=d.x;this.parentOffsetY=d.y;this.width=a.mapInfo[0].width;this.height=a.mapInfo[0].height}else this.image=a,this.width=a.width,this.height=a.height,this.mapInfo={};this.singleWidth=Math.floor(this.width/c);this.singleHeight=Math.floor(this.height/b);var e,f,g;if(a.__texturePage){a.__du= +this.singleWidth/a.__texturePage.width;a.__dv=this.singleHeight/a.__texturePage.height;e=this.singleWidth;f=this.singleHeight;var h=this.columns;if(a.inverted)d=e,e=f,f=d,h=this.rows;for(var a=this.image.__tx,i=this.image.__ty,j=this.image.__texturePage,d=0;d>0)*e;var k=i+(d/h>>0)*f,m=g+e,o=k+f;g=(new CAAT.Foundation.SpriteImageHelper(g,k,m-g,o-k,j.width,j.height)).setGL(g/j.width,k/j.height,m/j.width,o/j.height);this.mapInfo[d]=g}}else for(d=0;d0&&(f-=d);var g=(this.offsetY-this.ownerActor.y)%e;g>0&&(g-=e);for(var d=((c.width-f)/d>>0)+1,e=((c.height-g)/e>>0)+1,h,i=a.ctx,a=0;a>0,c.y-this.ownerActor.y+g+a*b.height>>0,b.width,b.height)},paintInvertedH:function(a, +b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate((c|0)+b.width,d|0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedV:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedHV:function(a, +b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.translate(b.width,0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintN:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintAtRect:function(a,b,c,d,e,f){b=this.mapInfo[this.spriteIndex]; +a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,e,f);return this},paintScaledWidth:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,b.height);return this},paintChunk:function(a,b,c,d,e,f,g){a.drawImage(this.image,d,e,f,g,b,c,f,g)},paintTile:function(a,b,c,d){b=this.mapInfo[b];a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+ +d>>0,b.width,b.height);return this},paintScaled:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,this.ownerActor.height);return this},getCurrentSpriteImageCSSPosition:function(){var a=this.mapInfo[this.spriteIndex];return""+-(a.x+this.parentOffsetX-this.offsetX)+"px "+-(a.y+this.parentOffsetY-this.offsetY)+"px "+(this.ownerActor.transformation===CAAT.Foundation.SpriteImage.TR_TILE?"repeat": +"no-repeat")},getNumImages:function(){return this.rows*this.columns},setUV:function(a,b){var c=this.image;if(c.__texturePage){var d=b,e=this.mapInfo[this.spriteIndex],f=e.u,g=e.v,h=e.u1,e=e.v1;if(this.offsetX||this.offsetY)f=c.__texturePage,g=-this.offsetY/f.height,h=(this.ownerActor.width-this.offsetX)/f.width,e=(this.ownerActor.height-this.offsetY)/f.height,f=-this.offsetX/f.width+c.__u,g+=c.__v,h+=c.__u,e+=c.__v;c.inverted?(a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e,a[d++]=f,a[d++]= +g):(a[d++]=f,a[d++]=g,a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e)}},setChangeFPS:function(a){this.changeFPS=a;return this},setSpriteTransformation:function(a){this.transformation=a;var b=CAAT.Foundation.SpriteImage;switch(a){case b.TR_FLIP_HORIZONTAL:this.paint=this.paintInvertedH;break;case b.TR_FLIP_VERTICAL:this.paint=this.paintInvertedV;break;case b.TR_FLIP_ALL:this.paint=this.paintInvertedHV;break;case b.TR_FIXED_TO_SIZE:this.paint=this.paintScaled;break;case b.TR_FIXED_WIDTH_TO_SIZE:this.paint= +this.paintScaledWidth;break;case b.TR_TILE:this.paint=this.paintTiled;break;default:this.paint=this.paintN}this.ownerActor.invalidate();return this},resetAnimationTime:function(){this.prevAnimationTime=-1;return this},setAnimationImageIndex:function(a){this.animationImageIndex=a;this.spriteIndex=a[0];this.prevAnimationTime=-1;return this},setSpriteIndex:function(a){this.spriteIndex=a;return this},setSpriteIndexAtTime:function(a){if(this.animationImageIndex.length>1){if(this.prevAnimationTime===-1)this.prevAnimationTime= +a,this.spriteIndex=this.animationImageIndex[0],this.prevIndex=0;else{var b=a;b-=this.prevAnimationTime;b/=this.changeFPS;b%=this.animationImageIndex.length;b=Math.floor(b);b>0,f=0;fa&&(a=c)}this.fontHeight=a;return this.fontHeight*this.fontScale},drawText:function(a,b,c,d){var e,f,g;for(e=0;e0&&f.height>0&&b.drawImage(this.image,f.x,f.y,g,f.height,c+f.xoffset*this.fontScale,d+f.yoffset*this.fontScale,g*this.fontScale,f.height*this.fontScale),c+=f.xadvance*this.fontScale}, +getFontData:function(){var a=this.stringHeight()*0.8>>0;return{height:this.stringHeight(),ascent:a,descent:this.stringHeight()-a}}}}}); CAAT.Module({defines:"CAAT.Foundation.Actor",aliases:["CAAT.Actor"],depends:"CAAT.Event.AnimationLoop,CAAT.Foundation.SpriteImage,CAAT.Core.Constants,CAAT.Behavior.PathBehavior,CAAT.Behavior.RotateBehavior,CAAT.Behavior.ScaleBehavior,CAAT.Behavior.Scale1Behavior,CAAT.PathUtil.LinearPath,CAAT.Event.AnimationLoop".split(","),constants:{ANCHOR_CENTER:0,ANCHOR_TOP:1,ANCHOR_BOTTOM:2,ANCHOR_LEFT:3,ANCHOR_RIGHT:4,ANCHOR_TOP_LEFT:5,ANCHOR_TOP_RIGHT:6,ANCHOR_BOTTOM_LEFT:7,ANCHOR_BOTTOM_RIGHT:8,ANCHOR_CUSTOM:9, NO_CACHE:0,CACHE_SIMPLE:1,CACHE_DEEP:2},extendsWith:function(){return{__init:function(){this.behaviorList=[];this.styleCache={};this.lifecycleListenerList=[];this.scaleAnchor=this.ANCHOR_CENTER;this.behaviorList=[];this.domElement=document.createElement("div");this.domElement.style.position="absolute";this.domElement.style["-webkit-transform"]="translate3d(0,0,0)";this.domElement.style["-webkit-transition"]="all 0s linear";this.style("display","none");this.AABB=new CAAT.Rectangle;this.viewVertices= [new CAAT.Point(0,0,0),new CAAT.Point(0,0,0),new CAAT.Point(0,0,0),new CAAT.Point(0,0,0)];this.setVisible(true);this.resetTransform();this.setScale(1,1);this.setRotation(0);this.modelViewMatrix=new CAAT.Matrix;this.worldModelViewMatrix=new CAAT.Matrix;return this},lifecycleListenerList:null,behaviorList:null,x:0,y:0,width:0,height:0,preferredSize:null,minimumSize:null,start_time:0,duration:Number.MAX_VALUE,clip:false,tAnchorX:0,tAnchorY:0,scaleX:0,scaleY:0,scaleTX:0.5,scaleTY:0.5,scaleAnchor:0,rotationAngle:0, @@ -426,12 +431,12 @@ CAAT.Module({defines:"CAAT.Foundation.ActorContainer",aliases:["CAAT.ActorContai runion:new CAAT.Rectangle,layoutManager:null,layoutInvalidated:true,setLayout:function(a){this.layoutManager=a;return this},setBounds:function(a,b,c,d){CAAT.ActorContainer.superclass.setBounds.call(this,a,b,c,d);CAAT.currentDirector&&!CAAT.currentDirector.inValidation&&this.invalidateLayout();return this},__validateLayout:function(){this.__validateTree();this.layoutInvalidated=false},__validateTree:function(){if(this.layoutManager&&this.layoutManager.isInvalidated()){CAAT.currentDirector.inValidation= true;this.layoutManager.doLayout(this);for(var a=0;a=this.childrenList.length)b=this.childrenList.length;a.setParent(this);this.childrenList.splice(b,0,a);this.domElement.insertBefore(a.domElement,this.domElement.childNodes[b]);this.invalidateLayout();a.dirty=true;return this},findActorById:function(a){for(var b=this.childrenList,c=0,d=b.length;c=0;b--){var c=this.childrenList[b],d=new CAAT.Point(a.x,a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},destroy:function(){for(var a=this.childrenList.length-1;a>=0;a--)this.childrenList[a].destroy();CAAT.ActorContainer.superclass.destroy.call(this);return this},getNumChildren:function(){return this.childrenList.length},getNumActiveChildren:function(){return this.activeChildren.length}, -getChildAt:function(a){return this.childrenList[a]},setZOrder:function(a,b){var c=this.findChild(a);if(-1!==c){var d=this.childrenList;if(b!==c){if(b>=d.length)d.splice(c,1),d.push(a);else{c=d.splice(c,1);if(b<0)b=0;else if(b>d.length)b=d.length;d.splice(b,0,c[0])}for(var c=0,e=d.length;c=this.childrenList.length)b=this.childrenList.length;a.setParent(this);this.childrenList.splice(b,0,a);this.domElement.insertBefore(a.domElement,this.domElement.childNodes[b]);this.invalidateLayout();a.dirty=true;return this},findActorById:function(a){for(var b=this.childrenList,c=0,d=b.length;c=0;b--){var c=this.childrenList[b],d=new CAAT.Point(a.x,a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},destroy:function(){for(var a=this.childrenList.length-1;a>=0;a--)this.childrenList[a].destroy();CAAT.ActorContainer.superclass.destroy.call(this); +return this},getNumChildren:function(){return this.childrenList.length},getNumActiveChildren:function(){return this.activeChildren.length},getChildAt:function(a){return this.childrenList[a]},setZOrder:function(a,b){var c=this.findChild(a);if(-1!==c){var d=this.childrenList;if(b!==c){if(b>=d.length)d.splice(c,1),d.push(a);else{c=d.splice(c,1);if(b<0)b=0;else if(b>d.length)b=d.length;d.splice(b,0,c[0])}for(var c=0,e=d.length;c=0;)this.timerList[b].remove||this.timerList[b].checkTask(a),b--},ensureTimerTask:function(a){this.hasTimer(a)||this.timerList.push(a); return this},hasTimer:function(a){for(var b=this.timerList.length-1;b>=0;){if(this.timerList[b]===a)return true;b--}return false},createTimer:function(a,b,c,d,e){a=(new CAAT.TimerTask).create(a,b,c,d,e);a.taskId=this.timerSequence++;a.sceneTime=this.time;a.scene=this;this.timerList.push(a);return a},removeExpiredTimers:function(){var a;for(a=0;a=0;b--){var c=this.childrenList[b],d=new CAAT.Math.Point(a.x,a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},resetStats:function(){this.statistics.size_total=0;this.statistics.size_active=0;this.statistics.draws= -0;this.statistics.size_discarded_by_dirty_rects=0},render:function(a){if(!this.currentScene||!this.currentScene.isPaused()){this.time+=a;for(e=0,l=this.childrenList.length;e -0&&!navigator.isCocoonJS&&CAAT.DEBUG&&CAAT.DEBUG_DIRTYRECTS){f.beginPath();this.nDirtyRects=0;b=this.cDirtyRects;for(e=0;e=this.dirtyRects.length)for(b=0;b<32;b++)this.dirtyRects.push(new CAAT.Math.Rectangle);b=this.dirtyRects[this.dirtyRectsIndex];b.x=a.x;b.y=a.y;b.x1=a.x1;b.y1=a.y1;b.width=a.width;b.height=a.height;this.cDirtyRects.push(b)}},renderToContext:function(a,b){if(b.isInAnimationFrame(this.time)){a.setTransform(1,0,0,1,0,0);a.globalAlpha=1;a.globalCompositeOperation="source-over";a.clearRect(0,0,this.width,this.height);var c=this.ctx;this.ctx=a;a.save(); -var d=this.modelViewMatrix,e=this.worldModelViewMatrix;this.modelViewMatrix=this.worldModelViewMatrix=new CAAT.Math.Matrix;this.wdirty=true;b.animate(this,b.time);if(b.onRenderStart)b.onRenderStart(b.time);b.paintActor(this,b.time);if(b.onRenderEnd)b.onRenderEnd(b.time);this.worldModelViewMatrix=e;this.modelViewMatrix=d;a.restore();this.ctx=c}},addScene:function(a){a.setBounds(0,0,this.width,this.height);this.scenes.push(a);a.setEaseListener(this);null===this.currentScene&&this.setScene(0)},getNumScenes:function(){return this.scenes.length}, -easeInOut:function(a,b,c,d,e,f,g,h,i,j){if(a!==this.getCurrentSceneIndex()){a=this.scenes[a];d=this.scenes[d];if(!CAAT.__CSS__&&CAAT.CACHE_SCENE_ON_CHANGE)this.renderToContext(this.transitionScene.ctx,d),d=this.transitionScene;a.setExpired(false);d.setExpired(false);a.mouseEnabled=false;d.mouseEnabled=false;a.resetTransform();d.resetTransform();a.setLocation(0,0);d.setLocation(0,0);a.alpha=1;d.alpha=1;b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(g,h,c,i):b===CAAT.Foundation.Scene.EASE_SCALE? -a.easeScaleIn(0,g,h,c,i):a.easeTranslationIn(g,h,c,i);e===CAAT.Foundation.Scene.EASE_ROTATION?d.easeRotationOut(g,h,f,j):e===CAAT.Foundation.Scene.EASE_SCALE?d.easeScaleOut(0,g,h,f,j):d.easeTranslationOut(g,h,f,j);this.childrenList=[];d.goOut(a);a.getIn(d);this.addChild(d);this.addChild(a)}},easeInOutRandom:function(a,b,c,d){var e=Math.random(),f=Math.random(),g;e<0.33?(e=CAAT.Foundation.Scene.EASE_ROTATION,g=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):e<0.66?(e=CAAT.Foundation.Scene.EASE_SCALE, -g=(new CAAT.Behavior.Interpolator).createElasticOutInterpolator(1.1,0.4)):(e=CAAT.Foundation.Scene.EASE_TRANSLATE,g=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator());var h;f<0.33?(f=CAAT.Foundation.Scene.EASE_ROTATION,h=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):f<0.66?(f=CAAT.Foundation.Scene.EASE_SCALE,h=(new CAAT.Behavior.Interpolator).createExponentialOutInterpolator(4)):(f=CAAT.Foundation.Scene.EASE_TRANSLATE,h=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator()); -this.easeInOut(a,e,Math.random()*8.99>>0,b,f,Math.random()*8.99>>0,c,d,g,h)},easeIn:function(a,b,c,d,e,f){a=this.scenes[a];b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(c,d,e,f):b===CAAT.Foundation.Scene.EASE_SCALE?a.easeScaleIn(0,c,d,e,f):a.easeTranslationIn(c,d,e,f);this.childrenList=[];this.addChild(a);a.resetTransform();a.setLocation(0,0);a.alpha=1;a.mouseEnabled=false;a.setExpired(false)},setScene:function(a){a=this.scenes[a];this.childrenList=[];this.addChild(a);this.currentScene= -a;a.setExpired(false);a.mouseEnabled=true;a.resetTransform();a.setLocation(0,0);a.alpha=1;a.getIn();a.activated()},switchToScene:function(a,b,c,d){var e=this.getSceneIndex(this.currentScene);d?this.easeInOutRandom(a,e,b,c):this.setScene(a)},switchToPrevScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<=1||d===0||(c?this.easeInOutRandom(d-1,d,a,b):this.setScene(d-1))},switchToNextScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<= -1||d===this.getNumScenes()-1||(c?this.easeInOutRandom(d+1,d,a,b):this.setScene(d+1))},mouseEnter:function(){},mouseExit:function(){},mouseMove:function(){},mouseDown:function(){},mouseUp:function(){},mouseDrag:function(){},easeEnd:function(a,b){b?(this.currentScene=a,this.currentScene.activated()):a.setExpired(true);a.mouseEnabled=true;a.emptyBehaviorList()},getSceneIndex:function(a){for(var b=0;b500&&(b=500);if(this.onRenderStart)this.onRenderStart(b);this.render(b);this.debugInfo&&this.debugInfo(this.statistics);this.timeline=a;if(this.onRenderEnd)this.onRenderEnd(b);this.needsRepaint=false}},resetTimeline:function(){this.timeline=(new Date).getTime()},endLoop:function(){},setClear:function(a){this.clear=a;this.dirtyRectsEnabled=this.clear===CAAT.Foundation.Director.CLEAR_DIRTY_RECTS?true:false;return this},getAudioManager:function(){return this.audioManager},cumulateOffset:function(a, -b,c){var d=c+"Left";c+="Top";for(var e=0,f=0,g;navigator.browser!=="iOS"&&a&&a.style;)if(g=a.currentStyle?a.currentStyle.position:(g=(a.ownerDocument.defaultView||a.ownerDocument.parentWindow).getComputedStyle(a,null))?g.getPropertyValue("position"):null,/^(fixed)$/.test(g))break;else e+=a[d],f+=a[c],a=a[b];return{x:e,y:f,style:g}},getOffset:function(a){var b=this.cumulateOffset(a,"offsetParent","offset");return b.style==="fixed"?(a=this.cumulateOffset(a,a.parentNode?"parentNode":"parentElement", -"scroll"),{x:b.x+a.x,y:b.y+a.y}):{x:b.x,y:b.y}},getCanvasCoord:function(a,b){var c=new CAAT.Math.Point,d=0,e=0;if(!b)b=window.event;if(b.pageX||b.pageY)d=b.pageX,e=b.pageY;else if(b.clientX||b.clientY)d=b.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,e=b.clientY+document.body.scrollTop+document.documentElement.scrollTop;var f=this.getOffset(this.canvas);d-=f.x;e-=f.y;d*=this.SCREEN_RATIO;e*=this.SCREEN_RATIO;c.x=d;c.y=e;if(!this.modelViewMatrixI)this.modelViewMatrixI=this.modelViewMatrix.getInverse(); -this.modelViewMatrixI.transformCoord(c);d=c.x;e=c.y;a.set(d,e);this.screenMousePoint.set(d,e)},__mouseDownHandler:function(a){if(this.dragging&&this.lastSelectedActor)this.__mouseUpHandler(a);else{this.getCanvasCoord(this.mousePoint,a);this.isMouseDown=true;var b=this.findActorAtPosition(this.mousePoint);if(null!==b){var c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0));b.mouseDown((new CAAT.Event.MouseEvent).init(c.x,c.y,a,b,new CAAT.Math.Point(this.screenMousePoint.x, -this.screenMousePoint.y)))}this.lastSelectedActor=b}},__mouseUpHandler:function(a){this.isMouseDown=false;this.getCanvasCoord(this.mousePoint,a);var b=null,c=this.lastSelectedActor;null!==c&&(b=c.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0)),c.actionPerformed&&c.contains(b.x,b.y)&&c.actionPerformed(a),c.mouseUp((new CAAT.Event.MouseEvent).init(b.x,b.y,a,c,this.screenMousePoint,this.currentScene.time)));!this.dragging&&null!==c&&c.contains(b.x,b.y)&&c.mouseClick((new CAAT.Event.MouseEvent).init(b.x, -b.y,a,c,this.screenMousePoint,this.currentScene.time));this.in_=this.dragging=false},__mouseMoveHandler:function(a){var b,c,d=this.currentScene?this.currentScene.time:0;if(this.isMouseDown&&null!==this.lastSelectedActor){if(b=this.lastSelectedActor,c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0)),this.dragging||!(Math.abs(this.prevMousePoint.x-c.x)=this.width||b.y>=this.height))this.touching=true,this.__mouseDownHandler(a)}},__touchEndHandler:function(a){if(this.touching)a.preventDefault(),a.returnValue=false,a=a.changedTouches[0],this.getCanvasCoord(this.mousePoint,a),this.touching= -false,this.__mouseUpHandler(a)},__touchMoveHandler:function(a){if(this.touching&&(a.preventDefault(),a.returnValue=false,!this.gesturing))for(var b=0;b=this.width||f.y>=this.height)){var g= -this.findActorAtPosition(f);g!==null&&(f=g.viewToModel(f),this.touches[e]||(this.touches[e]={actor:g,touch:new CAAT.Event.TouchInfo(e,f.x,f.y,g)},c.push(e)))}}e={};for(b=0;b=b.width|| -d.y>=b.height))b.touching=true,b.__mouseDownHandler(c)}},false);window.addEventListener("mouseover",function(c){if(c.target===a&&!b.dragging){c.preventDefault();c.cancelBubble=true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width||d.y>=b.height||b.__mouseOverHandler(c)}},false);window.addEventListener("mouseout",function(c){if(c.target===a&&!b.dragging)c.preventDefault(),c.cancelBubble=true,c.stopPropagation&&c.stopPropagation(),b.getCanvasCoord(b.mousePoint, -c),b.__mouseOutHandler(c)},false);window.addEventListener("mousemove",function(a){a.preventDefault();a.cancelBubble=true;a.stopPropagation&&a.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,a);(b.dragging||!(d.x<0||d.y<0||d.x>=b.width||d.y>=b.height))&&b.__mouseMoveHandler(a)},false);window.addEventListener("dblclick",function(c){if(c.target===a){c.preventDefault();c.cancelBubble=true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width|| -d.y>=b.height||b.__mouseDBLClickHandler(c)}},false);CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MOUSE?(a.addEventListener("touchstart",this.__touchStartHandler.bind(this),false),a.addEventListener("touchmove",this.__touchMoveHandler.bind(this),false),a.addEventListener("touchend",this.__touchEndHandler.bind(this),false),a.addEventListener("gesturestart",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureStart(c.scale,c.rotation)},false),a.addEventListener("gestureend",function(c){if(c.target=== -a)c.preventDefault(),c.returnValue=false,b.__gestureEnd(c.scale,c.rotation)},false),a.addEventListener("gesturechange",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureChange(c.scale,c.rotation)},false)):CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MULTITOUCH&&(a.addEventListener("touchstart",this.__touchStartHandlerMT.bind(this),false),a.addEventListener("touchmove",this.__touchMoveHandlerMT.bind(this),false),a.addEventListener("touchend",this.__touchEndHandlerMT.bind(this),false), -a.addEventListener("touchcancel",this.__touchCancelHandleMT.bind(this),false),a.addEventListener("gesturestart",this.__touchGestureStartHandleMT.bind(this),false),a.addEventListener("gestureend",this.__touchGestureEndHandleMT.bind(this),false),a.addEventListener("gesturechange",this.__touchGestureChangeHandleMT.bind(this),false))},enableEvents:function(a){CAAT.RegisterDirector(this);this.in_=false;this.createEventHandler(a)},createEventHandler:function(a){this.in_=false;this.addHandlers(a)}}},onCreate:function(){if(typeof CAAT.__CSS__!== -"undefined")CAAT.Foundation.Director.prototype.clip=true,CAAT.Foundation.Director.prototype.glEnabled=false,CAAT.Foundation.Director.prototype.getRenderType=function(){return"CSS"},CAAT.Foundation.Director.prototype.setScaleProportional=function(a,b){var c=Math.min(a/this.referenceWidth,b/this.referenceHeight);this.setScaleAnchored(c,c,0,0);this.eventHandler.style.width=""+this.referenceWidth+"px";this.eventHandler.style.height=""+this.referenceHeight+"px"},CAAT.Foundation.Director.prototype.setBounds= -function(a,b,c,d){CAAT.Foundation.Director.superclass.setBounds.call(this,a,b,c,d);for(a=0;a=0;b--){var c=this.childrenList[b],d=new CAAT.Math.Point(a.x, +a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},resetStats:function(){this.statistics.size_total=0;this.statistics.size_active=0;this.statistics.draws=0;this.statistics.size_discarded_by_dirty_rects=0},render:function(a){if(!this.currentScene||!this.currentScene.isPaused()){this.time+=a;for(e=0,l=this.childrenList.length;e0&&!navigator.isCocoonJS&&CAAT.DEBUG&&CAAT.DEBUG_DIRTYRECTS){f.beginPath();this.nDirtyRects=0;b=this.cDirtyRects;for(e=0;e=this.dirtyRects.length)for(b=0;b<32;b++)this.dirtyRects.push(new CAAT.Math.Rectangle);b=this.dirtyRects[this.dirtyRectsIndex];b.x=a.x;b.y=a.y;b.x1=a.x1;b.y1=a.y1;b.width=a.width;b.height=a.height; +this.cDirtyRects.push(b)}},renderToContext:function(a,b){if(b.isInAnimationFrame(this.time)){a.setTransform(1,0,0,1,0,0);a.globalAlpha=1;a.globalCompositeOperation="source-over";a.clearRect(0,0,this.width,this.height);var c=this.ctx;this.ctx=a;a.save();var d=this.modelViewMatrix,e=this.worldModelViewMatrix;this.modelViewMatrix=this.worldModelViewMatrix=new CAAT.Math.Matrix;this.wdirty=true;b.animate(this,b.time);if(b.onRenderStart)b.onRenderStart(b.time);b.paintActor(this,b.time);if(b.onRenderEnd)b.onRenderEnd(b.time); +this.worldModelViewMatrix=e;this.modelViewMatrix=d;a.restore();this.ctx=c}},addScene:function(a){a.setBounds(0,0,this.width,this.height);this.scenes.push(a);a.setEaseListener(this);null===this.currentScene&&this.setScene(0)},getNumScenes:function(){return this.scenes.length},easeInOut:function(a,b,c,d,e,f,g,h,i,j){if(a!==this.getCurrentSceneIndex()){a=this.scenes[a];d=this.scenes[d];if(!CAAT.__CSS__&&CAAT.CACHE_SCENE_ON_CHANGE)this.renderToContext(this.transitionScene.ctx,d),d=this.transitionScene; +a.setExpired(false);d.setExpired(false);a.mouseEnabled=false;d.mouseEnabled=false;a.resetTransform();d.resetTransform();a.setLocation(0,0);d.setLocation(0,0);a.alpha=1;d.alpha=1;b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(g,h,c,i):b===CAAT.Foundation.Scene.EASE_SCALE?a.easeScaleIn(0,g,h,c,i):a.easeTranslationIn(g,h,c,i);e===CAAT.Foundation.Scene.EASE_ROTATION?d.easeRotationOut(g,h,f,j):e===CAAT.Foundation.Scene.EASE_SCALE?d.easeScaleOut(0,g,h,f,j):d.easeTranslationOut(g,h,f,j);this.childrenList= +[];d.goOut(a);a.getIn(d);this.addChild(d);this.addChild(a)}},easeInOutRandom:function(a,b,c,d){var e=Math.random(),f=Math.random(),g;e<0.33?(e=CAAT.Foundation.Scene.EASE_ROTATION,g=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):e<0.66?(e=CAAT.Foundation.Scene.EASE_SCALE,g=(new CAAT.Behavior.Interpolator).createElasticOutInterpolator(1.1,0.4)):(e=CAAT.Foundation.Scene.EASE_TRANSLATE,g=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator());var h;f<0.33?(f=CAAT.Foundation.Scene.EASE_ROTATION, +h=(new CAAT.Behavior.Interpolator).createExponentialInOutInterpolator(4)):f<0.66?(f=CAAT.Foundation.Scene.EASE_SCALE,h=(new CAAT.Behavior.Interpolator).createExponentialOutInterpolator(4)):(f=CAAT.Foundation.Scene.EASE_TRANSLATE,h=(new CAAT.Behavior.Interpolator).createBounceOutInterpolator());this.easeInOut(a,e,Math.random()*8.99>>0,b,f,Math.random()*8.99>>0,c,d,g,h)},easeIn:function(a,b,c,d,e,f){a=this.scenes[a];b===CAAT.Foundation.Scene.EASE_ROTATION?a.easeRotationIn(c,d,e,f):b===CAAT.Foundation.Scene.EASE_SCALE? +a.easeScaleIn(0,c,d,e,f):a.easeTranslationIn(c,d,e,f);this.childrenList=[];this.addChild(a);a.resetTransform();a.setLocation(0,0);a.alpha=1;a.mouseEnabled=false;a.setExpired(false)},setScene:function(a){a=this.scenes[a];this.childrenList=[];this.addChild(a);this.currentScene=a;a.setExpired(false);a.mouseEnabled=true;a.resetTransform();a.setLocation(0,0);a.alpha=1;a.getIn();a.activated()},switchToScene:function(a,b,c,d){var e=this.getSceneIndex(this.currentScene);d?this.easeInOutRandom(a,e,b,c):this.setScene(a)}, +switchToPrevScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<=1||d===0||(c?this.easeInOutRandom(d-1,d,a,b):this.setScene(d-1))},switchToNextScene:function(a,b,c){var d=this.getSceneIndex(this.currentScene);this.getNumScenes()<=1||d===this.getNumScenes()-1||(c?this.easeInOutRandom(d+1,d,a,b):this.setScene(d+1))},mouseEnter:function(){},mouseExit:function(){},mouseMove:function(){},mouseDown:function(){},mouseUp:function(){},mouseDrag:function(){},easeEnd:function(a, +b){b?(this.currentScene=a,this.currentScene.activated()):a.setExpired(true);a.mouseEnabled=true;a.emptyBehaviorList()},getSceneIndex:function(a){for(var b=0;b500&&(b=500);if(this.onRenderStart)this.onRenderStart(b);this.render(b);this.debugInfo&&this.debugInfo(this.statistics);this.timeline=a;if(this.onRenderEnd)this.onRenderEnd(b);this.needsRepaint=false}},resetTimeline:function(){this.timeline= +(new Date).getTime()},endLoop:function(){},setClear:function(a){this.clear=a;this.dirtyRectsEnabled=this.clear===CAAT.Foundation.Director.CLEAR_DIRTY_RECTS?true:false;return this},getAudioManager:function(){return this.audioManager},cumulateOffset:function(a,b,c){var d=c+"Left";c+="Top";for(var e=0,f=0,g;navigator.browser!=="iOS"&&a&&a.style;)if(g=a.currentStyle?a.currentStyle.position:(g=(a.ownerDocument.defaultView||a.ownerDocument.parentWindow).getComputedStyle(a,null))?g.getPropertyValue("position"): +null,/^(fixed)$/.test(g))break;else e+=a[d],f+=a[c],a=a[b];return{x:e,y:f,style:g}},getOffset:function(a){var b=this.cumulateOffset(a,"offsetParent","offset");return b.style==="fixed"?(a=this.cumulateOffset(a,a.parentNode?"parentNode":"parentElement","scroll"),{x:b.x+a.x,y:b.y+a.y}):{x:b.x,y:b.y}},getCanvasCoord:function(a,b){var c=new CAAT.Math.Point,d=0,e=0;if(!b)b=window.event;if(b.pageX||b.pageY)d=b.pageX,e=b.pageY;else if(b.clientX||b.clientY)d=b.clientX+document.body.scrollLeft+document.documentElement.scrollLeft, +e=b.clientY+document.body.scrollTop+document.documentElement.scrollTop;var f=this.getOffset(this.canvas);d-=f.x;e-=f.y;d*=this.SCREEN_RATIO;e*=this.SCREEN_RATIO;c.x=d;c.y=e;if(!this.modelViewMatrixI)this.modelViewMatrixI=this.modelViewMatrix.getInverse();this.modelViewMatrixI.transformCoord(c);d=c.x;e=c.y;a.set(d,e);this.screenMousePoint.set(d,e)},__mouseDownHandler:function(a){if(this.dragging&&this.lastSelectedActor)this.__mouseUpHandler(a);else{this.getCanvasCoord(this.mousePoint,a);this.isMouseDown= +true;var b=this.findActorAtPosition(this.mousePoint);if(null!==b){var c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0));b.mouseDown((new CAAT.Event.MouseEvent).init(c.x,c.y,a,b,new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y)))}this.lastSelectedActor=b}},__mouseUpHandler:function(a){this.isMouseDown=false;this.getCanvasCoord(this.mousePoint,a);var b=null,c=this.lastSelectedActor;null!==c&&(b=c.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x, +this.screenMousePoint.y,0)),c.actionPerformed&&c.contains(b.x,b.y)&&c.actionPerformed(a),c.mouseUp((new CAAT.Event.MouseEvent).init(b.x,b.y,a,c,this.screenMousePoint,this.currentScene.time)));!this.dragging&&null!==c&&c.contains(b.x,b.y)&&c.mouseClick((new CAAT.Event.MouseEvent).init(b.x,b.y,a,c,this.screenMousePoint,this.currentScene.time));this.in_=this.dragging=false},__mouseMoveHandler:function(a){var b,c,d=this.currentScene?this.currentScene.time:0;if(this.isMouseDown&&null!==this.lastSelectedActor){if(b= +this.lastSelectedActor,c=b.viewToModel(new CAAT.Math.Point(this.screenMousePoint.x,this.screenMousePoint.y,0)),this.dragging||!(Math.abs(this.prevMousePoint.x-c.x)=this.width||b.y>=this.height))this.touching=true,this.__mouseDownHandler(a)}},__touchEndHandler:function(a){if(this.touching)a.preventDefault(),a.returnValue=false,a=a.changedTouches[0],this.getCanvasCoord(this.mousePoint,a),this.touching=false,this.__mouseUpHandler(a)},__touchMoveHandler:function(a){if(this.touching&&(a.preventDefault(),a.returnValue=false,!this.gesturing))for(var b=0;b=this.width||f.y>=this.height)){var g=this.findActorAtPosition(f);g!==null&&(f=g.viewToModel(f),this.touches[e]||(this.touches[e]={actor:g,touch:new CAAT.Event.TouchInfo(e,f.x,f.y,g)},c.push(e)))}}e={};for(b=0;b=b.width||d.y>=b.height))b.touching=true,b.__mouseDownHandler(c)}},false);window.addEventListener("mouseover",function(c){if(c.target===a&&!b.dragging){c.preventDefault();c.cancelBubble=true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint; +b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width||d.y>=b.height||b.__mouseOverHandler(c)}},false);window.addEventListener("mouseout",function(c){if(c.target===a&&!b.dragging)c.preventDefault(),c.cancelBubble=true,c.stopPropagation&&c.stopPropagation(),b.getCanvasCoord(b.mousePoint,c),b.__mouseOutHandler(c)},false);window.addEventListener("mousemove",function(a){a.preventDefault();a.cancelBubble=true;a.stopPropagation&&a.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,a);(b.dragging||!(d.x< +0||d.y<0||d.x>=b.width||d.y>=b.height))&&b.__mouseMoveHandler(a)},false);window.addEventListener("dblclick",function(c){if(c.target===a){c.preventDefault();c.cancelBubble=true;c.stopPropagation&&c.stopPropagation();var d=b.mousePoint;b.getCanvasCoord(d,c);d.x<0||d.y<0||d.x>=b.width||d.y>=b.height||b.__mouseDBLClickHandler(c)}},false);CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MOUSE?(a.addEventListener("touchstart",this.__touchStartHandler.bind(this),false),a.addEventListener("touchmove",this.__touchMoveHandler.bind(this), +false),a.addEventListener("touchend",this.__touchEndHandler.bind(this),false),a.addEventListener("gesturestart",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureStart(c.scale,c.rotation)},false),a.addEventListener("gestureend",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureEnd(c.scale,c.rotation)},false),a.addEventListener("gesturechange",function(c){if(c.target===a)c.preventDefault(),c.returnValue=false,b.__gestureChange(c.scale,c.rotation)}, +false)):CAAT.TOUCH_BEHAVIOR===CAAT.TOUCH_AS_MULTITOUCH&&(a.addEventListener("touchstart",this.__touchStartHandlerMT.bind(this),false),a.addEventListener("touchmove",this.__touchMoveHandlerMT.bind(this),false),a.addEventListener("touchend",this.__touchEndHandlerMT.bind(this),false),a.addEventListener("touchcancel",this.__touchCancelHandleMT.bind(this),false),a.addEventListener("gesturestart",this.__touchGestureStartHandleMT.bind(this),false),a.addEventListener("gestureend",this.__touchGestureEndHandleMT.bind(this), +false),a.addEventListener("gesturechange",this.__touchGestureChangeHandleMT.bind(this),false))},enableEvents:function(a){CAAT.RegisterDirector(this);this.in_=false;this.createEventHandler(a)},createEventHandler:function(a){this.in_=false;this.addHandlers(a)}}},onCreate:function(){if(typeof CAAT.__CSS__!=="undefined")CAAT.Foundation.Director.prototype.clip=true,CAAT.Foundation.Director.prototype.glEnabled=false,CAAT.Foundation.Director.prototype.getRenderType=function(){return"CSS"},CAAT.Foundation.Director.prototype.setScaleProportional= +function(a,b){var c=Math.min(a/this.referenceWidth,b/this.referenceHeight);this.setScaleAnchored(c,c,0,0);this.eventHandler.style.width=""+this.referenceWidth+"px";this.eventHandler.style.height=""+this.referenceHeight+"px"},CAAT.Foundation.Director.prototype.setBounds=function(a,b,c,d){CAAT.Foundation.Director.superclass.setBounds.call(this,a,b,c,d);for(a=0;a>0)+1)*b},setFillStyle:function(a){this.fill=a},setStrokeStyle:function(a){this.stroke= a},setStrokeSize:function(a){this.strokeSize=a},setAlignment:function(a){this.alignment=a},setFontSize:function(a){if(a!==this.fontSize)this.fontSize=a,this.__setFont()}};var b=function(){this.text="";return this};b.prototype={x:0,y:0,width:0,text:null,crcs:null,rcs:null,styles:null,images:null,lines:null,documentHeight:0,anchorStack:null,__nextLine:function(){this.x=0;this.currentLine=new f(CAAT.Module.Font.Font.getFontMetrics(this.crcs.sfont));this.lines.push(this.currentLine)},__image:function(a, -b,c){var e;e=b&&c?a.getWidth():a.getWrappedImageWidth();this.width&&e+this.x>this.width&&this.x>0&&this.__nextLine();this.currentLine.addElementImage(new d(this.x,a,b,c,this.crcs.clone(),this.__getCurrentAnchor()));this.x+=e},__text:function(){if(this.text.length!==0){var a=this.ctx.measureText(this.text).width;this.width&&a+this.x>this.width&&this.x>0&&this.__nextLine();this.currentLine.addElement(new e(this.text,this.x,a,0,this.crcs.clone(),this.__getCurrentAnchor()));this.x+=a;this.text=""}},fchar:function(a){a=== -" "?(this.__text(),this.x+=this.ctx.measureText(a).width,this.width&&this.x>this.width&&this.__nextLine()):this.text+=a},end:function(){this.text.length>0&&this.__text();for(var a=0,b=0,c=0;c>0);this.lines[c].setY(a)}this.documentHeight=a+b},getDocumentHeight:function(){return this.documentHeight},__getCurrentAnchor:function(){return this.anchorStack.length?this.anchorStack[this.anchorStack.length- -1]:null},__resetAppliedStyles:function(){this.rcs=[];this.__pushDefaultStyles()},__pushDefaultStyles:function(){this.crcs=(new a(this.ctx)).setDefault(this.styles["default"]);this.rcs.push(this.crcs)},__pushStyle:function(b){var c=this.crcs;this.crcs=new a(this.ctx);this.crcs.chain=c;this.crcs.setStyle(b);this.crcs.applyStyle();this.rcs.push(this.crcs)},__popStyle:function(){if(this.rcs.length>1)this.rcs.pop(),this.crcs=this.rcs[this.rcs.length-1],this.crcs.applyStyle()},__popAnchor:function(){this.anchorStack.length> -0&&this.anchorStack.pop()},__pushAnchor:function(a){this.anchorStack.push(a)},start:function(a,b,c,d){this.y=this.x=0;this.width=typeof d!=="undefined"?d:0;this.ctx=a;this.lines=[];this.styles=b;this.images=c;this.anchorStack=[];this.__resetAppliedStyles();this.__nextLine()},setTag:function(a){this.__text();a=a.toLowerCase();if(a==="b")this.crcs.setBold(true);else if(a==="/b")this.crcs.setBold(false);else if(a==="i")this.crcs.setItalic(true);else if(a==="/i")this.crcs.setItalic(false);else if(a=== -"stroked")this.crcs.setStroked(true);else if(a==="/stroked")this.crcs.setStroked(false);else if(a==="filled")this.crcs.setFilled(true);else if(a==="/filled")this.crcs.setFilled(false);else if(a==="tab")this.x=this.crcs.getTabPos(this.x);else if(a==="br")this.__nextLine();else if(a==="/a")this.__popAnchor();else if(a==="/style")this.rcs.length>1&&this.__popStyle();else if(a.indexOf("fillcolor")===0)a=a.split("="),this.crcs.setFillStyle(a[1]);else if(a.indexOf("strokecolor")===0)a=a.split("="),this.crcs.setStrokeStyle(a[1]); -else if(a.indexOf("strokesize")===0)a=a.split("="),this.crcs.setStrokeSize(a[1]|0);else if(a.indexOf("fontsize")===0)a=a.split("="),this.crcs.setFontSize(a[1]|0);else if(a.indexOf("style")===0)a=a.split("="),(a=this.styles[a[1]])&&this.__pushStyle(a);else if(a.indexOf("image")===0){var a=a.split("=")[1].split(","),b=a[0];if(this.images[b]){var c=0,d=0;a.length>=3&&(c=a[1]|0,d=a[2]|0);this.__image(this.images[b],c,d)}}else a.indexOf("a=")===0&&(a=a.split("="),this.__pushAnchor(a[1]))}};var c=function(a, -b){this.link=a;this.style=b;return this};c.prototype={x:null,y:null,width:null,height:null,style:null,link:null,isLink:function(){return this.link},setLink:function(a){this.link=a;return this},getLink:function(){return this.link},contains:function(){return false}};var d=function(a,b,c,e,f,m){d.superclass.constructor.call(this,m,f);this.x=a;this.image=b;this.row=c;this.column=e;this.width=b.getWidth();this.height=b.getHeight();if(this.image instanceof CAAT.SpriteImage||this.image instanceof CAAT.Foundation.SpriteImage)this.spriteIndex= -c*b.columns+e,this.paint=this.paintSI;return this};d.prototype={image:null,row:null,column:null,spriteIndex:null,paint:function(a){this.style.image(a);a.drawImage(this.image,this.x,-this.height+1)},paintSI:function(a){this.style.image(a);this.image.setSpriteIndex(this.spriteIndex);this.image.paint({ctx:a},0,this.x,-this.height+1)},getHeight:function(){return this.image instanceof CAAT.Foundation.SpriteImage?this.image.singleHeight:this.image.height},getFontMetrics:function(){return null},contains:function(a, -b){return a>=this.x&&a<=this.x+this.width&&b>=this.y&&b=this.x&&a<=this.x+this.width&&b>=this.y&&b<=this.y+this.height},setYPosition:function(a){this.bl=a;this.y=a-this.fm.ascent}};extend(d,c);extend(e,c);var f=function(a){this.elements=[];this.defaultFontMetrics=a;return this};f.prototype={elements:null,width:0,height:0,defaultHeight:0,y:0,x:0,alignment:null,baselinePos:0,addElement:function(a){this.width=Math.max(this.width,a.x+a.width);this.height=Math.max(this.height,a.height);this.elements.push(a);this.alignment=a.style.__getProperty("alignment")}, -addElementImage:function(a){this.width=Math.max(this.width,a.x+a.width);this.height=Math.max(this.height,a.height);this.elements.push(a)},getHeight:function(){return this.height},setY:function(a){this.y=a},getY:function(){return this.y},paint:function(a){a.save();a.translate(this.x,this.y+this.baselinePos);for(var b=0;b=0.6&&this.elements.length>1){var c=a-this.width,c=c/(this.elements.length-1)|0;for(b=1;ba.ascent&&(a=e):a=e:b?d.getHeight()>d.getHeight()&& -(b=d):b=d}this.baselinePos=Math.max(a?a.ascent:this.defaultFontMetrics.ascent,b?b.getHeight():this.defaultFontMetrics.ascent);this.height=this.baselinePos+(a!=null?a.descent:this.defaultFontMetrics.descent);for(c=0;c",d+1),-1!==o&&(n=f.substr(d+1,o-d-1),n.indexOf("<")!==-1?(this.rc.fchar(p),d+=1):(this.rc.setTag(n),d=o+1))):(this.rc.fchar(p),d+=1);this.rc.end();this.lines=this.rc.lines;this.__calculateDocumentDimension(typeof b==="undefined"?0:b);this.setLinesAlignment();q.restore();this.setPreferredSize(this.documentWidth,this.documentHeight);this.invalidateLayout();this.setDocumentPosition();c&&this.cacheAsBitmap(0,c);return this}},setVerticalAlignment:function(a){this.valignment= -a;this.setDocumentPosition();return this},setHorizontalAlignment:function(a){this.halignment=a;this.setDocumentPosition();return this},setDocumentPosition:function(){var a=0,b=0;this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER?b=(this.height-this.documentHeight)/2:this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.BOTTOM&&(b=this.height-this.documentHeight);this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER?a=(this.width-this.documentWidth)/ -2:this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.RIGHT&&(a=this.width-this.documentWidth);this.documentX=a;this.documentY=b},__calculateDocumentDimension:function(a){var b,c=0;for(b=this.documentHeight=this.documentWidth=0;b=a&&d.y+d.height>=b)return d.__getElementAt(a-d.x,b-d.y)}return null},mouseExit:function(){CAAT.setCursor("default")},mouseMove:function(a){(a=this.__getDocumentElementAt(a.x,a.y))&&a.getLink()?CAAT.setCursor("pointer"):CAAT.setCursor("default")},mouseClick:function(a){this.clickCallback&&(a=this.__getDocumentElementAt(a.x,a.y),a.getLink()&&this.clickCallback(a.getLink()))},setClickCallback:function(a){this.clickCallback=a;return this}}}}); +b,c){var e;e=typeof b!=="undefined"&&typeof c!=="undefined"?a.getWidth():a instanceof CAAT.Foundation.SpriteImage?a.getWidth():a.getWrappedImageWidth();this.width&&e+this.x>this.width&&this.x>0&&this.__nextLine();this.currentLine.addElementImage(new d(this.x,a,b,c,this.crcs.clone(),this.__getCurrentAnchor()));this.x+=e},__text:function(){if(this.text.length!==0){var a=this.ctx.measureText(this.text).width;this.width&&a+this.x>this.width&&this.x>0&&this.__nextLine();this.currentLine.addElement(new e(this.text, +this.x,a,0,this.crcs.clone(),this.__getCurrentAnchor()));this.x+=a;this.text=""}},fchar:function(a){a===" "?(this.__text(),this.x+=this.ctx.measureText(a).width,this.width&&this.x>this.width&&this.__nextLine()):this.text+=a},end:function(){this.text.length>0&&this.__text();for(var a=0,b=0,c=0;c>0);this.lines[c].setY(a)}this.documentHeight=a+b},getDocumentHeight:function(){return this.documentHeight}, +__getCurrentAnchor:function(){return this.anchorStack.length?this.anchorStack[this.anchorStack.length-1]:null},__resetAppliedStyles:function(){this.rcs=[];this.__pushDefaultStyles()},__pushDefaultStyles:function(){this.crcs=(new a(this.ctx)).setDefault(this.styles["default"]);this.rcs.push(this.crcs)},__pushStyle:function(b){var c=this.crcs;this.crcs=new a(this.ctx);this.crcs.chain=c;this.crcs.setStyle(b);this.crcs.applyStyle();this.rcs.push(this.crcs)},__popStyle:function(){if(this.rcs.length>1)this.rcs.pop(), +this.crcs=this.rcs[this.rcs.length-1],this.crcs.applyStyle()},__popAnchor:function(){this.anchorStack.length>0&&this.anchorStack.pop()},__pushAnchor:function(a){this.anchorStack.push(a)},start:function(a,b,c,d){this.y=this.x=0;this.width=typeof d!=="undefined"?d:0;this.ctx=a;this.lines=[];this.styles=b;this.images=c;this.anchorStack=[];this.__resetAppliedStyles();this.__nextLine()},setTag:function(a){this.__text();a=a.toLowerCase();if(a==="b")this.crcs.setBold(true);else if(a==="/b")this.crcs.setBold(false); +else if(a==="i")this.crcs.setItalic(true);else if(a==="/i")this.crcs.setItalic(false);else if(a==="stroked")this.crcs.setStroked(true);else if(a==="/stroked")this.crcs.setStroked(false);else if(a==="filled")this.crcs.setFilled(true);else if(a==="/filled")this.crcs.setFilled(false);else if(a==="tab")this.x=this.crcs.getTabPos(this.x);else if(a==="br")this.__nextLine();else if(a==="/a")this.__popAnchor();else if(a==="/style")this.rcs.length>1&&this.__popStyle();else if(a.indexOf("fillcolor")===0)a= +a.split("="),this.crcs.setFillStyle(a[1]);else if(a.indexOf("strokecolor")===0)a=a.split("="),this.crcs.setStrokeStyle(a[1]);else if(a.indexOf("strokesize")===0)a=a.split("="),this.crcs.setStrokeSize(a[1]|0);else if(a.indexOf("fontsize")===0)a=a.split("="),this.crcs.setFontSize(a[1]|0);else if(a.indexOf("style")===0)a=a.split("="),(a=this.styles[a[1]])&&this.__pushStyle(a);else if(a.indexOf("image")===0){var a=a.split("=")[1].split(","),b=a[0];if(this.images[b]){var c=0,d=0;a.length>=3&&(c=a[1]|0, +d=a[2]|0);this.__image(this.images[b],c,d)}else CAAT.currentDirector.getImage(b)&&this.__image(CAAT.currentDirector.getImage(b))}else a.indexOf("a=")===0&&(a=a.split("="),this.__pushAnchor(a[1]))}};var c=function(a,b){this.link=a;this.style=b;return this};c.prototype={x:null,y:null,width:null,height:null,style:null,link:null,isLink:function(){return this.link},setLink:function(a){this.link=a;return this},getLink:function(){return this.link},contains:function(){return false}};var d=function(a,b,c, +e,f,m){d.superclass.constructor.call(this,m,f);this.x=a;this.image=b;this.row=c;this.column=e;this.width=b.getWidth();this.height=b.getHeight();if(this.image instanceof CAAT.SpriteImage||this.image instanceof CAAT.Foundation.SpriteImage)this.spriteIndex=typeof c==="undefined"||typeof e==="undefined"?0:c*b.columns+e,this.paint=this.paintSI;return this};d.prototype={image:null,row:null,column:null,spriteIndex:null,paint:function(a){this.style.image(a);a.drawImage(this.image,this.x,-this.height+1)}, +paintSI:function(a){this.style.image(a);this.image.setSpriteIndex(this.spriteIndex);this.image.paint({ctx:a},0,this.x,-this.height+1)},getHeight:function(){return this.image instanceof CAAT.Foundation.SpriteImage?this.image.getHeight():this.image.height},getFontMetrics:function(){return null},contains:function(a,b){return a>=this.x&&a<=this.x+this.width&&b>=this.y&&b=this.x&&a<=this.x+this.width&&b>=this.y&&b<=this.y+this.height},setYPosition:function(a){this.bl=a;this.y=a-this.fm.ascent}}; +extend(d,c);extend(e,c);var f=function(a){this.elements=[];this.defaultFontMetrics=a;return this};f.prototype={elements:null,width:0,height:0,defaultHeight:0,y:0,x:0,alignment:null,baselinePos:0,addElement:function(a){this.width=Math.max(this.width,a.x+a.width);this.height=Math.max(this.height,a.height);this.elements.push(a);this.alignment=a.style.__getProperty("alignment")},addElementImage:function(a){this.width=Math.max(this.width,a.x+a.width);this.height=Math.max(this.height,a.height);this.elements.push(a)}, +getHeight:function(){return this.height},setY:function(a){this.y=a},getY:function(){return this.y},paint:function(a){a.save();a.translate(this.x,this.y+this.baselinePos);for(var b=0;b=0.6&&this.elements.length>1){var c=a-this.width,c=c/(this.elements.length- +1)|0;for(b=1;ba.ascent&&(a=e):a=e:b?d.getHeight()>d.getHeight()&&(b=d):b=d}this.baselinePos=Math.max(a?a.ascent:this.defaultFontMetrics.ascent,b?b.getHeight():this.defaultFontMetrics.ascent);this.height= +this.baselinePos+(a!=null?a.descent:this.defaultFontMetrics.descent);for(c=0;c", +d+1),-1!==o&&(n=f.substr(d+1,o-d-1),n.indexOf("<")!==-1?(this.rc.fchar(p),d+=1):(this.rc.setTag(n),d=o+1))):(this.rc.fchar(p),d+=1);this.rc.end();this.lines=this.rc.lines;this.__calculateDocumentDimension(typeof b==="undefined"?0:b);this.setLinesAlignment();q.restore();this.setPreferredSize(this.documentWidth,this.documentHeight);this.invalidateLayout();this.setDocumentPosition();c&&this.cacheAsBitmap(0,c);if(this.matchTextSize)this.width=this.preferredSize.width,this.height=this.preferredSize.height; +return this}},setVerticalAlignment:function(a){this.valignment=a;this.setDocumentPosition();return this},setHorizontalAlignment:function(a){this.halignment=a;this.setDocumentPosition();return this},setDocumentPosition:function(a,b){typeof a!=="undefined"&&this.setHorizontalAlignment(a);typeof b!=="undefined"&&this.setVerticalAlignment(b);var c=0,d=0;this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER?d=(this.height-this.documentHeight)/2:this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.BOTTOM&& +(d=this.height-this.documentHeight);this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER?c=(this.width-this.documentWidth)/2:this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.RIGHT&&(c=this.width-this.documentWidth);this.documentX=c;this.documentY=d},__calculateDocumentDimension:function(a){var b,c=0;for(b=this.documentHeight=this.documentWidth=0;b=a&&d.y+d.height>=b)return d.__getElementAt(a-d.x,b-d.y)}return null},mouseExit:function(){CAAT.setCursor("default")},mouseMove:function(a){(a=this.__getDocumentElementAt(a.x,a.y))&&a.getLink()?CAAT.setCursor("pointer"):CAAT.setCursor("default")},mouseClick:function(a){this.clickCallback&&(a=this.__getDocumentElementAt(a.x,a.y),a.getLink()&& +this.clickCallback(a.getLink()))},setClickCallback:function(a){this.clickCallback=a;return this}}}}); CAAT.Module({defines:"CAAT.Foundation.UI.PathActor",aliases:["CAAT.PathActor"],depends:["CAAT.Foundation.Actor"],extendsClass:"CAAT.Foundation.Actor",extendsWith:{path:null,pathBoundingRectangle:null,bOutline:false,outlineColor:"black",onUpdateCallback:null,interactive:false,getPath:function(){return this.path},setPath:function(a){this.path=a;if(a!=null)this.pathBoundingRectangle=a.getBoundingBox(),this.setInteractive(this.interactive);return this},paint:function(a,b){CAAT.Foundation.UI.PathActor.superclass.paint.call(this, a,b);if(this.path){var c=a.ctx;c.strokeStyle="#000";this.path.paint(a,this.interactive);if(this.bOutline)c.strokeStyle=this.outlineColor,c.strokeRect(this.pathBoundingRectangle.x,this.pathBoundingRectangle.y,this.pathBoundingRectangle.width,this.pathBoundingRectangle.height)}},showBoundingBox:function(a,b){if((this.bOutline=a)&&b)this.outlineColor=b;return this},setInteractive:function(a){this.interactive=a;this.path&&this.path.setInteractive(a);return this},setOnUpdateCallback:function(a){this.onUpdateCallback= a;return this},mouseDrag:function(a){this.path.drag(a.point.x,a.point.y,this.onUpdateCallback)},mouseDown:function(a){this.path.press(a.point.x,a.point.y)},mouseUp:function(){this.path.release()}}}); diff --git a/build/caat-css.js b/build/caat-css.js index e3aa6586..0c25909c 100644 --- a/build/caat-css.js +++ b/build/caat-css.js @@ -21,15 +21,15 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 51 +Version: 0.6 build: 3 Created on: -DATE: 2013-04-07 -TIME: 11:05:50 +DATE: 2013-07-01 +TIME: 04:32:53 */ -(function(global) { +(function(global, __obj_namespace) { String.prototype.endsWith= function(suffix) { return this.indexOf(suffix, this.length - suffix.length) !== -1; @@ -62,6 +62,8 @@ TIME: 11:05:50 var Class = function () { }; + Class['__CLASS']='Class'; + // Create a new Class that inherits from this class Class.extend = function (extendingProt, constants, name, aliases, flags) { @@ -662,12 +664,16 @@ TIME: 11:05:50 function ensureNamespace( qualifiedClassName ) { var ns= qualifiedClassName.split("."); var _global= global; + var ret= null; for( var i=0; i=}, // dependencies class names - * extendsClass{string}, // class to extend from - * extensdWith{object}, // actual prototype to extend - * aliases{Array}, // other class names - * onCreation{function=} // optional callback to call after class creation. - * onPreCreation{function=} // optional callback to call after namespace class creation. + * extendsClass{string}, // class to extend from + * extensdWith{object}, // actual prototype to extend + * aliases{Array} // other class names * } * + * @name Module + * @memberof CAAT + * @static + * * @param obj {object} - * @private */ - CAAT.Module= function loadModule(obj) { + NS.Module= function loadModule(obj) { if (!obj.defines) { console.error("Bad module definition: "+obj); @@ -758,17 +771,17 @@ TIME: 11:05:50 * @memberOf CAAT * @namespace */ - CAAT.ModuleManager= {}; + NS.ModuleManager= {}; /** * Define global base position for modules structure. * @param baseURL {string} * @return {*} */ - CAAT.ModuleManager.baseURL= function(baseURL) { + NS.ModuleManager.baseURL= function(baseURL) { if ( !baseURL ) { - return CAAT.Module; + return NS.Module; } if (!baseURL.endsWith("/") ) { @@ -776,7 +789,7 @@ TIME: 11:05:50 } ModuleManager.baseURL= baseURL; - return CAAT.ModuleManager; + return NS.ModuleManager; }; /** @@ -784,7 +797,7 @@ TIME: 11:05:50 * @param module {string} * @param path {string} */ - CAAT.ModuleManager.setModulePath= function( module, path ) { + NS.ModuleManager.setModulePath= function( module, path ) { if ( !path.endsWith("/") ) { path= path + "/"; @@ -805,7 +818,7 @@ TIME: 11:05:50 return a} */ behaviors:null, // contained behaviors array - + recursiveCycleBehavior : false, conforming : false, /** @@ -4667,6 +4689,20 @@ CAAT.Module({ return null; }, + setCycle : function( cycle, recurse ) { + CAAT.Behavior.ContainerBehavior.superclass.setCycle.call(this,cycle); + + if ( recurse ) { + for( var i=0; i + * @param prefix + */ + addElementsAsImages : function( prefix ) { + for( var i in this.mapInfo ) { + var si= new CAAT.Foundation.SpriteImage().initialize( this.image, 1, 1 ); + si.addElement(0, this.mapInfo[i]); + si.setSpriteIndex(0); + CAAT.currentDirector.addImage( prefix+i, si ); + } + }, + copy : function( other ) { this.initialize(other,1,1); this.mapInfo= other.mapInfo; @@ -16941,6 +17095,39 @@ CAAT.Module({ return this.mapInfo[ index ]; }, + initializeFromGlyphDesigner : function( text ) { + for (var i = 0; i < text.length; i++) { + if (0 === text[i].indexOf("char ")) { + var str = text[i].substring(5); + var pairs = str.split(' '); + var obj = { + x: 0, + y: 0, + width: 0, + height: 0, + xadvance: 0, + xoffset: 0, + yoffset: 0 + }; + + for (var j = 0; j < pairs.length; j++) { + var pair = pairs[j]; + var pairData = pair.split("="); + var key = pairData[0]; + var value = pairData[1]; + if (value.charAt(0) === '"' && value.charAt(value.length - 1) === '"') { + value.substring(1, value.length - 1); + } + obj[ key ] = value; + } + + this.addElement(String.fromCharCode(obj.id), obj); + } + } + + return this; + }, + /** * This method takes the output generated from the tool at http://labs.hyperandroid.com/static/texture/spriter.html * and creates a map into that image. @@ -16979,6 +17166,25 @@ CAAT.Module({ return this; }, + initializeFromTexturePackerJSON : function( image, obj ) { + + for( var img in obj.frames ) { + var imgData= obj.frames[img]; + + var si_obj= { + x: imgData.frame.x, + y: imgData.frame.y, + width: imgData.spriteSourceSize.w, + height: imgData.spriteSourceSize.h, + id: '0' + }; + + var si= new CAAT.Foundation.SpriteImage().initialize( image, 1, 1 ); + si.addElement(0,si_obj); + CAAT.currentDirector.addImage( img.substring(0,img.indexOf('.')), si ); + } + }, + /** * Add one element to the spriteImage. * @param key {string|number} index or sprite identifier. @@ -19473,6 +19679,15 @@ CAAT.Module({ */ endAnimate:function (director, time) { }, + + addActorImmediately: function(child,constraint) { + return this.addChildImmediately(child,constraint); + }, + + addActor : function( child, constraint ) { + return this.addChild(child,constraint); + }, + /** * Adds an Actor to this Container. * The Actor will be added ON METHOD CALL, despite the rendering pipeline stage being executed at @@ -20731,6 +20946,11 @@ CAAT.Module({ return this.audioManager.cancelPlayByChannel(audioObject); }, + setAudioFormatExtensions : function( extensions ) { + this.audioManager.setAudioFormatExtensions(extensions); + return this; + }, + setValueForKey : function( key, value ) { this.__map[key]= value; return this; @@ -24086,10 +24306,10 @@ CAAT.Module( { var image_width; - if ( r && c ) { + if ( typeof r!=="undefined" && typeof c!=="undefined" ) { image_width= image.getWidth(); } else { - image_width= image.getWrappedImageWidth(); + image_width= ( image instanceof CAAT.Foundation.SpriteImage ) ? image.getWidth() : image.getWrappedImageWidth(); } // la imagen cabe en este sitio. @@ -24318,6 +24538,8 @@ CAAT.Module( { c= pairs[2]|0; } this.__image( this.images[image], r, c ); + } else if (CAAT.currentDirector.getImage(image) ) { + this.__image( CAAT.currentDirector.getImage(image) ); } } else if ( tag.indexOf("a=")===0 ) { pairs= tag.split("="); @@ -24389,7 +24611,12 @@ CAAT.Module( { this.height= image.getHeight(); if ( this.image instanceof CAAT.SpriteImage || this.image instanceof CAAT.Foundation.SpriteImage ) { - this.spriteIndex= r*image.columns+c; + + if ( typeof r==="undefined" || typeof c==="undefined" ) { + this.spriteIndex= 0; + } else { + this.spriteIndex= r*image.columns+c; + } this.paint= this.paintSI; } @@ -24420,7 +24647,7 @@ CAAT.Module( { }, getHeight : function() { - return this.image instanceof CAAT.Foundation.SpriteImage ? this.image.singleHeight : this.image.height; + return this.image instanceof CAAT.Foundation.SpriteImage ? this.image.getHeight() : this.image.height; }, getFontMetrics : function() { @@ -24741,6 +24968,20 @@ CAAT.Module( { */ clickCallback : null, + matchTextSize : true, + + /** + * Make the label actor the size the label document has been calculated for. + * @param match {boolean} + */ + setMatchTextSize : function( match ) { + this.matchTextSize= match; + if ( match ) { + this.width= this.preferredSize.width; + this.height= this.preferredSize.height; + } + }, + setStyle : function( name, styleData ) { this.styles[ name ]= styleData; return this; @@ -24837,6 +25078,11 @@ CAAT.Module( { this.cacheAsBitmap(0,cached); } + if ( this.matchTextSize ) { + this.width= this.preferredSize.width; + this.height= this.preferredSize.height; + } + return this; }, @@ -24852,7 +25098,15 @@ CAAT.Module( { return this; }, - setDocumentPosition : function() { + setDocumentPosition : function( halign, valign ) { + + if ( typeof halign!=="undefined" ) { + this.setHorizontalAlignment(halign); + } + if ( typeof valign!=="undefined" ) { + this.setVerticalAlignment(valign); + } + var xo=0, yo=0; if ( this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER ) { diff --git a/build/caat.js b/build/caat.js index b6997016..dc14646a 100644 --- a/build/caat.js +++ b/build/caat.js @@ -21,15 +21,15 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 51 +Version: 0.6 build: 3 Created on: -DATE: 2013-04-07 -TIME: 11:05:50 +DATE: 2013-07-01 +TIME: 04:32:53 */ -(function(global) { +(function(global, __obj_namespace) { String.prototype.endsWith= function(suffix) { return this.indexOf(suffix, this.length - suffix.length) !== -1; @@ -62,6 +62,8 @@ TIME: 11:05:50 var Class = function () { }; + Class['__CLASS']='Class'; + // Create a new Class that inherits from this class Class.extend = function (extendingProt, constants, name, aliases, flags) { @@ -662,12 +664,16 @@ TIME: 11:05:50 function ensureNamespace( qualifiedClassName ) { var ns= qualifiedClassName.split("."); var _global= global; + var ret= null; for( var i=0; i=}, // dependencies class names - * extendsClass{string}, // class to extend from - * extensdWith{object}, // actual prototype to extend - * aliases{Array}, // other class names - * onCreation{function=} // optional callback to call after class creation. - * onPreCreation{function=} // optional callback to call after namespace class creation. + * extendsClass{string}, // class to extend from + * extensdWith{object}, // actual prototype to extend + * aliases{Array} // other class names * } * + * @name Module + * @memberof CAAT + * @static + * * @param obj {object} - * @private */ - CAAT.Module= function loadModule(obj) { + NS.Module= function loadModule(obj) { if (!obj.defines) { console.error("Bad module definition: "+obj); @@ -758,17 +771,17 @@ TIME: 11:05:50 * @memberOf CAAT * @namespace */ - CAAT.ModuleManager= {}; + NS.ModuleManager= {}; /** * Define global base position for modules structure. * @param baseURL {string} * @return {*} */ - CAAT.ModuleManager.baseURL= function(baseURL) { + NS.ModuleManager.baseURL= function(baseURL) { if ( !baseURL ) { - return CAAT.Module; + return NS.Module; } if (!baseURL.endsWith("/") ) { @@ -776,7 +789,7 @@ TIME: 11:05:50 } ModuleManager.baseURL= baseURL; - return CAAT.ModuleManager; + return NS.ModuleManager; }; /** @@ -784,7 +797,7 @@ TIME: 11:05:50 * @param module {string} * @param path {string} */ - CAAT.ModuleManager.setModulePath= function( module, path ) { + NS.ModuleManager.setModulePath= function( module, path ) { if ( !path.endsWith("/") ) { path= path + "/"; @@ -805,7 +818,7 @@ TIME: 11:05:50 return a} */ behaviors:null, // contained behaviors array - + recursiveCycleBehavior : false, conforming : false, /** @@ -4666,6 +4688,20 @@ CAAT.Module({ return null; }, + setCycle : function( cycle, recurse ) { + CAAT.Behavior.ContainerBehavior.superclass.setCycle.call(this,cycle); + + if ( recurse ) { + for( var i=0; i + * @param prefix + */ + addElementsAsImages : function( prefix ) { + for( var i in this.mapInfo ) { + var si= new CAAT.Foundation.SpriteImage().initialize( this.image, 1, 1 ); + si.addElement(0, this.mapInfo[i]); + si.setSpriteIndex(0); + CAAT.currentDirector.addImage( prefix+i, si ); + } + }, + copy : function( other ) { this.initialize(other,1,1); this.mapInfo= other.mapInfo; @@ -17117,6 +17271,39 @@ CAAT.Module({ return this.mapInfo[ index ]; }, + initializeFromGlyphDesigner : function( text ) { + for (var i = 0; i < text.length; i++) { + if (0 === text[i].indexOf("char ")) { + var str = text[i].substring(5); + var pairs = str.split(' '); + var obj = { + x: 0, + y: 0, + width: 0, + height: 0, + xadvance: 0, + xoffset: 0, + yoffset: 0 + }; + + for (var j = 0; j < pairs.length; j++) { + var pair = pairs[j]; + var pairData = pair.split("="); + var key = pairData[0]; + var value = pairData[1]; + if (value.charAt(0) === '"' && value.charAt(value.length - 1) === '"') { + value.substring(1, value.length - 1); + } + obj[ key ] = value; + } + + this.addElement(String.fromCharCode(obj.id), obj); + } + } + + return this; + }, + /** * This method takes the output generated from the tool at http://labs.hyperandroid.com/static/texture/spriter.html * and creates a map into that image. @@ -17155,6 +17342,25 @@ CAAT.Module({ return this; }, + initializeFromTexturePackerJSON : function( image, obj ) { + + for( var img in obj.frames ) { + var imgData= obj.frames[img]; + + var si_obj= { + x: imgData.frame.x, + y: imgData.frame.y, + width: imgData.spriteSourceSize.w, + height: imgData.spriteSourceSize.h, + id: '0' + }; + + var si= new CAAT.Foundation.SpriteImage().initialize( image, 1, 1 ); + si.addElement(0,si_obj); + CAAT.currentDirector.addImage( img.substring(0,img.indexOf('.')), si ); + } + }, + /** * Add one element to the spriteImage. * @param key {string|number} index or sprite identifier. @@ -17837,6 +18043,17 @@ CAAT.Module({ */ isAA:true, + /** + * if this actor is cached, when destroy is called, it does not call 'clean' method, which clears some + * internal properties. + */ + isCachedActor : false, + + setCachedActor : function(cached) { + this.isCachedActor= cached; + return this; + }, + /** * Make this actor not be laid out. */ @@ -18880,12 +19097,19 @@ CAAT.Module({ this.parent.removeChild(this); } + this.fireEvent('destroyed', time); + if ( !this.isCachedActor ) { + this.clean(); + } + + }, + + clean : function() { this.backgroundImage= null; this.emptyBehaviorList(); - this.fireEvent('destroyed', time); this.lifecycleListenerList= []; - }, + /** * Transform a point or array of points in model space to view space. * @@ -19527,8 +19751,8 @@ CAAT.Module({ this.frameAlpha = this.parent ? this.parent.frameAlpha * this.alpha : 1; ctx.globalAlpha = this.frameAlpha; -// director.modelViewMatrix.transformRenderingContextSet(ctx); - this.worldModelViewMatrix.transformRenderingContextSet(ctx); + director.modelViewMatrix.transformRenderingContextSet(ctx); + this.worldModelViewMatrix.transformRenderingContext(ctx); if (this.clip) { ctx.beginPath(); @@ -20346,6 +20570,15 @@ CAAT.Module({ addChildImmediately:function (child, constraint) { return this.addChild(child, constraint); }, + + addActorImmediately: function(child,constraint) { + return this.addChildImmediately(child,constraint); + }, + + addActor : function( child, constraint ) { + return this.addChild(child,constraint); + }, + /** * Adds an Actor to this ActorContainer. * The Actor will be added to the container AFTER frame animation, and not on method call time. @@ -21690,6 +21923,11 @@ CAAT.Module({ return this.audioManager.cancelPlayByChannel(audioObject); }, + setAudioFormatExtensions : function( extensions ) { + this.audioManager.setAudioFormatExtensions(extensions); + return this; + }, + setValueForKey : function( key, value ) { this.__map[key]= value; return this; @@ -25045,10 +25283,10 @@ CAAT.Module( { var image_width; - if ( r && c ) { + if ( typeof r!=="undefined" && typeof c!=="undefined" ) { image_width= image.getWidth(); } else { - image_width= image.getWrappedImageWidth(); + image_width= ( image instanceof CAAT.Foundation.SpriteImage ) ? image.getWidth() : image.getWrappedImageWidth(); } // la imagen cabe en este sitio. @@ -25277,6 +25515,8 @@ CAAT.Module( { c= pairs[2]|0; } this.__image( this.images[image], r, c ); + } else if (CAAT.currentDirector.getImage(image) ) { + this.__image( CAAT.currentDirector.getImage(image) ); } } else if ( tag.indexOf("a=")===0 ) { pairs= tag.split("="); @@ -25348,7 +25588,12 @@ CAAT.Module( { this.height= image.getHeight(); if ( this.image instanceof CAAT.SpriteImage || this.image instanceof CAAT.Foundation.SpriteImage ) { - this.spriteIndex= r*image.columns+c; + + if ( typeof r==="undefined" || typeof c==="undefined" ) { + this.spriteIndex= 0; + } else { + this.spriteIndex= r*image.columns+c; + } this.paint= this.paintSI; } @@ -25379,7 +25624,7 @@ CAAT.Module( { }, getHeight : function() { - return this.image instanceof CAAT.Foundation.SpriteImage ? this.image.singleHeight : this.image.height; + return this.image instanceof CAAT.Foundation.SpriteImage ? this.image.getHeight() : this.image.height; }, getFontMetrics : function() { @@ -25700,6 +25945,20 @@ CAAT.Module( { */ clickCallback : null, + matchTextSize : true, + + /** + * Make the label actor the size the label document has been calculated for. + * @param match {boolean} + */ + setMatchTextSize : function( match ) { + this.matchTextSize= match; + if ( match ) { + this.width= this.preferredSize.width; + this.height= this.preferredSize.height; + } + }, + setStyle : function( name, styleData ) { this.styles[ name ]= styleData; return this; @@ -25796,6 +26055,11 @@ CAAT.Module( { this.cacheAsBitmap(0,cached); } + if ( this.matchTextSize ) { + this.width= this.preferredSize.width; + this.height= this.preferredSize.height; + } + return this; }, @@ -25811,7 +26075,15 @@ CAAT.Module( { return this; }, - setDocumentPosition : function() { + setDocumentPosition : function( halign, valign ) { + + if ( typeof halign!=="undefined" ) { + this.setHorizontalAlignment(halign); + } + if ( typeof valign!=="undefined" ) { + this.setVerticalAlignment(valign); + } + var xo=0, yo=0; if ( this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER ) { diff --git a/changelog b/changelog index 268eb154..ea5e6a85 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,24 @@ + + +* 07/01/2013 0.7 Build 3 * +--------------------------- + +* Added functionality to AudioManager. The method director.setAudioFormatExtensions which proxies to audioManager.setAudioFormatExtensions + sets a default audio object extension set. By default is [ 'ogg', 'mp3', 'wav', 'x-wav', 'mp4' ]. This means CAAT by default + will try to find ogg files, then mp3, etc. It is not important whether the audio files add to director.addAudio have extension + or not. CAAT will add the first suitable extension to be played from the supplied or default audioFormatExtension array. +* Added __CLASS attribute to Class function. Now all objects are identified. +* Fixed Director dynamic scale behavior. +* Enhanced Skeletal animation support (Spine). +* Fixed. Font error which prevented fonts to draw on screen. +* Added. Method SpriteImage.addElementsAsImages which turns all subelements, either a grid defined by rows and columns or a JSON map + into available images for director.getImage calls. +* Fixed. Label object made tags to be incorrectly set in the document. +* Fixed. Label now accepts images set by calling Label.setImage or images with names matching director.getImage calls. +* Added demo35: Label usage. +* Added demo36: Sprite maps. +* Added. Method SpriteImage.initializeFromTexturePackerJSON which adds map sub-images as valid director.getImage values. + * 04/07/2013 0.6 Build 52 * --------------------------- diff --git a/documentation/demos/demo34/index.html b/documentation/demos/demo34/index.html index 5c8c5f64..194cba88 100755 --- a/documentation/demos/demo34/index.html +++ b/documentation/demos/demo34/index.html @@ -241,16 +241,17 @@

    Skeletal animation

    director.setImagesCache(images); var scene= director.createScene(); - var _skeleton1= new CAAT.Module.Skeleton.Skeleton(). setSkeletonFromFile("dragon/dragon-skeleton.json"). addAnimationFromFile( "default", "dragon/dragon-flying.json" ); + var skeletonActordragon = new CAAT.Module.Skeleton.SkeletonActor(director, _skeleton1). setLocation( 500, 350). setScale(.7,.7); scene.addChild(skeletonActordragon); + var _skeletonBoy= new CAAT.Module.Skeleton.Skeleton(). setSkeletonFromFile("spineboy/skeleton.json"). addAnimationFromFile( "default", "spineboy/animation.json" ); @@ -277,6 +278,57 @@

    Skeletal animation

    setSkin("goblingirl"). setAnimation("default"); + /** + * For Rob with love. + */ + var actorRef= new CAAT.Foundation.Actor(). + setSize(100,10). + setFillStyle("red"); + scene.addChild( actorRef ); + var actorRef2= new CAAT.Foundation.Actor(). + setSize(100,10). + setFillStyle("green"); + scene.addChild( actorRef2 ); + var actorRef3= new CAAT.Foundation.Actor(). + setSize(100,10). + setFillStyle("blue"); + scene.addChild( actorRef3 ); + + skeletonActor.addAttachment("left hand item", .5, 0, function(attachment) { + /** + * md= { + * translation { + * x: + * y: + * }, + * angle: , + * scale: { + * x:, + * y: + * } + * } + * + * @type {*} + */ + var md= attachment.getMatrixData(); + actorRef.setRotationAnchored(md.angle,1,0). + setLocation( attachment.x-actorRef.width, attachment.y); + }); + skeletonActor.addAttachment("left hand item", .5, 1, function(attachment) { + var md= attachment.getMatrixData(); + actorRef2.setRotationAnchored(md.angle,0,0). + setLocation( attachment.x, attachment.y); + }); + skeletonActor.addAttachment("right hand item", 0,1, function(attachment) { + var md= attachment.getMatrixData(); + actorRef3.setLocation( attachment.x-actorRef3.width, attachment.y). + setRotationAnchored( Math.PI/2 + md.angle,1,1); + }); + /** + * end love + */ + + scene.addChild(skeletonActorgirl); // capture as offscreen one skeleton. diff --git a/documentation/demos/demo35/label.html b/documentation/demos/demo35/label.html index 0179edeb..efb1cfcf 100644 --- a/documentation/demos/demo35/label.html +++ b/documentation/demos/demo35/label.html @@ -23,7 +23,7 @@
    -

    Label

    +

    Label - Reload for new layouts

    @@ -164,7 +164,15 @@

    Label

    italic : true }). addImage( "img", new CAAT.Foundation.SpriteImage(CAAT.currentDirector.getImage("text"),1,15)). - setText("Multiline text
    Bacon ipsum dolor sit amet salami pork belly tail tongue pancetta, pork loin tri-tip drumstick bresaola shankle. Bacon ham hock pork belly, sausage tri-tip tongue strip steak fatback. Tail t-bone salami bacon. Bresaola turkey ribeye hamburger meatball t-bone. Turkey pancetta ground round, pig sirloin tenderloin corned beef meatloaf venison sausage jerky pork loin shank bacon tail. Pancetta beef ham hock, jowl pork chop pork belly bacon venison rump shoulder shankle cow pastrami sausage. Beef ribs drumstick meatball, pancetta biltong swine bresaola ribeyejerky spare ribs ham chuck corned beef pork chop.", 300). + setText("Multiline text
    Bacon ipsum dolor sit amet salami pork " + + "belly tail tongue pancetta, pork " + + "loin tri-tip drumstick bresaola shankle. Bacon ham hock pork belly, sausage tri-tip tongue strip " + + "steak fatback. Tail t-bone salami bacon. Bresaola turkey ribeye " + + "hamburger meatball t-bone. Turkey pancetta ground round, pig sirloin tenderloin corned beef " + + "meatloaf venison sausage jerky pork loin shank bacon tail. Pancetta beef ham hock, jowl pork " + + "chop pork belly bacon venison rump shoulder shankle cow pastrami sausage. Beef ribs drumstick " + + "meatball, pancetta biltong swine bresaola ribeyejerky spare ribs ham chuck corned " + + "beef pork chop.", 300). cacheAsBitmap(). setClickCallback( function(id) { alert("Clicked: "+id); diff --git a/documentation/demos/demo36/spritemap.html b/documentation/demos/demo36/spritemap.html index 49644bd3..260f080f 100644 --- a/documentation/demos/demo36/spritemap.html +++ b/documentation/demos/demo36/spritemap.html @@ -2,7 +2,7 @@ - CAAT example: UI.Label + CAAT example: Atlas Bitmaps @@ -23,7 +23,7 @@
    -

    Label

    +

    Atlas Bitmaps

    @@ -40,10 +40,9 @@

    Label

    This demo features the following elements:

      -
    • UI.Label object
    • -
    • Defining styles
    • -
    • Adding anchors
    • -
    • Mixing images and text
    • +
    • Create SpriteImage objects
    • +
    • Use Atlas bitmaps
    • +
    • Create fonts from sub-images contained in Atlas bitmaps
    @@ -238,8 +237,8 @@

    Label

    var textActor= new CAAT.Foundation.UI.TextActor(). setFont( si_font ). - setText("CAAT is GrEaT (c) 2010-2013"). - setScale(.6,.6); + setText("Atlas font embedded in an Atlas Bitmap"). + setScale(.5,.5); container2.addActor(textActor); } else { diff --git a/documentation/demos/menu/menu.html b/documentation/demos/menu/menu.html index 09d5ac56..528f03a6 100644 --- a/documentation/demos/menu/menu.html +++ b/documentation/demos/menu/menu.html @@ -46,6 +46,8 @@

    Demos

  1. Text Actor
  2. SVG Path parser
  3. @key-frames
  4. +
  5. Multiline text
  6. +
  7. Sprite Maps
  8. diff --git a/documentation/jsdoc/files.html b/documentation/jsdoc/files.html index c9fb3826..0dc9ede6 100644 --- a/documentation/jsdoc/files.html +++ b/documentation/jsdoc/files.html @@ -218,6 +218,8 @@

    Classes

  9. CAAT.Behavior.ScaleBehavior
  10. +
  11. CAAT.Class
  12. +
  13. CAAT.CSS
  14. CAAT.Event
  15. @@ -236,10 +238,10 @@

    Classes

  16. CAAT.Foundation.ActorContainer
  17. -
  18. CAAT.Foundation.ActorContainer.ADDHINT
  19. -
  20. CAAT.Foundation.ActorContainer.AddHint
  21. +
  22. CAAT.Foundation.ActorContainer.ADDHINT
  23. +
  24. CAAT.Foundation.Box2D
  25. CAAT.Foundation.Box2D.B2DBodyActor
  26. @@ -1554,7 +1556,7 @@

    /

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:45 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT)
    \ No newline at end of file diff --git a/documentation/jsdoc/index.html b/documentation/jsdoc/index.html index fc3256cf..c2b2a33b 100644 --- a/documentation/jsdoc/index.html +++ b/documentation/jsdoc/index.html @@ -218,6 +218,8 @@

    Classes

  27. CAAT.Behavior.ScaleBehavior
  28. +
  29. CAAT.Class
  30. +
  31. CAAT.CSS
  32. CAAT.Event
  33. @@ -236,10 +238,10 @@

    Classes

  34. CAAT.Foundation.ActorContainer
  35. -
  36. CAAT.Foundation.ActorContainer.ADDHINT
  37. -
  38. CAAT.Foundation.ActorContainer.AddHint
  39. +
  40. CAAT.Foundation.ActorContainer.ADDHINT
  41. +
  42. CAAT.Foundation.Box2D
  43. CAAT.Foundation.Box2D.B2DBodyActor
  44. @@ -536,6 +538,12 @@

    CAAT.Behavior.ScaleBehavi
    +
    +
    +
    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:45 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT)
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.AlphaBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.AlphaBehavior.html index ff862272..f4d5541c 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.AlphaBehavior.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.AlphaBehavior.html @@ -223,6 +223,8 @@

    Classes

  45. CAAT.Behavior.ScaleBehavior
  46. +
  47. CAAT.Class
  48. +
  49. CAAT.CSS
  50. CAAT.Event
  51. @@ -241,10 +243,10 @@

    Classes

  52. CAAT.Foundation.ActorContainer
  53. -
  54. CAAT.Foundation.ActorContainer.ADDHINT
  55. -
  56. CAAT.Foundation.ActorContainer.AddHint
  57. +
  58. CAAT.Foundation.ActorContainer.ADDHINT
  59. +
  60. CAAT.Foundation.Box2D
  61. CAAT.Foundation.Box2D.B2DBodyActor
  62. @@ -609,7 +611,7 @@

    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    @@ -989,7 +991,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.Status.html b/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.Status.html index 5f47e7cc..764ca0bd 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.Status.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.Status.html @@ -223,6 +223,8 @@

    Classes

  63. CAAT.Behavior.ScaleBehavior
  64. +
  65. CAAT.Class
  66. +
  67. CAAT.CSS
  68. CAAT.Event
  69. @@ -241,10 +243,10 @@

    Classes

  70. CAAT.Foundation.ActorContainer
  71. -
  72. CAAT.Foundation.ActorContainer.ADDHINT
  73. -
  74. CAAT.Foundation.ActorContainer.AddHint
  75. +
  76. CAAT.Foundation.ActorContainer.ADDHINT
  77. +
  78. CAAT.Foundation.Box2D
  79. CAAT.Foundation.Box2D.B2DBodyActor
  80. @@ -652,7 +654,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.html index c0d8ca8a..66aece74 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.html @@ -223,6 +223,8 @@

    Classes

  81. CAAT.Behavior.ScaleBehavior
  82. +
  83. CAAT.Class
  84. +
  85. CAAT.CSS
  86. CAAT.Event
  87. @@ -241,10 +243,10 @@

    Classes

  88. CAAT.Foundation.ActorContainer
  89. -
  90. CAAT.Foundation.ActorContainer.ADDHINT
  91. -
  92. CAAT.Foundation.ActorContainer.AddHint
  93. +
  94. CAAT.Foundation.ActorContainer.ADDHINT
  95. +
  96. CAAT.Foundation.Box2D
  97. CAAT.Foundation.Box2D.B2DBodyActor
  98. @@ -790,6 +792,15 @@

    + +   + +
    isCycle() +
    +
    + + + <private>   @@ -1915,6 +1926,31 @@

    +
    + + +
    + + + isCycle() + +
    +
    + + + +
    + + + + + + + + + + +
    @@ -2619,7 +2655,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.ContainerBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.ContainerBehavior.html index 282d53ca..6d53e44a 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.ContainerBehavior.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.ContainerBehavior.html @@ -223,6 +223,8 @@

    Classes

  99. CAAT.Behavior.ScaleBehavior
  100. +
  101. CAAT.Class
  102. +
  103. CAAT.CSS
  104. CAAT.Event
  105. @@ -241,10 +243,10 @@

    Classes

  106. CAAT.Foundation.ActorContainer
  107. -
  108. CAAT.Foundation.ActorContainer.ADDHINT
  109. -
  110. CAAT.Foundation.ActorContainer.AddHint
  111. +
  112. CAAT.Foundation.ActorContainer.ADDHINT
  113. +
  114. CAAT.Foundation.Box2D
  115. CAAT.Foundation.Box2D.B2DBodyActor
  116. @@ -629,6 +631,15 @@

    + +   + +
    setCycle(cycle, recurse) +
    +
    + + +   @@ -671,7 +682,7 @@

    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getPropertyName, getStartTime, initialize, isBehaviorInTime, normalizeTime, setCycle, setDefaultInterpolator, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getPropertyName, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setDefaultInterpolator, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    @@ -1220,6 +1231,48 @@

    +
    + + +
    + + + setCycle(cycle, recurse) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + cycle + +
    +
    + +
    + recurse + +
    +
    + +
    + + + + + + + +
    @@ -1410,7 +1463,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.GenericBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.GenericBehavior.html index 63d3da0b..efbac3d6 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.GenericBehavior.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.GenericBehavior.html @@ -223,6 +223,8 @@

    Classes

  117. CAAT.Behavior.ScaleBehavior
  118. +
  119. CAAT.Class
  120. +
  121. CAAT.CSS
  122. CAAT.Event
  123. @@ -241,10 +243,10 @@

    Classes

  124. CAAT.Foundation.ActorContainer
  125. -
  126. CAAT.Foundation.ActorContainer.ADDHINT
  127. -
  128. CAAT.Foundation.ActorContainer.AddHint
  129. +
  130. CAAT.Foundation.ActorContainer.ADDHINT
  131. +
  132. CAAT.Foundation.Box2D
  133. CAAT.Foundation.Box2D.B2DBodyActor
  134. @@ -594,7 +596,7 @@

    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, calculateKeyFrameData, calculateKeyFramesData, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getKeyFrameDataValues, getPropertyName, getStartTime, initialize, isBehaviorInTime, normalizeTime, parse, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, calculateKeyFrameData, calculateKeyFramesData, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getKeyFrameDataValues, getPropertyName, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, parse, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    @@ -869,7 +871,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.Interpolator.html b/documentation/jsdoc/symbols/CAAT.Behavior.Interpolator.html index 5aeb726f..75815952 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.Interpolator.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.Interpolator.html @@ -223,6 +223,8 @@

    Classes

  135. CAAT.Behavior.ScaleBehavior
  136. +
  137. CAAT.Class
  138. +
  139. CAAT.CSS
  140. CAAT.Event
  141. @@ -241,10 +243,10 @@

    Classes

  142. CAAT.Foundation.ActorContainer
  143. -
  144. CAAT.Foundation.ActorContainer.ADDHINT
  145. -
  146. CAAT.Foundation.ActorContainer.AddHint
  147. +
  148. CAAT.Foundation.ActorContainer.ADDHINT
  149. +
  150. CAAT.Foundation.Box2D
  151. CAAT.Foundation.Box2D.B2DBodyActor
  152. @@ -1549,7 +1551,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.AUTOROTATE.html b/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.AUTOROTATE.html index d8885f90..dc444664 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.AUTOROTATE.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.AUTOROTATE.html @@ -223,6 +223,8 @@

    Classes

  153. CAAT.Behavior.ScaleBehavior
  154. +
  155. CAAT.Class
  156. +
  157. CAAT.CSS
  158. CAAT.Event
  159. @@ -241,10 +243,10 @@

    Classes

  160. CAAT.Foundation.ActorContainer
  161. -
  162. CAAT.Foundation.ActorContainer.ADDHINT
  163. -
  164. CAAT.Foundation.ActorContainer.AddHint
  165. +
  166. CAAT.Foundation.ActorContainer.ADDHINT
  167. +
  168. CAAT.Foundation.Box2D
  169. CAAT.Foundation.Box2D.B2DBodyActor
  170. @@ -652,7 +654,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.html index 6e538527..6703de8d 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.html @@ -223,6 +223,8 @@

    Classes

  171. CAAT.Behavior.ScaleBehavior
  172. +
  173. CAAT.Class
  174. +
  175. CAAT.CSS
  176. CAAT.Event
  177. @@ -241,10 +243,10 @@

    Classes

  178. CAAT.Foundation.ActorContainer
  179. -
  180. CAAT.Foundation.ActorContainer.ADDHINT
  181. -
  182. CAAT.Foundation.ActorContainer.AddHint
  183. +
  184. CAAT.Foundation.ActorContainer.ADDHINT
  185. +
  186. CAAT.Foundation.Box2D
  187. CAAT.Foundation.Box2D.B2DBodyActor
  188. @@ -673,7 +675,7 @@

    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setStatus, setTimeOffset, setValueApplication
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setStatus, setTimeOffset, setValueApplication
    @@ -1329,7 +1331,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.RotateBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.RotateBehavior.html index 76d21b70..594d1bc5 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.RotateBehavior.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.RotateBehavior.html @@ -223,6 +223,8 @@

    Classes

  189. CAAT.Behavior.ScaleBehavior
  190. +
  191. CAAT.Class
  192. +
  193. CAAT.CSS
  194. CAAT.Event
  195. @@ -241,10 +243,10 @@

    Classes

  196. CAAT.Foundation.ActorContainer
  197. -
  198. CAAT.Foundation.ActorContainer.ADDHINT
  199. -
  200. CAAT.Foundation.ActorContainer.AddHint
  201. +
  202. CAAT.Foundation.ActorContainer.ADDHINT
  203. +
  204. CAAT.Foundation.Box2D
  205. CAAT.Foundation.Box2D.B2DBodyActor
  206. @@ -665,7 +667,7 @@

    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setStatus, setTimeOffset, setValueApplication
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setStatus, setTimeOffset, setValueApplication
    @@ -1267,7 +1269,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.Axis.html b/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.Axis.html index e280d49d..c939b3c8 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.Axis.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.Axis.html @@ -223,6 +223,8 @@

    Classes

  207. CAAT.Behavior.ScaleBehavior
  208. +
  209. CAAT.Class
  210. +
  211. CAAT.CSS
  212. CAAT.Event
  213. @@ -241,10 +243,10 @@

    Classes

  214. CAAT.Foundation.ActorContainer
  215. -
  216. CAAT.Foundation.ActorContainer.ADDHINT
  217. -
  218. CAAT.Foundation.ActorContainer.AddHint
  219. +
  220. CAAT.Foundation.ActorContainer.ADDHINT
  221. +
  222. CAAT.Foundation.Box2D
  223. CAAT.Foundation.Box2D.B2DBodyActor
  224. @@ -620,7 +622,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.html index daa25ccd..b5dd17b3 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.html @@ -223,6 +223,8 @@

    Classes

  225. CAAT.Behavior.ScaleBehavior
  226. +
  227. CAAT.Class
  228. +
  229. CAAT.CSS
  230. CAAT.Event
  231. @@ -241,10 +243,10 @@

    Classes

  232. CAAT.Foundation.ActorContainer
  233. -
  234. CAAT.Foundation.ActorContainer.ADDHINT
  235. -
  236. CAAT.Foundation.ActorContainer.AddHint
  237. +
  238. CAAT.Foundation.ActorContainer.ADDHINT
  239. +
  240. CAAT.Foundation.Box2D
  241. CAAT.Foundation.Box2D.B2DBodyActor
  242. @@ -666,7 +668,7 @@

    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    @@ -1242,7 +1244,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.ScaleBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.ScaleBehavior.html index 4eb2ef1c..bcca79d1 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.ScaleBehavior.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.ScaleBehavior.html @@ -223,6 +223,8 @@

    Classes

  243. CAAT.Behavior.ScaleBehavior
  244. +
  245. CAAT.Class
  246. +
  247. CAAT.CSS
  248. CAAT.Event
  249. @@ -241,10 +243,10 @@

    Classes

  250. CAAT.Foundation.ActorContainer
  251. -
  252. CAAT.Foundation.ActorContainer.ADDHINT
  253. -
  254. CAAT.Foundation.ActorContainer.AddHint
  255. +
  256. CAAT.Foundation.ActorContainer.ADDHINT
  257. +
  258. CAAT.Foundation.Box2D
  259. CAAT.Foundation.Box2D.B2DBodyActor
  260. @@ -667,7 +669,7 @@

    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    @@ -1242,7 +1244,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:41 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.html index e472f896..f9dc6f65 100644 --- a/documentation/jsdoc/symbols/CAAT.Behavior.html +++ b/documentation/jsdoc/symbols/CAAT.Behavior.html @@ -223,6 +223,8 @@

    Classes

  261. CAAT.Behavior.ScaleBehavior
  262. +
  263. CAAT.Class
  264. +
  265. CAAT.CSS
  266. CAAT.Event
  267. @@ -241,10 +243,10 @@

    Classes

  268. CAAT.Foundation.ActorContainer
  269. -
  270. CAAT.Foundation.ActorContainer.ADDHINT
  271. -
  272. CAAT.Foundation.ActorContainer.AddHint
  273. +
  274. CAAT.Foundation.ActorContainer.ADDHINT
  275. +
  276. CAAT.Foundation.Box2D
  277. CAAT.Foundation.Box2D.B2DBodyActor
  278. @@ -533,7 +535,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:40 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Class.html b/documentation/jsdoc/symbols/CAAT.Class.html index d21ea68f..ce6c5e55 100644 --- a/documentation/jsdoc/symbols/CAAT.Class.html +++ b/documentation/jsdoc/symbols/CAAT.Class.html @@ -535,7 +535,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:22:41 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.html b/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.html index 6a328605..520ce020 100644 --- a/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.html +++ b/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.html @@ -223,6 +223,8 @@

    Classes

  279. CAAT.Behavior.ScaleBehavior
  280. +
  281. CAAT.Class
  282. +
  283. CAAT.CSS
  284. CAAT.Event
  285. @@ -241,10 +243,10 @@

    Classes

  286. CAAT.Foundation.ActorContainer
  287. -
  288. CAAT.Foundation.ActorContainer.ADDHINT
  289. -
  290. CAAT.Foundation.ActorContainer.AddHint
  291. +
  292. CAAT.Foundation.ActorContainer.ADDHINT
  293. +
  294. CAAT.Foundation.Box2D
  295. CAAT.Foundation.Box2D.B2DBodyActor
  296. @@ -891,7 +893,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:41 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Event.MouseEvent.html b/documentation/jsdoc/symbols/CAAT.Event.MouseEvent.html index 7c6f9da1..0d379a09 100644 --- a/documentation/jsdoc/symbols/CAAT.Event.MouseEvent.html +++ b/documentation/jsdoc/symbols/CAAT.Event.MouseEvent.html @@ -223,6 +223,8 @@

    Classes

  297. CAAT.Behavior.ScaleBehavior
  298. +
  299. CAAT.Class
  300. +
  301. CAAT.CSS
  302. CAAT.Event
  303. @@ -241,10 +243,10 @@

    Classes

  304. CAAT.Foundation.ActorContainer
  305. -
  306. CAAT.Foundation.ActorContainer.ADDHINT
  307. -
  308. CAAT.Foundation.ActorContainer.AddHint
  309. +
  310. CAAT.Foundation.ActorContainer.ADDHINT
  311. +
  312. CAAT.Foundation.Box2D
  313. CAAT.Foundation.Box2D.B2DBodyActor
  314. @@ -1146,7 +1148,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:41 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Event.TouchEvent.html b/documentation/jsdoc/symbols/CAAT.Event.TouchEvent.html index bf92d386..1096a96e 100644 --- a/documentation/jsdoc/symbols/CAAT.Event.TouchEvent.html +++ b/documentation/jsdoc/symbols/CAAT.Event.TouchEvent.html @@ -223,6 +223,8 @@

    Classes

  315. CAAT.Behavior.ScaleBehavior
  316. +
  317. CAAT.Class
  318. +
  319. CAAT.CSS
  320. CAAT.Event
  321. @@ -241,10 +243,10 @@

    Classes

  322. CAAT.Foundation.ActorContainer
  323. -
  324. CAAT.Foundation.ActorContainer.ADDHINT
  325. -
  326. CAAT.Foundation.ActorContainer.AddHint
  327. +
  328. CAAT.Foundation.ActorContainer.ADDHINT
  329. +
  330. CAAT.Foundation.Box2D
  331. CAAT.Foundation.Box2D.B2DBodyActor
  332. @@ -1230,7 +1232,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:41 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Event.TouchInfo.html b/documentation/jsdoc/symbols/CAAT.Event.TouchInfo.html index 1bea5d4d..ea77b286 100644 --- a/documentation/jsdoc/symbols/CAAT.Event.TouchInfo.html +++ b/documentation/jsdoc/symbols/CAAT.Event.TouchInfo.html @@ -223,6 +223,8 @@

    Classes

  333. CAAT.Behavior.ScaleBehavior
  334. +
  335. CAAT.Class
  336. +
  337. CAAT.CSS
  338. CAAT.Event
  339. @@ -241,10 +243,10 @@

    Classes

  340. CAAT.Foundation.ActorContainer
  341. -
  342. CAAT.Foundation.ActorContainer.ADDHINT
  343. -
  344. CAAT.Foundation.ActorContainer.AddHint
  345. +
  346. CAAT.Foundation.ActorContainer.ADDHINT
  347. +
  348. CAAT.Foundation.Box2D
  349. CAAT.Foundation.Box2D.B2DBodyActor
  350. @@ -619,7 +621,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:41 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Actor.html b/documentation/jsdoc/symbols/CAAT.Foundation.Actor.html index 0b58ff92..81523b84 100644 --- a/documentation/jsdoc/symbols/CAAT.Foundation.Actor.html +++ b/documentation/jsdoc/symbols/CAAT.Foundation.Actor.html @@ -223,6 +223,8 @@

    Classes

  351. CAAT.Behavior.ScaleBehavior
  352. +
  353. CAAT.Class
  354. +
  355. CAAT.CSS
  356. CAAT.Event
  357. @@ -241,10 +243,10 @@

    Classes

  358. CAAT.Foundation.ActorContainer
  359. -
  360. CAAT.Foundation.ActorContainer.ADDHINT
  361. -
  362. CAAT.Foundation.ActorContainer.AddHint
  363. +
  364. CAAT.Foundation.ActorContainer.ADDHINT
  365. +
  366. CAAT.Foundation.Box2D
  367. CAAT.Foundation.Box2D.B2DBodyActor
  368. @@ -834,6 +836,17 @@

    + +   + + +
    if this actor is cached, when destroy is called, it does not call 'clean' method, which clears some +internal properties.
    + + +   @@ -1306,6 +1319,15 @@

    + +   + +
    clean() +
    +
    + + +   @@ -1906,6 +1928,15 @@

    + +   + +
    setCachedActor(cached) +
    +
    + + +   @@ -3087,6 +3118,29 @@

    +
    + + +
    + + + isCachedActor + +
    +
    + if this actor is cached, when destroy is called, it does not call 'clean' method, which clears some +internal properties. + + +
    + + + + + + + +
    @@ -4368,6 +4422,31 @@

    +
    + + +
    + + + clean() + +
    +
    + + + +
    + + + + + + + + + + +
    @@ -7084,6 +7163,42 @@

    +
    + + +
    + + + setCachedActor(cached) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + cached + +
    +
    + +
    + + + + + + + +
    @@ -8810,7 +8925,7 @@

    - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:41 GMT-0700 (PDT) + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:42 GMT-0700 (PDT)
    diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.AddHint.html b/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.AddHint.html index 867b4aca..cfc8229d 100644 --- a/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.AddHint.html +++ b/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.AddHint.html @@ -5,7 +5,7 @@ - JsDoc Reference - CAAT.Foundation.ActorContainer.AddHint + JsDoc Reference - CAAT.Foundation.ActorContainer.ADDHINT - - - - - -
    - -
    -

    Classes

    - -
    -
    - -
    -

    File Index

    - - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - \ No newline at end of file diff --git a/documentation/jsdoc/index.html b/documentation/jsdoc/index.html deleted file mode 100644 index c2b2a33b..00000000 --- a/documentation/jsdoc/index.html +++ /dev/null @@ -1,1178 +0,0 @@ - - - - - - JsDoc Reference - Index - - - - - - - - -
    - -
    -

    Classes

    - -
    -
    - -
    -

    Class Index

    - - -
    -

    _global_

    - -
    -
    - -
    -

    CAAT

    - -
    -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - -
    -

    CAAT.Class

    - -
    -
    - -
    -

    CAAT.CSS

    - -
    -
    - -
    -

    CAAT.Event

    - -
    -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - -
    -

    CAAT.KEYS

    - -
    -
    - -
    -

    CAAT.Math

    - -
    -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - -
    -

    CAAT.WebGL

    - -
    -
    - - -
    - - -
    - - -
    - - -
    - -
    -

    String

    - -
    -
    - - -
    -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - \ No newline at end of file diff --git a/documentation/jsdoc/symbols/B2DCircularBody.html b/documentation/jsdoc/symbols/B2DCircularBody.html deleted file mode 100644 index 140e1240..00000000 --- a/documentation/jsdoc/symbols/B2DCircularBody.html +++ /dev/null @@ -1,379 +0,0 @@ - - - - - - - JsDoc Reference - B2DCircularBody - - - - - - - - - - - - - -
    - -

    - - Class B2DCircularBody -

    - - -

    - -
    Extends - CAAT.Foundation.Box2D.B2DBodyActor.
    - - - - - -
    Defined in: B2DCircularBody.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - -
    -
    Fields borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    bodyData, bodyDef, bodyType, density, fixtureDef, friction, recycle, restitution, world, worldBody, worldBodyFixture
    -
    - - - - - - - - - -
    -
    Methods borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    __init, animate, check, createBody, destroy, getCenter, getDistanceJointLocalAnchor, setAwake, setBodyType, setDensity, setFriction, setLocation, setPositionAnchor, setPositionAnchored, setRecycle, setRestitution, setSleepingAllowed
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - B2DCircularBody() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 09:46:20 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/B2DPolygonBody.html b/documentation/jsdoc/symbols/B2DPolygonBody.html deleted file mode 100644 index b1ff207a..00000000 --- a/documentation/jsdoc/symbols/B2DPolygonBody.html +++ /dev/null @@ -1,379 +0,0 @@ - - - - - - - JsDoc Reference - B2DPolygonBody - - - - - - - - - - - - - -
    - -

    - - Class B2DPolygonBody -

    - - -

    - -
    Extends - CAAT.Foundation.Box2D.B2DBodyActor.
    - - - - - -
    Defined in: B2DPolygonBody.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - -
    -
    Fields borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    bodyData, bodyDef, bodyType, density, fixtureDef, friction, recycle, restitution, world, worldBody, worldBodyFixture
    -
    - - - - - - - - - -
    -
    Methods borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    __init, animate, check, createBody, destroy, getCenter, getDistanceJointLocalAnchor, setAwake, setBodyType, setDensity, setFriction, setLocation, setPositionAnchor, setPositionAnchored, setRecycle, setRestitution, setSleepingAllowed
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - B2DPolygonBody() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 09:46:20 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.AlphaBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.AlphaBehavior.html deleted file mode 100644 index f4d5541c..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.AlphaBehavior.html +++ /dev/null @@ -1,997 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.AlphaBehavior - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Behavior.AlphaBehavior -

    - - -

    - -
    Extends - CAAT.Behavior.BaseBehavior.
    - - - - - -
    Defined in: AlphaBehavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   -
    - endAlpha -
    -
    Ending alpha transparency value.
    -
    <private>   - -
    Starting alpha transparency value.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      - -
    -
      -
    calculateKeyFramesData(prefix, name, keyframessize) -
    -
    -
      - -
    -
      - -
    -
      -
    parse(obj) -
    -
    -
      -
    setForTime(time, actor) -
    -
    Applies corresponding alpha transparency value for a given time.
    -
      -
    setValues(start, end) -
    -
    Set alpha transparency minimum and maximum value.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Behavior.AlphaBehavior() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - endAlpha - -
    -
    - Ending alpha transparency value. Between 0 and 1. - - -
    - - - - - - - - -
    - - -
    <private> - - - startAlpha - -
    -
    - Starting alpha transparency value. Between 0 and 1. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - - calculateKeyFrameData(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - calculateKeyFramesData(prefix, name, keyframessize) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - prefix - -
    -
    - -
    - name - -
    -
    - -
    - keyframessize - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getKeyFrameDataValues(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPropertyName() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - parse(obj) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - obj - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {number} - setForTime(time, actor) - -
    -
    - Applies corresponding alpha transparency value for a given time. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    the time to apply the scale for.
    - -
    - actor - -
    -
    the target actor to set transparency for.
    - -
    - - - - - -
    -
    Returns:
    - -
    {number} the alpha value set. Normalized from 0 (total transparency) to 1 (total opacity)
    - -
    - - - - -
    - - -
    - - - setValues(start, end) - -
    -
    - Set alpha transparency minimum and maximum value. -This value can be coerced by Actor's property isGloblAlpha. - - -
    - - - - -
    -
    Parameters:
    - -
    - start - -
    -
    {number} a float indicating the starting alpha value.
    - -
    - end - -
    -
    {number} a float indicating the ending alpha value.
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.BasaeBehavior.Status.html b/documentation/jsdoc/symbols/CAAT.Behavior.BasaeBehavior.Status.html deleted file mode 100644 index 158dfe66..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.BasaeBehavior.Status.html +++ /dev/null @@ -1,513 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.BasaeBehavior.Status - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Behavior.BasaeBehavior.Status -

    - - -

    - - - - - - -
    Defined in: BaseBehavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Behavior.BasaeBehavior.Status -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Mar 05 2013 13:58:02 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.Status.html b/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.Status.html deleted file mode 100644 index 764ca0bd..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.Status.html +++ /dev/null @@ -1,660 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.BaseBehavior.Status - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Behavior.BaseBehavior.Status -

    - - -

    - - - - - - -
    Defined in: BaseBehavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    Internal behavior status values.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   -
    - CAAT.Behavior.BaseBehavior.Status.EXPIRED -
    -
    -
    <static>   -
    - CAAT.Behavior.BaseBehavior.Status.NOT_STARTED -
    -
    -
    <static>   -
    - CAAT.Behavior.BaseBehavior.Status.STARTED -
    -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Behavior.BaseBehavior.Status -
    - -
    - Internal behavior status values. Do not assign directly. - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.Behavior.BaseBehavior.Status.EXPIRED - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.BaseBehavior.Status.NOT_STARTED - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.BaseBehavior.Status.STARTED - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.html deleted file mode 100644 index 66aece74..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.html +++ /dev/null @@ -1,2661 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.BaseBehavior - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Behavior.BaseBehavior -

    - - -

    - - - - - - -
    Defined in: BaseBehavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    The BaseBehavior is the base class of all Behavior modifiers: - -
  369. AlphaBehabior -
  370. RotateBehavior -
  371. ScaleBehavior -
  372. Scale1Behavior -
  373. PathBehavior -
  374. GenericBehavior -
  375. ContainerBehavior - -Behavior base class.
  376. -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   -
    - actor -
    -
    The actor this behavior will be applied to.
    -
    <private>   - -
    Behavior application duration time related to scene time.
    -
    <private>   - -
    Behavior application start time related to scene time.
    -
    <private>   - -
    Will this behavior apply for ever in a loop ?
    -
    <private>   - -
    if true, this behavior will be removed from the this.actor instance when it expires.
    -
      - -
    Apply the behavior, or just calculate the values ?
    -
      -
    - id -
    -
    An id to identify this behavior.
    -
    <private>   - -
    An interpolator object to apply behaviors using easing functions, etc.
    -
      - -
    does this behavior apply relative values ??
    -
    <private>   - -
    Behavior lifecycle observer list.
    -
    <private>   -
    - solved -
    -
    Is this behavior solved ? When called setDelayTime, this flag identifies whether the behavior -is in time relative to the scene.
    -
    <private>   -
    - status -
    -
    behavior status.
    -
    <private>   - -
    Initial offset to apply this behavior the first time.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    Constructor delegate function.
    -
      -
    addListener(behaviorListener) -
    -
    Adds an observer to this behavior.
    -
      -
    apply(time, actor) -
    -
    This method must no be called directly.
    -
      - -
    Calculate a CSS3 @key-frame for this behavior at the given time.
    -
      -
    calculateKeyFramesData(prefix, name, keyframessize) -
    -
    Calculate a complete CSS3 @key-frame set for this behavior.
    -
      - -
    Remove all registered listeners to the behavior.
    -
    <private>   -
    fireBehaviorAppliedEvent(actor, time, normalizedTime, value) -
    -
    Notify observers about behavior being applied.
    -
    <private>   -
    fireBehaviorExpiredEvent(actor, time) -
    -
    Notify observers about expiration event.
    -
    <private>   -
    fireBehaviorStartedEvent(actor, time) -
    -
    Notify observers the first time the behavior is applied.
    -
      - -
    -
      - -
    Calculate a CSS3 @key-frame data values instead of building a CSS3 @key-frame value.
    -
      - -
    Get this behaviors CSS property name application.
    -
      - -
    -
      -
    initialize(overrides) -
    -
    -
      -
    isBehaviorInTime(time, actor) -
    -
    Chekcs whether the behaviour is in scene time.
    -
      -
    isCycle() -
    -
    -
    <private>   -
    normalizeTime(time) -
    -
    Convert scene time into something more manageable for the behavior.
    -
    <static>   -
    CAAT.Behavior.BaseBehavior.parse(obj) -
    -
    -
      -
    parse(obj) -
    -
    Parse a behavior of this type.
    -
      -
    setCycle(bool) -
    -
    Sets the behavior to cycle, ie apply forever.
    -
      - -
    Sets the default interpolator to a linear ramp, that is, behavior will be applied linearly.
    -
      -
    setDelayTime(delay, duration) -
    -
    Sets behavior start time and duration.
    -
    <private>   -
    setExpired(actor, time) -
    -
    Sets the behavior as expired.
    -
    <private>   -
    setForTime(actor, time) -
    -
    This method must be overriden for every Behavior breed.
    -
      -
    setFrameTime(startTime, duration) -
    -
    Sets behavior start time and duration.
    -
      -
    setId(id) -
    -
    Sets this behavior id.
    -
      -
    setInterpolator(interpolator) -
    -
    Changes behavior default interpolator to another instance of CAAT.Interpolator.
    -
      - -
    Make this behavior not applicable.
    -
      - -
    Sets default interpolator to be linear from 0.
    -
      -
    setRelative(bool) -
    -
    Set this behavior as relative value application to some other measures.
    -
      - -
    -
    <private>   -
    setStatus(st) -
    -
    Set this behavior status
    -
      -
    setTimeOffset(offset) -
    -
    Set this behavior offset time.
    -
      - -
    Set whether this behavior will apply behavior values to a reference Actor instance.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Behavior.BaseBehavior() -
    - -
    - The BaseBehavior is the base class of all Behavior modifiers: - -
  377. AlphaBehabior -
  378. RotateBehavior -
  379. ScaleBehavior -
  380. Scale1Behavior -
  381. PathBehavior -
  382. GenericBehavior -
  383. ContainerBehavior - -Behavior base class. - -

    -A behavior is defined by a frame time (behavior duration) and a behavior application function called interpolator. -In its default form, a behaviour is applied linearly, that is, the same amount of behavior is applied every same -time interval. -

    -A concrete Behavior, a rotateBehavior in example, will change a concrete Actor's rotationAngle during the specified -period. -

    -A behavior is guaranteed to notify (if any observer is registered) on behavior expiration. -

    -A behavior can keep an unlimited observers. Observers are objects of the form: -

    - -{ - behaviorExpired : function( behavior, time, actor); - behaviorApplied : function( behavior, time, normalizedTime, actor, value); -} - -

    -behaviorExpired: function( behavior, time, actor). This method will be called for any registered observer when -the scene time is greater than behavior's startTime+duration. This method will be called regardless of the time -granurality. -

    -behaviorApplied : function( behavior, time, normalizedTime, actor, value). This method will be called once per -frame while the behavior is not expired and is in frame time (behavior startTime>=scene time). This method can be -called multiple times. -

    -Every behavior is applied to a concrete Actor. -Every actor must at least define an start and end value. The behavior will set start-value at behaviorStartTime and -is guaranteed to apply end-value when scene time= behaviorStartTime+behaviorDuration. -

    -You can set behaviors to apply forever that is cyclically. When a behavior is cycle=true, won't notify -behaviorExpired to its registered observers. -

    -Other Behaviors simply must supply with the method setForTime(time, actor) overriden. - -

  384. - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - actor - -
    -
    - The actor this behavior will be applied to. - - -
    - - - - - - - - -
    - - -
    <private> - - - behaviorDuration - -
    -
    - Behavior application duration time related to scene time. - - -
    - - - - - - - - -
    - - -
    <private> - - - behaviorStartTime - -
    -
    - Behavior application start time related to scene time. - - -
    - - - - - - - - -
    - - -
    <private> - - - cycleBehavior - -
    -
    - Will this behavior apply for ever in a loop ? - - -
    - - - - - - - - -
    - - -
    <private> - - - discardable - -
    -
    - if true, this behavior will be removed from the this.actor instance when it expires. - - -
    - - - - - - - - -
    - - -
    - - - doValueApplication - -
    -
    - Apply the behavior, or just calculate the values ? - - -
    - - - - - - - - -
    - - -
    - - - id - -
    -
    - An id to identify this behavior. - - -
    - - - - - - - - -
    - - -
    <private> - - - interpolator - -
    -
    - An interpolator object to apply behaviors using easing functions, etc. -Unless otherwise specified, it will be linearly applied. - - -
    - - - - - - - - -
    - - -
    - - - isRelative - -
    -
    - does this behavior apply relative values ?? - - -
    - - - - - - - - -
    - - -
    <private> - - - lifecycleListenerList - -
    -
    - Behavior lifecycle observer list. - - -
    - - - - - - - - -
    - - -
    <private> - - - solved - -
    -
    - Is this behavior solved ? When called setDelayTime, this flag identifies whether the behavior -is in time relative to the scene. - - -
    - - - - - - - - -
    - - -
    <private> - - - status - -
    -
    - behavior status. - - -
    - - - - - - - - -
    - - -
    <private> - - - timeOffset - -
    -
    - Initial offset to apply this behavior the first time. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - {this} - __init() - -
    -
    - Constructor delegate function. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {this}
    - -
    - - - - -
    - - -
    - - - addListener(behaviorListener) - -
    -
    - Adds an observer to this behavior. - - -
    - - - - -
    -
    Parameters:
    - -
    - behaviorListener - -
    -
    an observer instance.
    - -
    - - - - - - - - -
    - - -
    - - - apply(time, actor) - -
    -
    - This method must no be called directly. -The director loop will call this method in orther to apply actor behaviors. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    the scene time the behaviro is being applied at.
    - -
    - actor - -
    -
    a CAAT.Actor instance the behavior is being applied to.
    - -
    - - - - - - - - -
    - - -
    - - - calculateKeyFrameData(time) - -
    -
    - Calculate a CSS3 @key-frame for this behavior at the given time. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - calculateKeyFramesData(prefix, name, keyframessize) - -
    -
    - Calculate a complete CSS3 @key-frame set for this behavior. - - -
    - - - - -
    -
    Parameters:
    - -
    - prefix - -
    -
    {string} browser vendor prefix
    - -
    - name - -
    -
    {string} keyframes animation name
    - -
    - keyframessize - -
    -
    {number} number of keyframes to generate
    - -
    - - - - - - - - -
    - - -
    - - - emptyListenerList() - -
    -
    - Remove all registered listeners to the behavior. - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - fireBehaviorAppliedEvent(actor, time, normalizedTime, value) - -
    -
    - Notify observers about behavior being applied. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    a CAAT.Actor instance the behavior is being applied to.
    - -
    - time - -
    -
    the scene time of behavior application.
    - -
    - normalizedTime - -
    -
    the normalized time (0..1) considering 0 behavior start time and 1 -behaviorStartTime+behaviorDuration.
    - -
    - value - -
    -
    the value being set for actor properties. each behavior will supply with its own value version.
    - -
    - - - - - - - - -
    - - -
    <private> - - - fireBehaviorExpiredEvent(actor, time) - -
    -
    - Notify observers about expiration event. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    a CAAT.Actor instance
    - -
    - time - -
    -
    an integer with the scene time the behavior was expired at.
    - -
    - - - - - - - - -
    - - -
    <private> - - - fireBehaviorStartedEvent(actor, time) - -
    -
    - Notify observers the first time the behavior is applied. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getDuration() - -
    -
    - - - -
    - - - - - - - - -
    -
    Returns:
    - -
    an integer indicating the behavior duration time in ms.
    - -
    - - - - -
    - - -
    - - - getKeyFrameDataValues(time) - -
    -
    - Calculate a CSS3 @key-frame data values instead of building a CSS3 @key-frame value. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - {String} - getPropertyName() - -
    -
    - Get this behaviors CSS property name application. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {String}
    - -
    - - - - -
    - - -
    - - - getStartTime() - -
    -
    - - - -
    - - - - - - - - -
    -
    Returns:
    - -
    an integer indicating the behavior start time in ms..
    - -
    - - - - -
    - - -
    - - - initialize(overrides) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - overrides - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - isBehaviorInTime(time, actor) - -
    -
    - Chekcs whether the behaviour is in scene time. -In case it gets out of scene time, and has not been tagged as expired, the behavior is expired and observers -are notified about that fact. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    the scene time to check the behavior against.
    - -
    - actor - -
    -
    the actor the behavior is being applied to.
    - -
    - - - - - -
    -
    Returns:
    - -
    a boolean indicating whether the behavior is in scene time.
    - -
    - - - - -
    - - -
    - - - isCycle() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - normalizeTime(time) - -
    -
    - Convert scene time into something more manageable for the behavior. -behaviorStartTime will be 0 and behaviorStartTime+behaviorDuration will be 1. -the time parameter will be proportional to those values. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    the scene time to be normalized. an integer.
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.BaseBehavior.parse(obj) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - obj - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - parse(obj) - -
    -
    - Parse a behavior of this type. - - -
    - - - - -
    -
    Parameters:
    - -
    - obj - -
    -
    {object} an object with a behavior definition.
    - -
    - - - - - - - - -
    - - -
    - - - setCycle(bool) - -
    -
    - Sets the behavior to cycle, ie apply forever. - - -
    - - - - -
    -
    Parameters:
    - -
    - bool - -
    -
    a boolean indicating whether the behavior is cycle.
    - -
    - - - - - - - - -
    - - -
    - - - setDefaultInterpolator() - -
    -
    - Sets the default interpolator to a linear ramp, that is, behavior will be applied linearly. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setDelayTime(delay, duration) - -
    -
    - Sets behavior start time and duration. Start time is relative to scene time. - -a call to - setFrameTime( scene.time, duration ) is equivalent to - setDelayTime( 0, duration ) - - -
    - - - - -
    -
    Parameters:
    - -
    - delay - -
    -
    {number}
    - -
    - duration - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    <private> - - - setExpired(actor, time) - -
    -
    - Sets the behavior as expired. -This method must not be called directly. It is an auxiliary method to isBehaviorInTime method. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    {CAAT.Actor}
    - -
    - time - -
    -
    {integer} the scene time.
    - -
    - - - - - - - - -
    - - -
    <private> - - - setForTime(actor, time) - -
    -
    - This method must be overriden for every Behavior breed. -Must not be called directly. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    {CAAT.Actor} a CAAT.Actor instance.
    - -
    - time - -
    -
    {number} an integer with the scene time.
    - -
    - - - - - - - - -
    - - -
    - - - setFrameTime(startTime, duration) - -
    -
    - Sets behavior start time and duration. Start time is set absolutely relative to scene time. - - -
    - - - - -
    -
    Parameters:
    - -
    - startTime - -
    -
    {number} an integer indicating behavior start time in scene time in ms..
    - -
    - duration - -
    -
    {number} an integer indicating behavior duration in ms.
    - -
    - - - - - - - - -
    - - -
    - - - setId(id) - -
    -
    - Sets this behavior id. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {object}
    - -
    - - - - - - - - -
    - - -
    - - - setInterpolator(interpolator) - -
    -
    - Changes behavior default interpolator to another instance of CAAT.Interpolator. -If the behavior is not defined by CAAT.Interpolator factory methods, the interpolation function must return -its values in the range 0..1. The behavior will only apply for such value range. - - -
    - - - - -
    -
    Parameters:
    - -
    - interpolator - -
    -
    a CAAT.Interpolator instance.
    - -
    - - - - - - - - -
    - - -
    - - {*} - setOutOfFrameTime() - -
    -
    - Make this behavior not applicable. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - setPingPong() - -
    -
    - Sets default interpolator to be linear from 0..1 and from 1..0. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {*} - setRelative(bool) - -
    -
    - Set this behavior as relative value application to some other measures. -Each Behavior will define its own. - - -
    - - - - -
    -
    Parameters:
    - -
    - bool - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - setRelativeValues() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - {*} - setStatus(st) - -
    -
    - Set this behavior status - - -
    - - - - -
    -
    Parameters:
    - -
    - st - -
    -
    {CAAT.Behavior.BaseBehavior.Status}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - {*} - setTimeOffset(offset) - -
    -
    - Set this behavior offset time. -This method is intended to make a behavior start applying (the first) time from a different -start time. - - -
    - - - - -
    -
    Parameters:
    - -
    - offset - -
    -
    {number} between 0 and 1
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - {*} - setValueApplication(apply) - -
    -
    - Set whether this behavior will apply behavior values to a reference Actor instance. - - -
    - - - - -
    -
    Parameters:
    - -
    - apply - -
    -
    {boolean}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.ContainerBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.ContainerBehavior.html deleted file mode 100644 index 6d53e44a..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.ContainerBehavior.html +++ /dev/null @@ -1,1469 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.ContainerBehavior - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Behavior.ContainerBehavior -

    - - -

    - -
    Extends - CAAT.Behavior.BaseBehavior.
    - - - - - -
    Defined in: ContainerBehavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - behaviors -
    -
    A collection of behaviors.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(conforming) -
    -
    -
      -
    addBehavior(behavior) -
    -
    Add a new behavior to the container.
    -
      -
    apply(time, actor) -
    -
    Applies every contained Behaviors.
    -
      -
    behaviorApplied(behavior, scenetime, time, actor, value) -
    -
    -
      -
    behaviorExpired(behavior, time, actor) -
    -
    This method is the observer implementation for every contained behavior.
    -
      -
    calculateKeyFrameData(referenceTime, prefix) -
    -
    -
      -
    calculateKeyFramesData(prefix, name, keyframessize, anchorX, anchorY) -
    -
    -
      -
    conformToDuration(duration) -
    -
    Proportionally change this container duration to its children.
    -
      - -
    Get a behavior by mathing its id.
    -
      -
    getKeyFrameDataValues(referenceTime) -
    -
    -
      -
    parse(obj) -
    -
    -
      -
    setCycle(cycle, recurse) -
    -
    -
      -
    setDelayTime(start, duration) -
    -
    -
      -
    setExpired(actor, time) -
    -
    Expire this behavior and the children applied at the parameter time.
    -
      -
    setForTime(time{number}) -
    -
    Implementation method of the behavior.
    -
      -
    setFrameTime(start, duration) -
    -
    -
    - - - -
    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getPropertyName, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setDefaultInterpolator, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Behavior.ContainerBehavior() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - behaviors - -
    -
    - A collection of behaviors. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(conforming) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - conforming - -
    -
    {bool=} conform this behavior duration to that of its children.
    - -
    - - - - - - - - -
    - - -
    - - - addBehavior(behavior) - -
    -
    - Add a new behavior to the container. - - -
    - - - - -
    -
    Parameters:
    - -
    - behavior - -
    -
    {CAAT.Behavior.BaseBehavior}
    - -
    - - - - - - - - -
    - - -
    - - - apply(time, actor) - -
    -
    - Applies every contained Behaviors. -The application time the contained behaviors will receive will be ContainerBehavior related and not the -received time. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    an integer indicating the time to apply the contained behaviors at.
    - -
    - actor - -
    -
    a CAAT.Foundation.Actor instance indicating the actor to apply the behaviors for.
    - -
    - - - - - - - - -
    - - -
    - - - behaviorApplied(behavior, scenetime, time, actor, value) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - behavior - -
    -
    - -
    - scenetime - -
    -
    - -
    - time - -
    -
    - -
    - actor - -
    -
    - -
    - value - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - behaviorExpired(behavior, time, actor) - -
    -
    - This method is the observer implementation for every contained behavior. -If a container is Cycle=true, won't allow its contained behaviors to be expired. - - -
    - - - - -
    -
    Parameters:
    - -
    - behavior - -
    -
    a CAAT.Behavior.BaseBehavior instance which has been expired.
    - -
    - time - -
    -
    an integer indicating the time at which has become expired.
    - -
    - actor - -
    -
    a CAAT.Foundation.Actor the expired behavior is being applied to.
    - -
    - - - - - - - - -
    - - -
    - - - calculateKeyFrameData(referenceTime, prefix) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - referenceTime - -
    -
    - -
    - prefix - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - calculateKeyFramesData(prefix, name, keyframessize, anchorX, anchorY) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - prefix - -
    -
    - -
    - name - -
    -
    - -
    - keyframessize - -
    -
    - -
    - anchorX - -
    -
    - -
    - anchorY - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - conformToDuration(duration) - -
    -
    - Proportionally change this container duration to its children. - - -
    - - - - -
    -
    Parameters:
    - -
    - duration - -
    -
    {number} new duration in ms.
    - -
    - - - - - -
    -
    Returns:
    - -
    this;
    - -
    - - - - -
    - - -
    - - - getBehaviorById(id) - -
    -
    - Get a behavior by mathing its id. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {object}
    - -
    - - - - - - - - -
    - - -
    - - - getKeyFrameDataValues(referenceTime) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - referenceTime - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - parse(obj) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - obj - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setCycle(cycle, recurse) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - cycle - -
    -
    - -
    - recurse - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setDelayTime(start, duration) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - start - -
    -
    - -
    - duration - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {*} - setExpired(actor, time) - -
    -
    - Expire this behavior and the children applied at the parameter time. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    {CAAT.Foundation.Actor}
    - -
    - time - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - setForTime(time{number}) - -
    -
    - Implementation method of the behavior. -Just call implementation method for its contained behaviors. - - -
    - - - - -
    -
    Parameters:
    - -
    - time{number} - -
    -
    an integer indicating the time the behavior is being applied at.
    - -
    - actor{CAAT.Foundation.Actor} - -
    -
    an actor the behavior is being applied to.
    - -
    - - - - - - - - -
    - - -
    - - - setFrameTime(start, duration) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - start - -
    -
    - -
    - duration - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.GenericBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.GenericBehavior.html deleted file mode 100644 index efbac3d6..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.GenericBehavior.html +++ /dev/null @@ -1,877 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.GenericBehavior - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Behavior.GenericBehavior -

    - - -

    - -
    Extends - CAAT.Behavior.BaseBehavior.
    - - - - - -
    Defined in: GenericBehavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - callback -
    -
    this callback will be invoked for every behavior application.
    -
      -
    - end -
    -
    ending value.
    -
      -
    - property -
    -
    property to apply values to.
    -
      -
    - start -
    -
    starting value.
    -
      -
    - target -
    -
    target to apply this generic behvior.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    setForTime(time, actor) -
    -
    -
      -
    setValues(start, end, target, property, callback) -
    -
    Defines the values to apply this behavior.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, calculateKeyFrameData, calculateKeyFramesData, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getKeyFrameDataValues, getPropertyName, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, parse, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Behavior.GenericBehavior() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - callback - -
    -
    - this callback will be invoked for every behavior application. - - -
    - - - - - - - - -
    - - -
    - - - end - -
    -
    - ending value. - - -
    - - - - - - - - -
    - - -
    - - - property - -
    -
    - property to apply values to. - - -
    - - - - - - - - -
    - - -
    - - - start - -
    -
    - starting value. - - -
    - - - - - - - - -
    - - -
    - - - target - -
    -
    - target to apply this generic behvior. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - - setForTime(time, actor) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - actor - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setValues(start, end, target, property, callback) - -
    -
    - Defines the values to apply this behavior. - - -
    - - - - -
    -
    Parameters:
    - -
    - start - -
    -
    {number} initial behavior value.
    - -
    - end - -
    -
    {number} final behavior value.
    - -
    - target - -
    -
    {object} an object. Usually a CAAT.Actor.
    - -
    - property - -
    -
    {string} target object's property to set value to.
    - -
    - callback - -
    -
    {function} a function of the form function( target, value ).
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.Interpolator.html b/documentation/jsdoc/symbols/CAAT.Behavior.Interpolator.html deleted file mode 100644 index 75815952..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.Interpolator.html +++ /dev/null @@ -1,1557 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.Interpolator - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Behavior.Interpolator -

    - - -

    - - - - - - -
    Defined in: Interpolator.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
    <private>   -
    bounce(time) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    createCubicBezierInterpolator(p0, p1, p2, p3, bPingPong) -
    -
    Creates a Cubic bezier curbe as interpolator.
    -
      -
    createElasticInInterpolator(amplitude, p, bPingPong) -
    -
    -
      -
    createElasticInOutInterpolator(amplitude, p, bPingPong) -
    -
    -
      -
    createElasticOutInterpolator(amplitude, p, bPingPong) -
    -
    -
      -
    createExponentialInInterpolator(exponent, bPingPong) -
    -
    Set an exponential interpolator function.
    -
      -
    createExponentialInOutInterpolator(exponent, bPingPong) -
    -
    Set an exponential interpolator function.
    -
      -
    createExponentialOutInterpolator(exponent, bPingPong) -
    -
    Set an exponential interpolator function.
    -
      -
    createLinearInterpolator(bPingPong, bInverse) -
    -
    Set a linear interpolation function.
    -
      -
    createQuadricBezierInterpolator(p0, p1, p2, bPingPong) -
    -
    Creates a Quadric bezier curbe as interpolator.
    -
    <static>   -
    CAAT.Behavior.Interpolator.enumerateInterpolators() -
    -
    -
      -
    getContour(iSize) -
    -
    Gets an array of coordinates which define the polyline of the intepolator's curve contour.
    -
      -
    getPosition(time) -
    -
    Linear and inverse linear interpolation function.
    -
      -
    paint(ctx) -
    -
    Paints an interpolator on screen.
    -
    <static>   -
    CAAT.Behavior.Interpolator.parse(obj) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Behavior.Interpolator() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - bounce(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - createBackOutInterpolator(bPingPong) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - bPingPong - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - createBounceInInterpolator(bPingPong) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - bPingPong - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - createBounceInOutInterpolator(bPingPong) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - bPingPong - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - createBounceOutInterpolator(bPingPong) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - bPingPong - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - createCubicBezierInterpolator(p0, p1, p2, p3, bPingPong) - -
    -
    - Creates a Cubic bezier curbe as interpolator. - - -
    - - - - -
    -
    Parameters:
    - -
    - p0 - -
    -
    {CAAT.Math.Point}
    - -
    - p1 - -
    -
    {CAAT.Math.Point}
    - -
    - p2 - -
    -
    {CAAT.Math.Point}
    - -
    - p3 - -
    -
    {CAAT.Math.Point}
    - -
    - bPingPong - -
    -
    {boolean} a boolean indicating if the interpolator must ping-pong.
    - -
    - - - - - - - - -
    - - -
    - - - createElasticInInterpolator(amplitude, p, bPingPong) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - amplitude - -
    -
    - -
    - p - -
    -
    - -
    - bPingPong - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - createElasticInOutInterpolator(amplitude, p, bPingPong) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - amplitude - -
    -
    - -
    - p - -
    -
    - -
    - bPingPong - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - createElasticOutInterpolator(amplitude, p, bPingPong) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - amplitude - -
    -
    - -
    - p - -
    -
    - -
    - bPingPong - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - createExponentialInInterpolator(exponent, bPingPong) - -
    -
    - Set an exponential interpolator function. The function to apply will be Math.pow(time,exponent). -This function starts with 0 and ends in values of 1. - - -
    - - - - -
    -
    Parameters:
    - -
    - exponent - -
    -
    {number} exponent of the function.
    - -
    - bPingPong - -
    -
    {boolean}
    - -
    - - - - - - - - -
    - - -
    - - - createExponentialInOutInterpolator(exponent, bPingPong) - -
    -
    - Set an exponential interpolator function. Two functions will apply: -Math.pow(time*2,exponent)/2 for the first half of the function (t<0.5) and -1-Math.abs(Math.pow(time*2-2,exponent))/2 for the second half (t>=.5) -This function starts with 0 and goes to values of 1 and ends with values of 0. - - -
    - - - - -
    -
    Parameters:
    - -
    - exponent - -
    -
    {number} exponent of the function.
    - -
    - bPingPong - -
    -
    {boolean}
    - -
    - - - - - - - - -
    - - -
    - - - createExponentialOutInterpolator(exponent, bPingPong) - -
    -
    - Set an exponential interpolator function. The function to apply will be 1-Math.pow(time,exponent). -This function starts with 1 and ends in values of 0. - - -
    - - - - -
    -
    Parameters:
    - -
    - exponent - -
    -
    {number} exponent of the function.
    - -
    - bPingPong - -
    -
    {boolean}
    - -
    - - - - - - - - -
    - - -
    - - - createLinearInterpolator(bPingPong, bInverse) - -
    -
    - Set a linear interpolation function. - - -
    - - - - -
    -
    Parameters:
    - -
    - bPingPong - -
    -
    {boolean}
    - -
    - bInverse - -
    -
    {boolean} will values will be from 1 to 0 instead of 0 to 1 ?.
    - -
    - - - - - - - - -
    - - -
    - - - createQuadricBezierInterpolator(p0, p1, p2, bPingPong) - -
    -
    - Creates a Quadric bezier curbe as interpolator. - - -
    - - - - -
    -
    Parameters:
    - -
    - p0 - -
    -
    {CAAT.Math.Point}
    - -
    - p1 - -
    -
    {CAAT.Math.Point}
    - -
    - p2 - -
    -
    {CAAT.Math.Point}
    - -
    - bPingPong - -
    -
    {boolean} a boolean indicating if the interpolator must ping-pong.
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.Interpolator.enumerateInterpolators() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getContour(iSize) - -
    -
    - Gets an array of coordinates which define the polyline of the intepolator's curve contour. -Values for both coordinates range from 0 to 1. - - -
    - - - - -
    -
    Parameters:
    - -
    - iSize - -
    -
    {number} an integer indicating the number of contour segments.
    - -
    - - - - - -
    -
    Returns:
    - -
    Array. of object of the form {x:float, y:float}.
    - -
    - - - - -
    - - -
    - - - getPosition(time) - -
    -
    - Linear and inverse linear interpolation function. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - paint(ctx) - -
    -
    - Paints an interpolator on screen. - - -
    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    {CanvasRenderingContext}
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.Interpolator.parse(obj) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - obj - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.AUTOROTATE.html b/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.AUTOROTATE.html deleted file mode 100644 index dc444664..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.AUTOROTATE.html +++ /dev/null @@ -1,660 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.PathBehavior.AUTOROTATE - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Behavior.PathBehavior.AUTOROTATE -

    - - -

    - - - - - - -
    Defined in: PathBehavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    Internal PathBehavior rotation constants.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   -
    - CAAT.Behavior.PathBehavior.AUTOROTATE.FREE -
    -
    -
    <static>   -
    - CAAT.Behavior.PathBehavior.AUTOROTATE.LEFT_TO_RIGHT -
    -
    -
    <static>   -
    - CAAT.Behavior.PathBehavior.AUTOROTATE.RIGHT_TO_LEFT -
    -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Behavior.PathBehavior.AUTOROTATE -
    - -
    - Internal PathBehavior rotation constants. - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.Behavior.PathBehavior.AUTOROTATE.FREE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.PathBehavior.AUTOROTATE.LEFT_TO_RIGHT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.PathBehavior.AUTOROTATE.RIGHT_TO_LEFT - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.html deleted file mode 100644 index 6703de8d..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.html +++ /dev/null @@ -1,1337 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.PathBehavior - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Behavior.PathBehavior -

    - - -

    - -
    Extends - CAAT.Behavior.BaseBehavior.
    - - - - - -
    Defined in: PathBehavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   - -
    Whether to set rotation angle while traversing the path.
    -
    <private>   - -
    Autorotation hint.
    -
    <private>   -
    - path -
    -
    A path to traverse.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      - -
    -
      -
    calculateKeyFramesData(prefix, name, keyframessize) -
    -
    -
      - -
    -
      - -
    -
      -
    parse(obj) -
    -
    -
      - -
    Get a point on the path.
    -
      -
    setAutoRotate(autorotate, autorotateOp) -
    -
    Sets an actor rotation to be heading from past to current path's point.
    -
      -
    setForTime(time, actor) -
    -
    -
      - -
    -
      -
    setPath() -
    -
    Set the behavior path.
    -
      - -
    -
      -
    setTranslation(tx, ty) -
    -
    -
      - -
    Set the behavior path.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setStatus, setTimeOffset, setValueApplication
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Behavior.PathBehavior() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - autoRotate - -
    -
    - Whether to set rotation angle while traversing the path. - - -
    - - - - - - - - -
    - - -
    <private> - - - autoRotateOp - -
    -
    - Autorotation hint. - - -
    - - - - - - - - -
    - - -
    <private> - - - path - -
    -
    - A path to traverse. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - - calculateKeyFrameData(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - calculateKeyFramesData(prefix, name, keyframessize) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - prefix - -
    -
    - -
    - name - -
    -
    - -
    - keyframessize - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getKeyFrameDataValues(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPropertyName() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - parse(obj) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - obj - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {object} - positionOnTime(time) - -
    -
    - Get a point on the path. -If the time to get the point at is in behaviors frame time, a point on the path will be returned, otherwise -a default {x:-1, y:-1} point will be returned. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} the time at which the point will be taken from the path.
    - -
    - - - - - -
    -
    Returns:
    - -
    {object} an object of the form {x:float y:float}
    - -
    - - - - -
    - - -
    - - - setAutoRotate(autorotate, autorotateOp) - -
    -
    - Sets an actor rotation to be heading from past to current path's point. -Take into account that this will be incompatible with rotation Behaviors -since they will set their own rotation configuration. - - -
    - - - - -
    -
    Parameters:
    - -
    - autorotate - -
    -
    {boolean}
    - -
    - autorotateOp - -
    -
    {CAAT.PathBehavior.autorotate} whether the sprite is drawn heading to the right.
    - -
    - - - - - -
    -
    Returns:
    - -
    this.
    - -
    - - - - -
    - - -
    - - - setForTime(time, actor) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - actor - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setOpenContour(b) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - b - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPath() - -
    -
    - Set the behavior path. -The path can be any length, and will take behaviorDuration time to be traversed. - - -
    - - - - -
    -
    Parameters:
    - -
    - {CAAT.Path} - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setRelativeValues(x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setTranslation(tx, ty) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - tx - -
    -
    a float with xoffset.
    - -
    - ty - -
    -
    a float with yoffset.
    - -
    - - - - - - - -
    -
    See:
    - -
    Actor.setPositionAnchor
    - -
    - - -
    - - -
    - - - setValues() - -
    -
    - Set the behavior path. -The path can be any length, and will take behaviorDuration time to be traversed. - - -
    - - - - -
    -
    Parameters:
    - -
    - {CAAT.Path} - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.RotateBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.RotateBehavior.html deleted file mode 100644 index 594d1bc5..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.RotateBehavior.html +++ /dev/null @@ -1,1275 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.RotateBehavior - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Behavior.RotateBehavior -

    - - -

    - -
    Extends - CAAT.Behavior.BaseBehavior.
    - - - - - -
    Defined in: RotateBehavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   -
    - anchorX -
    -
    Rotation X anchor.
    -
    <private>   -
    - anchorY -
    -
    Rotation Y anchor.
    -
    <private>   -
    - endAngle -
    -
    End rotation angle.
    -
    <private>   - -
    Start rotation angle.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      - -
    -
      -
    calculateKeyFramesData(prefix, name, keyframessize) -
    -
    -
      - -
    -
      - -
    -
      -
    parse(obj) -
    -
    -
      -
    setAnchor(actor, rx, ry) -
    -
    Set the behavior rotation anchor.
    -
      -
    setAngles(start, end) -
    -
    -
      -
    setForTime(time, actor) -
    -
    -
      - -
    -
      -
    setValues(startAngle, endAngle, anchorx, anchory) -
    -
    Set behavior bound values.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setStatus, setTimeOffset, setValueApplication
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Behavior.RotateBehavior() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - anchorX - -
    -
    - Rotation X anchor. - - -
    - - - - - - - - -
    - - -
    <private> - - - anchorY - -
    -
    - Rotation Y anchor. - - -
    - - - - - - - - -
    - - -
    <private> - - - endAngle - -
    -
    - End rotation angle. - - -
    - - - - - - - - -
    - - -
    <private> - - - startAngle - -
    -
    - Start rotation angle. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - calculateKeyFrameData(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - calculateKeyFramesData(prefix, name, keyframessize) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - prefix - -
    -
    - -
    - name - -
    -
    - -
    - keyframessize - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getKeyFrameDataValues(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPropertyName() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - parse(obj) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - obj - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setAnchor(actor, rx, ry) - -
    -
    - Set the behavior rotation anchor. Use this method when setting an exact percent -by calling setValues is complicated. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    - -
    - rx - -
    -
    - -
    - ry - -
    -
    - -
    - - - - - - - -
    -
    See:
    - -
    CAAT.Actor - -These parameters are to set a custom rotation anchor point. if anchor==CAAT.Actor.ANCHOR_CUSTOM - the custom rotation point is set.
    - -
    - - -
    - - -
    - - - setAngles(start, end) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - start - -
    -
    - -
    - end - -
    -
    - -
    - - -
    -
    Deprecated:
    -
    - Use setValues instead -
    -
    - - - - - - - -
    - - -
    - - - setForTime(time, actor) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - actor - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setRelativeValues(r) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - r - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setValues(startAngle, endAngle, anchorx, anchory) - -
    -
    - Set behavior bound values. -if no anchorx,anchory values are supplied, the behavior will assume -50% for both values, that is, the actor's center. - -Be aware the anchor values are supplied in RELATIVE PERCENT to -actor's size. - - -
    - - - - -
    -
    Parameters:
    - -
    - startAngle - -
    -
    {float} indicating the starting angle.
    - -
    - endAngle - -
    -
    {float} indicating the ending angle.
    - -
    - anchorx - -
    -
    {float} the percent position for anchorX
    - -
    - anchory - -
    -
    {float} the percent position for anchorY
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.Axis.html b/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.Axis.html deleted file mode 100644 index c939b3c8..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.Axis.html +++ /dev/null @@ -1,628 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.Scale1Behavior.AXIS - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Behavior.Scale1Behavior.AXIS -

    - - -

    - - - - - - -
    Defined in: Scale1Behavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   -
    - CAAT.Behavior.Scale1Behavior.AXIS.X -
    -
    -
    <static>   -
    - CAAT.Behavior.Scale1Behavior.AXIS.Y -
    -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Behavior.Scale1Behavior.AXIS -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.Behavior.Scale1Behavior.AXIS.X - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.Scale1Behavior.AXIS.Y - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.html deleted file mode 100644 index b5dd17b3..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.html +++ /dev/null @@ -1,1250 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.Scale1Behavior - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Behavior.Scale1Behavior -

    - - -

    - -
    Extends - CAAT.Behavior.BaseBehavior.
    - - - - - -
    Defined in: Scale1Behavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   -
    - anchorX -
    -
    Scale X anchor.
    -
    <private>   -
    - anchorY -
    -
    Scale Y anchor.
    -
      -
    - applyOnX -
    -
    Apply on Axis X or Y ?
    -
    <private>   -
    - endScale -
    -
    End scale value.
    -
    <private>   - -
    Start scale value.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    applyOnAxis(axis) -
    -
    -
      - -
    -
      -
    calculateKeyFramesData(prefix, name, keyframessize) -
    -
    -
      - -
    -
      - -
    -
      -
    parse(obj) -
    -
    -
      -
    setAnchor(actor, x, y) -
    -
    Set an exact position scale anchor.
    -
      -
    setForTime(time, actor) -
    -
    -
      -
    setValues(start, end, anchorx, anchory, anchory) -
    -
    Define this scale behaviors values.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Behavior.Scale1Behavior() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - anchorX - -
    -
    - Scale X anchor. - - -
    - - - - - - - - -
    - - -
    <private> - - - anchorY - -
    -
    - Scale Y anchor. - - -
    - - - - - - - - -
    - - -
    - - - applyOnX - -
    -
    - Apply on Axis X or Y ? - - -
    - - - - - - - - -
    - - -
    <private> - - - endScale - -
    -
    - End scale value. - - -
    - - - - - - - - -
    - - -
    <private> - - - startScale - -
    -
    - Start scale value. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - applyOnAxis(axis) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - axis - -
    -
    {CAAT.Behavior.Scale1Behavior.AXIS}
    - -
    - - - - - - - - -
    - - -
    - - - calculateKeyFrameData(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - calculateKeyFramesData(prefix, name, keyframessize) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - prefix - -
    -
    - -
    - name - -
    -
    - -
    - keyframessize - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getKeyFrameDataValues(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPropertyName() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - parse(obj) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - obj - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setAnchor(actor, x, y) - -
    -
    - Set an exact position scale anchor. Use this method when it is hard to -set a thorough anchor position expressed in percentage. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setForTime(time, actor) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - actor - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setValues(start, end, anchorx, anchory, anchory) - -
    -
    - Define this scale behaviors values. - -Be aware the anchor values are supplied in RELATIVE PERCENT to -actor's size. - - -
    - - - - -
    -
    Parameters:
    - -
    - start - -
    -
    {number} initial X axis scale value.
    - -
    - end - -
    -
    {number} final X axis scale value.
    - -
    - anchorx - -
    -
    {float} the percent position for anchorX
    - -
    - anchory - -
    -
    {float} the percent position for anchorY
    - -
    - anchory - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    this.
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.ScaleBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.ScaleBehavior.html deleted file mode 100644 index bcca79d1..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.ScaleBehavior.html +++ /dev/null @@ -1,1250 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior.ScaleBehavior - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Behavior.ScaleBehavior -

    - - -

    - -
    Extends - CAAT.Behavior.BaseBehavior.
    - - - - - -
    Defined in: ScaleBehavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private> <static>   -
    - CAAT.Behavior.ScaleBehavior.anchorX -
    -
    Scale X anchor value.
    -
    <private> <static>   -
    - CAAT.Behavior.ScaleBehavior.anchorY -
    -
    Scale Y anchor value.
    -
    <private> <static>   -
    - CAAT.Behavior.ScaleBehavior.endScaleX -
    -
    End X scale value.
    -
    <private> <static>   -
    - CAAT.Behavior.ScaleBehavior.endScaleY -
    -
    End Y scale value.
    -
    <private> <static>   -
    - CAAT.Behavior.ScaleBehavior.startScaleX -
    -
    Start X scale value.
    -
    <private> <static>   -
    - CAAT.Behavior.ScaleBehavior.startScaleY -
    -
    Start Y scale value.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private> <static>   -
    CAAT.Behavior.ScaleBehavior.__init() -
    -
    -
    <static>   -
    CAAT.Behavior.ScaleBehavior.calculateKeyFrameData(time) -
    -
    -
    <static>   -
    CAAT.Behavior.ScaleBehavior.calculateKeyFramesData(prefix, name, keyframessize) -
    -
    -
    <static>   -
    CAAT.Behavior.ScaleBehavior.getKeyFrameDataValues(time) -
    -
    -
    <static>   -
    CAAT.Behavior.ScaleBehavior.getPropertyName() -
    -
    -
    <static>   -
    CAAT.Behavior.ScaleBehavior.parse(obj) -
    -
    -
    <static>   -
    CAAT.Behavior.ScaleBehavior.setAnchor(actor, x, y) -
    -
    Set an exact position scale anchor.
    -
    <static>   -
    CAAT.Behavior.ScaleBehavior.setForTime(time, actor) -
    -
    Applies corresponding scale values for a given time.
    -
    <static>   -
    CAAT.Behavior.ScaleBehavior.setValues(startX, endX, startY, endY, anchorx, anchory) -
    -
    Define this scale behaviors values.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Behavior.ScaleBehavior() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> <static> - - - CAAT.Behavior.ScaleBehavior.anchorX - -
    -
    - Scale X anchor value. - - -
    - - - - - - - - -
    - - -
    <private> <static> - - - CAAT.Behavior.ScaleBehavior.anchorY - -
    -
    - Scale Y anchor value. - - -
    - - - - - - - - -
    - - -
    <private> <static> - - - CAAT.Behavior.ScaleBehavior.endScaleX - -
    -
    - End X scale value. - - -
    - - - - - - - - -
    - - -
    <private> <static> - - - CAAT.Behavior.ScaleBehavior.endScaleY - -
    -
    - End Y scale value. - - -
    - - - - - - - - -
    - - -
    <private> <static> - - - CAAT.Behavior.ScaleBehavior.startScaleX - -
    -
    - Start X scale value. - - -
    - - - - - - - - -
    - - -
    <private> <static> - - - CAAT.Behavior.ScaleBehavior.startScaleY - -
    -
    - Start Y scale value. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> <static> - - - CAAT.Behavior.ScaleBehavior.__init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.ScaleBehavior.calculateKeyFrameData(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.ScaleBehavior.calculateKeyFramesData(prefix, name, keyframessize) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - prefix - -
    -
    - -
    - name - -
    -
    - -
    - keyframessize - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.ScaleBehavior.getKeyFrameDataValues(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.ScaleBehavior.getPropertyName() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.ScaleBehavior.parse(obj) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - obj - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Behavior.ScaleBehavior.setAnchor(actor, x, y) - -
    -
    - Set an exact position scale anchor. Use this method when it is hard to -set a thorough anchor position expressed in percentage. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - {object} - CAAT.Behavior.ScaleBehavior.setForTime(time, actor) - -
    -
    - Applies corresponding scale values for a given time. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    the time to apply the scale for.
    - -
    - actor - -
    -
    the target actor to Scale.
    - -
    - - - - - -
    -
    Returns:
    - -
    {object} an object of the form { scaleX: {float}, scaleY: {float}�}
    - -
    - - - - -
    - - -
    <static> - - - CAAT.Behavior.ScaleBehavior.setValues(startX, endX, startY, endY, anchorx, anchory) - -
    -
    - Define this scale behaviors values. - -Be aware the anchor values are supplied in RELATIVE PERCENT to -actor's size. - - -
    - - - - -
    -
    Parameters:
    - -
    - startX - -
    -
    {number} initial X axis scale value.
    - -
    - endX - -
    -
    {number} final X axis scale value.
    - -
    - startY - -
    -
    {number} initial Y axis scale value.
    - -
    - endY - -
    -
    {number} final Y axis scale value.
    - -
    - anchorx - -
    -
    {float} the percent position for anchorX
    - -
    - anchory - -
    -
    {float} the percent position for anchorY
    - -
    - - - - - -
    -
    Returns:
    - -
    this.
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.html deleted file mode 100644 index f9dc6f65..00000000 --- a/documentation/jsdoc/symbols/CAAT.Behavior.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Behavior - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Behavior -

    - - -

    - - - - - - -
    Defined in: BaseBehavior.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    Namespace for all behavior-based actor properties instrumenter objects.
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Behavior -
    - -
    - Namespace for all behavior-based actor properties instrumenter objects. - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.CSS.html b/documentation/jsdoc/symbols/CAAT.CSS.html deleted file mode 100644 index 4c796853..00000000 --- a/documentation/jsdoc/symbols/CAAT.CSS.html +++ /dev/null @@ -1,873 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.CSS - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.CSS -

    - - -

    - - - - - - -
    Defined in: csskeyframehelper.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      -
    - CAAT.CSS -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   -
    - CAAT.CSS.PREFIX -
    -
    Guess a browser custom prefix.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <static>   -
    CAAT.CSS.applyKeyframe(domElement, name, duration_millis, delay_millis, forever) -
    -
    Apply a given @key-frames animation to a DOM element.
    -
    <static>   -
    CAAT.CSS.getCSSKeyframes(name) -
    -
    -
    <static>   -
    CAAT.CSS.getCSSKeyframesIndex(name) -
    -
    -
    <static>   -
    CAAT.CSS.registerKeyframes(kfDescriptor) -
    -
    -
    <static>   -
    CAAT.CSS.unregisterKeyframes(name) -
    -
    Remove a @key-frames animation from the stylesheet.
    -
    - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.CSS -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.CSS.PREFIX - -
    -
    - Guess a browser custom prefix. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <static> - - - CAAT.CSS.applyKeyframe(domElement, name, duration_millis, delay_millis, forever) - -
    -
    - Apply a given @key-frames animation to a DOM element. - - -
    - - - - -
    -
    Parameters:
    - -
    - domElement - -
    -
    {DOMElement}
    - -
    - name - -
    -
    {string} animation name
    - -
    - duration_millis - -
    -
    {number}
    - -
    - delay_millis - -
    -
    {number}
    - -
    - forever - -
    -
    {boolean}
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.CSS.getCSSKeyframes(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.CSS.getCSSKeyframesIndex(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.CSS.registerKeyframes(kfDescriptor) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - kfDescriptor - -
    -
    {object} - { - name{string}, - behavior{CAAT.Behavior}, - size{!number}, - overwrite{boolean} - } - }
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.CSS.unregisterKeyframes(name) - -
    -
    - Remove a @key-frames animation from the stylesheet. - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Class.html b/documentation/jsdoc/symbols/CAAT.Class.html deleted file mode 100644 index ce6c5e55..00000000 --- a/documentation/jsdoc/symbols/CAAT.Class.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Class - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Class -

    - - -

    - - - - - - -
    Defined in: ModuleManager.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      -
    - CAAT.Class() -
    -
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Class() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.__init.html b/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.__init.html deleted file mode 100644 index 4d806b9f..00000000 --- a/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.__init.html +++ /dev/null @@ -1,669 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Event.KeyEvent.__init - - - - - - - - - - - - - -
    - -

    - - Class CAAT.Event.KeyEvent.__init -

    - - -

    - - - - - - -
    Defined in: KeyEvent.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <private>   -
    - CAAT.Event.KeyEvent.__init(keyCode, up_or_down, modifiers, originalEvent) -
    -
    Define a key event.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    <private> - CAAT.Event.KeyEvent.__init(keyCode, up_or_down, modifiers, originalEvent) -
    - -
    - Define a key event. - -
    - - - - - -
    -
    Parameters:
    - -
    - keyCode - -
    -
    - -
    - up_or_down - -
    -
    - -
    - modifiers - -
    -
    - -
    - originalEvent - -
    -
    - -
    - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    - - - getAction() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getKeyCode() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getSourceEvent() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isAltPressed() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isControlPressed() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isShiftPressed() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - modifiers() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - preventDefault() - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 09:21:05 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.html b/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.html deleted file mode 100644 index 520ce020..00000000 --- a/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.html +++ /dev/null @@ -1,899 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Event.KeyEvent - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Event.KeyEvent -

    - - -

    - - - - - - -
    Defined in: KeyEvent.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(keyCode, up_or_down, modifiers, originalEvent) -
    -
    Define a key event.
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Event.KeyEvent() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(keyCode, up_or_down, modifiers, originalEvent) - -
    -
    - Define a key event. - - -
    - - - - -
    -
    Parameters:
    - -
    - keyCode - -
    -
    - -
    - up_or_down - -
    -
    - -
    - modifiers - -
    -
    - -
    - originalEvent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getAction() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getKeyCode() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getSourceEvent() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isAltPressed() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isControlPressed() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isShiftPressed() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - modifiers() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - preventDefault() - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Event.MouseEvent.html b/documentation/jsdoc/symbols/CAAT.Event.MouseEvent.html deleted file mode 100644 index 0d379a09..00000000 --- a/documentation/jsdoc/symbols/CAAT.Event.MouseEvent.html +++ /dev/null @@ -1,1154 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Event.MouseEvent - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Event.MouseEvent -

    - - -

    - - - - - - -
    Defined in: MouseEvent.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - alt -
    -
    was alt pressed ?
    -
      -
    - control -
    -
    Was control pressed ?
    -
      -
    - meta -
    -
    was Meta key pressed ?
    -
      -
    - point -
    -
    Transformed in-actor coordinate
    -
      - -
    Original mouse/touch screen coord
    -
      -
    - shift -
    -
    Was shift pressed ?
    -
      -
    - source -
    -
    Actor the event was produced in.
    -
      - -
    Original mouse/touch event
    -
      -
    - time -
    -
    scene time when the event was triggered.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    Constructor delegate
    -
      - -
    -
      -
    init(x, y, sourceEvent, source, screenPoint, time) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Event.MouseEvent() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - alt - -
    -
    - was alt pressed ? - - -
    - - - - - - - - -
    - - -
    - - - control - -
    -
    - Was control pressed ? - - -
    - - - - - - - - -
    - - -
    - - - meta - -
    -
    - was Meta key pressed ? - - -
    - - - - - - - - -
    - - -
    - - - point - -
    -
    - Transformed in-actor coordinate - - -
    - - - - - - - - -
    - - -
    - - - screenPoint - -
    -
    - Original mouse/touch screen coord - - -
    - - - - - - - - -
    - - -
    - - - shift - -
    -
    - Was shift pressed ? - - -
    - - - - - - - - -
    - - -
    - - - source - -
    -
    - Actor the event was produced in. - - -
    - - - - - - - - -
    - - -
    - - - sourceEvent - -
    -
    - Original mouse/touch event - - -
    - - - - - - - - -
    - - -
    - - - time - -
    -
    - scene time when the event was triggered. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - Constructor delegate - - -
    - - - - - - - - - - - -
    - - -
    - - - getSourceEvent() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - init(x, y, sourceEvent, source, screenPoint, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - sourceEvent - -
    -
    - -
    - source - -
    -
    - -
    - screenPoint - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - isAltDown() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isControlDown() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isMetaDown() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isShiftDown() - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Event.TouchEvent.html b/documentation/jsdoc/symbols/CAAT.Event.TouchEvent.html deleted file mode 100644 index 1096a96e..00000000 --- a/documentation/jsdoc/symbols/CAAT.Event.TouchEvent.html +++ /dev/null @@ -1,1238 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Event.TouchEvent - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Event.TouchEvent -

    - - -

    - - - - - - -
    Defined in: TouchEvent.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - alt -
    -
    Was alt pressed ?
    -
      - -
    changed touches collection
    -
      -
    - control -
    -
    Was control pressed ?
    -
      -
    - meta -
    -
    Was meta pressed ?
    -
      -
    - shift -
    -
    Was shift pressed ?
    -
      -
    - source -
    -
    Source Actor the event happened in.
    -
      - -
    Original touch event.
    -
      -
    - time -
    -
    Time the touch event was triggered at.
    -
      -
    - touches -
    -
    touches collection
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    Constructor delegate
    -
      -
    addChangedTouch(touchInfo) -
    -
    -
      -
    addTouch(touchInfo) -
    -
    -
      - -
    -
      -
    init(sourceEvent, source, time) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Event.TouchEvent() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - alt - -
    -
    - Was alt pressed ? - - -
    - - - - - - - - -
    - - -
    - - - changedTouches - -
    -
    - changed touches collection - - -
    - - - - - - - - -
    - - -
    - - - control - -
    -
    - Was control pressed ? - - -
    - - - - - - - - -
    - - -
    - - - meta - -
    -
    - Was meta pressed ? - - -
    - - - - - - - - -
    - - -
    - - - shift - -
    -
    - Was shift pressed ? - - -
    - - - - - - - - -
    - - -
    - - - source - -
    -
    - Source Actor the event happened in. - - -
    - - - - - - - - -
    - - -
    - - - sourceEvent - -
    -
    - Original touch event. - - -
    - - - - - - - - -
    - - -
    - - - time - -
    -
    - Time the touch event was triggered at. - - -
    - - - - - - - - -
    - - -
    - - - touches - -
    -
    - touches collection - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - Constructor delegate - - -
    - - - - - - - - - - - -
    - - -
    - - - addChangedTouch(touchInfo) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - touchInfo - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {*} - addTouch(touchInfo) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - touchInfo - -
    -
    <{ - id : , - point : { - x: , - y: }� - }>
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - getSourceEvent() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - init(sourceEvent, source, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - sourceEvent - -
    -
    - -
    - source - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - isAltDown() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isControlDown() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isMetaDown() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isShiftDown() - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Event.TouchInfo.html b/documentation/jsdoc/symbols/CAAT.Event.TouchInfo.html deleted file mode 100644 index ea77b286..00000000 --- a/documentation/jsdoc/symbols/CAAT.Event.TouchInfo.html +++ /dev/null @@ -1,627 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Event.TouchInfo - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Event.TouchInfo -

    - - -

    - - - - - - -
    Defined in: TouchInfo.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(id, x, y, target) -
    -
    Constructor delegate.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Event.TouchInfo() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(id, x, y, target) - -
    -
    - Constructor delegate. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {number}
    - -
    - x - -
    -
    {number}
    - -
    - y - -
    -
    {number}
    - -
    - target - -
    -
    {DOMElement}
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Event.html b/documentation/jsdoc/symbols/CAAT.Event.html deleted file mode 100644 index e26ade51..00000000 --- a/documentation/jsdoc/symbols/CAAT.Event.html +++ /dev/null @@ -1,539 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Event - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Event -

    - - -

    - - - - - - -
    Defined in: KeyEvent.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Event -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Actor.html b/documentation/jsdoc/symbols/CAAT.Foundation.Actor.html deleted file mode 100644 index 81523b84..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.Actor.html +++ /dev/null @@ -1,8931 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.Actor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.Actor -

    - - -

    - - - - - - -
    Defined in: Actor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    CAAT.Foundation.Actor is the base animable element.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   -
    - __super -
    -
    -
      -
    - AABB -
    -
    This rectangle keeps the axis aligned bounding box in screen coords of this actor.
    -
      -
    - alpha -
    -
    Transparency value.
    -
    <static>   -
    - CAAT.Foundation.Actor.ANCHOR_BOTTOM -
    -
    -
    <static>   -
    - CAAT.Foundation.Actor.ANCHOR_BOTTOM_LEFT -
    -
    -
    <static>   -
    - CAAT.Foundation.Actor.ANCHOR_BOTTOM_RIGHT -
    -
    -
    <static>   -
    - CAAT.Foundation.Actor.ANCHOR_CENTER -
    -
    -
    <static>   -
    - CAAT.Foundation.Actor.ANCHOR_CUSTOM -
    -
    -
    <static>   -
    - CAAT.Foundation.Actor.ANCHOR_LEFT -
    -
    -
    <static>   -
    - CAAT.Foundation.Actor.ANCHOR_RIGHT -
    -
    -
    <static>   -
    - CAAT.Foundation.Actor.ANCHOR_TOP -
    -
    -
    <static>   -
    - CAAT.Foundation.Actor.ANCHOR_TOP_LEFT -
    -
    -
    <static>   -
    - CAAT.Foundation.Actor.ANCHOR_TOP_RIGHT -
    -
    -
      - -
    Define this actor´s background image.
    -
      - -
    A collection of behaviors to modify this actor´s properties.
    -
    <static>   -
    - CAAT.Foundation.Actor.CACHE_DEEP -
    -
    -
    <static>   -
    - CAAT.Foundation.Actor.CACHE_NONE -
    -
    -
    <static>   -
    - CAAT.Foundation.Actor.CACHE_SIMPLE -
    -
    -
      -
    - cached -
    -
    Caching as bitmap strategy.
    -
      -
    - clip -
    -
    Will this actor be clipped before being drawn on screen ?
    -
      -
    - clipPath -
    -
    If this.clip and this.clipPath===null, a rectangle will be used as clip area.
    -
    <private>   -
    - dirty -
    -
    Local matrix dirtyness flag.
    -
      - -
    Mark this actor as discardable.
    -
      -
    - duration -
    -
    Marks from the time this actor is going to be animated, during how much time.
    -
      -
    - expired -
    -
    Mark this actor as expired, or out of the scene time.
    -
      -
    - fillStyle -
    -
    any canvas rendering valid fill style.
    -
    <private>   - -
    -
      - -
    Is gesture recognition enabled on this actor ??
    -
      -
    - glEnabled -
    -
    Is this actor enabled on WebGL ?
    -
      -
    - height -
    -
    Actor's height.
    -
      -
    - id -
    -
    Set this actor´ id so that it can be later identified easily.
    -
      -
    - inFrame -
    -
    Is this actor processed in the last frame ?
    -
      -
    - invalid -
    -
    If dirty rects are enabled, this flag indicates the rendering engine to invalidate this -actor´s screen area.
    -
    <private>   -
    - isAA -
    -
    is this actor/container Axis aligned ? if so, much faster inverse matrices can be calculated.
    -
      - -
    if this actor is cached, when destroy is called, it does not call 'clean' method, which clears some -internal properties.
    -
      - -
    true to make all children transparent, false, only this actor/container will be transparent.
    -
      - -
    A collection of this Actors lifecycle observers.
    -
      - -
    actor's layout minimum size.
    -
      - -
    This actor´s affine transformation matrix.
    -
      - -
    -
      - -
    Enable or disable input on this actor.
    -
    <private>   -
    - oldX -
    -
    -
    <private>   -
    - oldY -
    -
    -
      -
    - parent -
    -
    This actor's parent container.
    -
      -
    - pointed -
    -
    -
      - -
    actor´s layout preferred size.
    -
      - -
    Exclude this actor from automatic layout on its parent.
    -
      - -
    This actor´s rotation angle in radians.
    -
      -
    - rotationX -
    -
    Rotation Anchor Y.
    -
      -
    - rotationY -
    -
    Rotation Anchor X.
    -
      - -
    A value that corresponds to any CAAT.Foundation.Actor.ANCHOR_* value.
    -
      -
    - scaleTX -
    -
    Scale Anchor X.
    -
      -
    - scaleTY -
    -
    Scale Anchor Y.
    -
      -
    - scaleX -
    -
    ScaleX value.
    -
      -
    - scaleY -
    -
    ScaleY value.
    -
      - -
    debug info.
    -
      - -
    debug info.
    -
      - -
    Marks since when this actor, relative to scene time, is going to be animated/drawn.
    -
      - -
    any canvas rendering valid stroke style.
    -
      -
    - tAnchorX -
    -
    Translation x anchor.
    -
      -
    - tAnchorY -
    -
    Translation y anchor.
    -
      -
    - time -
    -
    This actor´s scene time.
    -
      - -
    These 4 CAAT.Math.Point objects are the vertices of this actor´s non axis aligned bounding -box.
    -
      -
    - visible -
    -
    Make this actor visible or not.
    -
    <private>   -
    - wdirty -
    -
    Global matrix dirtyness flag.
    -
      -
    - width -
    -
    Actor's width.
    -
      - -
    This actor´s world affine transformation matrix.
    -
      - -
    -
      -
    - x -
    -
    x position on parent.
    -
      -
    - y -
    -
    y position on parent.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
    <private>   -
    __paintActor(director, time) -
    -
    for js2native
    -
    <private>   -
    __scale1To(axis, scale, duration, delay, anchorX, anchorY, interpolator) -
    -
    -
    <private>   - -
    -
      -
    addAnimation(name, array, time, callback) -
    -
    -
      -
    addBehavior(behavior) -
    -
    Add a Behavior to the Actor.
    -
      -
    addListener(actorListener) -
    -
    Adds an Actor's life cycle listener.
    -
      -
    animate(director, time) -
    -
    Private -This method is called by the Director instance.
    -
      -
    cacheAsBitmap(time, stragegy) -
    -
    -
      -
    centerAt(x, y) -
    -
    Center this actor at position (x,y).
    -
      -
    centerOn(x, y) -
    -
    Center this actor at position (x,y).
    -
      -
    clean() -
    -
    -
      -
    contains(x, y) -
    -
    Checks whether a coordinate is inside the Actor's bounding box.
    -
      -
    create() -
    -
    -
    <private>   -
    destroy(time) -
    -
    This method will be called internally by CAAT when an Actor is expired, and at the -same time, is flagged as discardable.
    -
      - -
    -
      -
    drawScreenBoundingBox(director, time) -
    -
    Draw a bounding box with on-screen coordinates regardless of the transformations -applied to the Actor.
    -
      - -
    Removes all behaviors from an Actor.
    -
      - -
    Enables a default dragging routine for the Actor.
    -
      -
    enableEvents(enable) -
    -
    Enable or disable the event bubbling for this Actor.
    -
      -
    endAnimate(director, time) -
    -
    -
      - -
    Private -This method does the needed point transformations across an Actor hierarchy to devise -whether the parameter point coordinate lies inside the Actor.
    -
      - -
    -
      -
    fireEvent(sEventType, time) -
    -
    Notifies the registered Actor's life cycle listener about some event.
    -
      -
    gestureChange(rotation, scaleX, scaleY) -
    -
    -
      -
    gestureEnd(rotation, scaleX, scaleY) -
    -
    -
      -
    gestureStart(rotation, scaleX, scaleY) -
    -
    -
      -
    getAnchor(anchor) -
    -
    Private.
    -
      -
    getAnchorPercent(anchor) -
    -
    -
      - -
    -
      -
    getId() -
    -
    -
      - -
    -
      - -
    -
      - -
    If GL is enables, get this background image's texture page, otherwise it will fail.
    -
      -
    glNeedsFlush(director) -
    -
    Test for compulsory gl flushing: - 1.
    -
      -
    glSetShader(director) -
    -
    Change texture shader program parameters.
    -
      -
    initialize(overrides) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
    <private>   - -
    This method is called by the Director to know whether the actor is on Scene time.
    -
      - -
    -
      -
    modelToModel(point, otherActor) -
    -
    Transform a local coordinate point on this Actor's coordinate system into -another point in otherActor's coordinate system.
    -
    <private>   -
    modelToView(point) -
    -
    Transform a point or array of points in model space to view space.
    -
      -
    mouseClick(mouseEvent) -
    -
    Default mouseClick handler.
    -
      -
    mouseDblClick(mouseEvent) -
    -
    Default double click handler
    -
      -
    mouseDown(mouseEvent) -
    -
    default mouse press in Actor handler.
    -
      -
    mouseDrag(mouseEvent) -
    -
    default Actor mouse drag handler.
    -
      -
    mouseEnter(mouseEvent) -
    -
    Default mouse enter on Actor handler.
    -
      -
    mouseExit(mouseEvent) -
    -
    Default mouse exit on Actor handler.
    -
      -
    mouseMove(mouseEvent) -
    -
    Default mouse move inside Actor handler.
    -
      -
    mouseOut(mouseEvent) -
    -
    -
      -
    mouseOver(mouseEvent) -
    -
    -
      -
    mouseUp(mouseEvent) -
    -
    default mouse release in Actor handler.
    -
      -
    moveTo(x, y, duration, delay, interpolator, callback) -
    -
    Move this actor to a position.
    -
      -
    paint(director, time) -
    -
    This method should me overriden by every custom Actor.
    -
      -
    paintActor(director, time) -
    -
    -
      -
    paintActorGL(director, time) -
    -
    Set coordinates and uv values for this actor.
    -
      -
    playAnimation(name) -
    -
    -
      - -
    Remove a Behavior with id param as behavior identifier from this actor.
    -
      -
    removeBehaviour(behavior) -
    -
    Remove a Behavior from the Actor.
    -
      -
    removeListener(actorListener) -
    -
    Removes an Actor's life cycle listener.
    -
      - -
    -
      - -
    -
      - -
    Remove all transformation values for the Actor.
    -
      -
    rotateTo(angle, duration, delay, anchorX, anchorY, interpolator) -
    -
    -
      -
    scaleTo(scaleX, scaleY, duration, delay, anchorX, anchorY, interpolator) -
    -
    -
      -
    scaleXTo(scaleX, duration, delay, anchorX, anchorY, interpolator) -
    -
    -
      -
    scaleYTo(scaleY, duration, delay, anchorX, anchorY, interpolator) -
    -
    -
      -
    setAlpha(alpha) -
    -
    Stablishes the Alpha transparency for the Actor.
    -
      - -
    -
      - -
    Set this actor's background SpriteImage its animation sequence.
    -
      -
    setAsButton(buttonImage, iNormal, iOver, iPress, iDisabled, fn) -
    -
    Set this actor behavior as if it were a Button.
    -
      -
    setBackgroundImage(image, adjust_size_to_image) -
    -
    Set this actor's background image.
    -
      - -
    Set this actor's background SpriteImage offset displacement.
    -
      -
    setBounds(x{number}, y{number}, w{number}, h{number}) -
    -
    Set location and dimension of an Actor at once.
    -
      -
    setButtonImageIndex(_normal, _over, _press, _disabled) -
    -
    -
      -
    setCachedActor(cached) -
    -
    -
      -
    setChangeFPS(time) -
    -
    -
      -
    setClip(enable, clipPath) -
    -
    Set this Actor's clipping area.
    -
      -
    setDiscardable(discardable) -
    -
    Set discardable property.
    -
      -
    setExpired(time) -
    -
    Sets this Actor as Expired.
    -
      -
    setFillStyle(style) -
    -
    Caches a fillStyle in the Actor.
    -
      -
    setFrameTime(startTime, duration) -
    -
    Sets the time life cycle for an Actor.
    -
      - -
    -
      -
    setGLCoords(glCoords, glCoordsIndex) -
    -
    TODO: set GLcoords for different image transformations.
    -
      -
    setGlobalAlpha(global) -
    -
    Set alpha composition scope.
    -
      -
    setGlobalAnchor(ax, ay) -
    -
    -
      -
    setId(id) -
    -
    -
      - -
    Set this background image transformation.
    -
      -
    setLocation(x{number}, y{number}) -
    -
    This method sets the position of an Actor inside its parent.
    -
      -
    setMinimumSize(pw, ph) -
    -
    Set this actors minimum layout size.
    -
      - -
    Set this model view matrix if the actor is Dirty.
    -
      - -
    Puts an Actor out of time line, that is, won't be transformed nor rendered.
    -
      -
    setPaint(paint) -
    -
    -
      -
    setParent(parent) -
    -
    Set this actor's parent.
    -
      -
    setPosition(x, y) -
    -
    -
      -
    setPositionAnchor(pax, pay) -
    -
    -
      -
    setPositionAnchored(x, y, pax, pay) -
    -
    -
      -
    setPreferredSize(pw, ph) -
    -
    Set this actors preferred layout size.
    -
      - -
    Make this actor not be laid out.
    -
      -
    setRotation(angle) -
    -
    A helper method for setRotationAnchored.
    -
      -
    setRotationAnchor(rax, ray) -
    -
    -
      -
    setRotationAnchored(angle, rx, ry) -
    -
    This method sets Actor rotation around a given position.
    -
      -
    setScale(sx, sy) -
    -
    A helper method to setScaleAnchored with an anchor of ANCHOR_CENTER
    -
      -
    setScaleAnchor(sax, say) -
    -
    -
      -
    setScaleAnchored(sx, sy, anchorx, anchory) -
    -
    Modify the dimensions on an Actor.
    -
    <private>   - -
    Calculates the 2D bounding box in canvas coordinates of the Actor.
    -
      -
    setSize(w, h) -
    -
    Sets an Actor's dimension
    -
      -
    setSpriteIndex(index) -
    -
    Set the actor's SpriteImage index from animation sheet.
    -
      -
    setStrokeStyle(style) -
    -
    Caches a stroke style in the Actor.
    -
      -
    setUV(uvBuffer, uvIndex) -
    -
    Set UV for this actor's quad.
    -
      -
    setVisible(visible) -
    -
    Set this actor invisible.
    -
      - -
    -
      -
    touchEnd(e) -
    -
    -
      -
    touchMove(e) -
    -
    -
      - -
    Touch Start only received when CAAT.TOUCH_BEHAVIOR= CAAT.TOUCH_AS_MULTITOUCH
    -
      -
    viewToModel(point) -
    -
    Transform a point from model to view space.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.Actor() -
    - -
    - CAAT.Foundation.Actor is the base animable element. It is the base object for Director, Scene and -Container. -

    CAAT.Actor is the simplest object instance CAAT manages. Every on-screen element is an Actor instance. - An Actor has entity, it has a size, position and can have input sent to it. Everything that has a - visual representation is an Actor, including Director and Scene objects.

    -

    This object has functionality for:

    -
      -
    1. Set location and size on screen. Actors are always rectangular shapes, but not needed to be AABB.
    2. -
    3. Set affine transforms (rotation, scale and translation).
    4. -
    5. Define life cycle.
    6. -
    7. Manage alpha transparency.
    8. -
    9. Manage and keep track of applied Behaviors. Behaviors apply transformations via key-framing.
    10. -
    11. Compose transformations. A container Actor will transform its children before they apply their own transformation.
    12. -
    13. Clipping capabilities. Either rectangular or arbitrary shapes.
    14. -
    15. The API is developed to allow method chaining when possible.
    16. -
    17. Handle input (either mouse events, touch, multitouch, keys and accelerometer).
    18. -
    19. Show an image.
    20. -
    21. Show some image animations.
    22. -
    23. etc.
    24. -
    - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - __super - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - AABB - -
    -
    - This rectangle keeps the axis aligned bounding box in screen coords of this actor. -In can be used, among other uses, to realize whether two given actors collide regardless -the affine transformation is being applied on them. - - -
    - - - - - - - - -
    - - -
    - - - alpha - -
    -
    - Transparency value. 0 is totally transparent, 1 is totally opaque. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.ANCHOR_BOTTOM - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.ANCHOR_BOTTOM_LEFT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.ANCHOR_BOTTOM_RIGHT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.ANCHOR_CENTER - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.ANCHOR_CUSTOM - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.ANCHOR_LEFT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.ANCHOR_RIGHT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.ANCHOR_TOP - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.ANCHOR_TOP_LEFT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.ANCHOR_TOP_RIGHT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - backgroundImage - -
    -
    - Define this actor´s background image. -See SpriteImage object. - - -
    - - - - - - - - -
    - - -
    - - - behaviorList - -
    -
    - A collection of behaviors to modify this actor´s properties. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.CACHE_DEEP - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.CACHE_NONE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Actor.CACHE_SIMPLE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - cached - -
    -
    - Caching as bitmap strategy. Suitable to cache very complex actors. - -0 : no cache. -CACHE_SIMPLE : if a container, only cache the container. -CACHE_DEEP : if a container, cache the container and recursively all of its children. - - -
    - - - - - - - - -
    - - -
    - - - clip - -
    -
    - Will this actor be clipped before being drawn on screen ? - - -
    - - - - - - - - -
    - - -
    - - - clipPath - -
    -
    - If this.clip and this.clipPath===null, a rectangle will be used as clip area. Otherwise, -clipPath contains a reference to a CAAT.PathUtil.Path object. - - -
    - - - - - - - - -
    - - -
    <private> - - - dirty - -
    -
    - Local matrix dirtyness flag. - - -
    - - - - - - - - -
    - - -
    - - - discardable - -
    -
    - Mark this actor as discardable. If an actor is expired and mark as discardable, if will be -removed from its parent. - - -
    - - - - - - - - -
    - - -
    - - - duration - -
    -
    - Marks from the time this actor is going to be animated, during how much time. -Forever by default. - - -
    - - - - - - - - -
    - - -
    - - - expired - -
    -
    - Mark this actor as expired, or out of the scene time. - - -
    - - - - - - - - -
    - - -
    - - - fillStyle - -
    -
    - any canvas rendering valid fill style. - - -
    - - - - - - - - -
    - - -
    <private> - - - frameAlpha - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - gestureEnabled - -
    -
    - Is gesture recognition enabled on this actor ?? - - -
    - - - - - - - - -
    - - -
    - - - glEnabled - -
    -
    - Is this actor enabled on WebGL ? - - -
    - - - - - - - - -
    - - -
    - - - height - -
    -
    - Actor's height. In parent's local coord. system. - - -
    - - - - - - - - -
    - - -
    - - - id - -
    -
    - Set this actor´ id so that it can be later identified easily. - - -
    - - - - - - - - -
    - - -
    - - - inFrame - -
    -
    - Is this actor processed in the last frame ? - - -
    - - - - - - - - -
    - - -
    - - - invalid - -
    -
    - If dirty rects are enabled, this flag indicates the rendering engine to invalidate this -actor´s screen area. - - -
    - - - - - - - - -
    - - -
    <private> - - - isAA - -
    -
    - is this actor/container Axis aligned ? if so, much faster inverse matrices can be calculated. - - -
    - - - - - - - - -
    - - -
    - - - isCachedActor - -
    -
    - if this actor is cached, when destroy is called, it does not call 'clean' method, which clears some -internal properties. - - -
    - - - - - - - - -
    - - -
    - - - isGlobalAlpha - -
    -
    - true to make all children transparent, false, only this actor/container will be transparent. - - -
    - - - - - - - - -
    - - -
    - - - lifecycleListenerList - -
    -
    - A collection of this Actors lifecycle observers. - - -
    - - - - - - - - -
    - - -
    - - - minimumSize - -
    -
    - actor's layout minimum size. - - -
    - - - - - - - - -
    - - -
    - - - modelViewMatrix - -
    -
    - This actor´s affine transformation matrix. - - -
    - - - - - - - - -
    - - -
    - - - modelViewMatrixI - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - mouseEnabled - -
    -
    - Enable or disable input on this actor. By default, all actors receive input. -See also priority lists. -see demo4 for an example of input and priority lists. - - -
    - - - - - - - - -
    - - -
    <private> - - - oldX - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <private> - - - oldY - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - parent - -
    -
    - This actor's parent container. - - -
    - - - - - - - - -
    - - -
    - - - pointed - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - preferredSize - -
    -
    - actor´s layout preferred size. - - -
    - - - - - - - - -
    - - -
    - - - preventLayout - -
    -
    - Exclude this actor from automatic layout on its parent. - - -
    - - - - - - - - -
    - - -
    - - - rotationAngle - -
    -
    - This actor´s rotation angle in radians. - - -
    - - - - - - - - -
    - - -
    - - - rotationX - -
    -
    - Rotation Anchor Y. CAAT uses different Anchors for position, rotation and scale. Value 0-1. - - -
    - - - - - - - - -
    - - -
    - - - rotationY - -
    -
    - Rotation Anchor X. CAAT uses different Anchors for position, rotation and scale. Value 0-1. - - -
    - - - - - - - - -
    - - -
    - - - scaleAnchor - -
    -
    - A value that corresponds to any CAAT.Foundation.Actor.ANCHOR_* value. - - -
    - - - - - - - - -
    - - -
    - - - scaleTX - -
    -
    - Scale Anchor X. Value 0-1 - - -
    - - - - - - - - -
    - - -
    - - - scaleTY - -
    -
    - Scale Anchor Y. Value 0-1 - - -
    - - - - - - - - -
    - - -
    - - - scaleX - -
    -
    - ScaleX value. - - -
    - - - - - - - - -
    - - -
    - - - scaleY - -
    -
    - ScaleY value. - - -
    - - - - - - - - -
    - - -
    - - - size_active - -
    -
    - debug info. - - -
    - - - - - - - - -
    - - -
    - - - size_total - -
    -
    - debug info. - - -
    - - - - - - - - -
    - - -
    - - - start_time - -
    -
    - Marks since when this actor, relative to scene time, is going to be animated/drawn. - - -
    - - - - - - - - -
    - - -
    - - - strokeStyle - -
    -
    - any canvas rendering valid stroke style. - - -
    - - - - - - - - -
    - - -
    - - - tAnchorX - -
    -
    - Translation x anchor. 0..1 - - -
    - - - - - - - - -
    - - -
    - - - tAnchorY - -
    -
    - Translation y anchor. 0..1 - - -
    - - - - - - - - -
    - - -
    - - - time - -
    -
    - This actor´s scene time. - - -
    - - - - - - - - -
    - - -
    - - - viewVertices - -
    -
    - These 4 CAAT.Math.Point objects are the vertices of this actor´s non axis aligned bounding -box. If the actor is not rotated, viewVertices and AABB define the same bounding box. - - -
    - - - - - - - - -
    - - -
    - - - visible - -
    -
    - Make this actor visible or not. -An invisible actor avoids making any calculation, applying any behavior on it. - - -
    - - - - - - - - -
    - - -
    <private> - - - wdirty - -
    -
    - Global matrix dirtyness flag. - - -
    - - - - - - - - -
    - - -
    - - - width - -
    -
    - Actor's width. In parent's local coord. system. - - -
    - - - - - - - - -
    - - -
    - - - worldModelViewMatrix - -
    -
    - This actor´s world affine transformation matrix. - - -
    - - - - - - - - -
    - - -
    - - - worldModelViewMatrixI - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - x - -
    -
    - x position on parent. In parent's local coord. system. - - -
    - - - - - - - - -
    - - -
    - - - y - -
    -
    - y position on parent. In parent's local coord. system. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - __paintActor(director, time) - -
    -
    - for js2native - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - {*} - __scale1To(axis, scale, duration, delay, anchorX, anchorY, interpolator) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - axis - -
    -
    {CAAT.Scale1Behavior.AXIS_X|CAAT.Scale1Behavior.AXIS_Y} scale application axis
    - -
    - scale - -
    -
    {number} new Y scale
    - -
    - duration - -
    -
    {number} time to rotate
    - -
    - delay - -
    -
    {=number} millis to start rotation
    - -
    - anchorX - -
    -
    {=number} rotation anchor x
    - -
    - anchorY - -
    -
    {=number} rotation anchor y
    - -
    - interpolator - -
    -
    {=CAAT.Bahavior.Interpolator}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    <private> - - - __validateLayout() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - addAnimation(name, array, time, callback) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - array - -
    -
    - -
    - time - -
    -
    - -
    - callback - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addBehavior(behavior) - -
    -
    - Add a Behavior to the Actor. -An Actor accepts an undefined number of Behaviors. - - -
    - - - - -
    -
    Parameters:
    - -
    - behavior - -
    -
    {CAAT.Behavior.BaseBehavior}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - addListener(actorListener) - -
    -
    - Adds an Actor's life cycle listener. -The developer must ensure the actorListener is not already a listener, otherwise -it will notified more than once. - - -
    - - - - -
    -
    Parameters:
    - -
    - actorListener - -
    -
    {object} an object with at least a method of the form: -actorLyfeCycleEvent( actor, string_event_type, long_time )
    - -
    - - - - - - - - -
    - - -
    - - - animate(director, time) - -
    -
    - Private -This method is called by the Director instance. -It applies the list of behaviors the Actor has registered. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    - -
    - time - -
    -
    an integer indicating the Scene time when the bounding box is to be drawn.
    - -
    - - - - - - - - -
    - - -
    - - - cacheAsBitmap(time, stragegy) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {Number=}
    - -
    - stragegy - -
    -
    {CAAT.Foundation.Actor.CACHE_SIMPLE | CAAT.Foundation.Actor.CACHE_DEEP}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - centerAt(x, y) - -
    -
    - Center this actor at position (x,y). - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number} x position
    - -
    - y - -
    -
    {number} y position
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - centerOn(x, y) - -
    -
    - Center this actor at position (x,y). - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number} x position
    - -
    - y - -
    -
    {number} y position
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - clean() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - contains(x, y) - -
    -
    - Checks whether a coordinate is inside the Actor's bounding box. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number} a float
    - -
    - y - -
    -
    {number} a float
    - -
    - - - - - -
    -
    Returns:
    - -
    boolean indicating whether it is inside.
    - -
    - - - - -
    - - -
    - - {*} - create() - -
    -
    - - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    <private> - - - destroy(time) - -
    -
    - This method will be called internally by CAAT when an Actor is expired, and at the -same time, is flagged as discardable. -It notifies the Actor life cycle listeners about the destruction event. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    an integer indicating the time at wich the Actor has been destroyed.
    - -
    - - - - - - - - -
    - - -
    - - - disableDrag() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - drawScreenBoundingBox(director, time) - -
    -
    - Draw a bounding box with on-screen coordinates regardless of the transformations -applied to the Actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Foundations.Director} object instance that contains the Scene the Actor is in.
    - -
    - time - -
    -
    {number} integer indicating the Scene time when the bounding box is to be drawn.
    - -
    - - - - - - - - -
    - - -
    - - - emptyBehaviorList() - -
    -
    - Removes all behaviors from an Actor. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - enableDrag() - -
    -
    - Enables a default dragging routine for the Actor. -This default dragging routine allows to: -
  385. scale the Actor by pressing shift+drag -
  386. rotate the Actor by pressing control+drag -
  387. scale non uniformly by pressing alt+shift+drag - - -
  388. - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - enableEvents(enable) - -
    -
    - Enable or disable the event bubbling for this Actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - enable - -
    -
    {boolean} a boolean indicating whether the event bubbling is enabled.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - endAnimate(director, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    - -
    - time - -
    -
    an integer indicating the Scene time when the bounding box is to be drawn.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - findActorAtPosition(point) - -
    -
    - Private -This method does the needed point transformations across an Actor hierarchy to devise -whether the parameter point coordinate lies inside the Actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Math.Point}
    - -
    - - - - - -
    -
    Returns:
    - -
    null if the point is not inside the Actor. The Actor otherwise.
    - -
    - - - - -
    - - -
    - - - findActorById(id) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - fireEvent(sEventType, time) - -
    -
    - Notifies the registered Actor's life cycle listener about some event. - - -
    - - - - -
    -
    Parameters:
    - -
    - sEventType - -
    -
    an string indicating the type of event being notified.
    - -
    - time - -
    -
    an integer indicating the time related to Scene's timeline when the event -is being notified.
    - -
    - - - - - - - - -
    - - -
    - - - gestureChange(rotation, scaleX, scaleY) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - rotation - -
    -
    - -
    - scaleX - -
    -
    - -
    - scaleY - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - gestureEnd(rotation, scaleX, scaleY) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - rotation - -
    -
    - -
    - scaleX - -
    -
    - -
    - scaleY - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - gestureStart(rotation, scaleX, scaleY) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - rotation - -
    -
    - -
    - scaleX - -
    -
    - -
    - scaleY - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getAnchor(anchor) - -
    -
    - Private. -Gets a given anchor position referred to the Actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - anchor - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    an object of the form { x: float, y: float }
    - -
    - - - - -
    - - -
    - - - getAnchorPercent(anchor) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - anchor - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getBehavior(id) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getId() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getMinimumSize() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getPreferredSize() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {CAAT.GLTexturePage} - getTextureGLPage() - -
    -
    - If GL is enables, get this background image's texture page, otherwise it will fail. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.GLTexturePage}
    - -
    - - - - -
    - - -
    - - - glNeedsFlush(director) - -
    -
    - Test for compulsory gl flushing: - 1.- opacity has changed. - 2.- texture page has changed. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - glSetShader(director) - -
    -
    - Change texture shader program parameters. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - initialize(overrides) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - overrides - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - invalidate() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - invalidateLayout() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isCached() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isGestureEnabled() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - isInAnimationFrame(time) - -
    -
    - This method is called by the Director to know whether the actor is on Scene time. -In case it was necessary, this method will notify any life cycle behaviors about -an Actor expiration. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} time indicating the Scene time.
    - -
    - - - - - - - - -
    - - -
    - - - isVisible() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - modelToModel(point, otherActor) - -
    -
    - Transform a local coordinate point on this Actor's coordinate system into -another point in otherActor's coordinate system. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Math.Point}
    - -
    - otherActor - -
    -
    {CAAT.Math.Actor}
    - -
    - - - - - - - - -
    - - -
    <private> - - - modelToView(point) - -
    -
    - Transform a point or array of points in model space to view space. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Math.Point|Array} an object of the form {x : float, y: float}
    - -
    - - - - - -
    -
    Returns:
    - -
    the source transformed elements.
    - -
    - - - - -
    - - -
    - - - mouseClick(mouseEvent) - -
    -
    - Default mouseClick handler. -Mouse click events are received after a call to mouseUp method if no dragging was in progress. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.Event.MouseEvent}
    - -
    - - - - - - - - -
    - - -
    - - - mouseDblClick(mouseEvent) - -
    -
    - Default double click handler - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.Event.MouseEvent}
    - -
    - - - - - - - - -
    - - -
    - - - mouseDown(mouseEvent) - -
    -
    - default mouse press in Actor handler. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.Event.MouseEvent}
    - -
    - - - - - - - - -
    - - -
    - - - mouseDrag(mouseEvent) - -
    -
    - default Actor mouse drag handler. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.Event.MouseEvent}
    - -
    - - - - - - - - -
    - - -
    - - - mouseEnter(mouseEvent) - -
    -
    - Default mouse enter on Actor handler. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.Event.MouseEvent}
    - -
    - - - - - - - - -
    - - -
    - - - mouseExit(mouseEvent) - -
    -
    - Default mouse exit on Actor handler. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.Event.MouseEvent}
    - -
    - - - - - - - - -
    - - -
    - - - mouseMove(mouseEvent) - -
    -
    - Default mouse move inside Actor handler. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.Event.MouseEvent}
    - -
    - - - - - - - - -
    - - -
    - - - mouseOut(mouseEvent) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseOver(mouseEvent) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseUp(mouseEvent) - -
    -
    - default mouse release in Actor handler. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.Event.MouseEvent}
    - -
    - - - - - - - - -
    - - -
    - - - moveTo(x, y, duration, delay, interpolator, callback) - -
    -
    - Move this actor to a position. -It creates and adds a new PathBehavior. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number} new x position
    - -
    - y - -
    -
    {number} new y position
    - -
    - duration - -
    -
    {number} time to take to get to new position
    - -
    - delay - -
    -
    {=number} time to wait before start moving
    - -
    - interpolator - -
    -
    {=CAAT.Behavior.Interpolator} a CAAT.Behavior.Interpolator instance
    - -
    - callback - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - paint(director, time) - -
    -
    - This method should me overriden by every custom Actor. -It will be the drawing routine called by the Director to show every Actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Foundation.Director} instance that contains the Scene the Actor is in.
    - -
    - time - -
    -
    {number} indicating the Scene time in which the drawing is performed.
    - -
    - - - - - - - - -
    - - -
    - - - paintActor(director, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    - -
    - time - -
    -
    an integer indicating the Scene time when the bounding box is to be drawn.
    - -
    - - - - - -
    -
    Returns:
    - -
    boolean indicating whether the Actor isInFrameTime
    - -
    - - - - -
    - - -
    - - - paintActorGL(director, time) - -
    -
    - Set coordinates and uv values for this actor. -This function uses Director's coords and indexCoords values. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - playAnimation(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - removeBehaviorById(id) - -
    -
    - Remove a Behavior with id param as behavior identifier from this actor. -This function will remove ALL behavior instances with the given id. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {number} an integer. -return this;
    - -
    - - - - - - - - -
    - - -
    - - - removeBehaviour(behavior) - -
    -
    - Remove a Behavior from the Actor. -If the Behavior is not present at the actor behavior collection nothing happends. - - -
    - - - - -
    -
    Parameters:
    - -
    - behavior - -
    -
    {CAAT.Behavior.BaseBehavior}
    - -
    - - - - - - - - -
    - - -
    - - - removeListener(actorListener) - -
    -
    - Removes an Actor's life cycle listener. -It will only remove the first occurrence of the given actorListener. - - -
    - - - - -
    -
    Parameters:
    - -
    - actorListener - -
    -
    {object} an Actor's life cycle listener.
    - -
    - - - - - - - - -
    - - -
    - - - resetAnimationTime() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - resetAsButton() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - resetTransform() - -
    -
    - Remove all transformation values for the Actor. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {*} - rotateTo(angle, duration, delay, anchorX, anchorY, interpolator) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - angle - -
    -
    {number} new rotation angle
    - -
    - duration - -
    -
    {number} time to rotate
    - -
    - delay - -
    -
    {number=} millis to start rotation
    - -
    - anchorX - -
    -
    {number=} rotation anchor x
    - -
    - anchorY - -
    -
    {number=} rotation anchor y
    - -
    - interpolator - -
    -
    {CAAT.Behavior.Interpolator=}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - {*} - scaleTo(scaleX, scaleY, duration, delay, anchorX, anchorY, interpolator) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - scaleX - -
    -
    {number} new X scale
    - -
    - scaleY - -
    -
    {number} new Y scale
    - -
    - duration - -
    -
    {number} time to rotate
    - -
    - delay - -
    -
    {=number} millis to start rotation
    - -
    - anchorX - -
    -
    {=number} rotation anchor x
    - -
    - anchorY - -
    -
    {=number} rotation anchor y
    - -
    - interpolator - -
    -
    {=CAAT.Behavior.Interpolator}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - {*} - scaleXTo(scaleX, duration, delay, anchorX, anchorY, interpolator) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - scaleX - -
    -
    {number} new X scale
    - -
    - duration - -
    -
    {number} time to rotate
    - -
    - delay - -
    -
    {=number} millis to start rotation
    - -
    - anchorX - -
    -
    {=number} rotation anchor x
    - -
    - anchorY - -
    -
    {=number} rotation anchor y
    - -
    - interpolator - -
    -
    {=CAAT.Behavior.Interpolator}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - {*} - scaleYTo(scaleY, duration, delay, anchorX, anchorY, interpolator) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - scaleY - -
    -
    {number} new Y scale
    - -
    - duration - -
    -
    {number} time to rotate
    - -
    - delay - -
    -
    {=number} millis to start rotation
    - -
    - anchorX - -
    -
    {=number} rotation anchor x
    - -
    - anchorY - -
    -
    {=number} rotation anchor y
    - -
    - interpolator - -
    -
    {=CAAT.Behavior.Interpolator}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - setAlpha(alpha) - -
    -
    - Stablishes the Alpha transparency for the Actor. -If it globalAlpha enabled, this alpha will the maximum alpha for every contained actors. -The alpha must be between 0 and 1. - - -
    - - - - -
    -
    Parameters:
    - -
    - alpha - -
    -
    a float indicating the alpha value.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setAnimationEndCallback(f) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - f - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setAnimationImageIndex(ii) - -
    -
    - Set this actor's background SpriteImage its animation sequence. -In its simplet's form a SpriteImage treats a given image as an array of rows by columns -subimages. If you define d Sprite Image of 2x2, you'll be able to draw any of the 4 subimages. -This method defines the animation sequence so that it could be set [0,2,1,3,2,1] as the -animation sequence - - -
    - - - - -
    -
    Parameters:
    - -
    - ii - -
    -
    {Array} an array of integers.
    - -
    - - - - - - - - -
    - - -
    - - - setAsButton(buttonImage, iNormal, iOver, iPress, iDisabled, fn) - -
    -
    - Set this actor behavior as if it were a Button. The actor size will be set as SpriteImage's -single size. - - -
    - - - - -
    -
    Parameters:
    - -
    - buttonImage - -
    -
    {CAAT.Foundation.SpriteImage} sprite image with button's state images.
    - -
    - iNormal - -
    -
    {number} button's normal state image index
    - -
    - iOver - -
    -
    {number} button's mouse over state image index
    - -
    - iPress - -
    -
    {number} button's pressed state image index
    - -
    - iDisabled - -
    -
    {number} button's disabled state image index
    - -
    - fn - -
    -
    {function(button{CAAT.Foundation.Actor})} callback function
    - -
    - - - - - - - - -
    - - -
    - - - setBackgroundImage(image, adjust_size_to_image) - -
    -
    - Set this actor's background image. -The need of a background image is to kept compatibility with the new CSSDirector class. -The image parameter can be either an Image/Canvas or a CAAT.Foundation.SpriteImage instance. If an image -is supplied, it will be wrapped into a CAAT.Foundation.SriteImage instance of 1 row by 1 column. -If the actor has set an image in the background, the paint method will draw the image, otherwise -and if set, will fill its background with a solid color. -If adjust_size_to_image is true, the host actor will be redimensioned to the size of one -single image from the SpriteImage (either supplied or generated because of passing an Image or -Canvas to the function). That means the size will be set to [width:SpriteImage.singleWidth, -height:singleHeight]. - -WARN: if using a CSS renderer, the image supplied MUST be a HTMLImageElement instance. - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    {Image|HTMLCanvasElement|CAAT.Foundation.SpriteImage}
    - -
    - adjust_size_to_image - -
    -
    {boolean} whether to set this actor's size based on image parameter.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - -
    -
    See:
    - -
    CAAT.Foundation.SpriteImage
    - -
    - - -
    - - -
    - - - setBackgroundImageOffset(ox, oy) - -
    -
    - Set this actor's background SpriteImage offset displacement. -The values can be either positive or negative meaning the texture space of this background -image does not start at (0,0) but at the desired position. - - -
    - - - - -
    -
    Parameters:
    - -
    - ox - -
    -
    {number} horizontal offset
    - -
    - oy - -
    -
    {number} vertical offset
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - -
    -
    See:
    - -
    CAAT.Foundation.SpriteImage
    - -
    - - -
    - - -
    - - - setBounds(x{number}, y{number}, w{number}, h{number}) - -
    -
    - Set location and dimension of an Actor at once. - - -
    - - - - -
    -
    Parameters:
    - -
    - x{number} - -
    -
    a float indicating Actor's x position.
    - -
    - y{number} - -
    -
    a float indicating Actor's y position
    - -
    - w{number} - -
    -
    a float indicating Actor's width
    - -
    - h{number} - -
    -
    a float indicating Actor's height
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setButtonImageIndex(_normal, _over, _press, _disabled) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - _normal - -
    -
    - -
    - _over - -
    -
    - -
    - _press - -
    -
    - -
    - _disabled - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setCachedActor(cached) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - cached - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setChangeFPS(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setClip(enable, clipPath) - -
    -
    - Set this Actor's clipping area. - - -
    - - - - -
    -
    Parameters:
    - -
    - enable - -
    -
    {boolean} enable clip area.
    - -
    - clipPath - -
    -
    {CAAT.Path.Path=} An optional path to apply clip with. If enabled and clipPath is not set, - a rectangle will be used.
    - -
    - - - - - - - - -
    - - -
    - - - setDiscardable(discardable) - -
    -
    - Set discardable property. If an actor is discardable, upon expiration will be removed from -scene graph and hence deleted. - - -
    - - - - -
    -
    Parameters:
    - -
    - discardable - -
    -
    {boolean} a boolean indicating whether the Actor is discardable.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setExpired(time) - -
    -
    - Sets this Actor as Expired. -If this is a Container, all the contained Actors won't be nor drawn nor will receive -any event. That is, expiring an Actor means totally taking it out the Scene's timeline. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} an integer indicating the time the Actor was expired at.
    - -
    - - - - - -
    -
    Returns:
    - -
    this.
    - -
    - - - - -
    - - -
    - - - setFillStyle(style) - -
    -
    - Caches a fillStyle in the Actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - style - -
    -
    a valid Canvas rendering context fillStyle.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setFrameTime(startTime, duration) - -
    -
    - Sets the time life cycle for an Actor. -These values are related to Scene time. - - -
    - - - - -
    -
    Parameters:
    - -
    - startTime - -
    -
    an integer indicating the time until which the Actor won't be visible on the Scene.
    - -
    - duration - -
    -
    an integer indicating how much the Actor will last once visible.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setGestureEnabled(enable) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - enable - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setGLCoords(glCoords, glCoordsIndex) - -
    -
    - TODO: set GLcoords for different image transformations. - - -
    - - - - -
    -
    Parameters:
    - -
    - glCoords - -
    -
    - -
    - glCoordsIndex - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setGlobalAlpha(global) - -
    -
    - Set alpha composition scope. global will mean this alpha value will be its children maximum. -If set to false, only this actor will have this alpha value. - - -
    - - - - -
    -
    Parameters:
    - -
    - global - -
    -
    {boolean} whether the alpha value should be propagated to children.
    - -
    - - - - - - - - -
    - - -
    - - - setGlobalAnchor(ax, ay) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ax - -
    -
    - -
    - ay - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setId(id) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setImageTransformation(it) - -
    -
    - Set this background image transformation. -If GL is enabled, this parameter has no effect. - - -
    - - - - -
    -
    Parameters:
    - -
    - it - -
    -
    any value from CAAT.Foundation.SpriteImage.TR_*
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setLocation(x{number}, y{number}) - -
    -
    - This method sets the position of an Actor inside its parent. - - -
    - - - - -
    -
    Parameters:
    - -
    - x{number} - -
    -
    a float indicating Actor's x position
    - -
    - y{number} - -
    -
    a float indicating Actor's y position
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {*} - setMinimumSize(pw, ph) - -
    -
    - Set this actors minimum layout size. - - -
    - - - - -
    -
    Parameters:
    - -
    - pw - -
    -
    {number}
    - -
    - ph - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - setModelViewMatrix() - -
    -
    - Set this model view matrix if the actor is Dirty. - - mm[2]+= this.x; - mm[5]+= this.y; - if ( this.rotationAngle ) { - this.modelViewMatrix.multiply( m.setTranslate( this.rotationX, this.rotationY) ); - this.modelViewMatrix.multiply( m.setRotation( this.rotationAngle ) ); - this.modelViewMatrix.multiply( m.setTranslate( -this.rotationX, -this.rotationY) ); c= Math.cos( this.rotationAngle ); - } - if ( this.scaleX!=1 || this.scaleY!=1 && (this.scaleTX || this.scaleTY )) { - this.modelViewMatrix.multiply( m.setTranslate( this.scaleTX , this.scaleTY ) ); - this.modelViewMatrix.multiply( m.setScale( this.scaleX, this.scaleY ) ); - this.modelViewMatrix.multiply( m.setTranslate( -this.scaleTX , -this.scaleTY ) ); - } - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setOutOfFrameTime() - -
    -
    - Puts an Actor out of time line, that is, won't be transformed nor rendered. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setPaint(paint) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - paint - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setParent(parent) - -
    -
    - Set this actor's parent. - - -
    - - - - -
    -
    Parameters:
    - -
    - parent - -
    -
    {CAAT.Foundation.ActorContainer}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setPosition(x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPositionAnchor(pax, pay) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pax - -
    -
    - -
    - pay - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPositionAnchored(x, y, pax, pay) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - pax - -
    -
    - -
    - pay - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {*} - setPreferredSize(pw, ph) - -
    -
    - Set this actors preferred layout size. - - -
    - - - - -
    -
    Parameters:
    - -
    - pw - -
    -
    {number}
    - -
    - ph - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - setPreventLayout(b) - -
    -
    - Make this actor not be laid out. - - -
    - - - - -
    -
    Parameters:
    - -
    - b - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setRotation(angle) - -
    -
    - A helper method for setRotationAnchored. This methods stablishes the center -of rotation to be the center of the Actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - angle - -
    -
    a float indicating the angle in radians to rotate the Actor.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setRotationAnchor(rax, ray) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - rax - -
    -
    - -
    - ray - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setRotationAnchored(angle, rx, ry) - -
    -
    - This method sets Actor rotation around a given position. - - -
    - - - - -
    -
    Parameters:
    - -
    - angle - -
    -
    {number} indicating the angle in radians to rotate the Actor.
    - -
    - rx - -
    -
    {number} value in the range 0..1
    - -
    - ry - -
    -
    {number} value in the range 0..1
    - -
    - - - - - -
    -
    Returns:
    - -
    this;
    - -
    - - - - -
    - - -
    - - - setScale(sx, sy) - -
    -
    - A helper method to setScaleAnchored with an anchor of ANCHOR_CENTER - - -
    - - - - -
    -
    Parameters:
    - -
    - sx - -
    -
    a float indicating a width size multiplier.
    - -
    - sy - -
    -
    a float indicating a height size multiplier.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - -
    -
    See:
    - -
    setScaleAnchored
    - -
    - - -
    - - -
    - - - setScaleAnchor(sax, say) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - sax - -
    -
    - -
    - say - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setScaleAnchored(sx, sy, anchorx, anchory) - -
    -
    - Modify the dimensions on an Actor. -The dimension will not affect the local coordinates system in opposition -to setSize or setBounds. - - -
    - - - - -
    -
    Parameters:
    - -
    - sx - -
    -
    {number} width scale.
    - -
    - sy - -
    -
    {number} height scale.
    - -
    - anchorx - -
    -
    {number} x anchor to perform the Scale operation.
    - -
    - anchory - -
    -
    {number} y anchor to perform the Scale operation.
    - -
    - - - - - -
    -
    Returns:
    - -
    this;
    - -
    - - - - -
    - - -
    <private> - - - setScreenBounds() - -
    -
    - Calculates the 2D bounding box in canvas coordinates of the Actor. -This bounding box takes into account the transformations applied hierarchically for -each Scene Actor. - - -
    - - - - - - - - - - - -
    - - -
    - - - setSize(w, h) - -
    -
    - Sets an Actor's dimension - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    a float indicating Actor's width.
    - -
    - h - -
    -
    a float indicating Actor's height.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setSpriteIndex(index) - -
    -
    - Set the actor's SpriteImage index from animation sheet. - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - -
    -
    See:
    - -
    CAAT.Foundation.SpriteImage
    - -
    - - -
    - - -
    - - - setStrokeStyle(style) - -
    -
    - Caches a stroke style in the Actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - style - -
    -
    a valid canvas rendering context stroke style.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setUV(uvBuffer, uvIndex) - -
    -
    - Set UV for this actor's quad. - - -
    - - - - -
    -
    Parameters:
    - -
    - uvBuffer - -
    -
    {Float32Array}
    - -
    - uvIndex - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setVisible(visible) - -
    -
    - Set this actor invisible. -The actor is animated but not visible. -A container won't show any of its children if set visible to false. - - -
    - - - - -
    -
    Parameters:
    - -
    - visible - -
    -
    {boolean} set this actor visible or not.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - stopCacheAsBitmap() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - touchEnd(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - touchMove(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - touchStart(e) - -
    -
    - Touch Start only received when CAAT.TOUCH_BEHAVIOR= CAAT.TOUCH_AS_MULTITOUCH - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - viewToModel(point) - -
    -
    - Transform a point from model to view space. -

    -WARNING: every call to this method calculates -actor's world model view matrix. - - -

    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Math.Point} a point in screen space to be transformed to model space.
    - -
    - - - - - -
    -
    Returns:
    - -
    the source point object
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:42 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.AddHint.html b/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.AddHint.html deleted file mode 100644 index cfc8229d..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.AddHint.html +++ /dev/null @@ -1,653 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.ActorContainer.ADDHINT - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Foundation.ActorContainer.ADDHINT -

    - - -

    - - - - - - -
    Defined in: ActorContainer.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   -
    - CAAT.Foundation.ActorContainer.ADDHINT.CONFORM -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <static>   -
    CAAT.Foundation.ActorContainer.ADDHINT.extendsWith() -
    -
    -
    - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Foundation.ActorContainer.ADDHINT -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.Foundation.ActorContainer.ADDHINT.CONFORM - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <static> - - - CAAT.Foundation.ActorContainer.ADDHINT.extendsWith() - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:42 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.html b/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.html deleted file mode 100644 index d8b07208..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.html +++ /dev/null @@ -1,2324 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.ActorContainer - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.ActorContainer -

    - - -

    - -
    Extends - CAAT.Foundation.Actor.
    - - - - - -
    Defined in: ActorContainer.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   - -
    This container active children.
    -
    <private>   -
    - addHint -
    -
    Container redimension policy when adding children: - 0 : no resize.
    -
    <private>   - -
    If container redimension on children add, use this rectangle as bounding box store.
    -
      - -
    This container children.
    -
      - -
    -
      - -
    Define a layout manager for this container that enforces children position and/or sizes.
    -
    <private>   - -
    This container pending to be added children.
    -
    <private>   -
    - runion -
    -
    Spare rectangle to avoid new allocations when adding children to this container.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(hint) -
    -
    Constructor delegate
    -
    <private>   -
    __paintActor(director, time) -
    -
    -
    <private>   - -
    -
    <private>   - -
    -
      -
    addChild(child, constraint) -
    -
    Adds an Actor to this ActorContainer.
    -
      -
    addChildAt(child, index) -
    -
    Adds an Actor to this ActorContainer.
    -
      -
    addChildDelayed(child, constraint) -
    -
    Add a child element and make it active in the next frame.
    -
      -
    addChildImmediately(child, constraint) -
    -
    Adds an Actor to this Container.
    -
      -
    animate(director, time) -
    -
    Private.
    -
      -
    destroy() -
    -
    Destroys this ActorContainer.
    -
      -
    drawScreenBoundingBox(director, time) -
    -
    Draws this ActorContainer and all of its children screen bounding box.
    -
      - -
    Removes all children from this ActorContainer.
    -
      -
    endAnimate(director, time) -
    -
    Removes Actors from this ActorContainer which are expired and flagged as Discardable.
    -
    <private>   - -
    -
      - -
    Find the first actor with the supplied ID.
    -
      -
    findChild(child) -
    -
    Private -Gets a contained Actor z-index on this ActorContainer.
    -
      -
    getChildAt(iPosition) -
    -
    Returns the Actor at the iPosition(th) position.
    -
      - -
    -
      - -
    -
      - -
    Get number of Actors into this container.
    -
      - -
    -
      -
    paintActor(director, time) -
    -
    Private -Paints this container and every contained children.
    -
      -
    paintActorGL(director, time) -
    -
    -
      - -
    Recalc this container size by computing the union of every children bounding box.
    -
      -
    removeChild(child) -
    -
    Removed an Actor form this ActorContainer.
    -
      - -
    -
      - -
    -
      - -
    -
      -
    setBounds(x, y, w, h) -
    -
    -
      -
    setLayout(layout) -
    -
    -
      -
    setZOrder(actor, index) -
    -
    Changes an actor's ZOrder.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, contains, create, disableDrag, emptyBehaviorList, enableDrag, enableEvents, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paint, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.ActorContainer() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - activeChildren - -
    -
    - This container active children. - - -
    - - - - - - - - -
    - - -
    <private> - - - addHint - -
    -
    - Container redimension policy when adding children: - 0 : no resize. - CAAT.Foundation.ActorContainer.AddHint.CONFORM : resize container to a bounding box. - - -
    - - - - - - - - -
    - - -
    <private> - - - boundingBox - -
    -
    - If container redimension on children add, use this rectangle as bounding box store. - - -
    - - - - - - - - -
    - - -
    - - - childrenList - -
    -
    - This container children. - - -
    - - - - - - - - -
    - - -
    - - - layoutInvalidated - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - layoutManager - -
    -
    - Define a layout manager for this container that enforces children position and/or sizes. - - -
    - - - - - - -
    -
    See:
    - -
    demo26 for an example of layouts.
    - -
    - - - -
    - - -
    <private> - - - pendingChildrenList - -
    -
    - This container pending to be added children. - - -
    - - - - - - - - -
    - - -
    <private> - - - runion - -
    -
    - Spare rectangle to avoid new allocations when adding children to this container. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - {*} - __init(hint) - -
    -
    - Constructor delegate - - -
    - - - - -
    -
    Parameters:
    - -
    - hint - -
    -
    {CAAT.Foundation.ActorContainer.AddHint}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    <private> - - - __paintActor(director, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __validateLayout() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - __validateTree() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - addChild(child, constraint) - -
    -
    - Adds an Actor to this ActorContainer. -The Actor will be added to the container AFTER frame animation, and not on method call time. -Except the Director and in orther to avoid visual artifacts, the developer SHOULD NOT call this -method directly. - -If the container has addingHint as CAAT.Foundation.ActorContainer.AddHint.CONFORM, new continer size will be -calculated by summing up the union of every client actor bounding box. -This method will not take into acount actor's affine transformations, so the bounding box will be -AABB. - - -
    - - - - -
    -
    Parameters:
    - -
    - child - -
    -
    {CAAT.Foundation.Actor} object instance.
    - -
    - constraint - -
    -
    {object}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - addChildAt(child, index) - -
    -
    - Adds an Actor to this ActorContainer. - - -
    - - - - -
    -
    Parameters:
    - -
    - child - -
    -
    {CAAT.Foundation.Actor}.
    - -
    - index - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - addChildDelayed(child, constraint) - -
    -
    - Add a child element and make it active in the next frame. - - -
    - - - - -
    -
    Parameters:
    - -
    - child - -
    -
    {CAAT.Foundation.Actor}
    - -
    - constraint - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addChildImmediately(child, constraint) - -
    -
    - Adds an Actor to this Container. -The Actor will be added ON METHOD CALL, despite the rendering pipeline stage being executed at -the time of method call. - -This method is only used by director's transitionScene. - - -
    - - - - -
    -
    Parameters:
    - -
    - child - -
    -
    {CAAT.Foundation.Actor}
    - -
    - constraint - -
    -
    {object}
    - -
    - - - - - -
    -
    Returns:
    - -
    this.
    - -
    - - - - -
    - - -
    - - {boolean} - animate(director, time) - -
    -
    - Private. -Performs the animate method for this ActorContainer and every contained Actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    - -
    - time - -
    -
    an integer indicating the Scene time when the bounding box is to be drawn.
    - -
    - - - - - -
    -
    Returns:
    - -
    {boolean} is this actor in active children list ??
    - -
    - - - - -
    - - -
    - - - destroy() - -
    -
    - Destroys this ActorContainer. -The process falls down recursively for each contained Actor into this ActorContainer. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - drawScreenBoundingBox(director, time) - -
    -
    - Draws this ActorContainer and all of its children screen bounding box. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    - -
    - time - -
    -
    an integer indicating the Scene time when the bounding box is to be drawn.
    - -
    - - - - - - - - -
    - - -
    - - - emptyChildren() - -
    -
    - Removes all children from this ActorContainer. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - endAnimate(director, time) - -
    -
    - Removes Actors from this ActorContainer which are expired and flagged as Discardable. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    - -
    - time - -
    -
    an integer indicating the Scene time when the bounding box is to be drawn.
    - -
    - - - - - - - - -
    - - -
    <private> - - - findActorAtPosition(point) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    an object of the form { x: float, y: float }
    - -
    - - - - - -
    -
    Returns:
    - -
    the Actor contained inside this ActorContainer if found, or the ActorContainer itself.
    - -
    - - - - -
    - - -
    - - - findActorById(id) - -
    -
    - Find the first actor with the supplied ID. -This method is not recommended to be used since executes a linear search. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {number} - findChild(child) - -
    -
    - Private -Gets a contained Actor z-index on this ActorContainer. - - -
    - - - - -
    -
    Parameters:
    - -
    - child - -
    -
    a CAAT.Foundation.Actor object instance.
    - -
    - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - getChildAt(iPosition) - -
    -
    - Returns the Actor at the iPosition(th) position. - - -
    - - - - -
    -
    Parameters:
    - -
    - iPosition - -
    -
    an integer indicating the position array.
    - -
    - - - - - -
    -
    Returns:
    - -
    the CAAT.Foundation.Actor object at position.
    - -
    - - - - -
    - - -
    - - - getLayout() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getNumActiveChildren() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getNumChildren() - -
    -
    - Get number of Actors into this container. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    integer indicating the number of children.
    - -
    - - - - -
    - - -
    - - - invalidateLayout() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - paintActor(director, time) - -
    -
    - Private -Paints this container and every contained children. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    - -
    - time - -
    -
    an integer indicating the Scene time when the bounding box is to be drawn.
    - -
    - - - - - - - - -
    - - -
    - - - paintActorGL(director, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - recalcSize() - -
    -
    - Recalc this container size by computing the union of every children bounding box. - - -
    - - - - - - - - - - - -
    - - -
    - - - removeChild(child) - -
    -
    - Removed an Actor form this ActorContainer. -If the Actor is not contained into this Container, nothing happends. - - -
    - - - - -
    -
    Parameters:
    - -
    - child - -
    -
    a CAAT.Foundation.Actor object instance.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - removeChildAt(pos) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pos - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - removeFirstChild() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - removeLastChild() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - setBounds(x, y, w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setLayout(layout) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - layout - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setZOrder(actor, index) - -
    -
    - Changes an actor's ZOrder. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    the actor to change ZOrder for
    - -
    - index - -
    -
    an integer indicating the new ZOrder. a value greater than children list size means to be the -last ZOrder Actor.
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:42 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DBodyActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DBodyActor.html deleted file mode 100644 index 64784335..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DBodyActor.html +++ /dev/null @@ -1,1720 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.Box2D.B2DBodyActor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.Box2D.B2DBodyActor -

    - - -

    - -
    Extends - CAAT.Foundation.Actor.
    - - - - - -
    Defined in: B2DBodyActor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - bodyData -
    -
    BodyData object linked to the box2D body.
    -
      -
    - bodyDef -
    -
    Box2D body definition.
    -
      -
    - bodyType -
    -
    Dynamic bodies by default
    -
      -
    - density -
    -
    Body dentisy
    -
      - -
    Box2D fixture definition.
    -
      -
    - friction -
    -
    Body friction.
    -
      -
    - recycle -
    -
    Recycle this actor when the body is not needed anymore ??
    -
      - -
    Body restitution.
    -
      -
    - world -
    -
    Box2D world reference.
    -
      -
    - worldBody -
    -
    Box2D body
    -
      - -
    Box2d fixture
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    animate(director, time) -
    -
    Method override to get position and rotation angle from box2d body.
    -
      -
    check(obj, prop, def) -
    -
    Helper method to check whether this js object contains a given property and if it doesn't exist -create and set it to def value.
    -
      -
    createBody(world, bodyData) -
    -
    Create an actor as a box2D body binding, create it on the given world and with -the initialization data set in bodyData object.
    -
      -
    destroy() -
    -
    -
      - -
    Get this body's center on screen regardless of its shape.
    -
      - -
    Get a distance joint's position on pixels.
    -
      -
    setAwake(bool) -
    -
    -
      -
    setBodyType(bodyType) -
    -
    Set this body's type:
    -
      - -
    Set this body's -density.
    -
      - -
    Set this body's friction.
    -
      -
    setLocation(x, y) -
    -
    -
      - -
    -
      -
    setPositionAnchored(x, y, ax, ay) -
    -
    -
      - -
    set this actor to recycle its body, that is, do not destroy it.
    -
      - -
    Set this body's restitution coeficient.
    -
      - -
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.Actor:
    __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paint, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.Box2D.B2DBodyActor() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - bodyData - -
    -
    - BodyData object linked to the box2D body. - - -
    - - - - - - - - -
    - - -
    - - - bodyDef - -
    -
    - Box2D body definition. - - -
    - - - - - - - - -
    - - -
    - - - bodyType - -
    -
    - Dynamic bodies by default - - -
    - - - - - - - - -
    - - -
    - - - density - -
    -
    - Body dentisy - - -
    - - - - - - - - -
    - - -
    - - - fixtureDef - -
    -
    - Box2D fixture definition. - - -
    - - - - - - - - -
    - - -
    - - - friction - -
    -
    - Body friction. - - -
    - - - - - - - - -
    - - -
    - - - recycle - -
    -
    - Recycle this actor when the body is not needed anymore ?? - - -
    - - - - - - - - -
    - - -
    - - - restitution - -
    -
    - Body restitution. - - -
    - - - - - - - - -
    - - -
    - - - world - -
    -
    - Box2D world reference. - - -
    - - - - - - - - -
    - - -
    - - - worldBody - -
    -
    - Box2D body - - -
    - - - - - - - - -
    - - -
    - - - worldBodyFixture - -
    -
    - Box2d fixture - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - animate(director, time) - -
    -
    - Method override to get position and rotation angle from box2d body. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - time - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - check(obj, prop, def) - -
    -
    - Helper method to check whether this js object contains a given property and if it doesn't exist -create and set it to def value. - - -
    - - - - -
    -
    Parameters:
    - -
    - obj - -
    -
    {object}
    - -
    - prop - -
    -
    {string}
    - -
    - def - -
    -
    {object}
    - -
    - - - - - - - - -
    - - -
    - - - createBody(world, bodyData) - -
    -
    - Create an actor as a box2D body binding, create it on the given world and with -the initialization data set in bodyData object. - - -
    - - - - -
    -
    Parameters:
    - -
    - world - -
    -
    {Box2D.Dynamics.b2World} a Box2D world instance
    - -
    - bodyData - -
    -
    {object} An object with body info.
    - -
    - - - - - - - - -
    - - -
    - - - destroy() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getCenter() - -
    -
    - Get this body's center on screen regardless of its shape. -This method will return box2d body's centroid. - - -
    - - - - - - - - - - - -
    - - -
    - - - getDistanceJointLocalAnchor() - -
    -
    - Get a distance joint's position on pixels. - - -
    - - - - - - - - - - - -
    - - -
    - - - setAwake(bool) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - bool - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setBodyType(bodyType) - -
    -
    - Set this body's type: - - -
    - - - - -
    -
    Parameters:
    - -
    - bodyType - -
    -
    {Box2D.Dynamics.b2Body.b2_*}
    - -
    - - - - - - - - -
    - - -
    - - - setDensity(d) - -
    -
    - Set this body's -density. - - -
    - - - - -
    -
    Parameters:
    - -
    - d - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setFriction(f) - -
    -
    - Set this body's friction. - - -
    - - - - -
    -
    Parameters:
    - -
    - f - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setLocation(x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPositionAnchor(ax, ay) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ax - -
    -
    - -
    - ay - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPositionAnchored(x, y, ax, ay) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - ax - -
    -
    - -
    - ay - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setRecycle() - -
    -
    - set this actor to recycle its body, that is, do not destroy it. - - -
    - - - - - - - - - - - -
    - - -
    - - - setRestitution(r) - -
    -
    - Set this body's restitution coeficient. - - -
    - - - - -
    -
    Parameters:
    - -
    - r - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setSleepingAllowed(bool) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - bool - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:42 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DCircularBody.html b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DCircularBody.html deleted file mode 100644 index 7e8ebb82..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DCircularBody.html +++ /dev/null @@ -1,731 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.Box2D.B2DCircularBody - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.Box2D.B2DCircularBody -

    - - -

    - -
    Extends - CAAT.Foundation.Box2D.B2DBodyActor.
    - - - - - -
    Defined in: B2DCircularBody.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - radius -
    -
    Default radius.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    bodyData, bodyDef, bodyType, density, fixtureDef, friction, recycle, restitution, world, worldBody, worldBodyFixture
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    createBody(world, bodyData) -
    -
    Create a box2d body and link it to this CAAT.Actor instance.
    -
    <static>   -
    CAAT.Foundation.Box2D.B2DCircularBody.createCircularBody(world, bodyData) -
    -
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    __init, animate, check, destroy, getCenter, getDistanceJointLocalAnchor, setAwake, setBodyType, setDensity, setFriction, setLocation, setPositionAnchor, setPositionAnchored, setRecycle, setRestitution, setSleepingAllowed
    Methods borrowed from class CAAT.Foundation.Actor:
    __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paint, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.Box2D.B2DCircularBody() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - radius - -
    -
    - Default radius. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - - createBody(world, bodyData) - -
    -
    - Create a box2d body and link it to this CAAT.Actor instance. - - -
    - - - - -
    -
    Parameters:
    - -
    - world - -
    -
    {Box2D.Dynamics.b2World} a Box2D world instance
    - -
    - bodyData - -
    -
    {object}
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Box2D.B2DCircularBody.createCircularBody(world, bodyData) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - world - -
    -
    - -
    - bodyData - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:42 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DPolygonBody.html b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DPolygonBody.html deleted file mode 100644 index 7a219cc0..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DPolygonBody.html +++ /dev/null @@ -1,765 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.Box2D.B2DPolygonBody - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.Box2D.B2DPolygonBody -

    - - -

    - -
    Extends - CAAT.Foundation.Box2D.B2DBodyActor.
    - - - - - -
    Defined in: B2DPolygonBody.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    Measured body's bounding box.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    bodyData, bodyDef, bodyType, density, fixtureDef, friction, recycle, restitution, world, worldBody, worldBodyFixture
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    createBody(world, bodyData) -
    -
    Create a box2d body and link it to this CAAT.Actor.
    -
    <static>   -
    CAAT.Foundation.Box2D.B2DPolygonBody.createPolygonBody(world, bodyData) -
    -
    Helper function to aid in box2d polygon shaped bodies.
    -
      - -
    Get on-screen distance joint coordinate.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    __init, animate, check, destroy, getCenter, setAwake, setBodyType, setDensity, setFriction, setLocation, setPositionAnchor, setPositionAnchored, setRecycle, setRestitution, setSleepingAllowed
    Methods borrowed from class CAAT.Foundation.Actor:
    __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paint, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.Box2D.B2DPolygonBody() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - boundingBox - -
    -
    - Measured body's bounding box. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - - createBody(world, bodyData) - -
    -
    - Create a box2d body and link it to this CAAT.Actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - world - -
    -
    {Box2D.Dynamics.b2World}
    - -
    - bodyData - -
    -
    {object}
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Box2D.B2DPolygonBody.createPolygonBody(world, bodyData) - -
    -
    - Helper function to aid in box2d polygon shaped bodies. - - -
    - - - - -
    -
    Parameters:
    - -
    - world - -
    -
    - -
    - bodyData - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getDistanceJointLocalAnchor() - -
    -
    - Get on-screen distance joint coordinate. - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:43 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.html b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.html deleted file mode 100644 index b8cea31f..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.Box2D - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Foundation.Box2D -

    - - -

    - - - - - - -
    Defined in: B2DBodyActor.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Foundation.Box2D -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:42 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Director.html b/documentation/jsdoc/symbols/CAAT.Foundation.Director.html deleted file mode 100644 index cd61c340..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.Director.html +++ /dev/null @@ -1,7654 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.Director - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.Director -

    - - -

    - -
    Extends - CAAT.Foundation.ActorContainer.
    - - - - - -
    Defined in: Director.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   - -
    Calculated gesture event rotation.
    -
    <private>   - -
    Calculated gesture event scale.
    -
    <private>   - -
    this director´s audio manager.
    -
      - -
    Some browser related information.
    -
    <private>   -
    - canvas -
    -
    The canvas the Director draws on.
    -
    <private>   - -
    current dirty rects.
    -
      -
    - clear -
    -
    Clear screen strategy: -CAAT.Foundation.Director.CLEAR_NONE : director won´t clear the background.
    -
    <static>   -
    - CAAT.Foundation.Director.CLEAR_ALL -
    -
    -
    <static>   -
    - CAAT.Foundation.Director.CLEAR_DIRTY_RECTS -
    -
    -
    <static>   -
    - CAAT.Foundation.Director.CLEAR_NONE -
    -
    -
    <private>   -
    - coords -
    -
    webGL vertex array
    -
    <private>   - -
    webGL vertex indices.
    -
      -
    - ctx -
    -
    This director´s canvas rendering context.
    -
    <private>   - -
    webGL current shader opacity.
    -
      - -
    The current Scene.
    -
    <private>   - -
    webGL current texture page.
    -
      -
    - debug -
    -
    flag indicating debug mode.
    -
    <private>   - -
    Dirty rects cache.
    -
    <private>   - -
    Dirty rects enabled ??
    -
    <private>   - -
    Number of currently allocated dirty rects.
    -
      -
    - dragging -
    -
    is input in drag mode ?
    -
    <private>   - -
    Dirty rects count debug info.
    -
      - -
    Rendered frames counter.
    -
    <private>   - -
    draw tris front_to_back or back_to_front ?
    -
    <private>   -
    - gl -
    -
    3d context
    -
    <private>   -
    - glEnabled -
    -
    is WebGL enabled as renderer ?
    -
    <private>   - -
    if webGL is on, CAAT will texture pack all images transparently.
    -
    <private>   - -
    The only GLSL program for webGL
    -
      - -
    An array of JSON elements of the form { id:string, image:Image }
    -
    <private>   - -
    if CAAT.NO_RAF is set (no request animation frame), this value is the setInterval returned -id.
    -
      - -
    is the left mouse button pressed ?.
    -
      - -
    director's last actor receiving input.
    -
    <private>   - -
    mouse coordinate related to canvas 0,0 coord.
    -
    <private>   - -
    Number of dirty rects.
    -
    <private>   - -
    currently unused.
    -
    <private>   - -
    This method will be called after rendering any director scene.
    -
    <private>   - -
    This method will be called before rendering any director scene.
    -
      - -
    Callback when the window is resized.
    -
    <private>   -
    - pMatrix -
    -
    webGL projection matrix
    -
    <private>   - -
    previous mouse position cache.
    -
    <static>   -
    - CAAT.Foundation.Director.RENDER_MODE_CONTINUOUS -
    -
    -
    <static>   -
    - CAAT.Foundation.Director.RENDER_MODE_DIRTY -
    -
    -
      - -
    Set CAAT render mode.
    -
    <private>   -
    - resize -
    -
    Window resize strategy.
    -
    <static>   -
    - CAAT.Foundation.Director.RESIZE_BOTH -
    -
    -
    <static>   -
    - CAAT.Foundation.Director.RESIZE_HEIGHT -
    -
    -
    <static>   -
    - CAAT.Foundation.Director.RESIZE_NONE -
    -
    -
    <static>   -
    - CAAT.Foundation.Director.RESIZE_PROPORTIONAL -
    -
    -
    <static>   -
    - CAAT.Foundation.Director.RESIZE_WIDTH -
    -
    -
      -
    - scenes -
    -
    This director scene collection.
    -
    <private>   - -
    Retina display deicePixels/backingStorePixels ratio
    -
    <private>   - -
    screen mouse coordinates.
    -
    <private>   - -
    Currently used dirty rects.
    -
      - -
    statistics object
    -
      -
    - stopped -
    -
    Is this director stopped ?
    -
    <private>   -
    - time -
    -
    director time.
    -
    <private>   -
    - timeline -
    -
    global director timeline.
    -
    <private>   - -
    Director´s timer manager.
    -
    <private>   -
    - touches -
    -
    Touches information.
    -
    <private>   - -
    if CAAT.CACHE_SCENE_ON_CHANGE is set, this scene will hold a cached copy of the exiting scene.
    -
    <private>   -
    - uv -
    -
    webGL uv texture indices
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.ActorContainer:
    activeChildren, addHint, boundingBox, childrenList, layoutInvalidated, layoutManager, pendingChildrenList, runion
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   - -
    -
    <private>   -
    __gestureChange(scale, rotation) -
    -
    -
    <private>   -
    __gestureEnd(scale, rotation) -
    -
    -
    <private>   -
    __gestureStart(scale, rotation) -
    -
    -
    <private>   -
    __init() -
    -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    -
    <private>   - -
    Same as mouseDown but not preventing event.
    -
    <private>   - -
    -
      -
    addAudio(id, url) -
    -
    Adds an audio to the cache.
    -
      -
    addChild(scene) -
    -
    Adds an scene to this Director.
    -
      -
    addDirtyRect(rectangle) -
    -
    Add a rectangle to the list of dirty screen areas which should be redrawn.
    -
      -
    addHandlers(canvas) -
    -
    -
      -
    addImage(id, image, noUpdateGL) -
    -
    Add a new image to director's image cache.
    -
      -
    addScene(scene) -
    -
    Add a new Scene to Director's Scene list.
    -
      -
    animate(director, time) -
    -
    A director is a very special kind of actor.
    -
      -
    audioLoop(id) -
    -
    Loops an audio instance identified by the id.
    -
      -
    audioPlay(id) -
    -
    Plays the audio instance identified by the id.
    -
      -
    cancelPlay(id) -
    -
    -
      -
    cancelPlayByChannel(audioObject) -
    -
    -
      - -
    -
      -
    clean() -
    -
    -
      - -
    -
      - -
    Creates an initializes a Scene object.
    -
      -
    createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel) -
    -
    -
      -
    cumulateOffset(node, parent, prop) -
    -
    Acculumate dom elements position to properly offset on-screen mouse/touch events.
    -
      -
    deleteImage(id, noUpdateGL) -
    -
    -
      -
    easeEnd(scene, b_easeIn) -
    -
    Scene easing listener.
    -
      -
    easeIn(inSceneIndex, type, time, alpha, anchor, interpolator) -
    -
    This method changes Director's current Scene to the scene index indicated by -inSceneIndex parameter.
    -
      -
    easeInOut(inSceneIndex, typein, anchorin, outSceneIndex, typeout, anchorout, time, alpha, interpolatorIn, interpolatorOut) -
    -
    This method offers full control over the process of switching between any given two Scenes.
    -
      -
    easeInOutRandom(inIndex, outIndex, time, alpha) -
    -
    This method will switch between two given Scene indexes (ie, take away scene number 2, -and bring in scene number 5).
    -
      - -
    Removes Director's scenes.
    -
      -
    enableEvents(onElement) -
    -
    -
      -
    enableResizeEvents(mode, onResizeCallback) -
    -
    Enable window resize events and set redimension policy.
    -
      -
    endLoop() -
    -
    -
      - -
    -
      - -
    -
      - -
    Get this Director's AudioManager instance.
    -
      - -
    Return the running browser name.
    -
      - -
    Return the running browser version.
    -
      -
    getCanvasCoord(point, e) -
    -
    Normalize input event coordinates to be related to (0,0) canvas position.
    -
      - -
    -
      - -
    Return the index of the current scene in the Director's scene list.
    -
      -
    getImage(sId) -
    -
    Gets the resource with the specified resource name.
    -
      - -
    Get the number of scenes contained in the Director.
    -
      -
    getOffset(node) -
    -
    -
      - -
    Return the operating system name.
    -
      - -
    -
      -
    getScene(index) -
    -
    Get a concrete director's scene.
    -
      - -
    -
      -
    getSceneIndex(scene) -
    -
    Return the index for a given Scene object contained in the Director.
    -
      - -
    -
      -
    glFlush() -
    -
    -
      -
    glRender(vertex, coordsIndex, uv) -
    -
    Render buffered elements.
    -
      -
    glReset() -
    -
    -
      - -
    -
      -
    initialize(width, height, canvas, proxy) -
    -
    This method performs Director initialization.
    -
      -
    initializeGL(width, height, canvas, proxy) -
    -
    Experimental.
    -
      - -
    -
      - -
    -
      -
    loop(fps, callback, callback2) -
    -
    -
      -
    mouseDown(mouseEvent) -
    -
    -
      -
    mouseDrag(mouseEvent) -
    -
    -
      -
    mouseEnter(mouseEvent) -
    -
    -
      -
    mouseExit(mouseEvent) -
    -
    -
      -
    mouseMove(mouseEvent) -
    -
    -
      -
    mouseUp(mouseEvent) -
    -
    -
      -
    musicPlay(id) -
    -
    -
      - -
    -
      -
    render(time) -
    -
    This is the entry point for the animation system of the Director.
    -
      - -
    Starts the director animation.If no scene is explicitly selected, the current Scene will -be the first scene added to the Director.
    -
      -
    renderToContext(ctx, scene) -
    -
    This method draws an Scene to an offscreen canvas.
    -
      - -
    -
    <private>   - -
    Reset statistics information.
    -
      - -
    If the director has renderingMode: DIRTY, the timeline must be reset to register accurate frame measurement.
    -
      -
    scheduleDirtyRect(rectangle) -
    -
    This method is used when asynchronous operations must produce some dirty rectangle painting.
    -
      - -
    -
      -
    setBounds(x, y, w, h) -
    -
    Set this director's bounds as well as its contained scenes.
    -
      -
    setClear(clear) -
    -
    This method states whether the director must clear background before rendering -each frame.
    -
      - -
    -
      - -
    -
      -
    setImagesCache(imagesCache, tpW, tpH) -
    -
    -
      -
    setMusicEnabled(enabled) -
    -
    -
      - -
    -
      -
    setScene(sceneIndex) -
    -
    Changes (or sets) the current Director scene to the index -parameter.
    -
      - -
    -
      -
    setValueForKey(key, value) -
    -
    -
      -
    setVolume(id, volume) -
    -
    -
      -
    switchToNextScene(time, alpha, transition) -
    -
    Sets the previous Scene in sequence as the current Scene.
    -
      -
    switchToPrevScene(time, alpha, transition) -
    -
    Sets the previous Scene in sequence as the current Scene.
    -
      -
    switchToScene(iNewSceneIndex, time, alpha, transition) -
    -
    This method will change the current Scene by the Scene indicated as parameter.
    -
      - -
    -
      -
    windowResized(w, h) -
    -
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.ActorContainer:
    __paintActor, __validateLayout, __validateTree, addActor, addActorImmediately, addChildAt, addChildDelayed, addChildImmediately, destroy, drawScreenBoundingBox, emptyChildren, endAnimate, findActorById, findChild, getChildAt, getLayout, getNumActiveChildren, getNumChildren, invalidateLayout, paintActor, paintActorGL, recalcSize, removeChild, removeChildAt, removeFirstChild, removeLastChild, setLayout, setZOrder
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, contains, create, disableDrag, emptyBehaviorList, enableDrag, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseOut, mouseOver, moveTo, paint, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.Director() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - __gestureRotation - -
    -
    - Calculated gesture event rotation. - - -
    - - - - - - - - -
    - - -
    <private> - - - __gestureScale - -
    -
    - Calculated gesture event scale. - - -
    - - - - - - - - -
    - - -
    <private> - - - audioManager - -
    -
    - this director´s audio manager. - - -
    - - - - - - - - -
    - - -
    - - - browserInfo - -
    -
    - Some browser related information. - - -
    - - - - - - - - -
    - - -
    <private> - - - canvas - -
    -
    - The canvas the Director draws on. - - -
    - - - - - - - - -
    - - -
    <private> - - - cDirtyRects - -
    -
    - current dirty rects. - - -
    - - - - - - - - -
    - - -
    - - - clear - -
    -
    - Clear screen strategy: -CAAT.Foundation.Director.CLEAR_NONE : director won´t clear the background. -CAAT.Foundation.Director.CLEAR_DIRTY_RECTS : clear only affected actors screen area. -CAAT.Foundation.Director.CLEAR_ALL : clear the whole canvas object. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Director.CLEAR_ALL - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Director.CLEAR_DIRTY_RECTS - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Director.CLEAR_NONE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <private> - - - coords - -
    -
    - webGL vertex array - - -
    - - - - - - - - -
    - - -
    <private> - - - coordsIndex - -
    -
    - webGL vertex indices. - - -
    - - - - - - - - -
    - - -
    - - - ctx - -
    -
    - This director´s canvas rendering context. - - -
    - - - - - - - - -
    - - -
    <private> - - - currentOpacity - -
    -
    - webGL current shader opacity. -BUGBUG: change this by vertex colors. - - -
    - - - - - - - - -
    - - -
    - - - currentScene - -
    -
    - The current Scene. This and only this will receive events. - - -
    - - - - - - - - -
    - - -
    <private> - - - currentTexturePage - -
    -
    - webGL current texture page. This minimizes webGL context changes. - - -
    - - - - - - - - -
    - - -
    - - - debug - -
    -
    - flag indicating debug mode. It will draw affedted screen areas. - - -
    - - - - - - - - -
    - - -
    <private> - - - dirtyRects - -
    -
    - Dirty rects cache. -An array of CAAT.Math.Rectangle object. - - -
    - - - - - - - - -
    - - -
    <private> - - - dirtyRectsEnabled - -
    -
    - Dirty rects enabled ?? - - -
    - - - - - - - - -
    - - -
    <private> - - - dirtyRectsIndex - -
    -
    - Number of currently allocated dirty rects. - - -
    - - - - - - - - -
    - - -
    - - - dragging - -
    -
    - is input in drag mode ? - - -
    - - - - - - - - -
    - - -
    <private> - - - drDiscarded - -
    -
    - Dirty rects count debug info. - - -
    - - - - - - - - -
    - - -
    - - - frameCounter - -
    -
    - Rendered frames counter. - - -
    - - - - - - - - -
    - - -
    <private> - - - front_to_back - -
    -
    - draw tris front_to_back or back_to_front ? - - -
    - - - - - - - - -
    - - -
    <private> - - - gl - -
    -
    - 3d context - - -
    - - - - - - - - -
    - - -
    <private> - - - glEnabled - -
    -
    - is WebGL enabled as renderer ? - - -
    - - - - - - - - -
    - - -
    <private> - - - glTextureManager - -
    -
    - if webGL is on, CAAT will texture pack all images transparently. - - -
    - - - - - - - - -
    - - -
    <private> - - - glTtextureProgram - -
    -
    - The only GLSL program for webGL - - -
    - - - - - - - - -
    - - -
    - - - imagesCache - -
    -
    - An array of JSON elements of the form { id:string, image:Image } - - -
    - - - - - - - - -
    - - -
    <private> - - - intervalId - -
    -
    - if CAAT.NO_RAF is set (no request animation frame), this value is the setInterval returned -id. - - -
    - - - - - - - - -
    - - -
    - - - isMouseDown - -
    -
    - is the left mouse button pressed ?. -Needed to handle dragging. - - -
    - - - - - - - - -
    - - -
    - - - lastSelectedActor - -
    -
    - director's last actor receiving input. -Needed to set capture for dragging events. - - -
    - - - - - - - - -
    - - -
    <private> - - - mousePoint - -
    -
    - mouse coordinate related to canvas 0,0 coord. - - -
    - - - - - - - - -
    - - -
    <private> - - - nDirtyRects - -
    -
    - Number of dirty rects. - - -
    - - - - - - - - -
    - - -
    <private> - - - needsRepaint - -
    -
    - currently unused. -Intended to run caat in evented mode. - - -
    - - - - - - - - -
    - - -
    <private> - - - onRenderEnd - -
    -
    - This method will be called after rendering any director scene. -Use this method to clean your physics forces for example. - - -
    - - - - - - - - -
    - - -
    <private> - - - onRenderStart - -
    -
    - This method will be called before rendering any director scene. -Use this method to calculate your physics for example. - - -
    - - - - - - - - -
    - - -
    - - - onResizeCallback - -
    -
    - Callback when the window is resized. - - -
    - - - - - - - - -
    - - -
    <private> - - - pMatrix - -
    -
    - webGL projection matrix - - -
    - - - - - - - - -
    - - -
    <private> - - - prevMousePoint - -
    -
    - previous mouse position cache. Needed for drag events. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Director.RENDER_MODE_CONTINUOUS - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Director.RENDER_MODE_DIRTY - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - renderMode - -
    -
    - Set CAAT render mode. Right now, this takes no effect. - - -
    - - - - - - - - -
    - - -
    <private> - - - resize - -
    -
    - Window resize strategy. -see CAAT.Foundation.Director.RESIZE_* constants. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Director.RESIZE_BOTH - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Director.RESIZE_HEIGHT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Director.RESIZE_NONE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Director.RESIZE_PROPORTIONAL - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Director.RESIZE_WIDTH - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - scenes - -
    -
    - This director scene collection. - - -
    - - - - - - - - -
    - - -
    <private> - - - SCREEN_RATIO - -
    -
    - Retina display deicePixels/backingStorePixels ratio - - -
    - - - - - - - - -
    - - -
    <private> - - - screenMousePoint - -
    -
    - screen mouse coordinates. - - -
    - - - - - - - - -
    - - -
    <private> - - - sDirtyRects - -
    -
    - Currently used dirty rects. - - -
    - - - - - - - - -
    - - -
    - - - statistics - -
    -
    - statistics object - - -
    - - - - - - - - -
    - - -
    - - - stopped - -
    -
    - Is this director stopped ? - - -
    - - - - - - - - -
    - - -
    <private> - - - time - -
    -
    - director time. - - -
    - - - - - - - - -
    - - -
    <private> - - - timeline - -
    -
    - global director timeline. - - -
    - - - - - - - - -
    - - -
    <private> - - - timerManager - -
    -
    - Director´s timer manager. -Each scene has a timerManager as well. -The difference is the scope. Director´s timers will always be checked whereas scene´ timers -will only be scheduled/checked when the scene is director´ current scene. - - -
    - - - - - - - - -
    - - -
    <private> - - - touches - -
    -
    - Touches information. Associate touch.id with an actor and original touch info. - - -
    - - - - - - - - -
    - - -
    <private> - - - transitionScene - -
    -
    - if CAAT.CACHE_SCENE_ON_CHANGE is set, this scene will hold a cached copy of the exiting scene. - - -
    - - - - - - - - -
    - - -
    <private> - - - uv - -
    -
    - webGL uv texture indices - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __findTouchFirstActor() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - __gestureChange(scale, rotation) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - scale - -
    -
    - -
    - rotation - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __gestureEnd(scale, rotation) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - scale - -
    -
    - -
    - rotation - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __gestureStart(scale, rotation) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - scale - -
    -
    - -
    - rotation - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - __mouseDBLClickHandler(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __mouseDownHandler(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __mouseMoveHandler(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __mouseOutHandler(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __mouseOverHandler(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __mouseUpHandler(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __setupRetina() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - __touchCancelHandleMT(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __touchEndHandler(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __touchEndHandlerMT(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __touchGestureChangeHandleMT(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __touchGestureEndHandleMT(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __touchGestureStartHandleMT(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __touchMoveHandler(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __touchMoveHandlerMT(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __touchStartHandler(e) - -
    -
    - Same as mouseDown but not preventing event. -Will only take care of first touch. - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __touchStartHandlerMT(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addAudio(id, url) - -
    -
    - Adds an audio to the cache. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - url - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - -
    -
    See:
    - -
    CAAT.Module.Audio.AudioManager.addAudio
    - -
    - - -
    - - -
    - - - addChild(scene) - -
    -
    - Adds an scene to this Director. - - -
    - - - - -
    -
    Parameters:
    - -
    - scene - -
    -
    {CAAT.Foundation.Scene} a scene object.
    - -
    - - - - - - - - -
    - - -
    - - - addDirtyRect(rectangle) - -
    -
    - Add a rectangle to the list of dirty screen areas which should be redrawn. -This is the opposite method to clear the whole screen and repaint everything again. -Despite i'm not very fond of dirty rectangles because it needs some extra calculations, this -procedure has shown to be speeding things up under certain situations. Nevertheless it doesn't or -even lowers performance under others, so it is a developer choice to activate them via a call to -setClear( CAAT.Director.CLEAR_DIRTY_RECTS ). - -This function, not only tracks a list of dirty rectangles, but tries to optimize the list. Overlapping -rectangles will be removed and intersecting ones will be unioned. - -Before calling this method, check if this.dirtyRectsEnabled is true. - - -
    - - - - -
    -
    Parameters:
    - -
    - rectangle - -
    -
    {CAAT.Rectangle}
    - -
    - - - - - - - - -
    - - -
    - - - addHandlers(canvas) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - canvas - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addImage(id, image, noUpdateGL) - -
    -
    - Add a new image to director's image cache. If gl is enabled and the 'noUpdateGL' is not set to true this -function will try to recreate the whole GL texture pages. -If many handcrafted images are to be added to the director, some performance can be achieved by calling -director.addImage(id,image,false) many times and a final call with -director.addImage(id,image,true) to finally command the director to create texture pages. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {string|object} an identitifier to retrieve the image with
    - -
    - image - -
    -
    {Image|HTMLCanvasElement} image to add to cache
    - -
    - noUpdateGL - -
    -
    {!boolean} unless otherwise stated, the director will - try to recreate the texture pages.
    - -
    - - - - - - - - -
    - - -
    - - - addScene(scene) - -
    -
    - Add a new Scene to Director's Scene list. By adding a Scene to the Director -does not mean it will be immediately visible, you should explicitly call either -
      -
    • easeIn -
    • easeInOut -
    • easeInOutRandom -
    • setScene -
    • or any of the scene switching methods -
    - - -
    - - - - -
    -
    Parameters:
    - -
    - scene - -
    -
    {CAAT.Foundation.Scene}
    - -
    - - - - - - - - -
    - - -
    - - - animate(director, time) - -
    -
    - A director is a very special kind of actor. -Its animation routine simple sets its modelViewMatrix in case some transformation's been -applied. -No behaviors are allowed for Director instances. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director} redundant reference to CAAT.Director itself
    - -
    - time - -
    -
    {number} director time.
    - -
    - - - - - - - - -
    - - -
    - - {HTMLElement|null} - audioLoop(id) - -
    -
    - Loops an audio instance identified by the id. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {object} the object used to store a sound in the audioCache.
    - -
    - - - - - -
    -
    Returns:
    - -
    {HTMLElement|null} the value from audioManager.loop
    - -
    - - - - -
    - - -
    - - - audioPlay(id) - -
    -
    - Plays the audio instance identified by the id. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {object} the object used to store a sound in the audioCache.
    - -
    - - - - - - - - -
    - - -
    - - - cancelPlay(id) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - cancelPlayByChannel(audioObject) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - audioObject - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - checkDebug() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - clean() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - createEventHandler() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {CAAT.Scene} - createScene() - -
    -
    - Creates an initializes a Scene object. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Scene}
    - -
    - - - - -
    - - -
    - - - createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - startTime - -
    -
    - -
    - duration - -
    -
    - -
    - callback_timeout - -
    -
    - -
    - callback_tick - -
    -
    - -
    - callback_cancel - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - cumulateOffset(node, parent, prop) - -
    -
    - Acculumate dom elements position to properly offset on-screen mouse/touch events. - - -
    - - - - -
    -
    Parameters:
    - -
    - node - -
    -
    - -
    - parent - -
    -
    - -
    - prop - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - deleteImage(id, noUpdateGL) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - noUpdateGL - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - easeEnd(scene, b_easeIn) - -
    -
    - Scene easing listener. Notifies scenes when they're about to be activated (set as current -director's scene). - - -
    - - - - -
    -
    Parameters:
    - -
    - scene - -
    -
    {CAAT.Foundation.Scene} the scene that has just been brought in or taken out of the director.
    - -
    - b_easeIn - -
    -
    {boolean} scene enters or exits ?
    - -
    - - - - - - - - -
    - - -
    - - - easeIn(inSceneIndex, type, time, alpha, anchor, interpolator) - -
    -
    - This method changes Director's current Scene to the scene index indicated by -inSceneIndex parameter. The Scene running in the director won't be eased out. - - -
    - - - - -
    -
    Parameters:
    - -
    - inSceneIndex - -
    -
    integer indicating the new Scene to set as current.
    - -
    - type - -
    -
    integer indicating the type of transition to apply to bring the new current -Scene to the Director. The values will be one of: CAAT.Scene.prototype.EASE_ROTATION, -CAAT.Scene.prototype.EASE_SCALE, CAAT.Scene.prototype.EASE_TRANSLATION.
    - -
    - time - -
    -
    integer indicating how much time in milliseconds the Scene entrance will take.
    - -
    - alpha - -
    -
    boolean indicating whether alpha transparency fading will be applied to the -entereing Scene.
    - -
    - anchor - -
    -
    integer indicating the anchor to fix for Scene transition. It will be any of -CAAT.Actor.prototype.ANCHOR_* values.
    - -
    - interpolator - -
    -
    an CAAT.Interpolator object indicating the interpolation function to -apply.
    - -
    - - - - - - - -
    -
    See:
    - -
    - -
    - -
    - -
    - - -
    - - -
    - - - easeInOut(inSceneIndex, typein, anchorin, outSceneIndex, typeout, anchorout, time, alpha, interpolatorIn, interpolatorOut) - -
    -
    - This method offers full control over the process of switching between any given two Scenes. -To apply this method, you must specify the type of transition to apply for each Scene and -the anchor to keep the Scene pinned at. -

    -The type of transition will be one of the following values defined in CAAT.Foundation.Scene.prototype: -

      -
    • EASE_ROTATION -
    • EASE_SCALE -
    • EASE_TRANSLATION -
    - -

    -The anchor will be any of these values defined in CAAT.Foundation.Actor: -

      -
    • ANCHOR_CENTER -
    • ANCHOR_TOP -
    • ANCHOR_BOTTOM -
    • ANCHOR_LEFT -
    • ANCHOR_RIGHT -
    • ANCHOR_TOP_LEFT -
    • ANCHOR_TOP_RIGHT -
    • ANCHOR_BOTTOM_LEFT -
    • ANCHOR_BOTTOM_RIGHT -
    - -

    -In example, for an entering scene performing a EASE_SCALE transition, the anchor is the -point by which the scene will scaled. - - -

    - - - - -
    -
    Parameters:
    - -
    - inSceneIndex - -
    -
    integer indicating the Scene index to bring in to the Director.
    - -
    - typein - -
    -
    integer indicating the type of transition to apply to the bringing in Scene.
    - -
    - anchorin - -
    -
    integer indicating the anchor of the bringing in Scene.
    - -
    - outSceneIndex - -
    -
    integer indicating the Scene index to take away from the Director.
    - -
    - typeout - -
    -
    integer indicating the type of transition to apply to the taking away in Scene.
    - -
    - anchorout - -
    -
    integer indicating the anchor of the taking away Scene.
    - -
    - time - -
    -
    inteter indicating the time to perform the process of switchihg between Scene object -in milliseconds.
    - -
    - alpha - -
    -
    boolean boolean indicating whether alpha transparency fading will be applied to -the scenes.
    - -
    - interpolatorIn - -
    -
    CAAT.Behavior.Interpolator object to apply to entering scene.
    - -
    - interpolatorOut - -
    -
    CAAT.Behavior.Interpolator object to apply to exiting scene.
    - -
    - - - - - - - - -
    - - -
    - - - easeInOutRandom(inIndex, outIndex, time, alpha) - -
    -
    - This method will switch between two given Scene indexes (ie, take away scene number 2, -and bring in scene number 5). -

    -It will randomly choose for each Scene the type of transition to apply and the anchor -point of each transition type. -

    -It will also set for different kind of transitions the following interpolators: -

      -
    • EASE_ROTATION -> ExponentialInOutInterpolator, exponent 4. -
    • EASE_SCALE -> ElasticOutInterpolator, 1.1 and .4 -
    • EASE_TRANSLATION -> BounceOutInterpolator -
    - -

    -These are the default values, and could not be changed by now. -This method in final instance delegates the process to easeInOutMethod. - - -

    - - - - -
    -
    Parameters:
    - -
    - inIndex - -
    -
    integer indicating the entering scene index.
    - -
    - outIndex - -
    -
    integer indicating the exiting scene index.
    - -
    - time - -
    -
    integer indicating the time to take for the process of Scene in/out in milliseconds.
    - -
    - alpha - -
    -
    boolean indicating whether alpha transparency fading should be applied to transitions.
    - -
    - - - - - - - -
    -
    See:
    - -
    easeInOutMethod.
    - -
    - - -
    - - -
    - - - emptyScenes() - -
    -
    - Removes Director's scenes. - - -
    - - - - - - - - - - - -
    - - -
    - - - enableEvents(onElement) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - onElement - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - enableResizeEvents(mode, onResizeCallback) - -
    -
    - Enable window resize events and set redimension policy. A callback functio could be supplied -to be notified on a Director redimension event. This is necessary in the case you set a redim -policy not equal to RESIZE_PROPORTIONAL. In those redimension modes, director's area and their -children scenes are resized to fit the new area. But scenes content is not resized, and have -no option of knowing so uless an onResizeCallback function is supplied. - - -
    - - - - -
    -
    Parameters:
    - -
    - mode - -
    -
    {number} RESIZE_BOTH, RESIZE_WIDTH, RESIZE_HEIGHT, RESIZE_NONE.
    - -
    - onResizeCallback - -
    -
    {function(director{CAAT.Director}, width{integer}, height{integer})} a callback -to notify on canvas resize.
    - -
    - - - - - - - - -
    - - -
    - - - endLoop() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - endSound() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - findActorAtPosition(point) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.AudioManager} - getAudioManager() - -
    -
    - Get this Director's AudioManager instance. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.AudioManager} the AudioManager instance.
    - -
    - - - - -
    - - -
    - - {string} - getBrowserName() - -
    -
    - Return the running browser name. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {string} the browser name.
    - -
    - - - - -
    - - -
    - - {string} - getBrowserVersion() - -
    -
    - Return the running browser version. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {string} the browser version.
    - -
    - - - - -
    - - -
    - - - getCanvasCoord(point, e) - -
    -
    - Normalize input event coordinates to be related to (0,0) canvas position. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Math.Point} canvas coordinate.
    - -
    - e - -
    -
    {MouseEvent} a mouse event from an input event.
    - -
    - - - - - - - - -
    - - -
    - - - getCurrentScene() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {number} - getCurrentSceneIndex() - -
    -
    - Return the index of the current scene in the Director's scene list. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number} the current scene's index.
    - -
    - - - - -
    - - -
    - - - getImage(sId) - -
    -
    - Gets the resource with the specified resource name. -The Director holds a collection called imagesCache -where you can store a JSON of the form - [ { id: imageId, image: imageObject } ]. -This structure will be used as a resources cache. -There's a CAAT.Module.ImagePreloader class to preload resources and -generate this structure on loading finalization. - - -
    - - - - -
    -
    Parameters:
    - -
    - sId - -
    -
    {object} an String identifying a resource.
    - -
    - - - - - - - - -
    - - -
    - - {number} - getNumScenes() - -
    -
    - Get the number of scenes contained in the Director. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number} the number of scenes contained in the Director.
    - -
    - - - - -
    - - -
    - - - getOffset(node) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - node - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {string} - getOSName() - -
    -
    - Return the operating system name. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {string} the os name.
    - -
    - - - - -
    - - -
    - - - getRenderType() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {CAAT.Foundation.Scene} - getScene(index) - -
    -
    - Get a concrete director's scene. - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    {number} an integer indicating the scene index.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Foundation.Scene} a CAAT.Scene object instance or null if the index is oob.
    - -
    - - - - -
    - - -
    - - - getSceneById(id) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getSceneIndex(scene) - -
    -
    - Return the index for a given Scene object contained in the Director. - - -
    - - - - -
    -
    Parameters:
    - -
    - scene - -
    -
    {CAAT.Foundation.Scene}
    - -
    - - - - - - - - -
    - - -
    - - - getValueForKey(key) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - key - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - glFlush() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - glRender(vertex, coordsIndex, uv) - -
    -
    - Render buffered elements. - - -
    - - - - -
    -
    Parameters:
    - -
    - vertex - -
    -
    - -
    - coordsIndex - -
    -
    - -
    - uv - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - glReset() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - inDirtyRect() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - initialize(width, height, canvas, proxy) - -
    -
    - This method performs Director initialization. Must be called once. -If the canvas parameter is not set, it will create a Canvas itself, -and the developer must explicitly add the canvas to the desired DOM position. -This method will also set the Canvas dimension to the specified values -by width and height parameters. - - -
    - - - - -
    -
    Parameters:
    - -
    - width - -
    -
    {number} a canvas width
    - -
    - height - -
    -
    {number} a canvas height
    - -
    - canvas - -
    -
    {HTMLCanvasElement=} An optional Canvas object.
    - -
    - proxy - -
    -
    {HTMLElement} this object can be an event proxy in case you'd like to layer different elements - and want events delivered to the correct element.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - initializeGL(width, height, canvas, proxy) - -
    -
    - Experimental. -Initialize a gl enabled director. - - -
    - - - - -
    -
    Parameters:
    - -
    - width - -
    -
    - -
    - height - -
    -
    - -
    - canvas - -
    -
    - -
    - proxy - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - isMusicEnabled() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isSoundEffectsEnabled() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - loop(fps, callback, callback2) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - fps - -
    -
    - -
    - callback - -
    -
    - -
    - callback2 - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseDown(mouseEvent) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseDrag(mouseEvent) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseEnter(mouseEvent) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseExit(mouseEvent) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseMove(mouseEvent) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseUp(mouseEvent) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - musicPlay(id) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - musicStop() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - render(time) - -
    -
    - This is the entry point for the animation system of the Director. -The director is fed with the elapsed time value to maintain a virtual timeline. -This virtual timeline will provide each Scene with its own virtual timeline, and will only -feed time when the Scene is the current Scene, or is being switched. - -If dirty rectangles are enabled and canvas is used for rendering, the dirty rectangles will be -set up as a single clip area. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} integer indicating the elapsed time between two consecutive frames of the -Director.
    - -
    - - - - - - - - -
    - - -
    - - - renderFrame() - -
    -
    - Starts the director animation.If no scene is explicitly selected, the current Scene will -be the first scene added to the Director. -

    -The fps parameter will set the animation quality. Higher values, -means CAAT will try to render more frames in the same second (at the -expense of cpu power at least until hardware accelerated canvas rendering -context are available). A value of 60 is a high frame rate and should not be exceeded. - - -

    - - - - - - - - - - - -
    - - -
    - - - renderToContext(ctx, scene) - -
    -
    - This method draws an Scene to an offscreen canvas. This offscreen canvas is also a child of -another Scene (transitionScene). So instead of drawing two scenes while transitioning from -one to another, first of all an scene is drawn to offscreen, and that image is translated. -

    -Until the creation of this method, both scenes where drawn while transitioning with -its performance penalty since drawing two scenes could be twice as expensive than drawing -only one. -

    -Though a high performance increase, we should keep an eye on memory consumption. - - -

    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    a canvas.getContext('2d') instnce.
    - -
    - scene - -
    -
    {CAAT.Foundation.Scene} the scene to draw offscreen.
    - -
    - - - - - - - - -
    - - -
    - - - requestRepaint() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - resetStats() - -
    -
    - Reset statistics information. - - -
    - - - - - - - - - - - -
    - - -
    - - - resetTimeline() - -
    -
    - If the director has renderingMode: DIRTY, the timeline must be reset to register accurate frame measurement. - - -
    - - - - - - - - - - - -
    - - -
    - - - scheduleDirtyRect(rectangle) - -
    -
    - This method is used when asynchronous operations must produce some dirty rectangle painting. -This means that every operation out of the regular CAAT loop must add dirty rect operations -by calling this method. -For example setVisible() and remove. - - -
    - - - - -
    -
    Parameters:
    - -
    - rectangle - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setAudioFormatExtensions(extensions) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - extensions - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setBounds(x, y, w, h) - -
    -
    - Set this director's bounds as well as its contained scenes. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number} ignored, will be 0.
    - -
    - y - -
    -
    {number} ignored, will be 0.
    - -
    - w - -
    -
    {number} director width.
    - -
    - h - -
    -
    {number} director height.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setClear(clear) - -
    -
    - This method states whether the director must clear background before rendering -each frame. - -The clearing method could be: - + CAAT.Director.CLEAR_ALL. previous to draw anything on screen the canvas will have clearRect called on it. - + CAAT.Director.CLEAR_DIRTY_RECTS. Actors marked as invalid, or which have been moved, rotated or scaled - will have their areas redrawn. - + CAAT.Director.CLEAR_NONE. clears nothing. - - -
    - - - - -
    -
    Parameters:
    - -
    - clear - -
    -
    {CAAT.Director.CLEAR_ALL | CAAT.Director.CLEAR_NONE | CAAT.Director.CLEAR_DIRTY_RECTS}
    - -
    - - - - - -
    -
    Returns:
    - -
    this.
    - -
    - - - - -
    - - -
    - - - setGLCurrentOpacity(opacity) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - opacity - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setGLTexturePage(tp) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - tp - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setImagesCache(imagesCache, tpW, tpH) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - imagesCache - -
    -
    - -
    - tpW - -
    -
    - -
    - tpH - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setMusicEnabled(enabled) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - enabled - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setScaleProportional(w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setScene(sceneIndex) - -
    -
    - Changes (or sets) the current Director scene to the index -parameter. There will be no transition on scene change. - - -
    - - - - -
    -
    Parameters:
    - -
    - sceneIndex - -
    -
    {number} an integer indicating the index of the target Scene -to be shown.
    - -
    - - - - - - - - -
    - - -
    - - - setSoundEffectsEnabled(enabled) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - enabled - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setValueForKey(key, value) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - key - -
    -
    - -
    - value - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setVolume(id, volume) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - volume - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - switchToNextScene(time, alpha, transition) - -
    -
    - Sets the previous Scene in sequence as the current Scene. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} integer indicating the time the Scene transition will take.
    - -
    - alpha - -
    -
    {boolean} a boolean indicating whether Scene transition should be fading.
    - -
    - transition - -
    -
    {boolean} a boolean indicating whether the scene change must smoothly animated.
    - -
    - - - - - - - -
    -
    See:
    - -
    switchToScene.
    - -
    - - -
    - - -
    - - - switchToPrevScene(time, alpha, transition) - -
    -
    - Sets the previous Scene in sequence as the current Scene. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} integer indicating the time the Scene transition will take.
    - -
    - alpha - -
    -
    {boolean} a boolean indicating whether Scene transition should be fading.
    - -
    - transition - -
    -
    {boolean} a boolean indicating whether the scene change must smoothly animated.
    - -
    - - - - - - - -
    -
    See:
    - -
    switchToScene.
    - -
    - - -
    - - -
    - - - switchToScene(iNewSceneIndex, time, alpha, transition) - -
    -
    - This method will change the current Scene by the Scene indicated as parameter. -It will apply random values for anchor and transition type. - - -
    - - - - -
    -
    Parameters:
    - -
    - iNewSceneIndex - -
    -
    {number} an integer indicating the index of the new scene to run on the Director.
    - -
    - time - -
    -
    {number} an integer indicating the time the Scene transition will take.
    - -
    - alpha - -
    -
    {boolean} a boolean indicating whether Scene transition should be fading.
    - -
    - transition - -
    -
    {boolean} a boolean indicating whether the scene change must smoothly animated.
    - -
    - - - - - - - -
    -
    See:
    - -
    easeInOutRandom
    - -
    - - -
    - - -
    - - - updateGLPages() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - windowResized(w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:43 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Scene.html b/documentation/jsdoc/symbols/CAAT.Foundation.Scene.html deleted file mode 100644 index 1b7aa6ca..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.Scene.html +++ /dev/null @@ -1,2384 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.Scene - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.Scene -

    - - -

    - -
    Extends - CAAT.Foundation.ActorContainer.
    - - - - - -
    Defined in: Scene.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   -
    - CAAT.Foundation.Scene.EASE_ROTATION -
    -
    -
    <static>   -
    - CAAT.Foundation.Scene.EASE_SCALE -
    -
    -
    <static>   -
    - CAAT.Foundation.Scene.EASE_TRANSLATE -
    -
    -
    <private>   - -
    Behavior container used uniquely for Scene switching.
    -
    <private>   - -
    Array of container behaviour events observer.
    -
    <private>   -
    - easeIn -
    -
    When Scene switching, this boolean identifies whether the Scene is being brought in, or taken away.
    -
    <private>   -
    - paused -
    -
    is this scene paused ?
    -
    <private>   - -
    This scene´s timer manager.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.ActorContainer:
    activeChildren, addHint, boundingBox, childrenList, layoutInvalidated, layoutManager, pendingChildrenList, runion
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      - -
    This method should be overriden in case the developer wants to do some special actions when -the scene has just been brought in.
    -
      -
    addActorToInputList(actor, index, position) -
    -
    Add an actor to a given inputList.
    -
      -
    addBehavior(behaviour) -
    -
    Overriden method to disallow default behavior.
    -
      -
    behaviorExpired(actor) -
    -
    Private.
    -
    <private>   -
    createAlphaBehaviour(time, isIn) -
    -
    Helper method to manage alpha transparency fading on Scene switch by the Director.
    -
      -
    createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel) -
    -
    -
      -
    easeRotation(time, alpha, anchor, interpolator, isIn) -
    -
    Called from CAAT.Director to use Rotations for taking away or bringing Scenes in.
    -
      -
    easeRotationIn(time, alpha, anchor, interpolator) -
    -
    Called from CAAT.Director to use Rotations for bringing in.
    -
      -
    easeRotationOut(time, alpha, anchor, interpolator) -
    -
    Called from CAAT.Director to use Rotations for taking Scenes away.
    -
      -
    easeScale(time, alpha, anchor, interpolator, starttime, isIn) -
    -
    Called from CAAT.Foundation.Director to bring in ot take away an Scene.
    -
      -
    easeScaleIn(time, alpha, anchor, interpolator, starttime) -
    -
    Called from CAAT.Foundation.Director to bring in a Scene.
    -
      -
    easeScaleOut(time, alpha, anchor, interpolator, starttime) -
    -
    Called from CAAT.Foundation.Director to take away a Scene.
    -
      -
    easeTranslation(time, alpha, anchor, isIn, interpolator) -
    -
    This method will setup Scene behaviours to switch an Scene via a translation.
    -
      -
    easeTranslationIn(time, alpha, anchor, interpolator) -
    -
    Called from CAAT.Director to bring in an Scene.
    -
      -
    easeTranslationOut(time, alpha, anchor, interpolator) -
    -
    Called from CAAT.Director to bring in an Scene.
    -
      -
    emptyInputList(index) -
    -
    Remove all elements from an input list.
    -
      - -
    Enable a number of input lists.
    -
      - -
    Find a pointed actor at position point.
    -
      -
    getIn(out_scene) -
    -
    -
      -
    goOut(in_scene) -
    -
    -
      - -
    -
      -
    paint(director, time) -
    -
    An scene by default does not paint anything because has not fillStyle set.
    -
      -
    removeActorFromInputList(actor, index) -
    -
    remove an actor from a given input list index.
    -
      -
    setEaseListener(listener) -
    -
    Registers a listener for listen for transitions events.
    -
      -
    setExpired(bExpired) -
    -
    Scenes, do not expire the same way Actors do.
    -
      -
    setPaused(paused) -
    -
    -
      -
    setTimeout(duration, callback_timeout, callback_tick, callback_cancel) -
    -
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.ActorContainer:
    __paintActor, __validateLayout, __validateTree, addActor, addActorImmediately, addChild, addChildAt, addChildDelayed, addChildImmediately, animate, destroy, drawScreenBoundingBox, emptyChildren, endAnimate, findActorById, findChild, getChildAt, getLayout, getNumActiveChildren, getNumChildren, invalidateLayout, paintActor, paintActorGL, recalcSize, removeChild, removeChildAt, removeFirstChild, removeLastChild, setBounds, setLayout, setZOrder
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, emptyBehaviorList, enableDrag, enableEvents, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.Scene() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.Foundation.Scene.EASE_ROTATION - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Scene.EASE_SCALE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.Scene.EASE_TRANSLATE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <private> - - - easeContainerBehaviour - -
    -
    - Behavior container used uniquely for Scene switching. - - -
    - - - - - - - - -
    - - -
    <private> - - - easeContainerBehaviourListener - -
    -
    - Array of container behaviour events observer. - - -
    - - - - - - - - -
    - - -
    <private> - - - easeIn - -
    -
    - When Scene switching, this boolean identifies whether the Scene is being brought in, or taken away. - - -
    - - - - - - - - -
    - - -
    <private> - - - paused - -
    -
    - is this scene paused ? - - -
    - - - - - - - - -
    - - -
    <private> - - - timerManager - -
    -
    - This scene´s timer manager. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - activated() - -
    -
    - This method should be overriden in case the developer wants to do some special actions when -the scene has just been brought in. - - -
    - - - - - - - - - - - -
    - - -
    - - - addActorToInputList(actor, index, position) - -
    -
    - Add an actor to a given inputList. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    an actor instance
    - -
    - index - -
    -
    the inputList index to add the actor to. This value will be clamped to the number of -available lists.
    - -
    - position - -
    -
    the position on the selected inputList to add the actor at. This value will be -clamped to the number of available lists.
    - -
    - - - - - - - - -
    - - -
    - - - addBehavior(behaviour) - -
    -
    - Overriden method to disallow default behavior. -Do not use directly. - - -
    - - - - -
    -
    Parameters:
    - -
    - behaviour - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - behaviorExpired(actor) - -
    -
    - Private. -listener for the Scene's easeContainerBehaviour. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - createAlphaBehaviour(time, isIn) - -
    -
    - Helper method to manage alpha transparency fading on Scene switch by the Director. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} time in milliseconds then fading will taableIne.
    - -
    - isIn - -
    -
    {boolean} whether this Scene is being brought in.
    - -
    - - - - - - - - -
    - - -
    - - - createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - startTime - -
    -
    - -
    - duration - -
    -
    - -
    - callback_timeout - -
    -
    - -
    - callback_tick - -
    -
    - -
    - callback_cancel - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - easeRotation(time, alpha, anchor, interpolator, isIn) - -
    -
    - Called from CAAT.Director to use Rotations for taking away or bringing Scenes in. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    integer indicating time in milliseconds for the Scene to be taken away or brought in.
    - -
    - alpha - -
    -
    boolean indicating whether fading will be applied to the Scene.
    - -
    - anchor - -
    -
    integer indicating the Scene switch anchor.
    - -
    - interpolator - -
    -
    {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    - -
    - isIn - -
    -
    boolean indicating whehter the Scene is brought in.
    - -
    - - - - - - - - -
    - - -
    - - - easeRotationIn(time, alpha, anchor, interpolator) - -
    -
    - Called from CAAT.Director to use Rotations for bringing in. -This method is a Helper for the method easeRotation. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    integer indicating time in milliseconds for the Scene to be brought in.
    - -
    - alpha - -
    -
    boolean indicating whether fading will be applied to the Scene.
    - -
    - anchor - -
    -
    integer indicating the Scene switch anchor.
    - -
    - interpolator - -
    -
    {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    - -
    - - - - - - - - -
    - - -
    - - - easeRotationOut(time, alpha, anchor, interpolator) - -
    -
    - Called from CAAT.Director to use Rotations for taking Scenes away. -This method is a Helper for the method easeRotation. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    integer indicating time in milliseconds for the Scene to be taken away.
    - -
    - alpha - -
    -
    boolean indicating whether fading will be applied to the Scene.
    - -
    - anchor - -
    -
    integer indicating the Scene switch anchor.
    - -
    - interpolator - -
    -
    {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    - -
    - - - - - - - - -
    - - -
    - - - easeScale(time, alpha, anchor, interpolator, starttime, isIn) - -
    -
    - Called from CAAT.Foundation.Director to bring in ot take away an Scene. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} time in milliseconds for the Scene to be brought in.
    - -
    - alpha - -
    -
    {boolean} whether fading will be applied to the Scene.
    - -
    - anchor - -
    -
    {number} Scene switch anchor.
    - -
    - interpolator - -
    -
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    - -
    - starttime - -
    -
    {number} scene time milliseconds from which the behavior will be applied.
    - -
    - isIn - -
    -
    boolean indicating whether the Scene is being brought in.
    - -
    - - - - - - - - -
    - - -
    - - - easeScaleIn(time, alpha, anchor, interpolator, starttime) - -
    -
    - Called from CAAT.Foundation.Director to bring in a Scene. -A helper method for easeScale. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} time in milliseconds for the Scene to be brought in.
    - -
    - alpha - -
    -
    {boolean} whether fading will be applied to the Scene.
    - -
    - anchor - -
    -
    {number} Scene switch anchor.
    - -
    - interpolator - -
    -
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    - -
    - starttime - -
    -
    {number} scene time milliseconds from which the behavior will be applied.
    - -
    - - - - - - - - -
    - - -
    - - - easeScaleOut(time, alpha, anchor, interpolator, starttime) - -
    -
    - Called from CAAT.Foundation.Director to take away a Scene. -A helper method for easeScale. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} time in milliseconds for the Scene to be brought in.
    - -
    - alpha - -
    -
    {boolean} whether fading will be applied to the Scene.
    - -
    - anchor - -
    -
    {number} Scene switch anchor.
    - -
    - interpolator - -
    -
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    - -
    - starttime - -
    -
    {number} scene time milliseconds from which the behavior will be applied.
    - -
    - - - - - - - - -
    - - -
    - - - easeTranslation(time, alpha, anchor, isIn, interpolator) - -
    -
    - This method will setup Scene behaviours to switch an Scene via a translation. -The anchor value can only be -
  389. CAAT.Actor.ANCHOR_LEFT -
  390. CAAT.Actor.ANCHOR_RIGHT -
  391. CAAT.Actor.ANCHOR_TOP -
  392. CAAT.Actor.ANCHOR_BOTTOM -if any other value is specified, any of the previous ones will be applied. - - -
  393. - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} time in milliseconds for the Scene.
    - -
    - alpha - -
    -
    {boolean} whether fading will be applied to the Scene.
    - -
    - anchor - -
    -
    {numnber} Scene switch anchor.
    - -
    - isIn - -
    -
    {boolean} whether the scene will be brought in.
    - -
    - interpolator - -
    -
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    - -
    - - - - - - - - -
    - - -
    - - - easeTranslationIn(time, alpha, anchor, interpolator) - -
    -
    - Called from CAAT.Director to bring in an Scene. -A helper method for easeTranslation. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} time in milliseconds for the Scene to be brought in.
    - -
    - alpha - -
    -
    {boolean} whether fading will be applied to the Scene.
    - -
    - anchor - -
    -
    {number} Scene switch anchor.
    - -
    - interpolator - -
    -
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    - -
    - - - - - - - - -
    - - -
    - - - easeTranslationOut(time, alpha, anchor, interpolator) - -
    -
    - Called from CAAT.Director to bring in an Scene. -A helper method for easeTranslation. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} time in milliseconds for the Scene to be taken away.
    - -
    - alpha - -
    -
    {boolean} fading will be applied to the Scene.
    - -
    - anchor - -
    -
    {number} Scene switch anchor.
    - -
    - interpolator - -
    -
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    - -
    - - - - - - - - -
    - - -
    - - - emptyInputList(index) - -
    -
    - Remove all elements from an input list. - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    the inputList index to add the actor to. This value will be clamped to the number of -available lists so take care when emptying a non existant inputList index since you could end up emptying -an undesired input list.
    - -
    - - - - - - - - -
    - - -
    - - - enableInputList(size) - -
    -
    - Enable a number of input lists. -These lists are set in case the developer doesn't want the to traverse the scene graph to find the pointed -actor. The lists are a shortcut whete the developer can set what actors to look for input at first instance. -The system will traverse the whole lists in order trying to find a pointed actor. - -Elements are added to each list either in head or tail. - - -
    - - - - -
    -
    Parameters:
    - -
    - size - -
    -
    number of lists.
    - -
    - - - - - - - - -
    - - -
    - - - findActorAtPosition(point) - -
    -
    - Find a pointed actor at position point. -This method tries lo find the correctly pointed actor in two different ways. - + first of all, if inputList is defined, it will look for an actor in it. - + if no inputList is defined, it will traverse the scene graph trying to find a pointed actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getIn(out_scene) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - out_scene - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - goOut(in_scene) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - in_scene - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - isPaused() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - paint(director, time) - -
    -
    - An scene by default does not paint anything because has not fillStyle set. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - removeActorFromInputList(actor, index) - -
    -
    - remove an actor from a given input list index. -If no index is supplied, the actor will be removed from every input list. - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    - -
    - index - -
    -
    an optional input list index. This value will be clamped to the number of -available lists.
    - -
    - - - - - - - - -
    - - -
    - - - setEaseListener(listener) - -
    -
    - Registers a listener for listen for transitions events. -Al least, the Director registers himself as Scene easing transition listener. -When the transition is done, it restores the Scene's capability of receiving events. - - -
    - - - - -
    -
    Parameters:
    - -
    - listener - -
    -
    {function(caat_behavior,time,actor)} an object which contains a method of the form -behaviorExpired( caat_behaviour, time, actor);
    - -
    - - - - - - - - -
    - - -
    - - - setExpired(bExpired) - -
    -
    - Scenes, do not expire the same way Actors do. -It simply will be set expired=true, but the frameTime won't be modified. - - -
    - - - - -
    -
    Parameters:
    - -
    - bExpired - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPaused(paused) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - paused - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setTimeout(duration, callback_timeout, callback_tick, callback_cancel) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - duration - -
    -
    - -
    - callback_timeout - -
    -
    - -
    - callback_tick - -
    -
    - -
    - callback_cancel - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:43 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImage.html b/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImage.html deleted file mode 100644 index c33e3053..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImage.html +++ /dev/null @@ -1,4134 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.SpriteImage - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.SpriteImage -

    - - -

    - - - - - - -
    Defined in: SpriteImage.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    an Array defining the sprite frame sequence
    -
      - -
    This property allows to have multiple different animations defined for one actor.
    -
      -
    - callback -
    -
    When an animation sequence ends, this callback function will be called.
    -
      -
    - changeFPS -
    -
    how much Scene time to take before changing an Sprite frame.
    -
      -
    - columns -
    -
    Number of columns.
    -
      - -
    current animation name
    -
      -
    - fontScale -
    -
    pending: refactor -> font scale to a font object.
    -
      -
    - height -
    -
    This sprite image image´s width
    -
      -
    - image -
    -
    Image to get frames from.
    -
      -
    - map -
    -
    If the sprite image is defined out of a JSON object (sprite packer for example), this is -the subimages original definition map.
    -
      -
    - mapInfo -
    -
    If the sprite image is defined out of a JSON object (sprite packer for example), this is -the subimages calculated definition map.
    -
      -
    - offsetX -
    -
    Displacement offset to get the sub image from.
    -
      -
    - offsetY -
    -
    Displacement offset to get the sub image from.
    -
      - -
    The actor this sprite image belongs to.
    -
      - -
    When nesting sprite images, this value is the star X position of this sprite image in the parent.
    -
      - -
    When nesting sprite images, this value is the star Y position of this sprite image in the parent.
    -
      - -
    Previous animation frame time.
    -
      -
    - prevIndex -
    -
    current index of sprite frames array.
    -
      -
    - rows -
    -
    Number of rows
    -
      - -
    For each element in the sprite image array, its height.
    -
      - -
    For each element in the sprite image array, its size.
    -
      - -
    the current sprite frame
    -
    <static>   -
    - CAAT.Foundation.SpriteImage.TR_FIXED_TO_SIZE -
    -
    -
    <static>   -
    - CAAT.Foundation.SpriteImage.TR_FIXED_WIDTH_TO_SIZE -
    -
    -
    <static>   -
    - CAAT.Foundation.SpriteImage.TR_FLIP_ALL -
    -
    -
    <static>   -
    - CAAT.Foundation.SpriteImage.TR_FLIP_HORIZONTAL -
    -
    -
    <static>   -
    - CAAT.Foundation.SpriteImage.TR_FLIP_VERTICAL -
    -
    -
    <static>   -
    - CAAT.Foundation.SpriteImage.TR_NONE -
    -
    -
    <static>   -
    - CAAT.Foundation.SpriteImage.TR_TILE -
    -
    -
      - -
    any of the TR_* constants.
    -
      -
    - width -
    -
    This sprite image image´s width
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    addAnimation(name, array, time, callback) -
    -
    Add an animation to this sprite image.
    -
      -
    addElement(key, value) -
    -
    Add one element to the spriteImage.
    -
      - -
    Create elements as director.getImage values.
    -
      -
    copy(other) -
    -
    -
      -
    drawText(str, ctx, x, y) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    getMapInfo(index) -
    -
    -
      - -
    Get the number of subimages in this compoundImage
    -
      - -
    -
      -
    getRef() -
    -
    Get a reference to the same image information (rows, columns, image and uv cache) of this -SpriteImage.
    -
      -
    getRows() -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    initialize(image, rows, columns) -
    -
    Initialize a grid of subimages out of a given image.
    -
      -
    initializeAsFontMap(image, chars) -
    -
    -
      - -
    -
      - -
    This method creates a font sprite image based on a proportional font -It assumes the font is evenly spaced in the image -Example: -var font = new CAAT.SpriteImage().initializeAsMonoTypeFontMap( - director.getImage('numbers'), - "0123456789" -);
    -
      - -
    -
      -
    initializeFromMap(image, map) -
    -
    This method takes the output generated from the tool at http://labs.hyperandroid.com/static/texture/spriter.html -and creates a map into that image.
    -
      - -
    -
      -
    paintAtRect(director, time, x, y, w, h) -
    -
    -
      -
    paintChunk(ctx, dx, dy, x, y, w, h) -
    -
    -
      -
    paintInvertedH(director, time, x, y) -
    -
    Draws the subimage pointed by imageIndex horizontally inverted.
    -
      -
    paintInvertedHV(director, time, x, y) -
    -
    Draws the subimage pointed by imageIndex both horizontal and vertically inverted.
    -
      -
    paintInvertedV(director, time, x, y) -
    -
    Draws the subimage pointed by imageIndex vertically inverted.
    -
      -
    paintN(director, time, x, y) -
    -
    Draws the subimage pointed by imageIndex.
    -
      -
    paintScaled(director, time, x, y) -
    -
    Draws the subimage pointed by imageIndex scaled to the size of w and h.
    -
      -
    paintScaledWidth(director, time, x, y) -
    -
    Draws the subimage pointed by imageIndex.
    -
      -
    paintTile(ctx, index, x, y) -
    -
    -
      -
    paintTiled(director, time, x, y) -
    -
    Must be used to draw actor background and the actor should have setClip(true) so that the image tiles -properly.
    -
      -
    playAnimation(name) -
    -
    Start playing a SpriteImage animation.
    -
      - -
    -
      - -
    -
      -
    setAnimationImageIndex(aAnimationImageIndex) -
    -
    Set the sprite animation images index.
    -
      -
    setChangeFPS(fps) -
    -
    Set the elapsed time needed to change the image index.
    -
      -
    setOffset(x, y) -
    -
    -
      - -
    Set horizontal displacement to draw image.
    -
      - -
    Set vertical displacement to draw image.
    -
      -
    setOwner(actor) -
    -
    -
      -
    setSpriteIndex(index) -
    -
    -
      - -
    Draws the sprite image calculated and stored in spriteIndex.
    -
      -
    setSpriteTransformation(transformation) -
    -
    Set the transformation to apply to the Sprite image.
    -
      -
    setUV(uvBuffer, uvIndex) -
    -
    -
      - -
    -
      -
    stringWidth(str) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.SpriteImage() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - animationImageIndex - -
    -
    - an Array defining the sprite frame sequence - - -
    - - - - - - - - -
    - - -
    - - - animationsMap - -
    -
    - This property allows to have multiple different animations defined for one actor. -see demo31 for a sample. - - -
    - - - - - - - - -
    - - -
    - - - callback - -
    -
    - When an animation sequence ends, this callback function will be called. - - -
    - - - - - - - - -
    - - -
    - - - changeFPS - -
    -
    - how much Scene time to take before changing an Sprite frame. - - -
    - - - - - - - - -
    - - -
    - - - columns - -
    -
    - Number of columns. - - -
    - - - - - - - - -
    - - -
    - - - currentAnimation - -
    -
    - current animation name - - -
    - - - - - - - - -
    - - -
    - - - fontScale - -
    -
    - pending: refactor -> font scale to a font object. - - -
    - - - - - - - - -
    - - -
    - - - height - -
    -
    - This sprite image image´s width - - -
    - - - - - - - - -
    - - -
    - - - image - -
    -
    - Image to get frames from. - - -
    - - - - - - - - -
    - - -
    - - - map - -
    -
    - If the sprite image is defined out of a JSON object (sprite packer for example), this is -the subimages original definition map. - - -
    - - - - - - - - -
    - - -
    - - - mapInfo - -
    -
    - If the sprite image is defined out of a JSON object (sprite packer for example), this is -the subimages calculated definition map. - - -
    - - - - - - - - -
    - - -
    - - - offsetX - -
    -
    - Displacement offset to get the sub image from. Useful to make images shift. - - -
    - - - - - - - - -
    - - -
    - - - offsetY - -
    -
    - Displacement offset to get the sub image from. Useful to make images shift. - - -
    - - - - - - - - -
    - - -
    - - - ownerActor - -
    -
    - The actor this sprite image belongs to. - - -
    - - - - - - - - -
    - - -
    - - - parentOffsetX - -
    -
    - When nesting sprite images, this value is the star X position of this sprite image in the parent. - - -
    - - - - - - - - -
    - - -
    - - - parentOffsetY - -
    -
    - When nesting sprite images, this value is the star Y position of this sprite image in the parent. - - -
    - - - - - - - - -
    - - -
    - - - prevAnimationTime - -
    -
    - Previous animation frame time. - - -
    - - - - - - - - -
    - - -
    - - - prevIndex - -
    -
    - current index of sprite frames array. - - -
    - - - - - - - - -
    - - -
    - - - rows - -
    -
    - Number of rows - - -
    - - - - - - - - -
    - - -
    - - - singleHeight - -
    -
    - For each element in the sprite image array, its height. - - -
    - - - - - - - - -
    - - -
    - - - singleWidth - -
    -
    - For each element in the sprite image array, its size. - - -
    - - - - - - - - -
    - - -
    - - - spriteIndex - -
    -
    - the current sprite frame - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.SpriteImage.TR_FIXED_TO_SIZE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.SpriteImage.TR_FIXED_WIDTH_TO_SIZE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.SpriteImage.TR_FLIP_ALL - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.SpriteImage.TR_FLIP_HORIZONTAL - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.SpriteImage.TR_FLIP_VERTICAL - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.SpriteImage.TR_NONE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.SpriteImage.TR_TILE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - transformation - -
    -
    - any of the TR_* constants. - - -
    - - - - - - - - -
    - - -
    - - - width - -
    -
    - This sprite image image´s width - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - addAnimation(name, array, time, callback) - -
    -
    - Add an animation to this sprite image. -An animation is defines by an array of pretend-to-be-played sprite sequence. - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    {string} animation name.
    - -
    - array - -
    -
    {Array} the sprite animation sequence array. It can be defined - as number array for Grid-like sprite images or strings for a map-like sprite - image.
    - -
    - time - -
    -
    {number} change animation sequence every 'time' ms.
    - -
    - callback - -
    -
    {function({SpriteImage},{string}} a callback function to invoke when the sprite - animation sequence has ended.
    - -
    - - - - - - - - -
    - - -
    - - {*} - addElement(key, value) - -
    -
    - Add one element to the spriteImage. - - -
    - - - - -
    -
    Parameters:
    - -
    - key - -
    -
    {string|number} index or sprite identifier.
    - -
    - value - -
    -
    object{ - x: {number}, - y: {number}, - width: {number}, - height: {number}, - xoffset: {number=}, - yoffset: {number=}, - xadvance: {number=} - }
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - addElementsAsImages(prefix) - -
    -
    - Create elements as director.getImage values. -Create as much as elements defined in this sprite image. -The elements will be named prefix+ - - -
    - - - - -
    -
    Parameters:
    - -
    - prefix - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - copy(other) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - other - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - drawText(str, ctx, x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - str - -
    -
    - -
    - ctx - -
    -
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getColumns() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getCurrentSpriteImageCSSPosition() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getFontData() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getHeight() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getMapInfo(index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {number} - getNumImages() - -
    -
    - Get the number of subimages in this compoundImage - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - getOwnerActor() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getRef() - -
    -
    - Get a reference to the same image information (rows, columns, image and uv cache) of this -SpriteImage. This means that re-initializing this objects image info (that is, calling initialize -method) will change all reference's image information at the same time. - - -
    - - - - - - - - - - - -
    - - -
    - - - getRows() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getWidth() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getWrappedImageHeight() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getWrappedImageWidth() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - initialize(image, rows, columns) - -
    -
    - Initialize a grid of subimages out of a given image. - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    {HTMLImageElement|Image} an image object.
    - -
    - rows - -
    -
    {number} number of rows.
    - -
    - columns - -
    -
    {number} number of columns
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - initializeAsFontMap(image, chars) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    - -
    - chars - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - initializeAsGlyphDesigner(image, map) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    {Image|HTMLImageElement|Canvas}
    - -
    - map - -
    -
    object with pairs "" : { - id : {number}, - height : {number}, - xoffset : {number}, - letter : {string}, - yoffset : {number}, - width : {number}, - xadvance: {number}, - y : {number}, - x : {number} - }
    - -
    - - - - - - - - -
    - -
    -
    - - - initializeAsMonoTypeFontMap(image, chars) - -
    -
    - This method creates a font sprite image based on a proportional font -It assumes the font is evenly spaced in the image -Example: -var font = new CAAT.SpriteImage().initializeAsMonoTypeFontMap( - director.getImage('numbers'), - "0123456789" -); - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    - -
    - chars - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - initializeFromGlyphDesigner(text) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - text - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - initializeFromMap(image, map) - -
    -
    - This method takes the output generated from the tool at http://labs.hyperandroid.com/static/texture/spriter.html -and creates a map into that image. - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    {Image|HTMLImageElement|Canvas} an image
    - -
    - map - -
    -
    {object} the map into the image to define subimages.
    - -
    - - - - - - - - -
    - - -
    - - - initializeFromTexturePackerJSON(image, obj) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    - -
    - obj - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - paintAtRect(director, time, x, y, w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - paintChunk(ctx, dx, dy, x, y, w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    - -
    - dx - -
    -
    - -
    - dy - -
    -
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - paintInvertedH(director, time, x, y) - -
    -
    - Draws the subimage pointed by imageIndex horizontally inverted. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Foundation.Director}
    - -
    - time - -
    -
    {number} scene time.
    - -
    - x - -
    -
    {number} x position in canvas to draw the image.
    - -
    - y - -
    -
    {number} y position in canvas to draw the image.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - paintInvertedHV(director, time, x, y) - -
    -
    - Draws the subimage pointed by imageIndex both horizontal and vertically inverted. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Foundation.Director}
    - -
    - time - -
    -
    {number} scene time.
    - -
    - x - -
    -
    {number} x position in canvas to draw the image.
    - -
    - y - -
    -
    {number} y position in canvas to draw the image.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - paintInvertedV(director, time, x, y) - -
    -
    - Draws the subimage pointed by imageIndex vertically inverted. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Foundation.Director}
    - -
    - time - -
    -
    {number} scene time.
    - -
    - x - -
    -
    {number} x position in canvas to draw the image.
    - -
    - y - -
    -
    {number} y position in canvas to draw the image.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - paintN(director, time, x, y) - -
    -
    - Draws the subimage pointed by imageIndex. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Foundation.Director}
    - -
    - time - -
    -
    {number} scene time.
    - -
    - x - -
    -
    {number} x position in canvas to draw the image.
    - -
    - y - -
    -
    {number} y position in canvas to draw the image.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - paintScaled(director, time, x, y) - -
    -
    - Draws the subimage pointed by imageIndex scaled to the size of w and h. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Foundation.Director}
    - -
    - time - -
    -
    {number} scene time.
    - -
    - x - -
    -
    {number} x position in canvas to draw the image.
    - -
    - y - -
    -
    {number} y position in canvas to draw the image.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - paintScaledWidth(director, time, x, y) - -
    -
    - Draws the subimage pointed by imageIndex. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Foundation.Director}
    - -
    - time - -
    -
    {number} scene time.
    - -
    - x - -
    -
    {number} x position in canvas to draw the image.
    - -
    - y - -
    -
    {number} y position in canvas to draw the image.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - paintTile(ctx, index, x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    - -
    - index - -
    -
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - paintTiled(director, time, x, y) - -
    -
    - Must be used to draw actor background and the actor should have setClip(true) so that the image tiles -properly. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - playAnimation(name) - -
    -
    - Start playing a SpriteImage animation. -If it does not exist, nothing happens. - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - resetAnimationTime() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - setAnimationEndCallback(f) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - f - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setAnimationImageIndex(aAnimationImageIndex) - -
    -
    - Set the sprite animation images index. This method accepts an array of objects which define indexes to -subimages inside this sprite image. -If the SpriteImage is instantiated by calling the method initialize( image, rows, cols ), the value of -aAnimationImageIndex should be an array of numbers, which define the indexes into an array of subimages -with size rows*columns. -If the method InitializeFromMap( image, map ) is called, the value for aAnimationImageIndex is expected -to be an array of strings which are the names of the subobjects contained in the map object. - - -
    - - - - -
    -
    Parameters:
    - -
    - aAnimationImageIndex - -
    -
    an array indicating the Sprite's frames.
    - -
    - - - - - - - - -
    - - -
    - - - setChangeFPS(fps) - -
    -
    - Set the elapsed time needed to change the image index. - - -
    - - - - -
    -
    Parameters:
    - -
    - fps - -
    -
    an integer indicating the time in milliseconds to change.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setOffset(x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setOffsetX(x) - -
    -
    - Set horizontal displacement to draw image. Positive values means drawing the image more to the -right. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setOffsetY(y) - -
    -
    - Set vertical displacement to draw image. Positive values means drawing the image more to the -bottom. - - -
    - - - - -
    -
    Parameters:
    - -
    - y - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setOwner(actor) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setSpriteIndex(index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setSpriteIndexAtTime(time) - -
    -
    - Draws the sprite image calculated and stored in spriteIndex. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} Scene time when the bounding box is to be drawn.
    - -
    - - - - - - - - -
    - - -
    - - - setSpriteTransformation(transformation) - -
    -
    - Set the transformation to apply to the Sprite image. -Any value of -
  394. TR_NONE -
  395. TR_FLIP_HORIZONTAL -
  396. TR_FLIP_VERTICAL -
  397. TR_FLIP_ALL - - -
  398. - - - - -
    -
    Parameters:
    - -
    - transformation - -
    -
    an integer indicating one of the previous values.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setUV(uvBuffer, uvIndex) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - uvBuffer - -
    -
    - -
    - uvIndex - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - stringHeight() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - stringWidth(str) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - str - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageAnimationHelper.html b/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageAnimationHelper.html deleted file mode 100644 index 330c10da..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageAnimationHelper.html +++ /dev/null @@ -1,744 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.SpriteImageAnimationHelper - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.SpriteImageAnimationHelper -

    - - -

    - - - - - - -
    Defined in: SpriteImageAnimationHelper.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    Define an animation frame sequence, name it and supply with a callback which be called when the -sequence ends playing.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - animation -
    -
    A sequence of integer values defining a frame animation.
    -
      - -
    Call this callback function when the sequence ends.
    -
      -
    - time -
    -
    Time between any two animation frames.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(animation, time, onEndPlayCallback) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.SpriteImageAnimationHelper() -
    - -
    - Define an animation frame sequence, name it and supply with a callback which be called when the -sequence ends playing. - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - animation - -
    -
    - A sequence of integer values defining a frame animation. -For example [1,2,3,4,3,2,3,4,3,2] -Array. - - -
    - - - - - - - - -
    - - -
    - - - onEndPlayCallback - -
    -
    - Call this callback function when the sequence ends. - - -
    - - - - - - - - -
    - - -
    - - - time - -
    -
    - Time between any two animation frames. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(animation, time, onEndPlayCallback) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - animation - -
    -
    - -
    - time - -
    -
    - -
    - onEndPlayCallback - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageHelper.html b/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageHelper.html deleted file mode 100644 index 9a8bf499..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageHelper.html +++ /dev/null @@ -1,702 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.SpriteImageHelper - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.SpriteImageHelper -

    - - -

    - - - - - - -
    Defined in: SpriteImageHelper.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    Define a drawable sub-image inside a bigger image as an independant drawable item.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(x, y, w, h, iw, ih) -
    -
    -
      -
    setGL(u, v, u1, v1) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.SpriteImageHelper() -
    - -
    - Define a drawable sub-image inside a bigger image as an independant drawable item. - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(x, y, w, h, iw, ih) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - iw - -
    -
    - -
    - ih - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setGL(u, v, u1, v1) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - u - -
    -
    - -
    - v - -
    -
    - -
    - u1 - -
    -
    - -
    - v1 - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerManager.html b/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerManager.html deleted file mode 100644 index f56efbb4..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerManager.html +++ /dev/null @@ -1,953 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.Timer.TimerManager - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.Timer.TimerManager -

    - - -

    - - - - - - -
    Defined in: TimerManager.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   -
    - timerList -
    -
    Collection of registered timers.
    -
    <private>   - -
    Index sequence to idenfity registered timers.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    checkTimers(time) -
    -
    Check and apply timers in frame time.
    -
      -
    createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel, scene) -
    -
    Creates a timer task.
    -
      -
    ensureTimerTask(timertask) -
    -
    Make sure the timertask is contained in the timer task list by adding it to the list in case it -is not contained.
    -
      -
    hasTimer(timertask) -
    -
    Check whether the timertask is in this scene's timer task list.
    -
      - -
    Removes expired timers.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.Timer.TimerManager() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - timerList - -
    -
    - Collection of registered timers. - - -
    - - - - - - - - -
    - - -
    <private> - - - timerSequence - -
    -
    - Index sequence to idenfity registered timers. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - checkTimers(time) - -
    -
    - Check and apply timers in frame time. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} the current Scene time.
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.TimerTask} - createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel, scene) - -
    -
    - Creates a timer task. Timertask object live and are related to scene's time, so when an Scene -is taken out of the Director the timer task is paused, and resumed on Scene restoration. - - -
    - - - - -
    -
    Parameters:
    - -
    - startTime - -
    -
    {number} an integer indicating the scene time this task must start executing at.
    - -
    - duration - -
    -
    {number} an integer indicating the timerTask duration.
    - -
    - callback_timeout - -
    -
    {function} timer on timeout callback function.
    - -
    - callback_tick - -
    -
    {function} timer on tick callback function.
    - -
    - callback_cancel - -
    -
    {function} timer on cancel callback function.
    - -
    - scene - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.TimerTask} a CAAT.TimerTask class instance.
    - -
    - - - - -
    - - -
    - - - ensureTimerTask(timertask) - -
    -
    - Make sure the timertask is contained in the timer task list by adding it to the list in case it -is not contained. - - -
    - - - - -
    -
    Parameters:
    - -
    - timertask - -
    -
    {CAAT.Foundation.Timer.TimerTask}.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {boolean} - hasTimer(timertask) - -
    -
    - Check whether the timertask is in this scene's timer task list. - - -
    - - - - -
    -
    Parameters:
    - -
    - timertask - -
    -
    {CAAT.Foundation.Timer.TimerTask}.
    - -
    - - - - - -
    -
    Returns:
    - -
    {boolean} a boolean indicating whether the timertask is in this scene or not.
    - -
    - - - - -
    - - -
    - - - removeExpiredTimers() - -
    -
    - Removes expired timers. This method must not be called directly. - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerTask.html b/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerTask.html deleted file mode 100644 index 8d8d79a9..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerTask.html +++ /dev/null @@ -1,1178 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.Timer.TimerTask - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.Timer.TimerTask -

    - - -

    - - - - - - -
    Defined in: TimerTask.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    This callback will be called when the timer is cancelled.
    -
      - -
    This callback will be called whenever the timer is checked in time.
    -
      - -
    This callback will be called only once, when the timer expires.
    -
      -
    - duration -
    -
    Timer duration.
    -
      -
    - owner -
    -
    What TimerManager instance owns this task.
    -
      -
    - remove -
    -
    Remove this timer task on expiration/cancellation ?
    -
      -
    - scene -
    -
    Scene or director instance that owns this TimerTask owner.
    -
      -
    - startTime -
    -
    Timer start time.
    -
      -
    - taskId -
    -
    An arbitrry id.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    addTime(time) -
    -
    -
      -
    cancel() -
    -
    Cancels this timer by removing it on scene's next frame.
    -
      -
    checkTask(time) -
    -
    Performs TimerTask operation.
    -
      -
    create(startTime, duration, callback_timeout, callback_tick, callback_cancel) -
    -
    Create a TimerTask.
    -
      - -
    -
      -
    reset(time) -
    -
    Reschedules this TimerTask by changing its startTime to current scene's time.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.Timer.TimerTask() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - callback_cancel - -
    -
    - This callback will be called when the timer is cancelled. - - -
    - - - - - - - - -
    - - -
    - - - callback_tick - -
    -
    - This callback will be called whenever the timer is checked in time. - - -
    - - - - - - - - -
    - - -
    - - - callback_timeout - -
    -
    - This callback will be called only once, when the timer expires. - - -
    - - - - - - - - -
    - - -
    - - - duration - -
    -
    - Timer duration. - - -
    - - - - - - - - -
    - - -
    - - - owner - -
    -
    - What TimerManager instance owns this task. - - -
    - - - - - - - - -
    - - -
    - - - remove - -
    -
    - Remove this timer task on expiration/cancellation ? - - -
    - - - - - - - - -
    - - -
    - - - scene - -
    -
    - Scene or director instance that owns this TimerTask owner. - - -
    - - - - - - - - -
    - - -
    - - - startTime - -
    -
    - Timer start time. Relative to Scene or Director time, depending who owns this TimerTask. - - -
    - - - - - - - - -
    - - -
    - - - taskId - -
    -
    - An arbitrry id. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - - addTime(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - cancel() - -
    -
    - Cancels this timer by removing it on scene's next frame. The function callback_cancel will -be called. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - checkTask(time) - -
    -
    - Performs TimerTask operation. The task will check whether it is in frame time, and will -either notify callback_timeout or callback_tick. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} an integer indicating scene time.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - create(startTime, duration, callback_timeout, callback_tick, callback_cancel) - -
    -
    - Create a TimerTask. -The taskId will be set by the scene. - - -
    - - - - -
    -
    Parameters:
    - -
    - startTime - -
    -
    {number} an integer indicating TimerTask enable time.
    - -
    - duration - -
    -
    {number} an integer indicating TimerTask duration.
    - -
    - callback_timeout - -
    -
    {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on timeout callback function.
    - -
    - callback_tick - -
    -
    {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on tick callback function.
    - -
    - callback_cancel - -
    -
    {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on cancel callback function.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - remainingTime() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - reset(time) - -
    -
    - Reschedules this TimerTask by changing its startTime to current scene's time. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} an integer indicating scene time.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Timer.html b/documentation/jsdoc/symbols/CAAT.Foundation.Timer.html deleted file mode 100644 index 044b7431..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.Timer.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.Timer - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Foundation.Timer -

    - - -

    - - - - - - -
    Defined in: TimerManager.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Foundation.Timer -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Dock.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Dock.html deleted file mode 100644 index b0a2b587..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Dock.html +++ /dev/null @@ -1,1490 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.Dock - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.Dock -

    - - -

    - -
    Extends - CAAT.Foundation.ActorContainer.
    - - - - - -
    Defined in: Dock.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - layoutOp -
    -
    Any value from CAAT.Foundation.Dock.UI.OP_LAYOUT_*
    -
      -
    - maxSize -
    -
    max contained actor size
    -
      -
    - minSize -
    -
    min contained actor size.
    -
    <static>   -
    - CAAT.Foundation.UI.Dock.OP_LAYOUT_BOTTOM -
    -
    -
    <static>   -
    - CAAT.Foundation.UI.Dock.OP_LAYOUT_LEFT -
    -
    -
    <static>   -
    - CAAT.Foundation.UI.Dock.OP_LAYOUT_RIGHT -
    -
    -
    <static>   -
    - CAAT.Foundation.UI.Dock.OP_LAYOUT_TOP -
    -
    -
      -
    - range -
    -
    aproximated number of elements affected.
    -
      -
    - scene -
    -
    scene the actor is in.
    -
      -
    - ttask -
    -
    resetting dimension timer task.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.ActorContainer:
    activeChildren, addHint, boundingBox, childrenList, layoutInvalidated, layoutManager, pendingChildrenList, runion
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    actorMouseEnter(mouseEvent) -
    -
    Perform the beginning of docking elements.
    -
    <private>   -
    actorMouseExit(mouseEvent) -
    -
    Perform the process of exiting the docking element, that is, animate elements to the minimum -size.
    -
    <private>   - -
    Performs operation when the mouse is not in the dock element.
    -
    <private>   -
    actorPointed(x, y, pointedActor) -
    -
    Perform the process of pointing a docking actor.
    -
      -
    addChild(actor) -
    -
    Adds an actor to Dock.
    -
      -
    initialize(scene) -
    -
    -
    <private>   -
    layout() -
    -
    Lay out the docking elements.
    -
      -
    mouseExit(mouseEvent) -
    -
    -
      -
    mouseMove(mouseEvent) -
    -
    -
      - -
    Set the number of elements that will be affected (zoomed) when the mouse is inside the component.
    -
      - -
    Set layout orientation.
    -
      -
    setSizes(min, max) -
    -
    Set maximum and minimum size of docked elements.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.ActorContainer:
    __init, __paintActor, __validateLayout, __validateTree, addActor, addActorImmediately, addChildAt, addChildDelayed, addChildImmediately, animate, destroy, drawScreenBoundingBox, emptyChildren, endAnimate, findActorAtPosition, findActorById, findChild, getChildAt, getLayout, getNumActiveChildren, getNumChildren, invalidateLayout, paintActor, paintActorGL, recalcSize, removeChild, removeChildAt, removeFirstChild, removeLastChild, setBounds, setLayout, setZOrder
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, emptyBehaviorList, enableDrag, enableEvents, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseOut, mouseOver, mouseUp, moveTo, paint, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.Dock() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - layoutOp - -
    -
    - Any value from CAAT.Foundation.Dock.UI.OP_LAYOUT_* - - -
    - - - - - - - - -
    - - -
    - - - maxSize - -
    -
    - max contained actor size - - -
    - - - - - - - - -
    - - -
    - - - minSize - -
    -
    - min contained actor size. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.UI.Dock.OP_LAYOUT_BOTTOM - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.UI.Dock.OP_LAYOUT_LEFT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.UI.Dock.OP_LAYOUT_RIGHT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.UI.Dock.OP_LAYOUT_TOP - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - range - -
    -
    - aproximated number of elements affected. - - -
    - - - - - - - - -
    - - -
    - - - scene - -
    -
    - scene the actor is in. - - -
    - - - - - - - - -
    - - -
    - - - ttask - -
    -
    - resetting dimension timer task. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - actorMouseEnter(mouseEvent) - -
    -
    - Perform the beginning of docking elements. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.MouseEvent} a CAAT.MouseEvent object.
    - -
    - - - - - - - - -
    - - -
    <private> - - - actorMouseExit(mouseEvent) - -
    -
    - Perform the process of exiting the docking element, that is, animate elements to the minimum -size. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.MouseEvent} a CAAT.MouseEvent object.
    - -
    - - - - - - - - -
    - - -
    <private> - - - actorNotPointed() - -
    -
    - Performs operation when the mouse is not in the dock element. - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - actorPointed(x, y, pointedActor) - -
    -
    - Perform the process of pointing a docking actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number}
    - -
    - y - -
    -
    {number}
    - -
    - pointedActor - -
    -
    {CAAT.Actor}
    - -
    - - - - - - - - -
    - - -
    - - - addChild(actor) - -
    -
    - Adds an actor to Dock. -

    -Be aware that actor mouse functions must be set prior to calling this method. The Dock actor -needs set his own actor input events functions for mouseEnter, mouseExit and mouseMove and -will then chain to the original methods set by the developer. - - -

    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    {CAAT.Actor} a CAAT.Actor instance.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - initialize(scene) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - scene - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - layout() - -
    -
    - Lay out the docking elements. The lay out will be a row with the orientation set by calling -the method setLayoutOp. - - -
    - - - - - - - - - - - -
    - - -
    - - - mouseExit(mouseEvent) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseMove(mouseEvent) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setApplicationRange(range) - -
    -
    - Set the number of elements that will be affected (zoomed) when the mouse is inside the component. - - -
    - - - - -
    -
    Parameters:
    - -
    - range - -
    -
    {number} a number. Defaults to 2.
    - -
    - - - - - - - - -
    - - -
    - - - setLayoutOp(lo) - -
    -
    - Set layout orientation. Choose from -
      -
    • CAAT.Dock.OP_LAYOUT_BOTTOM -
    • CAAT.Dock.OP_LAYOUT_TOP -
    • CAAT.Dock.OP_LAYOUT_BOTTOM -
    • CAAT.Dock.OP_LAYOUT_RIGHT -
    -By default, the layou operation is OP_LAYOUT_BOTTOM, that is, elements zoom bottom anchored. - - -
    - - - - -
    -
    Parameters:
    - -
    - lo - -
    -
    {number} one of CAAT.Dock.OP_LAYOUT_BOTTOM, CAAT.Dock.OP_LAYOUT_TOP, -CAAT.Dock.OP_LAYOUT_BOTTOM, CAAT.Dock.OP_LAYOUT_RIGHT.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setSizes(min, max) - -
    -
    - Set maximum and minimum size of docked elements. By default, every contained actor will be -of 'min' size, and will be scaled up to 'max' size. - - -
    - - - - -
    -
    Parameters:
    - -
    - min - -
    -
    {number}
    - -
    - max - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.IMActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.IMActor.html deleted file mode 100644 index f76d0321..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.IMActor.html +++ /dev/null @@ -1,834 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.IMActor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.IMActor -

    - - -

    - -
    Extends - CAAT.Foundation.Actor.
    - - - - - -
    Defined in: IMActor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    Calculate another image processing frame every this milliseconds.
    -
      - -
    Image processing interface.
    -
      - -
    Last scene time this actor calculated a frame.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    paint(director, time) -
    -
    -
      - -
    Call image processor to update image every time milliseconds.
    -
      - -
    Set the image processor.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.Actor:
    __init, __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, animate, cacheAsBitmap, centerAt, centerOn, clean, contains, create, destroy, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.IMActor() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - changeTime - -
    -
    - Calculate another image processing frame every this milliseconds. - - -
    - - - - - - - - -
    - - -
    - - - imageProcessor - -
    -
    - Image processing interface. - - -
    - - - - - - - - -
    - - -
    - - - lastApplicationTime - -
    -
    - Last scene time this actor calculated a frame. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - - paint(director, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setImageProcessingTime(time) - -
    -
    - Call image processor to update image every time milliseconds. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    an integer indicating milliseconds to elapse before updating the frame.
    - -
    - - - - - - - - -
    - - -
    - - - setImageProcessor(im) - -
    -
    - Set the image processor. - - -
    - - - - -
    -
    Parameters:
    - -
    - im - -
    -
    {CAAT.ImageProcessor} a CAAT.ImageProcessor instance.
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.InterpolatorActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.InterpolatorActor.html deleted file mode 100644 index 82d2d203..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.InterpolatorActor.html +++ /dev/null @@ -1,926 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.InterpolatorActor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.InterpolatorActor -

    - - -

    - -
    Extends - CAAT.Foundation.Actor.
    - - - - - -
    Defined in: InterpolatorActor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - contour -
    -
    This interpolator´s contour.
    -
      -
    - gap -
    -
    padding when drawing the interpolator.
    -
      - -
    The interpolator instance to draw.
    -
      -
    - S -
    -
    Number of samples to calculate a contour.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      - -
    Return the represented interpolator.
    -
      -
    paint(director, time) -
    -
    Paint this actor.
    -
      -
    setGap(gap) -
    -
    Sets a padding border size.
    -
      -
    setInterpolator(interpolator, size) -
    -
    Sets the CAAT.Interpolator instance to draw.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.Actor:
    __init, __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, animate, cacheAsBitmap, centerAt, centerOn, contains, create, destroy, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.InterpolatorActor() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - contour - -
    -
    - This interpolator´s contour. - - -
    - - - - - - - - -
    - - -
    - - - gap - -
    -
    - padding when drawing the interpolator. - - -
    - - - - - - - - -
    - - -
    - - - interpolator - -
    -
    - The interpolator instance to draw. - - -
    - - - - - - - - -
    - - -
    - - - S - -
    -
    - Number of samples to calculate a contour. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - {CAAT.Interpolator} - getInterpolator() - -
    -
    - Return the represented interpolator. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Interpolator}
    - -
    - - - - -
    - - -
    - - - paint(director, time) - -
    -
    - Paint this actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - time - -
    -
    {number} scene time.
    - -
    - - - - - - - - -
    - - -
    - - - setGap(gap) - -
    -
    - Sets a padding border size. By default is 5 pixels. - - -
    - - - - -
    -
    Parameters:
    - -
    - gap - -
    -
    {number} border size in pixels.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setInterpolator(interpolator, size) - -
    -
    - Sets the CAAT.Interpolator instance to draw. - - -
    - - - - -
    -
    Parameters:
    - -
    - interpolator - -
    -
    a CAAT.Interpolator instance.
    - -
    - size - -
    -
    an integer indicating the number of polyline segments so draw to show the CAAT.Interpolator -instance.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:43 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Label#__init.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Label#__init.html deleted file mode 100644 index 07ff859f..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Label#__init.html +++ /dev/null @@ -1,401 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.Label#__init - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.Label#__init -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <private>   - -
    This object represents a label object.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <private> - CAAT.Foundation.UI.Label#__init() -
    - -
    - This object represents a label object. -A label is a complex presentation object which is able to: -
  399. define comples styles -
  400. contains multiline text -
  401. keep track of per-line baseline regardless of fonts used. -
  402. Mix images and text. -
  403. Layout text and images in a fixed width or by parsing a free-flowing document -
  404. Add anchoring capabilities. - -
  405. - - - - - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 11:37:28 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Label.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Label.html deleted file mode 100644 index d847becb..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Label.html +++ /dev/null @@ -1,1861 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.Label - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.Label -

    - - -

    - -
    Extends - CAAT.Foundation.Actor.
    - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   - -
    Registered callback to notify on anchor click event.
    -
    <private>   - -
    Calculated document Height.
    -
    <private>   - -
    Calculated document width.
    -
    <private>   -
    - documentX -
    -
    Document x position.
    -
    <private>   -
    - documentY -
    -
    Document y position.
    -
    <private>   - -
    This Label document´s horizontal alignment.
    -
    <private>   -
    - images -
    -
    Collection of image objects in this label´s document.
    -
    <private>   -
    - lines -
    -
    Collection of text lines calculated for the label.
    -
    <private>   -
    - rc -
    -
    This label document´s render context
    -
    <private>   -
    - reflow -
    -
    Does this label document flow ?
    -
    <private>   -
    - styles -
    -
    Styles object.
    -
    <private>   -
    - text -
    -
    This label text.
    -
    <private>   - -
    This Label document´s vertical alignment.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __calculateDocumentDimension(suggestedWidth) -
    -
    -
    <private>   - -
    -
    <private>   -
    __init() -
    -
    -
      -
    addImage(name, spriteImage) -
    -
    -
      - -
    -
      -
    mouseExit(e) -
    -
    -
      -
    mouseMove(e) -
    -
    -
      -
    paint(director, time) -
    -
    -
      -
    setBounds(x, y, w, h) -
    -
    -
      -
    setClickCallback(callback) -
    -
    -
      -
    setDocumentPosition(halign, valign) -
    -
    -
      - -
    -
      - -
    -
      - -
    Make the label actor the size the label document has been calculated for.
    -
      -
    setSize(w, h) -
    -
    -
      -
    setStyle(name, styleData) -
    -
    -
      -
    setText(_text, width) -
    -
    -
      - -
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.Actor:
    __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, animate, cacheAsBitmap, centerAt, centerOn, clean, contains, create, destroy, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseOut, mouseOver, mouseUp, moveTo, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.Label() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - clickCallback - -
    -
    - Registered callback to notify on anchor click event. - - -
    - - - - - - - - -
    - - -
    <private> - - - documentHeight - -
    -
    - Calculated document Height. - - -
    - - - - - - - - -
    - - -
    <private> - - - documentWidth - -
    -
    - Calculated document width. - - -
    - - - - - - - - -
    - - -
    <private> - - - documentX - -
    -
    - Document x position. - - -
    - - - - - - - - -
    - - -
    <private> - - - documentY - -
    -
    - Document y position. - - -
    - - - - - - - - -
    - - -
    <private> - - - halignment - -
    -
    - This Label document´s horizontal alignment. - - -
    - - - - - - - - -
    - - -
    <private> - - - images - -
    -
    - Collection of image objects in this label´s document. - - -
    - - - - - - - - -
    - - -
    <private> - - - lines - -
    -
    - Collection of text lines calculated for the label. - - -
    - - - - - - - - -
    - - -
    <private> - - - rc - -
    -
    - This label document´s render context - - -
    - - - - - - - - -
    - - -
    <private> - - - reflow - -
    -
    - Does this label document flow ? - - -
    - - - - - - - - -
    - - -
    <private> - - - styles - -
    -
    - Styles object. - - -
    - - - - - - - - -
    - - -
    <private> - - - text - -
    -
    - This label text. - - -
    - - - - - - - - -
    - - -
    <private> - - - valignment - -
    -
    - This Label document´s vertical alignment. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __calculateDocumentDimension(suggestedWidth) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - suggestedWidth - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __getDocumentElementAt(x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - addImage(name, spriteImage) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - spriteImage - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseClick(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseExit(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - mouseMove(e) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - e - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - paint(director, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setBounds(x, y, w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setClickCallback(callback) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - callback - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setDocumentPosition(halign, valign) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - halign - -
    -
    - -
    - valign - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setHorizontalAlignment(align) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - align - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setLinesAlignment() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - setMatchTextSize(match) - -
    -
    - Make the label actor the size the label document has been calculated for. - - -
    - - - - -
    -
    Parameters:
    - -
    - match - -
    -
    {boolean}
    - -
    - - - - - - - - -
    - - -
    - - - setSize(w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setStyle(name, styleData) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - styleData - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setText(_text, width) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - _text - -
    -
    - -
    - width - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setVerticalAlignment(align) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - align - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BorderLayout.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BorderLayout.html deleted file mode 100644 index 81b3ad09..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BorderLayout.html +++ /dev/null @@ -1,1067 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.Layout.BorderLayout - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.Layout.BorderLayout -

    - - -

    - -
    Extends - CAAT.Foundation.UI.Layout.LayoutManager.
    - - - - - -
    Defined in: BorderLayout.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - bottom -
    -
    An actor to position botton.
    -
      -
    - center -
    -
    An actor to position center.
    -
      -
    - left -
    -
    An actor to position left.
    -
      -
    - right -
    -
    An actor to position right.
    -
      -
    - top -
    -
    An actor to position top.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    animated, hgap, invalid, moveElementInterpolator, newChildren, newElementInterpolator, padding, vgap
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __getChild(constraint) -
    -
    -
    <private>   -
    __init() -
    -
    -
      -
    addChild(child, constraint) -
    -
    -
      -
    doLayout(container) -
    -
    -
      -
    getMinimumLayoutSize(container) -
    -
    -
      - -
    -
      -
    removeChild(child) -
    -
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    invalidateLayout, isInvalidated, isValid, setAllPadding, setAnimated, setHGap, setPadding, setVGap
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.Layout.BorderLayout() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - bottom - -
    -
    - An actor to position botton. - - -
    - - - - - - - - -
    - - -
    - - - center - -
    -
    - An actor to position center. - - -
    - - - - - - - - -
    - - -
    - - - left - -
    -
    - An actor to position left. - - -
    - - - - - - - - -
    - - -
    - - - right - -
    -
    - An actor to position right. - - -
    - - - - - - - - -
    - - -
    - - - top - -
    -
    - An actor to position top. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __getChild(constraint) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - constraint - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - addChild(child, constraint) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - child - -
    -
    - -
    - constraint - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - doLayout(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getMinimumLayoutSize(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPreferredLayoutSize(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - removeChild(child) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - child - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BoxLayout.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BoxLayout.html deleted file mode 100644 index ca112dcf..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BoxLayout.html +++ /dev/null @@ -1,1110 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.Layout.BoxLayout - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.Layout.BoxLayout -

    - - -

    - -
    Extends - CAAT.Foundation.UI.Layout.LayoutManager.
    - - - - - -
    Defined in: BoxLayout.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - axis -
    -
    Stack elements in this axis.
    -
      -
    - halign -
    -
    Horizontal alignment.
    -
      -
    - valign -
    -
    Vertical alignment.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    animated, hgap, invalid, moveElementInterpolator, newChildren, newElementInterpolator, padding, vgap
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __setActorPosition(actor, xoffset, yoffset) -
    -
    -
      -
    doLayout(container) -
    -
    -
      -
    doLayoutHorizontal(container) -
    -
    -
      -
    doLayoutVertical(container) -
    -
    -
      -
    getMinimumLayoutSize(container) -
    -
    -
      - -
    -
      -
    setAxis(axis) -
    -
    -
      - -
    -
      - -
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    __init, addChild, invalidateLayout, isInvalidated, isValid, removeChild, setAllPadding, setAnimated, setHGap, setPadding, setVGap
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.Layout.BoxLayout() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - axis - -
    -
    - Stack elements in this axis. - - -
    - - - - - - - - -
    - - -
    - - - halign - -
    -
    - Horizontal alignment. - - -
    - - - - - - - - -
    - - -
    - - - valign - -
    -
    - Vertical alignment. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __setActorPosition(actor, xoffset, yoffset) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - actor - -
    -
    - -
    - xoffset - -
    -
    - -
    - yoffset - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - doLayout(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - doLayoutHorizontal(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - doLayoutVertical(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getMinimumLayoutSize(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPreferredLayoutSize(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setAxis(axis) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - axis - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setHorizontalAlignment(align) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - align - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setVerticalAlignment(align) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - align - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.GridLayout.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.GridLayout.html deleted file mode 100644 index 7d48df84..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.GridLayout.html +++ /dev/null @@ -1,847 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.Layout.GridLayout - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.Layout.GridLayout -

    - - -

    - -
    Extends - CAAT.Foundation.UI.Layout.LayoutManager.
    - - - - - -
    Defined in: GridLayout.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - columns -
    -
    Layout elements using this number of columns.
    -
      -
    - rows -
    -
    Layout elements using this number of rows.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    animated, hgap, invalid, moveElementInterpolator, newChildren, newElementInterpolator, padding, vgap
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(rows, columns) -
    -
    -
      -
    doLayout(container) -
    -
    -
      -
    getMinimumLayoutSize(container) -
    -
    -
      - -
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    addChild, invalidateLayout, isInvalidated, isValid, removeChild, setAllPadding, setAnimated, setHGap, setPadding, setVGap
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.Layout.GridLayout() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - columns - -
    -
    - Layout elements using this number of columns. - - -
    - - - - - - - - -
    - - -
    - - - rows - -
    -
    - Layout elements using this number of rows. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(rows, columns) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - rows - -
    -
    - -
    - columns - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - doLayout(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getMinimumLayoutSize(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPreferredLayoutSize(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.LayoutManager.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.LayoutManager.html deleted file mode 100644 index a85c3ac0..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.LayoutManager.html +++ /dev/null @@ -1,1528 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.Layout.LayoutManager - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.Layout.LayoutManager -

    - - -

    - - - - - - -
    Defined in: LayoutManager.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   -
    - CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT -
    -
    -
      -
    - animated -
    -
    Animate on adding/removing elements.
    -
    <static>   -
    - CAAT.Foundation.UI.Layout.LayoutManager.AXIS -
    -
    -
      -
    - hgap -
    -
    Horizontal gap between children.
    -
      -
    - invalid -
    -
    Needs relayout ??
    -
      - -
    If animation enabled, relayout elements interpolator.
    -
      - -
    pending to be laid-out actors.
    -
      - -
    If animation enabled, new element interpolator.
    -
      -
    - padding -
    -
    Defines insets:
    -
      -
    - vgap -
    -
    Vertical gap between children.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    addChild(child, constraints) -
    -
    -
      -
    doLayout(container) -
    -
    -
      -
    getMinimumLayoutSize(container) -
    -
    -
      - -
    -
      -
    invalidateLayout(container) -
    -
    -
      - -
    -
      -
    isValid() -
    -
    -
      -
    removeChild(child) -
    -
    -
      - -
    -
      -
    setAnimated(animate) -
    -
    -
      -
    setHGap(gap) -
    -
    -
      -
    setPadding(l, r, t, b) -
    -
    -
      -
    setVGap(gap) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.Layout.LayoutManager() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - animated - -
    -
    - Animate on adding/removing elements. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.UI.Layout.LayoutManager.AXIS - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - hgap - -
    -
    - Horizontal gap between children. - - -
    - - - - - - - - -
    - - -
    - - - invalid - -
    -
    - Needs relayout ?? - - -
    - - - - - - - - -
    - - -
    - - - moveElementInterpolator - -
    -
    - If animation enabled, relayout elements interpolator. - - -
    - - - - - - - - -
    - - -
    - - - newChildren - -
    -
    - pending to be laid-out actors. - - -
    - - - - - - - - -
    - - -
    - - - newElementInterpolator - -
    -
    - If animation enabled, new element interpolator. - - -
    - - - - - - - - -
    - - -
    - - - padding - -
    -
    - Defines insets: - - -
    - - - - - - - - -
    - - -
    - - - vgap - -
    -
    - Vertical gap between children. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - addChild(child, constraints) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - child - -
    -
    - -
    - constraints - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - doLayout(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getMinimumLayoutSize(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPreferredLayoutSize(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - invalidateLayout(container) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - container - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - isInvalidated() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isValid() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - removeChild(child) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - child - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setAllPadding(s) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - s - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setAnimated(animate) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - animate - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setHGap(gap) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - gap - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPadding(l, r, t, b) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - l - -
    -
    - -
    - r - -
    -
    - -
    - t - -
    -
    - -
    - b - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setVGap(gap) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - gap - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.html deleted file mode 100644 index b06ec3fe..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.Layout - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Foundation.UI.Layout -

    - - -

    - - - - - - -
    Defined in: LayoutManager.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Foundation.UI.Layout -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.PathActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.PathActor.html deleted file mode 100644 index fdd69095..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.PathActor.html +++ /dev/null @@ -1,1209 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.PathActor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.PathActor -

    - - -

    - -
    Extends - CAAT.Foundation.Actor.
    - - - - - -
    Defined in: PathActor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - bOutline -
    -
    draw the bounding rectangle too ?
    -
      - -
    Set this path as interactive.
    -
      - -
    If the path is interactive, some handlers are shown to modify the path.
    -
      - -
    Outline the path in this color.
    -
      -
    - path -
    -
    Path to draw.
    -
      - -
    Calculated path´s bounding box.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    getPath() -
    -
    Return the contained path.
    -
      -
    mouseDown(mouseEvent) -
    -
    Route mouse down functionality to the contained path.
    -
      -
    mouseDrag(mouseEvent) -
    -
    Route mouse dragging functionality to the contained path.
    -
      -
    mouseUp(mouseEvent) -
    -
    Route mouse up functionality to the contained path.
    -
      -
    paint(director, time) -
    -
    Paint this actor.
    -
      -
    setInteractive(interactive) -
    -
    Set the contained path as interactive.
    -
      - -
    -
      -
    setPath(path) -
    -
    Sets the path to manage.
    -
      -
    showBoundingBox(show, color) -
    -
    Enables/disables drawing of the contained path's bounding box.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.Actor:
    __init, __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, animate, cacheAsBitmap, centerAt, centerOn, contains, create, destroy, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, moveTo, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.PathActor() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - bOutline - -
    -
    - draw the bounding rectangle too ? - - -
    - - - - - - - - -
    - - -
    - - - interactive - -
    -
    - Set this path as interactive. - - -
    - - - - - - - - -
    - - -
    - - - onUpdateCallback - -
    -
    - If the path is interactive, some handlers are shown to modify the path. -This callback function will be called when the path is interactively changed. - - -
    - - - - - - - - -
    - - -
    - - - outlineColor - -
    -
    - Outline the path in this color. - - -
    - - - - - - - - -
    - - -
    - - - path - -
    -
    - Path to draw. - - -
    - - - - - - - - -
    - - -
    - - - pathBoundingRectangle - -
    -
    - Calculated path´s bounding box. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - {CAAT.Path} - getPath() - -
    -
    - Return the contained path. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Path}
    - -
    - - - - -
    - - -
    - - - mouseDown(mouseEvent) - -
    -
    - Route mouse down functionality to the contained path. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.Event.MouseEvent}
    - -
    - - - - - - - - -
    - - -
    - - - mouseDrag(mouseEvent) - -
    -
    - Route mouse dragging functionality to the contained path. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.Event.MouseEvent}
    - -
    - - - - - - - - -
    - - -
    - - - mouseUp(mouseEvent) - -
    -
    - Route mouse up functionality to the contained path. - - -
    - - - - -
    -
    Parameters:
    - -
    - mouseEvent - -
    -
    {CAAT.Event.MouseEvent}
    - -
    - - - - - - - - -
    - - -
    - - - paint(director, time) - -
    -
    - Paint this actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Foundation.Director}
    - -
    - time - -
    -
    {number}. Scene time.
    - -
    - - - - - - - - -
    - - -
    - - - setInteractive(interactive) - -
    -
    - Set the contained path as interactive. This means it can be changed on the fly by manipulation -of its control points. - - -
    - - - - -
    -
    Parameters:
    - -
    - interactive - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setOnUpdateCallback(fn) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - fn - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPath(path) - -
    -
    - Sets the path to manage. - - -
    - - - - -
    -
    Parameters:
    - -
    - path - -
    -
    {CAAT.PathUtil.PathSegment}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - showBoundingBox(show, color) - -
    -
    - Enables/disables drawing of the contained path's bounding box. - - -
    - - - - -
    -
    Parameters:
    - -
    - show - -
    -
    {boolean} whether to show the bounding box
    - -
    - color - -
    -
    {=string} optional parameter defining the path's bounding box stroke style.
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.ShapeActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.ShapeActor.html deleted file mode 100644 index f94f83a1..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.ShapeActor.html +++ /dev/null @@ -1,1465 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.ShapeActor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.ShapeActor -

    - - -

    - -
    Extends - CAAT.Foundation.ActorContainer.
    - - - - - -
    Defined in: ShapeActor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    Set this shape composite operation when drawing it.
    -
      -
    - lineCap -
    -
    Stroke the shape with this line cap.
    -
      -
    - lineJoin -
    -
    Stroke the shape with this line Join.
    -
      -
    - lineWidth -
    -
    Stroke the shape with this line width.
    -
      - -
    Stroke the shape with this line mitter limit.
    -
      -
    - shape -
    -
    Define this actor shape: rectangle or circle
    -
    <static>   -
    - CAAT.Foundation.UI.ShapeActor.SHAPE_CIRCLE -
    -
    -
    <static>   -
    - CAAT.Foundation.UI.ShapeActor.SHAPE_RECTANGLE -
    -
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.ActorContainer:
    activeChildren, addHint, boundingBox, childrenList, layoutInvalidated, layoutManager, pendingChildrenList, runion
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    paint(director, time) -
    -
    Draws the shape.
    -
    <private>   -
    paintCircle(director, time) -
    -
    -
      -
    paintRectangle(director, time) -
    -
    Private -Draws a Rectangle.
    -
      -
    setCompositeOp(compositeOp) -
    -
    Sets the composite operation to apply on shape drawing.
    -
      -
    setLineCap(lc) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    setShape(iShape) -
    -
    Sets shape type.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.ActorContainer:
    __paintActor, __validateLayout, __validateTree, addActor, addActorImmediately, addChild, addChildAt, addChildDelayed, addChildImmediately, animate, destroy, drawScreenBoundingBox, emptyChildren, endAnimate, findActorAtPosition, findActorById, findChild, getChildAt, getLayout, getNumActiveChildren, getNumChildren, invalidateLayout, paintActor, paintActorGL, recalcSize, removeChild, removeChildAt, removeFirstChild, removeLastChild, setBounds, setLayout, setZOrder
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, emptyBehaviorList, enableDrag, enableEvents, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.ShapeActor() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - compositeOp - -
    -
    - Set this shape composite operation when drawing it. - - -
    - - - - - - - - -
    - - -
    - - - lineCap - -
    -
    - Stroke the shape with this line cap. - - -
    - - - - - - - - -
    - - -
    - - - lineJoin - -
    -
    - Stroke the shape with this line Join. - - -
    - - - - - - - - -
    - - -
    - - - lineWidth - -
    -
    - Stroke the shape with this line width. - - -
    - - - - - - - - -
    - - -
    - - - miterLimit - -
    -
    - Stroke the shape with this line mitter limit. - - -
    - - - - - - - - -
    - - -
    - - - shape - -
    -
    - Define this actor shape: rectangle or circle - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.UI.ShapeActor.SHAPE_CIRCLE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Foundation.UI.ShapeActor.SHAPE_RECTANGLE - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getLineCap() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getLineJoin() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getLineWidth() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getMiterLimit() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - paint(director, time) - -
    -
    - Draws the shape. -Applies the values of fillStype, strokeStyle, compositeOp, etc. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    a valid CAAT.Director instance.
    - -
    - time - -
    -
    an integer with the Scene time the Actor is being drawn.
    - -
    - - - - - - - - -
    - - -
    <private> - - - paintCircle(director, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    a valid CAAT.Director instance.
    - -
    - time - -
    -
    an integer with the Scene time the Actor is being drawn.
    - -
    - - - - - - - - -
    - - -
    - - - paintRectangle(director, time) - -
    -
    - Private -Draws a Rectangle. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    a valid CAAT.Director instance.
    - -
    - time - -
    -
    an integer with the Scene time the Actor is being drawn.
    - -
    - - - - - - - - -
    - - -
    - - - setCompositeOp(compositeOp) - -
    -
    - Sets the composite operation to apply on shape drawing. - - -
    - - - - -
    -
    Parameters:
    - -
    - compositeOp - -
    -
    an string with a valid canvas rendering context string describing compositeOps.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setLineCap(lc) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - lc - -
    -
    {string{butt|round|square}}
    - -
    - - - - - - - - -
    - - -
    - - - setLineJoin(lj) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - lj - -
    -
    {string{bevel|round|miter}}
    - -
    - - - - - - - - -
    - - -
    - - - setLineWidth(l) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - l - -
    -
    {number>0}
    - -
    - - - - - - - - -
    - - -
    - - - setMiterLimit(ml) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ml - -
    -
    {integer>0}
    - -
    - - - - - - - - -
    - - -
    - - - setShape(iShape) - -
    -
    - Sets shape type. -No check for parameter validity is performed. -Set paint method according to the shape. - - -
    - - - - -
    -
    Parameters:
    - -
    - iShape - -
    -
    an integer with any of the SHAPE_* constants.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.StarActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.StarActor.html deleted file mode 100644 index f94648bf..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.StarActor.html +++ /dev/null @@ -1,1539 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.StarActor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.StarActor -

    - - -

    - -
    Extends - CAAT.Foundation.ActorContainer.
    - - - - - -
    Defined in: StarActor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    Draw the star with this composite operation.
    -
      - -
    Staring angle in radians.
    -
      -
    - lineCap -
    -
    -
      -
    - lineJoin -
    -
    -
      -
    - lineWidth -
    -
    -
      -
    - maxRadius -
    -
    Maximum radius.
    -
      -
    - minRadius -
    -
    Minimum radius.
    -
      - -
    -
      -
    - nPeaks -
    -
    Number of star peaks.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.ActorContainer:
    activeChildren, addHint, boundingBox, childrenList, layoutInvalidated, layoutManager, pendingChildrenList, runion
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    initialize(nPeaks, maxRadius, minRadius) -
    -
    Initialize the star values.
    -
      -
    paint(director, timer) -
    -
    Paint the star.
    -
      -
    setCompositeOp(compositeOp) -
    -
    Sets the composite operation to apply on shape drawing.
    -
      -
    setFilled(filled) -
    -
    Sets whether the star will be color filled.
    -
      -
    setInitialAngle(angle) -
    -
    -
      -
    setLineCap(lc) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    setOutlined(outlined) -
    -
    Sets whether the star will be outlined.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.ActorContainer:
    __paintActor, __validateLayout, __validateTree, addActor, addActorImmediately, addChild, addChildAt, addChildDelayed, addChildImmediately, animate, destroy, drawScreenBoundingBox, emptyChildren, endAnimate, findActorAtPosition, findActorById, findChild, getChildAt, getLayout, getNumActiveChildren, getNumChildren, invalidateLayout, paintActor, paintActorGL, recalcSize, removeChild, removeChildAt, removeFirstChild, removeLastChild, setBounds, setLayout, setZOrder
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, emptyBehaviorList, enableDrag, enableEvents, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.StarActor() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - compositeOp - -
    -
    - Draw the star with this composite operation. - - -
    - - - - - - - - -
    - - -
    - - - initialAngle - -
    -
    - Staring angle in radians. - - -
    - - - - - - - - -
    - - -
    - - - lineCap - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - lineJoin - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - lineWidth - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - maxRadius - -
    -
    - Maximum radius. - - -
    - - - - - - - - -
    - - -
    - - - minRadius - -
    -
    - Minimum radius. - - -
    - - - - - - - - -
    - - -
    - - - miterLimit - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - nPeaks - -
    -
    - Number of star peaks. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getLineCap() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getLineJoin() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getLineWidth() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getMiterLimit() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - initialize(nPeaks, maxRadius, minRadius) - -
    -
    - Initialize the star values. -

    -The star actor will be of size 2*maxRadius. - - -

    - - - - -
    -
    Parameters:
    - -
    - nPeaks - -
    -
    {number} number of star points.
    - -
    - maxRadius - -
    -
    {number} maximum star radius
    - -
    - minRadius - -
    -
    {number} minimum star radius
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - paint(director, timer) - -
    -
    - Paint the star. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - timer - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setCompositeOp(compositeOp) - -
    -
    - Sets the composite operation to apply on shape drawing. - - -
    - - - - -
    -
    Parameters:
    - -
    - compositeOp - -
    -
    an string with a valid canvas rendering context string describing compositeOps.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setFilled(filled) - -
    -
    - Sets whether the star will be color filled. - - -
    - - - - -
    -
    Parameters:
    - -
    - filled - -
    -
    {boolean}
    - -
    - - - - - - - - -
    - - -
    - - - setInitialAngle(angle) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - angle - -
    -
    {number} number in radians.
    - -
    - - - - - - - - -
    - - -
    - - - setLineCap(lc) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - lc - -
    -
    {string{butt|round|square}}
    - -
    - - - - - - - - -
    - - -
    - - - setLineJoin(lj) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - lj - -
    -
    {string{bevel|round|miter}}
    - -
    - - - - - - - - -
    - - -
    - - - setLineWidth(l) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - l - -
    -
    {number>0}
    - -
    - - - - - - - - -
    - - -
    - - - setMiterLimit(ml) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ml - -
    -
    {integer>0}
    - -
    - - - - - - - - -
    - - -
    - - - setOutlined(outlined) - -
    -
    - Sets whether the star will be outlined. - - -
    - - - - -
    -
    Parameters:
    - -
    - outlined - -
    -
    {boolean}
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.TextActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.TextActor.html deleted file mode 100644 index 9afd472e..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.TextActor.html +++ /dev/null @@ -1,2386 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI.TextActor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Foundation.UI.TextActor -

    - - -

    - -
    Extends - CAAT.Foundation.Actor.
    - - - - - -
    Defined in: TextActor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - fill -
    -
    a boolean indicating whether the text should be filled.
    -
      -
    - font -
    -
    a valid canvas rendering context font description.
    -
      -
    - fontData -
    -
    Font info.
    -
      -
    - lineWidth -
    -
    text's stroke line width.
    -
      -
    - outline -
    -
    a boolean indicating whether the text should be outlined.
    -
      - -
    a valid color description string.
    -
      -
    - path -
    -
    a CAAT.PathUtil.Path which will be traversed by the text.
    -
      - -
    time to be taken to traverse the path.
    -
      - -
    A CAAT.Behavior.Interpolator to apply to the path traversal.
    -
      -
    - sign -
    -
    traverse the path forward (1) or backwards (-1).
    -
      -
    - text -
    -
    a string with the text to draw.
    -
      -
    - textAlign -
    -
    a valid canvas rendering context textAlign string.
    -
      - -
    a valid canvas rendering context textBaseLine string.
    -
      - -
    text fill color
    -
      - -
    calculated text height in pixels.
    -
      -
    - textWidth -
    -
    calculated text width in pixels.
    -
    - - - -
    -
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   - -
    -
    <private>   -
    __init() -
    -
    -
    <private>   - -
    -
      -
    calcTextSize(director) -
    -
    Calculates the text dimension in pixels and stores the values in textWidth and textHeight -attributes.
    -
      -
    centerAt(x, y) -
    -
    -
      -
    drawOnPath(director, time) -
    -
    Private.
    -
      -
    drawSpriteText(director, time) -
    -
    Private.
    -
      -
    drawSpriteTextOnPath(director, time) -
    -
    Private.
    -
      -
    paint(director, time) -
    -
    Custom paint method for TextActor instances.
    -
      -
    setAlign(align) -
    -
    Sets text alignment
    -
      -
    setBaseline(baseline) -
    -
    -
      -
    setBounds(x, y, w, h) -
    -
    -
      -
    setFill(fill) -
    -
    Set the text to be filled.
    -
      -
    setFont(font) -
    -
    Sets the font to be applied for the text.
    -
      - -
    -
      -
    setLocation(x, y) -
    -
    -
      -
    setOutline(outline) -
    -
    Sets whether the text will be outlined.
    -
      -
    setOutlineColor(color) -
    -
    Defines text's outline color.
    -
      -
    setPath(path, interpolator, duration) -
    -
    Set the path, interpolator and duration to draw the text on.
    -
      - -
    -
      -
    setPosition(x, y) -
    -
    -
      -
    setSize(w, h) -
    -
    -
      -
    setText(sText) -
    -
    Set the text to be shown by the actor.
    -
      -
    setTextAlign(align) -
    -
    -
      -
    setTextBaseline(baseline) -
    -
    Set text baseline.
    -
      - -
    -
    - - - -
    -
    Methods borrowed from class CAAT.Foundation.Actor:
    __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, animate, cacheAsBitmap, centerOn, clean, contains, create, destroy, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Foundation.UI.TextActor() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - fill - -
    -
    - a boolean indicating whether the text should be filled. - - -
    - - - - - - - - -
    - - -
    - - - font - -
    -
    - a valid canvas rendering context font description. Default font will be "10px sans-serif". - - -
    - - - - - - - - -
    - - -
    - - - fontData - -
    -
    - Font info. Calculated in CAAT. - - -
    - - - - - - - - -
    - - -
    - - - lineWidth - -
    -
    - text's stroke line width. - - -
    - - - - - - - - -
    - - -
    - - - outline - -
    -
    - a boolean indicating whether the text should be outlined. not all browsers support it. - - -
    - - - - - - - - -
    - - -
    - - - outlineColor - -
    -
    - a valid color description string. - - -
    - - - - - - - - -
    - - -
    - - - path - -
    -
    - a CAAT.PathUtil.Path which will be traversed by the text. - - -
    - - - - - - - - -
    - - -
    - - - pathDuration - -
    -
    - time to be taken to traverse the path. ms. - - -
    - - - - - - - - -
    - - -
    - - - pathInterpolator - -
    -
    - A CAAT.Behavior.Interpolator to apply to the path traversal. - - -
    - - - - - - - - -
    - - -
    - - - sign - -
    -
    - traverse the path forward (1) or backwards (-1). - - -
    - - - - - - - - -
    - - -
    - - - text - -
    -
    - a string with the text to draw. - - -
    - - - - - - - - -
    - - -
    - - - textAlign - -
    -
    - a valid canvas rendering context textAlign string. Any of: - start, end, left, right, center. -defaults to "left". - - -
    - - - - - - - - -
    - - -
    - - - textBaseline - -
    -
    - a valid canvas rendering context textBaseLine string. Any of: - top, hanging, middle, alphabetic, ideographic, bottom. -defaults to "top". - - -
    - - - - - - - - -
    - - -
    - - - textFillStyle - -
    -
    - text fill color - - -
    - - - - - - - - -
    - - -
    - - - textHeight - -
    -
    - calculated text height in pixels. - - -
    - - - - - - - - -
    - - -
    - - - textWidth - -
    -
    - calculated text width in pixels. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __calcFontData() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - __setLocation() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - calcTextSize(director) - -
    -
    - Calculates the text dimension in pixels and stores the values in textWidth and textHeight -attributes. -If Actor's width and height were not set, the Actor's dimension will be set to these values. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    a CAAT.Director instance.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - centerAt(x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - drawOnPath(director, time) - -
    -
    - Private. -Draw the text traversing a path. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    a valid CAAT.Director instance.
    - -
    - time - -
    -
    an integer with the Scene time the Actor is being drawn.
    - -
    - - - - - - - - -
    - - -
    - - - drawSpriteText(director, time) - -
    -
    - Private. -Draw the text using a sprited font instead of a canvas font. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    a valid CAAT.Director instance.
    - -
    - time - -
    -
    an integer with the Scene time the Actor is being drawn.
    - -
    - - - - - - - - -
    - - -
    - - - drawSpriteTextOnPath(director, time) - -
    -
    - Private. -Draw the text traversing a path using a sprited font. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    a valid CAAT.Director instance.
    - -
    - time - -
    -
    an integer with the Scene time the Actor is being drawn.
    - -
    - - - - - - - - -
    - - -
    - - - paint(director, time) - -
    -
    - Custom paint method for TextActor instances. -If the path attribute is set, the text will be drawn traversing the path. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    a valid CAAT.Director instance.
    - -
    - time - -
    -
    an integer with the Scene time the Actor is being drawn.
    - -
    - - - - - - - - -
    - - -
    - - - setAlign(align) - -
    -
    - Sets text alignment - - -
    - - - - -
    -
    Parameters:
    - -
    - align - -
    -
    - -
    - - -
    -
    Deprecated:
    -
    - use setTextAlign -
    -
    - - - - - - - -
    - - -
    - - - setBaseline(baseline) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - baseline - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setBounds(x, y, w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setFill(fill) - -
    -
    - Set the text to be filled. The default Filling style will be set by calling setFillStyle method. -Default value is true. - - -
    - - - - -
    -
    Parameters:
    - -
    - fill - -
    -
    {boolean} a boolean indicating whether the text will be filled.
    - -
    - - - - - -
    -
    Returns:
    - -
    this;
    - -
    - - - - -
    - - -
    - - - setFont(font) - -
    -
    - Sets the font to be applied for the text. - - -
    - - - - -
    -
    Parameters:
    - -
    - font - -
    -
    a string with a valid canvas rendering context font description.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setLineWidth(lw) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - lw - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setLocation(x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setOutline(outline) - -
    -
    - Sets whether the text will be outlined. - - -
    - - - - -
    -
    Parameters:
    - -
    - outline - -
    -
    {boolean} a boolean indicating whether the text will be outlined.
    - -
    - - - - - -
    -
    Returns:
    - -
    this;
    - -
    - - - - -
    - - -
    - - - setOutlineColor(color) - -
    -
    - Defines text's outline color. - - -
    - - - - -
    -
    Parameters:
    - -
    - color - -
    -
    {string} sets a valid canvas context color.
    - -
    - - - - - -
    -
    Returns:
    - -
    this.
    - -
    - - - - -
    - - -
    - - - setPath(path, interpolator, duration) - -
    -
    - Set the path, interpolator and duration to draw the text on. - - -
    - - - - -
    -
    Parameters:
    - -
    - path - -
    -
    a valid CAAT.Path instance.
    - -
    - interpolator - -
    -
    a CAAT.Interpolator object. If not set, a Linear Interpolator will be used.
    - -
    - duration - -
    -
    an integer indicating the time to take to traverse the path. Optional. 10000 ms -by default.
    - -
    - - - - - - - - -
    - - -
    - - - setPathTraverseDirection(direction) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - direction - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPosition(x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setSize(w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setText(sText) - -
    -
    - Set the text to be shown by the actor. - - -
    - - - - -
    -
    Parameters:
    - -
    - sText - -
    -
    a string with the text to be shwon.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setTextAlign(align) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - align - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setTextBaseline(baseline) - -
    -
    - Set text baseline. - - -
    - - - - -
    -
    Parameters:
    - -
    - baseline - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setTextFillStyle(style) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - style - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.html deleted file mode 100644 index 02850ee6..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.UI.html +++ /dev/null @@ -1,546 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation.UI - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Foundation.UI -

    - - -

    - - - - - - -
    Defined in: Dock.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Foundation.UI -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.html b/documentation/jsdoc/symbols/CAAT.Foundation.html deleted file mode 100644 index 8b67a24a..00000000 --- a/documentation/jsdoc/symbols/CAAT.Foundation.html +++ /dev/null @@ -1,546 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Foundation - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Foundation -

    - - -

    - - - - - - -
    Defined in: Actor.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    CAAT.Foundation is the base namespace for all the core animation elements.
    -
    - - - - - - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Foundation -
    - -
    - CAAT.Foundation is the base namespace for all the core animation elements. - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.KEYS.html b/documentation/jsdoc/symbols/CAAT.KEYS.html deleted file mode 100644 index ef9e2b51..00000000 --- a/documentation/jsdoc/symbols/CAAT.KEYS.html +++ /dev/null @@ -1,3316 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.KEYS - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.KEYS -

    - - -

    - - - - - - -
    Defined in: KeyEvent.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      -
    - CAAT.KEYS -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   -
    - CAAT.KEYS.a -
    -
    -
    <static>   -
    - CAAT.KEYS.ADD -
    -
    -
    <static>   -
    - CAAT.KEYS.ALT -
    -
    -
    <static>   -
    - CAAT.KEYS.b -
    -
    -
    <static>   -
    - CAAT.KEYS.BACKSLASH -
    -
    -
    <static>   -
    - CAAT.KEYS.BACKSPACE -
    -
    -
    <static>   -
    - CAAT.KEYS.c -
    -
    -
    <static>   -
    - CAAT.KEYS.CAPSLOCK -
    -
    -
    <static>   -
    - CAAT.KEYS.CLOSEBRAKET -
    -
    -
    <static>   -
    - CAAT.KEYS.COMMA -
    -
    -
    <static>   -
    - CAAT.KEYS.CTRL -
    -
    -
    <static>   -
    - CAAT.KEYS.d -
    -
    -
    <static>   -
    - CAAT.KEYS.DASH -
    -
    -
    <static>   -
    - CAAT.KEYS.DECIMALPOINT -
    -
    -
    <static>   -
    - CAAT.KEYS.DELETE -
    -
    -
    <static>   -
    - CAAT.KEYS.DIVIDE -
    -
    -
    <static>   -
    - CAAT.KEYS.DOWN -
    -
    -
    <static>   -
    - CAAT.KEYS.e -
    -
    -
    <static>   -
    - CAAT.KEYS.END -
    -
    -
    <static>   -
    - CAAT.KEYS.ENTER -
    -
    -
    <static>   -
    - CAAT.KEYS.EQUALSIGN -
    -
    -
    <static>   -
    - CAAT.KEYS.ESCAPE -
    -
    -
    <static>   -
    - CAAT.KEYS.f -
    -
    -
    <static>   -
    - CAAT.KEYS.F1 -
    -
    -
    <static>   -
    - CAAT.KEYS.F10 -
    -
    -
    <static>   -
    - CAAT.KEYS.F11 -
    -
    -
    <static>   -
    - CAAT.KEYS.F12 -
    -
    -
    <static>   -
    - CAAT.KEYS.F2 -
    -
    -
    <static>   -
    - CAAT.KEYS.F3 -
    -
    -
    <static>   -
    - CAAT.KEYS.F4 -
    -
    -
    <static>   -
    - CAAT.KEYS.F5 -
    -
    -
    <static>   -
    - CAAT.KEYS.F6 -
    -
    -
    <static>   -
    - CAAT.KEYS.F7 -
    -
    -
    <static>   -
    - CAAT.KEYS.F8 -
    -
    -
    <static>   -
    - CAAT.KEYS.F9 -
    -
    -
    <static>   -
    - CAAT.KEYS.FORWARDSLASH -
    -
    -
    <static>   -
    - CAAT.KEYS.g -
    -
    -
    <static>   -
    - CAAT.KEYS.GRAVEACCENT -
    -
    -
    <static>   -
    - CAAT.KEYS.h -
    -
    -
    <static>   -
    - CAAT.KEYS.HOME -
    -
    -
    <static>   -
    - CAAT.KEYS.i -
    -
    -
    <static>   -
    - CAAT.KEYS.INSERT -
    -
    -
    <static>   -
    - CAAT.KEYS.j -
    -
    -
    <static>   -
    - CAAT.KEYS.k -
    -
    -
    <static>   -
    - CAAT.KEYS.l -
    -
    -
    <static>   -
    - CAAT.KEYS.LEFT -
    -
    -
    <static>   -
    - CAAT.KEYS.m -
    -
    -
    <static>   -
    - CAAT.KEYS.MULTIPLY -
    -
    -
    <static>   -
    - CAAT.KEYS.n -
    -
    -
    <static>   -
    - CAAT.KEYS.NUMLOCK -
    -
    -
    <static>   -
    - CAAT.KEYS.NUMPAD0 -
    -
    -
    <static>   -
    - CAAT.KEYS.NUMPAD1 -
    -
    -
    <static>   -
    - CAAT.KEYS.NUMPAD2 -
    -
    -
    <static>   -
    - CAAT.KEYS.NUMPAD3 -
    -
    -
    <static>   -
    - CAAT.KEYS.NUMPAD4 -
    -
    -
    <static>   -
    - CAAT.KEYS.NUMPAD5 -
    -
    -
    <static>   -
    - CAAT.KEYS.NUMPAD6 -
    -
    -
    <static>   -
    - CAAT.KEYS.NUMPAD7 -
    -
    -
    <static>   -
    - CAAT.KEYS.NUMPAD8 -
    -
    -
    <static>   -
    - CAAT.KEYS.NUMPAD9 -
    -
    -
    <static>   -
    - CAAT.KEYS.o -
    -
    -
    <static>   -
    - CAAT.KEYS.OPENBRACKET -
    -
    -
    <static>   -
    - CAAT.KEYS.p -
    -
    -
    <static>   -
    - CAAT.KEYS.PAGEDOWN -
    -
    -
    <static>   -
    - CAAT.KEYS.PAGEUP -
    -
    -
    <static>   -
    - CAAT.KEYS.PAUSE -
    -
    -
    <static>   -
    - CAAT.KEYS.PERIOD -
    -
    -
    <static>   -
    - CAAT.KEYS.q -
    -
    -
    <static>   -
    - CAAT.KEYS.r -
    -
    -
    <static>   -
    - CAAT.KEYS.RIGHT -
    -
    -
    <static>   -
    - CAAT.KEYS.s -
    -
    -
    <static>   -
    - CAAT.KEYS.SCROLLLOCK -
    -
    -
    <static>   -
    - CAAT.KEYS.SELECT -
    -
    -
    <static>   -
    - CAAT.KEYS.SEMICOLON -
    -
    -
    <static>   -
    - CAAT.KEYS.SHIFT -
    -
    -
    <static>   -
    - CAAT.KEYS.SINGLEQUOTE -
    -
    -
    <static>   -
    - CAAT.KEYS.SUBTRACT -
    -
    -
    <static>   -
    - CAAT.KEYS.t -
    -
    -
    <static>   -
    - CAAT.KEYS.TAB -
    -
    -
    <static>   -
    - CAAT.KEYS.u -
    -
    -
    <static>   -
    - CAAT.KEYS.UP -
    -
    -
    <static>   -
    - CAAT.KEYS.v -
    -
    -
    <static>   -
    - CAAT.KEYS.w -
    -
    -
    <static>   -
    - CAAT.KEYS.x -
    -
    -
    <static>   -
    - CAAT.KEYS.y -
    -
    -
    <static>   -
    - CAAT.KEYS.z -
    -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.KEYS -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.KEYS.a - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.ADD - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.ALT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.b - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.BACKSLASH - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.BACKSPACE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.c - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.CAPSLOCK - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.CLOSEBRAKET - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.COMMA - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.CTRL - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.d - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.DASH - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.DECIMALPOINT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.DELETE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.DIVIDE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.DOWN - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.e - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.END - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.ENTER - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.EQUALSIGN - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.ESCAPE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.f - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F1 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F10 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F11 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F12 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F2 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F3 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F4 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F5 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F6 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F7 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F8 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.F9 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.FORWARDSLASH - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.g - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.GRAVEACCENT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.h - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.HOME - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.i - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.INSERT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.j - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.k - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.l - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.LEFT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.m - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.MULTIPLY - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.n - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.NUMLOCK - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.NUMPAD0 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.NUMPAD1 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.NUMPAD2 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.NUMPAD3 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.NUMPAD4 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.NUMPAD5 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.NUMPAD6 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.NUMPAD7 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.NUMPAD8 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.NUMPAD9 - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.o - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.OPENBRACKET - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.p - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.PAGEDOWN - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.PAGEUP - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.PAUSE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.PERIOD - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.q - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.r - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.RIGHT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.s - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.SCROLLLOCK - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.SELECT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.SEMICOLON - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.SHIFT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.SINGLEQUOTE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.SUBTRACT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.t - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.TAB - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.u - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.UP - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.v - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.w - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.x - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.y - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEYS.z - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.KEY_MODIFIERS.html b/documentation/jsdoc/symbols/CAAT.KEY_MODIFIERS.html deleted file mode 100644 index bb7cc147..00000000 --- a/documentation/jsdoc/symbols/CAAT.KEY_MODIFIERS.html +++ /dev/null @@ -1,660 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.KEY_MODIFIERS - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.KEY_MODIFIERS -

    - - -

    - - - - - - -
    Defined in: KeyEvent.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   -
    - CAAT.KEY_MODIFIERS.alt -
    -
    -
    <static>   -
    - CAAT.KEY_MODIFIERS.control -
    -
    -
    <static>   -
    - CAAT.KEY_MODIFIERS.shift -
    -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.KEY_MODIFIERS -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.KEY_MODIFIERS.alt - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEY_MODIFIERS.control - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.KEY_MODIFIERS.shift - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Math.Bezier.html b/documentation/jsdoc/symbols/CAAT.Math.Bezier.html deleted file mode 100644 index 5a9e1eb7..00000000 --- a/documentation/jsdoc/symbols/CAAT.Math.Bezier.html +++ /dev/null @@ -1,1239 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Math.Bezier - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Math.Bezier -

    - - -

    - -
    Extends - CAAT.Math.Curve.
    - - - - - -
    Defined in: Bezier.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - cubic -
    -
    This curbe is cubic or quadratic bezier ?
    -
    - - - -
    -
    Fields borrowed from class CAAT.Math.Curve:
    coordlist, drawHandles, HANDLE_SIZE, k, length
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    applyAsPath(director) -
    -
    -
      -
    isCubic() -
    -
    -
      - -
    -
      -
    paint(director) -
    -
    Paint this curve.
    -
    <private>   -
    paintCuadric(director) -
    -
    Paint this quadric Bezier curve.
    -
    <private>   -
    paintCubic(director) -
    -
    Paint this cubic Bezier curve.
    -
      -
    setCubic(cp0x, cp0y, cp1x, cp1y, cp2x, cp2y, cp3x, cp3y) -
    -
    Set this curve as a cubic bezier defined by the given four control points.
    -
      -
    setPoints(points) -
    -
    -
      -
    setQuadric(cp0x, cp0y, cp1x, cp1y, cp2x, cp2y) -
    -
    Set this curve as a quadric bezier defined by the three control points.
    -
      -
    solve(point, t) -
    -
    Solves the curve for any given parameter t.
    -
      -
    solveCubic(point, t) -
    -
    Solves a cubic Bezier.
    -
      -
    solveQuadric(point, t) -
    -
    Solves a quadric Bezier.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Math.Curve:
    calcLength, endCurvePosition, getBoundingBox, getContour, getLength, setPoint, startCurvePosition, update
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Math.Bezier() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - cubic - -
    -
    - This curbe is cubic or quadratic bezier ? - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - - applyAsPath(director) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - isCubic() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isQuadric() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - paint(director) - -
    -
    - Paint this curve. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - - - - - - - - -
    - - -
    <private> - - - paintCuadric(director) - -
    -
    - Paint this quadric Bezier curve. Each time the curve is drawn it will be solved again from 0 to 1 with -CAAT.Bezier.k increments. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - - - - - - - - -
    - - -
    <private> - - - paintCubic(director) - -
    -
    - Paint this cubic Bezier curve. Each time the curve is drawn it will be solved again from 0 to 1 with -CAAT.Bezier.k increments. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - - - - - - - - -
    - - -
    - - - setCubic(cp0x, cp0y, cp1x, cp1y, cp2x, cp2y, cp3x, cp3y) - -
    -
    - Set this curve as a cubic bezier defined by the given four control points. - - -
    - - - - -
    -
    Parameters:
    - -
    - cp0x - -
    -
    {number}
    - -
    - cp0y - -
    -
    {number}
    - -
    - cp1x - -
    -
    {number}
    - -
    - cp1y - -
    -
    {number}
    - -
    - cp2x - -
    -
    {number}
    - -
    - cp2y - -
    -
    {number}
    - -
    - cp3x - -
    -
    {number}
    - -
    - cp3y - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setPoints(points) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - points - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setQuadric(cp0x, cp0y, cp1x, cp1y, cp2x, cp2y) - -
    -
    - Set this curve as a quadric bezier defined by the three control points. - - -
    - - - - -
    -
    Parameters:
    - -
    - cp0x - -
    -
    {number}
    - -
    - cp0y - -
    -
    {number}
    - -
    - cp1x - -
    -
    {number}
    - -
    - cp1y - -
    -
    {number}
    - -
    - cp2x - -
    -
    {number}
    - -
    - cp2y - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - solve(point, t) - -
    -
    - Solves the curve for any given parameter t. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Point} the point to store the solved value on the curve.
    - -
    - t - -
    -
    {number} a number in the range 0..1
    - -
    - - - - - - - - -
    - - -
    - - - solveCubic(point, t) - -
    -
    - Solves a cubic Bezier. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Point} the point to store the solved value on the curve.
    - -
    - t - -
    -
    {number} the value to solve the curve for.
    - -
    - - - - - - - - -
    - - -
    - - - solveQuadric(point, t) - -
    -
    - Solves a quadric Bezier. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Point} the point to store the solved value on the curve.
    - -
    - t - -
    -
    {number} the value to solve the curve for.
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Math.CatmullRom.html b/documentation/jsdoc/symbols/CAAT.Math.CatmullRom.html deleted file mode 100644 index 6e705b43..00000000 --- a/documentation/jsdoc/symbols/CAAT.Math.CatmullRom.html +++ /dev/null @@ -1,865 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Math.CatmullRom - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Math.CatmullRom -

    - - -

    - -
    Extends - CAAT.Math.Curve.
    - - - - - -
    Defined in: CatmullRom.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - -
    -
    Fields borrowed from class CAAT.Math.Curve:
    coordlist, drawHandles, HANDLE_SIZE, k, length
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    applyAsPath(director) -
    -
    -
      - -
    Return the first curve control point.
    -
      -
    paint(director) -
    -
    Paint the contour by solving again the entire curve.
    -
      -
    setCurve(p0, p1, p2, p3) -
    -
    Set curve control points.
    -
      -
    solve(point, t) -
    -
    Solves the curve for any given parameter t.
    -
      - -
    Return the last curve control point.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Math.Curve:
    calcLength, getBoundingBox, getContour, getLength, setPoint, setPoints, update
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Math.CatmullRom() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    - - - applyAsPath(director) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.Point} - endCurvePosition() - -
    -
    - Return the first curve control point. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - -
    - - -
    - - - paint(director) - -
    -
    - Paint the contour by solving again the entire curve. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - - - - - - - - -
    - - -
    - - - setCurve(p0, p1, p2, p3) - -
    -
    - Set curve control points. - - -
    - - - - -
    -
    Parameters:
    - -
    - p0 - -
    -
    - -
    - p1 - -
    -
    - -
    - p2 - -
    -
    - -
    - p3 - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - solve(point, t) - -
    -
    - Solves the curve for any given parameter t. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Point} the point to store the solved value on the curve.
    - -
    - t - -
    -
    {number} a number in the range 0..1
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.Point} - startCurvePosition() - -
    -
    - Return the last curve control point. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Math.Curve.html b/documentation/jsdoc/symbols/CAAT.Math.Curve.html deleted file mode 100644 index 25f89073..00000000 --- a/documentation/jsdoc/symbols/CAAT.Math.Curve.html +++ /dev/null @@ -1,1288 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Math.Curve - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Math.Curve -

    - - -

    - - - - - - -
    Defined in: Curve.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - coordlist -
    -
    A collection of CAAT.Math.Point objects.
    -
      - -
    Draw interactive handlers ?
    -
      - -
    If this segments belongs to an interactive path, the handlers will be this size.
    -
      -
    - k -
    -
    Minimun solver step.
    -
      -
    - length -
    -
    Curve length.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    applyAsPath(director) -
    -
    -
      - -
    Calculate the curve length by incrementally solving the curve every substep=CAAT.Curve.k.
    -
      - -
    Return the first curve control point.
    -
      -
    getBoundingBox(rectangle) -
    -
    Calculates a curve bounding box.
    -
      -
    getContour(numSamples) -
    -
    Get an array of points defining the curve contour.
    -
      - -
    Return the cached curve length.
    -
      -
    paint(director) -
    -
    Paint the curve control points.
    -
      -
    setPoint(point, index) -
    -
    -
      -
    setPoints(points) -
    -
    -
      -
    solve(point, t) -
    -
    This method must be overriden by subclasses.
    -
      - -
    Return the last curve control point.
    -
      -
    update() -
    -
    Signal the curve has been modified and recalculate curve length.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Math.Curve() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - coordlist - -
    -
    - A collection of CAAT.Math.Point objects. - - -
    - - - - - - - - -
    - - -
    - - - drawHandles - -
    -
    - Draw interactive handlers ? - - -
    - - - - - - - - -
    - - -
    - - - HANDLE_SIZE - -
    -
    - If this segments belongs to an interactive path, the handlers will be this size. - - -
    - - - - - - - - -
    - - -
    - - - k - -
    -
    - Minimun solver step. - - -
    - - - - - - - - -
    - - -
    - - - length - -
    -
    - Curve length. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - - applyAsPath(director) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    <=CAAT.Director>
    - -
    - - - - - - - - -
    - - -
    - - {number} - calcLength() - -
    -
    - Calculate the curve length by incrementally solving the curve every substep=CAAT.Curve.k. This value defaults -to .05 so at least 20 iterations will be performed. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number} the approximate curve length.
    - -
    - - - - -
    - - -
    - - {CAAT.Point} - endCurvePosition() - -
    -
    - Return the first curve control point. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - -
    - - -
    - - {CAAT.Rectangle} - getBoundingBox(rectangle) - -
    -
    - Calculates a curve bounding box. - - -
    - - - - -
    -
    Parameters:
    - -
    - rectangle - -
    -
    {CAAT.Rectangle} a rectangle to hold the bounding box.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Rectangle} the rectangle parameter.
    - -
    - - - - -
    - - -
    - - - getContour(numSamples) - -
    -
    - Get an array of points defining the curve contour. - - -
    - - - - -
    -
    Parameters:
    - -
    - numSamples - -
    -
    {number} number of segments to get.
    - -
    - - - - - - - - -
    - - -
    - - {number} - getLength() - -
    -
    - Return the cached curve length. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number} the cached curve length.
    - -
    - - - - -
    - - -
    - - - paint(director) - -
    -
    - Paint the curve control points. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - - - - - - - - -
    - - -
    - - - setPoint(point, index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPoints(points) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - points - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.Point} - solve(point, t) - -
    -
    - This method must be overriden by subclasses. It is called whenever the curve must be solved for some time=t. -The t parameter must be in the range 0..1 - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Point} to store curve solution for t.
    - -
    - t - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Point} the point parameter.
    - -
    - - - - -
    - - -
    - - {CAAT.Point} - startCurvePosition() - -
    -
    - Return the last curve control point. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - -
    - - -
    - - - update() - -
    -
    - Signal the curve has been modified and recalculate curve length. - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Math.Dimension.html b/documentation/jsdoc/symbols/CAAT.Math.Dimension.html deleted file mode 100644 index db75baa0..00000000 --- a/documentation/jsdoc/symbols/CAAT.Math.Dimension.html +++ /dev/null @@ -1,702 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Math.Dimension - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Math.Dimension -

    - - -

    - - - - - - -
    Defined in: Dimension.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - height -
    -
    Height dimension.
    -
      -
    - width -
    -
    Width dimension.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(w, h) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Math.Dimension() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - height - -
    -
    - Height dimension. - - -
    - - - - - - - - -
    - - -
    - - - width - -
    -
    - Width dimension. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Math.Matrix.html b/documentation/jsdoc/symbols/CAAT.Math.Matrix.html deleted file mode 100644 index 270baafc..00000000 --- a/documentation/jsdoc/symbols/CAAT.Math.Matrix.html +++ /dev/null @@ -1,1604 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Math.Matrix - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Math.Matrix -

    - - -

    - - - - - - -
    Defined in: Matrix.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - matrix -
    -
    An array of 9 numbers.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    copy(matrix) -
    -
    Copy into this matrix the given matrix values.
    -
      - -
    Creates a new inverse matrix from this matrix.
    -
      - -
    Set this matrix to the identity matrix.
    -
      -
    multiply(m) -
    -
    Multiply this matrix by a given matrix.
    -
      -
    multiplyScalar(scalar) -
    -
    Multiply this matrix by a scalar.
    -
      - -
    Premultiply this matrix by a given matrix.
    -
      -
    rotate(angle) -
    -
    Create a new rotation matrix and set it up for the specified angle in radians.
    -
      -
    scale(scalex, scaley) -
    -
    Create a scale matrix.
    -
      - -
    -
      -
    setModelViewMatrix(x, y, sx, sy, r) -
    -
    -
      -
    setRotation(angle) -
    -
    -
      -
    setScale(scalex, scaley) -
    -
    -
      -
    setTranslate(x, y) -
    -
    Sets this matrix as a translation matrix.
    -
      -
    transformCoord(point) -
    -
    Transform a point by this matrix.
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    translate(x, y) -
    -
    Create a translation matrix.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Math.Matrix() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - matrix - -
    -
    - An array of 9 numbers. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - copy(matrix) - -
    -
    - Copy into this matrix the given matrix values. - - -
    - - - - -
    -
    Parameters:
    - -
    - matrix - -
    -
    {CAAT.Matrix}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {CAAT.Matrix} - getInverse() - -
    -
    - Creates a new inverse matrix from this matrix. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Matrix} an inverse matrix.
    - -
    - - - - -
    - - -
    - - - identity() - -
    -
    - Set this matrix to the identity matrix. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - multiply(m) - -
    -
    - Multiply this matrix by a given matrix. - - -
    - - - - -
    -
    Parameters:
    - -
    - m - -
    -
    {CAAT.Matrix}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - multiplyScalar(scalar) - -
    -
    - Multiply this matrix by a scalar. - - -
    - - - - -
    -
    Parameters:
    - -
    - scalar - -
    -
    {number} scalar value
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - premultiply(m) - -
    -
    - Premultiply this matrix by a given matrix. - - -
    - - - - -
    -
    Parameters:
    - -
    - m - -
    -
    {CAAT.Matrix}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {CAAT.Matrix} - rotate(angle) - -
    -
    - Create a new rotation matrix and set it up for the specified angle in radians. - - -
    - - - - -
    -
    Parameters:
    - -
    - angle - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Matrix} a matrix object.
    - -
    - - - - -
    - - -
    - - {CAAT.Matrix} - scale(scalex, scaley) - -
    -
    - Create a scale matrix. - - -
    - - - - -
    -
    Parameters:
    - -
    - scalex - -
    -
    {number} x scale magnitude.
    - -
    - scaley - -
    -
    {number} y scale magnitude.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Matrix} a matrix object.
    - -
    - - - - -
    - - -
    - - - setCoordinateClamping(clamp) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - clamp - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setModelViewMatrix(x, y, sx, sy, r) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - sx - -
    -
    - -
    - sy - -
    -
    - -
    - r - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setRotation(angle) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - angle - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setScale(scalex, scaley) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - scalex - -
    -
    - -
    - scaley - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setTranslate(x, y) - -
    -
    - Sets this matrix as a translation matrix. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.Point} - transformCoord(point) - -
    -
    - Transform a point by this matrix. The parameter point will be modified with the transformation values. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Point}.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Point} the parameter point.
    - -
    - - - - -
    - - -
    - - - transformRenderingContext_Clamp(ctx) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - transformRenderingContext_NoClamp(ctx) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - transformRenderingContextSet_Clamp(ctx) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - transformRenderingContextSet_NoClamp(ctx) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.Matrix} - translate(x, y) - -
    -
    - Create a translation matrix. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number} x translation magnitude.
    - -
    - y - -
    -
    {number} y translation magnitude.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Matrix} a matrix object.
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Math.Matrix3.html b/documentation/jsdoc/symbols/CAAT.Math.Matrix3.html deleted file mode 100644 index 34a8f967..00000000 --- a/documentation/jsdoc/symbols/CAAT.Math.Matrix3.html +++ /dev/null @@ -1,1892 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Math.Matrix3 - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Math.Matrix3 -

    - - -

    - - - - - - -
    Defined in: Matrix3.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - fmatrix -
    -
    An array of 16 numbers.
    -
      -
    - matrix -
    -
    An Array of 4 Array of 4 numbers.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      - -
    Calculate this matrix's determinant.
    -
      -
    copy(m) -
    -
    Copy a given matrix values into this one's.
    -
      -
    flatten() -
    -
    -
      - -
    Creates a new matrix being a copy of this matrix.
    -
      - -
    Return a new matrix which is this matrix's inverse matrix.
    -
      - -
    Get this matri'x internal representation data.
    -
      - -
    Set this matrix to identity matrix.
    -
      -
    initialize(x0, y0, z0, x1, y1, z1, x2, y2, z2) -
    -
    -
      -
    initWithMatrix(matrixData) -
    -
    -
      -
    multiply(n) -
    -
    Multiplies this matrix by another matrix.
    -
      -
    multiplyScalar(scalar) -
    -
    Multiply this matrix by a scalar.
    -
      - -
    Pre multiplies this matrix by a given matrix.
    -
      -
    rotate(xy, xz, yz) -
    -
    Creates a matrix to represent arbitrary rotations around the given planes.
    -
      -
    rotateModelView(xy, xz, yz) -
    -
    Set this matrix as the rotation matrix around the given axes.
    -
      -
    rotateXY(xy) -
    -
    Multiply this matrix by a created rotation matrix.
    -
      -
    rotateXZ(xz) -
    -
    Multiply this matrix by a created rotation matrix.
    -
      -
    rotateYZ(yz) -
    -
    Multiply this matrix by a created rotation matrix.
    -
      -
    scale(sx, sy, sz) -
    -
    -
      -
    setRotate(xy, xz, yz) -
    -
    -
      -
    setScale(sx, sy, sz) -
    -
    -
      -
    setTranslate(x, y, z) -
    -
    Set this matrix translation values to be the given parameters.
    -
      -
    transformCoord(point) -
    -
    -
      -
    translate(x, y, z) -
    -
    Create a translation matrix.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Math.Matrix3() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - fmatrix - -
    -
    - An array of 16 numbers. - - -
    - - - - - - - - -
    - - -
    - - - matrix - -
    -
    - An Array of 4 Array of 4 numbers. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {number} - calculateDeterminant() - -
    -
    - Calculate this matrix's determinant. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number} matrix determinant.
    - -
    - - - - -
    - - -
    - - - copy(m) - -
    -
    - Copy a given matrix values into this one's. - - -
    - - - - -
    -
    Parameters:
    - -
    - m - -
    -
    {CAAT.Matrix} a matrix
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - flatten() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {CAAT.Matrix3} - getClone() - -
    -
    - Creates a new matrix being a copy of this matrix. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Matrix3} a newly allocated matrix object.
    - -
    - - - - -
    - - -
    - - {CAAT.Matrix3} - getInverse() - -
    -
    - Return a new matrix which is this matrix's inverse matrix. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Matrix3} a new matrix.
    - -
    - - - - -
    - - -
    - - - getMatrix() - -
    -
    - Get this matri'x internal representation data. The bakced structure is a 4x4 array of number. - - -
    - - - - - - - - - - - -
    - - -
    - - - identity() - -
    -
    - Set this matrix to identity matrix. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - initialize(x0, y0, z0, x1, y1, z1, x2, y2, z2) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x0 - -
    -
    - -
    - y0 - -
    -
    - -
    - z0 - -
    -
    - -
    - x1 - -
    -
    - -
    - y1 - -
    -
    - -
    - z1 - -
    -
    - -
    - x2 - -
    -
    - -
    - y2 - -
    -
    - -
    - z2 - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - initWithMatrix(matrixData) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - matrixData - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - multiply(n) - -
    -
    - Multiplies this matrix by another matrix. - - -
    - - - - -
    -
    Parameters:
    - -
    - n - -
    -
    {CAAT.Matrix3} a CAAT.Matrix3 object.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - multiplyScalar(scalar) - -
    -
    - Multiply this matrix by a scalar. - - -
    - - - - -
    -
    Parameters:
    - -
    - scalar - -
    -
    {number} scalar value
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - premultiply(m) - -
    -
    - Pre multiplies this matrix by a given matrix. - - -
    - - - - -
    -
    Parameters:
    - -
    - m - -
    -
    {CAAT.Matrix3} a CAAT.Matrix3 object.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {CAAT.Matrix3} - rotate(xy, xz, yz) - -
    -
    - Creates a matrix to represent arbitrary rotations around the given planes. - - -
    - - - - -
    -
    Parameters:
    - -
    - xy - -
    -
    {number} radians to rotate around xy plane.
    - -
    - xz - -
    -
    {number} radians to rotate around xz plane.
    - -
    - yz - -
    -
    {number} radians to rotate around yz plane.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Matrix3} a newly allocated matrix.
    - -
    - - - - -
    - - -
    - - - rotateModelView(xy, xz, yz) - -
    -
    - Set this matrix as the rotation matrix around the given axes. - - -
    - - - - -
    -
    Parameters:
    - -
    - xy - -
    -
    {number} radians of rotation around z axis.
    - -
    - xz - -
    -
    {number} radians of rotation around y axis.
    - -
    - yz - -
    -
    {number} radians of rotation around x axis.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - rotateXY(xy) - -
    -
    - Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate around -xy axis. - - -
    - - - - -
    -
    Parameters:
    - -
    - xy - -
    -
    {Number} radians to rotate.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - rotateXZ(xz) - -
    -
    - Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate around -xz axis. - - -
    - - - - -
    -
    Parameters:
    - -
    - xz - -
    -
    {Number} radians to rotate.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - rotateYZ(yz) - -
    -
    - Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate aroind -yz axis. - - -
    - - - - -
    -
    Parameters:
    - -
    - yz - -
    -
    {Number} radians to rotate.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - scale(sx, sy, sz) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - sx - -
    -
    - -
    - sy - -
    -
    - -
    - sz - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setRotate(xy, xz, yz) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - xy - -
    -
    - -
    - xz - -
    -
    - -
    - yz - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setScale(sx, sy, sz) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - sx - -
    -
    - -
    - sy - -
    -
    - -
    - sz - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setTranslate(x, y, z) - -
    -
    - Set this matrix translation values to be the given parameters. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number} x component of translation point.
    - -
    - y - -
    -
    {number} y component of translation point.
    - -
    - z - -
    -
    {number} z component of translation point.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - transformCoord(point) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.Matrix3} - translate(x, y, z) - -
    -
    - Create a translation matrix. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number}
    - -
    - y - -
    -
    {number}
    - -
    - z - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Matrix3} a new matrix.
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Math.Point.html b/documentation/jsdoc/symbols/CAAT.Math.Point.html deleted file mode 100644 index d234464e..00000000 --- a/documentation/jsdoc/symbols/CAAT.Math.Point.html +++ /dev/null @@ -1,1582 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Math.Point - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Math.Point -

    - - -

    - - - - - - -
    Defined in: Point.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - x -
    -
    point x coordinate.
    -
      -
    - y -
    -
    point y coordinate.
    -
      -
    - z -
    -
    point z coordinate.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(xpos, ypos, zpos) -
    -
    -
      -
    clone() -
    -
    Create a new CAAT.Point equal to this one.
    -
      - -
    Return the angle from -Pi to Pi of this point.
    -
      -
    getDistance(point) -
    -
    Get the distance between two points.
    -
      - -
    Get the squared distance between two points.
    -
      - -
    Get this point's lenght.
    -
      - -
    Get this point's squared length.
    -
      -
    limit(max) -
    -
    Set this point coordinates proportinally to a maximum value.
    -
      -
    multiply(factor) -
    -
    Multiply this point by a scalar.
    -
      - -
    Normalize this point, that is, both set coordinates proportionally to values raning 0.
    -
      -
    rotate(angle) -
    -
    Rotate this point by an angle.
    -
      -
    set(x, y, z) -
    -
    Sets this point coordinates.
    -
      -
    setAngle(angle) -
    -
    -
      -
    setLength(length) -
    -
    -
      -
    subtract(aPoint) -
    -
    Substract a point from this one.
    -
      - -
    Get a string representation.
    -
      -
    translate(x, y, z) -
    -
    Translate this point to another position.
    -
      -
    translatePoint(aPoint) -
    -
    Translate this point to another point.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Math.Point() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - x - -
    -
    - point x coordinate. - - -
    - - - - - - - - -
    - - -
    - - - y - -
    -
    - point y coordinate. - - -
    - - - - - - - - -
    - - -
    - - - z - -
    -
    - point z coordinate. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(xpos, ypos, zpos) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - xpos - -
    -
    - -
    - ypos - -
    -
    - -
    - zpos - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.Point} - clone() - -
    -
    - Create a new CAAT.Point equal to this one. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - -
    - - -
    - - {number} - getAngle() - -
    -
    - Return the angle from -Pi to Pi of this point. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - {number} - getDistance(point) - -
    -
    - Get the distance between two points. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Point}
    - -
    - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - {number} - getDistanceSquared(point) - -
    -
    - Get the squared distance between two points. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Point}
    - -
    - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - {number} - getLength() - -
    -
    - Get this point's lenght. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - {number} - getLengthSquared() - -
    -
    - Get this point's squared length. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - limit(max) - -
    -
    - Set this point coordinates proportinally to a maximum value. - - -
    - - - - -
    -
    Parameters:
    - -
    - max - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - multiply(factor) - -
    -
    - Multiply this point by a scalar. - - -
    - - - - -
    -
    Parameters:
    - -
    - factor - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - normalize() - -
    -
    - Normalize this point, that is, both set coordinates proportionally to values raning 0..1 - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - rotate(angle) - -
    -
    - Rotate this point by an angle. The rotation is held by (0,0) coordinate as center. - - -
    - - - - -
    -
    Parameters:
    - -
    - angle - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - set(x, y, z) - -
    -
    - Sets this point coordinates. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number}
    - -
    - y - -
    -
    {number}
    - -
    - z - -
    -
    {number=}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setAngle(angle) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - angle - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setLength(length) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - length - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - subtract(aPoint) - -
    -
    - Substract a point from this one. - - -
    - - - - -
    -
    Parameters:
    - -
    - aPoint - -
    -
    {CAAT.Point}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {string} - toString() - -
    -
    - Get a string representation. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {string}
    - -
    - - - - -
    - - -
    - - - translate(x, y, z) - -
    -
    - Translate this point to another position. The final point will be (point.x+x, point.y+y) - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number}
    - -
    - y - -
    -
    {number}
    - -
    - z - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - translatePoint(aPoint) - -
    -
    - Translate this point to another point. - - -
    - - - - -
    -
    Parameters:
    - -
    - aPoint - -
    -
    {CAAT.Point}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Math.Rectangle.html b/documentation/jsdoc/symbols/CAAT.Math.Rectangle.html deleted file mode 100644 index b6821426..00000000 --- a/documentation/jsdoc/symbols/CAAT.Math.Rectangle.html +++ /dev/null @@ -1,1395 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Math.Rectangle - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Math.Rectangle -

    - - -

    - - - - - - -
    Defined in: Rectangle.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - height -
    -
    Rectangle height.
    -
      -
    - width -
    -
    Rectangle width.
    -
      -
    - x -
    -
    Rectangle x position.
    -
      -
    - x1 -
    -
    Rectangle x1 position.
    -
      -
    - y -
    -
    Rectangle y position.
    -
      -
    - y1 -
    -
    Rectangle y1 position.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(x, y, w, h) -
    -
    -
      -
    contains(px, py) -
    -
    Return whether the coordinate is inside this rectangle.
    -
      -
    intersect(i, r) -
    -
    -
      - -
    -
      -
    intersectsRect(x, y, w, h) -
    -
    -
      -
    isEmpty() -
    -
    Return whether this rectangle is empty, that is, has zero dimension.
    -
      -
    setBounds(x, y, w, h) -
    -
    -
      -
    setDimension(w, h) -
    -
    Set this rectangle's dimension.
    -
      - -
    -
      -
    setLocation(x, y) -
    -
    Set this rectangle's location.
    -
      -
    union(px, py) -
    -
    Set this rectangle as the union of this rectangle and the given point.
    -
      -
    unionRectangle(rectangle) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Math.Rectangle() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - height - -
    -
    - Rectangle height. - - -
    - - - - - - - - -
    - - -
    - - - width - -
    -
    - Rectangle width. - - -
    - - - - - - - - -
    - - -
    - - - x - -
    -
    - Rectangle x position. - - -
    - - - - - - - - -
    - - -
    - - - x1 - -
    -
    - Rectangle x1 position. - - -
    - - - - - - - - -
    - - -
    - - - y - -
    -
    - Rectangle y position. - - -
    - - - - - - - - -
    - - -
    - - - y1 - -
    -
    - Rectangle y1 position. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(x, y, w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {boolean} - contains(px, py) - -
    -
    - Return whether the coordinate is inside this rectangle. - - -
    - - - - -
    -
    Parameters:
    - -
    - px - -
    -
    {number}
    - -
    - py - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    {boolean}
    - -
    - - - - -
    - - -
    - - - intersect(i, r) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - i - -
    -
    - -
    - r - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - intersects(r) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - r - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - intersectsRect(x, y, w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {boolean} - isEmpty() - -
    -
    - Return whether this rectangle is empty, that is, has zero dimension. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {boolean}
    - -
    - - - - -
    - - -
    - - - setBounds(x, y, w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setDimension(w, h) - -
    -
    - Set this rectangle's dimension. - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    {number}
    - -
    - h - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setEmpty() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - setLocation(x, y) - -
    -
    - Set this rectangle's location. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number}
    - -
    - y - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - union(px, py) - -
    -
    - Set this rectangle as the union of this rectangle and the given point. - - -
    - - - - -
    -
    Parameters:
    - -
    - px - -
    -
    {number}
    - -
    - py - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - unionRectangle(rectangle) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - rectangle - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Math.html b/documentation/jsdoc/symbols/CAAT.Math.html deleted file mode 100644 index d0211376..00000000 --- a/documentation/jsdoc/symbols/CAAT.Math.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Math - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Math -

    - - -

    - - - - - - -
    Defined in: Bezier.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      -
    - CAAT.Math -
    -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Math -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Audio.AudioManager.html b/documentation/jsdoc/symbols/CAAT.Module.Audio.AudioManager.html deleted file mode 100644 index 6a227c00..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Audio.AudioManager.html +++ /dev/null @@ -1,1984 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Audio.AudioManager - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Audio.AudioManager -

    - - -

    - - - - - - -
    Defined in: AudioManager.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    A collection of Audio objects.
    -
      - -
    available formats for audio elements.
    -
      - -
    Audio formats.
    -
      -
    - channels -
    -
    A cache of empty Audio objects.
    -
      -
    - fxEnabled -
    -
    Are FX sounds enabled ?
    -
      - -
    Currently looping Audio objects.
    -
      - -
    The only background music audio channel.
    -
      - -
    Is music enabled ?
    -
      - -
    Currently used Audio objects.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   - -
    -
    <private>   -
    __init() -
    -
    -
    <private>   - -
    -
      -
    addAudio(id, array_of_url_or_domnodes, endplaying_callback) -
    -
    creates an Audio object and adds it to the audio cache.
    -
    <private>   -
    addAudioElement(id, element, endplaying_callback) -
    -
    Adds an elements to the audio cache.
    -
    <private>   -
    addAudioFromDomNode(id, audio, endplaying_callback) -
    -
    Tries to add an audio tag to the available list of valid audios.
    -
    <private>   -
    addAudioFromURL(id, url, endplaying_callback) -
    -
    Tries to add an audio tag to the available list of valid audios.
    -
      -
    cancelPlay(id) -
    -
    cancel all instances of a sound identified by id.
    -
      -
    cancelPlayByChannel(audioObject) -
    -
    cancel a channel sound
    -
      - -
    Cancel all playing audio channels -Get back the playing channels to available channel list.
    -
      -
    getAudio(aId) -
    -
    Returns an audio object.
    -
      -
    initialize(numChannels) -
    -
    Initializes the sound subsystem by creating a fixed number of Audio channels.
    -
      - -
    -
      - -
    -
      -
    loop(id) -
    -
    This method creates a new AudioChannel to loop the sound with.
    -
      -
    play(id) -
    -
    Plays an audio file from the cache if any sound channel is available.
    -
      -
    playMusic(id) -
    -
    -
      - -
    -
      -
    setMusicEnabled(enable) -
    -
    -
      - -
    -
      -
    setVolume(id, volume) -
    -
    Set an audio object volume.
    -
      - -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Audio.AudioManager() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - audioCache - -
    -
    - A collection of Audio objects. - - -
    - - - - - - - - -
    - - -
    - - - audioFormatExtensions - -
    -
    - available formats for audio elements. -the system will load audio files with the extensions in this preferred order. - - -
    - - - - - - - - -
    - - -
    - - - audioTypes - -
    -
    - Audio formats. - - -
    - - - - - - - - -
    - - -
    - - - channels - -
    -
    - A cache of empty Audio objects. - - -
    - - - - - - - - -
    - - -
    - - - fxEnabled - -
    -
    - Are FX sounds enabled ? - - -
    - - - - - - - - -
    - - -
    - - - loopingChannels - -
    -
    - Currently looping Audio objects. - - -
    - - - - - - - - -
    - - -
    - - - musicChannel - -
    -
    - The only background music audio channel. - - -
    - - - - - - - - -
    - - -
    - - - musicEnabled - -
    -
    - Is music enabled ? - - -
    - - - - - - - - -
    - - -
    - - - workingChannels - -
    -
    - Currently used Audio objects. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __getAudioUrl(url) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - url - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - __setCurrentAudioFormatExtension() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - addAudio(id, array_of_url_or_domnodes, endplaying_callback) - -
    -
    - creates an Audio object and adds it to the audio cache. -This function expects audio data described by two elements, an id and an object which will -describe an audio element to be associated with the id. The object will be of the form -array, dom node or a url string. - -

    -The audio element can be one of the two forms: - -

      -
    1. Either an HTMLAudioElement/Audio object or a string url. -
    2. An array of elements of the previous form. -
    - -

    -When the audio attribute is an array, this function will iterate throught the array elements -until a suitable audio element to be played is found. When this is the case, the other array -elements won't be taken into account. The valid form of using this addAudio method will be: - -

    -1.
    -addAudio( id, url } ). In this case, if the resource pointed by url is -not suitable to be played (i.e. a call to the Audio element's canPlayType method return 'no') -no resource will be added under such id, so no sound will be played when invoking the play(id) -method. -

    -2.
    -addAudio( id, dom_audio_tag ). In this case, the same logic than previous case is applied, but -this time, the parameter url is expected to be an audio tag present in the html file. -

    -3.
    -addAudio( id, [array_of_url_or_domaudiotag] ). In this case, the function tries to locate a valid -resource to be played in any of the elements contained in the array. The array element's can -be any type of case 1 and 2. As soon as a valid resource is found, it will be associated to the -id in the valid audio resources to be played list. - - -

    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - array_of_url_or_domnodes - -
    -
    - -
    - endplaying_callback - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    <private> - - {boolean} - addAudioElement(id, element, endplaying_callback) - -
    -
    - Adds an elements to the audio cache. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {object} an object to associate the audio element (if suitable to be played).
    - -
    - element - -
    -
    {URL|HTMLElement} an url or html audio tag.
    - -
    - endplaying_callback - -
    -
    {function} callback to be called upon sound end.
    - -
    - - - - - -
    -
    Returns:
    - -
    {boolean} a boolean indicating whether the browser can play this resource.
    - -
    - - - - -
    - - -
    <private> - - {boolean} - addAudioFromDomNode(id, audio, endplaying_callback) - -
    -
    - Tries to add an audio tag to the available list of valid audios. The audio element comes from -an HTMLAudioElement. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {object} an object to associate the audio element (if suitable to be played).
    - -
    - audio - -
    -
    {HTMLAudioElement} a DOM audio node.
    - -
    - endplaying_callback - -
    -
    {function} callback to be called upon sound end.
    - -
    - - - - - -
    -
    Returns:
    - -
    {boolean} a boolean indicating whether the browser can play this resource.
    - -
    - - - - -
    - - -
    <private> - - {boolean} - addAudioFromURL(id, url, endplaying_callback) - -
    -
    - Tries to add an audio tag to the available list of valid audios. The audio is described by a url. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {object} an object to associate the audio element (if suitable to be played).
    - -
    - url - -
    -
    {string} a string describing an url.
    - -
    - endplaying_callback - -
    -
    {function} callback to be called upon sound end.
    - -
    - - - - - -
    -
    Returns:
    - -
    {boolean} a boolean indicating whether the browser can play this resource.
    - -
    - - - - -
    - - -
    - - {*} - cancelPlay(id) - -
    -
    - cancel all instances of a sound identified by id. This id is the value set -to identify a sound. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - {*} - cancelPlayByChannel(audioObject) - -
    -
    - cancel a channel sound - - -
    - - - - -
    -
    Parameters:
    - -
    - audioObject - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - endSound() - -
    -
    - Cancel all playing audio channels -Get back the playing channels to available channel list. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {object} - getAudio(aId) - -
    -
    - Returns an audio object. - - -
    - - - - -
    -
    Parameters:
    - -
    - aId - -
    -
    {object} the id associated to the target Audio object.
    - -
    - - - - - -
    -
    Returns:
    - -
    {object} the HTMLAudioElement addociated to the given id.
    - -
    - - - - -
    - - -
    - - - initialize(numChannels) - -
    -
    - Initializes the sound subsystem by creating a fixed number of Audio channels. -Every channel registers a handler for sound playing finalization. If a callback is set, the -callback function will be called with the associated sound id in the cache. - - -
    - - - - -
    -
    Parameters:
    - -
    - numChannels - -
    -
    {number} number of channels to pre-create. 8 by default.
    - -
    - - - - - -
    -
    Returns:
    - -
    this.
    - -
    - - - - -
    - - -
    - - - isMusicEnabled() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isSoundEffectsEnabled() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {HTMLElement} - loop(id) - -
    -
    - This method creates a new AudioChannel to loop the sound with. -It returns an Audio object so that the developer can cancel the sound loop at will. -The user must call pause() method to stop playing a loop. -

    -Firefox does not honor the loop property, so looping is performed by attending end playing -event on audio elements. - - -

    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {HTMLElement} an Audio instance if a valid sound id is supplied. Null otherwise
    - -
    - - - - -
    - - -
    - - {id: {Object}|audio: {(Audio|HTMLAudioElement)}} - play(id) - -
    -
    - Plays an audio file from the cache if any sound channel is available. -The playing sound will occupy a sound channel and when ends playing will leave -the channel free for any other sound to be played in. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {object} an object identifying a sound in the sound cache.
    - -
    - - - - - -
    -
    Returns:
    - -
    {id: {Object}|audio: {(Audio|HTMLAudioElement)}}
    - -
    - - - - -
    - - -
    - - - playMusic(id) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setAudioFormatExtensions(formats) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - formats - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setMusicEnabled(enable) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - enable - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setSoundEffectsEnabled(enable) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - enable - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setVolume(id, volume) - -
    -
    - Set an audio object volume. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {object} an audio Id
    - -
    - volume - -
    -
    {number} volume to set. The volume value is not checked.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - stopMusic() - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Audio.html b/documentation/jsdoc/symbols/CAAT.Module.Audio.html deleted file mode 100644 index 6167d19a..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Audio.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Audio - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Audio -

    - - -

    - - - - - - -
    Defined in: AudioManager.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Audio -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircle.html b/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircle.html deleted file mode 100644 index 00f3ae4d..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircle.html +++ /dev/null @@ -1,1688 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.CircleManager.PackedCircle - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.CircleManager.PackedCircle -

    - - -

    - - - - - - -
    Defined in: PackedCircle.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   -
    - CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_CONSTRAINT -
    -
    -
    <static>   -
    - CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_DESTROY -
    -
    -
    <static>   -
    - CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_IGNORE -
    -
    -
    <static>   -
    - CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_WRAP -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    - delegate -
    -
    -
      -
    - id -
    -
    -
      -
    - isFixed -
    -
    -
      -
    - offset -
    -
    -
      -
    - position -
    -
    -
      - -
    -
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    containsPoint(aPoint) -
    -
    -
      -
    dealloc() -
    -
    -
      - -
    -
      -
    initialize(overrides) -
    -
    -
      -
    intersects(aCircle) -
    -
    -
      -
    setCollisionGroup(aCollisionGroup) -
    -
    -
      -
    setCollisionMask(aCollisionMask) -
    -
    -
      -
    setDelegate(aDelegate) -
    -
    -
      -
    setIsFixed(value) -
    -
    -
      -
    setOffset(aPosition) -
    -
    -
      -
    setPosition(aPosition) -
    -
    ACCESSORS
    -
      -
    setRadius(aRadius) -
    -
    -
      -
    setTargetChaseSpeed(aTargetChaseSpeed) -
    -
    -
      -
    setTargetPosition(aTargetPosition) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.CircleManager.PackedCircle() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_CONSTRAINT - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_DESTROY - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_IGNORE - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_WRAP - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - boundsRule - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - collisionGroup - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - collisionMask - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - delegate - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - id - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - isFixed - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - offset - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - position - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - targetChaseSpeed - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - targetPosition - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - containsPoint(aPoint) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aPoint - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - dealloc() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getDistanceSquaredFromPosition(aPosition) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aPosition - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - initialize(overrides) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - overrides - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - intersects(aCircle) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aCircle - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setCollisionGroup(aCollisionGroup) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aCollisionGroup - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setCollisionMask(aCollisionMask) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aCollisionMask - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setDelegate(aDelegate) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aDelegate - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setIsFixed(value) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - value - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setOffset(aPosition) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aPosition - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPosition(aPosition) - -
    -
    - ACCESSORS - - -
    - - - - -
    -
    Parameters:
    - -
    - aPosition - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setRadius(aRadius) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aRadius - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setTargetChaseSpeed(aTargetChaseSpeed) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aTargetChaseSpeed - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setTargetPosition(aTargetPosition) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aTargetPosition - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircleManager.html b/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircleManager.html deleted file mode 100644 index 5d37452b..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircleManager.html +++ /dev/null @@ -1,1397 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.CircleManager.PackedCircleManager - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.CircleManager.PackedCircleManager -

    - - -

    - - - - - - -
    Defined in: PackedCircleManager.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    -
      -
    - bounds -
    -
    -
      - -
    -
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    addCircle(aCircle) -
    -
    Adds a circle to the simulation
    -
      -
    circlesCanCollide(circleA, circleB) -
    -
    -
      - -
    Forces all circles to move to where their delegate position is -Assumes all targets have a 'position' property!
    -
      -
    getCircleAt(xpos, ypos, buffer) -
    -
    Given an x,y position finds circle underneath and sets it to the currently grabbed circle
    -
      -
    handleBoundaryForCircle(aCircle, boundsRule) -
    -
    -
      - -
    Packs the circles towards the center of the bounds.
    -
      -
    initialize(overrides) -
    -
    -
      - -
    -
      -
    removeCircle(aCircle) -
    -
    Removes a circle from the simulations
    -
      - -
    Memory Management
    -
      -
    setBounds(x, y, w, h) -
    -
    Accessors
    -
      - -
    -
      - -
    -
      -
    sortOnDistanceToTarget(circleA, circleB) -
    -
    Helpers
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.CircleManager.PackedCircleManager() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - allCircles - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - bounds - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - numberOfCollisionPasses - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - numberOfTargetingPasses - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - addCircle(aCircle) - -
    -
    - Adds a circle to the simulation - - -
    - - - - -
    -
    Parameters:
    - -
    - aCircle - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - circlesCanCollide(circleA, circleB) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - circleA - -
    -
    - -
    - circleB - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - forceCirclesToMatchDelegatePositions() - -
    -
    - Forces all circles to move to where their delegate position is -Assumes all targets have a 'position' property! - - -
    - - - - - - - - - - - -
    - - -
    - - - getCircleAt(xpos, ypos, buffer) - -
    -
    - Given an x,y position finds circle underneath and sets it to the currently grabbed circle - - -
    - - - - -
    -
    Parameters:
    - -
    - {Number} xpos - -
    -
    An x position
    - -
    - {Number} ypos - -
    -
    A y position
    - -
    - {Number} buffer - -
    -
    A radiusSquared around the point in question where something is considered to match
    - -
    - - - - - - - - -
    - - -
    - - - handleBoundaryForCircle(aCircle, boundsRule) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aCircle - -
    -
    - -
    - boundsRule - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - handleCollisions() - -
    -
    - Packs the circles towards the center of the bounds. -Each circle will have it's own 'targetPosition' later on - - -
    - - - - - - - - - - - -
    - - -
    - - - initialize(overrides) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - overrides - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - pushAllCirclesTowardTarget(aTarget) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - aTarget - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - removeCircle(aCircle) - -
    -
    - Removes a circle from the simulations - - -
    - - - - -
    -
    Parameters:
    - -
    - aCircle - -
    -
    Circle to remove
    - -
    - - - - - - - - -
    - - -
    - - - removeExpiredElements() - -
    -
    - Memory Management - - -
    - - - - - - - - - - - -
    - - -
    - - - setBounds(x, y, w, h) - -
    -
    - Accessors - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setNumberOfCollisionPasses(value) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - value - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setNumberOfTargetingPasses(value) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - value - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - sortOnDistanceToTarget(circleA, circleB) - -
    -
    - Helpers - - -
    - - - - -
    -
    Parameters:
    - -
    - circleA - -
    -
    - -
    - circleB - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.CircleManager.html b/documentation/jsdoc/symbols/CAAT.Module.CircleManager.html deleted file mode 100644 index 45af17cc..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.CircleManager.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.CircleManager - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.CircleManager -

    - - -

    - - - - - - -
    Defined in: PackedCircle.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.CircleManager -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Collision.QuadTree.html b/documentation/jsdoc/symbols/CAAT.Module.Collision.QuadTree.html deleted file mode 100644 index a8983ee8..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Collision.QuadTree.html +++ /dev/null @@ -1,829 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Collision.QuadTree - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Collision.QuadTree -

    - - -

    - - - - - - -
    Defined in: Quadtree.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - bgActors -
    -
    For each quadtree level this keeps the list of overlapping elements.
    -
      -
    - quadData -
    -
    For each quadtree, this quadData keeps another 4 quadtrees up to the maximum recursion level.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   - -
    -
      -
    create(l, t, r, b, backgroundElements, minWidth, maxElements) -
    -
    -
      -
    getOverlappingActors(rectangle) -
    -
    Call this method to thet the list of colliding elements with the parameter rectangle.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Collision.QuadTree() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - bgActors - -
    -
    - For each quadtree level this keeps the list of overlapping elements. - - -
    - - - - - - - - -
    - - -
    - - - quadData - -
    -
    - For each quadtree, this quadData keeps another 4 quadtrees up to the maximum recursion level. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __getOverlappingActorList(actorList) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - actorList - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - create(l, t, r, b, backgroundElements, minWidth, maxElements) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - l - -
    -
    - -
    - t - -
    -
    - -
    - r - -
    -
    - -
    - b - -
    -
    - -
    - backgroundElements - -
    -
    - -
    - minWidth - -
    -
    - -
    - maxElements - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {Array} - getOverlappingActors(rectangle) - -
    -
    - Call this method to thet the list of colliding elements with the parameter rectangle. - - -
    - - - - -
    -
    Parameters:
    - -
    - rectangle - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {Array}
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Collision.SpatialHash.html b/documentation/jsdoc/symbols/CAAT.Module.Collision.SpatialHash.html deleted file mode 100644 index 911d5333..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Collision.SpatialHash.html +++ /dev/null @@ -1,1181 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Collision.SpatialHash - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Collision.SpatialHash -

    - - -

    - - - - - - -
    Defined in: SpatialHash.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - columns -
    -
    Columns to partition the space.
    -
      -
    - elements -
    -
    A collection ob objects to test collision among them.
    -
      -
    - height -
    -
    Space height
    -
      -
    - r0 -
    -
    Spare rectangle to hold temporary calculations.
    -
      -
    - r1 -
    -
    Spare rectangle to hold temporary calculations.
    -
      -
    - rows -
    -
    Rows to partition the space.
    -
      -
    - width -
    -
    Space width
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __getCells(x, y, width, height) -
    -
    -
    <private>   -
    _solveCollisionCell(cell, callback) -
    -
    -
      -
    addObject(obj) -
    -
    Add an element of the form { id, x,y,width,height, rectangular }
    -
      - -
    -
      -
    collide(x, y, w, h, oncollide) -
    -
    -
      -
    initialize(w, h, rows, columns) -
    -
    -
      -
    solveCollision(callback) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Collision.SpatialHash() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - columns - -
    -
    - Columns to partition the space. - - -
    - - - - - - - - -
    - - -
    - - - elements - -
    -
    - A collection ob objects to test collision among them. - - -
    - - - - - - - - -
    - - -
    - - - height - -
    -
    - Space height - - -
    - - - - - - - - -
    - - -
    - - - r0 - -
    -
    - Spare rectangle to hold temporary calculations. - - -
    - - - - - - - - -
    - - -
    - - - r1 - -
    -
    - Spare rectangle to hold temporary calculations. - - -
    - - - - - - - - -
    - - -
    - - - rows - -
    -
    - Rows to partition the space. - - -
    - - - - - - - - -
    - - -
    - - - width - -
    -
    - Space width - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __getCells(x, y, width, height) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - width - -
    -
    - -
    - height - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - _solveCollisionCell(cell, callback) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - cell - -
    -
    - -
    - callback - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addObject(obj) - -
    -
    - Add an element of the form { id, x,y,width,height, rectangular } - - -
    - - - - -
    -
    Parameters:
    - -
    - obj - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - clearObject() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - collide(x, y, w, h, oncollide) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - oncollide - -
    -
    function that returns boolean. if returns true, stop testing collision.
    - -
    - - - - - - - - -
    - - -
    - - - initialize(w, h, rows, columns) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - rows - -
    -
    - -
    - columns - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - solveCollision(callback) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - callback - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Collision.html b/documentation/jsdoc/symbols/CAAT.Module.Collision.html deleted file mode 100644 index 3a330c1b..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Collision.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Collision - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Collision -

    - - -

    - - - - - - -
    Defined in: Quadtree.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Collision -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.Color.html b/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.Color.html deleted file mode 100644 index ab83e558..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.Color.html +++ /dev/null @@ -1,886 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.ColorUtil.Color - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.ColorUtil.Color -

    - - -

    - - - - - - -
    Defined in: Color.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   -
    - CAAT.Module.ColorUtil.Color.RampEnumeration -
    -
    Enumeration to define types of color ramps.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <static>   -
    CAAT.Module.ColorUtil.Color.hsvToRgb(h, s, v) -
    -
    HSV to RGB color conversion -

    -H runs from 0 to 360 degrees
    -S and V run from 0 to 100 -

    -Ported from the excellent java algorithm by Eugene Vishnevsky at: -http://www.cs.rit.edu/~ncs/color/t_convert.html

    -
    <static>   -
    CAAT.Module.ColorUtil.Color.interpolate(r0, g0, b0, r1, g1, b1, nsteps, step) -
    -
    Interpolate the color between two given colors.
    -
    <static>   -
    CAAT.Module.ColorUtil.Color.makeRGBColorRamp(fromColorsArray, rampSize, returnType) -
    -
    Generate a ramp of colors from an array of given colors.
    -
    <static>   -
    CAAT.Module.ColorUtil.Color.random() -
    -
    -
    - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.ColorUtil.Color -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.Module.ColorUtil.Color.RampEnumeration - -
    -
    - Enumeration to define types of color ramps. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <static> - - - CAAT.Module.ColorUtil.Color.hsvToRgb(h, s, v) - -
    -
    - HSV to RGB color conversion -

    -H runs from 0 to 360 degrees
    -S and V run from 0 to 100 -

    -Ported from the excellent java algorithm by Eugene Vishnevsky at: -http://www.cs.rit.edu/~ncs/color/t_convert.html - - -

    - - - - -
    -
    Parameters:
    - -
    - h - -
    -
    - -
    - s - -
    -
    - -
    - v - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - {{r{number}|g{number}|b{number}}} - CAAT.Module.ColorUtil.Color.interpolate(r0, g0, b0, r1, g1, b1, nsteps, step) - -
    -
    - Interpolate the color between two given colors. The return value will be a calculated color -among the two given initial colors which corresponds to the 'step'th color of the 'nsteps' -calculated colors. - - -
    - - - - -
    -
    Parameters:
    - -
    - r0 - -
    -
    {number} initial color red component.
    - -
    - g0 - -
    -
    {number} initial color green component.
    - -
    - b0 - -
    -
    {number} initial color blue component.
    - -
    - r1 - -
    -
    {number} final color red component.
    - -
    - g1 - -
    -
    {number} final color green component.
    - -
    - b1 - -
    -
    {number} final color blue component.
    - -
    - nsteps - -
    -
    {number} number of colors to calculate including the two given colors. If 16 is passed as value, -14 colors plus the two initial ones will be calculated.
    - -
    - step - -
    -
    {number} return this color index of all the calculated colors.
    - -
    - - - - - -
    -
    Returns:
    - -
    {{r{number}|g{number}|b{number}}} return an object with the new calculated color components.
    - -
    - - - - -
    - - -
    <static> - - {[{number}|{number}|{number}|{number}]} - CAAT.Module.ColorUtil.Color.makeRGBColorRamp(fromColorsArray, rampSize, returnType) - -
    -
    - Generate a ramp of colors from an array of given colors. - - -
    - - - - -
    -
    Parameters:
    - -
    - fromColorsArray - -
    -
    {[number]} an array of colors. each color is defined by an integer number from which -color components will be extracted. Be aware of the alpha component since it will also be interpolated for -new colors.
    - -
    - rampSize - -
    -
    {number} number of colors to produce.
    - -
    - returnType - -
    -
    {CAAT.ColorUtils.RampEnumeration} a value of CAAT.ColorUtils.RampEnumeration enumeration.
    - -
    - - - - - -
    -
    Returns:
    - -
    {[{number}|{number}|{number}|{number}]} an array of integers each of which represents a color of -the calculated color ramp.
    - -
    - - - - -
    - - -
    <static> - - - CAAT.Module.ColorUtil.Color.random() - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.html b/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.html deleted file mode 100644 index 9c396ccb..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.html +++ /dev/null @@ -1,546 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.ColorUtil - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.ColorUtil -

    - - -

    - - - - - - -
    Defined in: Color.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.ColorUtil -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Debug.Debug.html b/documentation/jsdoc/symbols/CAAT.Module.Debug.Debug.html deleted file mode 100644 index 581b6686..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Debug.Debug.html +++ /dev/null @@ -1,750 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Debug.Debug - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Debug.Debug -

    - - -

    - - - - - - -
    Defined in: Debug.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    debugInfo(statistics) -
    -
    -
      -
    initialize(w, h) -
    -
    -
      -
    paint(rafValue) -
    -
    -
      -
    setScale(s) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Debug.Debug() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    - - - debugInfo(statistics) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - statistics - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - initialize(w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - paint(rafValue) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - rafValue - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setScale(s) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - s - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Debug.html b/documentation/jsdoc/symbols/CAAT.Module.Debug.html deleted file mode 100644 index 53f2af9b..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Debug.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Debug - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Debug -

    - - -

    - - - - - - -
    Defined in: Debug.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Debug -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Font.Font.html b/documentation/jsdoc/symbols/CAAT.Module.Font.Font.html deleted file mode 100644 index cd48d397..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Font.Font.html +++ /dev/null @@ -1,1484 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Font.Font - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Font.Font -

    - - -

    - - - - - - -
    Defined in: Font.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    create(chars, padding) -
    -
    -
      -
    createDefault(padding) -
    -
    -
      -
    drawSpriteText(director, time) -
    -
    -
      -
    drawText(str, ctx, x, y) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
    <static>   -
    CAAT.Module.Font.Font.getFontMetrics(font) -
    -
    -
    <static>   -
    CAAT.Module.Font.Font.getFontMetricsCSS(font) -
    -
    Totally ripped from: - -jQuery (offset function) -Daniel Earwicker: http://stackoverflow.com/questions/1134586/how-can-you-find-the-height-of-text-on-an-html-canvas
    -
    <static>   -
    CAAT.Module.Font.Font.getFontMetricsNoCSS(font) -
    -
    -
      -
    save() -
    -
    -
      - -
    -
      -
    setFillStyle(style) -
    -
    -
      -
    setFont(font) -
    -
    -
      -
    setFontSize(fontSize) -
    -
    -
      -
    setFontStyle(style) -
    -
    -
      -
    setPadding(padding) -
    -
    -
      -
    setStrokeSize(size) -
    -
    -
      -
    setStrokeStyle(style) -
    -
    -
      - -
    -
      -
    stringWidth(str) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Font.Font() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    - - - create(chars, padding) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - chars - -
    -
    - -
    - padding - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - createDefault(padding) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - padding - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - drawSpriteText(director, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - drawText(str, ctx, x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - str - -
    -
    - -
    - ctx - -
    -
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getAscent() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getDescent() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getFontData() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.Font.Font.getFontMetrics(font) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - font - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - {*} - CAAT.Module.Font.Font.getFontMetricsCSS(font) - -
    -
    - Totally ripped from: - -jQuery (offset function) -Daniel Earwicker: http://stackoverflow.com/questions/1134586/how-can-you-find-the-height-of-text-on-an-html-canvas - - -
    - - - - -
    -
    Parameters:
    - -
    - font - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    <static> - - - CAAT.Module.Font.Font.getFontMetricsNoCSS(font) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - font - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - save() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - setAsSpriteImage() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - setFillStyle(style) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - style - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setFont(font) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - font - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setFontSize(fontSize) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - fontSize - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setFontStyle(style) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - style - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPadding(padding) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - padding - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setStrokeSize(size) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - size - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setStrokeStyle(style) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - style - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - stringHeight() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - stringWidth(str) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - str - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Font.html b/documentation/jsdoc/symbols/CAAT.Module.Font.html deleted file mode 100644 index e3dd326f..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Font.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Font - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Font -

    - - -

    - - - - - - -
    Defined in: Font.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Font -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMBumpMapping.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMBumpMapping.html deleted file mode 100644 index 34cc5765..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMBumpMapping.html +++ /dev/null @@ -1,975 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Image.ImageProcessor.IMBumpMapping - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Image.ImageProcessor.IMBumpMapping -

    - - -

    - -
    Extends - CAAT.Module.Image.ImageProcessor.ImageProcessor.
    - - - - - -
    Defined in: IMBumpMapping.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    applyIM(director, time) -
    -
    Applies the bump effect and makes it visible on the canvas surface.
    -
    <private>   - -
    Create a phong image to apply bump effect.
    -
      -
    drawColored(dstPixels) -
    -
    Generates a bump image.
    -
      -
    initialize(image, radius) -
    -
    Initialize the bump image processor.
    -
    <private>   -
    prepareBump(image, radius) -
    -
    Initializes internal bump effect data.
    -
      -
    setLightColors(colors_rgb_array) -
    -
    Sets lights color.
    -
      -
    setLightPosition(lightIndex, x, y) -
    -
    Set a light position.
    -
      -
    soften(bump) -
    -
    Soften source images extracted data on prepareBump method.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Module.Image.ImageProcessor.ImageProcessor:
    clear, createPattern, getCanvas, getImageData, grabPixels, makeArray, makeArray2D, paint
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Image.ImageProcessor.IMBumpMapping() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    - - - applyIM(director, time) - -
    -
    - Applies the bump effect and makes it visible on the canvas surface. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - time - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    <private> - - - calculatePhong() - -
    -
    - Create a phong image to apply bump effect. - - -
    - - - - - - - - - - - -
    - - -
    - - - drawColored(dstPixels) - -
    -
    - Generates a bump image. - - -
    - - - - -
    -
    Parameters:
    - -
    - dstPixels - -
    -
    {ImageData.data} destinarion pixel array to store the calculated image.
    - -
    - - - - - - - - -
    - - -
    - - - initialize(image, radius) - -
    -
    - Initialize the bump image processor. - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    {HTMLImageElement} source image to bump.
    - -
    - radius - -
    -
    {number} light radius.
    - -
    - - - - - - - - -
    - - -
    <private> - - - prepareBump(image, radius) - -
    -
    - Initializes internal bump effect data. - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    {HTMLImageElement}
    - -
    - radius - -
    -
    {number} lights radius.
    - -
    - - - - - - - - -
    - - -
    - - - setLightColors(colors_rgb_array) - -
    -
    - Sets lights color. - - -
    - - - - -
    -
    Parameters:
    - -
    - colors_rgb_array - -
    -
    an array of arrays. Each internal array has three integers defining an RGB color. -ie: - [ - [ 255,0,0 ], - [ 0,255,0 ] - ]
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setLightPosition(lightIndex, x, y) - -
    -
    - Set a light position. - - -
    - - - - -
    -
    Parameters:
    - -
    - lightIndex - -
    -
    {number} light index to position.
    - -
    - x - -
    -
    {number} light x coordinate.
    - -
    - y - -
    -
    {number} light y coordinate.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - soften(bump) - -
    -
    - Soften source images extracted data on prepareBump method. - - -
    - - - - -
    -
    Parameters:
    - -
    - bump - -
    -
    bidimensional array of black and white source image version.
    - -
    - - - - - -
    -
    Returns:
    - -
    bidimensional array with softened version of source image's b&w representation.
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMPlasma.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMPlasma.html deleted file mode 100644 index 332e54c7..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMPlasma.html +++ /dev/null @@ -1,732 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Image.ImageProcessor.IMPlasma - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Image.ImageProcessor.IMPlasma -

    - - -

    - -
    Extends - CAAT.Module.Image.ImageProcessor.ImageProcessor.
    - - - - - -
    Defined in: IMPlasma.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    apply(director, time) -
    -
    Apply image processing to create the plasma and call superclass's apply to make the result -visible.
    -
      -
    initialize(width, height, colors) -
    -
    Initialize the plasma image processor.
    -
      -
    setB() -
    -
    Initialize internal plasma structures.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Module.Image.ImageProcessor.ImageProcessor:
    applyIM, clear, createPattern, getCanvas, getImageData, grabPixels, makeArray, makeArray2D, paint
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Image.ImageProcessor.IMPlasma() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    - - - apply(director, time) - -
    -
    - Apply image processing to create the plasma and call superclass's apply to make the result -visible. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - time - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - initialize(width, height, colors) - -
    -
    - Initialize the plasma image processor. -

    -This image processor creates a color ramp of 256 elements from the colors of the parameter 'colors'. -Be aware of color definition since the alpha values count to create the ramp. - - -

    - - - - -
    -
    Parameters:
    - -
    - width - -
    -
    {number}
    - -
    - height - -
    -
    {number}
    - -
    - colors - -
    -
    {Array.} an array of color values.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setB() - -
    -
    - Initialize internal plasma structures. Calling repeatedly this method will make the plasma -look different. - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMRotoZoom.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMRotoZoom.html deleted file mode 100644 index 21642668..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMRotoZoom.html +++ /dev/null @@ -1,778 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Image.ImageProcessor.IMRotoZoom - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Image.ImageProcessor.IMRotoZoom -

    - - -

    - -
    Extends - CAAT.Module.Image.ImageProcessor.ImageProcessor.
    - - - - - -
    Defined in: IMRotoZoom.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    applyIM(director, time) -
    -
    Perform and apply the rotozoom effect.
    -
      -
    initialize(width, height, patternImage) -
    -
    Initialize the rotozoom.
    -
    <private>   -
    rotoZoom(director, time) -
    -
    Performs the process of tiling rotozoom.
    -
      - -
    Change the effect's rotation anchor.
    -
    - - - -
    -
    Methods borrowed from class CAAT.Module.Image.ImageProcessor.ImageProcessor:
    clear, createPattern, getCanvas, getImageData, grabPixels, makeArray, makeArray2D, paint
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Image.ImageProcessor.IMRotoZoom() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    - - - applyIM(director, time) - -
    -
    - Perform and apply the rotozoom effect. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - time - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - initialize(width, height, patternImage) - -
    -
    - Initialize the rotozoom. - - -
    - - - - -
    -
    Parameters:
    - -
    - width - -
    -
    {number}
    - -
    - height - -
    -
    {number}
    - -
    - patternImage - -
    -
    {HTMLImageElement} image to tile with.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    <private> - - - rotoZoom(director, time) - -
    -
    - Performs the process of tiling rotozoom. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - time - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setCenter() - -
    -
    - Change the effect's rotation anchor. Call this method repeatedly to make the effect look -different. - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.ImageProcessor.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.ImageProcessor.html deleted file mode 100644 index fb0bfc2d..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.ImageProcessor.html +++ /dev/null @@ -1,1113 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Image.ImageProcessor.ImageProcessor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Image.ImageProcessor.ImageProcessor -

    - - -

    - - - - - - -
    Defined in: ImageProcessor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    applyIM(director, time) -
    -
    Sets canvas pixels to be the applied effect.
    -
      -
    clear(r, g, b, a) -
    -
    Clear this ImageData object to the given color components.
    -
      -
    createPattern(type) -
    -
    Creates a pattern that will make this ImageProcessor object suitable as a fillStyle value.
    -
      - -
    Returns the offscreen canvas.
    -
      - -
    Get this ImageData.
    -
      -
    grabPixels(image) -
    -
    Grabs an image pixels.
    -
      -
    initialize(width, height) -
    -
    Initializes and creates an offscreen Canvas object.
    -
      -
    makeArray(size, initValue) -
    -
    Helper method to create an array.
    -
      -
    makeArray2D(size, size2, initvalue) -
    -
    Helper method to create a bidimensional array.
    -
      -
    paint(director, time) -
    -
    Paint this ImageProcessor object result.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Image.ImageProcessor.ImageProcessor() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    - - - applyIM(director, time) - -
    -
    - Sets canvas pixels to be the applied effect. After process pixels, this method must be called -to show the result of such processing. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - time - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - clear(r, g, b, a) - -
    -
    - Clear this ImageData object to the given color components. - - -
    - - - - -
    -
    Parameters:
    - -
    - r - -
    -
    {number} red color component 0..255.
    - -
    - g - -
    -
    {number} green color component 0..255.
    - -
    - b - -
    -
    {number} blue color component 0..255.
    - -
    - a - -
    -
    {number} alpha color component 0..255.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - createPattern(type) - -
    -
    - Creates a pattern that will make this ImageProcessor object suitable as a fillStyle value. -This effect can be drawn too as an image by calling: canvas_context.drawImage methods. - - -
    - - - - -
    -
    Parameters:
    - -
    - type - -
    -
    {string} the pattern type. if no value is supplied 'repeat' will be used.
    - -
    - - - - - -
    -
    Returns:
    - -
    CanvasPattern.
    - -
    - - - - -
    - - -
    - - {HTMLCanvasElement} - getCanvas() - -
    -
    - Returns the offscreen canvas. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {HTMLCanvasElement}
    - -
    - - - - -
    - - -
    - - {ImageData} - getImageData() - -
    -
    - Get this ImageData. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {ImageData}
    - -
    - - - - -
    - - -
    - - {ImageData} - grabPixels(image) - -
    -
    - Grabs an image pixels. - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    {HTMLImageElement}
    - -
    - - - - - -
    -
    Returns:
    - -
    {ImageData} returns an ImageData object with the image representation or null in -case the pixels can not be grabbed.
    - -
    - - - - -
    - - -
    - - - initialize(width, height) - -
    -
    - Initializes and creates an offscreen Canvas object. It also creates an ImageData object and -initializes the internal bufferImage attribute to imageData's data. - - -
    - - - - -
    -
    Parameters:
    - -
    - width - -
    -
    {number} canvas width.
    - -
    - height - -
    -
    {number} canvas height.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {[]} - makeArray(size, initValue) - -
    -
    - Helper method to create an array. - - -
    - - - - -
    -
    Parameters:
    - -
    - size - -
    -
    {number} integer number of elements in the array.
    - -
    - initValue - -
    -
    {number} initial array values.
    - -
    - - - - - -
    -
    Returns:
    - -
    {[]} an array of 'initialValue' elements.
    - -
    - - - - -
    - - -
    - - {[]} - makeArray2D(size, size2, initvalue) - -
    -
    - Helper method to create a bidimensional array. - - -
    - - - - -
    -
    Parameters:
    - -
    - size - -
    -
    {number} number of array rows.
    - -
    - size2 - -
    -
    {number} number of array columns.
    - -
    - initvalue - -
    -
    array initial values.
    - -
    - - - - - -
    -
    Returns:
    - -
    {[]} a bidimensional array of 'initvalue' elements.
    - -
    - - - - -
    - - -
    - - - paint(director, time) - -
    -
    - Paint this ImageProcessor object result. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}.
    - -
    - time - -
    -
    {number} scene time.
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.html deleted file mode 100644 index c94b811d..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.html +++ /dev/null @@ -1,539 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Image.ImageProcessor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Image.ImageProcessor -

    - - -

    - - - - - - -
    Defined in: ImageProcessor.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Image.ImageProcessor -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageUtil.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageUtil.html deleted file mode 100644 index e68ebd37..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageUtil.html +++ /dev/null @@ -1,805 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Image.ImageUtil - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Image.ImageUtil -

    - - -

    - - - - - - -
    Defined in: ImageUtil.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <static>   -
    CAAT.Module.Image.ImageUtil.createAlphaSpriteSheet(maxAlpha, minAlpha, sheetSize, image, bg_fill_style) -
    -
    -
    <static>   -
    CAAT.Module.Image.ImageUtil.createThumb(image, w, h, best_fit) -
    -
    -
    <static>   -
    CAAT.Module.Image.ImageUtil.optimize(image, threshold, areas) -
    -
    Remove an image's padding transparent border.
    -
    <static>   -
    CAAT.Module.Image.ImageUtil.rotate(image, angle) -
    -
    Creates a rotated canvas image element.
    -
    - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Image.ImageUtil -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    <static> - - - CAAT.Module.Image.ImageUtil.createAlphaSpriteSheet(maxAlpha, minAlpha, sheetSize, image, bg_fill_style) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - maxAlpha - -
    -
    - -
    - minAlpha - -
    -
    - -
    - sheetSize - -
    -
    - -
    - image - -
    -
    - -
    - bg_fill_style - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.Image.ImageUtil.createThumb(image, w, h, best_fit) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - best_fit - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.Image.ImageUtil.optimize(image, threshold, areas) - -
    -
    - Remove an image's padding transparent border. -Transparent means that every scan pixel is alpha=0. - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    - -
    - threshold - -
    -
    - -
    - areas - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.Image.ImageUtil.rotate(image, angle) - -
    -
    - Creates a rotated canvas image element. - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    - -
    - angle - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.html b/documentation/jsdoc/symbols/CAAT.Module.Image.html deleted file mode 100644 index b230b9c8..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Image.html +++ /dev/null @@ -1,546 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Image - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Image -

    - - -

    - - - - - - -
    Defined in: ImageProcessor.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Image -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Locale.ResourceBundle.html b/documentation/jsdoc/symbols/CAAT.Module.Locale.ResourceBundle.html deleted file mode 100644 index 474fef7f..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Locale.ResourceBundle.html +++ /dev/null @@ -1,1024 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Locale.ResourceBundle - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Locale.ResourceBundle -

    - - -

    - - - - - - -
    Defined in: ResourceBundle.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   - -
    Current set locale.
    -
    <private>   - -
    Default locale info.
    -
      - -
    Original file contents.
    -
      -
    - valid -
    -
    Is this bundle valid ?
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __formatString(string, args) -
    -
    A formated string is a regular string that has embedded holder for string values.
    -
    <private>   -
    __init(resourceFile, asynch, onSuccess, onError) -
    -

    -Load a bundle file.

    -
      -
    getString(id, defaultValue, args) -
    -
    -
      -
    loadDoc(resourceFile, asynch, onSuccess, onError) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Locale.ResourceBundle() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - __currentLocale - -
    -
    - Current set locale. - - -
    - - - - - - - - -
    - - -
    <private> - - - __defaultLocale - -
    -
    - Default locale info. - - -
    - - - - - - - - -
    - - -
    - - - localeInfo - -
    -
    - Original file contents. - - -
    - - - - - - - - -
    - - -
    - - - valid - -
    -
    - Is this bundle valid ? - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - {string} - __formatString(string, args) - -
    -
    - A formated string is a regular string that has embedded holder for string values. -for example a string like: - -"hi this is a $2 $1" - -will be after calling __formatString( str, ["string","parameterized"] ); - -"hi this is a parameterized string" - -IMPORTANT: Holder values start in 1. - - -
    - - - - -
    -
    Parameters:
    - -
    - string - -
    -
    {string} a parameterized string
    - -
    - args - -
    -
    {object} object whose keys are used to find holders and replace them in string parameter
    - -
    - - - - - -
    -
    Returns:
    - -
    {string}
    - -
    - - - - -
    - - -
    <private> - - {*} - __init(resourceFile, asynch, onSuccess, onError) - -
    -
    -

    -Load a bundle file. -The expected file format is as follows: - - -{ - "defaultLocale" : "en-US", - "en-US" : { - "key1", "value1", - "key2", "value2", - ... - }, - "en-UK" : { - "key1", "value1", - "key2", "value2", - ... - } -} - - -

    -defaultLocale is compulsory. - -

    -The function getString solves as follows: - -

  406. a ResouceBundle object will honor browser/system locale by searching for these strings in - the navigator object to define the value of currentLocale: - -
      navigator.language -
        navigator.browserLanguage -
          navigator.systemLanguage -
            navigator.userLanguage - -
          • the ResouceBundle class will also get defaultLocale value, and set the corresponding key - as default Locale. - -
          • a call to getString(id,defaultValue) will work as follows: - -
            -  1)     will get the value associated in currentLocale[id]
            -  2)     if the value is set, it is returned.
            -  2.1)       else if it is not set, will get the value from defaultLocale[id] (sort of fallback)
            -  3)     if the value of defaultLocale is set, it is returned.
            -  3.1)       else defaultValue is returned.
            -
            - - -
  407. - - - - -
    -
    Parameters:
    - -
    - resourceFile - -
    -
    - -
    - asynch - -
    -
    - -
    - onSuccess - -
    -
    - -
    - onError - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - {string} - getString(id, defaultValue, args) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {string} a key from the bundle file.
    - -
    - defaultValue - -
    -
    {string} default value in case
    - -
    - args - -
    -
    {Array.=} optional arguments array in case the returned string is a - parameterized string.
    - -
    - - - - - -
    -
    Returns:
    - -
    {string}
    - -
    - - - - -
    - - -
    - - - loadDoc(resourceFile, asynch, onSuccess, onError) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - resourceFile - -
    -
    - -
    - asynch - -
    -
    - -
    - onSuccess - -
    -
    - -
    - onError - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Locale.html b/documentation/jsdoc/symbols/CAAT.Module.Locale.html deleted file mode 100644 index df5b0cc5..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Locale.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Locale - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Locale -

    - - -

    - - - - - - -
    Defined in: ResourceBundle.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Locale -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Preloader.ImagePreloader.html b/documentation/jsdoc/symbols/CAAT.Module.Preloader.ImagePreloader.html deleted file mode 100644 index 0b5d739e..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Preloader.ImagePreloader.html +++ /dev/null @@ -1,777 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Preloader.ImagePreloader - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Preloader.ImagePreloader -

    - - -

    - - - - - - -
    Defined in: ImagePreloader.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    elements counter.
    -
      -
    - images -
    -
    a list of elements to load.
    -
      - -
    notification callback invoked for each image loaded.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    loadImages(aImages, callback_loaded_one_image, callback_error) -
    -
    Start images loading asynchronous process.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Preloader.ImagePreloader() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - imageCounter - -
    -
    - elements counter. - - -
    - - - - - - - - -
    - - -
    - - - images - -
    -
    - a list of elements to load. - - -
    - - - - - - - - -
    - - -
    - - - notificationCallback - -
    -
    - notification callback invoked for each image loaded. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - loadImages(aImages, callback_loaded_one_image, callback_error) - -
    -
    - Start images loading asynchronous process. This method will notify every image loaded event -and is responsibility of the caller to count the number of loaded images to see if it fits his -needs. - - -
    - - - - -
    -
    Parameters:
    - -
    - aImages - -
    -
    {{ id:{url}, id2:{url}, ...} an object with id/url pairs.
    - -
    - callback_loaded_one_image - -
    -
    {function( imageloader {CAAT.ImagePreloader}, counter {number}, images {{ id:{string}, image: {Image}}} )} -function to call on every image load.
    - -
    - callback_error - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Preloader.Preloader.html b/documentation/jsdoc/symbols/CAAT.Module.Preloader.Preloader.html deleted file mode 100644 index e2f1b71f..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Preloader.Preloader.html +++ /dev/null @@ -1,1090 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Preloader.Preloader - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Preloader.Preloader -

    - - -

    - - - - - - -
    Defined in: Preloader.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - cerrored -
    -
    Callback error loading.
    -
      -
    - cfinished -
    -
    Callback finished loading.
    -
      -
    - cloaded -
    -
    Callback element loaded.
    -
      -
    - elements -
    -
    a list of elements to load.
    -
      - -
    elements counter.
    -
      - -
    loaded elements count.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
    <private>   -
    __onerror(d) -
    -
    -
    <private>   -
    __onload(d) -
    -
    -
      -
    addElement(id, path) -
    -
    -
      -
    clear() -
    -
    -
      -
    load(onfinished, onload_one, onerror) -
    -
    -
      -
    setBaseURL(base) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Preloader.Preloader() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - cerrored - -
    -
    - Callback error loading. - - -
    - - - - - - - - -
    - - -
    - - - cfinished - -
    -
    - Callback finished loading. - - -
    - - - - - - - - -
    - - -
    - - - cloaded - -
    -
    - Callback element loaded. - - -
    - - - - - - - - -
    - - -
    - - - elements - -
    -
    - a list of elements to load. - - -
    - - - - - - - - -
    - - -
    - - - imageCounter - -
    -
    - elements counter. - - -
    - - - - - - - - -
    - - -
    - - - loadedCount - -
    -
    - loaded elements count. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - __onerror(d) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - d - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __onload(d) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - d - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addElement(id, path) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - path - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - clear() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - load(onfinished, onload_one, onerror) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - onfinished - -
    -
    - -
    - onload_one - -
    -
    - -
    - onerror - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setBaseURL(base) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - base - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Preloader.html b/documentation/jsdoc/symbols/CAAT.Module.Preloader.html deleted file mode 100644 index 55bb8cfe..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Preloader.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Preloader - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Preloader -

    - - -

    - - - - - - -
    Defined in: ImagePreloader.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Preloader -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Runtime.BrowserInfo.html b/documentation/jsdoc/symbols/CAAT.Module.Runtime.BrowserInfo.html deleted file mode 100644 index f629d15e..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Runtime.BrowserInfo.html +++ /dev/null @@ -1,654 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Runtime.BrowserInfo - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Runtime.BrowserInfo -

    - - -

    - - - - - - -
    Defined in: BrowserInfo.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <inner>   -
    searchString(data) -
    -
    -
    <inner>   -
    searchVersion(dataString) -
    -
    -
    - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Runtime.BrowserInfo -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    <inner> - - - searchString(data) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - data - -
    -
    - -
    - - - - - - - - -
    - - -
    <inner> - - - searchVersion(dataString) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - dataString - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Runtime.html b/documentation/jsdoc/symbols/CAAT.Module.Runtime.html deleted file mode 100644 index 38556541..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Runtime.html +++ /dev/null @@ -1,546 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Runtime - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Runtime -

    - - -

    - - - - - - -
    Defined in: BrowserInfo.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Runtime -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton#SkeletonActor.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton#SkeletonActor.html deleted file mode 100644 index 1bd63474..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Skeleton#SkeletonActor.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Skeleton#SkeletonActor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Skeleton#SkeletonActor -

    - - -

    - - - - - - -
    Defined in: SkeletonActor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Skeleton#SkeletonActor() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Bone.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Bone.html deleted file mode 100644 index eb77dd4f..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Bone.html +++ /dev/null @@ -1,2217 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Skeleton.Bone - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Skeleton.Bone -

    - - -

    - - - - - - -
    Defined in: Bone.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - children -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    - matrix -
    -
    -
      -
    - parent -
    -
    -
      - -
    Bone rotation angle
    -
      -
    - size -
    -
    Bone size.
    -
      -
    - wmatrix -
    -
    -
      -
    - x -
    -
    Bone x position relative parent
    -
      -
    - y -
    -
    Bone y position relative parent
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   - -
    -
    <private>   - -
    -
    <private>   -
    __init(id) -
    -
    -
    <private>   -
    __noValue(keyframes) -
    -
    -
    <private>   -
    __setInterpolator(behavior, curve) -
    -
    -
    <private>   - -
    -
    <private>   -
    __setParent(parent) -
    -
    -
      -
    addBone(bone) -
    -
    -
      -
    addRotationKeyframe(name, angleStart, angleEnd, timeStart, timeEnd, curve) -
    -
    -
      -
    addScaleKeyframe(name, scaleX, endScaleX, scaleY, endScaleY, timeStart, timeEnd, curve) -
    -
    -
      -
    addTranslationKeyframe(name, startX, startY, endX, endY, timeStart, timeEnd, curve) -
    -
    -
      -
    apply(time, animationTime) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    paint(actorMatrix, ctx) -
    -
    -
      -
    setAnimation(name) -
    -
    -
      - -
    -
      -
    setPosition(x, y) -
    -
    -
      -
    setRotateTransform(angle, anchorX, anchorY) -
    -
    default anchor values are for spine tool.
    -
      -
    setScaleTransform(sx, sy, anchorX, anchorY) -
    -
    -
      -
    setSize(s) -
    -
    -
      - -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Skeleton.Bone() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - {Array.} - children - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - {object} - keyframesByAnimation - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - {CAAT.Behavior.ContainerBehavior} - keyframesRotate - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - {CAAT.Behavior.ContainerBehavior} - keyframesScale - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - {CAAT.Behavior.ContainerBehavior} - keyframesTranslate - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - {CAAT.PathUtil.Path} - keyframesTranslatePath - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - {CAAT.Math.Matrix} - matrix - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - {CAAT.Skeleton.Bone} - parent - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - rotationAngle - -
    -
    - Bone rotation angle - - -
    - - - - - - - - -
    - - -
    - - {number} - size - -
    -
    - Bone size. - - -
    - - - - - - - - -
    - - -
    - - {CAAT.Math.Matrix} - wmatrix - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - {number} - x - -
    -
    - Bone x position relative parent - - -
    - - - - - - - - -
    - - -
    - - - y - -
    -
    - Bone y position relative parent - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __createAnimation(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __getAnimation(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __init(id) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __noValue(keyframes) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - keyframes - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __setInterpolator(behavior, curve) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - behavior - -
    -
    - -
    - curve - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __setModelViewMatrix() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - {*} - __setParent(parent) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - parent - -
    -
    {CAAT.Skeleton.Bone}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - addBone(bone) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - bone - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addRotationKeyframe(name, angleStart, angleEnd, timeStart, timeEnd, curve) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    {string} keyframe animation name
    - -
    - angleStart - -
    -
    {number} rotation start angle
    - -
    - angleEnd - -
    -
    {number} rotation end angle
    - -
    - timeStart - -
    -
    {number} keyframe start time
    - -
    - timeEnd - -
    -
    {number} keyframe end time
    - -
    - curve - -
    -
    {Array.=} 4 numbers definint a quadric bezier info. two first points - assumed to be 0,0.
    - -
    - - - - - - - - -
    - - -
    - - - addScaleKeyframe(name, scaleX, endScaleX, scaleY, endScaleY, timeStart, timeEnd, curve) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - scaleX - -
    -
    - -
    - endScaleX - -
    -
    - -
    - scaleY - -
    -
    - -
    - endScaleY - -
    -
    - -
    - timeStart - -
    -
    - -
    - timeEnd - -
    -
    - -
    - curve - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addTranslationKeyframe(name, startX, startY, endX, endY, timeStart, timeEnd, curve) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - startX - -
    -
    - -
    - startY - -
    -
    - -
    - endX - -
    -
    - -
    - endY - -
    -
    - -
    - timeStart - -
    -
    - -
    - timeEnd - -
    -
    - -
    - curve - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - apply(time, animationTime) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number}
    - -
    - animationTime - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - endRotationKeyframes(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - endScaleKeyframes(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - endTranslationKeyframes(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - paint(actorMatrix, ctx) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - actorMatrix - -
    -
    - -
    - ctx - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setAnimation(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setBehaviorApplicationTime(t) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - t - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPosition(x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {*} - setRotateTransform(angle, anchorX, anchorY) - -
    -
    - default anchor values are for spine tool. - - -
    - - - - -
    -
    Parameters:
    - -
    - angle - -
    -
    {number}
    - -
    - anchorX - -
    -
    {number=}
    - -
    - anchorY - -
    -
    {number=}
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - {*} - setScaleTransform(sx, sy, anchorX, anchorY) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - sx - -
    -
    {number}
    - -
    - sy - -
    -
    {number}
    - -
    - anchorX - -
    -
    {number=} anchorX: .5 by default
    - -
    - anchorY - -
    -
    {number=} anchorY. .5 by default
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - setSize(s) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - s - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - transformContext(ctx) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.BoneActor.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.BoneActor.html deleted file mode 100644 index 88ef5755..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.BoneActor.html +++ /dev/null @@ -1,1286 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Skeleton.BoneActor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Skeleton.BoneActor -

    - - -

    - - - - - - -
    Defined in: BoneActor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   - -
    -
    <private>   -
    __init() -
    -
    -
    <private>   - -
    -
      -
    addAttachment(id, normalized_x, normalized_y, callback) -
    -
    -
      - -
    -
      -
    addSkinDataKeyframe(name, start, duration) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    paint(ctx, time) -
    -
    -
      -
    prepareAABB(time) -
    -
    -
      -
    setBone(bone) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Skeleton.BoneActor() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - attachments - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __getCurrentSkinInfo(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - __setupAttachments() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - addAttachment(id, normalized_x, normalized_y, callback) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - normalized_x - -
    -
    - -
    - normalized_y - -
    -
    - -
    - callback - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addAttachmentListener(al) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - al - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addSkinDataKeyframe(name, start, duration) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - start - -
    -
    - -
    - duration - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addSkinInfo(si) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - si - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - emptySkinDataKeyframe() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getAttachment(id) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - paint(ctx, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - prepareAABB(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setBone(bone) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - bone - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setDefaultSkinInfoByName(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setModelViewMatrix() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - setupAnimation(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Skeleton.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Skeleton.html deleted file mode 100644 index 0c9d1f85..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Skeleton.html +++ /dev/null @@ -1,1466 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Skeleton.Skeleton - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Skeleton.Skeleton -

    - - -

    - - - - - - -
    Defined in: Skeleton.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(skeletonDataFromFile) -
    -
    -
    <private>   -
    __setSkeleton(skeletonDataFromFile) -
    -
    -
      -
    addAnimation(name, animation) -
    -
    -
      -
    addAnimationFromFile(name, url) -
    -
    -
      -
    addBone(boneInfo) -
    -
    -
      -
    addRotationKeyframe(name, keyframeInfo) -
    -
    -
      -
    addScaleKeyframe(name, keyframeInfo) -
    -
    -
      -
    addTranslationKeyframe(name, keyframeInfo) -
    -
    -
      -
    calculate(time, animationTime) -
    -
    -
      -
    endKeyframes(name, boneId) -
    -
    -
      - -
    -
      - -
    -
      -
    getBoneByIndex(index) -
    -
    -
      - -
    -
      - -
    -
      -
    getRoot() -
    -
    -
      - -
    -
      -
    paint(actorMatrix, ctx) -
    -
    -
      -
    setAnimation(name) -
    -
    -
      - -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Skeleton.Skeleton() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(skeletonDataFromFile) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - skeletonDataFromFile - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __setSkeleton(skeletonDataFromFile) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - skeletonDataFromFile - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addAnimation(name, animation) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - animation - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addAnimationFromFile(name, url) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - url - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addBone(boneInfo) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - boneInfo - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addRotationKeyframe(name, keyframeInfo) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - keyframeInfo - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addScaleKeyframe(name, keyframeInfo) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - keyframeInfo - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addTranslationKeyframe(name, keyframeInfo) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - keyframeInfo - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - calculate(time, animationTime) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - animationTime - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - endKeyframes(name, boneId) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - boneId - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getAnimationDataByName(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getBoneById(id) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getBoneByIndex(index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getCurrentAnimationData() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getNumBones() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getRoot() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getSkeletonDataFromFile() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - paint(actorMatrix, ctx) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - actorMatrix - -
    -
    - -
    - ctx - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setAnimation(name) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setSkeletonFromFile(url) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - url - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:44 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.SkeletonActor.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.SkeletonActor.html deleted file mode 100644 index 06eb8409..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.SkeletonActor.html +++ /dev/null @@ -1,1138 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Skeleton.SkeletonActor - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.Skeleton.SkeletonActor -

    - - -

    - - - - - - -
    Defined in: SkeletonActor.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private> <static>   -
    - CAAT.Module.Skeleton.SkeletonActor._showBones -
    -
    -
    <static>   -
    - CAAT.Module.Skeleton.SkeletonActor.animationDuration -
    -
    Currently selected animation play time.
    -
    <static>   -
    - CAAT.Module.Skeleton.SkeletonActor.director -
    -
    -
    <static>   -
    - CAAT.Module.Skeleton.SkeletonActor.skeletonBoundingBox -
    -
    -
    <static>   -
    - CAAT.Module.Skeleton.SkeletonActor.skinByName -
    -
    -
    <static>   -
    - CAAT.Module.Skeleton.SkeletonActor.slotInfo -
    -
    -
    <static>   -
    - CAAT.Module.Skeleton.SkeletonActor.slotInfoArray -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private> <static>   -
    CAAT.Module.Skeleton.SkeletonActor.__init(director, skeleton) -
    -
    -
    <static>   -
    CAAT.Module.Skeleton.SkeletonActor.animate(director, time) -
    -
    -
    <static>   -
    CAAT.Module.Skeleton.SkeletonActor.calculateBoundingBox() -
    -
    -
    <static>   -
    CAAT.Module.Skeleton.SkeletonActor.postPaint(director, time) -
    -
    -
    <static>   -
    CAAT.Module.Skeleton.SkeletonActor.setAnimation(name, animationDuration) -
    -
    -
    <static>   -
    CAAT.Module.Skeleton.SkeletonActor.setSkin(skin) -
    -
    -
    <static>   -
    CAAT.Module.Skeleton.SkeletonActor.showBones(show) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.Skeleton.SkeletonActor() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> <static> - - {boolean} - CAAT.Module.Skeleton.SkeletonActor._showBones - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - {number} - CAAT.Module.Skeleton.SkeletonActor.animationDuration - -
    -
    - Currently selected animation play time. -Zero to make it last for its default value. - - -
    - - - - - - - - -
    - - -
    <static> - - {CAAT.Foundation.Director} - CAAT.Module.Skeleton.SkeletonActor.director - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - {CAAT.Math.BoundingBox} - CAAT.Module.Skeleton.SkeletonActor.skeletonBoundingBox - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - {object} - CAAT.Module.Skeleton.SkeletonActor.skinByName - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - {object} - CAAT.Module.Skeleton.SkeletonActor.slotInfo - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <static> - - {Array.} - CAAT.Module.Skeleton.SkeletonActor.slotInfoArray - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> <static> - - - CAAT.Module.Skeleton.SkeletonActor.__init(director, skeleton) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - skeleton - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.Skeleton.SkeletonActor.animate(director, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.Skeleton.SkeletonActor.calculateBoundingBox() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.Skeleton.SkeletonActor.postPaint(director, time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.Skeleton.SkeletonActor.setAnimation(name, animationDuration) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - name - -
    -
    - -
    - animationDuration - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.Skeleton.SkeletonActor.setSkin(skin) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - skin - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module.Skeleton.SkeletonActor.showBones(show) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - show - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Wed Apr 03 2013 21:51:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.html deleted file mode 100644 index 3261c4d8..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Skeleton - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Skeleton -

    - - -

    - - - - - - -
    Defined in: Bone.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Skeleton -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Storage.LocalStorage.html b/documentation/jsdoc/symbols/CAAT.Module.Storage.LocalStorage.html deleted file mode 100644 index ddd2aaa6..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Storage.LocalStorage.html +++ /dev/null @@ -1,732 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Storage.LocalStorage - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Storage.LocalStorage -

    - - -

    - - - - - - -
    Defined in: LocalStorage.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <static>   -
    CAAT.Module.Storage.LocalStorage.load(key, defValue) -
    -
    Retrieve a value from local storage.
    -
    <static>   -
    CAAT.Module.Storage.LocalStorage.remove(key) -
    -
    Removes a value stored in local storage.
    -
    <static>   -
    CAAT.Module.Storage.LocalStorage.save(key, data) -
    -
    Stores an object in local storage.
    -
    - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Storage.LocalStorage -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    <static> - - {object} - CAAT.Module.Storage.LocalStorage.load(key, defValue) - -
    -
    - Retrieve a value from local storage. - - -
    - - - - -
    -
    Parameters:
    - -
    - key - -
    -
    {string} the key to retrieve.
    - -
    - defValue - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {object} object stored under the key parameter.
    - -
    - - - - -
    - - -
    <static> - - - CAAT.Module.Storage.LocalStorage.remove(key) - -
    -
    - Removes a value stored in local storage. - - -
    - - - - -
    -
    Parameters:
    - -
    - key - -
    -
    {string}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    <static> - - - CAAT.Module.Storage.LocalStorage.save(key, data) - -
    -
    - Stores an object in local storage. The data will be saved as JSON.stringify. - - -
    - - - - -
    -
    Parameters:
    - -
    - key - -
    -
    {string} key to store data under.
    - -
    - data - -
    -
    {object} an object.
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.Storage.html b/documentation/jsdoc/symbols/CAAT.Module.Storage.html deleted file mode 100644 index 05896d4a..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.Storage.html +++ /dev/null @@ -1,546 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.Storage - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.Storage -

    - - -

    - - - - - - -
    Defined in: LocalStorage.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.Storage -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureElement.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureElement.html deleted file mode 100644 index 8d91b073..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureElement.html +++ /dev/null @@ -1,724 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.TexturePacker.TextureElement - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.TexturePacker.TextureElement -

    - - -

    - - - - - - -
    Defined in: TextureElement.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - glTexture -
    -
    -
      -
    - image -
    -
    -
      -
    - inverted -
    -
    -
      -
    - u -
    -
    -
      -
    - v -
    -
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.TexturePacker.TextureElement() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - glTexture - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - image - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - inverted - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - u - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - v - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePage.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePage.html deleted file mode 100644 index 581aba5d..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePage.html +++ /dev/null @@ -1,1424 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.TexturePacker.TexturePage - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.TexturePacker.TexturePage -

    - - -

    - - - - - - -
    Defined in: TexturePage.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    -
      -
    - criteria -
    -
    -
      -
    - gl -
    -
    -
      -
    - height -
    -
    -
      -
    - images -
    -
    -
      -
    - padding -
    -
    -
      -
    - scan -
    -
    -
      -
    - texture -
    -
    -
      -
    - width -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(w, h) -
    -
    -
      -
    addImage(image, invert, padding) -
    -
    -
      -
    changeHeuristic(criteria) -
    -
    -
      -
    clear() -
    -
    -
      -
    create(imagesCache) -
    -
    -
      -
    createFromImages(images) -
    -
    -
      - -
    -
      - -
    -
      -
    initialize(gl) -
    -
    -
      -
    packImage(img) -
    -
    -
      -
    toCanvas(canvass, outline) -
    -
    -
      -
    update(invert, padding, width, height) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.TexturePacker.TexturePage() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - allowImagesInvertion - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - criteria - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - gl - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - height - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - images - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - padding - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - scan - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - texture - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - width - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addImage(image, invert, padding) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - image - -
    -
    - -
    - invert - -
    -
    - -
    - padding - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - changeHeuristic(criteria) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - criteria - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - clear() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - create(imagesCache) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - imagesCache - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - createFromImages(images) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - images - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - deletePage() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - endCreation() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - initialize(gl) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - gl - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - packImage(img) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - img - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - toCanvas(canvass, outline) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - canvass - -
    -
    - -
    - outline - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - update(invert, padding, width, height) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - invert - -
    -
    - -
    - padding - -
    -
    - -
    - width - -
    -
    - -
    - height - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePageManager.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePageManager.html deleted file mode 100644 index 05be0add..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePageManager.html +++ /dev/null @@ -1,750 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.TexturePacker.TexturePageManager - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.TexturePacker.TexturePageManager -

    - - -

    - - - - - - -
    Defined in: TexturePageManager.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - pages -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    createPages(gl, width, height, imagesCache) -
    -
    -
      - -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.TexturePacker.TexturePageManager() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - pages - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - createPages(gl, width, height, imagesCache) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - gl - -
    -
    - -
    - width - -
    -
    - -
    - height - -
    -
    - -
    - imagesCache - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - deletePages() - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScan.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScan.html deleted file mode 100644 index 9ad7573a..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScan.html +++ /dev/null @@ -1,856 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.TexturePacker.TextureScan - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.TexturePacker.TextureScan -

    - - -

    - - - - - - -
    Defined in: TextureScan.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(w) -
    -
    -
      -
    findWhereFits(width) -
    -
    return an array of values where a chunk of width size fits in this scan.
    -
      -
    fits(position, size) -
    -
    -
      -
    log(index) -
    -
    -
      -
    substract(position, size) -
    -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.TexturePacker.TextureScan() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - freeChunks - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(w) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - findWhereFits(width) - -
    -
    - return an array of values where a chunk of width size fits in this scan. - - -
    - - - - -
    -
    Parameters:
    - -
    - width - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - fits(position, size) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - position - -
    -
    - -
    - size - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - log(index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - substract(position, size) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - position - -
    -
    - -
    - size - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScanMap.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScanMap.html deleted file mode 100644 index 3229590a..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScanMap.html +++ /dev/null @@ -1,882 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.TexturePacker.TextureScanMap - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.Module.TexturePacker.TextureScanMap -

    - - -

    - - - - - - -
    Defined in: TextureScanMap.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - scanMap -
    -
    -
      - -
    -
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(w, h) -
    -
    -
      -
    log() -
    -
    -
      -
    substract(x, y, width, height) -
    -
    -
      -
    whereFitsChunk(width, height) -
    -
    Always try to fit a chunk of size width*height pixels from left-top.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.Module.TexturePacker.TextureScanMap() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - scanMap - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - scanMapHeight - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - scanMapWidth - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(w, h) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - w - -
    -
    - -
    - h - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - log() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - substract(x, y, width, height) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - width - -
    -
    - -
    - height - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - whereFitsChunk(width, height) - -
    -
    - Always try to fit a chunk of size width*height pixels from left-top. - - -
    - - - - -
    -
    Parameters:
    - -
    - width - -
    -
    - -
    - height - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.html deleted file mode 100644 index c15424f0..00000000 --- a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.Module.TexturePacker - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.Module.TexturePacker -

    - - -

    - - - - - - -
    Defined in: TextureElement.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.Module.TexturePacker -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.ModuleManager.html b/documentation/jsdoc/symbols/CAAT.ModuleManager.html deleted file mode 100644 index 19315358..00000000 --- a/documentation/jsdoc/symbols/CAAT.ModuleManager.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.ModuleManager - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.ModuleManager -

    - - -

    - - - - - - -
    Defined in: ModuleManager.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.ModuleManager -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.ArcPath.html b/documentation/jsdoc/symbols/CAAT.PathUtil.ArcPath.html deleted file mode 100644 index ac110045..00000000 --- a/documentation/jsdoc/symbols/CAAT.PathUtil.ArcPath.html +++ /dev/null @@ -1,1834 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.PathUtil.ArcPath - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.PathUtil.ArcPath -

    - - -

    - -
    Extends - CAAT.PathUtil.PathSegment.
    - - - - - -
    Defined in: ArcPath.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - angle -
    -
    Arc end angle.
    -
      -
    - arcTo -
    -
    is a relative or absolute arc ?
    -
      -
    - cw -
    -
    Defined clockwise or counterclockwise ?
    -
      - -
    spare point for calculations
    -
      -
    - points -
    -
    A collection of CAAT.Math.Point objects which defines the arc (center, start, end)
    -
      -
    - radius -
    -
    Arc radius.
    -
      - -
    Arc start angle.
    -
    - - - -
    -
    Fields borrowed from class CAAT.PathUtil.PathSegment:
    bbox, color, length, parent
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    applyAsPath(director) -
    -
    -
      - -
    An arc starts and ends in the same point.
    -
      - -
    Returns final path segment point's x coordinate.
    -
      -
    getContour(iSize) -
    -
    -
      -
    getControlPoint(index) -
    -
    -
      -
    getPosition(time) -
    -
    -
      - -
    -
      -
    initialize(x, y, r, angle) -
    -
    -
      - -
    Returns initial path segment point's x coordinate.
    -
      -
    isArcTo() -
    -
    -
      - -
    -
      - -
    Get the number of control points.
    -
      -
    paint(director, bDrawHandles) -
    -
    Draws this path segment on screen.
    -
      -
    setArcTo(b) -
    -
    -
      - -
    -
      -
    setFinalPosition(finalX, finalY) -
    -
    Set a rectangle from points[0] to (finalX, finalY)
    -
      - -
    Set this path segment's starting position.
    -
      -
    setPoint(point, index) -
    -
    -
      -
    setPoints(points) -
    -
    An array of {CAAT.Point} composed of two points.
    -
      -
    setRadius(r) -
    -
    -
      - -
    -
      -
    updatePath(point) -
    -
    -
    - - - -
    -
    Methods borrowed from class CAAT.PathUtil.PathSegment:
    drawHandle, endPath, getBoundingBox, getLength, setColor, setParent, transform
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.PathUtil.ArcPath() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - angle - -
    -
    - Arc end angle. - - -
    - - - - - - - - -
    - - -
    - - - arcTo - -
    -
    - is a relative or absolute arc ? - - -
    - - - - - - - - -
    - - -
    - - - cw - -
    -
    - Defined clockwise or counterclockwise ? - - -
    - - - - - - - - -
    - - -
    - - - newPosition - -
    -
    - spare point for calculations - - -
    - - - - - - - - -
    - - -
    - - - points - -
    -
    - A collection of CAAT.Math.Point objects which defines the arc (center, start, end) - - -
    - - - - - - - - -
    - - -
    - - - radius - -
    -
    - Arc radius. - - -
    - - - - - - - - -
    - - -
    - - - startAngle - -
    -
    - Arc start angle. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - applyAsPath(director) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - endCurvePosition() - -
    -
    - An arc starts and ends in the same point. - - -
    - - - - - - - - - - - -
    - - -
    - - {number} - finalPositionX() - -
    -
    - Returns final path segment point's x coordinate. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - getContour(iSize) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - iSize - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getControlPoint(index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPosition(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPositionFromLength(iLength) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - iLength - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - initialize(x, y, r, angle) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - r - -
    -
    - -
    - angle - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {number} - initialPositionX() - -
    -
    - Returns initial path segment point's x coordinate. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - isArcTo() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - isClockWise() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {number} - numControlPoints() - -
    -
    - Get the number of control points. For this type of path segment, start and -ending path segment points. Defaults to 2. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - paint(director, bDrawHandles) - -
    -
    - Draws this path segment on screen. Optionally it can draw handles for every control point, in -this case, start and ending path segment points. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - bDrawHandles - -
    -
    {boolean}
    - -
    - - - - - - - - -
    - - -
    - - - setArcTo(b) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - b - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setClockWise(cw) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - cw - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setFinalPosition(finalX, finalY) - -
    -
    - Set a rectangle from points[0] to (finalX, finalY) - - -
    - - - - -
    -
    Parameters:
    - -
    - finalX - -
    -
    {number}
    - -
    - finalY - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setInitialPosition(x, y) - -
    -
    - Set this path segment's starting position. -This method should not be called again after setFinalPosition has been called. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number}
    - -
    - y - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setPoint(point, index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPoints(points) - -
    -
    - An array of {CAAT.Point} composed of two points. - - -
    - - - - -
    -
    Parameters:
    - -
    - points - -
    -
    {Array}
    - -
    - - - - - - - - -
    - - -
    - - - setRadius(r) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - r - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - startCurvePosition() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - updatePath(point) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.CurvePath.html b/documentation/jsdoc/symbols/CAAT.PathUtil.CurvePath.html deleted file mode 100644 index f488af7a..00000000 --- a/documentation/jsdoc/symbols/CAAT.PathUtil.CurvePath.html +++ /dev/null @@ -1,1482 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.PathUtil.CurvePath - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.PathUtil.CurvePath -

    - - -

    - -
    Extends - CAAT.PathUtil.PathSegment.
    - - - - - -
    Defined in: CurvePath.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - curve -
    -
    A CAAT.Math.Curve instance.
    -
      - -
    spare holder for getPosition coordinate return.
    -
    - - - -
    -
    Fields borrowed from class CAAT.PathUtil.PathSegment:
    bbox, color, length, parent
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    applyAsPath(director) -
    -
    -
      - -
    -
      - -
    Get path segment's last point's y coordinate.
    -
      -
    getContour(iSize) -
    -
    -
      -
    getControlPoint(index) -
    -
    -
      -
    getPosition(time) -
    -
    -
      - -
    Gets the coordinate on the path relative to the path length.
    -
      - -
    Get path segment's first point's x coordinate.
    -
      - -
    -
      -
    paint(director, bDrawHandles) -
    -
    -
      -
    setCubic(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) -
    -
    Set the pathSegment as a CAAT.Bezier cubic instance.
    -
      -
    setPoint(point, index) -
    -
    -
      -
    setPoints(points) -
    -
    Set this curve segment's points.
    -
      -
    setQuadric(p0x, p0y, p1x, p1y, p2x, p2y) -
    -
    Set the pathSegment as a CAAT.Bezier quadric instance.
    -
      - -
    -
      -
    updatePath(point) -
    -
    -
    - - - -
    -
    Methods borrowed from class CAAT.PathUtil.PathSegment:
    drawHandle, endPath, getBoundingBox, getLength, setColor, setParent, transform
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.PathUtil.CurvePath() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - curve - -
    -
    - A CAAT.Math.Curve instance. - - -
    - - - - - - - - -
    - - -
    - - - newPosition - -
    -
    - spare holder for getPosition coordinate return. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - applyAsPath(director) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - endCurvePosition() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {number} - finalPositionX() - -
    -
    - Get path segment's last point's y coordinate. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - getContour(iSize) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - iSize - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getControlPoint(index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPosition(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.Point} - getPositionFromLength(iLength) - -
    -
    - Gets the coordinate on the path relative to the path length. - - -
    - - - - -
    -
    Parameters:
    - -
    - iLength - -
    -
    {number} the length at which the coordinate will be taken from.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Point} a CAAT.Point instance with the coordinate on the path corresponding to the -iLenght parameter relative to segment's length.
    - -
    - - - - -
    - - -
    - - {number} - initialPositionX() - -
    -
    - Get path segment's first point's x coordinate. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - numControlPoints() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - paint(director, bDrawHandles) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - bDrawHandles - -
    -
    {boolean}
    - -
    - - - - - - - - -
    - - -
    - - - setCubic(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) - -
    -
    - Set the pathSegment as a CAAT.Bezier cubic instance. -Parameters are cubic coordinates control points. - - -
    - - - - -
    -
    Parameters:
    - -
    - p0x - -
    -
    {number}
    - -
    - p0y - -
    -
    {number}
    - -
    - p1x - -
    -
    {number}
    - -
    - p1y - -
    -
    {number}
    - -
    - p2x - -
    -
    {number}
    - -
    - p2y - -
    -
    {number}
    - -
    - p3x - -
    -
    {number}
    - -
    - p3y - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setPoint(point, index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPoints(points) - -
    -
    - Set this curve segment's points. - - -
    - - - - -
    -
    Parameters:
    - -
    - points - -
    -
    {Array}
    - -
    - - - - - - - - -
    - - -
    - - - setQuadric(p0x, p0y, p1x, p1y, p2x, p2y) - -
    -
    - Set the pathSegment as a CAAT.Bezier quadric instance. -Parameters are quadric coordinates control points. - - -
    - - - - -
    -
    Parameters:
    - -
    - p0x - -
    -
    {number}
    - -
    - p0y - -
    -
    {number}
    - -
    - p1x - -
    -
    {number}
    - -
    - p1y - -
    -
    {number}
    - -
    - p2x - -
    -
    {number}
    - -
    - p2y - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - startCurvePosition() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - updatePath(point) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.LinearPath.html b/documentation/jsdoc/symbols/CAAT.PathUtil.LinearPath.html deleted file mode 100644 index d61ba7c5..00000000 --- a/documentation/jsdoc/symbols/CAAT.PathUtil.LinearPath.html +++ /dev/null @@ -1,1407 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.PathUtil.LinearPath - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.PathUtil.LinearPath -

    - - -

    - -
    Extends - CAAT.PathUtil.PathSegment.
    - - - - - -
    Defined in: LinearPath.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    spare holder for getPosition coordinate return.
    -
      -
    - points -
    -
    A collection of points.
    -
    - - - -
    -
    Fields borrowed from class CAAT.PathUtil.PathSegment:
    bbox, color, length, parent
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    applyAsPath(director) -
    -
    -
      - -
    -
      - -
    Returns final path segment point's x coordinate.
    -
      -
    getContour(iSize) -
    -
    -
      -
    getControlPoint(index) -
    -
    -
      -
    getPosition(time) -
    -
    -
      - -
    -
      - -
    Returns initial path segment point's x coordinate.
    -
      - -
    Get the number of control points.
    -
      -
    paint(director, bDrawHandles) -
    -
    Draws this path segment on screen.
    -
      -
    setFinalPosition(finalX, finalY) -
    -
    Set this path segment's ending position.
    -
      - -
    Set this path segment's starting position.
    -
      -
    setPoint(point, index) -
    -
    -
      -
    setPoints(points) -
    -
    -
      - -
    -
      -
    updatePath(point) -
    -
    Update this segments length and bounding box info.
    -
    - - - -
    -
    Methods borrowed from class CAAT.PathUtil.PathSegment:
    drawHandle, endPath, getBoundingBox, getLength, setColor, setParent, transform
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.PathUtil.LinearPath() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - newPosition - -
    -
    - spare holder for getPosition coordinate return. - - -
    - - - - - - - - -
    - - -
    - - - points - -
    -
    - A collection of points. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - applyAsPath(director) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - endCurvePosition() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {number} - finalPositionX() - -
    -
    - Returns final path segment point's x coordinate. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - getContour(iSize) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - iSize - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getControlPoint(index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPosition(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPositionFromLength(len) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - len - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {number} - initialPositionX() - -
    -
    - Returns initial path segment point's x coordinate. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - {number} - numControlPoints() - -
    -
    - Get the number of control points. For this type of path segment, start and -ending path segment points. Defaults to 2. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - paint(director, bDrawHandles) - -
    -
    - Draws this path segment on screen. Optionally it can draw handles for every control point, in -this case, start and ending path segment points. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - bDrawHandles - -
    -
    {boolean}
    - -
    - - - - - - - - -
    - - -
    - - - setFinalPosition(finalX, finalY) - -
    -
    - Set this path segment's ending position. - - -
    - - - - -
    -
    Parameters:
    - -
    - finalX - -
    -
    {number}
    - -
    - finalY - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setInitialPosition(x, y) - -
    -
    - Set this path segment's starting position. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number}
    - -
    - y - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setPoint(point, index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPoints(points) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - points - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - startCurvePosition() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - updatePath(point) - -
    -
    - Update this segments length and bounding box info. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.Path.html b/documentation/jsdoc/symbols/CAAT.PathUtil.Path.html deleted file mode 100644 index fafe464a..00000000 --- a/documentation/jsdoc/symbols/CAAT.PathUtil.Path.html +++ /dev/null @@ -1,4509 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.PathUtil.Path - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.PathUtil.Path -

    - - -

    - -
    Extends - CAAT.PathUtil.PathSegment.
    - - - - - -
    Defined in: Path.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    starting path x position
    -
      - -
    starting path y position
    -
      - -
    A list of behaviors to apply to this path.
    -
      - -
    Path bounding box X position.
    -
      - -
    Path bounding box Y position.
    -
      -
    - closed -
    -
    Is this path closed ?
    -
      -
    - height -
    -
    Path bounding box height.
    -
      - -
    Is this path interactive ?.
    -
      -
    - matrix -
    -
    Path behaviors matrix.
    -
      - -
    spare CAAT.Math.Point to return calculated values in the path.
    -
      - -
    path length (sum of every segment length)
    -
      - -
    Original Path´s path segments points.
    -
      - -
    For each path segment in this path, the normalized calculated duration.
    -
      - -
    A collection of PathSegments.
    -
      - -
    For each path segment in this path, the normalized calculated start time.
    -
      -
    - rb_angle -
    -
    Path rotation angle.
    -
      - -
    Path rotation x anchor.
    -
      - -
    Path rotation x anchor.
    -
      - -
    Path scale X anchor.
    -
      - -
    Path scale Y anchor.
    -
      -
    - sb_scaleX -
    -
    Path X scale.
    -
      -
    - sb_scaleY -
    -
    Path Y scale.
    -
      -
    - tAnchorX -
    -
    Path translation anchor X.
    -
      -
    - tAnchorY -
    -
    Path translation anchor Y.
    -
      -
    - tb_x -
    -
    Path translation X.
    -
      -
    - tb_y -
    -
    Path translation Y.
    -
      -
    - tmpMatrix -
    -
    Spare calculation matrix.
    -
      -
    - width -
    -
    Path bounding box width.
    -
    - - - -
    -
    Fields borrowed from class CAAT.PathUtil.PathSegment:
    bbox, color, length, parent
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   - -
    -
    <private>   -
    __init() -
    -
    -
      -
    addArcTo(x1, y1, x2, y2, radius, cw, color) -
    -
    -
      -
    addBehavior(behavior) -
    -
    Add a Behavior to the Actor.
    -
      -
    addCatmullTo(px1, py1, px2, py2, px3, py3, color) -
    -
    Add a Catmull-Rom segment to this path.
    -
      -
    addCubicTo(px1, py1, px2, py2, px3, py3, color) -
    -
    Add a Cubic Bezier segment to this path.
    -
      -
    addLineTo(px1, py1, color) -
    -
    Adds a line segment to this path.
    -
      -
    addQuadricTo(px1, py1, px2, py2, color) -
    -
    Add a Quadric Bezier path segment to this path.
    -
      -
    addRectangleTo(x1, y1, cw, color) -
    -
    -
      -
    addSegment(pathSegment) -
    -
    Add a CAAT.PathSegment instance to this path.
    -
      -
    applyAsPath(director) -
    -
    Apply this path as a Canvas context path.
    -
      - -
    -
      -
    beginPath(px0, py0) -
    -
    Set the path's starting point.
    -
      - -
    Close the path by adding a line path segment from the current last path -coordinate to startCurvePosition coordinate.
    -
      -
    drag(x, y, callback) -
    -
    Drags a path's control point.
    -
      - -
    Removes all behaviors from an Actor.
    -
      - -
    Return the last point of the last path segment of this compound path.
    -
      -
    endPath() -
    -
    Finishes the process of building the path.
    -
      - -
    -
      -
    flatten(npatches, closed) -
    -
    -
      -
    getContour(iSize) -
    -
    Returns a collection of CAAT.Point objects which conform a path's contour.
    -
      -
    getControlPoint(index) -
    -
    -
      - -
    Return the last path segment added to this path.
    -
      - -
    -
      - -
    -
      - -
    Returns an integer with the number of path segments that conform this path.
    -
      -
    getPosition(time, open_contour) -
    -
    This method, returns a CAAT.Foundation.Point instance indicating a coordinate in the path.
    -
      - -
    Analogously to the method getPosition, this method returns a CAAT.Point instance with -the coordinate on the path that corresponds to the given length.
    -
      -
    getSegment(index) -
    -
    Gets a CAAT.PathSegment instance.
    -
      -
    isEmpty() -
    -
    -
      - -
    -
      -
    paint(director) -
    -
    Paints the path.
    -
      -
    press(x, y) -
    -
    Sent by a CAAT.PathActor instance object to try to drag a path's control point.
    -
      -
    release() -
    -
    Method invoked when a CAAT.PathActor stops dragging a control point.
    -
      - -
    Remove a Behavior with id param as behavior identifier from this actor.
    -
      -
    removeBehaviour(behavior) -
    -
    Remove a Behavior from the Actor.
    -
      - -
    -
      -
    setCatmullRom(points, closed) -
    -
    -
      -
    setCubic(x0, y0, x1, y1, x2, y2, x3, y3) -
    -
    Sets this path to be composed by a single Cubic Bezier path segment.
    -
      -
    setInteractive(interactive) -
    -
    Set whether this path should paint handles for every control point.
    -
      -
    setLinear(x0, y0, x1, y1) -
    -
    Set the path to be composed by a single LinearPath segment.
    -
      -
    setLocation(x, y) -
    -
    -
      -
    setPoint(point, index) -
    -
    Set a point from this path.
    -
      -
    setPoints(points) -
    -
    Reposition this path points.
    -
      -
    setPosition(x, y) -
    -
    -
      - -
    -
      -
    setPositionAnchored(x, y, ax, ay) -
    -
    -
      -
    setQuadric(x0, y0, x1, y1, x2, y2) -
    -
    Set this path to be composed by a single Quadric Bezier path segment.
    -
      -
    setRectangle(x0, y0, x1, y1) -
    -
    -
      -
    setRotation(angle) -
    -
    -
      - -
    -
      -
    setRotationAnchored(angle, rx, ry) -
    -
    -
      -
    setScale(sx, sy) -
    -
    -
      -
    setScaleAnchor(ax, ay) -
    -
    -
      -
    setScaleAnchored(scaleX, scaleY, sx, sy) -
    -
    -
      - -
    Return the first point of the first path segment of this compound path.
    -
      -
    updatePath(point, callback) -
    -
    Indicates that some path control point has changed, and that the path must recalculate -its internal data, ie: length and bbox.
    -
    - - - -
    -
    Methods borrowed from class CAAT.PathUtil.PathSegment:
    drawHandle, getBoundingBox, getLength, setColor, setParent, transform
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.PathUtil.Path() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - beginPathX - -
    -
    - starting path x position - - -
    - - - - - - - - -
    - - -
    - - - beginPathY - -
    -
    - starting path y position - - -
    - - - - - - - - -
    - - -
    - - - behaviorList - -
    -
    - A list of behaviors to apply to this path. -A path can be affine transformed to create a different path. - - -
    - - - - - - - - -
    - - -
    - - - clipOffsetX - -
    -
    - Path bounding box X position. - - -
    - - - - - - - - -
    - - -
    - - - clipOffsetY - -
    -
    - Path bounding box Y position. - - -
    - - - - - - - - -
    - - -
    - - - closed - -
    -
    - Is this path closed ? - - -
    - - - - - - - - -
    - - -
    - - - height - -
    -
    - Path bounding box height. - - -
    - - - - - - - - -
    - - -
    - - - interactive - -
    -
    - Is this path interactive ?. If so, controls points can be moved with a CAAT.Foundation.UI.PathActor. - - -
    - - - - - - - - -
    - - -
    - - - matrix - -
    -
    - Path behaviors matrix. - - -
    - - - - - - - - -
    - - -
    - - - newPosition - -
    -
    - spare CAAT.Math.Point to return calculated values in the path. - - -
    - - - - - - - - -
    - - -
    - - - pathLength - -
    -
    - path length (sum of every segment length) - - -
    - - - - - - - - -
    - - -
    - - - pathPoints - -
    -
    - Original Path´s path segments points. - - -
    - - - - - - - - -
    - - -
    - - - pathSegmentDurationTime - -
    -
    - For each path segment in this path, the normalized calculated duration. -precomputed segment duration relative to segment legnth/path length - - -
    - - - - - - - - -
    - - -
    - - - pathSegments - -
    -
    - A collection of PathSegments. - - -
    - - - - - - - - -
    - - -
    - - - pathSegmentStartTime - -
    -
    - For each path segment in this path, the normalized calculated start time. -precomputed segment start time relative to segment legnth/path length and duration. - - -
    - - - - - - - - -
    - - -
    - - - rb_angle - -
    -
    - Path rotation angle. - - -
    - - - - - - - - -
    - - -
    - - - rb_rotateAnchorX - -
    -
    - Path rotation x anchor. - - -
    - - - - - - - - -
    - - -
    - - - rb_rotateAnchorY - -
    -
    - Path rotation x anchor. - - -
    - - - - - - - - -
    - - -
    - - - sb_scaleAnchorX - -
    -
    - Path scale X anchor. - - -
    - - - - - - - - -
    - - -
    - - - sb_scaleAnchorY - -
    -
    - Path scale Y anchor. - - -
    - - - - - - - - -
    - - -
    - - - sb_scaleX - -
    -
    - Path X scale. - - -
    - - - - - - - - -
    - - -
    - - - sb_scaleY - -
    -
    - Path Y scale. - - -
    - - - - - - - - -
    - - -
    - - - tAnchorX - -
    -
    - Path translation anchor X. - - -
    - - - - - - - - -
    - - -
    - - - tAnchorY - -
    -
    - Path translation anchor Y. - - -
    - - - - - - - - -
    - - -
    - - - tb_x - -
    -
    - Path translation X. - - -
    - - - - - - - - -
    - - -
    - - - tb_y - -
    -
    - Path translation Y. - - -
    - - - - - - - - -
    - - -
    - - - tmpMatrix - -
    -
    - Spare calculation matrix. - - -
    - - - - - - - - -
    - - -
    - - - width - -
    -
    - Path bounding box width. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __getPositionImpl(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - addArcTo(x1, y1, x2, y2, radius, cw, color) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x1 - -
    -
    - -
    - y1 - -
    -
    - -
    - x2 - -
    -
    - -
    - y2 - -
    -
    - -
    - radius - -
    -
    - -
    - cw - -
    -
    - -
    - color - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addBehavior(behavior) - -
    -
    - Add a Behavior to the Actor. -An Actor accepts an undefined number of Behaviors. - - -
    - - - - -
    -
    Parameters:
    - -
    - behavior - -
    -
    {CAAT.Behavior} a CAAT.Behavior instance
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - addCatmullTo(px1, py1, px2, py2, px3, py3, color) - -
    -
    - Add a Catmull-Rom segment to this path. -The segment starts in the current last path coordinate. - - -
    - - - - -
    -
    Parameters:
    - -
    - px1 - -
    -
    {number}
    - -
    - py1 - -
    -
    {number}
    - -
    - px2 - -
    -
    {number}
    - -
    - py2 - -
    -
    {number}
    - -
    - px3 - -
    -
    {number}
    - -
    - py3 - -
    -
    {number}
    - -
    - color - -
    -
    {color=}. optional parameter. determines the color to draw the segment with (if - being drawn by a CAAT.PathActor).
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - addCubicTo(px1, py1, px2, py2, px3, py3, color) - -
    -
    - Add a Cubic Bezier segment to this path. -The segment starts in the current last path coordinate. - - -
    - - - - -
    -
    Parameters:
    - -
    - px1 - -
    -
    {number}
    - -
    - py1 - -
    -
    {number}
    - -
    - px2 - -
    -
    {number}
    - -
    - py2 - -
    -
    {number}
    - -
    - px3 - -
    -
    {number}
    - -
    - py3 - -
    -
    {number}
    - -
    - color - -
    -
    {color=}. optional parameter. determines the color to draw the segment with (if - being drawn by a CAAT.PathActor).
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - addLineTo(px1, py1, color) - -
    -
    - Adds a line segment to this path. -The segment starts in the current last path coordinate. - - -
    - - - - -
    -
    Parameters:
    - -
    - px1 - -
    -
    {number}
    - -
    - py1 - -
    -
    {number}
    - -
    - color - -
    -
    {color=}. optional parameter. determines the color to draw the segment with (if - being drawn by a CAAT.PathActor).
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - addQuadricTo(px1, py1, px2, py2, color) - -
    -
    - Add a Quadric Bezier path segment to this path. -The segment starts in the current last path coordinate. - - -
    - - - - -
    -
    Parameters:
    - -
    - px1 - -
    -
    {number}
    - -
    - py1 - -
    -
    {number}
    - -
    - px2 - -
    -
    {number}
    - -
    - py2 - -
    -
    {number}
    - -
    - color - -
    -
    {color=}. optional parameter. determines the color to draw the segment with (if - being drawn by a CAAT.PathActor).
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - addRectangleTo(x1, y1, cw, color) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x1 - -
    -
    - -
    - y1 - -
    -
    - -
    - cw - -
    -
    - -
    - color - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - addSegment(pathSegment) - -
    -
    - Add a CAAT.PathSegment instance to this path. - - -
    - - - - -
    -
    Parameters:
    - -
    - pathSegment - -
    -
    {CAAT.PathSegment}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {*} - applyAsPath(director) - -
    -
    - Apply this path as a Canvas context path. -You must explicitly call context.beginPath - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - -
    - - - applyBehaviors(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - beginPath(px0, py0) - -
    -
    - Set the path's starting point. The method startCurvePosition will return this coordinate. -

    -If a call to any method of the form addTo is called before this calling -this method, they will assume to start at -1,-1 and probably you'll get the wrong path. - - -

    - - - - -
    -
    Parameters:
    - -
    - px0 - -
    -
    {number}
    - -
    - py0 - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - closePath() - -
    -
    - Close the path by adding a line path segment from the current last path -coordinate to startCurvePosition coordinate. -

    -This method closes a path by setting its last path segment's last control point -to be the first path segment's first control point. -

    - This method also sets the path as finished, and calculates all path's information - such as length and bounding box. - - -

    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - drag(x, y, callback) - -
    -
    - Drags a path's control point. -If the method press has not set needed internal data to drag a control point, this -method will do nothing, regardless the user is dragging on the CAAT.PathActor delegate. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number}
    - -
    - y - -
    -
    {number}
    - -
    - callback - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - emptyBehaviorList() - -
    -
    - Removes all behaviors from an Actor. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - {CAAT.Point} - endCurvePosition() - -
    -
    - Return the last point of the last path segment of this compound path. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - -
    - - -
    - - - endPath() - -
    -
    - Finishes the process of building the path. It involves calculating each path segments length -and proportional length related to a normalized path length of 1. -It also sets current paths length. -These calculi are needed to traverse the path appropriately. -

    -This method must be called explicitly, except when closing a path (that is, calling the -method closePath) which calls this method as well. - - -

    - - - - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - extractPathPoints() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - flatten(npatches, closed) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - npatches - -
    -
    - -
    - closed - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {[CAAT.Point]} - getContour(iSize) - -
    -
    - Returns a collection of CAAT.Point objects which conform a path's contour. - - -
    - - - - -
    -
    Parameters:
    - -
    - iSize - -
    -
    {number}. Number of samples for each path segment.
    - -
    - - - - - -
    -
    Returns:
    - -
    {[CAAT.Point]}
    - -
    - - - - -
    - - -
    - - - getControlPoint(index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.PathSegment} - getCurrentPathSegment() - -
    -
    - Return the last path segment added to this path. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.PathSegment}
    - -
    - - - - -
    - - -
    - - - getFirstPathSegment() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getLastPathSegment() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {number} - getNumSegments() - -
    -
    - Returns an integer with the number of path segments that conform this path. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - {CAAT.Foundation.Point} - getPosition(time, open_contour) - -
    -
    - This method, returns a CAAT.Foundation.Point instance indicating a coordinate in the path. -The returned coordinate is the corresponding to normalizing the path's length to 1, -and then finding what path segment and what coordinate in that path segment corresponds -for the input time parameter. -

    -The parameter time must be a value ranging 0..1. -If not constrained to these values, the parameter will be modulus 1, and then, if less -than 0, be normalized to 1+time, so that the value always ranges from 0 to 1. -

    -This method is needed when traversing the path throughout a CAAT.Interpolator instance. - - -

    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    {number} a value between 0 and 1 both inclusive. 0 will return path's starting coordinate. -1 will return path's end coordinate.
    - -
    - open_contour - -
    -
    {boolean=} treat this path as an open contour. It is intended for -open paths, and interpolators which give values above 1. see tutorial 7.1.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Foundation.Point}
    - -
    - - - - -
    - - -
    - - {CAAT.Point} - getPositionFromLength(iLength) - -
    -
    - Analogously to the method getPosition, this method returns a CAAT.Point instance with -the coordinate on the path that corresponds to the given length. The input length is -related to path's length. - - -
    - - - - -
    -
    Parameters:
    - -
    - iLength - -
    -
    {number} a float with the target length.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - -
    - - -
    - - - getSegment(index) - -
    -
    - Gets a CAAT.PathSegment instance. - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    {number} the index of the desired CAAT.PathSegment.
    - -
    - - - - - -
    -
    Returns:
    - -
    CAAT.PathSegment
    - -
    - - - - -
    - - -
    - - - isEmpty() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - numControlPoints() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - paint(director) - -
    -
    - Paints the path. -This method is called by CAAT.PathActor instances. -If the path is set as interactive (by default) path segment will draw curve modification -handles as well. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director} a CAAT.Director instance.
    - -
    - - - - - - - - -
    - - -
    - - - press(x, y) - -
    -
    - Sent by a CAAT.PathActor instance object to try to drag a path's control point. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number}
    - -
    - y - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - release() - -
    -
    - Method invoked when a CAAT.PathActor stops dragging a control point. - - -
    - - - - - - - - - - - -
    - - -
    - - - removeBehaviorById(id) - -
    -
    - Remove a Behavior with id param as behavior identifier from this actor. -This function will remove ALL behavior instances with the given id. - - -
    - - - - -
    -
    Parameters:
    - -
    - id - -
    -
    {number} an integer. -return this;
    - -
    - - - - - - - - -
    - - -
    - - - removeBehaviour(behavior) - -
    -
    - Remove a Behavior from the Actor. -If the Behavior is not present at the actor behavior collection nothing happends. - - -
    - - - - -
    -
    Parameters:
    - -
    - behavior - -
    -
    {CAAT.Behavior} a CAAT.Behavior instance.
    - -
    - - - - - - - - -
    - - -
    - - - setATMatrix() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - setCatmullRom(points, closed) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - points - -
    -
    - -
    - closed - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setCubic(x0, y0, x1, y1, x2, y2, x3, y3) - -
    -
    - Sets this path to be composed by a single Cubic Bezier path segment. - - -
    - - - - -
    -
    Parameters:
    - -
    - x0 - -
    -
    {number}
    - -
    - y0 - -
    -
    {number}
    - -
    - x1 - -
    -
    {number}
    - -
    - y1 - -
    -
    {number}
    - -
    - x2 - -
    -
    {number}
    - -
    - y2 - -
    -
    {number}
    - -
    - x3 - -
    -
    {number}
    - -
    - y3 - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setInteractive(interactive) - -
    -
    - Set whether this path should paint handles for every control point. - - -
    - - - - -
    -
    Parameters:
    - -
    - interactive - -
    -
    {boolean}.
    - -
    - - - - - - - - -
    - - -
    - - - setLinear(x0, y0, x1, y1) - -
    -
    - Set the path to be composed by a single LinearPath segment. - - -
    - - - - -
    -
    Parameters:
    - -
    - x0 - -
    -
    {number}
    - -
    - y0 - -
    -
    {number}
    - -
    - x1 - -
    -
    {number}
    - -
    - y1 - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setLocation(x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPoint(point, index) - -
    -
    - Set a point from this path. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Point}
    - -
    - index - -
    -
    {integer} a point index.
    - -
    - - - - - - - - -
    - - -
    - - - setPoints(points) - -
    -
    - Reposition this path points. -This operation will only take place if the supplied points array equals in size to -this path's already set points. - - -
    - - - - -
    -
    Parameters:
    - -
    - points - -
    -
    {Array}
    - -
    - - - - - - - - -
    - - -
    - - - setPosition(x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPositionAnchor(ax, ay) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ax - -
    -
    - -
    - ay - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPositionAnchored(x, y, ax, ay) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - ax - -
    -
    - -
    - ay - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setQuadric(x0, y0, x1, y1, x2, y2) - -
    -
    - Set this path to be composed by a single Quadric Bezier path segment. - - -
    - - - - -
    -
    Parameters:
    - -
    - x0 - -
    -
    {number}
    - -
    - y0 - -
    -
    {number}
    - -
    - x1 - -
    -
    {number}
    - -
    - y1 - -
    -
    {number}
    - -
    - x2 - -
    -
    {number}
    - -
    - y2 - -
    -
    {number}
    - -
    - - - - - -
    -
    Returns:
    - -
    this
    - -
    - - - - -
    - - -
    - - - setRectangle(x0, y0, x1, y1) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - x0 - -
    -
    - -
    - y0 - -
    -
    - -
    - x1 - -
    -
    - -
    - y1 - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setRotation(angle) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - angle - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setRotationAnchor(ax, ay) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ax - -
    -
    - -
    - ay - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setRotationAnchored(angle, rx, ry) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - angle - -
    -
    - -
    - rx - -
    -
    - -
    - ry - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setScale(sx, sy) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - sx - -
    -
    - -
    - sy - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setScaleAnchor(ax, ay) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ax - -
    -
    - -
    - ay - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setScaleAnchored(scaleX, scaleY, sx, sy) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - scaleX - -
    -
    - -
    - scaleY - -
    -
    - -
    - sx - -
    -
    - -
    - sy - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.Point} - startCurvePosition() - -
    -
    - Return the first point of the first path segment of this compound path. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - -
    - - -
    - - - updatePath(point, callback) - -
    -
    - Indicates that some path control point has changed, and that the path must recalculate -its internal data, ie: length and bbox. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - callback - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Sun Apr 07 2013 11:06:45 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.PathSegment.html b/documentation/jsdoc/symbols/CAAT.PathUtil.PathSegment.html deleted file mode 100644 index 466a3680..00000000 --- a/documentation/jsdoc/symbols/CAAT.PathUtil.PathSegment.html +++ /dev/null @@ -1,1540 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.PathUtil.PathSegment - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.PathUtil.PathSegment -

    - - -

    - - - - - - -
    Defined in: PathSegment.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - bbox -
    -
    Segment bounding box.
    -
      -
    - color -
    -
    Color to draw the segment.
    -
      -
    - length -
    -
    Segment length.
    -
      -
    - parent -
    -
    Path this segment belongs to.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    applyAsPath(ctx) -
    -
    Draw this path using RenderingContext2D drawing primitives.
    -
      -
    drawHandle(ctx, x, y) -
    -
    -
      - -
    Get path's last coordinate.
    -
      -
    endPath() -
    -
    Instruments the path has finished building, and that no more segments will be added to it.
    -
      -
    getBoundingBox(rectangle) -
    -
    Gets the path bounding box (or the rectangle that contains the whole path).
    -
      -
    getContour(iSize) -
    -
    Gets a polyline describing the path contour.
    -
      -
    getControlPoint(index) -
    -
    Gets CAAT.Point instance with the 2d position of a control point.
    -
      - -
    Gets Path length.
    -
      -
    getPosition(time) -
    -
    Get a coordinate on path.
    -
      - -
    Gets the number of control points needed to create the path.
    -
      -
    setColor(color) -
    -
    -
      -
    setParent(parent) -
    -
    Set a PathSegment's parent
    -
      -
    setPoint(point, index) -
    -
    Set a point from this path segment.
    -
      -
    setPoints(points) -
    -
    Set this path segment's points information.
    -
      - -
    Get path's starting coordinate.
    -
      -
    transform(matrix) -
    -
    Transform this path with the given affinetransform matrix.
    -
      -
    updatePath(point) -
    -
    Recalculate internal path structures.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.PathUtil.PathSegment() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - bbox - -
    -
    - Segment bounding box. - - -
    - - - - - - - - -
    - - -
    - - - color - -
    -
    - Color to draw the segment. - - -
    - - - - - - - - -
    - - -
    - - - length - -
    -
    - Segment length. - - -
    - - - - - - - - -
    - - -
    - - - parent - -
    -
    - Path this segment belongs to. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - applyAsPath(ctx) - -
    -
    - Draw this path using RenderingContext2D drawing primitives. -The intention is to set a path or pathsegment as a clipping region. - - -
    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    {RenderingContext2D}
    - -
    - - - - - - - - -
    - - -
    - - - drawHandle(ctx, x, y) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - ctx - -
    -
    - -
    - x - -
    -
    - -
    - y - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.Point} - endCurvePosition() - -
    -
    - Get path's last coordinate. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - -
    - - -
    - - - endPath() - -
    -
    - Instruments the path has finished building, and that no more segments will be added to it. -You could later add more PathSegments and endPath must be called again. - - -
    - - - - - - - - - - - -
    - - -
    - - {CAAT.Rectangle} - getBoundingBox(rectangle) - -
    -
    - Gets the path bounding box (or the rectangle that contains the whole path). - - -
    - - - - -
    -
    Parameters:
    - -
    - rectangle - -
    -
    a CAAT.Rectangle instance with the bounding box.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Rectangle}
    - -
    - - - - -
    - - -
    - - {[CAAT.Point]} - getContour(iSize) - -
    -
    - Gets a polyline describing the path contour. The contour will be defined by as mush as iSize segments. - - -
    - - - - -
    -
    Parameters:
    - -
    - iSize - -
    -
    an integer indicating the number of segments of the contour polyline.
    - -
    - - - - - -
    -
    Returns:
    - -
    {[CAAT.Point]}
    - -
    - - - - -
    - - -
    - - {CAAT.Point} - getControlPoint(index) - -
    -
    - Gets CAAT.Point instance with the 2d position of a control point. - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    an integer indicating the desired control point coordinate.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - -
    - - -
    - - {number} - getLength() - -
    -
    - Gets Path length. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - {CAAT.Point} - getPosition(time) - -
    -
    - Get a coordinate on path. -The parameter time is normalized, that is, its values range from zero to one. -zero will mean startCurvePosition and one will be endCurvePosition. Other values -will be a position on the path relative to the path length. if the value is greater that 1, if will be set -to modulus 1. - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    a float with a value between zero and 1 inclusive both.
    - -
    - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - -
    - - -
    - - {number} - numControlPoints() - -
    -
    - Gets the number of control points needed to create the path. -Each PathSegment type can have different control points. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number} an integer with the number of control points.
    - -
    - - - - -
    - - -
    - - - setColor(color) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - color - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setParent(parent) - -
    -
    - Set a PathSegment's parent - - -
    - - - - -
    -
    Parameters:
    - -
    - parent - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPoint(point, index) - -
    -
    - Set a point from this path segment. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    {CAAT.Point}
    - -
    - index - -
    -
    {integer} a point index.
    - -
    - - - - - - - - -
    - - -
    - - - setPoints(points) - -
    -
    - Set this path segment's points information. - - -
    - - - - -
    -
    Parameters:
    - -
    - points - -
    -
    {Array}
    - -
    - - - - - - - - -
    - - -
    - - {CAAT.Point} - startCurvePosition() - -
    -
    - Get path's starting coordinate. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Point}
    - -
    - - - - -
    - - -
    - - - transform(matrix) - -
    -
    - Transform this path with the given affinetransform matrix. - - -
    - - - - -
    -
    Parameters:
    - -
    - matrix - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - updatePath(point) - -
    -
    - Recalculate internal path structures. - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.RectPath.html b/documentation/jsdoc/symbols/CAAT.PathUtil.RectPath.html deleted file mode 100644 index 5f7183c9..00000000 --- a/documentation/jsdoc/symbols/CAAT.PathUtil.RectPath.html +++ /dev/null @@ -1,1508 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.PathUtil.RectPath - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.PathUtil.RectPath -

    - - -

    - -
    Extends - CAAT.PathUtil.PathSegment.
    - - - - - -
    Defined in: RectPath.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - cw -
    -
    Traverse this path clockwise or counterclockwise (false).
    -
      - -
    spare point for calculations
    -
      -
    - points -
    -
    A collection of Points.
    -
    - - - -
    -
    Fields borrowed from class CAAT.PathUtil.PathSegment:
    bbox, color, length, parent
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init() -
    -
    -
      -
    applyAsPath(director) -
    -
    -
      - -
    -
      - -
    Returns final path segment point's x coordinate.
    -
      - -
    -
      -
    getControlPoint(index) -
    -
    -
      -
    getPosition(time) -
    -
    -
      - -
    -
      - -
    Returns initial path segment point's x coordinate.
    -
      - -
    -
      - -
    Get the number of control points.
    -
      -
    paint(director, bDrawHandles) -
    -
    Draws this path segment on screen.
    -
      - -
    -
      -
    setFinalPosition(finalX, finalY) -
    -
    Set a rectangle from points[0] to (finalX, finalY)
    -
      - -
    Set this path segment's starting position.
    -
      -
    setPoint(point, index) -
    -
    -
      -
    setPoints(points) -
    -
    An array of {CAAT.Point} composed of two points.
    -
      - -
    -
      -
    updatePath(point) -
    -
    -
    - - - -
    -
    Methods borrowed from class CAAT.PathUtil.PathSegment:
    drawHandle, endPath, getBoundingBox, getLength, setColor, setParent, transform
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.PathUtil.RectPath() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - cw - -
    -
    - Traverse this path clockwise or counterclockwise (false). - - -
    - - - - - - - - -
    - - -
    - - - newPosition - -
    -
    - spare point for calculations - - -
    - - - - - - - - -
    - - -
    - - - points - -
    -
    - A collection of Points. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - applyAsPath(director) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - endCurvePosition() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {number} - finalPositionX() - -
    -
    - Returns final path segment point's x coordinate. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - getContour() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getControlPoint(index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPosition(time) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - time - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getPositionFromLength(iLength) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - iLength - -
    -
    - -
    - - - - - - - - -
    - - -
    - - {number} - initialPositionX() - -
    -
    - Returns initial path segment point's x coordinate. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - isClockWise() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - {number} - numControlPoints() - -
    -
    - Get the number of control points. For this type of path segment, start and -ending path segment points. Defaults to 2. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number}
    - -
    - - - - -
    - - -
    - - - paint(director, bDrawHandles) - -
    -
    - Draws this path segment on screen. Optionally it can draw handles for every control point, in -this case, start and ending path segment points. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    {CAAT.Director}
    - -
    - bDrawHandles - -
    -
    {boolean}
    - -
    - - - - - - - - -
    - - -
    - - - setClockWise(cw) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - cw - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setFinalPosition(finalX, finalY) - -
    -
    - Set a rectangle from points[0] to (finalX, finalY) - - -
    - - - - -
    -
    Parameters:
    - -
    - finalX - -
    -
    {number}
    - -
    - finalY - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setInitialPosition(x, y) - -
    -
    - Set this path segment's starting position. -This method should not be called again after setFinalPosition has been called. - - -
    - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    {number}
    - -
    - y - -
    -
    {number}
    - -
    - - - - - - - - -
    - - -
    - - - setPoint(point, index) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - index - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setPoints(points) - -
    -
    - An array of {CAAT.Point} composed of two points. - - -
    - - - - -
    -
    Parameters:
    - -
    - points - -
    -
    {Array}
    - -
    - - - - - - - - -
    - - -
    - - - startCurvePosition() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - updatePath(point) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - point - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.SVGPath.html b/documentation/jsdoc/symbols/CAAT.PathUtil.SVGPath.html deleted file mode 100644 index ce455e21..00000000 --- a/documentation/jsdoc/symbols/CAAT.PathUtil.SVGPath.html +++ /dev/null @@ -1,1689 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.PathUtil.SVGPath - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.PathUtil.SVGPath -

    - - -

    - - - - - - -
    Defined in: SVGPath.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -

    -This class is a SVG Path parser.

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <private>   - -
    -
    <private>   -
    - c -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    ____getNumbers(pathInfo, c, v, n, error) -
    -
    -
    <private>   -
    __findNumber(pathInfo, c) -
    -
    -
    <private>   -
    __getNumber(pathInfo, c, v, error) -
    -
    -
    <private>   -
    __init() -
    -
    -
    <private>   -
    __isDigit(c) -
    -
    -
    <private>   -
    __maybeNumber(pathInfo, c) -
    -
    -
    <private>   -
    __parseClosePath(pathInfo, c, path, error) -
    -
    -
    <private>   -
    __parseCubic(pathInfo, c, absolute, path, error) -
    -
    -
    <private>   -
    __parseCubicS(pathInfo, c, absolute, path, error) -
    -
    -
    <private>   -
    __parseLine(pathInfo, c, absolute, path, error) -
    -
    -
    <private>   -
    __parseLineH(pathInfo, c, absolute, path, error) -
    -
    -
    <private>   -
    __parseLineV(pathInfo, c, absolute, path, error) -
    -
    -
    <private>   -
    __parseMoveTo(pathInfo, c, absolute, path, error) -
    -
    -
    <private>   -
    __parseQuadric(pathInfo, c, absolute, path, error) -
    -
    -
    <private>   -
    __parseQuadricS(pathInfo, c, absolute, path, error) -
    -
    -
    <private>   -
    __skipBlank(pathInfo, c) -
    -
    -
      -
    parsePath(pathInfo) -
    -
    This method will create a CAAT.PathUtil.Path object with as many contours as needed.
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.PathUtil.SVGPath() -
    - -
    -

    -This class is a SVG Path parser. -By calling the method parsePath( svgpath ) an instance of CAAT.PathUtil.Path will be built by parsing -its contents. - -

    -See demo32 - -

    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <private> - - - bezierInfo - -
    -
    - - - -
    - - - - - - - - -
    - - -
    <private> - - - c - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - ____getNumbers(pathInfo, c, v, n, error) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - v - -
    -
    - -
    - n - -
    -
    - -
    - error - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __findNumber(pathInfo, c) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __getNumber(pathInfo, c, v, error) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - v - -
    -
    - -
    - error - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __init() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    <private> - - - __isDigit(c) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - c - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __maybeNumber(pathInfo, c) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __parseClosePath(pathInfo, c, path, error) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - path - -
    -
    - -
    - error - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __parseCubic(pathInfo, c, absolute, path, error) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - absolute - -
    -
    - -
    - path - -
    -
    - -
    - error - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __parseCubicS(pathInfo, c, absolute, path, error) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - absolute - -
    -
    - -
    - path - -
    -
    - -
    - error - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __parseLine(pathInfo, c, absolute, path, error) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - absolute - -
    -
    - -
    - path - -
    -
    - -
    - error - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __parseLineH(pathInfo, c, absolute, path, error) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - absolute - -
    -
    - -
    - path - -
    -
    - -
    - error - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __parseLineV(pathInfo, c, absolute, path, error) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - absolute - -
    -
    - -
    - path - -
    -
    - -
    - error - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __parseMoveTo(pathInfo, c, absolute, path, error) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - absolute - -
    -
    - -
    - path - -
    -
    - -
    - error - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __parseQuadric(pathInfo, c, absolute, path, error) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - absolute - -
    -
    - -
    - path - -
    -
    - -
    - error - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __parseQuadricS(pathInfo, c, absolute, path, error) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - absolute - -
    -
    - -
    - path - -
    -
    - -
    - error - -
    -
    - -
    - - - - - - - - -
    - - -
    <private> - - - __skipBlank(pathInfo, c) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    - -
    - c - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - parsePath(pathInfo) - -
    -
    - This method will create a CAAT.PathUtil.Path object with as many contours as needed. - - -
    - - - - -
    -
    Parameters:
    - -
    - pathInfo - -
    -
    {string} a SVG path
    - -
    - - - - - -
    -
    Returns:
    - -
    Array.
    - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.html b/documentation/jsdoc/symbols/CAAT.PathUtil.html deleted file mode 100644 index 5571ec0d..00000000 --- a/documentation/jsdoc/symbols/CAAT.PathUtil.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.PathUtil - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.PathUtil -

    - - -

    - - - - - - -
    Defined in: PathSegment.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.PathUtil -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.WebGL.ColorProgram.html b/documentation/jsdoc/symbols/CAAT.WebGL.ColorProgram.html deleted file mode 100644 index 7b9463d2..00000000 --- a/documentation/jsdoc/symbols/CAAT.WebGL.ColorProgram.html +++ /dev/null @@ -1,885 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.WebGL.ColorProgram - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.WebGL.ColorProgram -

    - - -

    - -
    Extends - CAAT.WebGL.Program.
    - - - - - -
    Defined in: ColorProgram.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    int32 Array for color Buffer
    -
      - -
    Float32 Array for vertex buffer.
    -
      - -
    GLBuffer for vertex buffer.
    -
    - - - -
    -
    Fields borrowed from class CAAT.WebGL.Program:
    gl, shaderProgram
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(gl) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    setColor(colorArray) -
    -
    -
    - - - -
    -
    Methods borrowed from class CAAT.WebGL.Program:
    create, getDomShader, getShader, setAlpha, setMatrixUniform, useProgram
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.WebGL.ColorProgram() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - colorBuffer - -
    -
    - int32 Array for color Buffer - - -
    - - - - - - - - -
    - - -
    - - - vertexPositionArray - -
    -
    - Float32 Array for vertex buffer. - - -
    - - - - - - - - -
    - - -
    - - - vertexPositionBuffer - -
    -
    - GLBuffer for vertex buffer. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(gl) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - gl - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getFragmentShader() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getVertexShader() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - initialize() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - setColor(colorArray) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - colorArray - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.WebGL.GLU.html b/documentation/jsdoc/symbols/CAAT.WebGL.GLU.html deleted file mode 100644 index dd1c5816..00000000 --- a/documentation/jsdoc/symbols/CAAT.WebGL.GLU.html +++ /dev/null @@ -1,789 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.WebGL.GLU - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.WebGL.GLU -

    - - -

    - - - - - - -
    Defined in: GLU.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <static>   -
    CAAT.WebGL.GLU.makeFrustum(left, right, bottom, top, znear, zfar, viewportHeight) -
    -
    Create a matrix for a frustum.
    -
    <static>   -
    CAAT.WebGL.GLU.makeOrtho(left, right, bottom, top, znear, zfar) -
    -
    Create an orthogonal projection matrix.
    -
    <static>   -
    CAAT.WebGL.GLU.makePerspective(fovy, aspect, znear, zfar, viewportHeight) -
    -
    Create a perspective matrix.
    -
    - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.WebGL.GLU -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - -
    - Method Detail -
    - - -
    <static> - - - CAAT.WebGL.GLU.makeFrustum(left, right, bottom, top, znear, zfar, viewportHeight) - -
    -
    - Create a matrix for a frustum. - - -
    - - - - -
    -
    Parameters:
    - -
    - left - -
    -
    - -
    - right - -
    -
    - -
    - bottom - -
    -
    - -
    - top - -
    -
    - -
    - znear - -
    -
    - -
    - zfar - -
    -
    - -
    - viewportHeight - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.WebGL.GLU.makeOrtho(left, right, bottom, top, znear, zfar) - -
    -
    - Create an orthogonal projection matrix. - - -
    - - - - -
    -
    Parameters:
    - -
    - left - -
    -
    - -
    - right - -
    -
    - -
    - bottom - -
    -
    - -
    - top - -
    -
    - -
    - znear - -
    -
    - -
    - zfar - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.WebGL.GLU.makePerspective(fovy, aspect, znear, zfar, viewportHeight) - -
    -
    - Create a perspective matrix. - - -
    - - - - -
    -
    Parameters:
    - -
    - fovy - -
    -
    - -
    - aspect - -
    -
    - -
    - znear - -
    -
    - -
    - zfar - -
    -
    - -
    - viewportHeight - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.WebGL.Program.html b/documentation/jsdoc/symbols/CAAT.WebGL.Program.html deleted file mode 100644 index 1c27e983..00000000 --- a/documentation/jsdoc/symbols/CAAT.WebGL.Program.html +++ /dev/null @@ -1,1064 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.WebGL.Program - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.WebGL.Program -

    - - -

    - - - - - - -
    Defined in: Program.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - gl -
    -
    Canvas 3D context.
    -
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(gl) -
    -
    -
      -
    create() -
    -
    -
      -
    getDomShader(gl, id) -
    -
    -
      - -
    -
      -
    getShader(gl, type, str) -
    -
    -
      - -
    -
      - -
    -
      -
    setAlpha(alpha) -
    -
    Set fragment shader's alpha composite value.
    -
      -
    setMatrixUniform(caatMatrix4) -
    -
    -
      - -
    -
    - - - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.WebGL.Program() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - gl - -
    -
    - Canvas 3D context. - - -
    - - - - - - - - -
    - - -
    - - - shaderProgram - -
    -
    - - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(gl) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - gl - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - create() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getDomShader(gl, id) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - gl - -
    -
    - -
    - id - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getFragmentShader() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getShader(gl, type, str) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - gl - -
    -
    - -
    - type - -
    -
    - -
    - str - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getVertexShader() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - initialize() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - setAlpha(alpha) - -
    -
    - Set fragment shader's alpha composite value. - - -
    - - - - -
    -
    Parameters:
    - -
    - alpha - -
    -
    {number} float value 0..1.
    - -
    - - - - - - - - -
    - - -
    - - - setMatrixUniform(caatMatrix4) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - caatMatrix4 - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - useProgram() - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.WebGL.TextureProgram.html b/documentation/jsdoc/symbols/CAAT.WebGL.TextureProgram.html deleted file mode 100644 index 6372b416..00000000 --- a/documentation/jsdoc/symbols/CAAT.WebGL.TextureProgram.html +++ /dev/null @@ -1,1573 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.WebGL.TextureProgram - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.WebGL.TextureProgram -

    - - -

    - -
    Extends - CAAT.WebGL.Program.
    - - - - - -
    Defined in: TextureProgram.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      - -
    Lines GLBuffer
    -
      -
    - prevA -
    -
    -
      -
    - prevAlpha -
    -
    -
      -
    - prevB -
    -
    -
      -
    - prevG -
    -
    -
      -
    - prevR -
    -
    -
      - -
    -
      - -
    VertexIndex GLBuffer.
    -
      - -
    VertextBuffer Float32 Array
    -
      - -
    VertextBuffer GLBuffer
    -
      - -
    VertexBuffer Float32 Array
    -
      - -
    UVBuffer GLBuffer
    -
    - - - -
    -
    Fields borrowed from class CAAT.WebGL.Program:
    gl, shaderProgram
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <private>   -
    __init(gl) -
    -
    -
      -
    drawLines(lines_data, size, r, g, b, a, lineWidth) -
    -
    -
      -
    drawPolylines(polyline_data, size, r, g, b, a, lineWidth) -
    -
    -
      - -
    -
      - -
    -
      - -
    -
      -
    setAlpha(alpha) -
    -
    -
      -
    setTexture(glTexture) -
    -
    -
      -
    setUseColor(use, r, g, b, a) -
    -
    -
      -
    updateUVBuffer(uvArray) -
    -
    -
      -
    updateVertexBuffer(vertexArray) -
    -
    -
      - -
    -
    - - - -
    -
    Methods borrowed from class CAAT.WebGL.Program:
    create, getDomShader, getShader, setMatrixUniform
    -
    - - - - - - - -
    -
    - Class Detail -
    - -
    - CAAT.WebGL.TextureProgram() -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    - - - linesBuffer - -
    -
    - Lines GLBuffer - - -
    - - - - - - - - -
    - - -
    - - - prevA - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - prevAlpha - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - prevB - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - prevG - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - prevR - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - prevTexture - -
    -
    - - - -
    - - - - - - - - -
    - - -
    - - - vertexIndexBuffer - -
    -
    - VertexIndex GLBuffer. - - -
    - - - - - - - - -
    - - -
    - - - vertexPositionArray - -
    -
    - VertextBuffer Float32 Array - - -
    - - - - - - - - -
    - - -
    - - - vertexPositionBuffer - -
    -
    - VertextBuffer GLBuffer - - -
    - - - - - - - - -
    - - -
    - - - vertexUVArray - -
    -
    - VertexBuffer Float32 Array - - -
    - - - - - - - - -
    - - -
    - - - vertexUVBuffer - -
    -
    - UVBuffer GLBuffer - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <private> - - - __init(gl) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - gl - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - drawLines(lines_data, size, r, g, b, a, lineWidth) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - lines_data - -
    -
    {Float32Array} array of number with x,y,z coords for each line point.
    - -
    - size - -
    -
    {number} number of lines to draw.
    - -
    - r - -
    -
    - -
    - g - -
    -
    - -
    - b - -
    -
    - -
    - a - -
    -
    - -
    - lineWidth - -
    -
    {number} drawing line size.
    - -
    - - - - - - - - -
    - - -
    - - - drawPolylines(polyline_data, size, r, g, b, a, lineWidth) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - polyline_data - -
    -
    - -
    - size - -
    -
    - -
    - r - -
    -
    - -
    - g - -
    -
    - -
    - b - -
    -
    - -
    - a - -
    -
    - -
    - lineWidth - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - getFragmentShader() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - getVertexShader() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - initialize() - -
    -
    - - - -
    - - - - - - - - - - - -
    - - -
    - - - setAlpha(alpha) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - alpha - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setTexture(glTexture) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - glTexture - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - setUseColor(use, r, g, b, a) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - use - -
    -
    - -
    - r - -
    -
    - -
    - g - -
    -
    - -
    - b - -
    -
    - -
    - a - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - updateUVBuffer(uvArray) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - uvArray - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - updateVertexBuffer(vertexArray) - -
    -
    - - - -
    - - - - -
    -
    Parameters:
    - -
    - vertexArray - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - useProgram() - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.WebGL.html b/documentation/jsdoc/symbols/CAAT.WebGL.html deleted file mode 100644 index c018cc07..00000000 --- a/documentation/jsdoc/symbols/CAAT.WebGL.html +++ /dev/null @@ -1,546 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.WebGL - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT.WebGL -

    - - -

    - - - - - - -
    Defined in: Program.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      - -
    -
    - - - - - - - - - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT.WebGL -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElement.html b/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElement.html deleted file mode 100644 index d9f06314..00000000 --- a/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElement.html +++ /dev/null @@ -1,410 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElement - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElement -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <inner>   - -
    Abstract document element.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <inner> - CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElement(anchor, style) -
    - -
    - Abstract document element. -The document contains a collection of DocumentElementText and DocumentElementImage. - -
    - - - - - -
    -
    Parameters:
    - -
    - anchor - -
    -
    - -
    - style - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 11:39:05 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementImage.html b/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementImage.html deleted file mode 100644 index 96e1f59d..00000000 --- a/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementImage.html +++ /dev/null @@ -1,433 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementImage - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementImage -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <inner>   - -
    This class represents an image in the document.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <inner> - CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementImage(x, image, r, c, style, anchor) -
    - -
    - This class represents an image in the document. - -
    - - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - image - -
    -
    - -
    - r - -
    -
    - -
    - c - -
    -
    - -
    - style - -
    -
    - -
    - anchor - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 11:39:05 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementText.html b/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementText.html deleted file mode 100644 index 510a2f79..00000000 --- a/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementText.html +++ /dev/null @@ -1,434 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementText - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementText -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <inner>   - -
    This class represents a text in the document.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <inner> - CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentElementText(text, x, width, height, style, anchor) -
    - -
    - This class represents a text in the document. The text will have applied the styles selected -when it was defined. - -
    - - - - - -
    -
    Parameters:
    - -
    - text - -
    -
    - -
    - x - -
    -
    - -
    - width - -
    -
    - -
    - height - -
    -
    - -
    - style - -
    -
    - -
    - anchor - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 11:39:05 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentLine.html b/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentLine.html deleted file mode 100644 index 8ba1348e..00000000 --- a/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentLine.html +++ /dev/null @@ -1,393 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentLine - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentLine -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <inner>   - -
    This class represents a document line.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <inner> - CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-DocumentLine() -
    - -
    - This class represents a document line. -It contains a collection of DocumentElement objects. - -
    - - - - - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 11:39:05 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-renderContext.html b/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-renderContext.html deleted file mode 100644 index b0432a91..00000000 --- a/documentation/jsdoc/symbols/CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-renderContext.html +++ /dev/null @@ -1,392 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-renderContext - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Class CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-renderContext -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <inner>   - -
    This class keeps track of styles, images, and the current applied style.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <inner> - CAAT.constants.extendsWith.constants.extendsWith.constants.extendsWith.extendsWith.extendsWith.extendsWith-renderContext() -
    - -
    - This class keeps track of styles, images, and the current applied style. - -
    - - - - - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 11:39:05 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentElement.html b/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentElement.html deleted file mode 100644 index faf08669..00000000 --- a/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentElement.html +++ /dev/null @@ -1,392 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.extendsWith-DocumentElement - - - - - - - - - - - - - -
    - -

    - - Class CAAT.extendsWith-DocumentElement -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <inner>   - -
    Abstract document element.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <inner> - CAAT.extendsWith-DocumentElement(anchor, style) -
    - -
    - Abstract document element. -The document contains a collection of DocumentElementText and DocumentElementImage. - -
    - - - - - -
    -
    Parameters:
    - -
    - anchor - -
    -
    - -
    - style - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 09:43:15 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentElementImage.html b/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentElementImage.html deleted file mode 100644 index 2ba06eef..00000000 --- a/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentElementImage.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.extendsWith-DocumentElementImage - - - - - - - - - - - - - -
    - -

    - - Class CAAT.extendsWith-DocumentElementImage -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <inner>   -
    - CAAT.extendsWith-DocumentElementImage(x, image, r, c, style, anchor) -
    -
    This class represents an image in the document.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <inner> - CAAT.extendsWith-DocumentElementImage(x, image, r, c, style, anchor) -
    - -
    - This class represents an image in the document. - -
    - - - - - -
    -
    Parameters:
    - -
    - x - -
    -
    - -
    - image - -
    -
    - -
    - r - -
    -
    - -
    - c - -
    -
    - -
    - style - -
    -
    - -
    - anchor - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 09:43:15 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentElementText.html b/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentElementText.html deleted file mode 100644 index 415ee70e..00000000 --- a/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentElementText.html +++ /dev/null @@ -1,416 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.extendsWith-DocumentElementText - - - - - - - - - - - - - -
    - -

    - - Class CAAT.extendsWith-DocumentElementText -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <inner>   -
    - CAAT.extendsWith-DocumentElementText(text, x, width, height, style, anchor) -
    -
    This class represents a text in the document.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <inner> - CAAT.extendsWith-DocumentElementText(text, x, width, height, style, anchor) -
    - -
    - This class represents a text in the document. The text will have applied the styles selected -when it was defined. - -
    - - - - - -
    -
    Parameters:
    - -
    - text - -
    -
    - -
    - x - -
    -
    - -
    - width - -
    -
    - -
    - height - -
    -
    - -
    - style - -
    -
    - -
    - anchor - -
    -
    - -
    - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 09:43:15 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentLine.html b/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentLine.html deleted file mode 100644 index 022fc18c..00000000 --- a/documentation/jsdoc/symbols/CAAT.extendsWith-DocumentLine.html +++ /dev/null @@ -1,375 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.extendsWith-DocumentLine - - - - - - - - - - - - - -
    - -

    - - Class CAAT.extendsWith-DocumentLine -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <inner>   - -
    This class represents a document line.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <inner> - CAAT.extendsWith-DocumentLine() -
    - -
    - This class represents a document line. -It contains a collection of DocumentElement objects. - -
    - - - - - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 09:43:15 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.extendsWith-renderContext.html b/documentation/jsdoc/symbols/CAAT.extendsWith-renderContext.html deleted file mode 100644 index 804ed092..00000000 --- a/documentation/jsdoc/symbols/CAAT.extendsWith-renderContext.html +++ /dev/null @@ -1,374 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.extendsWith-renderContext - - - - - - - - - - - - - -
    - -

    - - Class CAAT.extendsWith-renderContext -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <inner>   - -
    This class keeps track of styles, images, and the current applied style.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <inner> - CAAT.extendsWith-renderContext() -
    - -
    - This class keeps track of styles, images, and the current applied style. - -
    - - - - - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 09:43:15 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.extendsWith.__init.html b/documentation/jsdoc/symbols/CAAT.extendsWith.__init.html deleted file mode 100644 index 90c39240..00000000 --- a/documentation/jsdoc/symbols/CAAT.extendsWith.__init.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - - - JsDoc Reference - CAAT.extendsWith.__init - - - - - - - - - - - - - -
    - -

    - - Class CAAT.extendsWith.__init -

    - - -

    - - - - - - -
    Defined in: Label.js. - -

    - - - - - - - - - - - - - - - - - -
    Class Summary
    Constructor AttributesConstructor Name and Description
    <private>   - -
    This object represents a label object.
    -
    - - - - - - - - - - - - -
    -
    - Class Detail -
    - -
    <private> - CAAT.extendsWith.__init() -
    - -
    - This object represents a label object. -A label is a complex presentation object which is able to: -
  408. define comples styles -
  409. contains multiline text -
  410. keep track of per-line baseline regardless of fonts used. -
  411. Mix images and text. -
  412. Layout text and images in a fixed width or by parsing a free-flowing document -
  413. Add anchoring capabilities. - -
  414. - - - - - - - - - -
    -
    Returns:
    - -
    {*}
    - -
    - - - - -
    - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Tue Feb 26 2013 09:43:15 GMT-0800 (PST) -
    - - diff --git a/documentation/jsdoc/symbols/CAAT.html b/documentation/jsdoc/symbols/CAAT.html deleted file mode 100644 index 9ee4ab77..00000000 --- a/documentation/jsdoc/symbols/CAAT.html +++ /dev/null @@ -1,2561 +0,0 @@ - - - - - - - JsDoc Reference - CAAT - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Namespace CAAT -

    - - -

    - - - - - - -
    Defined in: CAAT.js. - -

    - - - - - - - - - - - - - - - - - -
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      -
    - CAAT -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
    <static>   - -
    Acceleration data.
    -
    <static>   -
    - CAAT.ALT_KEY -
    -
    Alt key code
    -
    <static>   - -
    When switching scenes, cache exiting scene or not.
    -
    <private> <static>   -
    - CAAT.CLAMP -
    -
    // do not clamp coordinates.
    -
    <static>   -
    - CAAT.CONTROL_KEY -
    -
    Control key code
    -
    <static>   -
    - CAAT.CSS_TEXT_METRICS -
    -
    Control how CAAT.Font and CAAT.TextActor control font ascent/descent values.
    -
    <static>   -
    - CAAT.currentDirector -
    -
    Current animated director.
    -
    <static>   -
    - CAAT.DEBUG -
    -
    set this variable before building CAAT.Director intances to enable debug panel.
    -
    <static>   -
    - CAAT.DEBUG_DIRTYRECTS -
    -
    if CAAT.Director.setClear uses CLEAR_DIRTY_RECTS, this will show them on screen.
    -
    <static>   -
    - CAAT.DEBUGAABB -
    -
    debug axis aligned bounding boxes.
    -
    <static>   -
    - CAAT.DEBUGAABBCOLOR -
    -
    Bounding boxes color.
    -
    <static>   -
    - CAAT.DEBUGBB -
    -
    show Bounding Boxes
    -
    <static>   -
    - CAAT.DEBUGBBBCOLOR -
    -
    Bounding Boxes color.
    -
    <static>   -
    - CAAT.director -
    -
    Registered director objects.
    -
    <static>   -
    - CAAT.DRAG_THRESHOLD_X -
    -
    Do not consider mouse drag gesture at least until you have dragged -DRAG_THRESHOLD_X and DRAG_THRESHOLD_Y pixels.
    -
    <static>   -
    - CAAT.ENDRAF -
    -
    if RAF, this value signals end of RAF.
    -
    <static>   -
    - CAAT.ENTER_KEY -
    -
    Enter key code
    -
    <static>   -
    - CAAT.FPS -
    -
    expected FPS when using setInterval animation.
    -
    <static>   -
    - CAAT.FPS_REFRESH -
    -
    debug panel update time.
    -
    <static>   -
    - CAAT.FRAME_TIME -
    -
    time to process one frame.
    -
    <static>   -
    - CAAT.GLRENDER -
    -
    is GLRendering enabled.
    -
    <static>   -
    - CAAT.INTERVAL_ID -
    -
    if setInterval, this value holds CAAT.setInterval return value.
    -
    <static>   -
    - CAAT.keyListeners -
    -
    Aray of Key listeners.
    -
    <static>   -
    - CAAT.Keys -
    -
    -
    <static>   -
    - CAAT.Module -
    -
    This function defines CAAT modules, and creates Constructor Class objects.
    -
    <static>   -
    - CAAT.NO_RAF -
    -
    Use RAF shim instead of setInterval.
    -
    <static>   -
    - CAAT.PMR -
    -
    Points to Meter ratio value.
    -
    <static>   -
    - CAAT.RAF -
    -
    requestAnimationFrame time reference.
    -
    <static>   -
    - CAAT.renderEnabled -
    -
    Boolean flag to determine if CAAT.loop has already been called.
    -
    <static>   - -
    time between two consecutive RAF.
    -
    <static>   -
    - CAAT.rotationRate -
    -
    Device motion angles.
    -
    <static>   -
    - CAAT.SET_INTERVAL -
    -
    time between two consecutive setInterval calls.
    -
    <static>   -
    - CAAT.SHIFT_KEY -
    -
    Shift key code
    -
    <static> <constant>   -
    - CAAT.TOUCH_AS_MOUSE -
    -
    Constant to set touch behavior as single touch, compatible with mouse.
    -
    <static>   - -
    Constant to set CAAT touch behavior as multitouch.
    -
    <static>   -
    - CAAT.TOUCH_BEHAVIOR -
    -
    Set CAAT touch behavior as single or multi touch.
    -
    <static>   - -
    Array of window resize listeners.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
    <static>   -
    CAAT.enableBox2DDebug(set, director, world, scale) -
    -
    (As Eemeli Kelokorpi suggested) - -Enable Box2D debug renderer.
    -
    <static>   - -
    Enable device motion events.
    -
    <static>   -
    CAAT.endLoop() -
    -
    Stop animation loop.
    -
    <static>   -
    CAAT.getCurrentScene() -
    -
    Return current scene.
    -
    <static>   - -
    Return current director's current scene's time.
    -
    <static>   -
    CAAT.log() -
    -
    Log function which deals with window's Console object.
    -
    <static>   -
    CAAT.loop(fps) -
    -
    Main animation loop entry point.
    -
    <static>   -
    CAAT.RegisterDirector(director) -
    -
    Register and keep track of every CAAT.Director instance in the document.
    -
    <static>   - -
    Register a function callback as key listener.
    -
    <static>   - -
    Register a function callback as window resize listener.
    -
    <static>   -
    CAAT.renderFrameRAF(now) -
    -
    -
    <static>   -
    CAAT.setCoordinateClamping(clamp) -
    -
    This function makes the system obey decimal point calculations for actor's position, size, etc.
    -
    <static>   -
    CAAT.setCursor(cursor) -
    -
    Set the cursor.
    -
    <static>   -
    CAAT.unregisterResizeListener(director) -
    -
    Remove a function callback as window resize listener.
    -
    - - - - - - - - - -
    -
    - Namespace Detail -
    - -
    - CAAT -
    - -
    - - -
    - - - - - - - - - - - - -
    - - - - -
    - Field Detail -
    - - -
    <static> - - - CAAT.accelerationIncludingGravity - -
    -
    - Acceleration data. - -
    - Defined in: Input.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.ALT_KEY - -
    -
    - Alt key code - -
    - Defined in: KeyEvent.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.CACHE_SCENE_ON_CHANGE - -
    -
    - When switching scenes, cache exiting scene or not. Set before building director instance. - -
    - Defined in: Constants.js. - - -
    - - - - - - - - -
    - - -
    <private> <static> - - - CAAT.CLAMP - -
    -
    - // do not clamp coordinates. speeds things up in older browsers. - -
    - Defined in: Constants.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.CONTROL_KEY - -
    -
    - Control key code - -
    - Defined in: KeyEvent.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.CSS_TEXT_METRICS - -
    -
    - Control how CAAT.Font and CAAT.TextActor control font ascent/descent values. -0 means it will guess values from a font height -1 means it will try to use css to get accurate ascent/descent values and fall back to the previous method - in case it couldn't. - -
    - Defined in: Constants.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.currentDirector - -
    -
    - Current animated director. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.DEBUG - -
    -
    - set this variable before building CAAT.Director intances to enable debug panel. - -
    - Defined in: Constants.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.DEBUG_DIRTYRECTS - -
    -
    - if CAAT.Director.setClear uses CLEAR_DIRTY_RECTS, this will show them on screen. - -
    - Defined in: Constants.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.DEBUGAABB - -
    -
    - debug axis aligned bounding boxes. - -
    - Defined in: Constants.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.DEBUGAABBCOLOR - -
    -
    - Bounding boxes color. - -
    - Defined in: Constants.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.DEBUGBB - -
    -
    - show Bounding Boxes - -
    - Defined in: Constants.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.DEBUGBBBCOLOR - -
    -
    - Bounding Boxes color. - -
    - Defined in: Constants.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.director - -
    -
    - Registered director objects. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.DRAG_THRESHOLD_X - -
    -
    - Do not consider mouse drag gesture at least until you have dragged -DRAG_THRESHOLD_X and DRAG_THRESHOLD_Y pixels. -This is suitable for tablets, where just by touching, drag events are delivered. - -
    - Defined in: Constants.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.ENDRAF - -
    -
    - if RAF, this value signals end of RAF. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.ENTER_KEY - -
    -
    - Enter key code - -
    - Defined in: KeyEvent.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.FPS - -
    -
    - expected FPS when using setInterval animation. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.FPS_REFRESH - -
    -
    - debug panel update time. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.FRAME_TIME - -
    -
    - time to process one frame. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.GLRENDER - -
    -
    - is GLRendering enabled. - -
    - Defined in: Constants.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.INTERVAL_ID - -
    -
    - if setInterval, this value holds CAAT.setInterval return value. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.keyListeners - -
    -
    - Aray of Key listeners. - -
    - Defined in: Input.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Keys - -
    -
    - - -
    - Defined in: KeyEvent.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.Module - -
    -
    - This function defines CAAT modules, and creates Constructor Class objects. - -obj parameter has the following structure: -{ - defines{string}, // class name - depends{Array=}, // dependencies class names - extendsClass{string}, // class to extend from - extensdWith{object}, // actual prototype to extend - aliases{Array} // other class names -} - -
    - Defined in: ModuleManager.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.NO_RAF - -
    -
    - Use RAF shim instead of setInterval. Set to != 0 to use setInterval. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.PMR - -
    -
    - Points to Meter ratio value. - -
    - Defined in: B2DBodyActor.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.RAF - -
    -
    - requestAnimationFrame time reference. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.renderEnabled - -
    -
    - Boolean flag to determine if CAAT.loop has already been called. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.REQUEST_ANIMATION_FRAME_TIME - -
    -
    - time between two consecutive RAF. usually bigger than FRAME_TIME - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.rotationRate - -
    -
    - Device motion angles. - -
    - Defined in: Input.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.SET_INTERVAL - -
    -
    - time between two consecutive setInterval calls. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.SHIFT_KEY - -
    -
    - Shift key code - -
    - Defined in: KeyEvent.js. - - -
    - - - - - - - - -
    - - -
    <static> <constant> - - - CAAT.TOUCH_AS_MOUSE - -
    -
    - Constant to set touch behavior as single touch, compatible with mouse. - -
    - Defined in: Input.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.TOUCH_AS_MULTITOUCH - -
    -
    - Constant to set CAAT touch behavior as multitouch. - -
    - Defined in: Input.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.TOUCH_BEHAVIOR - -
    -
    - Set CAAT touch behavior as single or multi touch. - -
    - Defined in: Input.js. - - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.windowResizeListeners - -
    -
    - Array of window resize listeners. - -
    - Defined in: Input.js. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    <static> - - - CAAT.enableBox2DDebug(set, director, world, scale) - -
    -
    - (As Eemeli Kelokorpi suggested) - -Enable Box2D debug renderer. - -
    - Defined in: B2DBodyActor.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - set - -
    -
    {boolean} enable or disable
    - -
    - director - -
    -
    {CAAT.Foundation.Director}
    - -
    - world - -
    -
    {object} box2d world
    - -
    - scale - -
    -
    {numner} a scale value.
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.enableDeviceMotion() - -
    -
    - Enable device motion events. -This function does not register a callback, instear it sets -CAAT.rotationRate and CAAt.accelerationIncludingGravity values. - -
    - Defined in: Input.js. - - -
    - - - - - - - - - - - -
    - - -
    <static> - - - CAAT.endLoop() - -
    -
    - Stop animation loop. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - - - - -
    - - -
    <static> - - {CAAT.Foundation.Scene} - CAAT.getCurrentScene() - -
    -
    - Return current scene. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {CAAT.Foundation.Scene}
    - -
    - - - - -
    - - -
    <static> - - {number} - CAAT.getCurrentSceneTime() - -
    -
    - Return current director's current scene's time. -The way to go should be keep local scene references, but anyway, this function is always handy. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - - - - - -
    -
    Returns:
    - -
    {number} current scene's virtual time.
    - -
    - - - - -
    - - -
    <static> - - - CAAT.log() - -
    -
    - Log function which deals with window's Console object. - -
    - Defined in: Constants.js. - - -
    - - - - - - - - - - - -
    - - -
    <static> - - - CAAT.loop(fps) - -
    -
    - Main animation loop entry point. -Must called only once, or only after endLoop. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - fps - -
    -
    {number} desired fps. fps parameter will only be used if CAAT.NO_RAF is specified, that is -switch from RequestAnimationFrame to setInterval for animation loop.
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.RegisterDirector(director) - -
    -
    - Register and keep track of every CAAT.Director instance in the document. - -
    - Defined in: AnimationLoop.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.registerKeyListener(f) - -
    -
    - Register a function callback as key listener. - -
    - Defined in: Input.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - f - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.registerResizeListener(f) - -
    -
    - Register a function callback as window resize listener. - -
    - Defined in: Input.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - f - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.renderFrameRAF(now) - -
    -
    - - -
    - Defined in: AnimationLoop.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - now - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.setCoordinateClamping(clamp) - -
    -
    - This function makes the system obey decimal point calculations for actor's position, size, etc. -This may speed things up in some browsers, but at the cost of affecting visuals (like in rotating -objects). - -Latest Chrome (20+) is not affected by this. - -Default CAAT.Matrix try to speed things up. - -
    - Defined in: Constants.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - clamp - -
    -
    {boolean}
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.setCursor(cursor) - -
    -
    - Set the cursor. - -
    - Defined in: Input.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - cursor - -
    -
    - -
    - - - - - - - - -
    - - -
    <static> - - - CAAT.unregisterResizeListener(director) - -
    -
    - Remove a function callback as window resize listener. - -
    - Defined in: Input.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - director - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:41 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/String.html b/documentation/jsdoc/symbols/String.html deleted file mode 100644 index 06db7026..00000000 --- a/documentation/jsdoc/symbols/String.html +++ /dev/null @@ -1,562 +0,0 @@ - - - - - - - JsDoc Reference - String - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Built-In Namespace String -

    - - -

    - - - - - - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    endsWith(suffix) -
    -
    -
    - - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - - endsWith(suffix) - -
    -
    - - -
    - Defined in: ModuleManager.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - suffix - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:46 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/_global_.html b/documentation/jsdoc/symbols/_global_.html deleted file mode 100644 index 2a540536..00000000 --- a/documentation/jsdoc/symbols/_global_.html +++ /dev/null @@ -1,749 +0,0 @@ - - - - - - - JsDoc Reference - _global_ - - - - - - - - - - - -
    - - -
    -

    Classes

    - -
    - -
    - -
    - -

    - - Built-In Namespace _global_ -

    - - -

    - - - - - - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Field Summary
    Field AttributesField Name and Description
      -
    - i -
    -
    remove already loaded modules dependencies.
    -
      -
    - nmodule -
    -
    Avoid name clash: -CAAT.Foundation and CAAT.Foundation.Timer will both be valid for -CAAT.Foundation.Timer.TimerManager module.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Method Summary
    Method AttributesMethod Name and Description
      -
    extend(subc, superc) -
    -
    -
      -
    extendWith(base, subclass, with_object) -
    -
    Sintactic sugar to add a __super attribute on every overriden method.
    -
    - - - - - - - - - - - - -
    - Field Detail -
    - - -
    - - - i - -
    -
    - remove already loaded modules dependencies. - -
    - Defined in: ModuleManager.js. - - -
    - - - - - - - - -
    - - -
    - - - nmodule - -
    -
    - Avoid name clash: -CAAT.Foundation and CAAT.Foundation.Timer will both be valid for -CAAT.Foundation.Timer.TimerManager module. -So in the end, the module name can't have '.' after chopping the class -namespace. - -
    - Defined in: ModuleManager.js. - - -
    - - - - - - - - - - - - - - -
    - Method Detail -
    - - -
    - - - extend(subc, superc) - -
    -
    - - -
    - Defined in: Class.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - subc - -
    -
    - -
    - superc - -
    -
    - -
    - - - - - - - - -
    - - -
    - - - extendWith(base, subclass, with_object) - -
    -
    - Sintactic sugar to add a __super attribute on every overriden method. -Despite comvenient, it slows things down by 5fps. - -Uncomment at your own risk. - - // tenemos en super un metodo con igual nombre. - if ( superc.prototype[method]) { - subc.prototype[method]= (function(fn, fnsuper) { - return function() { - var prevMethod= this.__super; - - this.__super= fnsuper; - - var retValue= fn.apply( - this, - Array.prototype.slice.call(arguments) ); - - this.__super= prevMethod; - - return retValue; - }; - })(subc.prototype[method], superc.prototype[method]); - } - -
    - Defined in: Class.js. - - -
    - - - - -
    -
    Parameters:
    - -
    - base - -
    -
    - -
    - subclass - -
    -
    - -
    - with_object - -
    -
    - -
    - - - - - - - - - - - - - - - -
    -
    - - - -
    - - Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:33:40 GMT-0700 (PDT) -
    - - diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_AlphaBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_AlphaBehavior.js.html deleted file mode 100644 index 4dc39814..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_AlphaBehavior.js.html +++ /dev/null @@ -1,140 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name AlphaBehavior
    -  5      * @memberOf CAAT.Behavior
    -  6      * @extends CAAT.Behavior.BaseBehavior
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines:"CAAT.Behavior.AlphaBehavior",
    - 11     aliases:["CAAT.AlphaBehavior"],
    - 12     depends:["CAAT.Behavior.BaseBehavior"],
    - 13     extendsClass:"CAAT.Behavior.BaseBehavior",
    - 14     extendsWith:function () {
    - 15         return {
    - 16 
    - 17             /**
    - 18              * @lends CAAT.Behavior.AlphaBehavior.prototype
    - 19              */
    - 20 
    - 21             /**
    - 22              * Starting alpha transparency value. Between 0 and 1.
    - 23              * @type {number}
    - 24              * @private
    - 25              */
    - 26             startAlpha:0,
    - 27 
    - 28             /**
    - 29              * Ending alpha transparency value. Between 0 and 1.
    - 30              * @type {number}
    - 31              * @private
    - 32              */
    - 33             endAlpha:0,
    - 34 
    - 35             /**
    - 36              * @inheritsDoc
    - 37              * @param obj
    - 38              */
    - 39             parse : function( obj ) {
    - 40                 CAAT.Behavior.AlphaBehavior.superclass.parse.call(this,obj);
    - 41                 this.startAlpha= obj.start || 0;
    - 42                 this.endAlpha= obj.end || 0;
    - 43             },
    - 44 
    - 45             /**
    - 46              * @inheritDoc
    - 47              */
    - 48             getPropertyName:function () {
    - 49                 return "opacity";
    - 50             },
    - 51 
    - 52             /**
    - 53              * Applies corresponding alpha transparency value for a given time.
    - 54              *
    - 55              * @param time the time to apply the scale for.
    - 56              * @param actor the target actor to set transparency for.
    - 57              * @return {number} the alpha value set. Normalized from 0 (total transparency) to 1 (total opacity)
    - 58              */
    - 59             setForTime:function (time, actor) {
    - 60 
    - 61                 CAAT.Behavior.AlphaBehavior.superclass.setForTime.call(this, time, actor);
    - 62 
    - 63                 var alpha = (this.startAlpha + time * (this.endAlpha - this.startAlpha));
    - 64                 if (this.doValueApplication) {
    - 65                     actor.setAlpha(alpha);
    - 66                 }
    - 67                 return alpha;
    - 68             },
    - 69 
    - 70             /**
    - 71              * Set alpha transparency minimum and maximum value.
    - 72              * This value can be coerced by Actor's property isGloblAlpha.
    - 73              *
    - 74              * @param start {number} a float indicating the starting alpha value.
    - 75              * @param end {number} a float indicating the ending alpha value.
    - 76              */
    - 77             setValues:function (start, end) {
    - 78                 this.startAlpha = start;
    - 79                 this.endAlpha = end;
    - 80                 return this;
    - 81             },
    - 82 
    - 83             /**
    - 84              * @inheritDoc
    - 85              */
    - 86             calculateKeyFrameData:function (time) {
    - 87                 time = this.interpolator.getPosition(time).y;
    - 88                 return  (this.startAlpha + time * (this.endAlpha - this.startAlpha));
    - 89             },
    - 90 
    - 91             /**
    - 92              * @inheritDoc
    - 93              */
    - 94             getKeyFrameDataValues : function(time) {
    - 95                 time = this.interpolator.getPosition(time).y;
    - 96                 return {
    - 97                     alpha : this.startAlpha + time * (this.endAlpha - this.startAlpha)
    - 98                 };
    - 99             },
    -100 
    -101             /**
    -102              * @inheritDoc
    -103              * @override
    -104              */
    -105             calculateKeyFramesData:function (prefix, name, keyframessize) {
    -106 
    -107                 if (typeof keyframessize === 'undefined') {
    -108                     keyframessize = 100;
    -109                 }
    -110                 keyframessize >>= 0;
    -111 
    -112                 var i;
    -113                 var kfr;
    -114                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    -115 
    -116                 for (i = 0; i <= keyframessize; i++) {
    -117                     kfr = "" +
    -118                         (i / keyframessize * 100) + "%" + // percentage
    -119                         "{" +
    -120                         "opacity: " + this.calculateKeyFrameData(i / keyframessize) +
    -121                         "}";
    -122 
    -123                     kfd += kfr;
    -124                 }
    -125 
    -126                 kfd += "}";
    -127 
    -128                 return kfd;
    -129             }
    -130         }
    -131     }
    -132 });
    -133 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_BaseBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_BaseBehavior.js.html deleted file mode 100644 index e8aadd21..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_BaseBehavior.js.html +++ /dev/null @@ -1,667 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * Behaviors are keyframing elements.
    -  5  * By using a BehaviorContainer, you can specify different actions on any animation Actor.
    -  6  * An undefined number of Behaviors can be defined for each Actor.
    -  7  *
    -  8  * There're the following Behaviors:
    -  9  *  + AlphaBehavior:   controls container/actor global alpha.
    - 10  *  + RotateBehavior:  takes control of rotation affine transform.
    - 11  *  + ScaleBehavior:   takes control of scaling on x and y axis affine transform.
    - 12  *  + Scale1Behavior:  takes control of scaling on x or y axis affine transform.
    - 13  *  + PathBehavior:    takes control of translating an Actor/ActorContainer across a path [ie. pathSegment collection].
    - 14  *  + GenericBehavior: applies a behavior to any given target object's property, or notifies a callback.
    - 15  *
    - 16  *
    - 17  **/
    - 18 
    - 19 CAAT.Module({
    - 20 
    - 21     /**
    - 22      *
    - 23      * Namespace for all behavior-based actor properties instrumenter objects.
    - 24      *
    - 25      * @name Behavior
    - 26      * @memberOf CAAT
    - 27      * @namespace
    - 28      */
    - 29 
    - 30     /**
    - 31      *
    - 32      * The BaseBehavior is the base class of all Behavior modifiers:
    - 33      *
    - 34      * <li>AlphaBehabior
    - 35      * <li>RotateBehavior
    - 36      * <li>ScaleBehavior
    - 37      * <li>Scale1Behavior
    - 38      * <li>PathBehavior
    - 39      * <li>GenericBehavior
    - 40      * <li>ContainerBehavior
    - 41      *
    - 42      * Behavior base class.
    - 43      *
    - 44      * <p>
    - 45      * A behavior is defined by a frame time (behavior duration) and a behavior application function called interpolator.
    - 46      * In its default form, a behaviour is applied linearly, that is, the same amount of behavior is applied every same
    - 47      * time interval.
    - 48      * <p>
    - 49      * A concrete Behavior, a rotateBehavior in example, will change a concrete Actor's rotationAngle during the specified
    - 50      * period.
    - 51      * <p>
    - 52      * A behavior is guaranteed to notify (if any observer is registered) on behavior expiration.
    - 53      * <p>
    - 54      * A behavior can keep an unlimited observers. Observers are objects of the form:
    - 55      * <p>
    - 56      * <code>
    - 57      * {
    - 58      *      behaviorExpired : function( behavior, time, actor);
    - 59      *      behaviorApplied : function( behavior, time, normalizedTime, actor, value);
    - 60      * }
    - 61      * </code>
    - 62      * <p>
    - 63      * <strong>behaviorExpired</strong>: function( behavior, time, actor). This method will be called for any registered observer when
    - 64      * the scene time is greater than behavior's startTime+duration. This method will be called regardless of the time
    - 65      * granurality.
    - 66      * <p>
    - 67      * <strong>behaviorApplied</strong> : function( behavior, time, normalizedTime, actor, value). This method will be called once per
    - 68      * frame while the behavior is not expired and is in frame time (behavior startTime>=scene time). This method can be
    - 69      * called multiple times.
    - 70      * <p>
    - 71      * Every behavior is applied to a concrete Actor.
    - 72      * Every actor must at least define an start and end value. The behavior will set start-value at behaviorStartTime and
    - 73      * is guaranteed to apply end-value when scene time= behaviorStartTime+behaviorDuration.
    - 74      * <p>
    - 75      * You can set behaviors to apply forever that is cyclically. When a behavior is cycle=true, won't notify
    - 76      * behaviorExpired to its registered observers.
    - 77      * <p>
    - 78      * Other Behaviors simply must supply with the method <code>setForTime(time, actor)</code> overriden.
    - 79      *
    - 80      * @name BaseBehavior
    - 81      * @memberOf CAAT.Behavior
    - 82      * @constructor
    - 83      *
    - 84      */
    - 85 
    - 86     /**
    - 87      *
    - 88      * Internal behavior status values. Do not assign directly.
    - 89      *
    - 90      * @name Status
    - 91      * @memberOf CAAT.Behavior.BaseBehavior
    - 92      * @namespace
    - 93      * @enum {number}
    - 94      */
    - 95 
    - 96 
    - 97     defines:        "CAAT.Behavior.BaseBehavior",
    - 98     constants:      {
    - 99 
    -100         Status: {
    -101             /**
    -102              * @lends CAAT.Behavior.BaseBehavior.Status
    -103              */
    -104 
    -105             /** @const @type {number}*/ NOT_STARTED: 0,
    -106             /** @const @type {number} */ STARTED:    1,
    -107             /** @const  @type {number}*/ EXPIRED:    2
    -108         },
    -109 
    -110         /**
    -111          * @lends CAAT.Behavior.BaseBehavior
    -112          * @function
    -113          * @param obj a JSON object with a behavior definition.
    -114          */
    -115         parse : function( obj ) {
    -116 
    -117             function findClass( qualifiedClassName ) {
    -118                 var ns= qualifiedClassName.split(".");
    -119                 var _global= window;
    -120                 for( var i=0; i<ns.length; i++ ) {
    -121                     if ( !_global[ns[i]] ) {
    -122                         return null;
    -123                     }
    -124 
    -125                     _global= _global[ns[i]];
    -126                 }
    -127 
    -128                 return _global;
    -129             }
    -130 
    -131             try {
    -132 
    -133                 var type= obj.type.toLowerCase();
    -134                 type= "CAAT.Behavior."+type.substr(0,1).toUpperCase() + type.substr(1) + "Behavior";
    -135                 var cl= new findClass(type);
    -136 
    -137                 var behavior= new cl();
    -138                 behavior.parse(obj);
    -139                 return behavior;
    -140 
    -141             } catch(e) {
    -142                 console.log("Error parsing behavior: "+e);
    -143             }
    -144 
    -145             return null;
    -146         }
    -147     },
    -148     depends:        ["CAAT.Behavior.Interpolator"],
    -149     extendsWith:   function() {
    -150 
    -151         var DefaultInterpolator=    new CAAT.Behavior.Interpolator().createLinearInterpolator(false);
    -152         var DefaultInterpolatorPP=  new CAAT.Behavior.Interpolator().createLinearInterpolator(true);
    -153 
    -154         /** @lends CAAT.Behavior.BaseBehavior.prototype */
    -155         return {
    -156 
    -157             /**
    -158              * @lends CAAT.Behavior.BaseBehavior.prototype
    -159              */
    -160 
    -161             /**
    -162              * Constructor delegate function.
    -163              * @return {this}
    -164              * @private
    -165              */
    -166             __init:function () {
    -167                 this.lifecycleListenerList = [];
    -168                 this.setDefaultInterpolator();
    -169                 return this;
    -170             },
    -171 
    -172             /**
    -173              * Behavior lifecycle observer list.
    -174              * @private
    -175              */
    -176             lifecycleListenerList:null,
    -177 
    -178             /**
    -179              * Behavior application start time related to scene time.
    -180              * @private
    -181              */
    -182             behaviorStartTime:-1,
    -183 
    -184             /**
    -185              * Behavior application duration time related to scene time.
    -186              * @private
    -187              */
    -188             behaviorDuration:-1,
    -189 
    -190             /**
    -191              * Will this behavior apply for ever in a loop ?
    -192              * @private
    -193              */
    -194             cycleBehavior:false,
    -195 
    -196             /**
    -197              * behavior status.
    -198              * @private
    -199              */
    -200             status: CAAT.Behavior.BaseBehavior.Status.NOT_STARTED, // Status.NOT_STARTED
    -201 
    -202             /**
    -203              * An interpolator object to apply behaviors using easing functions, etc.
    -204              * Unless otherwise specified, it will be linearly applied.
    -205              * @type {CAAT.Behavior.Interpolator}
    -206              * @private
    -207              */
    -208             interpolator:null,
    -209 
    -210             /**
    -211              * The actor this behavior will be applied to.
    -212              * @type {CAAT.Foundation.Actor}
    -213              * @private
    -214              */
    -215             actor:null, // actor the Behavior acts on.
    -216 
    -217             /**
    -218              * An id to identify this behavior.
    -219              */
    -220             id:0, // an integer id suitable to identify this behavior by number.
    -221 
    -222             /**
    -223              * Initial offset to apply this behavior the first time.
    -224              * @type {number}
    -225              * @private
    -226              */
    -227             timeOffset:0,
    -228 
    -229             /**
    -230              * Apply the behavior, or just calculate the values ?
    -231              * @type {boolean}
    -232              */
    -233             doValueApplication:true,
    -234 
    -235             /**
    -236              * Is this behavior solved ? When called setDelayTime, this flag identifies whether the behavior
    -237              * is in time relative to the scene.
    -238              * @type {boolean}
    -239              * @private
    -240              */
    -241             solved:true,
    -242 
    -243             /**
    -244              * if true, this behavior will be removed from the this.actor instance when it expires.
    -245              * @type {boolean}
    -246              * @private
    -247              */
    -248             discardable:false,
    -249 
    -250             /**
    -251              * does this behavior apply relative values ??
    -252              */
    -253             isRelative : false,
    -254 
    -255             /**
    -256              * Set this behavior as relative value application to some other measures.
    -257              * Each Behavior will define its own.
    -258              * @param bool
    -259              * @returns {*}
    -260              */
    -261             setRelative : function( bool ) {
    -262                 this.isRelative= bool;
    -263                 return this;
    -264             },
    -265 
    -266             setRelativeValues : function() {
    -267                 this.isRelative= true;
    -268                 return this;
    -269             },
    -270 
    -271             /**
    -272              * Parse a behavior of this type.
    -273              * @param obj {object} an object with a behavior definition.
    -274              */
    -275             parse : function( obj ) {
    -276                 if ( obj.pingpong ) {
    -277                     this.setPingPong();
    -278                 }
    -279                 if ( obj.cycle ) {
    -280                     this.setCycle(true);
    -281                 }
    -282                 var delay= obj.delay || 0;
    -283                 var duration= obj.duration || 1000;
    -284 
    -285                 this.setDelayTime( delay, duration );
    -286 
    -287                 if ( obj.interpolator ) {
    -288                     this.setInterpolator( CAAT.Behavior.Interpolator.parse(obj.interpolator) );
    -289                 }
    -290             },
    -291 
    -292             /**
    -293              * Set whether this behavior will apply behavior values to a reference Actor instance.
    -294              * @param apply {boolean}
    -295              * @return {*}
    -296              */
    -297             setValueApplication:function (apply) {
    -298                 this.doValueApplication = apply;
    -299                 return this;
    -300             },
    -301 
    -302             /**
    -303              * Set this behavior offset time.
    -304              * This method is intended to make a behavior start applying (the first) time from a different
    -305              * start time.
    -306              * @param offset {number} between 0 and 1
    -307              * @return {*}
    -308              */
    -309             setTimeOffset:function (offset) {
    -310                 this.timeOffset = offset;
    -311                 return this;
    -312             },
    -313 
    -314             /**
    -315              * Set this behavior status
    -316              * @param st {CAAT.Behavior.BaseBehavior.Status}
    -317              * @return {*}
    -318              * @private
    -319              */
    -320             setStatus : function(st) {
    -321                 this.status= st;
    -322                 return this;
    -323             },
    -324 
    -325             /**
    -326              * Sets this behavior id.
    -327              * @param id {object}
    -328              *
    -329              */
    -330             setId:function (id) {
    -331                 this.id = id;
    -332                 return this;
    -333             },
    -334 
    -335             /**
    -336              * Sets the default interpolator to a linear ramp, that is, behavior will be applied linearly.
    -337              * @return this
    -338              */
    -339             setDefaultInterpolator:function () {
    -340                 this.interpolator = DefaultInterpolator;
    -341                 return this;
    -342             },
    -343 
    -344             /**
    -345              * Sets default interpolator to be linear from 0..1 and from 1..0.
    -346              * @return this
    -347              */
    -348             setPingPong:function () {
    -349                 this.interpolator = DefaultInterpolatorPP;
    -350                 return this;
    -351             },
    -352 
    -353             /**
    -354              * Sets behavior start time and duration. Start time is set absolutely relative to scene time.
    -355              * @param startTime {number} an integer indicating behavior start time in scene time in ms..
    -356              * @param duration {number} an integer indicating behavior duration in ms.
    -357              */
    -358             setFrameTime:function (startTime, duration) {
    -359                 this.behaviorStartTime = startTime;
    -360                 this.behaviorDuration = duration;
    -361                 this.status =CAAT.Behavior.BaseBehavior.Status.NOT_STARTED;
    -362 
    -363                 return this;
    -364             },
    -365 
    -366             /**
    -367              * Sets behavior start time and duration. Start time is relative to scene time.
    -368              *
    -369              * a call to
    -370              *   setFrameTime( scene.time, duration ) is equivalent to
    -371              *   setDelayTime( 0, duration )
    -372              * @param delay {number}
    -373              * @param duration {number}
    -374              */
    -375             setDelayTime:function (delay, duration) {
    -376                 this.behaviorStartTime = delay;
    -377                 this.behaviorDuration = duration;
    -378                 this.status =CAAT.Behavior.BaseBehavior.Status.NOT_STARTED;
    -379                 this.solved = false;
    -380                 this.expired = false;
    -381 
    -382                 return this;
    -383 
    -384             },
    -385 
    -386             /**
    -387              * Make this behavior not applicable.
    -388              * @return {*}
    -389              */
    -390             setOutOfFrameTime:function () {
    -391                 this.status =CAAT.Behavior.BaseBehavior.Status.EXPIRED;
    -392                 this.behaviorStartTime = Number.MAX_VALUE;
    -393                 this.behaviorDuration = 0;
    -394                 return this;
    -395             },
    -396 
    -397             /**
    -398              * Changes behavior default interpolator to another instance of CAAT.Interpolator.
    -399              * If the behavior is not defined by CAAT.Interpolator factory methods, the interpolation function must return
    -400              * its values in the range 0..1. The behavior will only apply for such value range.
    -401              * @param interpolator a CAAT.Interpolator instance.
    -402              */
    -403             setInterpolator:function (interpolator) {
    -404                 this.interpolator = interpolator;
    -405                 return this;
    -406             },
    -407 
    -408             /**
    -409              * This method must no be called directly.
    -410              * The director loop will call this method in orther to apply actor behaviors.
    -411              * @param time the scene time the behaviro is being applied at.
    -412              * @param actor a CAAT.Actor instance the behavior is being applied to.
    -413              */
    -414             apply:function (time, actor) {
    -415 
    -416                 if (!this.solved) {
    -417                     this.behaviorStartTime += time;
    -418                     this.solved = true;
    -419                 }
    -420 
    -421                 time += this.timeOffset * this.behaviorDuration;
    -422 
    -423                 var orgTime = time;
    -424                 if (this.isBehaviorInTime(time, actor)) {
    -425                     time = this.normalizeTime(time);
    -426                     this.fireBehaviorAppliedEvent(
    -427                         actor,
    -428                         orgTime,
    -429                         time,
    -430                         this.setForTime(time, actor));
    -431                 }
    -432             },
    -433 
    -434             /**
    -435              * Sets the behavior to cycle, ie apply forever.
    -436              * @param bool a boolean indicating whether the behavior is cycle.
    -437              */
    -438             setCycle:function (bool) {
    -439                 this.cycleBehavior = bool;
    -440                 return this;
    -441             },
    -442 
    -443             isCycle : function() {
    -444                 return this.cycleBehavior;
    -445             },
    -446 
    -447             /**
    -448              * Adds an observer to this behavior.
    -449              * @param behaviorListener an observer instance.
    -450              */
    -451             addListener:function (behaviorListener) {
    -452                 this.lifecycleListenerList.push(behaviorListener);
    -453                 return this;
    -454             },
    -455 
    -456             /**
    -457              * Remove all registered listeners to the behavior.
    -458              */
    -459             emptyListenerList:function () {
    -460                 this.lifecycleListenerList = [];
    -461                 return this;
    -462             },
    -463 
    -464             /**
    -465              * @return an integer indicating the behavior start time in ms..
    -466              */
    -467             getStartTime:function () {
    -468                 return this.behaviorStartTime;
    -469             },
    -470 
    -471             /**
    -472              * @return an integer indicating the behavior duration time in ms.
    -473              */
    -474             getDuration:function () {
    -475                 return this.behaviorDuration;
    -476 
    -477             },
    -478 
    -479             /**
    -480              * Chekcs whether the behaviour is in scene time.
    -481              * In case it gets out of scene time, and has not been tagged as expired, the behavior is expired and observers
    -482              * are notified about that fact.
    -483              * @param time the scene time to check the behavior against.
    -484              * @param actor the actor the behavior is being applied to.
    -485              * @return a boolean indicating whether the behavior is in scene time.
    -486              */
    -487             isBehaviorInTime:function (time, actor) {
    -488 
    -489                 var st= CAAT.Behavior.BaseBehavior.Status;
    -490 
    -491                 if (this.status === st.EXPIRED || this.behaviorStartTime < 0) {
    -492                     return false;
    -493                 }
    -494 
    -495                 if (this.cycleBehavior) {
    -496                     if (time >= this.behaviorStartTime) {
    -497                         time = (time - this.behaviorStartTime) % this.behaviorDuration + this.behaviorStartTime;
    -498                     }
    -499                 }
    -500 
    -501                 if (time > this.behaviorStartTime + this.behaviorDuration) {
    -502                     if (this.status !== st.EXPIRED) {
    -503                         this.setExpired(actor, time);
    -504                     }
    -505 
    -506                     return false;
    -507                 }
    -508 
    -509                 if (this.status === st.NOT_STARTED) {
    -510                     this.status = st.STARTED;
    -511                     this.fireBehaviorStartedEvent(actor, time);
    -512                 }
    -513 
    -514                 return this.behaviorStartTime <= time; // && time<this.behaviorStartTime+this.behaviorDuration;
    -515             },
    -516 
    -517             /**
    -518              * Notify observers the first time the behavior is applied.
    -519              * @param actor
    -520              * @param time
    -521              * @private
    -522              */
    -523             fireBehaviorStartedEvent:function (actor, time) {
    -524                 for (var i = 0, l = this.lifecycleListenerList.length; i < l; i++) {
    -525                     var b = this.lifecycleListenerList[i];
    -526                     if (b.behaviorStarted) {
    -527                         b.behaviorStarted(this, time, actor);
    -528                     }
    -529                 }
    -530             },
    -531 
    -532             /**
    -533              * Notify observers about expiration event.
    -534              * @param actor a CAAT.Actor instance
    -535              * @param time an integer with the scene time the behavior was expired at.
    -536              * @private
    -537              */
    -538             fireBehaviorExpiredEvent:function (actor, time) {
    -539                 for (var i = 0, l = this.lifecycleListenerList.length; i < l; i++) {
    -540                     var b = this.lifecycleListenerList[i];
    -541                     if (b.behaviorExpired) {
    -542                         b.behaviorExpired(this, time, actor);
    -543                     }
    -544                 }
    -545             },
    -546 
    -547             /**
    -548              * Notify observers about behavior being applied.
    -549              * @param actor a CAAT.Actor instance the behavior is being applied to.
    -550              * @param time the scene time of behavior application.
    -551              * @param normalizedTime the normalized time (0..1) considering 0 behavior start time and 1
    -552              * behaviorStartTime+behaviorDuration.
    -553              * @param value the value being set for actor properties. each behavior will supply with its own value version.
    -554              * @private
    -555              */
    -556             fireBehaviorAppliedEvent:function (actor, time, normalizedTime, value) {
    -557                 for (var i = 0, l = this.lifecycleListenerList.length; i < l; i++) {
    -558                     var b = this.lifecycleListenerList[i];
    -559                     if (b.behaviorApplied) {
    -560                         b.behaviorApplied(this, time, normalizedTime, actor, value);
    -561                     }
    -562                 }
    -563             },
    -564 
    -565             /**
    -566              * Convert scene time into something more manageable for the behavior.
    -567              * behaviorStartTime will be 0 and behaviorStartTime+behaviorDuration will be 1.
    -568              * the time parameter will be proportional to those values.
    -569              * @param time the scene time to be normalized. an integer.
    -570              * @private
    -571              */
    -572             normalizeTime:function (time) {
    -573                 time = time - this.behaviorStartTime;
    -574                 if (this.cycleBehavior) {
    -575                     time %= this.behaviorDuration;
    -576                 }
    -577 
    -578                 return this.interpolator.getPosition(time / this.behaviorDuration).y;
    -579             },
    -580 
    -581             /**
    -582              * Sets the behavior as expired.
    -583              * This method must not be called directly. It is an auxiliary method to isBehaviorInTime method.
    -584              * @param actor {CAAT.Actor}
    -585              * @param time {integer} the scene time.
    -586              * @private
    -587              */
    -588             setExpired:function (actor, time) {
    -589                 // set for final interpolator value.
    -590                 this.status = CAAT.Behavior.BaseBehavior.Status.EXPIRED;
    -591                 this.setForTime(this.interpolator.getPosition(1).y, actor);
    -592                 this.fireBehaviorExpiredEvent(actor, time);
    -593 
    -594                 if (this.discardable) {
    -595                     this.actor.removeBehavior(this);
    -596                 }
    -597             },
    -598 
    -599             /**
    -600              * This method must be overriden for every Behavior breed.
    -601              * Must not be called directly.
    -602              * @param actor {CAAT.Actor} a CAAT.Actor instance.
    -603              * @param time {number} an integer with the scene time.
    -604              * @private
    -605              */
    -606             setForTime:function (time, actor) {
    -607 
    -608             },
    -609 
    -610             /**
    -611              * @param overrides
    -612              */
    -613             initialize:function (overrides) {
    -614                 if (overrides) {
    -615                     for (var i in overrides) {
    -616                         this[i] = overrides[i];
    -617                     }
    -618                 }
    -619 
    -620                 return this;
    -621             },
    -622 
    -623             /**
    -624              * Get this behaviors CSS property name application.
    -625              * @return {String}
    -626              */
    -627             getPropertyName:function () {
    -628                 return "";
    -629             },
    -630 
    -631             /**
    -632              * Calculate a CSS3 @key-frame for this behavior at the given time.
    -633              * @param time {number}
    -634              */
    -635             calculateKeyFrameData:function (time) {
    -636             },
    -637 
    -638             /**
    -639              * Calculate a CSS3 @key-frame data values instead of building a CSS3 @key-frame value.
    -640              * @param time {number}
    -641              */
    -642             getKeyFrameDataValues : function(time) {
    -643             },
    -644 
    -645             /**
    -646              * Calculate a complete CSS3 @key-frame set for this behavior.
    -647              * @param prefix {string} browser vendor prefix
    -648              * @param name {string} keyframes animation name
    -649              * @param keyframessize {number} number of keyframes to generate
    -650              */
    -651             calculateKeyFramesData:function (prefix, name, keyframessize) {
    -652             }
    -653 
    -654         }
    -655     }
    -656 });
    -657 
    -658 
    -659 
    -660 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ContainerBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ContainerBehavior.js.html deleted file mode 100644 index c04f6a46..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ContainerBehavior.js.html +++ /dev/null @@ -1,456 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name ContainerBehavior
    -  5      * @memberOf CAAT.Behavior
    -  6      * @extends CAAT.Behavior.BaseBehavior
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines:"CAAT.Behavior.ContainerBehavior",
    - 11     depends:["CAAT.Behavior.BaseBehavior", "CAAT.Behavior.GenericBehavior"],
    - 12     aliases: ["CAAT.ContainerBehavior"],
    - 13     extendsClass : "CAAT.Behavior.BaseBehavior",
    - 14     extendsWith:function () {
    - 15 
    - 16         return {
    - 17 
    - 18             /**
    - 19              * @lends CAAT.Behavior.ContainerBehavior.prototype
    - 20              */
    - 21 
    - 22             /**
    - 23              * @inheritDoc
    - 24              */
    - 25             parse : function( obj ) {
    - 26                 if ( obj.behaviors && obj.behaviors.length ) {
    - 27                     for( var i=0; i<obj.behaviors.length; i+=1 ) {
    - 28                         this.addBehavior( CAAT.Behavior.BaseBehavior.parse( obj.behaviors[i] ) );
    - 29                     }
    - 30                 }
    - 31                 CAAT.Behavior.ContainerBehavior.superclass.parse.call(this,obj);
    - 32             },
    - 33 
    - 34             /**
    - 35              * A collection of behaviors.
    - 36              * @type {Array.<CAAT.Behavior.BaseBehavior>}
    - 37              */
    - 38             behaviors:null, // contained behaviors array
    - 39             recursiveCycleBehavior : false,
    - 40             conforming : false,
    - 41 
    - 42             /**
    - 43              * @param conforming {bool=} conform this behavior duration to that of its children.
    - 44              * @inheritDoc
    - 45              * @private
    - 46              */
    - 47             __init:function ( conforming ) {
    - 48                 this.__super();
    - 49                 this.behaviors = [];
    - 50                 if ( conforming ) {
    - 51                     this.conforming= true;
    - 52                 }
    - 53                 return this;
    - 54             },
    - 55 
    - 56             /**
    - 57              * Proportionally change this container duration to its children.
    - 58              * @param duration {number} new duration in ms.
    - 59              * @return this;
    - 60              */
    - 61             conformToDuration:function (duration) {
    - 62                 this.duration = duration;
    - 63 
    - 64                 var f = duration / this.duration;
    - 65                 var bh;
    - 66                 for (var i = 0; i < this.behaviors.length; i++) {
    - 67                     bh = this.behaviors[i];
    - 68                     bh.setFrameTime(bh.getStartTime() * f, bh.getDuration() * f);
    - 69                 }
    - 70 
    - 71                 return this;
    - 72             },
    - 73 
    - 74             /**
    - 75              * Get a behavior by mathing its id.
    - 76              * @param id {object}
    - 77              */
    - 78             getBehaviorById : function(id) {
    - 79                 for( var i=0; i<this.behaviors.length; i++ ) {
    - 80                     if ( this.behaviors[i].id===id ) {
    - 81                         return this.behaviors[i];
    - 82                     }
    - 83                 }
    - 84 
    - 85                 return null;
    - 86             },
    - 87 
    - 88             setCycle : function( cycle, recurse ) {
    - 89                 CAAT.Behavior.ContainerBehavior.superclass.setCycle.call(this,cycle);
    - 90 
    - 91                 if ( recurse ) {
    - 92                     for( var i=0; i<this.behaviors.length; i++ ) {
    - 93                         this.behaviors[i].setCycle(cycle);
    - 94                     }
    - 95                 }
    - 96 
    - 97                 this.recursiveCycleBehavior= recurse;
    - 98 
    - 99                 return this;
    -100             },
    -101 
    -102             /**
    -103              * Add a new behavior to the container.
    -104              * @param behavior {CAAT.Behavior.BaseBehavior}
    -105              */
    -106             addBehavior:function (behavior) {
    -107                 this.behaviors.push(behavior);
    -108                 behavior.addListener(this);
    -109 
    -110                 if ( this.conforming ) {
    -111                     var len= behavior.behaviorDuration + behavior.behaviorStartTime;
    -112                     if ( this.behaviorDuration < len ) {
    -113                         this.behaviorDuration= len;
    -114                         this.behaviorStartTime= 0;
    -115                     }
    -116                 }
    -117 
    -118                 if ( this.recursiveCycleBehavior ) {
    -119                     behavior.setCycle( this.isCycle() );
    -120                 }
    -121 
    -122                 return this;
    -123             },
    -124 
    -125             /**
    -126              * Applies every contained Behaviors.
    -127              * The application time the contained behaviors will receive will be ContainerBehavior related and not the
    -128              * received time.
    -129              * @param time an integer indicating the time to apply the contained behaviors at.
    -130              * @param actor a CAAT.Foundation.Actor instance indicating the actor to apply the behaviors for.
    -131              */
    -132             apply:function (time, actor) {
    -133 
    -134                 if (!this.solved) {
    -135                     this.behaviorStartTime += time;
    -136                     this.solved = true;
    -137                 }
    -138 
    -139                 time += this.timeOffset * this.behaviorDuration;
    -140 
    -141                 if (this.isBehaviorInTime(time, actor)) {
    -142                     time -= this.behaviorStartTime;
    -143                     if (this.cycleBehavior) {
    -144                         time %= this.behaviorDuration;
    -145                     }
    -146 
    -147                     var bh = this.behaviors;
    -148                     for (var i = 0; i < bh.length; i++) {
    -149                         bh[i].apply(time, actor);
    -150                     }
    -151                 }
    -152             },
    -153 
    -154             /**
    -155              * This method is the observer implementation for every contained behavior.
    -156              * If a container is Cycle=true, won't allow its contained behaviors to be expired.
    -157              * @param behavior a CAAT.Behavior.BaseBehavior instance which has been expired.
    -158              * @param time an integer indicating the time at which has become expired.
    -159              * @param actor a CAAT.Foundation.Actor the expired behavior is being applied to.
    -160              */
    -161             behaviorExpired:function (behavior, time, actor) {
    -162                 if (this.cycleBehavior) {
    -163                     behavior.setStatus(CAAT.Behavior.BaseBehavior.Status.STARTED);
    -164                 }
    -165             },
    -166 
    -167             behaviorApplied : function(behavior, scenetime, time, actor, value ) {
    -168                 this.fireBehaviorAppliedEvent(actor, scenetime, time, value);
    -169             },
    -170 
    -171             /**
    -172              * Implementation method of the behavior.
    -173              * Just call implementation method for its contained behaviors.
    -174              * @param time{number} an integer indicating the time the behavior is being applied at.
    -175              * @param actor{CAAT.Foundation.Actor} an actor the behavior is being applied to.
    -176              */
    -177             setForTime:function (time, actor) {
    -178                 var retValue= null;
    -179                 var bh = this.behaviors;
    -180                 for (var i = 0; i < bh.length; i++) {
    -181                     retValue= bh[i].setForTime(time, actor);
    -182                 }
    -183 
    -184                 return retValue;
    -185             },
    -186 
    -187             /**
    -188              * Expire this behavior and the children applied at the parameter time.
    -189              * @param actor {CAAT.Foundation.Actor}
    -190              * @param time {number}
    -191              * @return {*}
    -192              */
    -193             setExpired:function (actor, time) {
    -194 
    -195                 var bh = this.behaviors;
    -196                 // set for final interpolator value.
    -197                 for (var i = 0; i < bh.length; i++) {
    -198                     var bb = bh[i];
    -199                     if ( bb.status !== CAAT.Behavior.BaseBehavior.Status.EXPIRED) {
    -200                         bb.setExpired(actor, time - this.behaviorStartTime);
    -201                     }
    -202                 }
    -203 
    -204                 /**
    -205                  * moved here from the beggining of the method.
    -206                  * allow for expiration observers to reset container behavior and its sub-behaviors
    -207                  * to redeem.
    -208                  */
    -209                 CAAT.Behavior.ContainerBehavior.superclass.setExpired.call(this, actor, time);
    -210 
    -211                 return this;
    -212             },
    -213 
    -214             /**
    -215              * @inheritDoc
    -216              */
    -217             setFrameTime:function (start, duration) {
    -218                 CAAT.Behavior.ContainerBehavior.superclass.setFrameTime.call(this, start, duration);
    -219 
    -220                 var bh = this.behaviors;
    -221                 for (var i = 0; i < bh.length; i++) {
    -222                     bh[i].setStatus(CAAT.Behavior.BaseBehavior.Status.NOT_STARTED);
    -223                 }
    -224                 return this;
    -225             },
    -226 
    -227             /**
    -228              * @inheritDoc
    -229              */
    -230             setDelayTime:function (start, duration) {
    -231                 CAAT.Behavior.ContainerBehavior.superclass.setDelayTime.call(this, start, duration);
    -232 
    -233                 var bh = this.behaviors;
    -234                 for (var i = 0; i < bh.length; i++) {
    -235                     bh[i].setStatus(CAAT.Behavior.BaseBehavior.Status.NOT_STARTED);
    -236                 }
    -237                 return this;
    -238             },
    -239 
    -240             /**
    -241              * @inheritDoc
    -242              */
    -243             getKeyFrameDataValues : function(referenceTime) {
    -244 
    -245                 var i, bh, time;
    -246                 var keyFrameData= {
    -247                     angle : 0,
    -248                     scaleX : 1,
    -249                     scaleY : 1,
    -250                     x : 0,
    -251                     y : 0
    -252                 };
    -253 
    -254                 for (i = 0; i < this.behaviors.length; i++) {
    -255                     bh = this.behaviors[i];
    -256                     if (bh.status !== CAAT.Behavior.BaseBehavior.Status.EXPIRED && !(bh instanceof CAAT.Behavior.GenericBehavior)) {
    -257 
    -258                         // ajustar tiempos:
    -259                         //  time es tiempo normalizado a duracion de comportamiento contenedor.
    -260                         //      1.- desnormalizar
    -261                         time = referenceTime * this.behaviorDuration;
    -262 
    -263                         //      2.- calcular tiempo relativo de comportamiento respecto a contenedor
    -264                         if (bh.behaviorStartTime <= time && bh.behaviorStartTime + bh.behaviorDuration >= time) {
    -265                             //      3.- renormalizar tiempo reltivo a comportamiento.
    -266                             time = (time - bh.behaviorStartTime) / bh.behaviorDuration;
    -267 
    -268                             //      4.- obtener valor de comportamiento para tiempo normalizado relativo a contenedor
    -269                             var obj= bh.getKeyFrameDataValues(time);
    -270                             for( var pr in obj ) {
    -271                                 keyFrameData[pr]= obj[pr];
    -272                             }
    -273                         }
    -274                     }
    -275                 }
    -276 
    -277                 return keyFrameData;
    -278             },
    -279 
    -280             /**
    -281              * @inheritDoc
    -282              */
    -283             calculateKeyFrameData:function (referenceTime, prefix) {
    -284 
    -285                 var i;
    -286                 var bh;
    -287 
    -288                 var retValue = {};
    -289                 var time;
    -290                 var cssRuleValue;
    -291                 var cssProperty;
    -292                 var property;
    -293 
    -294                 for (i = 0; i < this.behaviors.length; i++) {
    -295                     bh = this.behaviors[i];
    -296                     if (bh.status !== CAAT.Behavior.BaseBehavior.Status.EXPIRED && !(bh instanceof CAAT.Behavior.GenericBehavior)) {
    -297 
    -298                         // ajustar tiempos:
    -299                         //  time es tiempo normalizado a duracion de comportamiento contenedor.
    -300                         //      1.- desnormalizar
    -301                         time = referenceTime * this.behaviorDuration;
    -302 
    -303                         //      2.- calcular tiempo relativo de comportamiento respecto a contenedor
    -304                         if (bh.behaviorStartTime <= time && bh.behaviorStartTime + bh.behaviorDuration >= time) {
    -305                             //      3.- renormalizar tiempo reltivo a comportamiento.
    -306                             time = (time - bh.behaviorStartTime) / bh.behaviorDuration;
    -307 
    -308                             //      4.- obtener valor de comportamiento para tiempo normalizado relativo a contenedor
    -309                             cssRuleValue = bh.calculateKeyFrameData(time);
    -310                             cssProperty = bh.getPropertyName(prefix);
    -311 
    -312                             if (typeof retValue[cssProperty] === 'undefined') {
    -313                                 retValue[cssProperty] = "";
    -314                             }
    -315 
    -316                             //      5.- asignar a objeto, par de propiedad/valor css
    -317                             retValue[cssProperty] += cssRuleValue + " ";
    -318                         }
    -319 
    -320                     }
    -321                 }
    -322 
    -323 
    -324                 var tr = "";
    -325                 var pv;
    -326 
    -327                 function xx(pr) {
    -328                     if (retValue[pr]) {
    -329                         tr += retValue[pr];
    -330                     } else {
    -331                         if (prevValues) {
    -332                             pv = prevValues[pr];
    -333                             if (pv) {
    -334                                 tr += pv;
    -335                                 retValue[pr] = pv;
    -336                             }
    -337                         }
    -338                     }
    -339                 }
    -340 
    -341                 xx('translate');
    -342                 xx('rotate');
    -343                 xx('scale');
    -344 
    -345                 var keyFrameRule = "";
    -346 
    -347                 if (tr) {
    -348                     keyFrameRule = '-' + prefix + '-transform: ' + tr + ';';
    -349                 }
    -350 
    -351                 tr = "";
    -352                 xx('opacity');
    -353                 if (tr) {
    -354                     keyFrameRule += ' opacity: ' + tr + ';';
    -355                 }
    -356 
    -357                 keyFrameRule+=" -webkit-transform-origin: 0% 0%";
    -358 
    -359                 return {
    -360                     rules:keyFrameRule,
    -361                     ret:retValue
    -362                 };
    -363 
    -364             },
    -365 
    -366             /**
    -367              * @inheritDoc
    -368              */
    -369             calculateKeyFramesData:function (prefix, name, keyframessize, anchorX, anchorY) {
    -370 
    -371                 function toKeyFrame(obj, prevKF) {
    -372 
    -373                     for( var i in prevKF ) {
    -374                         if ( !obj[i] ) {
    -375                             obj[i]= prevKF[i];
    -376                         }
    -377                     }
    -378 
    -379                     var ret= "-" + prefix + "-transform:";
    -380 
    -381                     if ( obj.x || obj.y ) {
    -382                         var x= obj.x || 0;
    -383                         var y= obj.y || 0;
    -384                         ret+= "translate("+x+"px,"+y+"px)";
    -385                     }
    -386 
    -387                     if ( obj.angle ) {
    -388                         ret+= " rotate("+obj.angle+"rad)";
    -389                     }
    -390 
    -391                     if ( obj.scaleX!==1 || obj.scaleY!==1 ) {
    -392                         ret+= " scale("+(obj.scaleX)+","+(obj.scaleY)+")";
    -393                     }
    -394 
    -395                     ret+=";";
    -396 
    -397                     if ( obj.alpha ) {
    -398                         ret+= " opacity: "+obj.alpha+";";
    -399                     }
    -400 
    -401                     if ( anchorX!==.5 || anchorY!==.5) {
    -402                         ret+= " -" + prefix + "-transform-origin:"+ (anchorX*100) + "% " + (anchorY*100) + "%;";
    -403                     }
    -404 
    -405                     return ret;
    -406                 }
    -407 
    -408                 if (this.duration === Number.MAX_VALUE) {
    -409                     return "";
    -410                 }
    -411 
    -412                 if (typeof anchorX==="undefined") {
    -413                     anchorX= .5;
    -414                 }
    -415 
    -416                 if (typeof anchorY==="undefined") {
    -417                     anchorY= .5;
    -418                 }
    -419 
    -420                 if (typeof keyframessize === 'undefined') {
    -421                     keyframessize = 100;
    -422                 }
    -423 
    -424                 var i;
    -425                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    -426                 var time;
    -427                 var prevKF= {};
    -428 
    -429                 for (i = 0; i <= keyframessize; i++) {
    -430                     time = this.interpolator.getPosition(i / keyframessize).y;
    -431 
    -432                     var obj = this.getKeyFrameDataValues(time);
    -433 
    -434                     kfd += "" +
    -435                         (i / keyframessize * 100) + "%" + // percentage
    -436                         "{" + toKeyFrame(obj, prevKF) + "}\n";
    -437 
    -438                     prevKF= obj;
    -439 
    -440                 }
    -441 
    -442                 kfd += "}\n";
    -443 
    -444                 return kfd;
    -445             }
    -446         }
    -447     }
    -448 });
    -449 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_GenericBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_GenericBehavior.js.html deleted file mode 100644 index 2b46f494..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_GenericBehavior.js.html +++ /dev/null @@ -1,87 +0,0 @@ -
      1 CAAT.Module({
    -  2     /**
    -  3      * @name GenericBehavior
    -  4      * @memberOf CAAT.Behavior
    -  5      * @extends CAAT.Behavior.BaseBehavior
    -  6      * @constructor
    -  7      */
    -  8     defines:"CAAT.Behavior.GenericBehavior",
    -  9     depends:["CAAT.Behavior.BaseBehavior"],
    - 10     aliases:["CAAT.GenericBehavior"],
    - 11     extendsClass:"CAAT.Behavior.BaseBehavior",
    - 12     extendsWith:function () {
    - 13 
    - 14         return {
    - 15 
    - 16             /**
    - 17              *  @lends CAAT.Behavior.GenericBehavior.prototype
    - 18              */
    - 19 
    - 20 
    - 21             /**
    - 22              * starting value.
    - 23              */
    - 24             start:0,
    - 25 
    - 26             /**
    - 27              * ending value.
    - 28              */
    - 29             end:0,
    - 30 
    - 31             /**
    - 32              * target to apply this generic behvior.
    - 33              */
    - 34             target:null,
    - 35 
    - 36             /**
    - 37              * property to apply values to.
    - 38              */
    - 39             property:null,
    - 40 
    - 41             /**
    - 42              * this callback will be invoked for every behavior application.
    - 43              */
    - 44             callback:null,
    - 45 
    - 46             /**
    - 47              * @inheritDoc
    - 48              */
    - 49             setForTime:function (time, actor) {
    - 50                 var value = this.start + time * (this.end - this.start);
    - 51                 if (this.callback) {
    - 52                     this.callback(value, this.target, actor);
    - 53                 }
    - 54 
    - 55                 if (this.property) {
    - 56                     this.target[this.property] = value;
    - 57                 }
    - 58             },
    - 59 
    - 60             /**
    - 61              * Defines the values to apply this behavior.
    - 62              *
    - 63              * @param start {number} initial behavior value.
    - 64              * @param end {number} final behavior value.
    - 65              * @param target {object} an object. Usually a CAAT.Actor.
    - 66              * @param property {string} target object's property to set value to.
    - 67              * @param callback {function} a function of the form <code>function( target, value )</code>.
    - 68              */
    - 69             setValues:function (start, end, target, property, callback) {
    - 70                 this.start = start;
    - 71                 this.end = end;
    - 72                 this.target = target;
    - 73                 this.property = property;
    - 74                 this.callback = callback;
    - 75                 return this;
    - 76             }
    - 77         };
    - 78     }
    - 79 });
    - 80 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Interpolator.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Interpolator.js.html deleted file mode 100644 index f39c05c2..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Interpolator.js.html +++ /dev/null @@ -1,493 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * Partially based on Robert Penner easing equations.
    -  5  * http://www.robertpenner.com/easing/
    -  6  *
    -  7  *
    -  8  **/
    -  9 
    - 10 CAAT.Module({
    - 11 
    - 12     /**
    - 13      * @name Interpolator
    - 14      * @memberOf CAAT.Behavior
    - 15      * @constructor
    - 16      */
    - 17 
    - 18     defines:"CAAT.Behavior.Interpolator",
    - 19     depends:["CAAT.Math.Point"],
    - 20     aliases:["CAAT.Interpolator"],
    - 21     constants : {
    - 22         /**
    - 23          * @lends CAAT.Behavior.Interpolator
    - 24          */
    - 25 
    - 26         enumerateInterpolators: function () {
    - 27             return [
    - 28                 new CAAT.Behavior.Interpolator().createLinearInterpolator(false, false), 'Linear pingpong=false, inverse=false',
    - 29                 new CAAT.Behavior.Interpolator().createLinearInterpolator(true, false), 'Linear pingpong=true, inverse=false',
    - 30 
    - 31                 new CAAT.Behavior.Interpolator().createBackOutInterpolator(false), 'BackOut pingpong=true, inverse=false',
    - 32                 new CAAT.Behavior.Interpolator().createBackOutInterpolator(true), 'BackOut pingpong=true, inverse=true',
    - 33 
    - 34                 new CAAT.Behavior.Interpolator().createLinearInterpolator(false, true), 'Linear pingpong=false, inverse=true',
    - 35                 new CAAT.Behavior.Interpolator().createLinearInterpolator(true, true), 'Linear pingpong=true, inverse=true',
    - 36 
    - 37                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(2, false), 'ExponentialIn pingpong=false, exponent=2',
    - 38                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(2, false), 'ExponentialOut pingpong=false, exponent=2',
    - 39                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(2, false), 'ExponentialInOut pingpong=false, exponent=2',
    - 40                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(2, true), 'ExponentialIn pingpong=true, exponent=2',
    - 41                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(2, true), 'ExponentialOut pingpong=true, exponent=2',
    - 42                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(2, true), 'ExponentialInOut pingpong=true, exponent=2',
    - 43 
    - 44                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(4, false), 'ExponentialIn pingpong=false, exponent=4',
    - 45                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(4, false), 'ExponentialOut pingpong=false, exponent=4',
    - 46                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(4, false), 'ExponentialInOut pingpong=false, exponent=4',
    - 47                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(4, true), 'ExponentialIn pingpong=true, exponent=4',
    - 48                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(4, true), 'ExponentialOut pingpong=true, exponent=4',
    - 49                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(4, true), 'ExponentialInOut pingpong=true, exponent=4',
    - 50 
    - 51                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(6, false), 'ExponentialIn pingpong=false, exponent=6',
    - 52                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(6, false), 'ExponentialOut pingpong=false, exponent=6',
    - 53                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(6, false), 'ExponentialInOut pingpong=false, exponent=6',
    - 54                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(6, true), 'ExponentialIn pingpong=true, exponent=6',
    - 55                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(6, true), 'ExponentialOut pingpong=true, exponent=6',
    - 56                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(6, true), 'ExponentialInOut pingpong=true, exponent=6',
    - 57 
    - 58                 new CAAT.Behavior.Interpolator().createBounceInInterpolator(false), 'BounceIn pingpong=false',
    - 59                 new CAAT.Behavior.Interpolator().createBounceOutInterpolator(false), 'BounceOut pingpong=false',
    - 60                 new CAAT.Behavior.Interpolator().createBounceInOutInterpolator(false), 'BounceInOut pingpong=false',
    - 61                 new CAAT.Behavior.Interpolator().createBounceInInterpolator(true), 'BounceIn pingpong=true',
    - 62                 new CAAT.Behavior.Interpolator().createBounceOutInterpolator(true), 'BounceOut pingpong=true',
    - 63                 new CAAT.Behavior.Interpolator().createBounceInOutInterpolator(true), 'BounceInOut pingpong=true',
    - 64 
    - 65                 new CAAT.Behavior.Interpolator().createElasticInInterpolator(1.1, 0.4, false), 'ElasticIn pingpong=false, amp=1.1, d=.4',
    - 66                 new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.1, 0.4, false), 'ElasticOut pingpong=false, amp=1.1, d=.4',
    - 67                 new CAAT.Behavior.Interpolator().createElasticInOutInterpolator(1.1, 0.4, false), 'ElasticInOut pingpong=false, amp=1.1, d=.4',
    - 68                 new CAAT.Behavior.Interpolator().createElasticInInterpolator(1.1, 0.4, true), 'ElasticIn pingpong=true, amp=1.1, d=.4',
    - 69                 new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.1, 0.4, true), 'ElasticOut pingpong=true, amp=1.1, d=.4',
    - 70                 new CAAT.Behavior.Interpolator().createElasticInOutInterpolator(1.1, 0.4, true), 'ElasticInOut pingpong=true, amp=1.1, d=.4',
    - 71 
    - 72                 new CAAT.Behavior.Interpolator().createElasticInInterpolator(1.0, 0.2, false), 'ElasticIn pingpong=false, amp=1.0, d=.2',
    - 73                 new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.0, 0.2, false), 'ElasticOut pingpong=false, amp=1.0, d=.2',
    - 74                 new CAAT.Behavior.Interpolator().createElasticInOutInterpolator(1.0, 0.2, false), 'ElasticInOut pingpong=false, amp=1.0, d=.2',
    - 75                 new CAAT.Behavior.Interpolator().createElasticInInterpolator(1.0, 0.2, true), 'ElasticIn pingpong=true, amp=1.0, d=.2',
    - 76                 new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.0, 0.2, true), 'ElasticOut pingpong=true, amp=1.0, d=.2',
    - 77                 new CAAT.Behavior.Interpolator().createElasticInOutInterpolator(1.0, 0.2, true), 'ElasticInOut pingpong=true, amp=1.0, d=.2'
    - 78             ];
    - 79         },
    - 80 
    - 81         parse : function( obj ) {
    - 82             var name= "create"+obj.type+"Interpolator";
    - 83             var interpolator= new CAAT.Behavior.Interpolator();
    - 84             try {
    - 85                 interpolator[name].apply( interpolator, obj.params||[] );
    - 86             } catch(e) {
    - 87                 interpolator.createLinearInterpolator(false, false);
    - 88             }
    - 89 
    - 90             return interpolator;
    - 91         }
    - 92 
    - 93     },
    - 94     extendsWith:function () {
    - 95 
    - 96         return {
    - 97 
    - 98             /**
    - 99              * @lends CAAT.Behavior.Interpolator.prototype
    -100              */
    -101 
    -102             interpolated:null, // a coordinate holder for not building a new CAAT.Point for each interpolation call.
    -103             paintScale:90, // the size of the interpolation draw on screen in pixels.
    -104 
    -105             __init:function () {
    -106                 this.interpolated = new CAAT.Math.Point(0, 0, 0);
    -107                 return this;
    -108             },
    -109 
    -110             /**
    -111              * Set a linear interpolation function.
    -112              *
    -113              * @param bPingPong {boolean}
    -114              * @param bInverse {boolean} will values will be from 1 to 0 instead of 0 to 1 ?.
    -115              */
    -116             createLinearInterpolator:function (bPingPong, bInverse) {
    -117                 /**
    -118                  * Linear and inverse linear interpolation function.
    -119                  * @param time {number}
    -120                  */
    -121                 this.getPosition = function getPosition(time) {
    -122 
    -123                     var orgTime = time;
    -124 
    -125                     if (bPingPong) {
    -126                         if (time < 0.5) {
    -127                             time *= 2;
    -128                         } else {
    -129                             time = 1 - (time - 0.5) * 2;
    -130                         }
    -131                     }
    -132 
    -133                     if (bInverse !== null && bInverse) {
    -134                         time = 1 - time;
    -135                     }
    -136 
    -137                     return this.interpolated.set(orgTime, time);
    -138                 };
    -139 
    -140                 return this;
    -141             },
    -142 
    -143             createBackOutInterpolator:function (bPingPong) {
    -144                 this.getPosition = function getPosition(time) {
    -145                     var orgTime = time;
    -146 
    -147                     if (bPingPong) {
    -148                         if (time < 0.5) {
    -149                             time *= 2;
    -150                         } else {
    -151                             time = 1 - (time - 0.5) * 2;
    -152                         }
    -153                     }
    -154 
    -155                     time = time - 1;
    -156                     var overshoot = 1.70158;
    -157 
    -158                     return this.interpolated.set(
    -159                         orgTime,
    -160                         time * time * ((overshoot + 1) * time + overshoot) + 1);
    -161                 };
    -162 
    -163                 return this;
    -164             },
    -165             /**
    -166              * Set an exponential interpolator function. The function to apply will be Math.pow(time,exponent).
    -167              * This function starts with 0 and ends in values of 1.
    -168              *
    -169              * @param exponent {number} exponent of the function.
    -170              * @param bPingPong {boolean}
    -171              */
    -172             createExponentialInInterpolator:function (exponent, bPingPong) {
    -173                 this.getPosition = function getPosition(time) {
    -174                     var orgTime = time;
    -175 
    -176                     if (bPingPong) {
    -177                         if (time < 0.5) {
    -178                             time *= 2;
    -179                         } else {
    -180                             time = 1 - (time - 0.5) * 2;
    -181                         }
    -182                     }
    -183                     return this.interpolated.set(orgTime, Math.pow(time, exponent));
    -184                 };
    -185 
    -186                 return this;
    -187             },
    -188             /**
    -189              * Set an exponential interpolator function. The function to apply will be 1-Math.pow(time,exponent).
    -190              * This function starts with 1 and ends in values of 0.
    -191              *
    -192              * @param exponent {number} exponent of the function.
    -193              * @param bPingPong {boolean}
    -194              */
    -195             createExponentialOutInterpolator:function (exponent, bPingPong) {
    -196                 this.getPosition = function getPosition(time) {
    -197                     var orgTime = time;
    -198 
    -199                     if (bPingPong) {
    -200                         if (time < 0.5) {
    -201                             time *= 2;
    -202                         } else {
    -203                             time = 1 - (time - 0.5) * 2;
    -204                         }
    -205                     }
    -206                     return this.interpolated.set(orgTime, 1 - Math.pow(1 - time, exponent));
    -207                 };
    -208 
    -209                 return this;
    -210             },
    -211             /**
    -212              * Set an exponential interpolator function. Two functions will apply:
    -213              * Math.pow(time*2,exponent)/2 for the first half of the function (t<0.5) and
    -214              * 1-Math.abs(Math.pow(time*2-2,exponent))/2 for the second half (t>=.5)
    -215              * This function starts with 0 and goes to values of 1 and ends with values of 0.
    -216              *
    -217              * @param exponent {number} exponent of the function.
    -218              * @param bPingPong {boolean}
    -219              */
    -220             createExponentialInOutInterpolator:function (exponent, bPingPong) {
    -221                 this.getPosition = function getPosition(time) {
    -222                     var orgTime = time;
    -223 
    -224                     if (bPingPong) {
    -225                         if (time < 0.5) {
    -226                             time *= 2;
    -227                         } else {
    -228                             time = 1 - (time - 0.5) * 2;
    -229                         }
    -230                     }
    -231                     if (time * 2 < 1) {
    -232                         return this.interpolated.set(orgTime, Math.pow(time * 2, exponent) / 2);
    -233                     }
    -234 
    -235                     return this.interpolated.set(orgTime, 1 - Math.abs(Math.pow(time * 2 - 2, exponent)) / 2);
    -236                 };
    -237 
    -238                 return this;
    -239             },
    -240             /**
    -241              * Creates a Quadric bezier curbe as interpolator.
    -242              *
    -243              * @param p0 {CAAT.Math.Point}
    -244              * @param p1 {CAAT.Math.Point}
    -245              * @param p2 {CAAT.Math.Point}
    -246              * @param bPingPong {boolean} a boolean indicating if the interpolator must ping-pong.
    -247              */
    -248             createQuadricBezierInterpolator:function (p0, p1, p2, bPingPong) {
    -249                 this.getPosition = function getPosition(time) {
    -250                     var orgTime = time;
    -251 
    -252                     if (bPingPong) {
    -253                         if (time < 0.5) {
    -254                             time *= 2;
    -255                         } else {
    -256                             time = 1 - (time - 0.5) * 2;
    -257                         }
    -258                     }
    -259 
    -260                     time = (1 - time) * (1 - time) * p0.y + 2 * (1 - time) * time * p1.y + time * time * p2.y;
    -261 
    -262                     return this.interpolated.set(orgTime, time);
    -263                 };
    -264 
    -265                 return this;
    -266             },
    -267             /**
    -268              * Creates a Cubic bezier curbe as interpolator.
    -269              *
    -270              * @param p0 {CAAT.Math.Point}
    -271              * @param p1 {CAAT.Math.Point}
    -272              * @param p2 {CAAT.Math.Point}
    -273              * @param p3 {CAAT.Math.Point}
    -274              * @param bPingPong {boolean} a boolean indicating if the interpolator must ping-pong.
    -275              */
    -276             createCubicBezierInterpolator:function (p0, p1, p2, p3, bPingPong) {
    -277                 this.getPosition = function getPosition(time) {
    -278                     var orgTime = time;
    -279 
    -280                     if (bPingPong) {
    -281                         if (time < 0.5) {
    -282                             time *= 2;
    -283                         } else {
    -284                             time = 1 - (time - 0.5) * 2;
    -285                         }
    -286                     }
    -287 
    -288                     var t2 = time * time;
    -289                     var t3 = time * t2;
    -290 
    -291                     time = (p0.y + time * (-p0.y * 3 + time * (3 * p0.y -
    -292                         p0.y * time))) + time * (3 * p1.y + time * (-6 * p1.y +
    -293                         p1.y * 3 * time)) + t2 * (p2.y * 3 - p2.y * 3 * time) +
    -294                         p3.y * t3;
    -295 
    -296                     return this.interpolated.set(orgTime, time);
    -297                 };
    -298 
    -299                 return this;
    -300             },
    -301             createElasticOutInterpolator:function (amplitude, p, bPingPong) {
    -302                 this.getPosition = function getPosition(time) {
    -303 
    -304                     if (bPingPong) {
    -305                         if (time < 0.5) {
    -306                             time *= 2;
    -307                         } else {
    -308                             time = 1 - (time - 0.5) * 2;
    -309                         }
    -310                     }
    -311 
    -312                     if (time === 0) {
    -313                         return {x:0, y:0};
    -314                     }
    -315                     if (time === 1) {
    -316                         return {x:1, y:1};
    -317                     }
    -318 
    -319                     var s = p / (2 * Math.PI) * Math.asin(1 / amplitude);
    -320                     return this.interpolated.set(
    -321                         time,
    -322                         (amplitude * Math.pow(2, -10 * time) * Math.sin((time - s) * (2 * Math.PI) / p) + 1 ));
    -323                 };
    -324                 return this;
    -325             },
    -326             createElasticInInterpolator:function (amplitude, p, bPingPong) {
    -327                 this.getPosition = function getPosition(time) {
    -328 
    -329                     if (bPingPong) {
    -330                         if (time < 0.5) {
    -331                             time *= 2;
    -332                         } else {
    -333                             time = 1 - (time - 0.5) * 2;
    -334                         }
    -335                     }
    -336 
    -337                     if (time === 0) {
    -338                         return {x:0, y:0};
    -339                     }
    -340                     if (time === 1) {
    -341                         return {x:1, y:1};
    -342                     }
    -343 
    -344                     var s = p / (2 * Math.PI) * Math.asin(1 / amplitude);
    -345                     return this.interpolated.set(
    -346                         time,
    -347                         -(amplitude * Math.pow(2, 10 * (time -= 1)) * Math.sin((time - s) * (2 * Math.PI) / p) ));
    -348                 };
    -349 
    -350                 return this;
    -351             },
    -352             createElasticInOutInterpolator:function (amplitude, p, bPingPong) {
    -353                 this.getPosition = function getPosition(time) {
    -354 
    -355                     if (bPingPong) {
    -356                         if (time < 0.5) {
    -357                             time *= 2;
    -358                         } else {
    -359                             time = 1 - (time - 0.5) * 2;
    -360                         }
    -361                     }
    -362 
    -363                     var s = p / (2 * Math.PI) * Math.asin(1 / amplitude);
    -364                     time *= 2;
    -365                     if (time <= 1) {
    -366                         return this.interpolated.set(
    -367                             time,
    -368                             -0.5 * (amplitude * Math.pow(2, 10 * (time -= 1)) * Math.sin((time - s) * (2 * Math.PI) / p)));
    -369                     }
    -370 
    -371                     return this.interpolated.set(
    -372                         time,
    -373                         1 + 0.5 * (amplitude * Math.pow(2, -10 * (time -= 1)) * Math.sin((time - s) * (2 * Math.PI) / p)));
    -374                 };
    -375 
    -376                 return this;
    -377             },
    -378             /**
    -379              * @param time {number}
    -380              * @private
    -381              */
    -382             bounce:function (time) {
    -383                 if ((time /= 1) < (1 / 2.75)) {
    -384                     return {x:time, y:7.5625 * time * time};
    -385                 } else if (time < (2 / 2.75)) {
    -386                     return {x:time, y:7.5625 * (time -= (1.5 / 2.75)) * time + 0.75};
    -387                 } else if (time < (2.5 / 2.75)) {
    -388                     return {x:time, y:7.5625 * (time -= (2.25 / 2.75)) * time + 0.9375};
    -389                 } else {
    -390                     return {x:time, y:7.5625 * (time -= (2.625 / 2.75)) * time + 0.984375};
    -391                 }
    -392             },
    -393             createBounceOutInterpolator:function (bPingPong) {
    -394                 this.getPosition = function getPosition(time) {
    -395                     if (bPingPong) {
    -396                         if (time < 0.5) {
    -397                             time *= 2;
    -398                         } else {
    -399                             time = 1 - (time - 0.5) * 2;
    -400                         }
    -401                     }
    -402                     return this.bounce(time);
    -403                 };
    -404 
    -405                 return this;
    -406             },
    -407             createBounceInInterpolator:function (bPingPong) {
    -408 
    -409                 this.getPosition = function getPosition(time) {
    -410                     if (bPingPong) {
    -411                         if (time < 0.5) {
    -412                             time *= 2;
    -413                         } else {
    -414                             time = 1 - (time - 0.5) * 2;
    -415                         }
    -416                     }
    -417                     var r = this.bounce(1 - time);
    -418                     r.y = 1 - r.y;
    -419                     return r;
    -420                 };
    -421 
    -422                 return this;
    -423             },
    -424             createBounceInOutInterpolator:function (bPingPong) {
    -425 
    -426                 this.getPosition = function getPosition(time) {
    -427                     if (bPingPong) {
    -428                         if (time < 0.5) {
    -429                             time *= 2;
    -430                         } else {
    -431                             time = 1 - (time - 0.5) * 2;
    -432                         }
    -433                     }
    -434 
    -435                     var r;
    -436                     if (time < 0.5) {
    -437                         r = this.bounce(1 - time * 2);
    -438                         r.y = (1 - r.y) * 0.5;
    -439                         return r;
    -440                     }
    -441                     r = this.bounce(time * 2 - 1, bPingPong);
    -442                     r.y = r.y * 0.5 + 0.5;
    -443                     return r;
    -444                 };
    -445 
    -446                 return this;
    -447             },
    -448 
    -449             /**
    -450              * Paints an interpolator on screen.
    -451              * @param ctx {CanvasRenderingContext}
    -452              */
    -453             paint:function (ctx) {
    -454 
    -455                 ctx.save();
    -456                 ctx.beginPath();
    -457 
    -458                 ctx.moveTo(0, this.getPosition(0).y * this.paintScale);
    -459 
    -460                 for (var i = 0; i <= this.paintScale; i++) {
    -461                     ctx.lineTo(i, this.getPosition(i / this.paintScale).y * this.paintScale);
    -462                 }
    -463 
    -464                 ctx.strokeStyle = 'black';
    -465                 ctx.stroke();
    -466                 ctx.restore();
    -467             },
    -468 
    -469             /**
    -470              * Gets an array of coordinates which define the polyline of the intepolator's curve contour.
    -471              * Values for both coordinates range from 0 to 1.
    -472              * @param iSize {number} an integer indicating the number of contour segments.
    -473              * @return Array.<CAAT.Math.Point> of object of the form {x:float, y:float}.
    -474              */
    -475             getContour:function (iSize) {
    -476                 var contour = [];
    -477                 for (var i = 0; i <= iSize; i++) {
    -478                     contour.push({x:i / iSize, y:this.getPosition(i / iSize).y});
    -479                 }
    -480 
    -481                 return contour;
    -482             }
    -483         }
    -484     }
    -485 });
    -486 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_PathBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_PathBehavior.js.html deleted file mode 100644 index 8439fe23..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_PathBehavior.js.html +++ /dev/null @@ -1,352 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name PathBehavior
    -  5      * @memberOf CAAT.Behavior
    -  6      * @extends CAAT.Behavior.BaseBehavior
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     /**
    - 11      *
    - 12      * Internal PathBehavior rotation constants.
    - 13      *
    - 14      * @name AUTOROTATE
    - 15      * @memberOf CAAT.Behavior.PathBehavior
    - 16      * @namespace
    - 17      * @enum {number}
    - 18      */
    - 19 
    - 20     /**
    - 21      *
    - 22      * Internal PathBehavior rotation constants.
    - 23      *
    - 24      * @name autorotate
    - 25      * @memberOf CAAT.Behavior.PathBehavior
    - 26      * @namespace
    - 27      * @enum {number}
    - 28      * @deprecated
    - 29      */
    - 30 
    - 31     defines:"CAAT.Behavior.PathBehavior",
    - 32     aliases: ["CAAT.PathBehavior"],
    - 33     depends:[
    - 34         "CAAT.Behavior.BaseBehavior",
    - 35         "CAAT.Foundation.SpriteImage"
    - 36     ],
    - 37     constants : {
    - 38 
    - 39         AUTOROTATE : {
    - 40 
    - 41             /**
    - 42              * @lends CAAT.Behavior.PathBehavior.AUTOROTATE
    - 43              */
    - 44 
    - 45             /** @const */ LEFT_TO_RIGHT:  0,
    - 46             /** @const */ RIGHT_TO_LEFT:  1,
    - 47             /** @const */ FREE:           2
    - 48         },
    - 49 
    - 50         autorotate: {
    - 51             /**
    - 52              * @lends CAAT.Behavior.PathBehavior.autorotate
    - 53              */
    - 54 
    - 55             /** @const */ LEFT_TO_RIGHT:  0,
    - 56             /** @const */ RIGHT_TO_LEFT:  1,
    - 57             /** @const */ FREE:           2
    - 58         }
    - 59     },
    - 60     extendsClass : "CAAT.Behavior.BaseBehavior",
    - 61     extendsWith:function () {
    - 62 
    - 63         return {
    - 64 
    - 65             /**
    - 66              * @lends CAAT.Behavior.PathBehavior.prototype
    - 67              * @param obj
    - 68              */
    - 69 
    - 70             /**
    - 71              * @inheritDoc
    - 72              */
    - 73             parse : function( obj ) {
    - 74                 CAAT.Behavior.PathBehavior.superclass.parse.call(this,obj);
    - 75 
    - 76                 if ( obj.SVG ) {
    - 77                     var parser= new CAAT.PathUtil.SVGPath();
    - 78                     var path=parser.parsePath( obj.SVG );
    - 79                     this.setValues(path);
    - 80                 }
    - 81 
    - 82                 if ( obj.autoRotate ) {
    - 83                     this.autoRotate= obj.autoRotate;
    - 84                 }
    - 85             },
    - 86 
    - 87             /**
    - 88              * A path to traverse.
    - 89              * @type {CAAT.PathUtil.Path}
    - 90              * @private
    - 91              */
    - 92             path:null,
    - 93 
    - 94             /**
    - 95              * Whether to set rotation angle while traversing the path.
    - 96              * @private
    - 97              */
    - 98             autoRotate:false,
    - 99 
    -100             prevX:-1, // private, do not use.
    -101             prevY:-1, // private, do not use.
    -102 
    -103             /**
    -104              * Autorotation hint.
    -105              * @type {CAAT.Behavior.PathBehavior.autorotate}
    -106              * @private
    -107              */
    -108             autoRotateOp: CAAT.Behavior.PathBehavior.autorotate.FREE,
    -109 
    -110             isOpenContour : false,
    -111 
    -112             relativeX : 0,
    -113             relativeY : 0,
    -114 
    -115             setOpenContour : function(b) {
    -116                 this.isOpenContour= b;
    -117                 return this;
    -118             },
    -119 
    -120             /**
    -121              * @inheritDoc
    -122              */
    -123             getPropertyName:function () {
    -124                 return "translate";
    -125             },
    -126 
    -127             setRelativeValues : function( x, y ) {
    -128                 this.relativeX= x;
    -129                 this.relativeY= y;
    -130                 this.isRelative= true;
    -131                 return this;
    -132             },
    -133 
    -134 
    -135             /**
    -136              * Sets an actor rotation to be heading from past to current path's point.
    -137              * Take into account that this will be incompatible with rotation Behaviors
    -138              * since they will set their own rotation configuration.
    -139              * @param autorotate {boolean}
    -140              * @param autorotateOp {CAAT.PathBehavior.autorotate} whether the sprite is drawn heading to the right.
    -141              * @return this.
    -142              */
    -143             setAutoRotate:function (autorotate, autorotateOp) {
    -144                 this.autoRotate = autorotate;
    -145                 if (autorotateOp !== undefined) {
    -146                     this.autoRotateOp = autorotateOp;
    -147                 }
    -148                 return this;
    -149             },
    -150 
    -151             /**
    -152              * Set the behavior path.
    -153              * The path can be any length, and will take behaviorDuration time to be traversed.
    -154              * @param {CAAT.Path}
    -155                 *
    -156              * @deprecated
    -157              */
    -158             setPath:function (path) {
    -159                 this.path = path;
    -160                 return this;
    -161             },
    -162 
    -163             /**
    -164              * Set the behavior path.
    -165              * The path can be any length, and will take behaviorDuration time to be traversed.
    -166              * @param {CAAT.Path}
    -167                 * @return this
    -168              */
    -169             setValues:function (path) {
    -170                 return this.setPath(path);
    -171             },
    -172 
    -173             /**
    -174              * @see Actor.setPositionAnchor
    -175              * @deprecated
    -176              * @param tx a float with xoffset.
    -177              * @param ty a float with yoffset.
    -178              */
    -179             setTranslation:function (tx, ty) {
    -180                 return this;
    -181             },
    -182 
    -183             /**
    -184              * @inheritDoc
    -185              */
    -186             calculateKeyFrameData:function (time) {
    -187                 time = this.interpolator.getPosition(time).y;
    -188                 var point = this.path.getPosition(time);
    -189                 return "translateX(" + point.x + "px) translateY(" + point.y + "px)";
    -190             },
    -191 
    -192             /**
    -193              * @inheritDoc
    -194              */
    -195             getKeyFrameDataValues : function(time) {
    -196                 time = this.interpolator.getPosition(time).y;
    -197                 var point = this.path.getPosition(time);
    -198                 var obj= {
    -199                     x : point.x,
    -200                     y : point.y
    -201                 };
    -202 
    -203                 if ( this.autoRotate ) {
    -204 
    -205                     var point2= time===0 ? point : this.path.getPosition(time -.001);
    -206                     var ax = point.x - point2.x;
    -207                     var ay = point.y - point2.y;
    -208                     var angle = Math.atan2(ay, ax);
    -209 
    -210                     obj.angle= angle;
    -211                 }
    -212 
    -213                 return obj;
    -214             },
    -215 
    -216             /**
    -217              * @inheritDoc
    -218              */
    -219             calculateKeyFramesData:function (prefix, name, keyframessize) {
    -220 
    -221                 if (typeof keyframessize === 'undefined') {
    -222                     keyframessize = 100;
    -223                 }
    -224                 keyframessize >>= 0;
    -225 
    -226                 var i;
    -227                 var kfr;
    -228                 var time;
    -229                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    -230 
    -231                 for (i = 0; i <= keyframessize; i++) {
    -232                     kfr = "" +
    -233                         (i / keyframessize * 100) + "%" + // percentage
    -234                         "{" +
    -235                         "-" + prefix + "-transform:" + this.calculateKeyFrameData(i / keyframessize) +
    -236                         "}";
    -237 
    -238                     kfd += kfr;
    -239                 }
    -240 
    -241                 kfd += "}";
    -242 
    -243                 return kfd;
    -244             },
    -245 
    -246             /**
    -247              * @inheritDoc
    -248              */
    -249             setForTime:function (time, actor) {
    -250 
    -251                 if (!this.path) {
    -252                     return {
    -253                         x:actor.x,
    -254                         y:actor.y
    -255                     };
    -256                 }
    -257 
    -258                 var point = this.path.getPosition(time, this.isOpenContour,.001);
    -259                 if (this.isRelative ) {
    -260                     point.x+= this.relativeX;
    -261                     point.y+= this.relativeY;
    -262                 }
    -263 
    -264                 if (this.autoRotate) {
    -265 
    -266                     if (-1 === this.prevX && -1 === this.prevY) {
    -267                         this.prevX = point.x;
    -268                         this.prevY = point.y;
    -269                     }
    -270 
    -271                     var ax = point.x - this.prevX;
    -272                     var ay = point.y - this.prevY;
    -273 
    -274                     if (ax === 0 && ay === 0) {
    -275                         actor.setLocation(point.x, point.y);
    -276                         return { x:actor.x, y:actor.y };
    -277                     }
    -278 
    -279                     var angle = Math.atan2(ay, ax);
    -280                     var si = CAAT.Foundation.SpriteImage;
    -281                     var pba = CAAT.Behavior.PathBehavior.AUTOROTATE;
    -282 
    -283                     // actor is heading left to right
    -284                     if (this.autoRotateOp === pba.LEFT_TO_RIGHT) {
    -285                         if (this.prevX <= point.x) {
    -286                             actor.setImageTransformation(si.TR_NONE);
    -287                         }
    -288                         else {
    -289                             actor.setImageTransformation(si.TR_FLIP_HORIZONTAL);
    -290                             angle += Math.PI;
    -291                         }
    -292                     } else if (this.autoRotateOp === pba.RIGHT_TO_LEFT) {
    -293                         if (this.prevX <= point.x) {
    -294                             actor.setImageTransformation(si.TR_FLIP_HORIZONTAL);
    -295                         }
    -296                         else {
    -297                             actor.setImageTransformation(si.TR_NONE);
    -298                             angle -= Math.PI;
    -299                         }
    -300                     }
    -301 
    -302                     actor.setRotation(angle);
    -303 
    -304                     this.prevX = point.x;
    -305                     this.prevY = point.y;
    -306 
    -307                     var modulo = Math.sqrt(ax * ax + ay * ay);
    -308                     ax /= modulo;
    -309                     ay /= modulo;
    -310                 }
    -311 
    -312                 if (this.doValueApplication) {
    -313                     actor.setLocation(point.x, point.y);
    -314                     return { x:actor.x, y:actor.y };
    -315                 } else {
    -316                     return {
    -317                         x:point.x,
    -318                         y:point.y
    -319                     };
    -320                 }
    -321 
    -322 
    -323             },
    -324 
    -325             /**
    -326              * Get a point on the path.
    -327              * If the time to get the point at is in behaviors frame time, a point on the path will be returned, otherwise
    -328              * a default {x:-1, y:-1} point will be returned.
    -329              *
    -330              * @param time {number} the time at which the point will be taken from the path.
    -331              * @return {object} an object of the form {x:float y:float}
    -332              */
    -333             positionOnTime:function (time) {
    -334                 if (this.isBehaviorInTime(time, null)) {
    -335                     time = this.normalizeTime(time);
    -336                     return this.path.getPosition(time);
    -337                 }
    -338 
    -339                 return {x:-1, y:-1};
    -340 
    -341             }
    -342         };
    -343     }
    -344 });
    -345 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_RotateBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_RotateBehavior.js.html deleted file mode 100644 index ebce7154..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_RotateBehavior.js.html +++ /dev/null @@ -1,220 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name RotateBehavior
    -  5      * @memberOf CAAT.Behavior
    -  6      * @extends CAAT.Behavior.BaseBehavior
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines:"CAAT.Behavior.RotateBehavior",
    - 11     extendsClass: "CAAT.Behavior.BaseBehavior",
    - 12     depends:[
    - 13         "CAAT.Behavior.BaseBehavior",
    - 14         "CAAT.Foundation.Actor"
    - 15     ],
    - 16     aliases: ["CAAT.RotateBehavior"],
    - 17     extendsWith:function () {
    - 18 
    - 19         return {
    - 20 
    - 21             /**
    - 22              * @lends CAAT.Behavior.RotateBehavior.prototype
    - 23              */
    - 24 
    - 25 
    - 26             __init:function () {
    - 27                 this.__super();
    - 28                 this.anchor = CAAT.Foundation.Actor.ANCHOR_CENTER;
    - 29                 return this;
    - 30             },
    - 31 
    - 32             /**
    - 33              * @inheritDoc
    - 34              */
    - 35             parse : function( obj ) {
    - 36                 CAAT.Behavior.RotateBehavior.superclass.parse.call(this,obj);
    - 37                 this.startAngle= obj.start || 0;
    - 38                 this.endAngle= obj.end || 0;
    - 39                 this.anchorX= (typeof obj.anchorX!=="undefined" ? parseInt(obj.anchorX) : 0.5);
    - 40                 this.anchorY= (typeof obj.anchorY!=="undefined" ? parseInt(obj.anchorY) : 0.5);
    - 41             },
    - 42 
    - 43             /**
    - 44              * Start rotation angle.
    - 45              * @type {number}
    - 46              * @private
    - 47              */
    - 48             startAngle:0,
    - 49 
    - 50             /**
    - 51              * End rotation angle.
    - 52              * @type {number}
    - 53              * @private
    - 54              */
    - 55             endAngle:0,
    - 56 
    - 57             /**
    - 58              * Rotation X anchor.
    - 59              * @type {number}
    - 60              * @private
    - 61              */
    - 62             anchorX:.50,
    - 63 
    - 64             /**
    - 65              * Rotation Y anchor.
    - 66              * @type {number}
    - 67              * @private
    - 68              */
    - 69             anchorY:.50,
    - 70 
    - 71             rotationRelative: 0,
    - 72 
    - 73             setRelativeValues : function(r) {
    - 74                 this.rotationRelative= r;
    - 75                 this.isRelative= true;
    - 76                 return this;
    - 77             },
    - 78 
    - 79             /**
    - 80              * @inheritDoc
    - 81              */
    - 82             getPropertyName:function () {
    - 83                 return "rotate";
    - 84             },
    - 85 
    - 86             /**
    - 87              * @inheritDoc
    - 88              */
    - 89             setForTime:function (time, actor) {
    - 90                 var angle = this.startAngle + time * (this.endAngle - this.startAngle);
    - 91 
    - 92                 if ( this.isRelative ) {
    - 93                     angle+= this.rotationRelative;
    - 94                     if (angle>=Math.PI) {
    - 95                         angle= (angle-2*Math.PI)
    - 96                     }
    - 97                     if ( angle<-2*Math.PI) {
    - 98                         angle= (angle+2*Math.PI);
    - 99                     }
    -100                 }
    -101 
    -102                 if (this.doValueApplication) {
    -103                     actor.setRotationAnchored(angle, this.anchorX, this.anchorY);
    -104                 }
    -105 
    -106                 return angle;
    -107 
    -108             },
    -109 
    -110             /**
    -111              * Set behavior bound values.
    -112              * if no anchorx,anchory values are supplied, the behavior will assume
    -113              * 50% for both values, that is, the actor's center.
    -114              *
    -115              * Be aware the anchor values are supplied in <b>RELATIVE PERCENT</b> to
    -116              * actor's size.
    -117              *
    -118              * @param startAngle {float} indicating the starting angle.
    -119              * @param endAngle {float} indicating the ending angle.
    -120              * @param anchorx {float} the percent position for anchorX
    -121              * @param anchory {float} the percent position for anchorY
    -122              */
    -123             setValues:function (startAngle, endAngle, anchorx, anchory) {
    -124                 this.startAngle = startAngle;
    -125                 this.endAngle = endAngle;
    -126                 if (typeof anchorx !== 'undefined' && typeof anchory !== 'undefined') {
    -127                     this.anchorX = anchorx;
    -128                     this.anchorY = anchory;
    -129                 }
    -130                 return this;
    -131             },
    -132 
    -133             /**
    -134              * @deprecated
    -135              * Use setValues instead
    -136              * @param start
    -137              * @param end
    -138              */
    -139             setAngles:function (start, end) {
    -140                 return this.setValues(start, end);
    -141             },
    -142 
    -143             /**
    -144              * Set the behavior rotation anchor. Use this method when setting an exact percent
    -145              * by calling setValues is complicated.
    -146              * @see CAAT.Actor
    -147              *
    -148              * These parameters are to set a custom rotation anchor point. if <code>anchor==CAAT.Actor.ANCHOR_CUSTOM
    -149              * </code> the custom rotation point is set.
    -150              * @param actor
    -151              * @param rx
    -152              * @param ry
    -153              *
    -154              */
    -155             setAnchor:function (actor, rx, ry) {
    -156                 this.anchorX = rx / actor.width;
    -157                 this.anchorY = ry / actor.height;
    -158                 return this;
    -159             },
    -160 
    -161             /**
    -162              * @inheritDoc
    -163              */
    -164             calculateKeyFrameData:function (time) {
    -165                 time = this.interpolator.getPosition(time).y;
    -166                 return "rotate(" + (this.startAngle + time * (this.endAngle - this.startAngle)) + "rad)";
    -167             },
    -168 
    -169             /**
    -170              * @inheritDoc
    -171              */
    -172             getKeyFrameDataValues : function(time) {
    -173                 time = this.interpolator.getPosition(time).y;
    -174                 return {
    -175                     angle : this.startAngle + time * (this.endAngle - this.startAngle)
    -176                 };
    -177             },
    -178 
    -179             /**
    -180              * @inheritDoc
    -181              */
    -182             calculateKeyFramesData:function (prefix, name, keyframessize) {
    -183 
    -184                 if (typeof keyframessize === 'undefined') {
    -185                     keyframessize = 100;
    -186                 }
    -187                 keyframessize >>= 0;
    -188 
    -189                 var i;
    -190                 var kfr;
    -191                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    -192 
    -193                 for (i = 0; i <= keyframessize; i++) {
    -194                     kfr = "" +
    -195                         (i / keyframessize * 100) + "%" + // percentage
    -196                         "{" +
    -197                         "-" + prefix + "-transform:" + this.calculateKeyFrameData(i / keyframessize) +
    -198                         "; -" + prefix + "-transform-origin:" + (this.anchorX*100) + "% " + (this.anchorY*100) + "% " +
    -199                         "}\n";
    -200 
    -201                     kfd += kfr;
    -202                 }
    -203 
    -204                 kfd += "}\n";
    -205 
    -206                 return kfd;
    -207             }
    -208 
    -209         };
    -210 
    -211     }
    -212 });
    -213 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Scale1Behavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Scale1Behavior.js.html deleted file mode 100644 index 5b511a71..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Scale1Behavior.js.html +++ /dev/null @@ -1,248 +0,0 @@ -
      1 CAAT.Module({
    -  2     /**
    -  3      * @name Scale1Behavior
    -  4      * @memberOf CAAT.Behavior
    -  5      * @extends CAAT.Behavior.BaseBehavior
    -  6      * @constructor
    -  7      */
    -  8 
    -  9     /**
    - 10      * @name AXIS
    - 11      * @memberOf CAAT.Behavior.Scale1Behavior
    - 12      * @enum {number}
    - 13      * @namespace
    - 14      */
    - 15 
    - 16     /**
    - 17      * @name Axis
    - 18      * @memberOf CAAT.Behavior.Scale1Behavior
    - 19      * @enum {number}
    - 20      * @namespace
    - 21      * @deprecated
    - 22      */
    - 23 
    - 24 
    - 25     defines:"CAAT.Behavior.Scale1Behavior",
    - 26     depends:[
    - 27         "CAAT.Behavior.BaseBehavior",
    - 28         "CAAT.Foundation.Actor"
    - 29     ],
    - 30     aliases: ["CAAT.Scale1Behavior"],
    - 31     constants : {
    - 32 
    - 33         AXIS : {
    - 34             /**
    - 35              * @lends CAAT.Behavior.Scale1Behavior.AXIS
    - 36              */
    - 37 
    - 38             /** @const */ X:  0,
    - 39             /** @const */ Y:  1
    - 40         },
    - 41 
    - 42         Axis : {
    - 43             /**
    - 44              * @lends CAAT.Behavior.Scale1Behavior.Axis
    - 45              */
    - 46 
    - 47             /** @const */ X:  0,
    - 48             /** @const */ Y:  1
    - 49         }
    - 50     },
    - 51     extendsClass:"CAAT.Behavior.BaseBehavior",
    - 52     extendsWith:function () {
    - 53 
    - 54         return {
    - 55 
    - 56             /**
    - 57              * @lends CAAT.Behavior.Scale1Behavior.prototype
    - 58              */
    - 59 
    - 60             __init:function () {
    - 61                 this.__super();
    - 62                 this.anchor = CAAT.Foundation.Actor.ANCHOR_CENTER;
    - 63                 return this;
    - 64             },
    - 65 
    - 66             /**
    - 67              * Start scale value.
    - 68              * @private
    - 69              */
    - 70             startScale:1,
    - 71 
    - 72             /**
    - 73              * End scale value.
    - 74              * @private
    - 75              */
    - 76             endScale:1,
    - 77 
    - 78             /**
    - 79              * Scale X anchor.
    - 80              * @private
    - 81              */
    - 82             anchorX:.50,
    - 83 
    - 84             /**
    - 85              * Scale Y anchor.
    - 86              * @private
    - 87              */
    - 88             anchorY:.50,
    - 89 
    - 90             /**
    - 91              * Apply on Axis X or Y ?
    - 92              */
    - 93             applyOnX:true,
    - 94 
    - 95             parse : function( obj ) {
    - 96                 CAAT.Behavior.Scale1Behavior.superclass.parse.call(this,obj);
    - 97                 this.startScale= obj.start || 0;
    - 98                 this.endScale= obj.end || 0;
    - 99                 this.anchorX= (typeof obj.anchorX!=="undefined" ? parseInt(obj.anchorX) : 0.5);
    -100                 this.anchorY= (typeof obj.anchorY!=="undefined" ? parseInt(obj.anchorY) : 0.5);
    -101                 this.applyOnX= obj.axis ? obj.axis.toLowerCase()==="x" : true;
    -102             },
    -103 
    -104             /**
    -105              * @param axis {CAAT.Behavior.Scale1Behavior.AXIS}
    -106              */
    -107             applyOnAxis:function (axis) {
    -108                 if (axis === CAAT.Behavior.Scale1Behavior.AXIS.X) {
    -109                     this.applyOnX = false;
    -110                 } else {
    -111                     this.applyOnX = true;
    -112                 }
    -113             },
    -114 
    -115             /**
    -116              * @inheritDoc
    -117              */
    -118             getPropertyName:function () {
    -119                 return "scale";
    -120             },
    -121 
    -122             /**
    -123              * @inheritDoc
    -124              */
    -125             setForTime:function (time, actor) {
    -126 
    -127                 var scale = this.startScale + time * (this.endScale - this.startScale);
    -128 
    -129                 // Firefox 3.x & 4, will crash animation if either scaleX or scaleY equals 0.
    -130                 if (0 === scale) {
    -131                     scale = 0.01;
    -132                 }
    -133 
    -134                 if (this.doValueApplication) {
    -135                     if (this.applyOnX) {
    -136                         actor.setScaleAnchored(scale, actor.scaleY, this.anchorX, this.anchorY);
    -137                     } else {
    -138                         actor.setScaleAnchored(actor.scaleX, scale, this.anchorX, this.anchorY);
    -139                     }
    -140                 }
    -141 
    -142                 return scale;
    -143             },
    -144 
    -145             /**
    -146              * Define this scale behaviors values.
    -147              *
    -148              * Be aware the anchor values are supplied in <b>RELATIVE PERCENT</b> to
    -149              * actor's size.
    -150              *
    -151              * @param start {number} initial X axis scale value.
    -152              * @param end {number} final X axis scale value.
    -153              * @param anchorx {float} the percent position for anchorX
    -154              * @param anchory {float} the percent position for anchorY
    -155              *
    -156              * @return this.
    -157              */
    -158             setValues:function (start, end, applyOnX, anchorx, anchory) {
    -159                 this.startScale = start;
    -160                 this.endScale = end;
    -161                 this.applyOnX = !!applyOnX;
    -162 
    -163                 if (typeof anchorx !== 'undefined' && typeof anchory !== 'undefined') {
    -164                     this.anchorX = anchorx;
    -165                     this.anchorY = anchory;
    -166                 }
    -167 
    -168                 return this;
    -169             },
    -170 
    -171             /**
    -172              * Set an exact position scale anchor. Use this method when it is hard to
    -173              * set a thorough anchor position expressed in percentage.
    -174              * @param actor
    -175              * @param x
    -176              * @param y
    -177              */
    -178             setAnchor:function (actor, x, y) {
    -179                 this.anchorX = x / actor.width;
    -180                 this.anchorY = y / actor.height;
    -181 
    -182                 return this;
    -183             },
    -184 
    -185             /**
    -186              * @inheritDoc
    -187              */
    -188             calculateKeyFrameData:function (time) {
    -189                 var scale;
    -190 
    -191                 time = this.interpolator.getPosition(time).y;
    -192                 scale = this.startScale + time * (this.endScale - this.startScale);
    -193 
    -194                 return this.applyOnX ? "scaleX(" + scale + ")" : "scaleY(" + scale + ")";
    -195             },
    -196 
    -197             /**
    -198              * @inheritDoc
    -199              */
    -200             getKeyFrameDataValues : function(time) {
    -201                 time = this.interpolator.getPosition(time).y;
    -202                 var obj= {};
    -203                 obj[ this.applyOnX ? "scaleX" : "scaleY" ]= this.startScale + time * (this.endScale - this.startScale);
    -204 
    -205                 return obj;
    -206             },
    -207 
    -208             /**
    -209              * @inheritDoc
    -210              */
    -211             calculateKeyFramesData:function (prefix, name, keyframessize) {
    -212 
    -213                 if (typeof keyframessize === 'undefined') {
    -214                     keyframessize = 100;
    -215                 }
    -216                 keyframessize >>= 0;
    -217 
    -218                 var i;
    -219                 var kfr;
    -220                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    -221 
    -222                 for (i = 0; i <= keyframessize; i++) {
    -223                     kfr = "" +
    -224                         (i / keyframessize * 100) + "%" + // percentage
    -225                         "{" +
    -226                         "-" + prefix + "-transform:" + this.calculateKeyFrameData(i / keyframessize) +
    -227                         "; -" + prefix + "-transform-origin:" + (this.anchorX*100) + "% " + (this.anchorY*100) + "% " +
    -228                         "}\n";
    -229 
    -230                     kfd += kfr;
    -231                 }
    -232 
    -233                 kfd += "}\n";
    -234 
    -235                 return kfd;
    -236             }
    -237         }
    -238 
    -239     }
    -240 });
    -241 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ScaleBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ScaleBehavior.js.html deleted file mode 100644 index e5ea8b22..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ScaleBehavior.js.html +++ /dev/null @@ -1,227 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name ScaleBehavior
    -  5      * @memberOf CAAT.Behavior
    -  6      * @extends CAAT.Behavior.BaseBehavior
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines:"CAAT.Behavior.ScaleBehavior",
    - 11     depends:[
    - 12         "CAAT.Behavior.BaseBehavior",
    - 13         "CAAT.Foundation.Actor"
    - 14     ],
    - 15     extendsClass:"CAAT.Behavior.BaseBehavior",
    - 16     aliases : ["CAAT.ScaleBehavior"],
    - 17     extendsWith:function () {
    - 18 
    - 19         return  {
    - 20 
    - 21             /**
    - 22              * @lends CAAT.Behavior.ScaleBehavior
    - 23              */
    - 24 
    - 25             __init:function () {
    - 26                 this.__super();
    - 27                 this.anchor = CAAT.Foundation.Actor.ANCHOR_CENTER;
    - 28                 return this;
    - 29             },
    - 30 
    - 31             /**
    - 32              * Start X scale value.
    - 33              * @private
    - 34              * @type {number}
    - 35              */
    - 36             startScaleX:1,
    - 37 
    - 38             /**
    - 39              * End X scale value.
    - 40              * @private
    - 41              * @type {number}
    - 42              */
    - 43             endScaleX:1,
    - 44 
    - 45             /**
    - 46              * Start Y scale value.
    - 47              * @private
    - 48              * @type {number}
    - 49              */
    - 50             startScaleY:1,
    - 51 
    - 52             /**
    - 53              * End Y scale value.
    - 54              * @private
    - 55              * @type {number}
    - 56              */
    - 57             endScaleY:1,
    - 58 
    - 59             /**
    - 60              * Scale X anchor value.
    - 61              * @private
    - 62              * @type {number}
    - 63              */
    - 64             anchorX:.50,
    - 65 
    - 66             /**
    - 67              * Scale Y anchor value.
    - 68              * @private
    - 69              * @type {number}
    - 70              */
    - 71             anchorY:.50,
    - 72 
    - 73             /**
    - 74              * @inheritDoc
    - 75              */
    - 76             parse : function( obj ) {
    - 77                 CAAT.Behavior.ScaleBehavior.superclass.parse.call(this,obj);
    - 78                 this.startScaleX= (obj.scaleX && obj.scaleX.start) || 0;
    - 79                 this.endScaleX= (obj.scaleX && obj.scaleX.end) || 0;
    - 80                 this.startScaleY= (obj.scaleY && obj.scaleY.start) || 0;
    - 81                 this.endScaleY= (obj.scaleY && obj.scaleY.end) || 0;
    - 82                 this.anchorX= (typeof obj.anchorX!=="undefined" ? parseInt(obj.anchorX) : 0.5);
    - 83                 this.anchorY= (typeof obj.anchorY!=="undefined" ? parseInt(obj.anchorY) : 0.5);
    - 84             },
    - 85 
    - 86             /**
    - 87              * @inheritDoc
    - 88              */
    - 89             getPropertyName:function () {
    - 90                 return "scale";
    - 91             },
    - 92 
    - 93             /**
    - 94              * Applies corresponding scale values for a given time.
    - 95              *
    - 96              * @param time the time to apply the scale for.
    - 97              * @param actor the target actor to Scale.
    - 98              * @return {object} an object of the form <code>{ scaleX: {float}, scaleY: {float}�}</code>
    - 99              */
    -100             setForTime:function (time, actor) {
    -101 
    -102                 var scaleX = this.startScaleX + time * (this.endScaleX - this.startScaleX);
    -103                 var scaleY = this.startScaleY + time * (this.endScaleY - this.startScaleY);
    -104 
    -105                 // Firefox 3.x & 4, will crash animation if either scaleX or scaleY equals 0.
    -106                 if (0 === scaleX) {
    -107                     scaleX = 0.01;
    -108                 }
    -109                 if (0 === scaleY) {
    -110                     scaleY = 0.01;
    -111                 }
    -112 
    -113                 if (this.doValueApplication) {
    -114                     actor.setScaleAnchored(scaleX, scaleY, this.anchorX, this.anchorY);
    -115                 }
    -116 
    -117                 return { scaleX:scaleX, scaleY:scaleY };
    -118             },
    -119             /**
    -120              * Define this scale behaviors values.
    -121              *
    -122              * Be aware the anchor values are supplied in <b>RELATIVE PERCENT</b> to
    -123              * actor's size.
    -124              *
    -125              * @param startX {number} initial X axis scale value.
    -126              * @param endX {number} final X axis scale value.
    -127              * @param startY {number} initial Y axis scale value.
    -128              * @param endY {number} final Y axis scale value.
    -129              * @param anchorx {float} the percent position for anchorX
    -130              * @param anchory {float} the percent position for anchorY
    -131              *
    -132              * @return this.
    -133              */
    -134             setValues:function (startX, endX, startY, endY, anchorx, anchory) {
    -135                 this.startScaleX = startX;
    -136                 this.endScaleX = endX;
    -137                 this.startScaleY = startY;
    -138                 this.endScaleY = endY;
    -139 
    -140                 if (typeof anchorx !== 'undefined' && typeof anchory !== 'undefined') {
    -141                     this.anchorX = anchorx;
    -142                     this.anchorY = anchory;
    -143                 }
    -144 
    -145                 return this;
    -146             },
    -147             /**
    -148              * Set an exact position scale anchor. Use this method when it is hard to
    -149              * set a thorough anchor position expressed in percentage.
    -150              * @param actor
    -151              * @param x
    -152              * @param y
    -153              */
    -154             setAnchor:function (actor, x, y) {
    -155                 this.anchorX = x / actor.width;
    -156                 this.anchorY = y / actor.height;
    -157 
    -158                 return this;
    -159             },
    -160 
    -161             /**
    -162              * @inheritDoc
    -163              */
    -164             calculateKeyFrameData:function (time) {
    -165                 var scaleX;
    -166                 var scaleY;
    -167 
    -168                 time = this.interpolator.getPosition(time).y;
    -169                 scaleX = this.startScaleX + time * (this.endScaleX - this.startScaleX);
    -170                 scaleY = this.startScaleY + time * (this.endScaleY - this.startScaleY);
    -171 
    -172                 return "scale(" + scaleX +"," + scaleY + ")";
    -173             },
    -174 
    -175             /**
    -176              * @inheritDoc
    -177              */
    -178             getKeyFrameDataValues : function(time) {
    -179                 time = this.interpolator.getPosition(time).y;
    -180                 return {
    -181                     scaleX : this.startScaleX + time * (this.endScaleX - this.startScaleX),
    -182                     scaleY : this.startScaleY + time * (this.endScaleY - this.startScaleY)
    -183                 };
    -184             },
    -185 
    -186 
    -187             /**
    -188              * @inheritDoc
    -189              */
    -190             calculateKeyFramesData:function (prefix, name, keyframessize) {
    -191 
    -192                 if (typeof keyframessize === 'undefined') {
    -193                     keyframessize = 100;
    -194                 }
    -195                 keyframessize >>= 0;
    -196 
    -197                 var i;
    -198                 var kfr;
    -199                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    -200 
    -201                 for (i = 0; i <= keyframessize; i++) {
    -202                     kfr = "" +
    -203                         (i / keyframessize * 100) + "%" + // percentage
    -204                         "{" +
    -205                         "-" + prefix + "-transform:" + this.calculateKeyFrameData(i / keyframessize) +
    -206                         "; -" + prefix + "-transform-origin:" + (this.anchorX*100) + "% " + (this.anchorY*100) + "% " +
    -207                         "}\n";
    -208 
    -209                     kfd += kfr;
    -210                 }
    -211 
    -212                 kfd += "}\n";
    -213 
    -214                 return kfd;
    -215             }
    -216         }
    -217 
    -218     }
    -219 });
    -220 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_CAAT.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_CAAT.js.html deleted file mode 100644 index b3187fa9..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_CAAT.js.html +++ /dev/null @@ -1,20 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * Library namespace.
    -  5  * CAAT stands for: Canvas Advanced Animation Tookit.
    -  6  */
    -  7 
    -  8 
    -  9     /**
    - 10      * @namespace
    - 11      */
    - 12 var CAAT= CAAT || {};
    - 13 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_Constants.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_Constants.js.html deleted file mode 100644 index 160df33d..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_Constants.js.html +++ /dev/null @@ -1,127 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  **/
    -  5 
    -  6 CAAT.Module( {
    -  7 
    -  8     defines: "CAAT.Core.Constants",
    -  9     depends : [
    - 10         "CAAT.Math.Matrix"
    - 11     ],
    - 12 
    - 13     extendsWith: function() {
    - 14 
    - 15         /**
    - 16          * @lends CAAT
    - 17          */
    - 18 
    - 19         /**
    - 20          * // do not clamp coordinates. speeds things up in older browsers.
    - 21          * @type {Boolean}
    - 22          * @private
    - 23          */
    - 24         CAAT.CLAMP= false;
    - 25 
    - 26         /**
    - 27          * This function makes the system obey decimal point calculations for actor's position, size, etc.
    - 28          * This may speed things up in some browsers, but at the cost of affecting visuals (like in rotating
    - 29          * objects).
    - 30          *
    - 31          * Latest Chrome (20+) is not affected by this.
    - 32          *
    - 33          * Default CAAT.Matrix try to speed things up.
    - 34          *
    - 35          * @param clamp {boolean}
    - 36          */
    - 37         CAAT.setCoordinateClamping= function( clamp ) {
    - 38             CAAT.CLAMP= clamp;
    - 39             CAAT.Math.Matrix.setCoordinateClamping(clamp);
    - 40         };
    - 41 
    - 42         /**
    - 43          * Log function which deals with window's Console object.
    - 44          */
    - 45         CAAT.log= function() {
    - 46             if(window.console){
    - 47                 window.console.log( Array.prototype.slice.call(arguments) );
    - 48             }
    - 49         };
    - 50 
    - 51         /**
    - 52          * Control how CAAT.Font and CAAT.TextActor control font ascent/descent values.
    - 53          * 0 means it will guess values from a font height
    - 54          * 1 means it will try to use css to get accurate ascent/descent values and fall back to the previous method
    - 55          *   in case it couldn't.
    - 56          *
    - 57          * @type {Number}
    - 58          */
    - 59         CAAT.CSS_TEXT_METRICS=      0;
    - 60 
    - 61         /**
    - 62          * is GLRendering enabled.
    - 63          * @type {Boolean}
    - 64          */
    - 65         CAAT.GLRENDER= false;
    - 66 
    - 67         /**
    - 68          * set this variable before building CAAT.Director intances to enable debug panel.
    - 69          */
    - 70         CAAT.DEBUG= false;
    - 71 
    - 72         /**
    - 73          * show Bounding Boxes
    - 74          * @type {Boolean}
    - 75          */
    - 76         CAAT.DEBUGBB= false;
    - 77 
    - 78         /**
    - 79          * Bounding Boxes color.
    - 80          * @type {String}
    - 81          */
    - 82         CAAT.DEBUGBBBCOLOR = '#00f';
    - 83 
    - 84         /**
    - 85          * debug axis aligned bounding boxes.
    - 86          * @type {Boolean}
    - 87          */
    - 88         CAAT.DEBUGAABB = false;
    - 89 
    - 90         /**
    - 91          * Bounding boxes color.
    - 92          * @type {String}
    - 93          */
    - 94         CAAT.DEBUGAABBCOLOR = '#f00';
    - 95 
    - 96         /**
    - 97          * if CAAT.Director.setClear uses CLEAR_DIRTY_RECTS, this will show them on screen.
    - 98          * @type {Boolean}
    - 99          */
    -100         CAAT.DEBUG_DIRTYRECTS= false;
    -101 
    -102         /**
    -103          * Do not consider mouse drag gesture at least until you have dragged
    -104          * DRAG_THRESHOLD_X and DRAG_THRESHOLD_Y pixels.
    -105          * This is suitable for tablets, where just by touching, drag events are delivered.
    -106          */
    -107         CAAT.DRAG_THRESHOLD_X=      5;
    -108         CAAT.DRAG_THRESHOLD_Y=      5;
    -109 
    -110         /**
    -111          * When switching scenes, cache exiting scene or not. Set before building director instance.
    -112          * @type {Boolean}
    -113          */
    -114         CAAT.CACHE_SCENE_ON_CHANGE= true;
    -115 
    -116         return {
    -117         }
    -118     }
    -119 } );
    -120 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_ModuleManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_ModuleManager.js.html deleted file mode 100644 index d4da0959..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_ModuleManager.js.html +++ /dev/null @@ -1,907 +0,0 @@ -
      1 (function(global) {
    -  2 
    -  3     String.prototype.endsWith= function(suffix) {
    -  4         return this.indexOf(suffix, this.length - suffix.length) !== -1;
    -  5     };
    -  6 
    -  7     Function.prototype.bind = Function.prototype.bind || function () {
    -  8                 var fn = this;                                   // the function
    -  9                 var args = Array.prototype.slice.call(arguments);  // copy the arguments.
    - 10                 var obj = args.shift();                           // first parameter will be context 'this'
    - 11                 return function () {
    - 12                     return fn.apply(
    - 13                         obj,
    - 14                         args.concat(Array.prototype.slice.call(arguments)));
    - 15                 }
    - 16             };
    - 17 
    - 18     global.isArray = function (input) {
    - 19         return typeof(input) == 'object' && (input instanceof Array);
    - 20     };
    - 21     global.isString = function (input) {
    - 22         return typeof(input) == 'string';
    - 23     };
    - 24     global.isFunction = function( input ) {
    - 25         return typeof input == "function"
    - 26     }
    - 27 
    - 28     var initializing = false;
    - 29 
    - 30     // The base Class implementation (does nothing)
    - 31     var Class = function () {
    - 32     };
    - 33 
    - 34     // Create a new Class that inherits from this class
    - 35     Class.extend = function (extendingProt, constants, name, aliases, flags) {
    - 36 
    - 37         var _super = this.prototype;
    - 38 
    - 39         // Instantiate a base class (but only create the instance,
    - 40         // don't run the init constructor)
    - 41         initializing = true;
    - 42         var prototype = new this();
    - 43         initializing = false;
    - 44 
    - 45         // The dummy class constructor
    - 46         function CAATClass() {
    - 47             // All construction is actually done in the init method
    - 48             if (!initializing && this.__init) {
    - 49                 this.__init.apply(this, arguments);
    - 50             }
    - 51         }
    - 52 
    - 53         // Populate our constructed prototype object
    - 54         CAATClass.prototype = prototype;
    - 55         // Enforce the constructor to be what we expect
    - 56         CAATClass.prototype.constructor = CAATClass;
    - 57         CAATClass.superclass = _super;
    - 58         // And make this class extendable
    - 59         CAATClass.extend = Class.extend;
    - 60 
    - 61         assignNamespace( name, CAATClass );
    - 62         if ( constants ) {
    - 63             constants= (isFunction(constants) ? constants() : constants);
    - 64             for( var constant in constants ) {
    - 65                 if ( constants.hasOwnProperty(constant) ) {
    - 66                     CAATClass[ constant ]= constants[constant];
    - 67                 }
    - 68             }
    - 69         }
    - 70 
    - 71         CAATClass["__CLASS"]= name;
    - 72 
    - 73         if ( aliases ) {
    - 74             if ( !isArray(aliases) ) {
    - 75                 aliases= [aliases];
    - 76             }
    - 77             for( var i=0; i<aliases.length; i++ ) {
    - 78                 ensureNamespace( aliases[i] );
    - 79                 var ns= assignNamespace( aliases[i], CAATClass );
    - 80 
    - 81                 // assign constants to alias classes.
    - 82                 if ( constants ) {
    - 83                     for( var constant in constants ) {
    - 84                         if ( constants.hasOwnProperty(constant) ) {
    - 85                             ns[ constant ]= constants[constant];
    - 86                         }
    - 87                     }
    - 88                 }
    - 89             }
    - 90         }
    - 91 
    - 92         extendingProt= (isFunction(extendingProt) ? extendingProt() : extendingProt);
    - 93 
    - 94         // Copy the properties over onto the new prototype
    - 95         for (var fname in extendingProt) {
    - 96             // Check if we're overwriting an existing function
    - 97             prototype[fname] = ( (fname === "__init" || (flags && flags.decorated) ) && isFunction(extendingProt[fname]) && isFunction(_super[fname]) ) ?
    - 98                 (function (name, fn) {
    - 99                     return function () {
    -100                         var tmp = this.__super;
    -101                         this.__super = _super[name];
    -102                         var ret = fn.apply(this, arguments);
    -103                         this.__super = tmp;
    -104                         return ret;
    -105                     };
    -106                 })(fname, extendingProt[fname]) :
    -107 
    -108                 extendingProt[fname];
    -109         }
    -110 
    -111         return CAATClass;
    -112     }
    -113 
    -114     var Node= function( obj ) { //name, dependencies, callback ) {
    -115         this.name= obj.defines;
    -116         this.extendWith= obj.extendsWith;
    -117         this.callback= obj.onCreate;
    -118         this.callbackPreCreation= obj.onPreCreate;
    -119         this.dependencies= obj.depends;
    -120         this.baseClass= obj.extendsClass;
    -121         this.aliases= obj.aliases;
    -122         this.constants= obj.constants;
    -123         this.decorated= obj.decorated;
    -124 
    -125         this.children= [];
    -126 
    -127         return this;
    -128     };
    -129 
    -130     Node.prototype= {
    -131         children:       null,
    -132         name:           null,
    -133         extendWith:     null,
    -134         callback:       null,
    -135         dependencies:   null,
    -136         baseClass:      null,
    -137         aliases:        null,
    -138         constants:      null,
    -139 
    -140         decorated:      false,
    -141 
    -142         solved:         false,
    -143         visited:        false,
    -144 
    -145         status : function() {
    -146             console.log("  Module: "+this.name+
    -147                 (this.dependencies.length ?
    -148                     (" unsolved_deps:["+this.dependencies+"]") :
    -149                     " no dependencies.")+
    -150                 ( this.solved ? " solved" : " ------> NOT solved.")
    -151             );
    -152         },
    -153 
    -154         removeDependency : function( modulename ) {
    -155             for( var i=0; i<this.dependencies.length; i++ ) {
    -156                 if ( this.dependencies[i]===modulename ) {
    -157                     this.dependencies.splice(i,1);
    -158                     break;
    -159                 }
    -160             }
    -161 
    -162 
    -163         },
    -164 
    -165         assignDependency : function( node ) {
    -166 
    -167             var i;
    -168             for( i=0; i<this.dependencies.length; i++ ) {
    -169                 if ( this.dependencies[i] === node.name ) {
    -170                     this.children.push( node );
    -171                     this.dependencies.splice(i,1);
    -172 //                    console.log("Added dependency: "+node.name+" on "+this.name);
    -173                     break;
    -174                 }
    -175             }
    -176         },
    -177 
    -178         isSolved : function() {
    -179             return this.solved;
    -180         },
    -181 
    -182         solveDeep : function() {
    -183 
    -184             if ( this.visited ) {
    -185                 return true;
    -186             }
    -187 
    -188             this.visited= true;
    -189 
    -190             if ( this.solved ) {
    -191                 return true;
    -192             }
    -193 
    -194             if ( this.dependencies.length!==0 ) {
    -195                 return false;
    -196             }
    -197 
    -198             var b= true;
    -199             for( var i=0; i<this.children.length; i++ ) {
    -200                 if (! this.children[i].solveDeep() ) {
    -201                     return false;
    -202                 }
    -203             }
    -204 
    -205             //////
    -206             this.__initModule();
    -207 
    -208             this.solved= true;
    -209             mm.solved( this );
    -210 
    -211             return true;
    -212         },
    -213 
    -214         __initModule : function() {
    -215 
    -216             var c= null;
    -217             if ( this.baseClass ) {
    -218                 c= findClass( this.baseClass );
    -219 
    -220                 if ( !c ) {
    -221                     console.log("  "+this.name+" -> Can't extend non-existant class: "+this.baseClass );
    -222                     return;
    -223                 }
    -224 
    -225             } else {
    -226                 c= Class;
    -227             }
    -228 
    -229             c= c.extend( this.extendWith, this.constants, this.name, this.aliases, { decorated : this.decorated } );
    -230 
    -231             console.log("Created module: "+this.name);
    -232 
    -233             if ( this.callback ) {
    -234                 this.callback();
    -235             }
    -236 
    -237         }
    -238     };
    -239 
    -240     var ScriptFile= function(path, module) {
    -241         this.path= path;
    -242         this.module= module;
    -243         return this;
    -244     }
    -245 
    -246     ScriptFile.prototype= {
    -247         path : null,
    -248         processed: false,
    -249         module: null,
    -250 
    -251         setProcessed : function() {
    -252             this.processed= true;
    -253         },
    -254 
    -255         isProcessed : function() {
    -256             return this.processed;
    -257         }
    -258     };
    -259 
    -260     var ModuleManager= function() {
    -261         this.nodes= [];
    -262         this.loadedFiles= [];
    -263         this.path= {};
    -264         this.solveListener= [];
    -265         this.orderedSolvedModules= [];
    -266         this.readyListener= [];
    -267 
    -268         return this;
    -269     };
    -270 
    -271     ModuleManager.baseURL= "";
    -272     ModuleManager.modulePath= {};
    -273     ModuleManager.sortedModulePath= [];
    -274     ModuleManager.symbol= {};
    -275 
    -276     ModuleManager.prototype= {
    -277 
    -278         nodes:      null,           // built nodes.
    -279         loadedFiles:null,           // list of loaded files. avoid loading each file more than once
    -280         solveListener: null,        // listener for a module solved
    -281         readyListener: null,        // listener for all modules solved
    -282         orderedSolvedModules: null, // order in which modules where solved.
    -283 
    -284         addSolvedListener : function( modulename, callback ) {
    -285             this.solveListener.push( {
    -286                 name : modulename,
    -287                 callback : callback
    -288             });
    -289         },
    -290 
    -291         solved : function( module ) {
    -292             var i;
    -293 
    -294             for( i=0; i<this.solveListener.length; i++ ) {
    -295                 if ( this.solveListener[i].name===module.name) {
    -296                     this.solveListener[i].callback();
    -297                 }
    -298             }
    -299 
    -300             this.orderedSolvedModules.push( module );
    -301 
    -302             this.notifyReady();
    -303         },
    -304 
    -305         notifyReady : function() {
    -306             var i;
    -307 
    -308             for( i=0; i<this.nodes.length; i++ ) {
    -309                 if ( !this.nodes[i].isSolved() ) {
    -310                     return;
    -311                 }
    -312             }
    -313 
    -314             // if there's any pending files to be processed, still not notify about being solved.
    -315             for( i=0; i<this.loadedFiles.length; i++ ) {
    -316                 if ( !this.loadedFiles[i].isProcessed() ) {
    -317                     // aun hay ficheros sin procesar, no notificar.
    -318                     return;
    -319                 }
    -320             }
    -321 
    -322             /**
    -323              * Make ModuleManager.bring reentrant.
    -324              */
    -325             var me= this;
    -326             var arr= Array.prototype.slice.call(this.readyListener);
    -327             setTimeout( function() {
    -328                 for( var i=0; i<arr.length; i++ ) {
    -329                     arr[i]();
    -330                 }
    -331             }, 0 );
    -332 
    -333             this.readyListener= [];
    -334         },
    -335 
    -336         status : function() {
    -337             for( var i=0; i<this.nodes.length; i++ ) {
    -338                 this.nodes[i].status();
    -339             }
    -340         },
    -341 
    -342         module : function( obj ) {//name, dependencies, callback ) {
    -343 
    -344             var node, nnode, i;
    -345 
    -346             if ( this.isModuleScheduledToSolve( obj.defines ) ) {
    -347 //                console.log("Discarded module: "+obj.class+" (already loaded)");
    -348                 return this;
    -349             }
    -350 
    -351             if ( obj.onPreCreate ) {
    -352 //                console.log("  --> "+obj.defines+" onPrecreation");
    -353                 try {
    -354                     obj.onPreCreate();
    -355                 } catch(e) {
    -356                     console.log("  -> catched "+e+" on module "+obj.defines+" preCreation.");
    -357                 }
    -358             }
    -359 
    -360             if (!obj.depends ) {
    -361                 obj.depends= [];
    -362             }
    -363 
    -364             var dependencies= obj.depends;
    -365 
    -366             if ( dependencies ) {
    -367                 if ( !isArray(dependencies) ) {
    -368                     dependencies= [ dependencies ];
    -369                     obj.depends= dependencies;
    -370                 }
    -371             }
    -372 
    -373             // elimina dependencias ya resueltas en otras cargas.
    -374             i=0;
    -375             while( i<dependencies.length ) {
    -376                 if ( this.alreadySolved( dependencies[i] ) ) {
    -377                      dependencies.splice(i,1);
    -378                 } else {
    -379                     i++;
    -380                 }
    -381             }
    -382 
    -383             nnode= new Node( obj );
    -384 
    -385             // asignar nuevo nodo a quien lo tenga como dependencia.
    -386             for( var i=0; i<this.nodes.length; i++ ) {
    -387                 this.nodes[i].assignDependency(nnode);
    -388             }
    -389             this.nodes.push( nnode );
    -390 
    -391             /**
    -392              * Making dependency resolution a two step process will allow us to pack all modules into one
    -393              * single file so that the module manager does not have to load external files.
    -394              * Useful when CAAt has been packed into one single bundle.
    -395              */
    -396 
    -397             /**
    -398              * remove already loaded modules dependencies.
    -399              */
    -400             for( i=0; i<obj.depends.length;  ) {
    -401 
    -402                 if ( this.isModuleScheduledToSolve( obj.depends[i] ) ) {
    -403                     var dep= this.findNode( obj.depends[i] );
    -404                     if ( null!==dep ) {
    -405                         nnode.assignDependency( dep );
    -406                     } else {
    -407                         //// ERRR
    -408                         alert("Module loaded and does not exist in loaded modules nodes. "+obj.depends[i]);
    -409                         i++;
    -410                     }
    -411                 } else {
    -412                     i+=1;
    -413                 }
    -414             }
    -415 
    -416             /**
    -417              * now, for the rest of non solved dependencies, load their files.
    -418              */
    -419             (function(mm, obj) {
    -420                 setTimeout( function() {
    -421                     for( i=0; i<obj.depends.length; i++ ) {
    -422                         mm.loadFile( obj.depends[i] );
    -423                     }
    -424                 }, 0 );
    -425             })(this, obj);
    -426 
    -427             return this;
    -428 
    -429         },
    -430 
    -431         findNode : function( name ) {
    -432             for( var i=0; i<this.nodes.length; i++ ) {
    -433                 if ( this.nodes[i].name===name ) {
    -434                     return this.nodes[i];
    -435                 }
    -436             }
    -437 
    -438             return null;
    -439         } ,
    -440 
    -441         alreadySolved : function( name ) {
    -442             for( var i= 0; i<this.nodes.length; i++ ) {
    -443                 if ( this.nodes[i].name===name && this.nodes[i].isSolved() ) {
    -444                     return true;
    -445                 }
    -446             }
    -447 
    -448             return false;
    -449         },
    -450 
    -451         exists : function(path) {
    -452             var path= path.split(".");
    -453             var root= global;
    -454 
    -455             for( var i=0; i<path.length; i++ ) {
    -456                 if (!root[path[i]]) {
    -457                     return false;
    -458                 }
    -459 
    -460                 root= root[path[i]];
    -461             }
    -462 
    -463             return true;
    -464         },
    -465 
    -466         loadFile : function( module ) {
    -467 
    -468 
    -469             if (this.exists(module)) {
    -470                 return;
    -471             }
    -472 
    -473             var path= this.getPath( module );
    -474 
    -475             // avoid loading any js file more than once.
    -476             for( var i=0; i<this.loadedFiles.length; i++ ) {
    -477                 if ( this.loadedFiles[i].path===path ) {
    -478                     return;
    -479                 }
    -480             }
    -481 
    -482             var sf= new ScriptFile( path, module );
    -483             this.loadedFiles.push( sf );
    -484 
    -485             var node= document.createElement("script");
    -486             node.type = 'text/javascript';
    -487             node.charset = 'utf-8';
    -488             node.async = true;
    -489             node.addEventListener('load', this.moduleLoaded.bind(this), false);
    -490             node.addEventListener('error', this.moduleErrored.bind(this), false);
    -491             node.setAttribute('module-name', module);
    -492             node.src = path+(!DEBUG ? "?"+(new Date().getTime()) : "");
    -493 
    -494             document.getElementsByTagName('head')[0].appendChild( node );
    -495 
    -496         },
    -497 
    -498         /**
    -499          * Resolve a module name.
    -500          *
    -501          *  + if the module ends with .js
    -502          *    if starts with /, return as is.
    -503          *    else reppend baseURL and return.
    -504          *
    -505          * @param module
    -506          */
    -507         getPath : function( module ) {
    -508 
    -509             // endsWith
    -510             if ( module.endsWith(".js") ) {
    -511                 if ( module.charAt(0)!=="/" ) {
    -512                     module= ModuleManager.baseURL+module;
    -513                 } else {
    -514                     module= module.substring(1);
    -515                 }
    -516                 return module;
    -517             }
    -518 
    -519             var i, symbol;
    -520 
    -521             for( symbol in ModuleManager.symbol ) {
    -522                 if ( module===symbol ) {
    -523                     return  ModuleManager.baseURL + ModuleManager.symbol[symbol];
    -524                 }
    -525             }
    -526 
    -527             //for( var modulename in ModuleManager.modulePath ) {
    -528             for( i=0; i<ModuleManager.sortedModulePath.length; i++ ) {
    -529                 var modulename= ModuleManager.sortedModulePath[i];
    -530 
    -531                 if ( ModuleManager.modulePath.hasOwnProperty(modulename) ) {
    -532                     var path= ModuleManager.modulePath[modulename];
    -533 
    -534                     // startsWith
    -535                     if ( module.indexOf(modulename)===0 ) {
    -536                         // +1 to skip '.' class separator.
    -537                         var nmodule= module.substring(modulename.length + 1);
    -538 
    -539                         /**
    -540                          * Avoid name clash:
    -541                          * CAAT.Foundation and CAAT.Foundation.Timer will both be valid for
    -542                          * CAAT.Foundation.Timer.TimerManager module.
    -543                          * So in the end, the module name can't have '.' after chopping the class
    -544                          * namespace.
    -545                          */
    -546 
    -547                         nmodule= nmodule.replace(/\./g,"/");
    -548 
    -549                         //if ( nmodule.indexOf(".")===-1 ) {
    -550                             nmodule= path+nmodule+".js";
    -551                             return ModuleManager.baseURL + nmodule;
    -552                         //}
    -553                     }
    -554                 }
    -555             }
    -556 
    -557             // what's that ??!?!?!?
    -558             return ModuleManager.baseURL + module.replace(/\./g,"/") + ".js";
    -559         },
    -560 
    -561         isModuleScheduledToSolve : function( name ) {
    -562             for( var i=0; i<this.nodes.length; i++ ) {
    -563                 if ( this.nodes[i].name===name ) {
    -564                     return true;
    -565                 }
    -566             }
    -567             return false;
    -568         },
    -569 
    -570         moduleLoaded : function(e) {
    -571             if (e.type==="load") {
    -572 
    -573                 var node = e.currentTarget || e.srcElement || e.target;
    -574                 var mod= node.getAttribute("module-name");
    -575 
    -576                 // marcar fichero de modulo como procesado.
    -577                 for( var i=0; i<this.loadedFiles.length; i++ ) {
    -578                     if ( this.loadedFiles[i].module===mod ) {
    -579                         this.loadedFiles[i].setProcessed();
    -580                         break;
    -581                     }
    -582                 }
    -583 
    -584                 for( var i=0; i<this.nodes.length; i++ ) {
    -585                     this.nodes[i].removeDependency( mod );
    -586                 }
    -587 
    -588                 for( var i=0; i<this.nodes.length; i++ ) {
    -589                     for( var j=0; j<this.nodes.length; j++ ) {
    -590                         this.nodes[j].visited= false;
    -591                     }
    -592                     this.nodes[i].solveDeep();
    -593                 }
    -594 
    -595                 /**
    -596                  * Despues de cargar un fichero, este puede contener un modulo o no.
    -597                  * Si todos los ficheros que se cargan fueran bibliotecas, nunca se pasaria de aqui porque
    -598                  * no se hace una llamada a solveDeep, y notificacion a solved, y de ahí a notifyReady.
    -599                  * Por eso se hace aqui una llamada a notifyReady, aunque pueda ser redundante.
    -600                  */
    -601                 var me= this;
    -602                 setTimeout(function() {
    -603                     me.notifyReady();
    -604                 }, 0 );
    -605             }
    -606         },
    -607 
    -608         moduleErrored : function(e) {
    -609             var node = e.currentTarget || e.srcElement;
    -610             console.log("Error loading module: "+ node.getAttribute("module-name") );
    -611         },
    -612 
    -613         solvedInOrder : function() {
    -614             for( var i=0; i<this.orderedSolvedModules.length; i++ ) {
    -615                 console.log(this.orderedSolvedModules[i].name);
    -616             }
    -617         },
    -618 
    -619         solveAll : function() {
    -620             for( var i=0; i<this.nodes.length; i++ ) {
    -621                 this.nodes[i].solveDeep();
    -622             }
    -623         },
    -624 
    -625         onReady : function( f ) {
    -626             this.readyListener.push(f);
    -627         }
    -628 
    -629     };
    -630 
    -631     function ensureNamespace( qualifiedClassName ) {
    -632         var ns= qualifiedClassName.split(".");
    -633         var _global= global;
    -634         for( var i=0; i<ns.length-1; i++ ) {
    -635             if ( !_global[ns[i]] ) {
    -636                 _global[ns[i]]= {};
    -637             }
    -638             _global= _global[ns[i]];
    -639         }
    -640     }
    -641 
    -642     /**
    -643      *
    -644      * Create a namespace object from a string.
    -645      *
    -646      * @param namespace {string}
    -647      * @param obj {object}
    -648      * @return {object} the namespace object
    -649      */
    -650     function assignNamespace( namespace, obj ) {
    -651         var ns= namespace.split(".");
    -652         var _global= global;
    -653         for( var i=0; i<ns.length-1; i++ ) {
    -654             if ( !_global[ns[i]] ) {
    -655                 console.log("    Error assigning value to namespace :"+namespace+". '"+ns[i]+"' does not exist.");
    -656                 return null;
    -657             }
    -658 
    -659             _global= _global[ns[i]];
    -660         }
    -661 
    -662         _global[ ns[ns.length-1] ]= obj;
    -663 
    -664         return _global[ ns[ns.length-1] ];
    -665     }
    -666 
    -667     function findClass( qualifiedClassName ) {
    -668         var ns= qualifiedClassName.split(".");
    -669         var _global= global;
    -670         for( var i=0; i<ns.length; i++ ) {
    -671             if ( !_global[ns[i]] ) {
    -672                 return null;
    -673             }
    -674 
    -675             _global= _global[ns[i]];
    -676         }
    -677 
    -678         return _global;
    -679     }
    -680 
    -681     var mm= new ModuleManager();
    -682     var DEBUG= false;
    -683 
    -684 
    -685     /**
    -686      * CAAT is the namespace for all CAAT gaming engine object classes.
    -687      *
    -688      * @name CAAT
    -689      * @namespace
    -690      */
    -691 
    -692     global.CAAT= global.CAAT || {};
    -693 
    -694     /**
    -695      *
    -696      * This function defines CAAT modules, and creates Constructor Class objects.
    -697      *
    -698      * obj parameter has the following structure:
    -699      * {
    -700      *   defines{string},             // class name
    -701      *   depends{Array<string>=},   // dependencies class names
    -702      *   extendsClass{string},            // class to extend from
    -703      *   extensdWith{object},        // actual prototype to extend
    -704      *   aliases{Array<string>},    // other class names
    -705      *   onCreation{function=}        // optional callback to call after class creation.
    -706      *   onPreCreation{function=}        // optional callback to call after namespace class creation.
    -707      * }
    -708      *
    -709      * @param obj {object}
    -710      * @private
    -711      */
    -712     CAAT.Module= function loadModule(obj) {
    -713 
    -714         if (!obj.defines) {
    -715             console.error("Bad module definition: "+obj);
    -716             return;
    -717         }
    -718 
    -719         ensureNamespace(obj.defines);
    -720 
    -721         mm.module( obj );
    -722 
    -723     };
    -724 
    -725     /**
    -726      * @name ModuleManager
    -727      * @memberOf CAAT
    -728      * @namespace
    -729      */
    -730     CAAT.ModuleManager= {};
    -731 
    -732     /**
    -733      * Define global base position for modules structure.
    -734      * @param baseURL {string}
    -735      * @return {*}
    -736      */
    -737     CAAT.ModuleManager.baseURL= function(baseURL) {
    -738 
    -739         if ( !baseURL ) {
    -740             return CAAT.Module;
    -741         }
    -742 
    -743         if (!baseURL.endsWith("/") ) {
    -744             baseURL= baseURL + "/";
    -745         }
    -746 
    -747         ModuleManager.baseURL= baseURL;
    -748         return CAAT.ModuleManager;
    -749     };
    -750 
    -751     /**
    -752      * Define a module path. Multiple module paths can be specified.
    -753      * @param module {string}
    -754      * @param path {string}
    -755      */
    -756     CAAT.ModuleManager.setModulePath= function( module, path ) {
    -757 
    -758         if ( !path.endsWith("/") ) {
    -759             path= path + "/";
    -760         }
    -761 
    -762         if ( !ModuleManager.modulePath[module] ) {
    -763             ModuleManager.modulePath[ module ]= path;
    -764 
    -765             ModuleManager.sortedModulePath.push( module );
    -766 
    -767             /**
    -768              * Sort function so that CAAT.AB is below CAAT.AB.CD
    -769              */
    -770             ModuleManager.sortedModulePath.sort( function(a,b) {
    -771                 if (a==b) {
    -772                     return 0;
    -773                 }
    -774                 return a<b ? 1 : -1;
    -775             } );
    -776         }
    -777         return CAAT.ModuleManager;
    -778     };
    -779 
    -780     /**
    -781      * Define a symbol, or file to be loaded and checked dependencies against.
    -782      * @param symbol {string}
    -783      * @param path {string}
    -784      * @return {*}
    -785      */
    -786     CAAT.ModuleManager.symbol= function( symbol, path ) {
    -787 
    -788         if ( !ModuleManager.symbol[symbol] ) {
    -789             ModuleManager.symbol[symbol]= path;
    -790         }
    -791 
    -792         return CAAT.ModuleManager;
    -793     };
    -794 
    -795     /**
    -796      * Bring the given object, and if no present, start solving and loading dependencies.
    -797      * @param file {string}
    -798      * @return {*}
    -799      */
    -800     CAAT.ModuleManager.bring= function( file ) {
    -801 
    -802         if ( !isArray(file) ) {
    -803             file= [file];
    -804         }
    -805 
    -806         for( var i=0; i<file.length; i++ ) {
    -807             mm.loadFile( file[i] );
    -808         }
    -809 
    -810         return CAAT.ModuleManager;
    -811     };
    -812 
    -813     /**
    -814      * Get CAAT´s module manager status.
    -815      */
    -816     CAAT.ModuleManager.status= function() {
    -817         mm.status();
    -818     }
    -819 
    -820     /**
    -821      * Add an observer for a given module load event.
    -822      * @param modulename {string}
    -823      * @param callback {function()}
    -824      * @return {*}
    -825      */
    -826     CAAT.ModuleManager.addModuleSolvedListener= function(modulename,callback) {
    -827         mm.addSolveListener( modulename, callback );
    -828         return CAAT.ModuleManager;
    -829     }
    -830 
    -831     /**
    -832      * Load a javascript file.
    -833      * @param file {string}
    -834      * @param onload {function()}
    -835      * @param onerror {function()}
    -836      */
    -837     CAAT.ModuleManager.load= function(file, onload, onerror) {
    -838         var node= document.createElement("script");
    -839         node.type = 'text/javascript';
    -840         node.charset = 'utf-8';
    -841         node.async = true;
    -842         if ( onload ) {
    -843             node.addEventListener('load', onload, false);
    -844         }
    -845         if ( onerror ) {
    -846             node.addEventListener('error', onerror, false);
    -847         }
    -848 
    -849         node.addEventListener("load", function( ) {
    -850             mm.solveAll();
    -851         }, false);
    -852 
    -853         node.src = file+(!DEBUG ? "?"+(new Date().getTime()) : "");
    -854 
    -855         document.getElementsByTagName('head')[0].appendChild( node );
    -856 
    -857         // maybe this file has all the modules needed so no more file loading/module resolution must be performed.
    -858 
    -859     }
    -860 
    -861     /**
    -862      * Dump solved modules and get them sorted in the order they were resolved.
    -863      */
    -864     CAAT.ModuleManager.solvedInOrder= function() {
    -865         mm.solvedInOrder();
    -866     }
    -867 
    -868     /**
    -869      * This method will be called everytime all the specified to-be-brought dependencies have been solved.
    -870      * @param f
    -871      * @return {*}
    -872      */
    -873     CAAT.ModuleManager.onReady= function(f) {
    -874         mm.onReady(f);
    -875         return CAAT.ModuleManager;
    -876     }
    -877 
    -878     /**
    -879      * Solve all elements specified in the module loaded.
    -880      * It is useful when minimizing a file.
    -881      */
    -882     CAAT.ModuleManager.solveAll= function() {
    -883         mm.solveAll();
    -884     }
    -885 
    -886     /**
    -887      * Enable debug capabilities for the loaded modules.
    -888      * Otherwise, the modules will have cache invalidation features.
    -889      * @param d {boolean}
    -890      * @return {*}
    -891      */
    -892     CAAT.ModuleManager.debug= function(d) {
    -893         DEBUG= d;
    -894         return CAAT.ModuleManager;
    -895     }
    -896 
    -897     CAAT.Class= Class;
    -898 
    -899 })(this);
    -900 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_AnimationLoop.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_AnimationLoop.js.html deleted file mode 100644 index 04b3cc8f..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_AnimationLoop.js.html +++ /dev/null @@ -1,219 +0,0 @@ -
      1 CAAT.Module({
    -  2     defines:"CAAT.Event.AnimationLoop",
    -  3     onCreate : function() {
    -  4 
    -  5         /**
    -  6          * @lends CAAT
    -  7          */
    -  8 
    -  9         /**
    - 10          * if RAF, this value signals end of RAF.
    - 11          * @type {Boolean}
    - 12          */
    - 13         CAAT.ENDRAF=false;
    - 14 
    - 15         /**
    - 16          * if setInterval, this value holds CAAT.setInterval return value.
    - 17          * @type {null}
    - 18          */
    - 19         CAAT.INTERVAL_ID=null;
    - 20 
    - 21         /**
    - 22          * Boolean flag to determine if CAAT.loop has already been called.
    - 23          * @type {Boolean}
    - 24          */
    - 25         CAAT.renderEnabled=false;
    - 26 
    - 27         /**
    - 28          * expected FPS when using setInterval animation.
    - 29          * @type {Number}
    - 30          */
    - 31         CAAT.FPS=60;
    - 32 
    - 33         /**
    - 34          * Use RAF shim instead of setInterval. Set to != 0 to use setInterval.
    - 35          * @type {Number}
    - 36          */
    - 37         CAAT.NO_RAF=0;
    - 38 
    - 39         /**
    - 40          * debug panel update time.
    - 41          * @type {Number}
    - 42          */
    - 43         CAAT.FPS_REFRESH=500;
    - 44 
    - 45         /**
    - 46          * requestAnimationFrame time reference.
    - 47          * @type {Number}
    - 48          */
    - 49         CAAT.RAF=0;
    - 50 
    - 51         /**
    - 52          * time between two consecutive RAF. usually bigger than FRAME_TIME
    - 53          * @type {Number}
    - 54          */
    - 55         CAAT.REQUEST_ANIMATION_FRAME_TIME=0;
    - 56 
    - 57         /**
    - 58          * time between two consecutive setInterval calls.
    - 59          * @type {Number}
    - 60          */
    - 61         CAAT.SET_INTERVAL=0;
    - 62 
    - 63         /**
    - 64          * time to process one frame.
    - 65          * @type {Number}
    - 66          */
    - 67         CAAT.FRAME_TIME=0;
    - 68 
    - 69         /**
    - 70          * Current animated director.
    - 71          * @type {CAAT.Foundation.Director}
    - 72          */
    - 73         CAAT.currentDirector=null;
    - 74 
    - 75         /**
    - 76          * Registered director objects.
    - 77          * @type {Array}
    - 78          */
    - 79         CAAT.director=[];
    - 80 
    - 81         /**
    - 82          * Register and keep track of every CAAT.Director instance in the document.
    - 83          */
    - 84         CAAT.RegisterDirector=function (director) {
    - 85             if (!CAAT.currentDirector) {
    - 86                 CAAT.currentDirector = director;
    - 87             }
    - 88             CAAT.director.push(director);
    - 89         };
    - 90 
    - 91         /**
    - 92          * Return current scene.
    - 93          * @return {CAAT.Foundation.Scene}
    - 94          */
    - 95         CAAT.getCurrentScene=function () {
    - 96             return CAAT.currentDirector.getCurrentScene();
    - 97         };
    - 98 
    - 99         /**
    -100          * Return current director's current scene's time.
    -101          * The way to go should be keep local scene references, but anyway, this function is always handy.
    -102          * @return {number} current scene's virtual time.
    -103          */
    -104         CAAT.getCurrentSceneTime=function () {
    -105             return CAAT.currentDirector.getCurrentScene().time;
    -106         };
    -107 
    -108         /**
    -109          * Stop animation loop.
    -110          */
    -111         CAAT.endLoop=function () {
    -112             if (CAAT.NO_RAF) {
    -113                 if (CAAT.INTERVAL_ID !== null) {
    -114                     clearInterval(CAAT.INTERVAL_ID);
    -115                 }
    -116             } else {
    -117                 CAAT.ENDRAF = true;
    -118             }
    -119 
    -120             CAAT.renderEnabled = false;
    -121         };
    -122 
    -123         /**
    -124          * Main animation loop entry point.
    -125          * Must called only once, or only after endLoop.
    -126          *
    -127          * @param fps {number} desired fps. fps parameter will only be used if CAAT.NO_RAF is specified, that is
    -128          * switch from RequestAnimationFrame to setInterval for animation loop.
    -129          */
    -130         CAAT.loop=function (fps) {
    -131             if (CAAT.renderEnabled) {
    -132                 return;
    -133             }
    -134 
    -135             for (var i = 0, l = CAAT.director.length; i < l; i++) {
    -136                 CAAT.director[i].timeline = new Date().getTime();
    -137             }
    -138 
    -139             CAAT.FPS = fps || 60;
    -140             CAAT.renderEnabled = true;
    -141             if (CAAT.NO_RAF) {
    -142                 CAAT.INTERVAL_ID = setInterval(
    -143                     function () {
    -144                         var t = new Date().getTime();
    -145 
    -146                         for (var i = 0, l = CAAT.director.length; i < l; i++) {
    -147                             var dr = CAAT.director[i];
    -148                             if (dr.renderMode === CAAT.Foundation.Director.RENDER_MODE_CONTINUOUS || dr.needsRepaint) {
    -149                                 dr.renderFrame();
    -150                             }
    -151                         }
    -152 
    -153                         CAAT.FRAME_TIME = t - CAAT.SET_INTERVAL;
    -154 
    -155                         if (CAAT.RAF) {
    -156                             CAAT.REQUEST_ANIMATION_FRAME_TIME = new Date().getTime() - CAAT.RAF;
    -157                         }
    -158                         CAAT.RAF = new Date().getTime();
    -159 
    -160                         CAAT.SET_INTERVAL = t;
    -161 
    -162                     },
    -163                     1000 / CAAT.FPS
    -164                 );
    -165             } else {
    -166                 CAAT.renderFrameRAF();
    -167             }
    -168         };
    -169         
    -170         CAAT.renderFrameRAF= function (now) {
    -171             var c= CAAT;
    -172 
    -173             if (c.ENDRAF) {
    -174                 c.ENDRAF = false;
    -175                 return;
    -176             }
    -177 
    -178             if (!now) now = new Date().getTime();
    -179 
    -180             var t= new Date().getTime();
    -181             c.REQUEST_ANIMATION_FRAME_TIME = c.RAF ? now - c.RAF : 16;
    -182             for (var i = 0, l = c.director.length; i < l; i++) {
    -183                 c.director[i].renderFrame();
    -184             }
    -185             c.RAF = now;
    -186             c.FRAME_TIME = new Date().getTime() - t;
    -187 
    -188 
    -189             window.requestAnimFrame(c.renderFrameRAF, 0);
    -190         };
    -191         
    -192         /**
    -193          * Polyfill for requestAnimationFrame.
    -194          */
    -195         window.requestAnimFrame = (function () {
    -196             return  window.requestAnimationFrame ||
    -197                 window.webkitRequestAnimationFrame ||
    -198                 window.mozRequestAnimationFrame ||
    -199                 window.oRequestAnimationFrame ||
    -200                 window.msRequestAnimationFrame ||
    -201                 function raf(/* function */ callback, /* DOMElement */ element) {
    -202                     window.setTimeout(callback, 1000 / CAAT.FPS);
    -203                 };
    -204         })();        
    -205     },
    -206 
    -207     extendsWith:function () {
    -208         return {
    -209         };
    -210     }
    -211 });
    -212 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_Input.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_Input.js.html deleted file mode 100644 index ea36b441..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_Input.js.html +++ /dev/null @@ -1,216 +0,0 @@ -
      1 CAAT.Module( {
    -  2     defines : "CAAT.Event.Input",
    -  3     depends : [
    -  4         "CAAT.Event.KeyEvent",
    -  5         "CAAT.Event.MouseEvent",
    -  6         "CAAT.Event.TouchEvent"
    -  7     ],
    -  8     onCreate : function() {
    -  9 
    - 10         /**
    - 11          * @lends CAAT
    - 12          */
    - 13 
    - 14         /**
    - 15          * Set the cursor.
    - 16          * @param cursor
    - 17          */
    - 18         CAAT.setCursor= function(cursor) {
    - 19             if ( navigator.browser!=='iOS' ) {
    - 20                 document.body.style.cursor= cursor;
    - 21             }
    - 22         };
    - 23 
    - 24 
    - 25         /**
    - 26          * Constant to set touch behavior as single touch, compatible with mouse.
    - 27          * @type {Number}
    - 28          * @constant
    - 29          */
    - 30         CAAT.TOUCH_AS_MOUSE=        1;
    - 31 
    - 32         /**
    - 33          * Constant to set CAAT touch behavior as multitouch.
    - 34          * @type {Number}
    - 35          * @contant
    - 36          */
    - 37         CAAT.TOUCH_AS_MULTITOUCH=   2;
    - 38 
    - 39         /**
    - 40          * Set CAAT touch behavior as single or multi touch.
    - 41          * @type {Number}
    - 42          */
    - 43         CAAT.TOUCH_BEHAVIOR= CAAT.TOUCH_AS_MOUSE;
    - 44 
    - 45         /**
    - 46          * Array of window resize listeners.
    - 47          * @type {Array}
    - 48          */
    - 49         CAAT.windowResizeListeners= [];
    - 50 
    - 51         /**
    - 52          * Register a function callback as window resize listener.
    - 53          * @param f
    - 54          */
    - 55         CAAT.registerResizeListener= function(f) {
    - 56             CAAT.windowResizeListeners.push(f);
    - 57         };
    - 58 
    - 59         /**
    - 60          * Remove a function callback as window resize listener.
    - 61          * @param director
    - 62          */
    - 63         CAAT.unregisterResizeListener= function(director) {
    - 64             for( var i=0; i<CAAT.windowResizeListeners.length; i++ ) {
    - 65                 if ( director===CAAT.windowResizeListeners[i] ) {
    - 66                     CAAT.windowResizeListeners.splice(i,1);
    - 67                     return;
    - 68                 }
    - 69             }
    - 70         };
    - 71 
    - 72         /**
    - 73          * Aray of Key listeners.
    - 74          */
    - 75         CAAT.keyListeners= [];
    - 76 
    - 77         /**
    - 78          * Register a function callback as key listener.
    - 79          * @param f
    - 80          */
    - 81         CAAT.registerKeyListener= function(f) {
    - 82             CAAT.keyListeners.push(f);
    - 83         };
    - 84 
    - 85         /**
    - 86          * Acceleration data.
    - 87          * @type {Object}
    - 88          */
    - 89         CAAT.accelerationIncludingGravity= {
    - 90             x:0,
    - 91             y:0,
    - 92             z:0
    - 93         };
    - 94 
    - 95         /**
    - 96          * Device motion angles.
    - 97          * @type {Object}
    - 98          */
    - 99         CAAT.rotationRate= {
    -100             alpha: 0,
    -101             beta:0,
    -102             gamma: 0 };
    -103 
    -104         /**
    -105          * Enable device motion events.
    -106          * This function does not register a callback, instear it sets
    -107          * CAAT.rotationRate and CAAt.accelerationIncludingGravity values.
    -108          */
    -109         CAAT.enableDeviceMotion= function() {
    -110 
    -111             CAAT.prevOnDeviceMotion=    null;   // previous accelerometer callback function.
    -112             CAAT.onDeviceMotion=        null;   // current accelerometer callback set for CAAT.
    -113 
    -114             function tilt(data) {
    -115                 CAAT.rotationRate= {
    -116                         alpha : 0,
    -117                         beta  : data[0],
    -118                         gamma : data[1]
    -119                     };
    -120             }
    -121 
    -122             if (window.DeviceOrientationEvent) {
    -123                 window.addEventListener("deviceorientation", function (event) {
    -124                     tilt([event.beta, event.gamma]);
    -125                 }, true);
    -126             } else if (window.DeviceMotionEvent) {
    -127                 window.addEventListener('devicemotion', function (event) {
    -128                     tilt([event.acceleration.x * 2, event.acceleration.y * 2]);
    -129                 }, true);
    -130             } else {
    -131                 window.addEventListener("MozOrientation", function (event) {
    -132                     tilt([-event.y * 45, event.x * 45]);
    -133                 }, true);
    -134             }
    -135 
    -136         };
    -137 
    -138 
    -139         /**
    -140          * Enable window level input events, keys and redimension.
    -141          */
    -142         window.addEventListener('keydown',
    -143             function(evt) {
    -144                 var key = (evt.which) ? evt.which : evt.keyCode;
    -145 
    -146                 if ( key===CAAT.SHIFT_KEY ) {
    -147                     CAAT.KEY_MODIFIERS.shift= true;
    -148                 } else if ( key===CAAT.CONTROL_KEY ) {
    -149                     CAAT.KEY_MODIFIERS.control= true;
    -150                 } else if ( key===CAAT.ALT_KEY ) {
    -151                     CAAT.KEY_MODIFIERS.alt= true;
    -152                 } else {
    -153                     for( var i=0; i<CAAT.keyListeners.length; i++ ) {
    -154                         CAAT.keyListeners[i]( new CAAT.KeyEvent(
    -155                             key,
    -156                             'down',
    -157                             {
    -158                                 alt:        CAAT.KEY_MODIFIERS.alt,
    -159                                 control:    CAAT.KEY_MODIFIERS.control,
    -160                                 shift:      CAAT.KEY_MODIFIERS.shift
    -161                             },
    -162                             evt)) ;
    -163                     }
    -164                 }
    -165             },
    -166             false);
    -167 
    -168         window.addEventListener('keyup',
    -169             function(evt) {
    -170 
    -171                 var key = (evt.which) ? evt.which : evt.keyCode;
    -172                 if ( key===CAAT.SHIFT_KEY ) {
    -173                     CAAT.KEY_MODIFIERS.shift= false;
    -174                 } else if ( key===CAAT.CONTROL_KEY ) {
    -175                     CAAT.KEY_MODIFIERS.control= false;
    -176                 } else if ( key===CAAT.ALT_KEY ) {
    -177                     CAAT.KEY_MODIFIERS.alt= false;
    -178                 } else {
    -179 
    -180                     for( var i=0; i<CAAT.keyListeners.length; i++ ) {
    -181                         CAAT.keyListeners[i]( new CAAT.KeyEvent(
    -182                             key,
    -183                             'up',
    -184                             {
    -185                                 alt:        CAAT.KEY_MODIFIERS.alt,
    -186                                 control:    CAAT.KEY_MODIFIERS.control,
    -187                                 shift:      CAAT.KEY_MODIFIERS.shift
    -188                             },
    -189                             evt));
    -190                     }
    -191                 }
    -192             },
    -193             false );
    -194 
    -195         window.addEventListener('resize',
    -196             function(evt) {
    -197                 for( var i=0; i<CAAT.windowResizeListeners.length; i++ ) {
    -198                     CAAT.windowResizeListeners[i].windowResized(
    -199                             window.innerWidth,
    -200                             window.innerHeight);
    -201                 }
    -202             },
    -203             false);
    -204 
    -205     },
    -206     extendsWith : {
    -207     }
    -208 });
    -209 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_KeyEvent.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_KeyEvent.js.html deleted file mode 100644 index c4751384..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_KeyEvent.js.html +++ /dev/null @@ -1,241 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name Event
    -  5      * @memberOf CAAT
    -  6      * @namespace
    -  7      */
    -  8 
    -  9     /**
    - 10      * @name KeyEvent
    - 11      * @memberOf CAAT.Event
    - 12      * @constructor
    - 13      */
    - 14 
    - 15     /**
    - 16      * @name KEYS
    - 17      * @memberOf CAAT
    - 18      * @namespace
    - 19      */
    - 20 
    - 21     /**
    - 22      * @name KEY_MODIFIERS
    - 23      * @memberOf CAAT
    - 24      * @namespace
    - 25      */
    - 26 
    - 27     defines : "CAAT.Event.KeyEvent",
    - 28     aliases : "CAAT.KeyEvent",
    - 29     extendsWith : {
    - 30 
    - 31         /**
    - 32          * @lends CAAT.Event.KeyEvent.prototype
    - 33          */
    - 34 
    - 35         /**
    - 36          * Define a key event.
    - 37          * @param keyCode
    - 38          * @param up_or_down
    - 39          * @param modifiers
    - 40          * @param originalEvent
    - 41          */
    - 42         __init : function( keyCode, up_or_down, modifiers, originalEvent ) {
    - 43             this.keyCode= keyCode;
    - 44             this.action=  up_or_down;
    - 45             this.modifiers= modifiers;
    - 46             this.sourceEvent= originalEvent;
    - 47 
    - 48             this.preventDefault= function() {
    - 49                 this.sourceEvent.preventDefault();
    - 50             }
    - 51 
    - 52             this.getKeyCode= function() {
    - 53                 return this.keyCode;
    - 54             };
    - 55 
    - 56             this.getAction= function() {
    - 57                 return this.action;
    - 58             };
    - 59 
    - 60             this.modifiers= function() {
    - 61                 return this.modifiers;
    - 62             };
    - 63 
    - 64             this.isShiftPressed= function() {
    - 65                 return this.modifiers.shift;
    - 66             };
    - 67 
    - 68             this.isControlPressed= function() {
    - 69                 return this.modifiers.control;
    - 70             };
    - 71 
    - 72             this.isAltPressed= function() {
    - 73                 return this.modifiers.alt;
    - 74             };
    - 75 
    - 76             this.getSourceEvent= function() {
    - 77                 return this.sourceEvent;
    - 78             };
    - 79         }
    - 80     },
    - 81     onCreate : function() {
    - 82 
    - 83         /**
    - 84          * @lends CAAT
    - 85          */
    - 86 
    - 87         /**
    - 88          * Key codes
    - 89          * @type {enum}
    - 90          */
    - 91         CAAT.KEYS = {
    - 92 
    - 93             /** @const */ ENTER:13,
    - 94             /** @const */ BACKSPACE:8,
    - 95             /** @const */ TAB:9,
    - 96             /** @const */ SHIFT:16,
    - 97             /** @const */ CTRL:17,
    - 98             /** @const */ ALT:18,
    - 99             /** @const */ PAUSE:19,
    -100             /** @const */ CAPSLOCK:20,
    -101             /** @const */ ESCAPE:27,
    -102             /** @const */ PAGEUP:33,
    -103             /** @const */ PAGEDOWN:34,
    -104             /** @const */ END:35,
    -105             /** @const */ HOME:36,
    -106             /** @const */ LEFT:37,
    -107             /** @const */ UP:38,
    -108             /** @const */ RIGHT:39,
    -109             /** @const */ DOWN:40,
    -110             /** @const */ INSERT:45,
    -111             /** @const */ DELETE:46,
    -112             /** @const */ 0:48,
    -113             /** @const */ 1:49,
    -114             /** @const */ 2:50,
    -115             /** @const */ 3:51,
    -116             /** @const */ 4:52,
    -117             /** @const */ 5:53,
    -118             /** @const */ 6:54,
    -119             /** @const */ 7:55,
    -120             /** @const */ 8:56,
    -121             /** @const */ 9:57,
    -122             /** @const */ a:65,
    -123             /** @const */ b:66,
    -124             /** @const */ c:67,
    -125             /** @const */ d:68,
    -126             /** @const */ e:69,
    -127             /** @const */ f:70,
    -128             /** @const */ g:71,
    -129             /** @const */ h:72,
    -130             /** @const */ i:73,
    -131             /** @const */ j:74,
    -132             /** @const */ k:75,
    -133             /** @const */ l:76,
    -134             /** @const */ m:77,
    -135             /** @const */ n:78,
    -136             /** @const */ o:79,
    -137             /** @const */ p:80,
    -138             /** @const */ q:81,
    -139             /** @const */ r:82,
    -140             /** @const */ s:83,
    -141             /** @const */ t:84,
    -142             /** @const */ u:85,
    -143             /** @const */ v:86,
    -144             /** @const */ w:87,
    -145             /** @const */ x:88,
    -146             /** @const */ y:89,
    -147             /** @const */ z:90,
    -148             /** @const */ SELECT:93,
    -149             /** @const */ NUMPAD0:96,
    -150             /** @const */ NUMPAD1:97,
    -151             /** @const */ NUMPAD2:98,
    -152             /** @const */ NUMPAD3:99,
    -153             /** @const */ NUMPAD4:100,
    -154             /** @const */ NUMPAD5:101,
    -155             /** @const */ NUMPAD6:102,
    -156             /** @const */ NUMPAD7:103,
    -157             /** @const */ NUMPAD8:104,
    -158             /** @const */ NUMPAD9:105,
    -159             /** @const */ MULTIPLY:106,
    -160             /** @const */ ADD:107,
    -161             /** @const */ SUBTRACT:109,
    -162             /** @const */ DECIMALPOINT:110,
    -163             /** @const */ DIVIDE:111,
    -164             /** @const */ F1:112,
    -165             /** @const */ F2:113,
    -166             /** @const */ F3:114,
    -167             /** @const */ F4:115,
    -168             /** @const */ F5:116,
    -169             /** @const */ F6:117,
    -170             /** @const */ F7:118,
    -171             /** @const */ F8:119,
    -172             /** @const */ F9:120,
    -173             /** @const */ F10:121,
    -174             /** @const */ F11:122,
    -175             /** @const */ F12:123,
    -176             /** @const */ NUMLOCK:144,
    -177             /** @const */ SCROLLLOCK:145,
    -178             /** @const */ SEMICOLON:186,
    -179             /** @const */ EQUALSIGN:187,
    -180             /** @const */ COMMA:188,
    -181             /** @const */ DASH:189,
    -182             /** @const */ PERIOD:190,
    -183             /** @const */ FORWARDSLASH:191,
    -184             /** @const */ GRAVEACCENT:192,
    -185             /** @const */ OPENBRACKET:219,
    -186             /** @const */ BACKSLASH:220,
    -187             /** @const */ CLOSEBRAKET:221,
    -188             /** @const */ SINGLEQUOTE:222
    -189         };
    -190 
    -191         /**
    -192          * @deprecated
    -193          * @type {Object}
    -194          */
    -195         CAAT.Keys= CAAT.KEYS;
    -196 
    -197         /**
    -198          * Shift key code
    -199          * @type {Number}
    -200          */
    -201         CAAT.SHIFT_KEY=    16;
    -202 
    -203         /**
    -204          * Control key code
    -205          * @type {Number}
    -206          */
    -207         CAAT.CONTROL_KEY=  17;
    -208 
    -209         /**
    -210          * Alt key code
    -211          * @type {Number}
    -212          */
    -213         CAAT.ALT_KEY=      18;
    -214 
    -215         /**
    -216          * Enter key code
    -217          * @type {Number}
    -218          */
    -219         CAAT.ENTER_KEY=    13;
    -220 
    -221         /**
    -222          * Event modifiers.
    -223          * @type enum
    -224          */
    -225         CAAT.KEY_MODIFIERS= {
    -226 
    -227             /** @const */ alt:        false,
    -228             /** @const */ control:    false,
    -229             /** @const */ shift:      false
    -230         };
    -231     }
    -232 
    -233 });
    -234 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_MouseEvent.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_MouseEvent.js.html deleted file mode 100644 index cac92d53..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_MouseEvent.js.html +++ /dev/null @@ -1,116 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name MouseEvent
    -  5      * @memberOf CAAT.Event
    -  6      * @constructor
    -  7      */
    -  8 
    -  9     defines : "CAAT.Event.MouseEvent",
    - 10     aliases : ["CAAT.MouseEvent"],
    - 11     depends : [
    - 12         "CAAT.Math.Point"
    - 13     ],
    - 14     extendsWith : {
    - 15 
    - 16         /**
    - 17          * @lends CAAT.Event.MouseEvent.prototype
    - 18          */
    - 19 
    - 20         /**
    - 21          * Constructor delegate
    - 22          * @private
    - 23          */
    - 24         __init : function() {
    - 25             this.point= new CAAT.Math.Point(0,0,0);
    - 26             this.screenPoint= new CAAT.Math.Point(0,0,0);
    - 27             this.touches= [];
    - 28             return this;
    - 29         },
    - 30 
    - 31         /**
    - 32          * Original mouse/touch screen coord
    - 33          */
    - 34 		screenPoint:	null,
    - 35 
    - 36         /**
    - 37          * Transformed in-actor coordinate
    - 38          */
    - 39 		point:			null,
    - 40 
    - 41         /**
    - 42          * scene time when the event was triggered.
    - 43          */
    - 44 		time:			0,
    - 45 
    - 46         /**
    - 47          * Actor the event was produced in.
    - 48          */
    - 49 		source:			null,
    - 50 
    - 51         /**
    - 52          * Was shift pressed ?
    - 53          */
    - 54         shift:          false,
    - 55 
    - 56         /**
    - 57          * Was control pressed ?
    - 58          */
    - 59         control:        false,
    - 60 
    - 61         /**
    - 62          * was alt pressed ?
    - 63          */
    - 64         alt:            false,
    - 65 
    - 66         /**
    - 67          * was Meta key pressed ?
    - 68          */
    - 69         meta:           false,
    - 70 
    - 71         /**
    - 72          * Original mouse/touch event
    - 73          */
    - 74         sourceEvent:    null,
    - 75 
    - 76         touches     :   null,
    - 77 
    - 78 		init : function( x,y,sourceEvent,source,screenPoint,time ) {
    - 79 			this.point.set(x,y);
    - 80 			this.source=        source;
    - 81 			this.screenPoint=   screenPoint;
    - 82             this.alt =          sourceEvent.altKey;
    - 83             this.control =      sourceEvent.ctrlKey;
    - 84             this.shift =        sourceEvent.shiftKey;
    - 85             this.meta =         sourceEvent.metaKey;
    - 86             this.sourceEvent=   sourceEvent;
    - 87             this.x=             x;
    - 88             this.y=             y;
    - 89             this.time=          time;
    - 90 			return this;
    - 91 		},
    - 92 		isAltDown : function() {
    - 93 			return this.alt;
    - 94 		},
    - 95 		isControlDown : function() {
    - 96 			return this.control;
    - 97 		},
    - 98 		isShiftDown : function() {
    - 99 			return this.shift;
    -100 		},
    -101         isMetaDown: function() {
    -102             return this.meta;
    -103         },
    -104         getSourceEvent : function() {
    -105             return this.sourceEvent;
    -106         }
    -107 	}
    -108 });
    -109 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchEvent.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchEvent.js.html deleted file mode 100644 index 1e0ab931..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchEvent.js.html +++ /dev/null @@ -1,135 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name TouchEvent
    -  5      * @memberOf CAAT.Event
    -  6      * @constructor
    -  7      */
    -  8 
    -  9 
    - 10     defines : "CAAT.Event.TouchEvent",
    - 11     aliases : ["CAAT.TouchEvent"],
    - 12     depends : [
    - 13         "CAAT.Event.TouchInfo"
    - 14     ],
    - 15     extendsWith : {
    - 16 
    - 17         /**
    - 18          * @lends CAAT.Event.TouchEvent.prototype
    - 19          */
    - 20 
    - 21         /**
    - 22          * Constructor delegate
    - 23          * @private
    - 24          */
    - 25         __init : function() {
    - 26             this.touches= [];
    - 27             this.changedTouches= [];
    - 28             return this;
    - 29         },
    - 30 
    - 31         /**
    - 32          * Time the touch event was triggered at.
    - 33          */
    - 34 		time:			0,
    - 35 
    - 36         /**
    - 37          * Source Actor the event happened in.
    - 38          */
    - 39 		source:			null,
    - 40 
    - 41         /**
    - 42          * Original touch event.
    - 43          */
    - 44         sourceEvent:    null,
    - 45 
    - 46         /**
    - 47          * Was shift pressed ?
    - 48          */
    - 49         shift:          false,
    - 50 
    - 51         /**
    - 52          * Was control pressed ?
    - 53          */
    - 54         control:        false,
    - 55 
    - 56         /**
    - 57          * Was alt pressed ?
    - 58          */
    - 59         alt:            false,
    - 60 
    - 61         /**
    - 62          * Was meta pressed ?
    - 63          */
    - 64         meta:           false,
    - 65 
    - 66         /**
    - 67          * touches collection
    - 68          */
    - 69         touches         : null,
    - 70 
    - 71         /**
    - 72          * changed touches collection
    - 73          */
    - 74         changedTouches  : null,
    - 75 
    - 76 		init : function( sourceEvent,source,time ) {
    - 77 
    - 78 			this.source=        source;
    - 79             this.alt =          sourceEvent.altKey;
    - 80             this.control =      sourceEvent.ctrlKey;
    - 81             this.shift =        sourceEvent.shiftKey;
    - 82             this.meta =         sourceEvent.metaKey;
    - 83             this.sourceEvent=   sourceEvent;
    - 84             this.time=          time;
    - 85 
    - 86 			return this;
    - 87 		},
    - 88         /**
    - 89          *
    - 90          * @param touchInfo
    - 91          *  <{
    - 92          *      id : <number>,
    - 93          *      point : {
    - 94          *          x: <number>,
    - 95          *          y: <number> }�
    - 96          *  }>
    - 97          * @return {*}
    - 98          */
    - 99         addTouch : function( touchInfo ) {
    -100             if ( -1===this.touches.indexOf( touchInfo ) ) {
    -101                 this.touches.push( touchInfo );
    -102             }
    -103             return this;
    -104         },
    -105         addChangedTouch : function( touchInfo ) {
    -106             if ( -1===this.changedTouches.indexOf( touchInfo ) ) {
    -107                 this.changedTouches.push( touchInfo );
    -108             }
    -109             return this;
    -110         },
    -111 		isAltDown : function() {
    -112 			return this.alt;
    -113 		},
    -114 		isControlDown : function() {
    -115 			return this.control;
    -116 		},
    -117 		isShiftDown : function() {
    -118 			return this.shift;
    -119 		},
    -120         isMetaDown: function() {
    -121             return this.meta;
    -122         },
    -123         getSourceEvent : function() {
    -124             return this.sourceEvent;
    -125         }
    -126 	}
    -127 });
    -128 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchInfo.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchInfo.js.html deleted file mode 100644 index 29524ee7..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchInfo.js.html +++ /dev/null @@ -1,46 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name TouchInfo
    -  5      * @memberOf CAAT.Event
    -  6      * @constructor
    -  7      */
    -  8 
    -  9     defines : "CAAT.Event.TouchInfo",
    - 10     aliases : ["CAAT.TouchInfo"],
    - 11     extendsWith : {
    - 12 
    - 13         /**
    - 14          * @lends CAAT.Event.TouchInfo.prototype
    - 15          */
    - 16 
    - 17         /**
    - 18          * Constructor delegate.
    - 19          * @param id {number}
    - 20          * @param x {number}
    - 21          * @param y {number}
    - 22          * @param target {DOMElement}
    - 23          * @private
    - 24          */
    - 25         __init : function( id, x, y, target ) {
    - 26 
    - 27             this.identifier= id;
    - 28             this.clientX= x;
    - 29             this.pageX= x;
    - 30             this.clientY= y;
    - 31             this.pageY= y;
    - 32             this.target= target;
    - 33             this.time= new Date().getTime();
    - 34 
    - 35             return this;
    - 36         }
    - 37     }
    - 38 });
    - 39 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Actor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Actor.js.html deleted file mode 100644 index 87a810bd..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Actor.js.html +++ /dev/null @@ -1,2597 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  **/
    -  5 
    -  6 CAAT.Module({
    -  7 
    -  8 
    -  9 
    - 10 
    - 11     /**
    - 12      *
    - 13      * CAAT.Foundation is the base namespace for all the core animation elements.
    - 14      *
    - 15      * @name Foundation
    - 16      * @namespace
    - 17      * @memberOf CAAT
    - 18      *
    - 19      */
    - 20 
    - 21     /**
    - 22      *
    - 23      * CAAT.Foundation.Actor is the base animable element. It is the base object for Director, Scene and
    - 24      * Container.
    - 25      *    <p>CAAT.Actor is the simplest object instance CAAT manages. Every on-screen element is an Actor instance.
    - 26      *        An Actor has entity, it has a size, position and can have input sent to it. Everything that has a
    - 27      *        visual representation is an Actor, including Director and Scene objects.</p>
    - 28      *    <p>This object has functionality for:</p>
    - 29      *    <ol>
    - 30      *        <li>Set location and size on screen. Actors are always rectangular shapes, but not needed to be AABB.</li>
    - 31      *        <li>Set affine transforms (rotation, scale and translation).</li>
    - 32      *        <li>Define life cycle.</li>
    - 33      *        <li>Manage alpha transparency.</li>
    - 34      *        <li>Manage and keep track of applied Behaviors. Behaviors apply transformations via key-framing.</li>
    - 35      *        <li>Compose transformations. A container Actor will transform its children before they apply their own transformation.</li>
    - 36      *        <li>Clipping capabilities. Either rectangular or arbitrary shapes.</li>
    - 37      *        <li>The API is developed to allow method chaining when possible.</li>
    - 38      *        <li>Handle input (either mouse events, touch, multitouch, keys and accelerometer).</li>
    - 39      *        <li>Show an image.</li>
    - 40      *        <li>Show some image animations.</li>
    - 41      *        <li>etc.</li>
    - 42      *    </ol>
    - 43      *
    - 44      * @name Actor
    - 45      * @memberOf CAAT.Foundation
    - 46      * @constructor
    - 47      *
    - 48      */
    - 49 
    - 50     defines:"CAAT.Foundation.Actor",
    - 51     aliases: [ "CAAT.Actor" ],
    - 52     depends: [
    - 53         "CAAT.Math.Dimension",
    - 54         "CAAT.Event.AnimationLoop",
    - 55         "CAAT.Foundation.SpriteImage",
    - 56         "CAAT.Core.Constants",
    - 57         "CAAT.Behavior.PathBehavior",
    - 58         "CAAT.Behavior.RotateBehavior",
    - 59         "CAAT.Behavior.ScaleBehavior",
    - 60         "CAAT.Behavior.Scale1Behavior",
    - 61         "CAAT.PathUtil.LinearPath",
    - 62         "CAAT.Event.AnimationLoop"
    - 63     ],
    - 64     constants :  {
    - 65         /**
    - 66          * @lends  CAAT.Foundation.Actor
    - 67          */
    - 68 
    - 69         /** @const @type {number} */ ANCHOR_CENTER:0, // constant values to determine different affine transform
    - 70         /** @const @type {number} */ ANCHOR_TOP:1, // anchors.
    - 71         /** @const @type {number} */ ANCHOR_BOTTOM:2,
    - 72         /** @const @type {number} */ ANCHOR_LEFT:3,
    - 73         /** @const @type {number} */ ANCHOR_RIGHT:4,
    - 74         /** @const @type {number} */ ANCHOR_TOP_LEFT:5,
    - 75         /** @const @type {number} */ ANCHOR_TOP_RIGHT:6,
    - 76         /** @const @type {number} */ ANCHOR_BOTTOM_LEFT:7,
    - 77         /** @const @type {number} */ ANCHOR_BOTTOM_RIGHT:8,
    - 78         /** @const @type {number} */ ANCHOR_CUSTOM:9,
    - 79 
    - 80         /** @const @type {number} */ CACHE_NONE:0,
    - 81         /** @const @type {number} */ CACHE_SIMPLE:1,
    - 82         /** @const @type {number} */ CACHE_DEEP:2
    - 83     },
    - 84 
    - 85     extendsWith : function () {
    - 86 
    - 87         var __index = 0;
    - 88 
    - 89         return  {
    - 90 
    - 91             /**
    - 92              * @lends CAAT.Foundation.Actor.prototype
    - 93              */
    - 94 
    - 95             __init:function () {
    - 96                 this.behaviorList = [];
    - 97                 this.lifecycleListenerList = [];
    - 98                 this.AABB = new CAAT.Math.Rectangle();
    - 99                 this.viewVertices = [
    -100                     new CAAT.Math.Point(0, 0, 0),
    -101                     new CAAT.Math.Point(0, 0, 0),
    -102                     new CAAT.Math.Point(0, 0, 0),
    -103                     new CAAT.Math.Point(0, 0, 0)
    -104                 ];
    -105 
    -106                 this.scaleAnchor = CAAT.Foundation.Actor.ANCHOR_CENTER;
    -107 
    -108                 this.modelViewMatrix = new CAAT.Math.Matrix();
    -109                 this.worldModelViewMatrix = new CAAT.Math.Matrix();
    -110 
    -111                 this.resetTransform();
    -112                 this.setScale(1, 1);
    -113                 this.setRotation(0);
    -114 
    -115                 this.id = __index++;
    -116 
    -117                 return this;
    -118             },
    -119 
    -120             /**
    -121              * @type {object}
    -122              */
    -123             __super : null,
    -124 
    -125             /**
    -126              * A collection of this Actors lifecycle observers.
    -127              * @type { Array.<{actorLifeCycleEvent : function( CAAT.Foundation.Actor, string, number ) }> }
    -128              */
    -129             lifecycleListenerList:null,
    -130 
    -131             /**
    -132              * A collection of behaviors to modify this actor´s properties.
    -133              * @type { Array.<CAAT.Behavior.Behavior> }
    -134              */
    -135             behaviorList:null,
    -136 
    -137             /**
    -138              * This actor's parent container.
    -139              * @type { CAAT.Foundation.ActorContainer }
    -140              */
    -141             parent:null, // Parent of this Actor. May be Scene.
    -142 
    -143             /**
    -144              * x position on parent. In parent's local coord. system.
    -145              * @type {number}
    -146              */
    -147             x:0,
    -148             /**
    -149              * y position on parent. In parent's local coord. system.
    -150              * @type {number}
    -151              */
    -152             y:0,
    -153 
    -154             /**
    -155              * Actor's width. In parent's local coord. system.
    -156              * @type {number}
    -157              */
    -158             width:0,
    -159 
    -160             /**
    -161              * Actor's height. In parent's local coord. system.
    -162              * @type {number}
    -163              */
    -164             height:0,
    -165 
    -166             /**
    -167              * actor´s layout preferred size.
    -168              * @type {CAAT.Math.Dimension}
    -169              */
    -170             preferredSize:null,
    -171 
    -172             /**
    -173              * actor's layout minimum size.
    -174              * @type {CAAT.Math.Dimension}
    -175              */
    -176             minimumSize:null,
    -177 
    -178             /**
    -179              * Marks since when this actor, relative to scene time, is going to be animated/drawn.
    -180              * @type {number}
    -181              */
    -182             start_time:0,
    -183 
    -184             /**
    -185              * Marks from the time this actor is going to be animated, during how much time.
    -186              * Forever by default.
    -187              * @type {number}
    -188              */
    -189             duration:Number.MAX_VALUE,
    -190 
    -191             /**
    -192              * Will this actor be clipped before being drawn on screen ?
    -193              * @type {boolean}
    -194              */
    -195             clip:false,
    -196 
    -197             /**
    -198              * If this.clip and this.clipPath===null, a rectangle will be used as clip area. Otherwise,
    -199              * clipPath contains a reference to a CAAT.PathUtil.Path object.
    -200              * @type {CAAT.PathUtil.Path}
    -201              */
    -202             clipPath:null,
    -203 
    -204             /**
    -205              * Translation x anchor. 0..1
    -206              * @type {number}
    -207              */
    -208             tAnchorX:0,
    -209 
    -210             /**
    -211              * Translation y anchor. 0..1
    -212              * @type {number}
    -213              */
    -214             tAnchorY:0,
    -215 
    -216             /**
    -217              * ScaleX value.
    -218              * @type {number}
    -219              */
    -220             scaleX:1, // transformation. width scale parameter
    -221 
    -222             /**
    -223              * ScaleY value.
    -224              * @type {number}
    -225              */
    -226             scaleY:1, // transformation. height scale parameter
    -227 
    -228             /**
    -229              * Scale Anchor X. Value 0-1
    -230              * @type {number}
    -231              */
    -232             scaleTX:.50, // transformation. scale anchor x position
    -233 
    -234             /**
    -235              * Scale Anchor Y. Value 0-1
    -236              * @type {number}
    -237              */
    -238             scaleTY:.50, // transformation. scale anchor y position
    -239 
    -240             /**
    -241              * A value that corresponds to any CAAT.Foundation.Actor.ANCHOR_* value.
    -242              * @type {CAAT.Foundation.Actor.ANCHOR_*}
    -243              */
    -244             scaleAnchor:0, // transformation. scale anchor
    -245 
    -246             /**
    -247              * This actor´s rotation angle in radians.
    -248              * @type {number}
    -249              */
    -250             rotationAngle:0, // transformation. rotation angle in radians
    -251 
    -252             /**
    -253              * Rotation Anchor X. CAAT uses different Anchors for position, rotation and scale. Value 0-1.
    -254              * @type {number}
    -255              */
    -256             rotationY:.50, // transformation. rotation center y
    -257 
    -258             /**
    -259              * Rotation Anchor Y. CAAT uses different Anchors for position, rotation and scale. Value 0-1.
    -260              * @type {number}
    -261              */
    -262             rotationX:.50, // transformation. rotation center x
    -263 
    -264             /**
    -265              * Transparency value. 0 is totally transparent, 1 is totally opaque.
    -266              * @type {number}
    -267              */
    -268             alpha:1, // alpha transparency value
    -269 
    -270             /**
    -271              * true to make all children transparent, false, only this actor/container will be transparent.
    -272              * @type {boolean}
    -273              */
    -274             isGlobalAlpha:false, // is this a global alpha
    -275 
    -276             /**
    -277              * @type {number}
    -278              * @private
    -279              */
    -280             frameAlpha:1, // hierarchically calculated alpha for this Actor.
    -281 
    -282             /**
    -283              * Mark this actor as expired, or out of the scene time.
    -284              * @type {boolean}
    -285              */
    -286             expired:false,
    -287 
    -288             /**
    -289              * Mark this actor as discardable. If an actor is expired and mark as discardable, if will be
    -290              * removed from its parent.
    -291              * @type {boolean}
    -292              */
    -293             discardable:false, // set when you want this actor to be removed if expired
    -294 
    -295             /**
    -296              * @type {boolean}
    -297              */
    -298             pointed:false, // is the mouse pointer inside this actor
    -299 
    -300             /**
    -301              * Enable or disable input on this actor. By default, all actors receive input.
    -302              * See also priority lists.
    -303              * see demo4 for an example of input and priority lists.
    -304              * @type {boolean}
    -305              */
    -306             mouseEnabled:true, // events enabled ?
    -307 
    -308             /**
    -309              * Make this actor visible or not.
    -310              * An invisible actor avoids making any calculation, applying any behavior on it.
    -311              * @type {boolean}
    -312              */
    -313             visible:true,
    -314 
    -315             /**
    -316              * any canvas rendering valid fill style.
    -317              * @type {string}
    -318              */
    -319             fillStyle:null,
    -320 
    -321             /**
    -322              * any canvas rendering valid stroke style.
    -323              * @type {string}
    -324              */
    -325             strokeStyle:null,
    -326 
    -327             /**
    -328              * This actor´s scene time.
    -329              * @type {number}
    -330              */
    -331             time:0, // Cache Scene time.
    -332 
    -333             /**
    -334              * This rectangle keeps the axis aligned bounding box in screen coords of this actor.
    -335              * In can be used, among other uses, to realize whether two given actors collide regardless
    -336              * the affine transformation is being applied on them.
    -337              * @type {CAAT.Math.Rectangle}
    -338              */
    -339             AABB:null,
    -340 
    -341             /**
    -342              * These 4 CAAT.Math.Point objects are the vertices of this actor´s non axis aligned bounding
    -343              * box. If the actor is not rotated, viewVertices and AABB define the same bounding box.
    -344              * @type {Array.<CAAT.Math.Point>}
    -345              */
    -346             viewVertices:null, // model to view transformed vertices.
    -347 
    -348             /**
    -349              * Is this actor processed in the last frame ?
    -350              * @type {boolean}
    -351              */
    -352             inFrame:false, // boolean indicating whether this Actor was present on last frame.
    -353 
    -354             /**
    -355              * Local matrix dirtyness flag.
    -356              * @type {boolean}
    -357              * @private
    -358              */
    -359             dirty:true, // model view is dirty ?
    -360 
    -361             /**
    -362              * Global matrix dirtyness flag.
    -363              * @type {boolean}
    -364              * @private
    -365              */
    -366             wdirty:true, // world model view is dirty ?
    -367 
    -368             /**
    -369              * @type {number}
    -370              * @private
    -371              */
    -372             oldX:-1,
    -373 
    -374             /**
    -375              * @type {number}
    -376              * @private
    -377              */
    -378             oldY:-1,
    -379 
    -380             /**
    -381              * This actor´s affine transformation matrix.
    -382              * @type {CAAT.Math.Matrix}
    -383              */
    -384             modelViewMatrix:null, // model view matrix.
    -385 
    -386             /**
    -387              * This actor´s world affine transformation matrix.
    -388              * @type {CAAT.Math.Matrix}
    -389              */
    -390             worldModelViewMatrix:null, // world model view matrix.
    -391 
    -392             /**
    -393              * @type {CAAT.Math.Matrix}
    -394              */
    -395             modelViewMatrixI:null, // model view matrix.
    -396 
    -397             /**
    -398              * @type {CAAT.Math.Matrix}
    -399              */
    -400             worldModelViewMatrixI:null, // world model view matrix.
    -401 
    -402             /**
    -403              * Is this actor enabled on WebGL ?
    -404              * @type {boolean}
    -405              */
    -406             glEnabled:false,
    -407 
    -408             /**
    -409              * Define this actor´s background image.
    -410              * See SpriteImage object.
    -411              * @type {CAAT.Foundation.SpriteImage}
    -412              */
    -413             backgroundImage:null,
    -414 
    -415             /**
    -416              * Set this actor´ id so that it can be later identified easily.
    -417              * @type {object}
    -418              */
    -419             id:null,
    -420 
    -421             /**
    -422              * debug info.
    -423              * @type {number}
    -424              */
    -425             size_active:1, // number of animated children
    -426 
    -427             /**
    -428              * debug info.
    -429              * @type {number}
    -430              */
    -431             size_total:1,
    -432 
    -433             __d_ax:-1, // for drag-enabled actors.
    -434             __d_ay:-1,
    -435 
    -436             /**
    -437              * Is gesture recognition enabled on this actor ??
    -438              * @type {boolean}
    -439              */
    -440             gestureEnabled:false,
    -441 
    -442             /**
    -443              * If dirty rects are enabled, this flag indicates the rendering engine to invalidate this
    -444              * actor´s screen area.
    -445              * @type {boolean}
    -446              */
    -447             invalid:true,
    -448 
    -449             /**
    -450              * Caching as bitmap strategy. Suitable to cache very complex actors.
    -451              *
    -452              * 0 : no cache.
    -453              * CACHE_SIMPLE : if a container, only cache the container.
    -454              * CACHE_DEEP : if a container, cache the container and recursively all of its children.
    -455              *
    -456              * @type {number}
    -457              */
    -458             cached:0, // 0 no, CACHE_SIMPLE | CACHE_DEEP
    -459 
    -460             /**
    -461              * Exclude this actor from automatic layout on its parent.
    -462              * @type {boolean}
    -463              */
    -464             preventLayout : false,
    -465 
    -466             /**
    -467              * is this actor/container Axis aligned ? if so, much faster inverse matrices can be calculated.
    -468              * @type {boolean}
    -469              * @private
    -470              */
    -471             isAA:true,
    -472 
    -473             /**
    -474              * if this actor is cached, when destroy is called, it does not call 'clean' method, which clears some
    -475              * internal properties.
    -476              */
    -477             isCachedActor : false,
    -478 
    -479             setCachedActor : function(cached) {
    -480                 this.isCachedActor= cached;
    -481                 return this;
    -482             },
    -483 
    -484             /**
    -485              * Make this actor not be laid out.
    -486              */
    -487             setPreventLayout : function(b) {
    -488                 this.preventLayout= b;
    -489                 return this;
    -490             },
    -491 
    -492             invalidateLayout:function () {
    -493                 if (this.parent && !this.parent.layoutInvalidated) {
    -494                     this.parent.invalidateLayout();
    -495                 }
    -496 
    -497                 return this;
    -498             },
    -499 
    -500             __validateLayout:function () {
    -501 
    -502             },
    -503 
    -504             /**
    -505              * Set this actors preferred layout size.
    -506              *
    -507              * @param pw {number}
    -508              * @param ph {number}
    -509              * @return {*}
    -510              */
    -511             setPreferredSize:function (pw, ph) {
    -512                 if (!this.preferredSize) {
    -513                     this.preferredSize = new CAAT.Math.Dimension();
    -514                 }
    -515                 this.preferredSize.width = pw;
    -516                 this.preferredSize.height = ph;
    -517                 return this;
    -518             },
    -519 
    -520             getPreferredSize:function () {
    -521                 return this.preferredSize ? this.preferredSize :
    -522                     this.getMinimumSize();
    -523             },
    -524 
    -525             /**
    -526              * Set this actors minimum layout size.
    -527              *
    -528              * @param pw {number}
    -529              * @param ph {number}
    -530              * @return {*}
    -531              */
    -532             setMinimumSize:function (pw, ph) {
    -533                 if (!this.minimumSize) {
    -534                     this.minimumSize = new CAAT.Math.Dimension();
    -535                 }
    -536 
    -537                 this.minimumSize.width = pw;
    -538                 this.minimumSize.height = ph;
    -539                 return this;
    -540             },
    -541 
    -542             getMinimumSize:function () {
    -543                 return this.minimumSize ? this.minimumSize :
    -544                     new CAAT.Math.Dimension(this.width, this.height);
    -545             },
    -546 
    -547             /**
    -548              * @deprecated
    -549              * @return {*}
    -550              */
    -551             create:function () {
    -552                 return this;
    -553             },
    -554             /**
    -555              * Move this actor to a position.
    -556              * It creates and adds a new PathBehavior.
    -557              * @param x {number} new x position
    -558              * @param y {number} new y position
    -559              * @param duration {number} time to take to get to new position
    -560              * @param delay {=number} time to wait before start moving
    -561              * @param interpolator {=CAAT.Behavior.Interpolator} a CAAT.Behavior.Interpolator instance
    -562              */
    -563             moveTo:function (x, y, duration, delay, interpolator, callback) {
    -564 
    -565                 if (x === this.x && y === this.y) {
    -566                     return;
    -567                 }
    -568 
    -569                 var id = '__moveTo';
    -570                 var b = this.getBehavior(id);
    -571                 if (!b) {
    -572                     b = new CAAT.Behavior.PathBehavior().
    -573                         setId(id).
    -574                         setValues(new CAAT.PathUtil.LinearPath());
    -575                     this.addBehavior(b);
    -576                 }
    -577 
    -578                 b.path.setInitialPosition(this.x, this.y).setFinalPosition(x, y);
    -579                 b.setDelayTime(delay ? delay : 0, duration);
    -580                 if (interpolator) {
    -581                     b.setInterpolator(interpolator);
    -582                 }
    -583 
    -584                 if (callback) {
    -585                     b.lifecycleListenerList = [];
    -586                     b.addListener({
    -587                         behaviorExpired:function (behavior, time, actor) {
    -588                             callback(behavior, time, actor);
    -589                         }
    -590                     });
    -591                 }
    -592 
    -593                 return this;
    -594             },
    -595 
    -596             /**
    -597              *
    -598              * @param angle {number} new rotation angle
    -599              * @param duration {number} time to rotate
    -600              * @param delay {number=} millis to start rotation
    -601              * @param anchorX {number=} rotation anchor x
    -602              * @param anchorY {number=} rotation anchor y
    -603              * @param interpolator {CAAT.Behavior.Interpolator=}
    -604              * @return {*}
    -605              */
    -606             rotateTo:function (angle, duration, delay, anchorX, anchorY, interpolator) {
    -607 
    -608                 if (angle === this.rotationAngle) {
    -609                     return;
    -610                 }
    -611 
    -612                 var id = '__rotateTo';
    -613                 var b = this.getBehavior(id);
    -614                 if (!b) {
    -615                     b = new CAAT.Behavior.RotateBehavior().
    -616                         setId(id).
    -617                         setValues(0, 0, .5, .5);
    -618                     this.addBehavior(b);
    -619                 }
    -620 
    -621                 b.setValues(this.rotationAngle, angle, anchorX, anchorY).
    -622                     setDelayTime(delay ? delay : 0, duration);
    -623 
    -624                 if (interpolator) {
    -625                     b.setInterpolator(interpolator);
    -626                 }
    -627 
    -628                 return this;
    -629             },
    -630 
    -631             /**
    -632              *
    -633              * @param scaleX {number} new X scale
    -634              * @param scaleY {number} new Y scale
    -635              * @param duration {number} time to rotate
    -636              * @param delay {=number} millis to start rotation
    -637              * @param anchorX {=number} rotation anchor x
    -638              * @param anchorY {=number} rotation anchor y
    -639              * @param interpolator {=CAAT.Behavior.Interpolator}
    -640              * @return {*}
    -641              */
    -642             scaleTo:function (scaleX, scaleY, duration, delay, anchorX, anchorY, interpolator) {
    -643 
    -644                 if (this.scaleX === scaleX && this.scaleY === scaleY) {
    -645                     return;
    -646                 }
    -647 
    -648                 var id = '__scaleTo';
    -649                 var b = this.getBehavior(id);
    -650                 if (!b) {
    -651                     b = new CAAT.Behavior.ScaleBehavior().
    -652                         setId(id).
    -653                         setValues(1, 1, 1, 1, .5, .5);
    -654                     this.addBehavior(b);
    -655                 }
    -656 
    -657                 b.setValues(this.scaleX, scaleX, this.scaleY, scaleY, anchorX, anchorY).
    -658                     setDelayTime(delay ? delay : 0, duration);
    -659 
    -660                 if (interpolator) {
    -661                     b.setInterpolator(interpolator);
    -662                 }
    -663 
    -664                 return this;
    -665             },
    -666 
    -667             /**
    -668              *
    -669              * @param scaleX {number} new X scale
    -670              * @param duration {number} time to rotate
    -671              * @param delay {=number} millis to start rotation
    -672              * @param anchorX {=number} rotation anchor x
    -673              * @param anchorY {=number} rotation anchor y
    -674              * @param interpolator {=CAAT.Behavior.Interpolator}
    -675              * @return {*}
    -676              */
    -677             scaleXTo:function (scaleX, duration, delay, anchorX, anchorY, interpolator) {
    -678                 return this.__scale1To(
    -679                     CAAT.Behavior.Scale1Behavior.AXIS_X,
    -680                     scaleX,
    -681                     duration,
    -682                     delay,
    -683                     anchorX,
    -684                     anchorY,
    -685                     interpolator
    -686                 );
    -687             },
    -688 
    -689             /**
    -690              *
    -691              * @param scaleY {number} new Y scale
    -692              * @param duration {number} time to rotate
    -693              * @param delay {=number} millis to start rotation
    -694              * @param anchorX {=number} rotation anchor x
    -695              * @param anchorY {=number} rotation anchor y
    -696              * @param interpolator {=CAAT.Behavior.Interpolator}
    -697              * @return {*}
    -698              */
    -699             scaleYTo:function (scaleY, duration, delay, anchorX, anchorY, interpolator) {
    -700                 return this.__scale1To(
    -701                     CAAT.Behavior.Scale1Behavior.AXIS_Y,
    -702                     scaleY,
    -703                     duration,
    -704                     delay,
    -705                     anchorX,
    -706                     anchorY,
    -707                     interpolator
    -708                 );
    -709             },
    -710 
    -711             /**
    -712              * @param axis {CAAT.Scale1Behavior.AXIS_X|CAAT.Scale1Behavior.AXIS_Y} scale application axis
    -713              * @param scale {number} new Y scale
    -714              * @param duration {number} time to rotate
    -715              * @param delay {=number} millis to start rotation
    -716              * @param anchorX {=number} rotation anchor x
    -717              * @param anchorY {=number} rotation anchor y
    -718              * @param interpolator {=CAAT.Bahavior.Interpolator}
    -719              * @return {*}
    -720              */
    -721             __scale1To:function (axis, scale, duration, delay, anchorX, anchorY, interpolator) {
    -722 
    -723                 if (( axis === CAAT.Behavior.Scale1Behavior.AXIS_X && scale === this.scaleX) ||
    -724                     ( axis === CAAT.Behavior.Scale1Behavior.AXIS_Y && scale === this.scaleY)) {
    -725 
    -726                     return;
    -727                 }
    -728 
    -729                 var id = '__scaleXTo';
    -730                 var b = this.getBehavior(id);
    -731                 if (!b) {
    -732                     b = new CAAT.Behavior.Scale1Behavior().
    -733                         setId(id).
    -734                         setValues(1, 1, axis === CAAT.Behavior.Scale1Behavior.AXIS_X, .5, .5);
    -735                     this.addBehavior(b);
    -736                 }
    -737 
    -738                 b.setValues(
    -739                     axis ? this.scaleX : this.scaleY,
    -740                     scale,
    -741                     anchorX,
    -742                     anchorY).
    -743                     setDelayTime(delay ? delay : 0, duration);
    -744 
    -745                 if (interpolator) {
    -746                     b.setInterpolator(interpolator);
    -747                 }
    -748 
    -749                 return this;
    -750             },
    -751 
    -752             /**
    -753              * Touch Start only received when CAAT.TOUCH_BEHAVIOR= CAAT.TOUCH_AS_MULTITOUCH
    -754              * @param e <CAAT.TouchEvent>
    -755              */
    -756             touchStart:function (e) {
    -757             },
    -758             touchMove:function (e) {
    -759             },
    -760             touchEnd:function (e) {
    -761             },
    -762             gestureStart:function (rotation, scaleX, scaleY) {
    -763             },
    -764             gestureChange:function (rotation, scaleX, scaleY) {
    -765                 if (this.gestureEnabled) {
    -766                     this.setRotation(rotation);
    -767                     this.setScale(scaleX, scaleY);
    -768                 }
    -769                 return this;
    -770             },
    -771             gestureEnd:function (rotation, scaleX, scaleY) {
    -772             },
    -773 
    -774             isVisible:function () {
    -775                 return this.visible;
    -776             },
    -777 
    -778             invalidate:function () {
    -779                 this.invalid = true;
    -780                 return this;
    -781             },
    -782             setGestureEnabled:function (enable) {
    -783                 this.gestureEnabled = !!enable;
    -784                 return this;
    -785             },
    -786             isGestureEnabled:function () {
    -787                 return this.gestureEnabled;
    -788             },
    -789             getId:function () {
    -790                 return this.id;
    -791             },
    -792             setId:function (id) {
    -793                 this.id = id;
    -794                 return this;
    -795             },
    -796             /**
    -797              * Set this actor's parent.
    -798              * @param parent {CAAT.Foundation.ActorContainer}
    -799              * @return this
    -800              */
    -801             setParent:function (parent) {
    -802                 this.parent = parent;
    -803                 return this;
    -804             },
    -805             /**
    -806              * Set this actor's background image.
    -807              * The need of a background image is to kept compatibility with the new CSSDirector class.
    -808              * The image parameter can be either an Image/Canvas or a CAAT.Foundation.SpriteImage instance. If an image
    -809              * is supplied, it will be wrapped into a CAAT.Foundation.SriteImage instance of 1 row by 1 column.
    -810              * If the actor has set an image in the background, the paint method will draw the image, otherwise
    -811              * and if set, will fill its background with a solid color.
    -812              * If adjust_size_to_image is true, the host actor will be redimensioned to the size of one
    -813              * single image from the SpriteImage (either supplied or generated because of passing an Image or
    -814              * Canvas to the function). That means the size will be set to [width:SpriteImage.singleWidth,
    -815              * height:singleHeight].
    -816              *
    -817              * WARN: if using a CSS renderer, the image supplied MUST be a HTMLImageElement instance.
    -818              *
    -819              * @see CAAT.Foundation.SpriteImage
    -820              *
    -821              * @param image {Image|HTMLCanvasElement|CAAT.Foundation.SpriteImage}
    -822              * @param adjust_size_to_image {boolean} whether to set this actor's size based on image parameter.
    -823              *
    -824              * @return this
    -825              */
    -826             setBackgroundImage:function (image, adjust_size_to_image) {
    -827                 if (image) {
    -828                     if (!(image instanceof CAAT.Foundation.SpriteImage)) {
    -829                         if ( isString(image) ) {
    -830                             image = new CAAT.Foundation.SpriteImage().initialize(CAAT.currentDirector.getImage(image), 1, 1);
    -831                         } else {
    -832                             image = new CAAT.Foundation.SpriteImage().initialize(image, 1, 1);
    -833                         }
    -834                     } else {
    -835                         image= image.getRef();
    -836                     }
    -837 
    -838                     image.setOwner(this);
    -839                     this.backgroundImage = image;
    -840                     if (typeof adjust_size_to_image === 'undefined' || adjust_size_to_image) {
    -841                         this.width = image.getWidth();
    -842                         this.height = image.getHeight();
    -843                     }
    -844 
    -845                     this.glEnabled = true;
    -846 
    -847                     this.invalidate();
    -848 
    -849                 } else {
    -850                     this.backgroundImage = null;
    -851                 }
    -852 
    -853                 return this;
    -854             },
    -855             /**
    -856              * Set the actor's SpriteImage index from animation sheet.
    -857              * @see CAAT.Foundation.SpriteImage
    -858              * @param index {number}
    -859              *
    -860              * @return this
    -861              */
    -862             setSpriteIndex:function (index) {
    -863                 if (this.backgroundImage) {
    -864                     this.backgroundImage.setSpriteIndex(index);
    -865                     this.invalidate();
    -866                 }
    -867 
    -868                 return this;
    -869 
    -870             },
    -871             /**
    -872              * Set this actor's background SpriteImage offset displacement.
    -873              * The values can be either positive or negative meaning the texture space of this background
    -874              * image does not start at (0,0) but at the desired position.
    -875              * @see CAAT.Foundation.SpriteImage
    -876              * @param ox {number} horizontal offset
    -877              * @param oy {number} vertical offset
    -878              *
    -879              * @return this
    -880              */
    -881             setBackgroundImageOffset:function (ox, oy) {
    -882                 if (this.backgroundImage) {
    -883                     this.backgroundImage.setOffset(ox, oy);
    -884                 }
    -885 
    -886                 return this;
    -887             },
    -888             /**
    -889              * Set this actor's background SpriteImage its animation sequence.
    -890              * In its simplet's form a SpriteImage treats a given image as an array of rows by columns
    -891              * subimages. If you define d Sprite Image of 2x2, you'll be able to draw any of the 4 subimages.
    -892              * This method defines the animation sequence so that it could be set [0,2,1,3,2,1] as the
    -893              * animation sequence
    -894              * @param ii {Array<number>} an array of integers.
    -895              */
    -896             setAnimationImageIndex:function (ii) {
    -897                 if (this.backgroundImage) {
    -898                     this.backgroundImage.resetAnimationTime();
    -899                     this.backgroundImage.setAnimationImageIndex(ii);
    -900                     this.invalidate();
    -901                 }
    -902                 return this;
    -903             },
    -904 
    -905             addAnimation : function( name, array, time, callback ) {
    -906                 if (this.backgroundImage) {
    -907                     this.backgroundImage.addAnimation(name, array, time, callback);
    -908                 }
    -909                 return this;
    -910             },
    -911 
    -912             playAnimation : function(name) {
    -913                 if (this.backgroundImage) {
    -914                     this.backgroundImage.playAnimation(name);
    -915                 }
    -916                 return this;
    -917             },
    -918 
    -919             setAnimationEndCallback : function(f) {
    -920                 if (this.backgroundImage) {
    -921                     this.backgroundImage.setAnimationEndCallback(f);
    -922                 }
    -923                 return this;
    -924             },
    -925 
    -926             resetAnimationTime:function () {
    -927                 if (this.backgroundImage) {
    -928                     this.backgroundImage.resetAnimationTime();
    -929                     this.invalidate();
    -930                 }
    -931                 return this;
    -932             },
    -933 
    -934             setChangeFPS:function (time) {
    -935                 if (this.backgroundImage) {
    -936                     this.backgroundImage.setChangeFPS(time);
    -937                 }
    -938                 return this;
    -939 
    -940             },
    -941             /**
    -942              * Set this background image transformation.
    -943              * If GL is enabled, this parameter has no effect.
    -944              * @param it any value from CAAT.Foundation.SpriteImage.TR_*
    -945              * @return this
    -946              */
    -947             setImageTransformation:function (it) {
    -948                 if (this.backgroundImage) {
    -949                     this.backgroundImage.setSpriteTransformation(it);
    -950                 }
    -951                 return this;
    -952             },
    -953             /**
    -954              * Center this actor at position (x,y).
    -955              * @param x {number} x position
    -956              * @param y {number} y position
    -957              *
    -958              * @return this
    -959              * @deprecated
    -960              */
    -961             centerOn:function (x, y) {
    -962                 this.setPosition(x - this.width / 2, y - this.height / 2);
    -963                 return this;
    -964             },
    -965             /**
    -966              * Center this actor at position (x,y).
    -967              * @param x {number} x position
    -968              * @param y {number} y position
    -969              *
    -970              * @return this
    -971              */
    -972             centerAt:function (x, y) {
    -973                 this.setPosition(
    -974                     x - this.width * (.5 - this.tAnchorX ),
    -975                     y - this.height * (.5 - this.tAnchorY ) );
    -976                 return this;
    -977             },
    -978             /**
    -979              * If GL is enables, get this background image's texture page, otherwise it will fail.
    -980              * @return {CAAT.GLTexturePage}
    -981              */
    -982             getTextureGLPage:function () {
    -983                 return this.backgroundImage.image.__texturePage;
    -984             },
    -985             /**
    -986              * Set this actor invisible.
    -987              * The actor is animated but not visible.
    -988              * A container won't show any of its children if set visible to false.
    -989              *
    -990              * @param visible {boolean} set this actor visible or not.
    -991              * @return this
    -992              */
    -993             setVisible:function (visible) {
    -994                 this.invalidate();
    -995                 // si estoy visible y quiero hacerme no visible
    -996                 if (CAAT.currentDirector && CAAT.currentDirector.dirtyRectsEnabled && !visible && this.visible) {
    -997                     // if dirty rects, add this actor
    -998                     CAAT.currentDirector.scheduleDirtyRect(this.AABB);
    -999                 }
    -1000 
    -1001                 if ( visible && !this.visible) {
    -1002                     this.dirty= true;
    -1003                 }
    -1004 
    -1005                 this.visible = visible;
    -1006                 return this;
    -1007             },
    -1008             /**
    -1009              * Puts an Actor out of time line, that is, won't be transformed nor rendered.
    -1010              * @return this
    -1011              */
    -1012             setOutOfFrameTime:function () {
    -1013                 this.setFrameTime(-1, 0);
    -1014                 return this;
    -1015             },
    -1016             /**
    -1017              * Adds an Actor's life cycle listener.
    -1018              * The developer must ensure the actorListener is not already a listener, otherwise
    -1019              * it will notified more than once.
    -1020              * @param actorListener {object} an object with at least a method of the form:
    -1021              * <code>actorLyfeCycleEvent( actor, string_event_type, long_time )</code>
    -1022              */
    -1023             addListener:function (actorListener) {
    -1024                 this.lifecycleListenerList.push(actorListener);
    -1025                 return this;
    -1026             },
    -1027             /**
    -1028              * Removes an Actor's life cycle listener.
    -1029              * It will only remove the first occurrence of the given actorListener.
    -1030              * @param actorListener {object} an Actor's life cycle listener.
    -1031              */
    -1032             removeListener:function (actorListener) {
    -1033                 var n = this.lifecycleListenerList.length;
    -1034                 while (n--) {
    -1035                     if (this.lifecycleListenerList[n] === actorListener) {
    -1036                         // remove the nth element.
    -1037                         this.lifecycleListenerList.splice(n, 1);
    -1038                         return;
    -1039                     }
    -1040                 }
    -1041             },
    -1042             /**
    -1043              * Set alpha composition scope. global will mean this alpha value will be its children maximum.
    -1044              * If set to false, only this actor will have this alpha value.
    -1045              * @param global {boolean} whether the alpha value should be propagated to children.
    -1046              */
    -1047             setGlobalAlpha:function (global) {
    -1048                 this.isGlobalAlpha = global;
    -1049                 return this;
    -1050             },
    -1051             /**
    -1052              * Notifies the registered Actor's life cycle listener about some event.
    -1053              * @param sEventType an string indicating the type of event being notified.
    -1054              * @param time an integer indicating the time related to Scene's timeline when the event
    -1055              * is being notified.
    -1056              */
    -1057             fireEvent:function (sEventType, time) {
    -1058                 for (var i = 0; i < this.lifecycleListenerList.length; i++) {
    -1059                     this.lifecycleListenerList[i].actorLifeCycleEvent(this, sEventType, time);
    -1060                 }
    -1061             },
    -1062             /**
    -1063              * Sets this Actor as Expired.
    -1064              * If this is a Container, all the contained Actors won't be nor drawn nor will receive
    -1065              * any event. That is, expiring an Actor means totally taking it out the Scene's timeline.
    -1066              * @param time {number} an integer indicating the time the Actor was expired at.
    -1067              * @return this.
    -1068              */
    -1069             setExpired:function (time) {
    -1070                 this.expired = true;
    -1071                 this.fireEvent('expired', time);
    -1072                 return this;
    -1073             },
    -1074             /**
    -1075              * Enable or disable the event bubbling for this Actor.
    -1076              * @param enable {boolean} a boolean indicating whether the event bubbling is enabled.
    -1077              * @return this
    -1078              */
    -1079             enableEvents:function (enable) {
    -1080                 this.mouseEnabled = enable;
    -1081                 return this;
    -1082             },
    -1083             /**
    -1084              * Removes all behaviors from an Actor.
    -1085              * @return this
    -1086              */
    -1087             emptyBehaviorList:function () {
    -1088                 this.behaviorList = [];
    -1089                 return this;
    -1090             },
    -1091             /**
    -1092              * Caches a fillStyle in the Actor.
    -1093              * @param style a valid Canvas rendering context fillStyle.
    -1094              * @return this
    -1095              */
    -1096             setFillStyle:function (style) {
    -1097                 this.fillStyle = style;
    -1098                 this.invalidate();
    -1099                 return this;
    -1100             },
    -1101             /**
    -1102              * Caches a stroke style in the Actor.
    -1103              * @param style a valid canvas rendering context stroke style.
    -1104              * @return this
    -1105              */
    -1106             setStrokeStyle:function (style) {
    -1107                 this.strokeStyle = style;
    -1108                 this.invalidate();
    -1109                 return this;
    -1110             },
    -1111             /**
    -1112              * @deprecated
    -1113              * @param paint
    -1114              */
    -1115             setPaint:function (paint) {
    -1116                 return this.setFillStyle(paint);
    -1117             },
    -1118             /**
    -1119              * Stablishes the Alpha transparency for the Actor.
    -1120              * If it globalAlpha enabled, this alpha will the maximum alpha for every contained actors.
    -1121              * The alpha must be between 0 and 1.
    -1122              * @param alpha a float indicating the alpha value.
    -1123              * @return this
    -1124              */
    -1125             setAlpha:function (alpha) {
    -1126                 this.alpha = alpha;
    -1127                 this.invalidate();
    -1128                 return this;
    -1129             },
    -1130             /**
    -1131              * Remove all transformation values for the Actor.
    -1132              * @return this
    -1133              */
    -1134             resetTransform:function () {
    -1135                 this.rotationAngle = 0;
    -1136                 this.rotationX = .5;
    -1137                 this.rotationY = .5;
    -1138                 this.scaleX = 1;
    -1139                 this.scaleY = 1;
    -1140                 this.scaleTX = .5;
    -1141                 this.scaleTY = .5;
    -1142                 this.scaleAnchor = 0;
    -1143                 this.oldX = -1;
    -1144                 this.oldY = -1;
    -1145                 this.dirty = true;
    -1146 
    -1147                 return this;
    -1148             },
    -1149             /**
    -1150              * Sets the time life cycle for an Actor.
    -1151              * These values are related to Scene time.
    -1152              * @param startTime an integer indicating the time until which the Actor won't be visible on the Scene.
    -1153              * @param duration an integer indicating how much the Actor will last once visible.
    -1154              * @return this
    -1155              */
    -1156             setFrameTime:function (startTime, duration) {
    -1157                 this.start_time = startTime;
    -1158                 this.duration = duration;
    -1159                 this.expired = false;
    -1160                 this.dirty = true;
    -1161 
    -1162                 return this;
    -1163             },
    -1164             /**
    -1165              * This method should me overriden by every custom Actor.
    -1166              * It will be the drawing routine called by the Director to show every Actor.
    -1167              * @param director {CAAT.Foundation.Director} instance that contains the Scene the Actor is in.
    -1168              * @param time {number} indicating the Scene time in which the drawing is performed.
    -1169              */
    -1170             paint:function (director, time) {
    -1171                 if (this.backgroundImage) {
    -1172                     this.backgroundImage.paint(director, time, 0, 0);
    -1173                 } else if (this.fillStyle) {
    -1174                     var ctx = director.ctx;
    -1175                     ctx.fillStyle = this.fillStyle;
    -1176                     ctx.fillRect(0, 0, this.width, this.height);
    -1177                 }
    -1178 
    -1179             },
    -1180             /**
    -1181              * A helper method to setScaleAnchored with an anchor of ANCHOR_CENTER
    -1182              *
    -1183              * @see setScaleAnchored
    -1184              *
    -1185              * @param sx a float indicating a width size multiplier.
    -1186              * @param sy a float indicating a height size multiplier.
    -1187              * @return this
    -1188              */
    -1189             setScale:function (sx, sy) {
    -1190                 this.scaleX = sx;
    -1191                 this.scaleY = sy;
    -1192                 this.dirty = true;
    -1193                 return this;
    -1194             },
    -1195             getAnchorPercent:function (anchor) {
    -1196 
    -1197                 var anchors = [
    -1198                     .50, .50, .50, 0, .50, 1.00,
    -1199                     0, .50, 1.00, .50, 0, 0,
    -1200                     1.00, 0, 0, 1.00, 1.00, 1.00
    -1201                 ];
    -1202 
    -1203                 return { x:anchors[anchor * 2], y:anchors[anchor * 2 + 1] };
    -1204             },
    -1205             /**
    -1206              * Private.
    -1207              * Gets a given anchor position referred to the Actor.
    -1208              * @param anchor
    -1209              * @return an object of the form { x: float, y: float }
    -1210              */
    -1211             getAnchor:function (anchor) {
    -1212                 var tx = 0, ty = 0;
    -1213 
    -1214                 var A= CAAT.Foundation.Actor;
    -1215 
    -1216                 switch (anchor) {
    -1217                     case A.ANCHOR_CENTER:
    -1218                         tx = .5;
    -1219                         ty = .5;
    -1220                         break;
    -1221                     case A.ANCHOR_TOP:
    -1222                         tx = .5;
    -1223                         ty = 0;
    -1224                         break;
    -1225                     case A.ANCHOR_BOTTOM:
    -1226                         tx = .5;
    -1227                         ty = 1;
    -1228                         break;
    -1229                     case A.ANCHOR_LEFT:
    -1230                         tx = 0;
    -1231                         ty = .5;
    -1232                         break;
    -1233                     case A.ANCHOR_RIGHT:
    -1234                         tx = 1;
    -1235                         ty = .5;
    -1236                         break;
    -1237                     case A.ANCHOR_TOP_RIGHT:
    -1238                         tx = 1;
    -1239                         ty = 0;
    -1240                         break;
    -1241                     case A.ANCHOR_BOTTOM_LEFT:
    -1242                         tx = 0;
    -1243                         ty = 1;
    -1244                         break;
    -1245                     case A.ANCHOR_BOTTOM_RIGHT:
    -1246                         tx = 1;
    -1247                         ty = 1;
    -1248                         break;
    -1249                     case A.ANCHOR_TOP_LEFT:
    -1250                         tx = 0;
    -1251                         ty = 0;
    -1252                         break;
    -1253                 }
    -1254 
    -1255                 return {x:tx, y:ty};
    -1256             },
    -1257 
    -1258             setGlobalAnchor:function (ax, ay) {
    -1259                 this.tAnchorX = ax;
    -1260                 this.rotationX = ax;
    -1261                 this.scaleTX = ax;
    -1262 
    -1263                 this.tAnchorY = ay;
    -1264                 this.rotationY = ay;
    -1265                 this.scaleTY = ay;
    -1266 
    -1267                 this.dirty = true;
    -1268                 return this;
    -1269             },
    -1270 
    -1271             setScaleAnchor:function (sax, say) {
    -1272                 this.scaleTX = sax;
    -1273                 this.scaleTY = say;
    -1274                 this.dirty = true;
    -1275                 return this;
    -1276             },
    -1277             /**
    -1278              * Modify the dimensions on an Actor.
    -1279              * The dimension will not affect the local coordinates system in opposition
    -1280              * to setSize or setBounds.
    -1281              *
    -1282              * @param sx {number} width scale.
    -1283              * @param sy {number} height scale.
    -1284              * @param anchorx {number} x anchor to perform the Scale operation.
    -1285              * @param anchory {number} y anchor to perform the Scale operation.
    -1286              *
    -1287              * @return this;
    -1288              */
    -1289             setScaleAnchored:function (sx, sy, anchorx, anchory) {
    -1290                 this.scaleTX = anchorx;
    -1291                 this.scaleTY = anchory;
    -1292 
    -1293                 this.scaleX = sx;
    -1294                 this.scaleY = sy;
    -1295 
    -1296                 this.dirty = true;
    -1297 
    -1298                 return this;
    -1299             },
    -1300 
    -1301             setRotationAnchor:function (rax, ray) {
    -1302                 this.rotationX = ray;
    -1303                 this.rotationY = rax;
    -1304                 this.dirty = true;
    -1305                 return this;
    -1306             },
    -1307             /**
    -1308              * A helper method for setRotationAnchored. This methods stablishes the center
    -1309              * of rotation to be the center of the Actor.
    -1310              *
    -1311              * @param angle a float indicating the angle in radians to rotate the Actor.
    -1312              * @return this
    -1313              */
    -1314             setRotation:function (angle) {
    -1315                 this.rotationAngle = angle;
    -1316                 this.dirty = true;
    -1317                 return this;
    -1318             },
    -1319             /**
    -1320              * This method sets Actor rotation around a given position.
    -1321              * @param angle {number} indicating the angle in radians to rotate the Actor.
    -1322              * @param rx {number} value in the range 0..1
    -1323              * @param ry {number} value in the range 0..1
    -1324              * @return this;
    -1325              */
    -1326             setRotationAnchored:function (angle, rx, ry) {
    -1327                 this.rotationAngle = angle;
    -1328                 this.rotationX = rx;
    -1329                 this.rotationY = ry;
    -1330                 this.dirty = true;
    -1331                 return this;
    -1332             },
    -1333             /**
    -1334              * Sets an Actor's dimension
    -1335              * @param w a float indicating Actor's width.
    -1336              * @param h a float indicating Actor's height.
    -1337              * @return this
    -1338              */
    -1339             setSize:function (w, h) {
    -1340 
    -1341                 this.width = w;
    -1342                 this.height = h;
    -1343 
    -1344                 this.dirty = true;
    -1345 
    -1346                 return this;
    -1347             },
    -1348             /**
    -1349              * Set location and dimension of an Actor at once.
    -1350              *
    -1351              * @param x{number} a float indicating Actor's x position.
    -1352              * @param y{number} a float indicating Actor's y position
    -1353              * @param w{number} a float indicating Actor's width
    -1354              * @param h{number} a float indicating Actor's height
    -1355              * @return this
    -1356              */
    -1357             setBounds:function (x, y, w, h) {
    -1358 
    -1359                 this.x = x;
    -1360                 this.y = y;
    -1361                 this.width = w;
    -1362                 this.height = h;
    -1363 
    -1364                 this.dirty = true;
    -1365 
    -1366                 return this;
    -1367             },
    -1368             /**
    -1369              * This method sets the position of an Actor inside its parent.
    -1370              *
    -1371              * @param x{number} a float indicating Actor's x position
    -1372              * @param y{number} a float indicating Actor's y position
    -1373              * @return this
    -1374              *
    -1375              * @deprecated
    -1376              */
    -1377             setLocation:function (x, y) {
    -1378                 this.x = x;
    -1379                 this.y = y;
    -1380                 this.oldX = x;
    -1381                 this.oldY = y;
    -1382 
    -1383                 this.dirty = true;
    -1384 
    -1385                 return this;
    -1386             },
    -1387 
    -1388             setPosition:function (x, y) {
    -1389                 return this.setLocation(x, y);
    -1390             },
    -1391 
    -1392             setPositionAnchor:function (pax, pay) {
    -1393                 this.tAnchorX = pax;
    -1394                 this.tAnchorY = pay;
    -1395                 return this;
    -1396             },
    -1397 
    -1398             setPositionAnchored:function (x, y, pax, pay) {
    -1399                 this.setLocation(x, y);
    -1400                 this.tAnchorX = pax;
    -1401                 this.tAnchorY = pay;
    -1402                 return this;
    -1403             },
    -1404 
    -1405 
    -1406             /**
    -1407              * This method is called by the Director to know whether the actor is on Scene time.
    -1408              * In case it was necessary, this method will notify any life cycle behaviors about
    -1409              * an Actor expiration.
    -1410              * @param time {number} time indicating the Scene time.
    -1411              *
    -1412              * @private
    -1413              *
    -1414              */
    -1415             isInAnimationFrame:function (time) {
    -1416                 if (this.expired) {
    -1417                     return false;
    -1418                 }
    -1419 
    -1420                 if (this.duration === Number.MAX_VALUE) {
    -1421                     return this.start_time <= time;
    -1422                 }
    -1423 
    -1424                 if (time >= this.start_time + this.duration) {
    -1425                     if (!this.expired) {
    -1426                         this.setExpired(time);
    -1427                     }
    -1428 
    -1429                     return false;
    -1430                 }
    -1431 
    -1432                 return this.start_time <= time && time < this.start_time + this.duration;
    -1433             },
    -1434             /**
    -1435              * Checks whether a coordinate is inside the Actor's bounding box.
    -1436              * @param x {number} a float
    -1437              * @param y {number} a float
    -1438              *
    -1439              * @return boolean indicating whether it is inside.
    -1440              */
    -1441             contains:function (x, y) {
    -1442                 return x >= 0 && y >= 0 && x < this.width && y < this.height;
    -1443             },
    -1444 
    -1445             /**
    -1446              * Add a Behavior to the Actor.
    -1447              * An Actor accepts an undefined number of Behaviors.
    -1448              *
    -1449              * @param behavior {CAAT.Behavior.BaseBehavior}
    -1450              * @return this
    -1451              */
    -1452             addBehavior:function (behavior) {
    -1453                 this.behaviorList.push(behavior);
    -1454                 return this;
    -1455             },
    -1456 
    -1457             /**
    -1458              * Remove a Behavior from the Actor.
    -1459              * If the Behavior is not present at the actor behavior collection nothing happends.
    -1460              *
    -1461              * @param behavior {CAAT.Behavior.BaseBehavior}
    -1462              */
    -1463             removeBehaviour:function (behavior) {
    -1464                 var c = this.behaviorList;
    -1465                 var n = c.length - 1;
    -1466                 while (n) {
    -1467                     if (c[n] === behavior) {
    -1468                         c.splice(n, 1);
    -1469                         return this;
    -1470                     }
    -1471                 }
    -1472                 return this;
    -1473             },
    -1474             /**
    -1475              * Remove a Behavior with id param as behavior identifier from this actor.
    -1476              * This function will remove ALL behavior instances with the given id.
    -1477              *
    -1478              * @param id {number} an integer.
    -1479              * return this;
    -1480              */
    -1481             removeBehaviorById:function (id) {
    -1482                 var c = this.behaviorList;
    -1483                 for (var n = 0; n < c.length; n++) {
    -1484                     if (c[n].id === id) {
    -1485                         c.splice(n, 1);
    -1486                     }
    -1487                 }
    -1488 
    -1489                 return this;
    -1490 
    -1491             },
    -1492             getBehavior:function (id) {
    -1493                 var c = this.behaviorList;
    -1494                 for (var n = 0; n < c.length; n++) {
    -1495                     var cc = c[n];
    -1496                     if (cc.id === id) {
    -1497                         return cc;
    -1498                     }
    -1499                 }
    -1500                 return null;
    -1501             },
    -1502             /**
    -1503              * Set discardable property. If an actor is discardable, upon expiration will be removed from
    -1504              * scene graph and hence deleted.
    -1505              * @param discardable {boolean} a boolean indicating whether the Actor is discardable.
    -1506              * @return this
    -1507              */
    -1508             setDiscardable:function (discardable) {
    -1509                 this.discardable = discardable;
    -1510                 return this;
    -1511             },
    -1512             /**
    -1513              * This method will be called internally by CAAT when an Actor is expired, and at the
    -1514              * same time, is flagged as discardable.
    -1515              * It notifies the Actor life cycle listeners about the destruction event.
    -1516              *
    -1517              * @param time an integer indicating the time at wich the Actor has been destroyed.
    -1518              *
    -1519              * @private
    -1520              *
    -1521              */
    -1522             destroy:function (time) {
    -1523                 if (this.parent) {
    -1524                     this.parent.removeChild(this);
    -1525                 }
    -1526 
    -1527                 this.fireEvent('destroyed', time);
    -1528                 if ( !this.isCachedActor ) {
    -1529                     this.clean();
    -1530                 }
    -1531 
    -1532             },
    -1533 
    -1534             clean : function() {
    -1535                 this.backgroundImage= null;
    -1536                 this.emptyBehaviorList();
    -1537                 this.lifecycleListenerList= [];
    -1538             },
    -1539 
    -1540             /**
    -1541              * Transform a point or array of points in model space to view space.
    -1542              *
    -1543              * @param point {CAAT.Math.Point|Array} an object of the form {x : float, y: float}
    -1544              *
    -1545              * @return the source transformed elements.
    -1546              *
    -1547              * @private
    -1548              *
    -1549              */
    -1550             modelToView:function (point) {
    -1551                 var x, y, pt, tm;
    -1552 
    -1553                 if (this.dirty) {
    -1554                     this.setModelViewMatrix();
    -1555                 }
    -1556 
    -1557                 tm = this.worldModelViewMatrix.matrix;
    -1558 
    -1559                 if (point instanceof Array) {
    -1560                     for (var i = 0; i < point.length; i++) {
    -1561                         //this.worldModelViewMatrix.transformCoord(point[i]);
    -1562                         pt = point[i];
    -1563                         x = pt.x;
    -1564                         y = pt.y;
    -1565                         pt.x = x * tm[0] + y * tm[1] + tm[2];
    -1566                         pt.y = x * tm[3] + y * tm[4] + tm[5];
    -1567                     }
    -1568                 }
    -1569                 else {
    -1570 //                this.worldModelViewMatrix.transformCoord(point);
    -1571                     x = point.x;
    -1572                     y = point.y;
    -1573                     point.x = x * tm[0] + y * tm[1] + tm[2];
    -1574                     point.y = x * tm[3] + y * tm[4] + tm[5];
    -1575                 }
    -1576 
    -1577                 return point;
    -1578             },
    -1579             /**
    -1580              * Transform a local coordinate point on this Actor's coordinate system into
    -1581              * another point in otherActor's coordinate system.
    -1582              * @param point {CAAT.Math.Point}
    -1583              * @param otherActor {CAAT.Math.Actor}
    -1584              */
    -1585             modelToModel:function (point, otherActor) {
    -1586                 if (this.dirty) {
    -1587                     this.setModelViewMatrix();
    -1588                 }
    -1589 
    -1590                 return otherActor.viewToModel(this.modelToView(point));
    -1591             },
    -1592             /**
    -1593              * Transform a point from model to view space.
    -1594              * <p>
    -1595              * WARNING: every call to this method calculates
    -1596              * actor's world model view matrix.
    -1597              *
    -1598              * @param point {CAAT.Math.Point} a point in screen space to be transformed to model space.
    -1599              *
    -1600              * @return the source point object
    -1601              *
    -1602              *
    -1603              */
    -1604             viewToModel:function (point) {
    -1605                 if (this.dirty) {
    -1606                     this.setModelViewMatrix();
    -1607                 }
    -1608                 this.worldModelViewMatrixI = this.worldModelViewMatrix.getInverse();
    -1609                 this.worldModelViewMatrixI.transformCoord(point);
    -1610                 return point;
    -1611             },
    -1612             /**
    -1613              * Private
    -1614              * This method does the needed point transformations across an Actor hierarchy to devise
    -1615              * whether the parameter point coordinate lies inside the Actor.
    -1616              * @param point {CAAT.Math.Point}
    -1617              *
    -1618              * @return null if the point is not inside the Actor. The Actor otherwise.
    -1619              */
    -1620             findActorAtPosition:function (point) {
    -1621                 if (this.scaleX===0 || this.scaleY===0) {
    -1622                     return null;
    -1623                 }
    -1624                 if (!this.visible || !this.mouseEnabled || !this.isInAnimationFrame(this.time)) {
    -1625                     return null;
    -1626                 }
    -1627 
    -1628                 this.modelViewMatrixI = this.modelViewMatrix.getInverse();
    -1629                 this.modelViewMatrixI.transformCoord(point);
    -1630                 return this.contains(point.x, point.y) ? this : null;
    -1631             },
    -1632             /**
    -1633              * Enables a default dragging routine for the Actor.
    -1634              * This default dragging routine allows to:
    -1635              *  <li>scale the Actor by pressing shift+drag
    -1636              *  <li>rotate the Actor by pressing control+drag
    -1637              *  <li>scale non uniformly by pressing alt+shift+drag
    -1638              *
    -1639              * @return this
    -1640              */
    -1641             enableDrag:function () {
    -1642 
    -1643                 this.ax = 0;
    -1644                 this.ay = 0;
    -1645                 this.asx = 1;
    -1646                 this.asy = 1;
    -1647                 this.ara = 0;
    -1648                 this.screenx = 0;
    -1649                 this.screeny = 0;
    -1650 
    -1651                 /**
    -1652                  * Mouse enter handler for default drag behavior.
    -1653                  * @param mouseEvent {CAAT.Event.MouseEvent}
    -1654                  *
    -1655                  * @ignore
    -1656                  */
    -1657                 this.mouseEnter = function (mouseEvent) {
    -1658                     this.__d_ax = -1;
    -1659                     this.__d_ay = -1;
    -1660                     this.pointed = true;
    -1661                     CAAT.setCursor('move');
    -1662                 };
    -1663 
    -1664                 /**
    -1665                  * Mouse exit handler for default drag behavior.
    -1666                  * @param mouseEvent {CAAT.Event.MouseEvent}
    -1667                  *
    -1668                  * @ignore
    -1669                  */
    -1670                 this.mouseExit = function (mouseEvent) {
    -1671                     this.__d_ax = -1;
    -1672                     this.__d_ay = -1;
    -1673                     this.pointed = false;
    -1674                     CAAT.setCursor('default');
    -1675                 };
    -1676 
    -1677                 /**
    -1678                  * Mouse move handler for default drag behavior.
    -1679                  * @param mouseEvent {CAAT.Event.MouseEvent}
    -1680                  *
    -1681                  * @ignore
    -1682                  */
    -1683                 this.mouseMove = function (mouseEvent) {
    -1684                 };
    -1685 
    -1686                 /**
    -1687                  * Mouse up handler for default drag behavior.
    -1688                  * @param mouseEvent {CAAT.Event.MouseEvent}
    -1689                  *
    -1690                  * @ignore
    -1691                  */
    -1692                 this.mouseUp = function (mouseEvent) {
    -1693                     this.__d_ax = -1;
    -1694                     this.__d_ay = -1;
    -1695                 };
    -1696 
    -1697                 /**
    -1698                  * Mouse drag handler for default drag behavior.
    -1699                  * @param mouseEvent {CAAT.Event.MouseEvent}
    -1700                  *
    -1701                  * @ignore
    -1702                  */
    -1703                 this.mouseDrag = function (mouseEvent) {
    -1704 
    -1705                     var pt;
    -1706 
    -1707                     pt = this.modelToView(new CAAT.Math.Point(mouseEvent.x, mouseEvent.y));
    -1708                     this.parent.viewToModel(pt);
    -1709 
    -1710                     if (this.__d_ax === -1 || this.__d_ay === -1) {
    -1711                         this.__d_ax = pt.x;
    -1712                         this.__d_ay = pt.y;
    -1713                         this.__d_asx = this.scaleX;
    -1714                         this.__d_asy = this.scaleY;
    -1715                         this.__d_ara = this.rotationAngle;
    -1716                         this.__d_screenx = mouseEvent.screenPoint.x;
    -1717                         this.__d_screeny = mouseEvent.screenPoint.y;
    -1718                     }
    -1719 
    -1720                     if (mouseEvent.isShiftDown()) {
    -1721                         var scx = (mouseEvent.screenPoint.x - this.__d_screenx) / 100;
    -1722                         var scy = (mouseEvent.screenPoint.y - this.__d_screeny) / 100;
    -1723                         if (!mouseEvent.isAltDown()) {
    -1724                             var sc = Math.max(scx, scy);
    -1725                             scx = sc;
    -1726                             scy = sc;
    -1727                         }
    -1728                         this.setScale(scx + this.__d_asx, scy + this.__d_asy);
    -1729 
    -1730                     } else if (mouseEvent.isControlDown()) {
    -1731                         var vx = mouseEvent.screenPoint.x - this.__d_screenx;
    -1732                         var vy = mouseEvent.screenPoint.y - this.__d_screeny;
    -1733                         this.setRotation(-Math.atan2(vx, vy) + this.__d_ara);
    -1734                     } else {
    -1735                         this.x += pt.x - this.__d_ax;
    -1736                         this.y += pt.y - this.__d_ay;
    -1737                     }
    -1738 
    -1739                     this.__d_ax = pt.x;
    -1740                     this.__d_ay = pt.y;
    -1741                 };
    -1742 
    -1743                 return this;
    -1744             },
    -1745             disableDrag:function () {
    -1746 
    -1747                 this.mouseEnter = function (mouseEvent) {
    -1748                 };
    -1749                 this.mouseExit = function (mouseEvent) {
    -1750                 };
    -1751                 this.mouseMove = function (mouseEvent) {
    -1752                 };
    -1753                 this.mouseUp = function (mouseEvent) {
    -1754                 };
    -1755                 this.mouseDrag = function (mouseEvent) {
    -1756                 };
    -1757 
    -1758                 return this;
    -1759             },
    -1760             /**
    -1761              * Default mouseClick handler.
    -1762              * Mouse click events are received after a call to mouseUp method if no dragging was in progress.
    -1763              *
    -1764              * @param mouseEvent {CAAT.Event.MouseEvent}
    -1765              */
    -1766             mouseClick:function (mouseEvent) {
    -1767             },
    -1768             /**
    -1769              * Default double click handler
    -1770              *
    -1771              * @param mouseEvent {CAAT.Event.MouseEvent}
    -1772              */
    -1773             mouseDblClick:function (mouseEvent) {
    -1774             },
    -1775             /**
    -1776              * Default mouse enter on Actor handler.
    -1777              * @param mouseEvent {CAAT.Event.MouseEvent}
    -1778              */
    -1779             mouseEnter:function (mouseEvent) {
    -1780                 this.pointed = true;
    -1781             },
    -1782             /**
    -1783              * Default mouse exit on Actor handler.
    -1784              *
    -1785              * @param mouseEvent {CAAT.Event.MouseEvent}
    -1786              */
    -1787             mouseExit:function (mouseEvent) {
    -1788                 this.pointed = false;
    -1789             },
    -1790             /**
    -1791              * Default mouse move inside Actor handler.
    -1792              *
    -1793              * @param mouseEvent {CAAT.Event.MouseEvent}
    -1794              */
    -1795             mouseMove:function (mouseEvent) {
    -1796             },
    -1797             /**
    -1798              * default mouse press in Actor handler.
    -1799              *
    -1800              * @param mouseEvent {CAAT.Event.MouseEvent}
    -1801              */
    -1802             mouseDown:function (mouseEvent) {
    -1803             },
    -1804             /**
    -1805              * default mouse release in Actor handler.
    -1806              *
    -1807              * @param mouseEvent {CAAT.Event.MouseEvent}
    -1808              */
    -1809             mouseUp:function (mouseEvent) {
    -1810             },
    -1811             mouseOut:function (mouseEvent) {
    -1812             },
    -1813             mouseOver:function (mouseEvent) {
    -1814             },
    -1815             /**
    -1816              * default Actor mouse drag handler.
    -1817              *
    -1818              * @param mouseEvent {CAAT.Event.MouseEvent}
    -1819              */
    -1820             mouseDrag:function (mouseEvent) {
    -1821             },
    -1822             /**
    -1823              * Draw a bounding box with on-screen coordinates regardless of the transformations
    -1824              * applied to the Actor.
    -1825              *
    -1826              * @param director {CAAT.Foundations.Director} object instance that contains the Scene the Actor is in.
    -1827              * @param time {number} integer indicating the Scene time when the bounding box is to be drawn.
    -1828              */
    -1829             drawScreenBoundingBox:function (director, time) {
    -1830                 if (null !== this.AABB && this.inFrame) {
    -1831                     var s = this.AABB;
    -1832                     var ctx = director.ctx;
    -1833                     ctx.strokeStyle = CAAT.DEBUGAABBCOLOR;
    -1834                     ctx.strokeRect(.5 + (s.x | 0), .5 + (s.y | 0), s.width | 0, s.height | 0);
    -1835                     if (CAAT.DEBUGBB) {
    -1836                         var vv = this.viewVertices;
    -1837                         ctx.beginPath();
    -1838                         ctx.lineTo(vv[0].x, vv[0].y);
    -1839                         ctx.lineTo(vv[1].x, vv[1].y);
    -1840                         ctx.lineTo(vv[2].x, vv[2].y);
    -1841                         ctx.lineTo(vv[3].x, vv[3].y);
    -1842                         ctx.closePath();
    -1843                         ctx.strokeStyle = CAAT.DEBUGBBCOLOR;
    -1844                         ctx.stroke();
    -1845                     }
    -1846                 }
    -1847             },
    -1848             /**
    -1849              * Private
    -1850              * This method is called by the Director instance.
    -1851              * It applies the list of behaviors the Actor has registered.
    -1852              *
    -1853              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    -1854              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    -1855              */
    -1856             animate:function (director, time) {
    -1857 
    -1858                 if (!this.visible) {
    -1859                     return false;
    -1860                 }
    -1861 
    -1862                 var i;
    -1863 
    -1864                 if (!this.isInAnimationFrame(time)) {
    -1865                     this.inFrame = false;
    -1866                     this.dirty = true;
    -1867                     return false;
    -1868                 }
    -1869 
    -1870                 if (this.x !== this.oldX || this.y !== this.oldY) {
    -1871                     this.dirty = true;
    -1872                     this.oldX = this.x;
    -1873                     this.oldY = this.y;
    -1874                 }
    -1875 
    -1876                 for (i = 0; i < this.behaviorList.length; i++) {
    -1877                     this.behaviorList[i].apply(time, this);
    -1878                 }
    -1879 
    -1880                 if (this.clipPath) {
    -1881                     this.clipPath.applyBehaviors(time);
    -1882                 }
    -1883 
    -1884                 // transformation stuff.
    -1885                 this.setModelViewMatrix();
    -1886 
    -1887                 if (this.dirty || this.wdirty || this.invalid) {
    -1888                     if (director.dirtyRectsEnabled) {
    -1889                         director.addDirtyRect(this.AABB);
    -1890                     }
    -1891                     this.setScreenBounds();
    -1892                     if (director.dirtyRectsEnabled) {
    -1893                         director.addDirtyRect(this.AABB);
    -1894                     }
    -1895                 }
    -1896                 this.dirty = false;
    -1897                 this.invalid = false;
    -1898 
    -1899                 this.inFrame = true;
    -1900 
    -1901                 if ( this.backgroundImage ) {
    -1902                     this.backgroundImage.setSpriteIndexAtTime(time);
    -1903                 }
    -1904 
    -1905                 return this.AABB.intersects(director.AABB);
    -1906                 //return true;
    -1907             },
    -1908             /**
    -1909              * Set this model view matrix if the actor is Dirty.
    -1910              *
    -1911              mm[2]+= this.x;
    -1912              mm[5]+= this.y;
    -1913              if ( this.rotationAngle ) {
    -1914                  this.modelViewMatrix.multiply( m.setTranslate( this.rotationX, this.rotationY) );
    -1915                  this.modelViewMatrix.multiply( m.setRotation( this.rotationAngle ) );
    -1916                  this.modelViewMatrix.multiply( m.setTranslate( -this.rotationX, -this.rotationY) );                    c= Math.cos( this.rotationAngle );
    -1917              }
    -1918              if ( this.scaleX!=1 || this.scaleY!=1 && (this.scaleTX || this.scaleTY )) {
    -1919                  this.modelViewMatrix.multiply( m.setTranslate( this.scaleTX , this.scaleTY ) );
    -1920                  this.modelViewMatrix.multiply( m.setScale( this.scaleX, this.scaleY ) );
    -1921                  this.modelViewMatrix.multiply( m.setTranslate( -this.scaleTX , -this.scaleTY ) );
    -1922              }
    -1923              *
    -1924              * @return this
    -1925              */
    -1926             setModelViewMatrix:function () {
    -1927                 var c, s, _m00, _m01, _m10, _m11;
    -1928                 var mm0, mm1, mm2, mm3, mm4, mm5;
    -1929                 var mm;
    -1930 
    -1931                 this.wdirty = false;
    -1932                 mm = this.modelViewMatrix.matrix;
    -1933 
    -1934                 if (this.dirty) {
    -1935 
    -1936                     mm0 = 1;
    -1937                     mm1 = 0;
    -1938                     //mm2= mm[2];
    -1939                     mm3 = 0;
    -1940                     mm4 = 1;
    -1941                     //mm5= mm[5];
    -1942 
    -1943                     mm2 = this.x - this.tAnchorX * this.width;
    -1944                     mm5 = this.y - this.tAnchorY * this.height;
    -1945 
    -1946                     if (this.rotationAngle) {
    -1947 
    -1948                         var rx = this.rotationX * this.width;
    -1949                         var ry = this.rotationY * this.height;
    -1950 
    -1951                         mm2 += mm0 * rx + mm1 * ry;
    -1952                         mm5 += mm3 * rx + mm4 * ry;
    -1953 
    -1954                         c = Math.cos(this.rotationAngle);
    -1955                         s = Math.sin(this.rotationAngle);
    -1956                         _m00 = mm0;
    -1957                         _m01 = mm1;
    -1958                         _m10 = mm3;
    -1959                         _m11 = mm4;
    -1960                         mm0 = _m00 * c + _m01 * s;
    -1961                         mm1 = -_m00 * s + _m01 * c;
    -1962                         mm3 = _m10 * c + _m11 * s;
    -1963                         mm4 = -_m10 * s + _m11 * c;
    -1964 
    -1965                         mm2 += -mm0 * rx - mm1 * ry;
    -1966                         mm5 += -mm3 * rx - mm4 * ry;
    -1967                     }
    -1968                     if (this.scaleX != 1 || this.scaleY != 1) {
    -1969 
    -1970                         var sx = this.scaleTX * this.width;
    -1971                         var sy = this.scaleTY * this.height;
    -1972 
    -1973                         mm2 += mm0 * sx + mm1 * sy;
    -1974                         mm5 += mm3 * sx + mm4 * sy;
    -1975 
    -1976                         mm0 = mm0 * this.scaleX;
    -1977                         mm1 = mm1 * this.scaleY;
    -1978                         mm3 = mm3 * this.scaleX;
    -1979                         mm4 = mm4 * this.scaleY;
    -1980 
    -1981                         mm2 += -mm0 * sx - mm1 * sy;
    -1982                         mm5 += -mm3 * sx - mm4 * sy;
    -1983                     }
    -1984 
    -1985                     mm[0] = mm0;
    -1986                     mm[1] = mm1;
    -1987                     mm[2] = mm2;
    -1988                     mm[3] = mm3;
    -1989                     mm[4] = mm4;
    -1990                     mm[5] = mm5;
    -1991                 }
    -1992 
    -1993                 if (this.parent) {
    -1994 
    -1995 
    -1996                     this.isAA = this.rotationAngle === 0 && this.scaleX === 1 && this.scaleY === 1 && this.parent.isAA;
    -1997 
    -1998                     if (this.dirty || this.parent.wdirty) {
    -1999                         this.worldModelViewMatrix.copy(this.parent.worldModelViewMatrix);
    -2000                         if (this.isAA) {
    -2001                             var mmm = this.worldModelViewMatrix.matrix;
    -2002                             mmm[2] += mm[2];
    -2003                             mmm[5] += mm[5];
    -2004                         } else {
    -2005                             this.worldModelViewMatrix.multiply(this.modelViewMatrix);
    -2006                         }
    -2007                         this.wdirty = true;
    -2008                     }
    -2009 
    -2010                 } else {
    -2011                     if (this.dirty) {
    -2012                         this.wdirty = true;
    -2013                     }
    -2014 
    -2015                     this.worldModelViewMatrix.identity();
    -2016                     this.isAA = this.rotationAngle === 0 && this.scaleX === 1 && this.scaleY === 1;
    -2017                 }
    -2018 
    -2019 
    -2020 //if ( (CAAT.DEBUGAABB || glEnabled) && (this.dirty || this.wdirty ) ) {
    -2021                 // screen bounding boxes will always be calculated.
    -2022                 /*
    -2023                  if ( this.dirty || this.wdirty || this.invalid ) {
    -2024                  if ( director.dirtyRectsEnabled ) {
    -2025                  director.addDirtyRect( this.AABB );
    -2026                  }
    -2027                  this.setScreenBounds();
    -2028                  if ( director.dirtyRectsEnabled ) {
    -2029                  director.addDirtyRect( this.AABB );
    -2030                  }
    -2031                  }
    -2032                  this.dirty= false;
    -2033                  this.invalid= false;
    -2034                  */
    -2035             },
    -2036             /**
    -2037              * Calculates the 2D bounding box in canvas coordinates of the Actor.
    -2038              * This bounding box takes into account the transformations applied hierarchically for
    -2039              * each Scene Actor.
    -2040              *
    -2041              * @private
    -2042              *
    -2043              */
    -2044             setScreenBounds:function () {
    -2045 
    -2046                 var AABB = this.AABB;
    -2047                 var vv = this.viewVertices;
    -2048                 var vvv, m, x, y, w, h;
    -2049 
    -2050                 if (this.isAA) {
    -2051                     m = this.worldModelViewMatrix.matrix;
    -2052                     x = m[2];
    -2053                     y = m[5];
    -2054                     w = this.width;
    -2055                     h = this.height;
    -2056                     AABB.x = x;
    -2057                     AABB.y = y;
    -2058                     AABB.x1 = x + w;
    -2059                     AABB.y1 = y + h;
    -2060                     AABB.width = w;
    -2061                     AABB.height = h;
    -2062 
    -2063                     if (CAAT.GLRENDER) {
    -2064                         vvv = vv[0];
    -2065                         vvv.x = x;
    -2066                         vvv.y = y;
    -2067                         vvv = vv[1];
    -2068                         vvv.x = x + w;
    -2069                         vvv.y = y;
    -2070                         vvv = vv[2];
    -2071                         vvv.x = x + w;
    -2072                         vvv.y = y + h;
    -2073                         vvv = vv[3];
    -2074                         vvv.x = x;
    -2075                         vvv.y = y + h;
    -2076                     }
    -2077 
    -2078                     return this;
    -2079                 }
    -2080 
    -2081                 vvv = vv[0];
    -2082                 vvv.x = 0;
    -2083                 vvv.y = 0;
    -2084                 vvv = vv[1];
    -2085                 vvv.x = this.width;
    -2086                 vvv.y = 0;
    -2087                 vvv = vv[2];
    -2088                 vvv.x = this.width;
    -2089                 vvv.y = this.height;
    -2090                 vvv = vv[3];
    -2091                 vvv.x = 0;
    -2092                 vvv.y = this.height;
    -2093 
    -2094                 this.modelToView(this.viewVertices);
    -2095 
    -2096                 var xmin = Number.MAX_VALUE, xmax = -Number.MAX_VALUE;
    -2097                 var ymin = Number.MAX_VALUE, ymax = -Number.MAX_VALUE;
    -2098 
    -2099                 vvv = vv[0];
    -2100                 if (vvv.x < xmin) {
    -2101                     xmin = vvv.x;
    -2102                 }
    -2103                 if (vvv.x > xmax) {
    -2104                     xmax = vvv.x;
    -2105                 }
    -2106                 if (vvv.y < ymin) {
    -2107                     ymin = vvv.y;
    -2108                 }
    -2109                 if (vvv.y > ymax) {
    -2110                     ymax = vvv.y;
    -2111                 }
    -2112                 vvv = vv[1];
    -2113                 if (vvv.x < xmin) {
    -2114                     xmin = vvv.x;
    -2115                 }
    -2116                 if (vvv.x > xmax) {
    -2117                     xmax = vvv.x;
    -2118                 }
    -2119                 if (vvv.y < ymin) {
    -2120                     ymin = vvv.y;
    -2121                 }
    -2122                 if (vvv.y > ymax) {
    -2123                     ymax = vvv.y;
    -2124                 }
    -2125                 vvv = vv[2];
    -2126                 if (vvv.x < xmin) {
    -2127                     xmin = vvv.x;
    -2128                 }
    -2129                 if (vvv.x > xmax) {
    -2130                     xmax = vvv.x;
    -2131                 }
    -2132                 if (vvv.y < ymin) {
    -2133                     ymin = vvv.y;
    -2134                 }
    -2135                 if (vvv.y > ymax) {
    -2136                     ymax = vvv.y;
    -2137                 }
    -2138                 vvv = vv[3];
    -2139                 if (vvv.x < xmin) {
    -2140                     xmin = vvv.x;
    -2141                 }
    -2142                 if (vvv.x > xmax) {
    -2143                     xmax = vvv.x;
    -2144                 }
    -2145                 if (vvv.y < ymin) {
    -2146                     ymin = vvv.y;
    -2147                 }
    -2148                 if (vvv.y > ymax) {
    -2149                     ymax = vvv.y;
    -2150                 }
    -2151 
    -2152                 AABB.x = xmin;
    -2153                 AABB.y = ymin;
    -2154                 AABB.x1 = xmax;
    -2155                 AABB.y1 = ymax;
    -2156                 AABB.width = (xmax - xmin);
    -2157                 AABB.height = (ymax - ymin);
    -2158 
    -2159                 return this;
    -2160             },
    -2161             /**
    -2162              * @private.
    -2163              * This method will be called by the Director to set the whole Actor pre-render process.
    -2164              *
    -2165              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    -2166              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    -2167              *
    -2168              * @return boolean indicating whether the Actor isInFrameTime
    -2169              */
    -2170             paintActor:function (director, time) {
    -2171 
    -2172                 if (!this.visible || !director.inDirtyRect(this)) {
    -2173                     return true;
    -2174                 }
    -2175 
    -2176                 var ctx = director.ctx;
    -2177 
    -2178                 this.frameAlpha = this.parent ? this.parent.frameAlpha * this.alpha : 1;
    -2179                 ctx.globalAlpha = this.frameAlpha;
    -2180 
    -2181                 director.modelViewMatrix.transformRenderingContextSet(ctx);
    -2182                 this.worldModelViewMatrix.transformRenderingContext(ctx);
    -2183 
    -2184                 if (this.clip) {
    -2185                     ctx.beginPath();
    -2186                     if (!this.clipPath) {
    -2187                         ctx.rect(0, 0, this.width, this.height);
    -2188                     } else {
    -2189                         this.clipPath.applyAsPath(director);
    -2190                     }
    -2191                     ctx.clip();
    -2192                 }
    -2193 
    -2194                 this.paint(director, time);
    -2195 
    -2196                 return true;
    -2197             },
    -2198             /**
    -2199              * for js2native
    -2200              * @param director
    -2201              * @param time
    -2202              */
    -2203             __paintActor:function (director, time) {
    -2204                 if (!this.visible) {
    -2205                     return true;
    -2206                 }
    -2207                 var ctx = director.ctx;
    -2208 
    -2209                 // global opt: set alpha as owns alpha, not take globalAlpha procedure.
    -2210                 this.frameAlpha = this.alpha;
    -2211 
    -2212                 var m = this.worldModelViewMatrix.matrix;
    -2213                 ctx.setTransform(m[0], m[3], m[1], m[4], m[2], m[5], this.frameAlpha);
    -2214                 this.paint(director, time);
    -2215                 return true;
    -2216             },
    -2217 
    -2218             /**
    -2219              * Set coordinates and uv values for this actor.
    -2220              * This function uses Director's coords and indexCoords values.
    -2221              * @param director
    -2222              * @param time
    -2223              */
    -2224             paintActorGL:function (director, time) {
    -2225 
    -2226                 this.frameAlpha = this.parent.frameAlpha * this.alpha;
    -2227 
    -2228                 if (!this.glEnabled || !this.visible) {
    -2229                     return;
    -2230                 }
    -2231 
    -2232                 if (this.glNeedsFlush(director)) {
    -2233                     director.glFlush();
    -2234                     this.glSetShader(director);
    -2235 
    -2236                     if (!this.__uv) {
    -2237                         this.__uv = new Float32Array(8);
    -2238                     }
    -2239                     if (!this.__vv) {
    -2240                         this.__vv = new Float32Array(12);
    -2241                     }
    -2242 
    -2243                     this.setGLCoords(this.__vv, 0);
    -2244                     this.setUV(this.__uv, 0);
    -2245                     director.glRender(this.__vv, 12, this.__uv);
    -2246 
    -2247                     return;
    -2248                 }
    -2249 
    -2250                 var glCoords = director.coords;
    -2251                 var glCoordsIndex = director.coordsIndex;
    -2252 
    -2253                 ////////////////// XYZ
    -2254                 this.setGLCoords(glCoords, glCoordsIndex);
    -2255                 director.coordsIndex = glCoordsIndex + 12;
    -2256 
    -2257                 ////////////////// UV
    -2258                 this.setUV(director.uv, director.uvIndex);
    -2259                 director.uvIndex += 8;
    -2260             },
    -2261             /**
    -2262              * TODO: set GLcoords for different image transformations.
    -2263              *
    -2264              * @param glCoords
    -2265              * @param glCoordsIndex
    -2266              */
    -2267             setGLCoords:function (glCoords, glCoordsIndex) {
    -2268 
    -2269                 var vv = this.viewVertices;
    -2270                 glCoords[glCoordsIndex++] = vv[0].x;
    -2271                 glCoords[glCoordsIndex++] = vv[0].y;
    -2272                 glCoords[glCoordsIndex++] = 0;
    -2273 
    -2274                 glCoords[glCoordsIndex++] = vv[1].x;
    -2275                 glCoords[glCoordsIndex++] = vv[1].y;
    -2276                 glCoords[glCoordsIndex++] = 0;
    -2277 
    -2278                 glCoords[glCoordsIndex++] = vv[2].x;
    -2279                 glCoords[glCoordsIndex++] = vv[2].y;
    -2280                 glCoords[glCoordsIndex++] = 0;
    -2281 
    -2282                 glCoords[glCoordsIndex++] = vv[3].x;
    -2283                 glCoords[glCoordsIndex++] = vv[3].y;
    -2284                 glCoords[glCoordsIndex  ] = 0;
    -2285 
    -2286             },
    -2287             /**
    -2288              * Set UV for this actor's quad.
    -2289              *
    -2290              * @param uvBuffer {Float32Array}
    -2291              * @param uvIndex {number}
    -2292              */
    -2293             setUV:function (uvBuffer, uvIndex) {
    -2294                 this.backgroundImage.setUV(uvBuffer, uvIndex);
    -2295             },
    -2296             /**
    -2297              * Test for compulsory gl flushing:
    -2298              *  1.- opacity has changed.
    -2299              *  2.- texture page has changed.
    -2300              *
    -2301              */
    -2302             glNeedsFlush:function (director) {
    -2303                 if (this.getTextureGLPage() !== director.currentTexturePage) {
    -2304                     return true;
    -2305                 }
    -2306                 if (this.frameAlpha !== director.currentOpacity) {
    -2307                     return true;
    -2308                 }
    -2309                 return false;
    -2310             },
    -2311             /**
    -2312              * Change texture shader program parameters.
    -2313              * @param director
    -2314              */
    -2315             glSetShader:function (director) {
    -2316 
    -2317                 var tp = this.getTextureGLPage();
    -2318                 if (tp !== director.currentTexturePage) {
    -2319                     director.setGLTexturePage(tp);
    -2320                 }
    -2321 
    -2322                 if (this.frameAlpha !== director.currentOpacity) {
    -2323                     director.setGLCurrentOpacity(this.frameAlpha);
    -2324                 }
    -2325             },
    -2326             /**
    -2327              * @private.
    -2328              * This method is called after the Director has transformed and drawn a whole frame.
    -2329              *
    -2330              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    -2331              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    -2332              * @return this
    -2333              *
    -2334              * @deprecated
    -2335              */
    -2336             endAnimate:function (director, time) {
    -2337                 return this;
    -2338             },
    -2339             initialize:function (overrides) {
    -2340                 if (overrides) {
    -2341                     for (var i in overrides) {
    -2342                         this[i] = overrides[i];
    -2343                     }
    -2344                 }
    -2345 
    -2346                 return this;
    -2347             },
    -2348             /**
    -2349              * Set this Actor's clipping area.
    -2350              * @param enable {boolean} enable clip area.
    -2351              * @param clipPath {CAAT.Path.Path=} An optional path to apply clip with. If enabled and clipPath is not set,
    -2352              *  a rectangle will be used.
    -2353              */
    -2354             setClip:function (enable, clipPath) {
    -2355                 this.clip = enable;
    -2356                 this.clipPath = clipPath;
    -2357                 return this;
    -2358             },
    -2359 
    -2360             isCached : function() {
    -2361                 return this.cached;
    -2362             },
    -2363 
    -2364             stopCacheAsBitmap:function () {
    -2365                 if (this.cached) {
    -2366                     this.backgroundImage = null;
    -2367                     this.cached = CAAT.Foundation.Actor.CACHE_NONE;
    -2368                 }
    -2369             },
    -2370 
    -2371             /**
    -2372              *
    -2373              * @param time {Number=}
    -2374              * @param stragegy {CAAT.Foundation.Actor.CACHE_SIMPLE | CAAT.Foundation.Actor.CACHE_DEEP}
    -2375              * @return this
    -2376              */
    -2377             cacheAsBitmap:function (time, strategy) {
    -2378 
    -2379                 if (this.width<=0 || this.height<=0 ) {
    -2380                     return this;
    -2381                 }
    -2382 
    -2383                 time = time || 0;
    -2384                 var canvas = document.createElement('canvas');
    -2385                 canvas.width = this.width;
    -2386                 canvas.height = this.height;
    -2387                 var ctx = canvas.getContext('2d');
    -2388 
    -2389                 CAAT.Foundation.Actor.prototype.animate.call(this,CAAT.currentDirector,time);
    -2390 
    -2391                 var director = {
    -2392                     ctx:ctx,
    -2393                     modelViewMatrix: new CAAT.Math.Matrix(),
    -2394                     worldModelViewMatrix: new CAAT.Math.Matrix(),
    -2395                     dirtyRectsEnabled:false,
    -2396                     inDirtyRect:function () {
    -2397                         return true;
    -2398                     },
    -2399                     AABB : new CAAT.Math.Rectangle(0,0,this.width,this.height)
    -2400                 };
    -2401 
    -2402                 var pmv = this.modelViewMatrix;
    -2403                 var pwmv = this.worldModelViewMatrix;
    -2404 
    -2405                 this.modelViewMatrix = new CAAT.Math.Matrix();
    -2406                 this.worldModelViewMatrix = new CAAT.Math.Matrix();
    -2407 
    -2408                 this.cached = CAAT.Foundation.Actor.CACHE_NONE;
    -2409 
    -2410                 if ( typeof strategy==="undefined" ) {
    -2411                     strategy= CAAT.Foundation.Actor.CACHE_SIMPLE;
    -2412                 }
    -2413                 if ( strategy===CAAT.Foundation.Actor.CACHE_DEEP ) {
    -2414                     this.animate(director, time );
    -2415                     this.paintActor(director, time);
    -2416                 } else {
    -2417                     if ( this instanceof CAAT.Foundation.ActorContainer || this instanceof CAAT.ActorContainer ) {
    -2418                         CAAT.Foundation.ActorContainer.superclass.paintActor.call(this, director, time);
    -2419                     } else {
    -2420                         this.animate(director, time );
    -2421                         this.paintActor(director, time);
    -2422                     }
    -2423                 }
    -2424                 this.setBackgroundImage(canvas);
    -2425 
    -2426                 this.cached = strategy;
    -2427 
    -2428                 this.modelViewMatrix = pmv;
    -2429                 this.worldModelViewMatrix = pwmv;
    -2430 
    -2431                 return this;
    -2432             },
    -2433             resetAsButton : function() {
    -2434                 this.actionPerformed= null;
    -2435                 this.mouseEnter=    function() {};
    -2436                 this.mouseExit=     function() {};
    -2437                 this.mouseDown=     function() {};
    -2438                 this.mouseUp=       function() {};
    -2439                 this.mouseClick=    function() {};
    -2440                 this.mouseDrag=     function() {};
    -2441                 return this;
    -2442             },
    -2443             /**
    -2444              * Set this actor behavior as if it were a Button. The actor size will be set as SpriteImage's
    -2445              * single size.
    -2446              *
    -2447              * @param buttonImage {CAAT.Foundation.SpriteImage} sprite image with button's state images.
    -2448              * @param iNormal {number} button's normal state image index
    -2449              * @param iOver {number} button's mouse over state image index
    -2450              * @param iPress {number} button's pressed state image index
    -2451              * @param iDisabled {number} button's disabled state image index
    -2452              * @param fn {function(button{CAAT.Foundation.Actor})} callback function
    -2453              */
    -2454             setAsButton:function (buttonImage, iNormal, iOver, iPress, iDisabled, fn) {
    -2455 
    -2456                 var me = this;
    -2457 
    -2458                 this.setBackgroundImage(buttonImage, true);
    -2459 
    -2460                 this.iNormal = iNormal || 0;
    -2461                 this.iOver = iOver || this.iNormal;
    -2462                 this.iPress = iPress || this.iNormal;
    -2463                 this.iDisabled = iDisabled || this.iNormal;
    -2464                 this.fnOnClick = fn;
    -2465                 this.enabled = true;
    -2466 
    -2467                 this.setSpriteIndex(iNormal);
    -2468 
    -2469                 /**
    -2470                  * Enable or disable the button.
    -2471                  * @param enabled {boolean}
    -2472                  * @ignore
    -2473                  */
    -2474                 this.setEnabled = function (enabled) {
    -2475                     this.enabled = enabled;
    -2476                     this.setSpriteIndex(this.enabled ? this.iNormal : this.iDisabled);
    -2477                     return this;
    -2478                 };
    -2479 
    -2480                 /**
    -2481                  * This method will be called by CAAT *before* the mouseUp event is fired.
    -2482                  * @param event {CAAT.Event.MouseEvent}
    -2483                  * @ignore
    -2484                  */
    -2485                 this.actionPerformed = function (event) {
    -2486                     if (this.enabled && this.fnOnClick) {
    -2487                         this.fnOnClick(this);
    -2488                     }
    -2489                 };
    -2490 
    -2491                 /**
    -2492                  * Button's mouse enter handler. It makes the button provide visual feedback
    -2493                  * @param mouseEvent {CAAT.Event.MouseEvent}
    -2494                  * @ignore
    -2495                  */
    -2496                 this.mouseEnter = function (mouseEvent) {
    -2497                     if (!this.enabled) {
    -2498                         return;
    -2499                     }
    -2500 
    -2501                     if (this.dragging) {
    -2502                         this.setSpriteIndex(this.iPress);
    -2503                     } else {
    -2504                         this.setSpriteIndex(this.iOver);
    -2505                     }
    -2506                     CAAT.setCursor('pointer');
    -2507                 };
    -2508 
    -2509                 /**
    -2510                  * Button's mouse exit handler. Release visual apperance.
    -2511                  * @param mouseEvent {CAAT.MouseEvent}
    -2512                  * @ignore
    -2513                  */
    -2514                 this.mouseExit = function (mouseEvent) {
    -2515                     if (!this.enabled) {
    -2516                         return;
    -2517                     }
    -2518 
    -2519                     this.setSpriteIndex(this.iNormal);
    -2520                     CAAT.setCursor('default');
    -2521                 };
    -2522 
    -2523                 /**
    -2524                  * Button's mouse down handler.
    -2525                  * @param mouseEvent {CAAT.MouseEvent}
    -2526                  * @ignore
    -2527                  */
    -2528                 this.mouseDown = function (mouseEvent) {
    -2529                     if (!this.enabled) {
    -2530                         return;
    -2531                     }
    -2532 
    -2533                     this.setSpriteIndex(this.iPress);
    -2534                 };
    -2535 
    -2536                 /**
    -2537                  * Button's mouse up handler.
    -2538                  * @param mouseEvent {CAAT.MouseEvent}
    -2539                  * @ignore
    -2540                  */
    -2541                 this.mouseUp = function (mouseEvent) {
    -2542                     if (!this.enabled) {
    -2543                         return;
    -2544                     }
    -2545 
    -2546                     this.setSpriteIndex(this.iNormal);
    -2547                     this.dragging = false;
    -2548                 };
    -2549 
    -2550                 /**
    -2551                  * Button's mouse click handler. Do nothing by default. This event handler will be
    -2552                  * called ONLY if it has not been drag on the button.
    -2553                  * @param mouseEvent {CAAT.MouseEvent}
    -2554                  * @ignore
    -2555                  */
    -2556                 this.mouseClick = function (mouseEvent) {
    -2557                 };
    -2558 
    -2559                 /**
    -2560                  * Button's mouse drag handler.
    -2561                  * @param mouseEvent {CAAT.MouseEvent}
    -2562                  * @ignore
    -2563                  */
    -2564                 this.mouseDrag = function (mouseEvent) {
    -2565                     if (!this.enabled) {
    -2566                         return;
    -2567                     }
    -2568 
    -2569                     this.dragging = true;
    -2570                 };
    -2571 
    -2572                 this.setButtonImageIndex = function (_normal, _over, _press, _disabled) {
    -2573                     this.iNormal = _normal || 0;
    -2574                     this.iOver = _over || this.iNormal;
    -2575                     this.iPress = _press || this.iNormal;
    -2576                     this.iDisabled = _disabled || this.iNormal;
    -2577                     this.setSpriteIndex(this.iNormal);
    -2578                     return this;
    -2579                 };
    -2580 
    -2581                 return this;
    -2582             },
    -2583 
    -2584             findActorById : function(id) {
    -2585                 return this.id===id ? this : null;
    -2586             }
    -2587         }
    -2588     }
    -2589 });
    -2590 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_ActorContainer.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_ActorContainer.js.html deleted file mode 100644 index a315e517..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_ActorContainer.js.html +++ /dev/null @@ -1,722 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name ActorContainer
    -  5      * @memberOf CAAT.Foundation
    -  6      * @extends CAAT.Foundation.Actor
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     /**
    - 11      * @name ADDHINT
    - 12      * @memberOf CAAT.Foundation.ActorContainer
    - 13      * @namespace
    - 14      */
    - 15 
    - 16     /**
    - 17      * @name AddHint
    - 18      * @memberOf CAAT.Foundation.ActorContainer
    - 19      * @namespace
    - 20      * @deprecated
    - 21      */
    - 22 
    - 23     defines:"CAAT.Foundation.ActorContainer",
    - 24     aliases:["CAAT.ActorContainer"],
    - 25     depends:[
    - 26         "CAAT.Foundation.Actor",
    - 27         "CAAT.Math.Point",
    - 28         "CAAT.Math.Rectangle"
    - 29     ],
    - 30     constants :  {
    - 31 
    - 32         /**
    - 33          * @lends CAAT.Foundation.ActorContainer
    - 34          * */
    - 35 
    - 36         ADDHINT:{
    - 37 
    - 38             /**
    - 39              * @lends CAAT.Foundation.ActorContainer.ADDHINT
    - 40              */
    - 41 
    - 42             /** @const */ CONFORM:1
    - 43         },
    - 44 
    - 45         AddHint : {
    - 46 
    - 47             /**
    - 48              * @lends CAAT.Foundation.ActorContainer.AddHint
    - 49              */
    - 50             /** @const */ CONFORM:1
    - 51         }
    - 52     },
    - 53     extendsClass : "CAAT.Foundation.Actor",
    - 54     extendsWith : function () {
    - 55 
    - 56 
    - 57 
    - 58         var __CD =                      CAAT.Foundation.Actor.CACHE_DEEP;
    - 59 
    - 60         var sc=                         CAAT.Foundation.ActorContainer.superclass;
    - 61         var sc_drawScreenBoundingBox=   sc.drawScreenBoundingBox;
    - 62         var sc_paintActor=              sc.paintActor;
    - 63         var sc_paintActorGL=            sc.paintActorGL;
    - 64         var sc_animate=                 sc.animate;
    - 65         var sc_findActorAtPosition =    sc.findActorAtPosition;
    - 66         var sc_destroy =                sc.destroy;
    - 67 
    - 68         return {
    - 69 
    - 70             /**
    - 71              *
    - 72              * @lends CAAT.Foundation.ActorContainer.prototype
    - 73              */
    - 74 
    - 75             /**
    - 76              * Constructor delegate
    - 77              * @param hint {CAAT.Foundation.ActorContainer.AddHint}
    - 78              * @return {*}
    - 79              * @private
    - 80              */
    - 81             __init:function (hint) {
    - 82 
    - 83                 this.__super();
    - 84 
    - 85                 this.childrenList = [];
    - 86                 this.activeChildren = [];
    - 87                 this.pendingChildrenList = [];
    - 88                 if (typeof hint !== 'undefined') {
    - 89                     this.addHint = hint;
    - 90                     this.boundingBox = new CAAT.Math.Rectangle();
    - 91                 }
    - 92                 return this;
    - 93             },
    - 94 
    - 95             /**
    - 96              * This container children.
    - 97              * @type {Array.<CAAT.Foundation.Actor>}
    - 98              */
    - 99             childrenList:null,
    -100 
    -101             /**
    -102              * This container active children.
    -103              * @type {Array.<CAAT.Foundation.Actor>}
    -104              * @private
    -105              */
    -106             activeChildren:null,
    -107 
    -108             /**
    -109              * This container pending to be added children.
    -110              * @type {Array.<CAAT.Foundation.Actor>}
    -111              * @private
    -112              */
    -113             pendingChildrenList:null,
    -114 
    -115             /**
    -116              * Container redimension policy when adding children:
    -117              *  0 : no resize.
    -118              *  CAAT.Foundation.ActorContainer.AddHint.CONFORM : resize container to a bounding box.
    -119              *
    -120              * @type {number}
    -121              * @private
    -122              */
    -123             addHint:0,
    -124 
    -125             /**
    -126              * If container redimension on children add, use this rectangle as bounding box store.
    -127              * @type {CAAT.Math.Rectangle}
    -128              * @private
    -129              */
    -130             boundingBox:null,
    -131 
    -132             /**
    -133              * Spare rectangle to avoid new allocations when adding children to this container.
    -134              * @type {CAAT.Math.Rectangle}
    -135              * @private
    -136              */
    -137             runion:new CAAT.Math.Rectangle(), // Watch out. one for every container.
    -138 
    -139             /**
    -140              * Define a layout manager for this container that enforces children position and/or sizes.
    -141              * @see demo26 for an example of layouts.
    -142              * @type {CAAT.Foundation.UI.Layout.LayoutManager}
    -143              */
    -144             layoutManager:null, // a layout manager instance.
    -145 
    -146             /**
    -147              * @type {boolean}
    -148              */
    -149             layoutInvalidated:true,
    -150 
    -151             setLayout:function (layout) {
    -152                 this.layoutManager = layout;
    -153                 return this;
    -154             },
    -155 
    -156             setBounds:function (x, y, w, h) {
    -157                 CAAT.Foundation.ActorContainer.superclass.setBounds.call(this, x, y, w, h);
    -158                 if (CAAT.currentDirector && !CAAT.currentDirector.inValidation) {
    -159                     this.invalidateLayout();
    -160                 }
    -161                 return this;
    -162             },
    -163 
    -164             __validateLayout:function () {
    -165 
    -166                 this.__validateTree();
    -167                 this.layoutInvalidated = false;
    -168             },
    -169 
    -170             __validateTree:function () {
    -171                 if (this.layoutManager && this.layoutManager.isInvalidated()) {
    -172 
    -173                     CAAT.currentDirector.inValidation = true;
    -174 
    -175                     this.layoutManager.doLayout(this);
    -176 
    -177                     for (var i = 0; i < this.getNumChildren(); i += 1) {
    -178                         this.getChildAt(i).__validateLayout();
    -179                     }
    -180                 }
    -181             },
    -182 
    -183             invalidateLayout:function () {
    -184                 this.layoutInvalidated = true;
    -185 
    -186                 if (this.layoutManager) {
    -187                     this.layoutManager.invalidateLayout(this);
    -188 
    -189                     for (var i = 0; i < this.getNumChildren(); i += 1) {
    -190                         this.getChildAt(i).invalidateLayout();
    -191                     }
    -192                 }
    -193             },
    -194 
    -195             getLayout:function () {
    -196                 return this.layoutManager;
    -197             },
    -198 
    -199             /**
    -200              * Draws this ActorContainer and all of its children screen bounding box.
    -201              *
    -202              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    -203              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    -204              */
    -205             drawScreenBoundingBox:function (director, time) {
    -206 
    -207                 if (!this.inFrame) {
    -208                     return;
    -209                 }
    -210 
    -211                 var cl = this.activeChildren;
    -212                 for (var i = 0; i < cl.length; i++) {
    -213                     cl[i].drawScreenBoundingBox(director, time);
    -214                 }
    -215                 sc_drawScreenBoundingBox.call(this, director, time);
    -216             },
    -217             /**
    -218              * Removes all children from this ActorContainer.
    -219              *
    -220              * @return this
    -221              */
    -222             emptyChildren:function () {
    -223                 this.childrenList = [];
    -224 
    -225                 return this;
    -226             },
    -227             /**
    -228              * Private
    -229              * Paints this container and every contained children.
    -230              *
    -231              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    -232              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    -233              */
    -234             paintActor:function (director, time) {
    -235 
    -236                 if (!this.visible) {
    -237                     return false;
    -238                 }
    -239 
    -240                 var ctx = director.ctx;
    -241 
    -242                 ctx.save();
    -243 
    -244                 if (!sc_paintActor.call(this, director, time)) {
    -245                     return false;
    -246                 }
    -247 
    -248                 if (this.cached === __CD) {
    -249                     return false;
    -250                 }
    -251 
    -252                 if (!this.isGlobalAlpha) {
    -253                     this.frameAlpha = this.parent ? this.parent.frameAlpha : 1;
    -254                 }
    -255 
    -256                 for (var i = 0, l = this.activeChildren.length; i < l; ++i) {
    -257                     var actor = this.activeChildren[i];
    -258 
    -259                     if (actor.visible) {
    -260                         ctx.save();
    -261                         actor.paintActor(director, time);
    -262                         ctx.restore();
    -263                     }
    -264                 }
    -265 
    -266                 if (this.postPaint) {
    -267                     this.postPaint( director, time );
    -268                 }
    -269 
    -270                 ctx.restore();
    -271 
    -272                 return true;
    -273             },
    -274             __paintActor:function (director, time) {
    -275                 if (!this.visible) {
    -276                     return true;
    -277                 }
    -278 
    -279                 var ctx = director.ctx;
    -280 
    -281                 this.frameAlpha = this.parent ? this.parent.frameAlpha * this.alpha : 1;
    -282                 var m = this.worldModelViewMatrix.matrix;
    -283                 ctx.setTransform(m[0], m[3], m[1], m[4], m[2], m[5], this.frameAlpha);
    -284                 this.paint(director, time);
    -285 
    -286                 if (!this.isGlobalAlpha) {
    -287                     this.frameAlpha = this.parent ? this.parent.frameAlpha : 1;
    -288                 }
    -289 
    -290                 for (var i = 0, l = this.activeChildren.length; i < l; ++i) {
    -291                     var actor = this.activeChildren[i];
    -292                     actor.paintActor(director, time);
    -293                 }
    -294                 return true;
    -295             },
    -296             paintActorGL:function (director, time) {
    -297 
    -298                 var i, l, c;
    -299 
    -300                 if (!this.visible) {
    -301                     return true;
    -302                 }
    -303 
    -304                 sc_paintActorGL.call(this, director, time);
    -305 
    -306                 if (!this.isGlobalAlpha) {
    -307                     this.frameAlpha = this.parent.frameAlpha;
    -308                 }
    -309 
    -310                 for (i = 0, l = this.activeChildren.length; i < l; ++i) {
    -311                     c = this.activeChildren[i];
    -312                     c.paintActorGL(director, time);
    -313                 }
    -314 
    -315             },
    -316             /**
    -317              * Private.
    -318              * Performs the animate method for this ActorContainer and every contained Actor.
    -319              *
    -320              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    -321              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    -322              *
    -323              * @return {boolean} is this actor in active children list ??
    -324              */
    -325             animate:function (director, time) {
    -326 
    -327                 if (!this.visible) {
    -328                     return false;
    -329                 }
    -330 
    -331                 this.activeChildren = [];
    -332                 var last = null;
    -333 
    -334                 if (false === sc_animate.call(this, director, time)) {
    -335                     return false;
    -336                 }
    -337 
    -338                 if (this.cached === __CD) {
    -339                     return true;
    -340                 }
    -341 
    -342                 this.__validateLayout();
    -343                 CAAT.currentDirector.inValidation = false;
    -344 
    -345                 var i, l;
    -346 
    -347                 /**
    -348                  * Incluir los actores pendientes.
    -349                  * El momento es ahora, antes de procesar ninguno del contenedor.
    -350                  */
    -351                 var pcl = this.pendingChildrenList;
    -352                 for (i = 0; i < pcl.length; i++) {
    -353                     var child = pcl[i];
    -354                     this.addChildImmediately(child.child, child.constraint);
    -355                 }
    -356 
    -357                 this.pendingChildrenList = [];
    -358                 var markDelete = [];
    -359 
    -360                 var cl = this.childrenList;
    -361                 this.size_active = 1;
    -362                 this.size_total = 1;
    -363                 for (i = 0; i < cl.length; i++) {
    -364                     var actor = cl[i];
    -365                     actor.time = time;
    -366                     this.size_total += actor.size_total;
    -367                     if (actor.animate(director, time)) {
    -368                         this.activeChildren.push(actor);
    -369                         this.size_active += actor.size_active;
    -370                     } else {
    -371                         if (actor.expired && actor.discardable) {
    -372                             markDelete.push(actor);
    -373                         }
    -374                     }
    -375                 }
    -376 
    -377                 for (i = 0, l = markDelete.length; i < l; i++) {
    -378                     var md = markDelete[i];
    -379                     md.destroy(time);
    -380                     if (director.dirtyRectsEnabled) {
    -381                         director.addDirtyRect(md.AABB);
    -382                     }
    -383                 }
    -384 
    -385                 return true;
    -386             },
    -387             /**
    -388              * Removes Actors from this ActorContainer which are expired and flagged as Discardable.
    -389              *
    -390              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    -391              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    -392              *
    -393              * @deprecated
    -394              */
    -395             endAnimate:function (director, time) {
    -396             },
    -397             /**
    -398              * Adds an Actor to this Container.
    -399              * The Actor will be added ON METHOD CALL, despite the rendering pipeline stage being executed at
    -400              * the time of method call.
    -401              *
    -402              * This method is only used by director's transitionScene.
    -403              *
    -404              * @param child {CAAT.Foundation.Actor}
    -405              * @param constraint {object}
    -406              * @return this.
    -407              */
    -408             addChildImmediately:function (child, constraint) {
    -409                 return this.addChild(child, constraint);
    -410             },
    -411 
    -412             addActorImmediately: function(child,constraint) {
    -413                 return this.addChildImmediately(child,constraint);
    -414             },
    -415 
    -416             addActor : function( child, constraint ) {
    -417                 return this.addChild(child,constraint);
    -418             },
    -419 
    -420             /**
    -421              * Adds an Actor to this ActorContainer.
    -422              * The Actor will be added to the container AFTER frame animation, and not on method call time.
    -423              * Except the Director and in orther to avoid visual artifacts, the developer SHOULD NOT call this
    -424              * method directly.
    -425              *
    -426              * If the container has addingHint as CAAT.Foundation.ActorContainer.AddHint.CONFORM, new continer size will be
    -427              * calculated by summing up the union of every client actor bounding box.
    -428              * This method will not take into acount actor's affine transformations, so the bounding box will be
    -429              * AABB.
    -430              *
    -431              * @param child {CAAT.Foundation.Actor} object instance.
    -432              * @param constraint {object}
    -433              * @return this
    -434              */
    -435             addChild:function (child, constraint) {
    -436 
    -437                 if (child.parent != null) {
    -438                     throw('adding to a container an element with parent.');
    -439                 }
    -440 
    -441                 child.parent = this;
    -442                 this.childrenList.push(child);
    -443                 child.dirty = true;
    -444 
    -445                 if (this.layoutManager) {
    -446                     this.layoutManager.addChild(child, constraint);
    -447                     this.invalidateLayout();
    -448                 } else {
    -449                     /**
    -450                      * if Conforming size, recalc new bountainer size.
    -451                      */
    -452                     if (this.addHint === CAAT.Foundation.ActorContainer.AddHint.CONFORM) {
    -453                         this.recalcSize();
    -454                     }
    -455                 }
    -456 
    -457                 return this;
    -458             },
    -459 
    -460             /**
    -461              * Recalc this container size by computing the union of every children bounding box.
    -462              */
    -463             recalcSize:function () {
    -464                 var bb = this.boundingBox;
    -465                 bb.setEmpty();
    -466                 var cl = this.childrenList;
    -467                 var ac;
    -468                 for (var i = 0; i < cl.length; i++) {
    -469                     ac = cl[i];
    -470                     this.runion.setBounds(
    -471                         ac.x < 0 ? 0 : ac.x,
    -472                         ac.y < 0 ? 0 : ac.y,
    -473                         ac.width,
    -474                         ac.height);
    -475                     bb.unionRectangle(this.runion);
    -476                 }
    -477                 this.setSize(bb.x1, bb.y1);
    -478 
    -479                 return this;
    -480             },
    -481 
    -482             /**
    -483              * Add a child element and make it active in the next frame.
    -484              * @param child {CAAT.Foundation.Actor}
    -485              */
    -486             addChildDelayed:function (child, constraint) {
    -487                 this.pendingChildrenList.push({ child:child, constraint: constraint });
    -488                 return this;
    -489             },
    -490             /**
    -491              * Adds an Actor to this ActorContainer.
    -492              *
    -493              * @param child {CAAT.Foundation.Actor}.
    -494              * @param index {number}
    -495              *
    -496              * @return this
    -497              */
    -498             addChildAt:function (child, index) {
    -499 
    -500                 if (index <= 0) {
    -501                     child.parent = this;
    -502                     child.dirty = true;
    -503                     this.childrenList.splice(0, 0, child);
    -504                     this.invalidateLayout();
    -505                     return this;
    -506                 } else {
    -507                     if (index >= this.childrenList.length) {
    -508                         index = this.childrenList.length;
    -509                     }
    -510                 }
    -511 
    -512                 child.parent = this;
    -513                 child.dirty = true;
    -514                 this.childrenList.splice(index, 0, child);
    -515                 this.invalidateLayout();
    -516 
    -517                 return this;
    -518             },
    -519             /**
    -520              * Find the first actor with the supplied ID.
    -521              * This method is not recommended to be used since executes a linear search.
    -522              * @param id
    -523              */
    -524             findActorById:function (id) {
    -525 
    -526                 if ( CAAT.Foundation.ActorContainer.superclass.findActorById.call(this,id) ) {
    -527                     return this;
    -528                 }
    -529 
    -530                 var cl = this.childrenList;
    -531                 for (var i = 0, l = cl.length; i < l; i++) {
    -532                     var ret= cl[i].findActorById(id);
    -533                     if (null!=ret) {
    -534                         return ret;
    -535                     }
    -536                 }
    -537 
    -538                 return null;
    -539             },
    -540             /**
    -541              * Private
    -542              * Gets a contained Actor z-index on this ActorContainer.
    -543              *
    -544              * @param child a CAAT.Foundation.Actor object instance.
    -545              *
    -546              * @return {number}
    -547              */
    -548             findChild:function (child) {
    -549                 var cl = this.childrenList;
    -550                 var i;
    -551                 var len = cl.length;
    -552 
    -553                 for (i = 0; i < len; i++) {
    -554                     if (cl[i] === child) {
    -555                         return i;
    -556                     }
    -557                 }
    -558                 return -1;
    -559             },
    -560             removeChildAt:function (pos) {
    -561                 var cl = this.childrenList;
    -562                 var rm;
    -563                 if (-1 !== pos && pos>=0 && pos<this.childrenList.length) {
    -564                     cl[pos].setParent(null);
    -565                     rm = cl.splice(pos, 1);
    -566                     if (rm[0].isVisible() && CAAT.currentDirector.dirtyRectsEnabled) {
    -567                         CAAT.currentDirector.scheduleDirtyRect(rm[0].AABB);
    -568                     }
    -569 
    -570                     this.invalidateLayout();
    -571                     return rm[0];
    -572                 }
    -573 
    -574                 return null;
    -575             },
    -576             /**
    -577              * Removed an Actor form this ActorContainer.
    -578              * If the Actor is not contained into this Container, nothing happends.
    -579              *
    -580              * @param child a CAAT.Foundation.Actor object instance.
    -581              *
    -582              * @return this
    -583              */
    -584             removeChild:function (child) {
    -585                 var pos = this.findChild(child);
    -586                 var ret = this.removeChildAt(pos);
    -587 
    -588                 return ret;
    -589             },
    -590             removeFirstChild:function () {
    -591                 var first = this.childrenList.shift();
    -592                 first.parent = null;
    -593                 if (first.isVisible() && CAAT.currentDirector.dirtyRectsEnabled) {
    -594                     CAAT.currentDirector.scheduleDirtyRect(first.AABB);
    -595                 }
    -596 
    -597                 this.invalidateLayout();
    -598 
    -599                 return first;
    -600             },
    -601             removeLastChild:function () {
    -602                 if (this.childrenList.length) {
    -603                     var last = this.childrenList.pop();
    -604                     last.parent = null;
    -605                     if (last.isVisible() && CAAT.currentDirector.dirtyRectsEnabled) {
    -606                         CAAT.currentDirector.scheduleDirtyRect(last.AABB);
    -607                     }
    -608 
    -609                     this.invalidateLayout();
    -610 
    -611                     return last;
    -612                 }
    -613 
    -614                 return null;
    -615             },
    -616             /**
    -617              * @private
    -618              *
    -619              * Gets the Actor inside this ActorContainer at a given Screen coordinate.
    -620              *
    -621              * @param point an object of the form { x: float, y: float }
    -622              *
    -623              * @return the Actor contained inside this ActorContainer if found, or the ActorContainer itself.
    -624              */
    -625             findActorAtPosition:function (point) {
    -626 
    -627                 if (null === sc_findActorAtPosition.call(this, point)) {
    -628                     return null;
    -629                 }
    -630 
    -631                 // z-order
    -632                 var cl = this.childrenList;
    -633                 for (var i = cl.length - 1; i >= 0; i--) {
    -634                     var child = this.childrenList[i];
    -635 
    -636                     var np = new CAAT.Math.Point(point.x, point.y, 0);
    -637                     var contained = child.findActorAtPosition(np);
    -638                     if (null !== contained) {
    -639                         return contained;
    -640                     }
    -641                 }
    -642 
    -643                 return this;
    -644             },
    -645             /**
    -646              * Destroys this ActorContainer.
    -647              * The process falls down recursively for each contained Actor into this ActorContainer.
    -648              *
    -649              * @return this
    -650              */
    -651             destroy:function () {
    -652                 var cl = this.childrenList;
    -653                 for (var i = cl.length - 1; i >= 0; i--) {
    -654                     cl[i].destroy();
    -655                 }
    -656                 sc_destroy.call(this);
    -657 
    -658                 return this;
    -659             },
    -660             /**
    -661              * Get number of Actors into this container.
    -662              * @return integer indicating the number of children.
    -663              */
    -664             getNumChildren:function () {
    -665                 return this.childrenList.length;
    -666             },
    -667             getNumActiveChildren:function () {
    -668                 return this.activeChildren.length;
    -669             },
    -670             /**
    -671              * Returns the Actor at the iPosition(th) position.
    -672              * @param iPosition an integer indicating the position array.
    -673              * @return the CAAT.Foundation.Actor object at position.
    -674              */
    -675             getChildAt:function (iPosition) {
    -676                 return this.childrenList[ iPosition ];
    -677             },
    -678             /**
    -679              * Changes an actor's ZOrder.
    -680              * @param actor the actor to change ZOrder for
    -681              * @param index an integer indicating the new ZOrder. a value greater than children list size means to be the
    -682              * last ZOrder Actor.
    -683              */
    -684             setZOrder:function (actor, index) {
    -685                 var actorPos = this.findChild(actor);
    -686                 // the actor is present
    -687                 if (-1 !== actorPos) {
    -688                     var cl = this.childrenList;
    -689                     // trivial reject.
    -690                     if (index === actorPos) {
    -691                         return;
    -692                     }
    -693 
    -694                     if (index >= cl.length) {
    -695                         cl.splice(actorPos, 1);
    -696                         cl.push(actor);
    -697                     } else {
    -698                         var nActor = cl.splice(actorPos, 1);
    -699                         if (index < 0) {
    -700                             index = 0;
    -701                         } else if (index > cl.length) {
    -702                             index = cl.length;
    -703                         }
    -704 
    -705                         cl.splice(index, 0, nActor[0]);
    -706                     }
    -707 
    -708                     this.invalidateLayout();
    -709                 }
    -710             }
    -711         }
    -712 
    -713     }
    -714 });
    -715 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DBodyActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DBodyActor.js.html deleted file mode 100644 index 596e9e6b..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DBodyActor.js.html +++ /dev/null @@ -1,305 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name Box2D
    -  5      * @memberOf CAAT.Foundation
    -  6      * @namespace
    -  7      */
    -  8 
    -  9     /**
    - 10      * @name B2DBodyActor
    - 11      * @memberOf CAAT.Foundation.Box2D
    - 12      * @extends CAAT.Foundation.Actor
    - 13      * @constructor
    - 14      */
    - 15 
    - 16     defines:"CAAT.Foundation.Box2D.B2DBodyActor",
    - 17     depends:[
    - 18         "CAAT.Foundation.Actor"
    - 19     ],
    - 20     aliases : ["CAAT.B2DBodyActor"],
    - 21     extendsClass:"CAAT.Foundation.Actor",
    - 22     extendsWith:function () {
    - 23 
    - 24         /**
    - 25          * @lends CAAT
    - 26          */
    - 27 
    - 28         /**
    - 29          * Points to Meter ratio value.
    - 30          * @type {Number}
    - 31          */
    - 32         CAAT.PMR = 64;
    - 33 
    - 34         /**
    - 35          * (As Eemeli Kelokorpi suggested)
    - 36          *
    - 37          * Enable Box2D debug renderer.
    - 38          *
    - 39          * @param set {boolean} enable or disable
    - 40          * @param director {CAAT.Foundation.Director}
    - 41          * @param world {object} box2d world
    - 42          * @param scale {numner} a scale value.
    - 43          */
    - 44         CAAT.enableBox2DDebug = function (set, director, world, scale) {
    - 45 
    - 46             if (set) {
    - 47                 var debugDraw = new Box2D.Dynamics.b2DebugDraw();
    - 48                 try {
    - 49                     debugDraw.m_sprite.graphics.clear = function () {
    - 50                     };
    - 51                 } catch (e) {
    - 52                 }
    - 53 
    - 54                 world.SetDebugDraw(debugDraw);
    - 55 
    - 56                 debugDraw.SetSprite(director.ctx);
    - 57                 debugDraw.SetDrawScale(scale || CAAT.PMR);
    - 58                 debugDraw.SetFillAlpha(.5);
    - 59                 debugDraw.SetLineThickness(1.0);
    - 60                 debugDraw.SetFlags(0x0001 | 0x0002);
    - 61 
    - 62             } else {
    - 63                 world.SetDebugDraw(null);
    - 64             }
    - 65         };
    - 66 
    - 67         return {
    - 68 
    - 69             /**
    - 70              * @lends CAAT.Foundation.Box2D.B2DBodyActor.prototype
    - 71              */
    - 72 
    - 73             /**
    - 74              * Body restitution.
    - 75              */
    - 76             restitution:.5,
    - 77 
    - 78             /**
    - 79              * Body friction.
    - 80              */
    - 81             friction:.5,
    - 82 
    - 83             /**
    - 84              * Body dentisy
    - 85              */
    - 86             density:1,
    - 87 
    - 88             /**
    - 89              * Dynamic bodies by default
    - 90              */
    - 91             bodyType:Box2D.Dynamics.b2Body.b2_dynamicBody,
    - 92 
    - 93             /**
    - 94              * Box2D body
    - 95              */
    - 96             worldBody:null,
    - 97 
    - 98             /**
    - 99              * Box2D world reference.
    -100              */
    -101             world:null,
    -102 
    -103             /**
    -104              * Box2d fixture
    -105              */
    -106             worldBodyFixture:null,
    -107 
    -108             /**
    -109              * Box2D body definition.
    -110              */
    -111             bodyDef:null,
    -112 
    -113             /**
    -114              * Box2D fixture definition.
    -115              */
    -116             fixtureDef:null,
    -117 
    -118             /**
    -119              * BodyData object linked to the box2D body.
    -120              */
    -121             bodyData:null,
    -122 
    -123             /**
    -124              * Recycle this actor when the body is not needed anymore ??
    -125              */
    -126             recycle:false,
    -127 
    -128             __init : function() {
    -129                 this.__super();
    -130                 this.setPositionAnchor(.5,.5);
    -131 
    -132                 return this;
    -133             },
    -134 
    -135             setPositionAnchor : function( ax, ay ) {
    -136                 this.tAnchorX= .5;
    -137                 this.tAnchorY= .5;
    -138             },
    -139 
    -140             setPositionAnchored : function(x,y,ax,ay) {
    -141                 this.x= x;
    -142                 this.y= y;
    -143                 this.tAnchorX= .5;
    -144                 this.tAnchorY= .5;
    -145             },
    -146 
    -147             /**
    -148              * set this actor to recycle its body, that is, do not destroy it.
    -149              */
    -150             setRecycle:function () {
    -151                 this.recycle = true;
    -152                 return this;
    -153             },
    -154             destroy:function () {
    -155 
    -156                 CAAT.Foundation.Box2D.B2DBodyActor.superclass.destroy.call(this);
    -157                 if (this.recycle) {
    -158                     this.setLocation(-Number.MAX_VALUE, -Number.MAX_VALUE);
    -159                     this.setAwake(false);
    -160                 } else {
    -161                     var body = this.worldBody;
    -162                     body.DestroyFixture(this.worldBodyFixture);
    -163                     this.world.DestroyBody(body);
    -164                 }
    -165 
    -166                 return this;
    -167             },
    -168             setAwake:function (bool) {
    -169                 this.worldBody.SetAwake(bool);
    -170                 return this;
    -171             },
    -172             setSleepingAllowed:function (bool) {
    -173                 this.worldBody.SetSleepingAllowed(bool);
    -174                 return this;
    -175             },
    -176             setLocation:function (x, y) {
    -177                 this.worldBody.SetPosition(
    -178                     new Box2D.Common.Math.b2Vec2(
    -179                         x / CAAT.PMR,
    -180                         y / CAAT.PMR));
    -181                 return this;
    -182             },
    -183             /**
    -184              * Set this body's
    -185              * density.
    -186              * @param d {number}
    -187              */
    -188             setDensity:function (d) {
    -189                 this.density = d;
    -190                 return this;
    -191             },
    -192 
    -193             /**
    -194              * Set this body's friction.
    -195              * @param f {number}
    -196              */
    -197             setFriction:function (f) {
    -198                 this.friction = f;
    -199                 return this;
    -200             },
    -201 
    -202             /**
    -203              * Set this body's restitution coeficient.
    -204              * @param r {number}
    -205              */
    -206             setRestitution:function (r) {
    -207                 this.restitution = r;
    -208                 return this;
    -209             },
    -210 
    -211             /**
    -212              * Set this body's type:
    -213              * @param bodyType {Box2D.Dynamics.b2Body.b2_*}
    -214              */
    -215             setBodyType:function (bodyType) {
    -216                 this.bodyType = bodyType;
    -217                 return this;
    -218             },
    -219 
    -220             /**
    -221              * Helper method to check whether this js object contains a given property and if it doesn't exist
    -222              * create and set it to def value.
    -223              * @param obj {object}
    -224              * @param prop {string}
    -225              * @param def {object}
    -226              */
    -227             check:function (obj, prop, def) {
    -228                 if (!obj[prop]) {
    -229                     obj[prop] = def;
    -230                 }
    -231             },
    -232 
    -233             /**
    -234              * Create an actor as a box2D body binding, create it on the given world and with
    -235              * the initialization data set in bodyData object.
    -236              * @param world {Box2D.Dynamics.b2World} a Box2D world instance
    -237              * @param bodyData {object} An object with body info.
    -238              */
    -239             createBody:function (world, bodyData) {
    -240 
    -241                 if (bodyData) {
    -242                     this.check(bodyData, 'density', 1);
    -243                     this.check(bodyData, 'friction', .5);
    -244                     this.check(bodyData, 'restitution', .2);
    -245                     this.check(bodyData, 'bodyType', Box2D.Dynamics.b2Body.b2_staticBody);
    -246                     this.check(bodyData, 'userData', {});
    -247                     this.check(bodyData, 'image', null);
    -248 
    -249                     this.density = bodyData.density;
    -250                     this.friction = bodyData.friction;
    -251                     this.restitution = bodyData.restitution;
    -252                     this.bodyType = bodyData.bodyType;
    -253                     this.image = bodyData.image;
    -254 
    -255                 }
    -256 
    -257                 this.world = world;
    -258 
    -259                 return this;
    -260             },
    -261 
    -262             /**
    -263              * Get this body's center on screen regardless of its shape.
    -264              * This method will return box2d body's centroid.
    -265              */
    -266             getCenter:function () {
    -267                 return this.worldBody.GetPosition();
    -268             },
    -269 
    -270             /**
    -271              * Get a distance joint's position on pixels.
    -272              */
    -273             getDistanceJointLocalAnchor:function () {
    -274                 return new Box2D.Common.Math.b2Vec2(0,0);
    -275             },
    -276 
    -277             /**
    -278              * Method override to get position and rotation angle from box2d body.
    -279              * @param director {CAAT.Director}
    -280              * @param time {number}
    -281              */
    -282             animate: function(director, time) {
    -283 
    -284                 var pos= this.worldBody.GetPosition();
    -285 
    -286                 CAAT.Foundation.Actor.prototype.setLocation.call(
    -287                         this,
    -288                         CAAT.PMR*pos.x,
    -289                         CAAT.PMR*pos.y);
    -290 
    -291                 this.setRotation( this.worldBody.GetAngle() );
    -292 
    -293                 return CAAT.Foundation.Box2D.B2DBodyActor.superclass.animate.call(this,director,time);
    -294             }
    -295         }
    -296     }
    -297 });
    -298 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DCircularBody.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DCircularBody.js.html deleted file mode 100644 index 25b4958c..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DCircularBody.js.html +++ /dev/null @@ -1,106 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name B2DCircularBody
    -  5      * @memberOf CAAT.Foundation.Box2D
    -  6      * @extends CAAT.Foundation.Box2D.B2DBodyActor
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.Foundation.Box2D.B2DCircularBody",
    - 11     depends : [
    - 12         "CAAT.Foundation.Box2D.B2DBodyActor"
    - 13     ],
    - 14     aliases : ["CAAT.B2DCircularBody"],
    - 15     extendsClass : "CAAT.Foundation.Box2D.B2DBodyActor",
    - 16     constants : {
    - 17 
    - 18         /**
    - 19          * @lends CAAT.Foundation.Box2D.B2DCircularBody
    - 20          */
    - 21 
    - 22         createCircularBody : function(world, bodyData) {
    - 23             if ( bodyData.radius )  this.radius= bodyData.radius;
    - 24 
    - 25             var fixDef=             new Box2D.Dynamics.b2FixtureDef();
    - 26             fixDef.density=         bodyData.density;
    - 27             fixDef.friction=        bodyData.friction;
    - 28             fixDef.restitution=     bodyData.restitution;
    - 29             fixDef.shape =          new Box2D.Collision.Shapes.b2CircleShape(bodyData.radius/CAAT.PMR);
    - 30 
    - 31             var bodyDef =           new Box2D.Dynamics.b2BodyDef();
    - 32             bodyDef.type =          bodyData.bodyType;
    - 33             bodyDef.position.Set( bodyData.x/CAAT.PMR, bodyData.y/CAAT.PMR );
    - 34 
    - 35             // link entre cuerpo fisico box2d y caat.
    - 36             fixDef.userData=        bodyData.userData;
    - 37             bodyDef.userData=       bodyData.userData;
    - 38 
    - 39             var worldBody=          world.CreateBody(bodyDef);
    - 40             var worldBodyFixture=   worldBody.CreateFixture(fixDef);
    - 41 
    - 42             if ( bodyData.isSensor ) {
    - 43                 worldBodyFixture.SetSensor(true);
    - 44             }
    - 45 
    - 46             return {
    - 47                 worldBody:          worldBody,
    - 48                 worldBodyFixture:   worldBodyFixture,
    - 49                 fixDef:             fixDef,
    - 50                 bodyDef:            bodyDef
    - 51             };
    - 52         }
    - 53     },
    - 54     extendsWith : {
    - 55 
    - 56         /**
    - 57          * @lends CAAT.Foundation.Box2D.B2DCircularBody.prototype
    - 58          */
    - 59 
    - 60 
    - 61         /**
    - 62          * Default radius.
    - 63          */
    - 64         radius: 1,
    - 65 
    - 66         /**
    - 67          * Create a box2d body and link it to this CAAT.Actor instance.
    - 68          * @param world {Box2D.Dynamics.b2World} a Box2D world instance
    - 69          * @param bodyData {object}
    - 70          */
    - 71         createBody : function(world, bodyData) {
    - 72 
    - 73             var scale= (bodyData.radius || 1);
    - 74             scale= scale+ (bodyData.bodyDefScaleTolerance || 0)*Math.random();
    - 75             bodyData.radius= scale;
    - 76 
    - 77             CAAT.Foundation.Box2D.B2DCircularBody.superclass.createBody.call(this,world,bodyData);
    - 78             var box2D_data= CAAT.Foundation.Box2D.B2DCircularBody.createCircularBody(world,bodyData);
    - 79 
    - 80             bodyData.userData.actor=         this;
    - 81 
    - 82             this.worldBody=         box2D_data.worldBody;
    - 83             this.worldBodyFixture=  box2D_data.worldBodyFixture;
    - 84             this.fixtureDef=        box2D_data.fixDef;
    - 85             this.bodyDef=           box2D_data.bodyDef;
    - 86             this.bodyData=          bodyData;
    - 87 
    - 88             this.setFillStyle(this.worldBodyFixture.IsSensor() ? 'red' : 'green').
    - 89                     setBackgroundImage(this.image).
    - 90                     setSize(2*bodyData.radius,2*bodyData.radius).
    - 91                     setImageTransformation(CAAT.Foundation.SpriteImage.TR_FIXED_TO_SIZE);
    - 92 
    - 93 
    - 94             return this;
    - 95         }
    - 96     }
    - 97 
    - 98 });
    - 99 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DPolygonBody.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DPolygonBody.js.html deleted file mode 100644 index 155f4b29..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DPolygonBody.js.html +++ /dev/null @@ -1,186 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name B2DPolygonBody
    -  5      * @memberOf CAAT.Foundation.Box2D
    -  6      * @extends CAAT.Foundation.Box2D.B2DBodyActor
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.Foundation.Box2D.B2DPolygonBody",
    - 11     depends : [
    - 12         "CAAT.Foundation.Box2D.B2DBodyActor",
    - 13         "CAAT.Foundation.SpriteImage"
    - 14     ],
    - 15     aliases : ["CAAT.B2DPolygonBody"],
    - 16     constants: {
    - 17 
    - 18         /**
    - 19          * @lends CAAT.Foundation.Box2D.B2DPolygonBody
    - 20          */
    - 21 
    - 22         TYPE: {
    - 23             EDGE:   'edge',
    - 24             BOX:    'box',
    - 25             POLYGON:'polygon'
    - 26         },
    - 27 
    - 28         /**
    - 29          * Helper function to aid in box2d polygon shaped bodies.
    - 30          * @param world
    - 31          * @param bodyData
    - 32          */
    - 33         createPolygonBody : function(world, bodyData) {
    - 34             var fixDef = new Box2D.Dynamics.b2FixtureDef();
    - 35             fixDef.density = bodyData.density;
    - 36             fixDef.friction = bodyData.friction;
    - 37             fixDef.restitution = bodyData.restitution;
    - 38             fixDef.shape = new Box2D.Collision.Shapes.b2PolygonShape();
    - 39 
    - 40             var minx = Number.MAX_VALUE;
    - 41             var maxx = -Number.MAX_VALUE;
    - 42             var miny = Number.MAX_VALUE;
    - 43             var maxy = -Number.MAX_VALUE;
    - 44 
    - 45             var vec = [];
    - 46 
    - 47             var scale = (bodyData.bodyDefScale || 1);
    - 48             scale = scale + (bodyData.bodyDefScaleTolerance || 0) * Math.random();
    - 49 
    - 50             for (var i = 0; i < bodyData.bodyDef.length; i++) {
    - 51                 var x = bodyData.bodyDef[i].x * scale;
    - 52                 var y = bodyData.bodyDef[i].y * scale;
    - 53                 if (x < minx) {
    - 54                     minx = x;
    - 55                 }
    - 56                 if (x > maxx) {
    - 57                     maxx = x;
    - 58                 }
    - 59                 if (y < miny) {
    - 60                     miny = y;
    - 61                 }
    - 62                 if (y > maxy) {
    - 63                     maxy = y;
    - 64                 }
    - 65 /*
    - 66                 x += bodyData.x || 0;
    - 67                 y += bodyData.y || 0;
    - 68                 */
    - 69                 vec.push(new Box2D.Common.Math.b2Vec2(x / CAAT.PMR, y / CAAT.PMR));
    - 70             }
    - 71 
    - 72             var boundingBox = [
    - 73                 {x:minx, y:miny},
    - 74                 {x:maxx, y:maxy}
    - 75             ];
    - 76 
    - 77             var bodyDef = new Box2D.Dynamics.b2BodyDef();
    - 78             bodyDef.type = bodyData.bodyType;
    - 79             bodyDef.position.Set(
    - 80                 ((maxx - minx) / 2 + (bodyData.x || 0)) / CAAT.PMR,
    - 81                 ((maxy - miny) / 2 + (bodyData.y || 0)) / CAAT.PMR );
    - 82 
    - 83             if (bodyData.polygonType === CAAT.Foundation.Box2D.B2DPolygonBody.TYPE.EDGE) {
    - 84 
    - 85                 var v0= new Box2D.Common.Math.b2Vec2(vec[0].x, vec[0].y );
    - 86                 var v1= new Box2D.Common.Math.b2Vec2(vec[1].x-vec[0].x, vec[1].y-vec[0].y );
    - 87 
    - 88                 bodyDef.position.Set(v0.x, v0.y);
    - 89                 fixDef.shape.SetAsEdge(new Box2D.Common.Math.b2Vec2(0,0), v1);
    - 90 
    - 91 
    - 92             } else if (bodyData.polygonType === CAAT.Foundation.Box2D.B2DPolygonBody.TYPE.BOX) {
    - 93 
    - 94                 fixDef.shape.SetAsBox(
    - 95                     (maxx - minx) / 2 / CAAT.PMR,
    - 96                     (maxy - miny) / 2 / CAAT.PMR);
    - 97 
    - 98             } else if (bodyData.polygonType === CAAT.Foundation.Box2D.B2DPolygonBody.TYPE.POLYGON ) {
    - 99 
    -100                 fixDef.shape.SetAsArray(vec, vec.length);
    -101 
    -102             } else {
    -103                 throw 'Unkown bodyData polygonType: '+bodyData.polygonType;
    -104             }
    -105 
    -106             // link entre cuerpo fisico box2d y caat.
    -107             fixDef.userData = bodyData.userData;
    -108             bodyDef.userData = bodyData.userData;
    -109 
    -110             var worldBody = world.CreateBody(bodyDef);
    -111             var worldBodyFixture = worldBody.CreateFixture(fixDef);
    -112 
    -113 
    -114             if (bodyData.isSensor) {
    -115                 worldBodyFixture.SetSensor(true);
    -116             }
    -117 
    -118             return {
    -119                 worldBody:          worldBody,
    -120                 worldBodyFixture:   worldBodyFixture,
    -121                 fixDef:             fixDef,
    -122                 bodyDef:            bodyDef,
    -123                 boundingBox:        boundingBox
    -124             };
    -125         }
    -126     },
    -127     extendsClass : "CAAT.Foundation.Box2D.B2DBodyActor",
    -128     extendsWith : {
    -129 
    -130         /**
    -131          * @lends CAAT.Foundation.Box2D.B2DPolygonBody.prototype
    -132          */
    -133 
    -134         /**
    -135          * Measured body's bounding box.
    -136          */
    -137         boundingBox: null,
    -138 
    -139         /**
    -140          * Get on-screen distance joint coordinate.
    -141          */
    -142         getDistanceJointLocalAnchor : function() {
    -143             var b= this.worldBody;
    -144             var poly= b.GetFixtureList().GetShape().GetLocalCenter();
    -145             return poly;
    -146         },
    -147 
    -148         /**
    -149          * Create a box2d body and link it to this CAAT.Actor.
    -150          * @param world {Box2D.Dynamics.b2World}
    -151          * @param bodyData {object}
    -152          */
    -153         createBody : function(world, bodyData) {
    -154             CAAT.Foundation.Box2D.B2DPolygonBody.superclass.createBody.call(this,world,bodyData);
    -155 
    -156             var box2D_data= CAAT.Foundation.Box2D.B2DPolygonBody.createPolygonBody(world,bodyData);
    -157 
    -158             bodyData.userData.actor = this;
    -159 
    -160             this.worldBody=         box2D_data.worldBody;
    -161             this.worldBodyFixture=  box2D_data.worldBodyFixture;
    -162             this.fixtureDef=        box2D_data.fixDef;
    -163             this.bodyDef=           box2D_data.bodyDef;
    -164             this.bodyData=          bodyData;
    -165             this.boundingBox=       box2D_data.boundingBox;
    -166 
    -167             this.setBackgroundImage( bodyData.image ).
    -168                 setSize(
    -169                     box2D_data.boundingBox[1].x-box2D_data.boundingBox[0].x+1,
    -170                     box2D_data.boundingBox[1].y-box2D_data.boundingBox[0].y+1 ).
    -171                 setFillStyle( box2D_data.worldBodyFixture.IsSensor() ? '#0f0' : '#f00').
    -172                 setImageTransformation(CAAT.Foundation.SpriteImage.TR_FIXED_TO_SIZE);
    -173 
    -174             return this;
    -175         }
    -176     }
    -177 
    -178 });
    -179 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Director.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Director.js.html deleted file mode 100644 index 1929ae1e..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Director.js.html +++ /dev/null @@ -1,3020 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  **/
    -  5 
    -  6 CAAT.Module({
    -  7 
    -  8     /**
    -  9      * @name Director
    - 10      * @memberOf CAAT.Foundation
    - 11      * @extends CAAT.Foundation.ActorContainer
    - 12      *
    - 13      * @constructor
    - 14      */
    - 15 
    - 16     defines:"CAAT.Foundation.Director",
    - 17     aliases:["CAAT.Director"],
    - 18     extendsClass:"CAAT.Foundation.ActorContainer",
    - 19     depends:[
    - 20         "CAAT.Core.Class",
    - 21         "CAAT.Core.Constants",
    - 22 
    - 23         "CAAT.Foundation.ActorContainer",
    - 24         "CAAT.Module.Audio.AudioManager",
    - 25         "CAAT.Module.Runtime.BrowserInfo",
    - 26         "CAAT.Module.Debug.Debug",
    - 27         "CAAT.Math.Point",
    - 28         "CAAT.Math.Rectangle",
    - 29         "CAAT.Math.Matrix",
    - 30         "CAAT.Foundation.Timer.TimerManager",
    - 31         "CAAT.Foundation.Actor",
    - 32         "CAAT.Foundation.Scene",
    - 33         "CAAT.Event.AnimationLoop",
    - 34         "CAAT.Event.Input",
    - 35         "CAAT.Event.KeyEvent",
    - 36         "CAAT.Event.MouseEvent",
    - 37         "CAAT.Event.TouchEvent",
    - 38 
    - 39         "CAAT.WebGL.Program",
    - 40         "CAAT.WebGL.ColorProgram",
    - 41         "CAAT.WebGL.TextureProgram",
    - 42         "CAAT.WebGL.GLU",
    - 43 
    - 44         "CAAT.Module.TexturePacker.TexturePageManager"
    - 45     ],
    - 46     constants:{
    - 47         /**
    - 48          * @lends  CAAT.Foundation.Director
    - 49          */
    - 50 
    - 51         /** @const @type {number} */ RENDER_MODE_CONTINUOUS:1, // redraw every frame
    - 52         /** @const @type {number} */ RENDER_MODE_DIRTY:2, // suitable for evented CAAT.
    - 53 
    - 54         /** @const @type {number} */ CLEAR_DIRTY_RECTS:1,
    - 55         /** @const @type {number} */ CLEAR_ALL:true,
    - 56         /** @const @type {number} */ CLEAR_NONE:false,
    - 57 
    - 58         /** @const @type {number} */ RESIZE_NONE:1,
    - 59         /** @const @type {number} */ RESIZE_WIDTH:2,
    - 60         /** @const @type {number} */ RESIZE_HEIGHT:4,
    - 61         /** @const @type {number} */ RESIZE_BOTH:8,
    - 62         /** @const @type {number} */ RESIZE_PROPORTIONAL:16
    - 63     },
    - 64     extendsWith:function () {
    - 65         return {
    - 66 
    - 67             /**
    - 68              * @lends  CAAT.Foundation.Director.prototype
    - 69              */
    - 70 
    - 71             __init:function () {
    - 72                 this.__super();
    - 73 
    - 74                 this.browserInfo = CAAT.Module.Runtime.BrowserInfo;
    - 75                 this.audioManager = new CAAT.Module.Audio.AudioManager().initialize(8);
    - 76                 this.scenes = [];
    - 77                 this.imagesCache= [];
    - 78 
    - 79                 // input related variables initialization
    - 80                 this.mousePoint = new CAAT.Math.Point(0, 0, 0);
    - 81                 this.prevMousePoint = new CAAT.Math.Point(0, 0, 0);
    - 82                 this.screenMousePoint = new CAAT.Math.Point(0, 0, 0);
    - 83                 this.isMouseDown = false;
    - 84                 this.lastSelectedActor = null;
    - 85                 this.dragging = false;
    - 86 
    - 87                 this.cDirtyRects = [];
    - 88                 this.sDirtyRects = [];
    - 89                 this.dirtyRects = [];
    - 90                 for (var i = 0; i < 64; i++) {
    - 91                     this.dirtyRects.push(new CAAT.Math.Rectangle());
    - 92                 }
    - 93                 this.dirtyRectsIndex = 0;
    - 94                 this.touches = {};
    - 95 
    - 96                 this.timerManager = new CAAT.Foundation.Timer.TimerManager();
    - 97                 this.__map= {};
    - 98 
    - 99                 return this;
    -100             },
    -101 
    -102             /**
    -103              * flag indicating debug mode. It will draw affedted screen areas.
    -104              * @type {boolean}
    -105              */
    -106             debug:false,
    -107 
    -108             /**
    -109              * Set CAAT render mode. Right now, this takes no effect.
    -110              */
    -111             renderMode:CAAT.Foundation.Director.RENDER_MODE_CONTINUOUS,
    -112 
    -113             /**
    -114              * This method will be called before rendering any director scene.
    -115              * Use this method to calculate your physics for example.
    -116              * @private
    -117              */
    -118             onRenderStart:null,
    -119 
    -120             /**
    -121              * This method will be called after rendering any director scene.
    -122              * Use this method to clean your physics forces for example.
    -123              * @private
    -124              */
    -125             onRenderEnd:null,
    -126 
    -127             // input related attributes
    -128             /**
    -129              * mouse coordinate related to canvas 0,0 coord.
    -130              * @private
    -131              */
    -132             mousePoint:null,
    -133 
    -134             /**
    -135              * previous mouse position cache. Needed for drag events.
    -136              * @private
    -137              */
    -138             prevMousePoint:null,
    -139 
    -140             /**
    -141              * screen mouse coordinates.
    -142              * @private
    -143              */
    -144             screenMousePoint:null,
    -145 
    -146             /**
    -147              * is the left mouse button pressed ?.
    -148              * Needed to handle dragging.
    -149              */
    -150             isMouseDown:false,
    -151 
    -152             /**
    -153              * director's last actor receiving input.
    -154              * Needed to set capture for dragging events.
    -155              */
    -156             lastSelectedActor:null,
    -157 
    -158             /**
    -159              * is input in drag mode ?
    -160              */
    -161             dragging:false,
    -162 
    -163             // other attributes
    -164 
    -165             /**
    -166              * This director scene collection.
    -167              * @type {Array.<CAAT.Foundation.Scene>}
    -168              */
    -169             scenes:null,
    -170 
    -171             /**
    -172              * The current Scene. This and only this will receive events.
    -173              */
    -174             currentScene:null,
    -175 
    -176             /**
    -177              * The canvas the Director draws on.
    -178              * @private
    -179              */
    -180             canvas:null,
    -181 
    -182             /**
    -183              * This director´s canvas rendering context.
    -184              */
    -185             ctx:null,
    -186 
    -187             /**
    -188              * director time.
    -189              * @private
    -190              */
    -191             time:0,
    -192 
    -193             /**
    -194              * global director timeline.
    -195              * @private
    -196              */
    -197             timeline:0,
    -198 
    -199             /**
    -200              * An array of JSON elements of the form { id:string, image:Image }
    -201              */
    -202             imagesCache:null,
    -203 
    -204             /**
    -205              * this director´s audio manager.
    -206              * @private
    -207              */
    -208             audioManager:null,
    -209 
    -210             /**
    -211              * Clear screen strategy:
    -212              * CAAT.Foundation.Director.CLEAR_NONE : director won´t clear the background.
    -213              * CAAT.Foundation.Director.CLEAR_DIRTY_RECTS : clear only affected actors screen area.
    -214              * CAAT.Foundation.Director.CLEAR_ALL : clear the whole canvas object.
    -215              */
    -216             clear: CAAT.Foundation.Director.CLEAR_ALL,
    -217 
    -218             /**
    -219              * if CAAT.CACHE_SCENE_ON_CHANGE is set, this scene will hold a cached copy of the exiting scene.
    -220              * @private
    -221              */
    -222             transitionScene:null,
    -223 
    -224             /**
    -225              * Some browser related information.
    -226              */
    -227             browserInfo:null,
    -228 
    -229             /**
    -230              * 3d context
    -231              * @private
    -232              */
    -233             gl:null,
    -234 
    -235             /**
    -236              * is WebGL enabled as renderer ?
    -237              * @private
    -238              */
    -239             glEnabled:false,
    -240 
    -241             /**
    -242              * if webGL is on, CAAT will texture pack all images transparently.
    -243              * @private
    -244              */
    -245             glTextureManager:null,
    -246 
    -247             /**
    -248              * The only GLSL program for webGL
    -249              * @private
    -250              */
    -251             glTtextureProgram:null,
    -252             glColorProgram:null,
    -253 
    -254             /**
    -255              * webGL projection matrix
    -256              * @private
    -257              */
    -258             pMatrix:null, // projection matrix
    -259 
    -260             /**
    -261              * webGL vertex array
    -262              * @private
    -263              */
    -264             coords:null, // Float32Array
    -265 
    -266             /**
    -267              * webGL vertex indices.
    -268              * @private
    -269              */
    -270             coordsIndex:0,
    -271 
    -272             /**
    -273              * webGL uv texture indices
    -274              * @private
    -275              */
    -276             uv:null,
    -277             uvIndex:0,
    -278 
    -279             /**
    -280              * draw tris front_to_back or back_to_front ?
    -281              * @private
    -282              */
    -283             front_to_back:false,
    -284 
    -285             /**
    -286              * statistics object
    -287              */
    -288             statistics:{
    -289                 size_total:0,
    -290                 size_active:0,
    -291                 size_dirtyRects:0,
    -292                 draws:0,
    -293                 size_discarded_by_dirty_rects:0
    -294             },
    -295 
    -296             /**
    -297              * webGL current texture page. This minimizes webGL context changes.
    -298              * @private
    -299              */
    -300             currentTexturePage:0,
    -301 
    -302             /**
    -303              * webGL current shader opacity.
    -304              * BUGBUG: change this by vertex colors.
    -305              * @private
    -306              */
    -307             currentOpacity:1,
    -308 
    -309             /**
    -310              * if CAAT.NO_RAF is set (no request animation frame), this value is the setInterval returned
    -311              * id.
    -312              * @private
    -313              */
    -314             intervalId:null,
    -315 
    -316             /**
    -317              * Rendered frames counter.
    -318              */
    -319             frameCounter:0,
    -320 
    -321             /**
    -322              * Window resize strategy.
    -323              * see CAAT.Foundation.Director.RESIZE_* constants.
    -324              * @private
    -325              */
    -326             resize:1,
    -327 
    -328             /**
    -329              * Callback when the window is resized.
    -330              */
    -331             onResizeCallback:null,
    -332 
    -333             /**
    -334              * Calculated gesture event scale.
    -335              * @private
    -336              */
    -337             __gestureScale:0,
    -338 
    -339             /**
    -340              * Calculated gesture event rotation.
    -341              * @private
    -342              */
    -343             __gestureRotation:0,
    -344 
    -345             /**
    -346              * Dirty rects cache.
    -347              * An array of CAAT.Math.Rectangle object.
    -348              * @private
    -349              */
    -350             dirtyRects:null, // dirty rects cache.
    -351 
    -352             /**
    -353              * current dirty rects.
    -354              * @private
    -355              */
    -356             cDirtyRects:null, // dirty rects cache.
    -357 
    -358             /**
    -359              * Currently used dirty rects.
    -360              * @private
    -361              */
    -362             sDirtyRects:null, // scheduled dirty rects.
    -363 
    -364             /**
    -365              * Number of currently allocated dirty rects.
    -366              * @private
    -367              */
    -368             dirtyRectsIndex:0,
    -369 
    -370             /**
    -371              * Dirty rects enabled ??
    -372              * @private
    -373              */
    -374             dirtyRectsEnabled:false,
    -375 
    -376             /**
    -377              * Number of dirty rects.
    -378              * @private
    -379              */
    -380             nDirtyRects:0,
    -381 
    -382             /**
    -383              * Dirty rects count debug info.
    -384              * @private
    -385              */
    -386             drDiscarded:0, // discarded by dirty rects.
    -387 
    -388             /**
    -389              * Is this director stopped ?
    -390              */
    -391             stopped:false, // is stopped, this director will do nothing.
    -392 
    -393             /**
    -394              * currently unused.
    -395              * Intended to run caat in evented mode.
    -396              * @private
    -397              */
    -398             needsRepaint:false,
    -399 
    -400             /**
    -401              * Touches information. Associate touch.id with an actor and original touch info.
    -402              * @private
    -403              */
    -404             touches:null,
    -405 
    -406             /**
    -407              * Director´s timer manager.
    -408              * Each scene has a timerManager as well.
    -409              * The difference is the scope. Director´s timers will always be checked whereas scene´ timers
    -410              * will only be scheduled/checked when the scene is director´ current scene.
    -411              * @private
    -412              */
    -413             timerManager:null,
    -414 
    -415             /**
    -416              * Retina display deicePixels/backingStorePixels ratio
    -417              * @private
    -418              */
    -419             SCREEN_RATIO : 1,
    -420 
    -421             __map : null,
    -422 
    -423             clean:function () {
    -424                 this.scenes = null;
    -425                 this.currentScene = null;
    -426                 this.imagesCache = null;
    -427                 this.audioManager = null;
    -428                 this.isMouseDown = false;
    -429                 this.lastSelectedActor = null;
    -430                 this.dragging = false;
    -431                 this.__gestureScale = 0;
    -432                 this.__gestureRotation = 0;
    -433                 this.dirty = true;
    -434                 this.dirtyRects = null;
    -435                 this.cDirtyRects = null;
    -436                 this.dirtyRectsIndex = 0;
    -437                 this.dirtyRectsEnabled = false;
    -438                 this.nDirtyRects = 0;
    -439                 this.onResizeCallback = null;
    -440                 this.__map= {};
    -441                 return this;
    -442             },
    -443 
    -444             cancelPlay : function(id) {
    -445                 return this.audioManager.cancelPlay(id);
    -446             },
    -447 
    -448             cancelPlayByChannel : function(audioObject) {
    -449                 return this.audioManager.cancelPlayByChannel(audioObject);
    -450             },
    -451 
    -452             setAudioFormatExtensions : function( extensions ) {
    -453                 this.audioManager.setAudioFormatExtensions(extensions);
    -454                 return this;
    -455             },
    -456 
    -457             setValueForKey : function( key, value ) {
    -458                 this.__map[key]= value;
    -459                 return this;
    -460             },
    -461 
    -462             getValueForKey : function( key ) {
    -463                 return this.__map[key];
    -464                 return this;
    -465             },
    -466 
    -467             createTimer:function (startTime, duration, callback_timeout, callback_tick, callback_cancel) {
    -468                 return this.timerManager.createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel, this);
    -469             },
    -470 
    -471             requestRepaint:function () {
    -472                 this.needsRepaint = true;
    -473             },
    -474 
    -475             getCurrentScene:function () {
    -476                 return this.currentScene;
    -477             },
    -478 
    -479             checkDebug:function () {
    -480                 if (!navigator.isCocoonJS && CAAT.DEBUG) {
    -481                     var dd = new CAAT.Module.Debug.Debug().initialize(this.width, 60);
    -482                     this.debugInfo = dd.debugInfo.bind(dd);
    -483                 }
    -484             },
    -485             getRenderType:function () {
    -486                 return this.glEnabled ? 'WEBGL' : 'CANVAS';
    -487             },
    -488             windowResized:function (w, h) {
    -489                 var c = CAAT.Foundation.Director;
    -490                 switch (this.resize) {
    -491                     case c.RESIZE_WIDTH:
    -492                         this.setBounds(0, 0, w, this.height);
    -493                         break;
    -494                     case c.RESIZE_HEIGHT:
    -495                         this.setBounds(0, 0, this.width, h);
    -496                         break;
    -497                     case c.RESIZE_BOTH:
    -498                         this.setBounds(0, 0, w, h);
    -499                         break;
    -500                     case c.RESIZE_PROPORTIONAL:
    -501                         this.setScaleProportional(w, h);
    -502                         break;
    -503                 }
    -504 
    -505                 if (this.glEnabled) {
    -506                     this.glReset();
    -507                 }
    -508 
    -509                 if (this.onResizeCallback) {
    -510                     this.onResizeCallback(this, w, h);
    -511                 }
    -512 
    -513             },
    -514             setScaleProportional:function (w, h) {
    -515 
    -516                 var factor = Math.min(w / this.referenceWidth, h / this.referenceHeight);
    -517 
    -518                 this.canvas.width = this.referenceWidth * factor;
    -519                 this.canvas.height = this.referenceHeight * factor;
    -520                 this.ctx = this.canvas.getContext(this.glEnabled ? 'experimental-webgl' : '2d');
    -521 
    -522                 this.__setupRetina();
    -523 
    -524                 this.setScaleAnchored(factor * this.scaleX, factor * this.scaleY, 0, 0);
    -525 //                this.setScaleAnchored(factor, factor, 0, 0);
    -526 
    -527                 if (this.glEnabled) {
    -528                     this.glReset();
    -529                 }
    -530             },
    -531             /**
    -532              * Enable window resize events and set redimension policy. A callback functio could be supplied
    -533              * to be notified on a Director redimension event. This is necessary in the case you set a redim
    -534              * policy not equal to RESIZE_PROPORTIONAL. In those redimension modes, director's area and their
    -535              * children scenes are resized to fit the new area. But scenes content is not resized, and have
    -536              * no option of knowing so uless an onResizeCallback function is supplied.
    -537              *
    -538              * @param mode {number}  RESIZE_BOTH, RESIZE_WIDTH, RESIZE_HEIGHT, RESIZE_NONE.
    -539              * @param onResizeCallback {function(director{CAAT.Director}, width{integer}, height{integer})} a callback
    -540              * to notify on canvas resize.
    -541              */
    -542             enableResizeEvents:function (mode, onResizeCallback) {
    -543                 var dd= CAAT.Foundation.Director;
    -544                 if (mode === dd.RESIZE_BOTH || mode === dd.RESIZE_WIDTH || mode === dd.RESIZE_HEIGHT || mode === dd.RESIZE_PROPORTIONAL) {
    -545                     this.referenceWidth = this.width;
    -546                     this.referenceHeight = this.height;
    -547                     this.resize = mode;
    -548                     CAAT.registerResizeListener(this);
    -549                     this.onResizeCallback = onResizeCallback;
    -550                     this.windowResized(window.innerWidth, window.innerHeight);
    -551                 } else {
    -552                     CAAT.unregisterResizeListener(this);
    -553                     this.onResizeCallback = null;
    -554                 }
    -555 
    -556                 return this;
    -557             },
    -558 
    -559             __setupRetina : function() {
    -560 
    -561                 if ( CAAT.RETINA_DISPLAY_ENABLED ) {
    -562 
    -563                     // The world is full of opensource awesomeness.
    -564                     //
    -565                     // Source: http://www.html5rocks.com/en/tutorials/canvas/hidpi/
    -566                     //
    -567                     var devicePixelRatio= CAAT.Module.Runtime.BrowserInfo.DevicePixelRatio;
    -568                     var backingStoreRatio = this.ctx.webkitBackingStorePixelRatio ||
    -569                                             this.ctx.mozBackingStorePixelRatio ||
    -570                                             this.ctx.msBackingStorePixelRatio ||
    -571                                             this.ctx.oBackingStorePixelRatio ||
    -572                                             this.ctx.backingStorePixelRatio ||
    -573                                             1;
    -574 
    -575                     var ratio = devicePixelRatio / backingStoreRatio;
    -576 
    -577                     if (devicePixelRatio !== backingStoreRatio) {
    -578 
    -579                         var oldWidth = this.canvas.width;
    -580                         var oldHeight = this.canvas.height;
    -581 
    -582                         this.canvas.width = oldWidth * ratio;
    -583                         this.canvas.height = oldHeight * ratio;
    -584 
    -585                         this.canvas.style.width = oldWidth + 'px';
    -586                         this.canvas.style.height = oldHeight + 'px';
    -587 
    -588                         this.setScaleAnchored( ratio, ratio, 0, 0 );
    -589                     } else {
    -590                         this.setScaleAnchored( 1, 1, 0, 0 );
    -591                     }
    -592 
    -593                     this.SCREEN_RATIO= ratio;
    -594                 } else {
    -595                     this.setScaleAnchored( 1, 1, 0, 0 );
    -596                 }
    -597 
    -598                 for (var i = 0; i < this.scenes.length; i++) {
    -599                     this.scenes[i].setBounds(0, 0, this.width, this.height);
    -600                 }
    -601             },
    -602 
    -603             /**
    -604              * Set this director's bounds as well as its contained scenes.
    -605              * @param x {number} ignored, will be 0.
    -606              * @param y {number} ignored, will be 0.
    -607              * @param w {number} director width.
    -608              * @param h {number} director height.
    -609              *
    -610              * @return this
    -611              */
    -612             setBounds:function (x, y, w, h) {
    -613 
    -614                 CAAT.Foundation.Director.superclass.setBounds.call(this, x, y, w, h);
    -615 
    -616                 if ( this.canvas.width!==w ) {
    -617                     this.canvas.width = w;
    -618                 }
    -619 
    -620                 if ( this.canvas.height!==h ) {
    -621                     this.canvas.height = h;
    -622                 }
    -623 
    -624                 this.ctx = this.canvas.getContext(this.glEnabled ? 'experimental-webgl' : '2d');
    -625 
    -626                 this.__setupRetina();
    -627 
    -628                 if (this.glEnabled) {
    -629                     this.glReset();
    -630                 }
    -631 
    -632                 return this;
    -633             },
    -634             /**
    -635              * This method performs Director initialization. Must be called once.
    -636              * If the canvas parameter is not set, it will create a Canvas itself,
    -637              * and the developer must explicitly add the canvas to the desired DOM position.
    -638              * This method will also set the Canvas dimension to the specified values
    -639              * by width and height parameters.
    -640              *
    -641              * @param width {number} a canvas width
    -642              * @param height {number} a canvas height
    -643              * @param canvas {HTMLCanvasElement=} An optional Canvas object.
    -644              * @param proxy {HTMLElement} this object can be an event proxy in case you'd like to layer different elements
    -645              *              and want events delivered to the correct element.
    -646              *
    -647              * @return this
    -648              */
    -649             initialize:function (width, height, canvas, proxy) {
    -650                 if ( typeof canvas!=="undefined" ) {
    -651                     if ( isString(canvas) ) {
    -652                         canvas= document.getElementById(canvas);
    -653                     } else if ( !(canvas instanceof HTMLCanvasElement ) ) {
    -654                         console.log("Canvas is a: "+canvas+" ???");
    -655                     }
    -656                 }
    -657 
    -658                 if (!canvas) {
    -659                     canvas = document.createElement('canvas');
    -660                     document.body.appendChild(canvas);
    -661                 }
    -662 
    -663                 this.canvas = canvas;
    -664 
    -665                 if (typeof proxy === 'undefined') {
    -666                     proxy = canvas;
    -667                 }
    -668 
    -669                 this.setBounds(0, 0, width, height);
    -670                 this.enableEvents(proxy);
    -671 
    -672                 this.timeline = new Date().getTime();
    -673 
    -674                 // transition scene
    -675                 if (CAAT.CACHE_SCENE_ON_CHANGE) {
    -676                     this.transitionScene = new CAAT.Foundation.Scene().setBounds(0, 0, width, height);
    -677                     var transitionCanvas = document.createElement('canvas');
    -678                     transitionCanvas.width = width;
    -679                     transitionCanvas.height = height;
    -680                     var transitionImageActor = new CAAT.Foundation.Actor().setBackgroundImage(transitionCanvas);
    -681                     this.transitionScene.ctx = transitionCanvas.getContext('2d');
    -682                     this.transitionScene.addChildImmediately(transitionImageActor);
    -683                     this.transitionScene.setEaseListener(this);
    -684                 }
    -685 
    -686                 this.checkDebug();
    -687 
    -688                 return this;
    -689             },
    -690             glReset:function () {
    -691                 this.pMatrix = CAAT.WebGL.GLU.makeOrtho(0, this.referenceWidth, this.referenceHeight, 0, -1, 1);
    -692                 this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);
    -693                 this.glColorProgram.setMatrixUniform(this.pMatrix);
    -694                 this.glTextureProgram.setMatrixUniform(this.pMatrix);
    -695                 this.gl.viewportWidth = this.canvas.width;
    -696                 this.gl.viewportHeight = this.canvas.height;
    -697             },
    -698             /**
    -699              * Experimental.
    -700              * Initialize a gl enabled director.
    -701              */
    -702             initializeGL:function (width, height, canvas, proxy) {
    -703 
    -704                 if (!canvas) {
    -705                     canvas = document.createElement('canvas');
    -706                     document.body.appendChild(canvas);
    -707                 }
    -708 
    -709                 canvas.width = width;
    -710                 canvas.height = height;
    -711 
    -712                 if (typeof proxy === 'undefined') {
    -713                     proxy = canvas;
    -714                 }
    -715 
    -716                 this.referenceWidth = width;
    -717                 this.referenceHeight = height;
    -718 
    -719                 var i;
    -720 
    -721                 try {
    -722                     this.gl = canvas.getContext("experimental-webgl"/*, {antialias: false}*/);
    -723                     this.gl.viewportWidth = width;
    -724                     this.gl.viewportHeight = height;
    -725                     CAAT.GLRENDER = true;
    -726                 } catch (e) {
    -727                 }
    -728 
    -729                 if (this.gl) {
    -730                     this.canvas = canvas;
    -731                     this.setBounds(0, 0, width, height);
    -732 
    -733                     this.enableEvents(canvas);
    -734                     this.timeline = new Date().getTime();
    -735 
    -736                     this.glColorProgram = new CAAT.WebGL.ColorProgram(this.gl).create().initialize();
    -737                     this.glTextureProgram = new CAAT.WebGL.TextureProgram(this.gl).create().initialize();
    -738                     this.glTextureProgram.useProgram();
    -739                     this.glReset();
    -740 
    -741                     var maxTris = 512;
    -742                     this.coords = new Float32Array(maxTris * 12);
    -743                     this.uv = new Float32Array(maxTris * 8);
    -744 
    -745                     this.gl.clearColor(0.0, 0.0, 0.0, 255);
    -746 
    -747                     if (this.front_to_back) {
    -748                         this.gl.clearDepth(1.0);
    -749                         this.gl.enable(this.gl.DEPTH_TEST);
    -750                         this.gl.depthFunc(this.gl.LESS);
    -751                     } else {
    -752                         this.gl.disable(this.gl.DEPTH_TEST);
    -753                     }
    -754 
    -755                     this.gl.enable(this.gl.BLEND);
    -756 // Fix FF                this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);
    -757                     this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA);
    -758                     this.glEnabled = true;
    -759 
    -760                     this.checkDebug();
    -761                 } else {
    -762                     // fallback to non gl enabled canvas.
    -763                     return this.initialize(width, height, canvas);
    -764                 }
    -765 
    -766                 return this;
    -767             },
    -768             /**
    -769              * Creates an initializes a Scene object.
    -770              * @return {CAAT.Scene}
    -771              */
    -772             createScene:function () {
    -773                 var scene = new CAAT.Scene();
    -774                 this.addScene(scene);
    -775                 return scene;
    -776             },
    -777             setImagesCache:function (imagesCache, tpW, tpH) {
    -778 
    -779                 if (!imagesCache || !imagesCache.length ) {
    -780                     return this;
    -781                 }
    -782 
    -783                 var i;
    -784 
    -785                 if (null !== this.glTextureManager) {
    -786                     this.glTextureManager.deletePages();
    -787                     this.glTextureManager = null;
    -788                 }
    -789 
    -790                 // delete previous image identifiers
    -791                 if (this.imagesCache) {
    -792                     var ids = [];
    -793                     for (i = 0; i < this.imagesCache.length; i++) {
    -794                         ids.push(this.imagesCache[i].id);
    -795                     }
    -796 
    -797                     for (i = 0; i < ids.length; i++) {
    -798                         delete this.imagesCache[ ids[i] ];
    -799                     }
    -800                 }
    -801 
    -802                 this.imagesCache = imagesCache;
    -803 
    -804                 if (imagesCache) {
    -805                     for (i = 0; i < imagesCache.length; i++) {
    -806                         this.imagesCache[ imagesCache[i].id ] = imagesCache[i].image;
    -807                     }
    -808                 }
    -809 
    -810                 this.tpW = tpW || 2048;
    -811                 this.tpH = tpH || 2048;
    -812 
    -813                 this.updateGLPages();
    -814 
    -815                 return this;
    -816             },
    -817             updateGLPages:function () {
    -818                 if (this.glEnabled) {
    -819 
    -820                     this.glTextureManager = new CAAT.Module.TexturePacker.TexturePageManager();
    -821                     this.glTextureManager.createPages(this.gl, this.tpW, this.tpH, this.imagesCache);
    -822 
    -823                     this.currentTexturePage = this.glTextureManager.pages[0];
    -824                     this.glTextureProgram.setTexture(this.currentTexturePage.texture);
    -825                 }
    -826             },
    -827             setGLTexturePage:function (tp) {
    -828                 this.currentTexturePage = tp;
    -829                 this.glTextureProgram.setTexture(tp.texture);
    -830                 return this;
    -831             },
    -832             /**
    -833              * Add a new image to director's image cache. If gl is enabled and the 'noUpdateGL' is not set to true this
    -834              * function will try to recreate the whole GL texture pages.
    -835              * If many handcrafted images are to be added to the director, some performance can be achieved by calling
    -836              * <code>director.addImage(id,image,false)</code> many times and a final call with
    -837              * <code>director.addImage(id,image,true)</code> to finally command the director to create texture pages.
    -838              *
    -839              * @param id {string|object} an identitifier to retrieve the image with
    -840              * @param image {Image|HTMLCanvasElement} image to add to cache
    -841              * @param noUpdateGL {!boolean} unless otherwise stated, the director will
    -842              *  try to recreate the texture pages.
    -843              */
    -844             addImage:function (id, image, noUpdateGL) {
    -845                 if (this.getImage(id)) {
    -846 //                    for (var i = 0; i < this.imagesCache.length; i++) {
    -847                     for( var i in this.imagesCache ) {
    -848                         if (this.imagesCache[i].id === id) {
    -849                             this.imagesCache[i].image = image;
    -850                             break;
    -851                         }
    -852                     }
    -853                     this.imagesCache[ id ] = image;
    -854                 } else {
    -855                     this.imagesCache.push({ id:id, image:image });
    -856                     this.imagesCache[id] = image;
    -857                 }
    -858 
    -859                 if (!!!noUpdateGL) {
    -860                     this.updateGLPages();
    -861                 }
    -862             },
    -863             deleteImage:function (id, noUpdateGL) {
    -864                 for (var i = 0; i < this.imagesCache.length; i++) {
    -865                     if (this.imagesCache[i].id === id) {
    -866                         delete this.imagesCache[id];
    -867                         this.imagesCache.splice(i, 1);
    -868                         break;
    -869                     }
    -870                 }
    -871                 if (!!!noUpdateGL) {
    -872                     this.updateGLPages();
    -873                 }
    -874             },
    -875             setGLCurrentOpacity:function (opacity) {
    -876                 this.currentOpacity = opacity;
    -877                 this.glTextureProgram.setAlpha(opacity);
    -878             },
    -879             /**
    -880              * Render buffered elements.
    -881              * @param vertex
    -882              * @param coordsIndex
    -883              * @param uv
    -884              */
    -885             glRender:function (vertex, coordsIndex, uv) {
    -886 
    -887                 vertex = vertex || this.coords;
    -888                 uv = uv || this.uv;
    -889                 coordsIndex = coordsIndex || this.coordsIndex;
    -890 
    -891                 var gl = this.gl;
    -892 
    -893                 var numTris = coordsIndex / 12 * 2;
    -894                 var numVertices = coordsIndex / 3;
    -895 
    -896                 this.glTextureProgram.updateVertexBuffer(vertex);
    -897                 this.glTextureProgram.updateUVBuffer(uv);
    -898 
    -899                 gl.drawElements(gl.TRIANGLES, 3 * numTris, gl.UNSIGNED_SHORT, 0);
    -900 
    -901             },
    -902             glFlush:function () {
    -903                 if (this.coordsIndex !== 0) {
    -904                     this.glRender(this.coords, this.coordsIndex, this.uv);
    -905                 }
    -906                 this.coordsIndex = 0;
    -907                 this.uvIndex = 0;
    -908 
    -909                 this.statistics.draws++;
    -910             },
    -911 
    -912             findActorAtPosition:function (point) {
    -913 
    -914                 // z-order
    -915                 var cl = this.childrenList;
    -916                 for (var i = cl.length - 1; i >= 0; i--) {
    -917                     var child = this.childrenList[i];
    -918 
    -919                     var np = new CAAT.Math.Point(point.x, point.y, 0);
    -920                     var contained = child.findActorAtPosition(np);
    -921                     if (null !== contained) {
    -922                         return contained;
    -923                     }
    -924                 }
    -925 
    -926                 return this;
    -927             },
    -928 
    -929             /**
    -930              *
    -931              * Reset statistics information.
    -932              *
    -933              * @private
    -934              */
    -935             resetStats:function () {
    -936                 this.statistics.size_total = 0;
    -937                 this.statistics.size_active = 0;
    -938                 this.statistics.draws = 0;
    -939                 this.statistics.size_discarded_by_dirty_rects = 0;
    -940             },
    -941 
    -942             /**
    -943              * This is the entry point for the animation system of the Director.
    -944              * The director is fed with the elapsed time value to maintain a virtual timeline.
    -945              * This virtual timeline will provide each Scene with its own virtual timeline, and will only
    -946              * feed time when the Scene is the current Scene, or is being switched.
    -947              *
    -948              * If dirty rectangles are enabled and canvas is used for rendering, the dirty rectangles will be
    -949              * set up as a single clip area.
    -950              *
    -951              * @param time {number} integer indicating the elapsed time between two consecutive frames of the
    -952              * Director.
    -953              */
    -954             render:function (time) {
    -955 
    -956                 if (this.currentScene && this.currentScene.isPaused()) {
    -957                     return;
    -958                 }
    -959 
    -960                 this.time += time;
    -961 
    -962                 for (i = 0, l = this.childrenList.length; i < l; i++) {
    -963                     var c = this.childrenList[i];
    -964                     if (c.isInAnimationFrame(this.time) && !c.isPaused()) {
    -965                         var tt = c.time - c.start_time;
    -966                         c.timerManager.checkTimers(tt);
    -967                         c.timerManager.removeExpiredTimers();
    -968                     }
    -969                 }
    -970 
    -971 
    -972                 this.animate(this, this.time);
    -973 
    -974                 if (!navigator.isCocoonJS && CAAT.DEBUG) {
    -975                     this.resetStats();
    -976                 }
    -977 
    -978                 /**
    -979                  * draw director active scenes.
    -980                  */
    -981                 var ne = this.childrenList.length;
    -982                 var i, tt, c;
    -983                 var ctx = this.ctx;
    -984 
    -985                 if (this.glEnabled) {
    -986 
    -987                     this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
    -988                     this.coordsIndex = 0;
    -989                     this.uvIndex = 0;
    -990 
    -991                     for (i = 0; i < ne; i++) {
    -992                         c = this.childrenList[i];
    -993                         if (c.isInAnimationFrame(this.time)) {
    -994                             tt = c.time - c.start_time;
    -995                             if (c.onRenderStart) {
    -996                                 c.onRenderStart(tt);
    -997                             }
    -998                             c.paintActorGL(this, tt);
    -999                             if (c.onRenderEnd) {
    -1000                                 c.onRenderEnd(tt);
    -1001                             }
    -1002 
    -1003                             if (!c.isPaused()) {
    -1004                                 c.time += time;
    -1005                             }
    -1006 
    -1007                             if (!navigator.isCocoonJS && CAAT.DEBUG) {
    -1008                                 this.statistics.size_total += c.size_total;
    -1009                                 this.statistics.size_active += c.size_active;
    -1010                             }
    -1011 
    -1012                         }
    -1013                     }
    -1014 
    -1015                     this.glFlush();
    -1016 
    -1017                 } else {
    -1018                     ctx.globalAlpha = 1;
    -1019                     ctx.globalCompositeOperation = 'source-over';
    -1020 
    -1021                     ctx.save();
    -1022                     if (this.dirtyRectsEnabled) {
    -1023                         this.modelViewMatrix.transformRenderingContext(ctx);
    -1024 
    -1025                         if (!CAAT.DEBUG_DIRTYRECTS) {
    -1026                             ctx.beginPath();
    -1027                             this.nDirtyRects = 0;
    -1028                             var dr = this.cDirtyRects;
    -1029                             for (i = 0; i < dr.length; i++) {
    -1030                                 var drr = dr[i];
    -1031                                 if (!drr.isEmpty()) {
    -1032                                     ctx.rect(drr.x | 0, drr.y | 0, 1 + (drr.width | 0), 1 + (drr.height | 0));
    -1033                                     this.nDirtyRects++;
    -1034                                 }
    -1035                             }
    -1036                             ctx.clip();
    -1037                         } else {
    -1038                             ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
    -1039                         }
    -1040 
    -1041                     } else if (this.clear === CAAT.Foundation.Director.CLEAR_ALL) {
    -1042                         ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
    -1043                     }
    -1044 
    -1045                     for (i = 0; i < ne; i++) {
    -1046                         c = this.childrenList[i];
    -1047 
    -1048                         if (c.isInAnimationFrame(this.time)) {
    -1049                             tt = c.time - c.start_time;
    -1050                             ctx.save();
    -1051 
    -1052                             if (c.onRenderStart) {
    -1053                                 c.onRenderStart(tt);
    -1054                             }
    -1055 
    -1056                             if (!CAAT.DEBUG_DIRTYRECTS && this.dirtyRectsEnabled) {
    -1057                                 if (this.nDirtyRects) {
    -1058                                     c.paintActor(this, tt);
    -1059                                 }
    -1060                             } else {
    -1061                                 c.paintActor(this, tt);
    -1062                             }
    -1063 
    -1064                             if (c.onRenderEnd) {
    -1065                                 c.onRenderEnd(tt);
    -1066                             }
    -1067                             ctx.restore();
    -1068 
    -1069                             if (CAAT.DEBUGAABB) {
    -1070                                 ctx.globalAlpha = 1;
    -1071                                 ctx.globalCompositeOperation = 'source-over';
    -1072                                 this.modelViewMatrix.transformRenderingContextSet(ctx);
    -1073                                 c.drawScreenBoundingBox(this, tt);
    -1074                             }
    -1075 
    -1076                             if (!c.isPaused()) {
    -1077                                 c.time += time;
    -1078                             }
    -1079 
    -1080                             if (!navigator.isCocoonJS && CAAT.DEBUG) {
    -1081                                 this.statistics.size_total += c.size_total;
    -1082                                 this.statistics.size_active += c.size_active;
    -1083                                 this.statistics.size_dirtyRects = this.nDirtyRects;
    -1084                             }
    -1085 
    -1086                         }
    -1087                     }
    -1088 
    -1089                     if (this.nDirtyRects > 0 && (!navigator.isCocoonJS && CAAT.DEBUG) && CAAT.DEBUG_DIRTYRECTS) {
    -1090                         ctx.beginPath();
    -1091                         this.nDirtyRects = 0;
    -1092                         var dr = this.cDirtyRects;
    -1093                         for (i = 0; i < dr.length; i++) {
    -1094                             var drr = dr[i];
    -1095                             if (!drr.isEmpty()) {
    -1096                                 ctx.rect(drr.x | 0, drr.y | 0, 1 + (drr.width | 0), 1 + (drr.height | 0));
    -1097                                 this.nDirtyRects++;
    -1098                             }
    -1099                         }
    -1100 
    -1101                         ctx.clip();
    -1102                         ctx.fillStyle = 'rgba(160,255,150,.4)';
    -1103                         ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
    -1104                     }
    -1105 
    -1106                     ctx.restore();
    -1107                 }
    -1108 
    -1109                 this.frameCounter++;
    -1110             },
    -1111 
    -1112             inDirtyRect:function (actor) {
    -1113 
    -1114                 if (!this.dirtyRectsEnabled || CAAT.DEBUG_DIRTYRECTS) {
    -1115                     return true;
    -1116                 }
    -1117 
    -1118                 var dr = this.cDirtyRects;
    -1119                 var i;
    -1120                 var aabb = actor.AABB;
    -1121 
    -1122                 for (i = 0; i < dr.length; i++) {
    -1123                     if (dr[i].intersects(aabb)) {
    -1124                         return true;
    -1125                     }
    -1126                 }
    -1127 
    -1128                 this.statistics.size_discarded_by_dirty_rects += actor.size_total;
    -1129                 return false;
    -1130             },
    -1131 
    -1132             /**
    -1133              * A director is a very special kind of actor.
    -1134              * Its animation routine simple sets its modelViewMatrix in case some transformation's been
    -1135              * applied.
    -1136              * No behaviors are allowed for Director instances.
    -1137              * @param director {CAAT.Director} redundant reference to CAAT.Director itself
    -1138              * @param time {number} director time.
    -1139              */
    -1140             animate:function (director, time) {
    -1141 
    -1142                 this.timerManager.checkTimers(time);
    -1143 
    -1144                 this.setModelViewMatrix(this);
    -1145                 this.modelViewMatrixI = this.modelViewMatrix.getInverse();
    -1146                 this.setScreenBounds();
    -1147 
    -1148                 this.dirty = false;
    -1149                 this.invalid = false;
    -1150                 this.dirtyRectsIndex = -1;
    -1151                 this.cDirtyRects= [];
    -1152 
    -1153                 var cl = this.childrenList;
    -1154                 var cli;
    -1155                 var i, l;
    -1156 
    -1157 
    -1158                 if (this.dirtyRectsEnabled) {
    -1159                     var sdr = this.sDirtyRects;
    -1160                     if (sdr.length) {
    -1161                         for (i = 0, l = sdr.length; i < l; i++) {
    -1162                             this.addDirtyRect(sdr[i]);
    -1163                         }
    -1164                         this.sDirtyRects = [];
    -1165                     }
    -1166                 }
    -1167 
    -1168                 for (i = 0; i < cl.length; i++) {
    -1169                     cli = cl[i];
    -1170                     var tt = cli.time - cli.start_time;
    -1171                     cli.animate(this, tt);
    -1172                 }
    -1173 
    -1174                 this.timerManager.removeExpiredTimers();
    -1175 
    -1176                 return this;
    -1177             },
    -1178 
    -1179             /**
    -1180              * This method is used when asynchronous operations must produce some dirty rectangle painting.
    -1181              * This means that every operation out of the regular CAAT loop must add dirty rect operations
    -1182              * by calling this method.
    -1183              * For example setVisible() and remove.
    -1184              * @param rectangle
    -1185              */
    -1186             scheduleDirtyRect:function (rectangle) {
    -1187                 this.sDirtyRects.push(rectangle);
    -1188             },
    -1189             /**
    -1190              * Add a rectangle to the list of dirty screen areas which should be redrawn.
    -1191              * This is the opposite method to clear the whole screen and repaint everything again.
    -1192              * Despite i'm not very fond of dirty rectangles because it needs some extra calculations, this
    -1193              * procedure has shown to be speeding things up under certain situations. Nevertheless it doesn't or
    -1194              * even lowers performance under others, so it is a developer choice to activate them via a call to
    -1195              * setClear( CAAT.Director.CLEAR_DIRTY_RECTS ).
    -1196              *
    -1197              * This function, not only tracks a list of dirty rectangles, but tries to optimize the list. Overlapping
    -1198              * rectangles will be removed and intersecting ones will be unioned.
    -1199              *
    -1200              * Before calling this method, check if this.dirtyRectsEnabled is true.
    -1201              *
    -1202              * @param rectangle {CAAT.Rectangle}
    -1203              */
    -1204             addDirtyRect:function (rectangle) {
    -1205 
    -1206                 if (rectangle.isEmpty()) {
    -1207                     return;
    -1208                 }
    -1209 
    -1210                 var i, dr, j, drj;
    -1211                 var cdr = this.cDirtyRects;
    -1212 
    -1213                 for (i = 0; i < cdr.length; i++) {
    -1214                     dr = cdr[i];
    -1215                     if (!dr.isEmpty() && dr.intersects(rectangle)) {
    -1216                         var intersected = true;
    -1217                         while (intersected) {
    -1218                             dr.unionRectangle(rectangle);
    -1219 
    -1220                             for (j = 0; j < cdr.length; j++) {
    -1221                                 if (j !== i) {
    -1222                                     drj = cdr[j];
    -1223                                     if (!drj.isEmpty() && drj.intersects(dr)) {
    -1224                                         dr.unionRectangle(drj);
    -1225                                         drj.setEmpty();
    -1226                                         break;
    -1227                                     }
    -1228                                 }
    -1229                             }
    -1230 
    -1231                             if (j == cdr.length) {
    -1232                                 intersected = false;
    -1233                             }
    -1234                         }
    -1235 
    -1236                         for (j = 0; j < cdr.length; j++) {
    -1237                             if (cdr[j].isEmpty()) {
    -1238                                 cdr.splice(j, 1);
    -1239                             }
    -1240                         }
    -1241 
    -1242                         return;
    -1243                     }
    -1244                 }
    -1245 
    -1246                 this.dirtyRectsIndex++;
    -1247 
    -1248                 if (this.dirtyRectsIndex >= this.dirtyRects.length) {
    -1249                     for (i = 0; i < 32; i++) {
    -1250                         this.dirtyRects.push(new CAAT.Math.Rectangle());
    -1251                     }
    -1252                 }
    -1253 
    -1254                 var r = this.dirtyRects[ this.dirtyRectsIndex ];
    -1255 
    -1256                 r.x = rectangle.x;
    -1257                 r.y = rectangle.y;
    -1258                 r.x1 = rectangle.x1;
    -1259                 r.y1 = rectangle.y1;
    -1260                 r.width = rectangle.width;
    -1261                 r.height = rectangle.height;
    -1262 
    -1263                 this.cDirtyRects.push(r);
    -1264 
    -1265             },
    -1266             /**
    -1267              * This method draws an Scene to an offscreen canvas. This offscreen canvas is also a child of
    -1268              * another Scene (transitionScene). So instead of drawing two scenes while transitioning from
    -1269              * one to another, first of all an scene is drawn to offscreen, and that image is translated.
    -1270              * <p>
    -1271              * Until the creation of this method, both scenes where drawn while transitioning with
    -1272              * its performance penalty since drawing two scenes could be twice as expensive than drawing
    -1273              * only one.
    -1274              * <p>
    -1275              * Though a high performance increase, we should keep an eye on memory consumption.
    -1276              *
    -1277              * @param ctx a <code>canvas.getContext('2d')</code> instnce.
    -1278              * @param scene {CAAT.Foundation.Scene} the scene to draw offscreen.
    -1279              */
    -1280             renderToContext:function (ctx, scene) {
    -1281                 /**
    -1282                  * draw actors on scene.
    -1283                  */
    -1284                 if (scene.isInAnimationFrame(this.time)) {
    -1285                     ctx.setTransform(1, 0, 0, 1, 0, 0);
    -1286 
    -1287                     ctx.globalAlpha = 1;
    -1288                     ctx.globalCompositeOperation = 'source-over';
    -1289                     ctx.clearRect(0, 0, this.width, this.height);
    -1290 
    -1291                     var octx = this.ctx;
    -1292 
    -1293                     this.ctx = ctx;
    -1294                     ctx.save();
    -1295 
    -1296                     /**
    -1297                      * to draw an scene to an offscreen canvas, we have to:
    -1298                      *   1.- save diector's world model view matrix
    -1299                      *   2.- set no transformation on director since we want the offscreen to
    -1300                      *       be drawn 1:1.
    -1301                      *   3.- set world dirty flag, so that the scene will recalculate its matrices
    -1302                      *   4.- animate the scene
    -1303                      *   5.- paint the scene
    -1304                      *   6.- restore world model view matrix.
    -1305                      */
    -1306                     var matmv = this.modelViewMatrix;
    -1307                     var matwmv = this.worldModelViewMatrix;
    -1308                     this.worldModelViewMatrix = new CAAT.Math.Matrix();
    -1309                     this.modelViewMatrix = this.worldModelViewMatrix;
    -1310                     this.wdirty = true;
    -1311                     scene.animate(this, scene.time);
    -1312                     if (scene.onRenderStart) {
    -1313                         scene.onRenderStart(scene.time);
    -1314                     }
    -1315                     scene.paintActor(this, scene.time);
    -1316                     if (scene.onRenderEnd) {
    -1317                         scene.onRenderEnd(scene.time);
    -1318                     }
    -1319                     this.worldModelViewMatrix = matwmv;
    -1320                     this.modelViewMatrix = matmv;
    -1321 
    -1322                     ctx.restore();
    -1323 
    -1324                     this.ctx = octx;
    -1325                 }
    -1326             },
    -1327             /**
    -1328              * Add a new Scene to Director's Scene list. By adding a Scene to the Director
    -1329              * does not mean it will be immediately visible, you should explicitly call either
    -1330              * <ul>
    -1331              *  <li>easeIn
    -1332              *  <li>easeInOut
    -1333              *  <li>easeInOutRandom
    -1334              *  <li>setScene
    -1335              *  <li>or any of the scene switching methods
    -1336              * </ul>
    -1337              *
    -1338              * @param scene {CAAT.Foundation.Scene}
    -1339              */
    -1340             addScene:function (scene) {
    -1341                 scene.setBounds(0, 0, this.width, this.height);
    -1342                 this.scenes.push(scene);
    -1343                 scene.setEaseListener(this);
    -1344                 if (null === this.currentScene) {
    -1345                     this.setScene(0);
    -1346                 }
    -1347             },
    -1348             /**
    -1349              * Get the number of scenes contained in the Director.
    -1350              * @return {number} the number of scenes contained in the Director.
    -1351              */
    -1352             getNumScenes:function () {
    -1353                 return this.scenes.length;
    -1354             },
    -1355             /**
    -1356              * This method offers full control over the process of switching between any given two Scenes.
    -1357              * To apply this method, you must specify the type of transition to apply for each Scene and
    -1358              * the anchor to keep the Scene pinned at.
    -1359              * <p>
    -1360              * The type of transition will be one of the following values defined in CAAT.Foundation.Scene.prototype:
    -1361              * <ul>
    -1362              *  <li>EASE_ROTATION
    -1363              *  <li>EASE_SCALE
    -1364              *  <li>EASE_TRANSLATION
    -1365              * </ul>
    -1366              *
    -1367              * <p>
    -1368              * The anchor will be any of these values defined in CAAT.Foundation.Actor:
    -1369              * <ul>
    -1370              *  <li>ANCHOR_CENTER
    -1371              *  <li>ANCHOR_TOP
    -1372              *  <li>ANCHOR_BOTTOM
    -1373              *  <li>ANCHOR_LEFT
    -1374              *  <li>ANCHOR_RIGHT
    -1375              *  <li>ANCHOR_TOP_LEFT
    -1376              *  <li>ANCHOR_TOP_RIGHT
    -1377              *  <li>ANCHOR_BOTTOM_LEFT
    -1378              *  <li>ANCHOR_BOTTOM_RIGHT
    -1379              * </ul>
    -1380              *
    -1381              * <p>
    -1382              * In example, for an entering scene performing a EASE_SCALE transition, the anchor is the
    -1383              * point by which the scene will scaled.
    -1384              *
    -1385              * @param inSceneIndex integer indicating the Scene index to bring in to the Director.
    -1386              * @param typein integer indicating the type of transition to apply to the bringing in Scene.
    -1387              * @param anchorin integer indicating the anchor of the bringing in Scene.
    -1388              * @param outSceneIndex integer indicating the Scene index to take away from the Director.
    -1389              * @param typeout integer indicating the type of transition to apply to the taking away in Scene.
    -1390              * @param anchorout integer indicating the anchor of the taking away Scene.
    -1391              * @param time inteter indicating the time to perform the process of switchihg between Scene object
    -1392              * in milliseconds.
    -1393              * @param alpha boolean boolean indicating whether alpha transparency fading will be applied to
    -1394              * the scenes.
    -1395              * @param interpolatorIn CAAT.Behavior.Interpolator object to apply to entering scene.
    -1396              * @param interpolatorOut CAAT.Behavior.Interpolator object to apply to exiting scene.
    -1397              */
    -1398             easeInOut:function (inSceneIndex, typein, anchorin, outSceneIndex, typeout, anchorout, time, alpha, interpolatorIn, interpolatorOut) {
    -1399 
    -1400                 if (inSceneIndex === this.getCurrentSceneIndex()) {
    -1401                     return;
    -1402                 }
    -1403 
    -1404                 var ssin = this.scenes[ inSceneIndex ];
    -1405                 var sout = this.scenes[ outSceneIndex ];
    -1406 
    -1407                 if (!CAAT.__CSS__ && CAAT.CACHE_SCENE_ON_CHANGE) {
    -1408                     this.renderToContext(this.transitionScene.ctx, sout);
    -1409                     sout = this.transitionScene;
    -1410                 }
    -1411 
    -1412                 ssin.setExpired(false);
    -1413                 sout.setExpired(false);
    -1414 
    -1415                 ssin.mouseEnabled = false;
    -1416                 sout.mouseEnabled = false;
    -1417 
    -1418                 ssin.resetTransform();
    -1419                 sout.resetTransform();
    -1420 
    -1421                 ssin.setLocation(0, 0);
    -1422                 sout.setLocation(0, 0);
    -1423 
    -1424                 ssin.alpha = 1;
    -1425                 sout.alpha = 1;
    -1426 
    -1427                 if (typein === CAAT.Foundation.Scene.EASE_ROTATION) {
    -1428                     ssin.easeRotationIn(time, alpha, anchorin, interpolatorIn);
    -1429                 } else if (typein === CAAT.Foundation.Scene.EASE_SCALE) {
    -1430                     ssin.easeScaleIn(0, time, alpha, anchorin, interpolatorIn);
    -1431                 } else {
    -1432                     ssin.easeTranslationIn(time, alpha, anchorin, interpolatorIn);
    -1433                 }
    -1434 
    -1435                 if (typeout === CAAT.Foundation.Scene.EASE_ROTATION) {
    -1436                     sout.easeRotationOut(time, alpha, anchorout, interpolatorOut);
    -1437                 } else if (typeout === CAAT.Foundation.Scene.EASE_SCALE) {
    -1438                     sout.easeScaleOut(0, time, alpha, anchorout, interpolatorOut);
    -1439                 } else {
    -1440                     sout.easeTranslationOut(time, alpha, anchorout, interpolatorOut);
    -1441                 }
    -1442 
    -1443                 this.childrenList = [];
    -1444 
    -1445                 sout.goOut(ssin);
    -1446                 ssin.getIn(sout);
    -1447 
    -1448                 this.addChild(sout);
    -1449                 this.addChild(ssin);
    -1450             },
    -1451             /**
    -1452              * This method will switch between two given Scene indexes (ie, take away scene number 2,
    -1453              * and bring in scene number 5).
    -1454              * <p>
    -1455              * It will randomly choose for each Scene the type of transition to apply and the anchor
    -1456              * point of each transition type.
    -1457              * <p>
    -1458              * It will also set for different kind of transitions the following interpolators:
    -1459              * <ul>
    -1460              * <li>EASE_ROTATION    -> ExponentialInOutInterpolator, exponent 4.
    -1461              * <li>EASE_SCALE       -> ElasticOutInterpolator, 1.1 and .4
    -1462              * <li>EASE_TRANSLATION -> BounceOutInterpolator
    -1463              * </ul>
    -1464              *
    -1465              * <p>
    -1466              * These are the default values, and could not be changed by now.
    -1467              * This method in final instance delegates the process to easeInOutMethod.
    -1468              *
    -1469              * @see easeInOutMethod.
    -1470              *
    -1471              * @param inIndex integer indicating the entering scene index.
    -1472              * @param outIndex integer indicating the exiting scene index.
    -1473              * @param time integer indicating the time to take for the process of Scene in/out in milliseconds.
    -1474              * @param alpha boolean indicating whether alpha transparency fading should be applied to transitions.
    -1475              */
    -1476             easeInOutRandom:function (inIndex, outIndex, time, alpha) {
    -1477 
    -1478                 var pin = Math.random();
    -1479                 var pout = Math.random();
    -1480 
    -1481                 var typeIn;
    -1482                 var interpolatorIn;
    -1483 
    -1484                 if (pin < 0.33) {
    -1485                     typeIn = CAAT.Foundation.Scene.EASE_ROTATION;
    -1486                     interpolatorIn = new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(4);
    -1487                 } else if (pin < 0.66) {
    -1488                     typeIn = CAAT.Foundation.Scene.EASE_SCALE;
    -1489                     interpolatorIn = new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.1, 0.4);
    -1490                 } else {
    -1491                     typeIn = CAAT.Foundation.Scene.EASE_TRANSLATE;
    -1492                     interpolatorIn = new CAAT.Behavior.Interpolator().createBounceOutInterpolator();
    -1493                 }
    -1494 
    -1495                 var typeOut;
    -1496                 var interpolatorOut;
    -1497 
    -1498                 if (pout < 0.33) {
    -1499                     typeOut = CAAT.Foundation.Scene.EASE_ROTATION;
    -1500                     interpolatorOut = new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(4);
    -1501                 } else if (pout < 0.66) {
    -1502                     typeOut = CAAT.Foundation.Scene.EASE_SCALE;
    -1503                     interpolatorOut = new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(4);
    -1504                 } else {
    -1505                     typeOut = CAAT.Foundation.Scene.EASE_TRANSLATE;
    -1506                     interpolatorOut = new CAAT.Behavior.Interpolator().createBounceOutInterpolator();
    -1507                 }
    -1508 
    -1509                 this.easeInOut(
    -1510                     inIndex,
    -1511                     typeIn,
    -1512                     (Math.random() * 8.99) >> 0,
    -1513 
    -1514                     outIndex,
    -1515                     typeOut,
    -1516                     (Math.random() * 8.99) >> 0,
    -1517 
    -1518                     time,
    -1519                     alpha,
    -1520 
    -1521                     interpolatorIn,
    -1522                     interpolatorOut);
    -1523 
    -1524             },
    -1525             /**
    -1526              * This method changes Director's current Scene to the scene index indicated by
    -1527              * inSceneIndex parameter. The Scene running in the director won't be eased out.
    -1528              *
    -1529              * @see {CAAT.Interpolator}
    -1530              * @see {CAAT.Actor}
    -1531              * @see {CAAT.Scene}
    -1532              *
    -1533              * @param inSceneIndex integer indicating the new Scene to set as current.
    -1534              * @param type integer indicating the type of transition to apply to bring the new current
    -1535              * Scene to the Director. The values will be one of: CAAT.Scene.prototype.EASE_ROTATION,
    -1536              * CAAT.Scene.prototype.EASE_SCALE, CAAT.Scene.prototype.EASE_TRANSLATION.
    -1537              * @param time integer indicating how much time in milliseconds the Scene entrance will take.
    -1538              * @param alpha boolean indicating whether alpha transparency fading will be applied to the
    -1539              * entereing Scene.
    -1540              * @param anchor integer indicating the anchor to fix for Scene transition. It will be any of
    -1541              * CAAT.Actor.prototype.ANCHOR_* values.
    -1542              * @param interpolator an CAAT.Interpolator object indicating the interpolation function to
    -1543              * apply.
    -1544              */
    -1545             easeIn:function (inSceneIndex, type, time, alpha, anchor, interpolator) {
    -1546                 var sin = this.scenes[ inSceneIndex ];
    -1547                 if (type === CAAT.Foundation.Scene.EASE_ROTATION) {
    -1548                     sin.easeRotationIn(time, alpha, anchor, interpolator);
    -1549                 } else if (type === CAAT.Foundation.Scene.EASE_SCALE) {
    -1550                     sin.easeScaleIn(0, time, alpha, anchor, interpolator);
    -1551                 } else {
    -1552                     sin.easeTranslationIn(time, alpha, anchor, interpolator);
    -1553                 }
    -1554                 this.childrenList = [];
    -1555                 this.addChild(sin);
    -1556 
    -1557                 sin.resetTransform();
    -1558                 sin.setLocation(0, 0);
    -1559                 sin.alpha = 1;
    -1560                 sin.mouseEnabled = false;
    -1561                 sin.setExpired(false);
    -1562             },
    -1563             /**
    -1564              * Changes (or sets) the current Director scene to the index
    -1565              * parameter. There will be no transition on scene change.
    -1566              * @param sceneIndex {number} an integer indicating the index of the target Scene
    -1567              * to be shown.
    -1568              */
    -1569             setScene:function (sceneIndex) {
    -1570                 var sin = this.scenes[ sceneIndex ];
    -1571                 this.childrenList = [];
    -1572                 this.addChild(sin);
    -1573                 this.currentScene = sin;
    -1574 
    -1575                 sin.setExpired(false);
    -1576                 sin.mouseEnabled = true;
    -1577                 sin.resetTransform();
    -1578                 sin.setLocation(0, 0);
    -1579                 sin.alpha = 1;
    -1580 
    -1581                 sin.getIn();
    -1582                 sin.activated();
    -1583             },
    -1584             /**
    -1585              * This method will change the current Scene by the Scene indicated as parameter.
    -1586              * It will apply random values for anchor and transition type.
    -1587              * @see easeInOutRandom
    -1588              *
    -1589              * @param iNewSceneIndex {number} an integer indicating the index of the new scene to run on the Director.
    -1590              * @param time {number} an integer indicating the time the Scene transition will take.
    -1591              * @param alpha {boolean} a boolean indicating whether Scene transition should be fading.
    -1592              * @param transition {boolean} a boolean indicating whether the scene change must smoothly animated.
    -1593              */
    -1594             switchToScene:function (iNewSceneIndex, time, alpha, transition) {
    -1595                 var currentSceneIndex = this.getSceneIndex(this.currentScene);
    -1596 
    -1597                 if (!transition) {
    -1598                     this.setScene(iNewSceneIndex);
    -1599                 }
    -1600                 else {
    -1601                     this.easeInOutRandom(iNewSceneIndex, currentSceneIndex, time, alpha);
    -1602                 }
    -1603             },
    -1604             /**
    -1605              * Sets the previous Scene in sequence as the current Scene.
    -1606              * @see switchToScene.
    -1607              *
    -1608              * @param time {number} integer indicating the time the Scene transition will take.
    -1609              * @param alpha {boolean} a boolean indicating whether Scene transition should be fading.
    -1610              * @param transition {boolean} a boolean indicating whether the scene change must smoothly animated.
    -1611              */
    -1612             switchToPrevScene:function (time, alpha, transition) {
    -1613 
    -1614                 var currentSceneIndex = this.getSceneIndex(this.currentScene);
    -1615 
    -1616                 if (this.getNumScenes() <= 1 || currentSceneIndex === 0) {
    -1617                     return;
    -1618                 }
    -1619 
    -1620                 if (!transition) {
    -1621                     this.setScene(currentSceneIndex - 1);
    -1622                 }
    -1623                 else {
    -1624                     this.easeInOutRandom(currentSceneIndex - 1, currentSceneIndex, time, alpha);
    -1625                 }
    -1626             },
    -1627             /**
    -1628              * Sets the previous Scene in sequence as the current Scene.
    -1629              * @see switchToScene.
    -1630              *
    -1631              * @param time {number} integer indicating the time the Scene transition will take.
    -1632              * @param alpha {boolean} a boolean indicating whether Scene transition should be fading.
    -1633              * @param transition {boolean} a boolean indicating whether the scene change must smoothly animated.
    -1634              */
    -1635             switchToNextScene:function (time, alpha, transition) {
    -1636 
    -1637                 var currentSceneIndex = this.getSceneIndex(this.currentScene);
    -1638 
    -1639                 if (this.getNumScenes() <= 1 || currentSceneIndex === this.getNumScenes() - 1) {
    -1640                     return;
    -1641                 }
    -1642 
    -1643                 if (!transition) {
    -1644                     this.setScene(currentSceneIndex + 1);
    -1645                 }
    -1646                 else {
    -1647                     this.easeInOutRandom(currentSceneIndex + 1, currentSceneIndex, time, alpha);
    -1648                 }
    -1649             },
    -1650             mouseEnter:function (mouseEvent) {
    -1651             },
    -1652             mouseExit:function (mouseEvent) {
    -1653             },
    -1654             mouseMove:function (mouseEvent) {
    -1655             },
    -1656             mouseDown:function (mouseEvent) {
    -1657             },
    -1658             mouseUp:function (mouseEvent) {
    -1659             },
    -1660             mouseDrag:function (mouseEvent) {
    -1661             },
    -1662             /**
    -1663              * Scene easing listener. Notifies scenes when they're about to be activated (set as current
    -1664              * director's scene).
    -1665              *
    -1666              * @param scene {CAAT.Foundation.Scene} the scene that has just been brought in or taken out of the director.
    -1667              * @param b_easeIn {boolean} scene enters or exits ?
    -1668              */
    -1669             easeEnd:function (scene, b_easeIn) {
    -1670                 // scene is going out
    -1671                 if (!b_easeIn) {
    -1672 
    -1673                     scene.setExpired(true);
    -1674                 } else {
    -1675                     this.currentScene = scene;
    -1676                     this.currentScene.activated();
    -1677                 }
    -1678 
    -1679                 scene.mouseEnabled = true;
    -1680                 scene.emptyBehaviorList();
    -1681             },
    -1682             /**
    -1683              * Return the index for a given Scene object contained in the Director.
    -1684              * @param scene {CAAT.Foundation.Scene}
    -1685              */
    -1686             getSceneIndex:function (scene) {
    -1687                 for (var i = 0; i < this.scenes.length; i++) {
    -1688                     if (this.scenes[i] === scene) {
    -1689                         return i;
    -1690                     }
    -1691                 }
    -1692                 return -1;
    -1693             },
    -1694             /**
    -1695              * Get a concrete director's scene.
    -1696              * @param index {number} an integer indicating the scene index.
    -1697              * @return {CAAT.Foundation.Scene} a CAAT.Scene object instance or null if the index is oob.
    -1698              */
    -1699             getScene:function (index) {
    -1700                 return this.scenes[index];
    -1701             },
    -1702             getSceneById : function(id) {
    -1703                 for( var i=0; i<this.scenes.length; i++ ) {
    -1704                     if (this.scenes[i].id===id) {
    -1705                         return this.scenes[i];
    -1706                     }
    -1707                 }
    -1708                 return null;
    -1709             },
    -1710             /**
    -1711              * Return the index of the current scene in the Director's scene list.
    -1712              * @return {number} the current scene's index.
    -1713              */
    -1714             getCurrentSceneIndex:function () {
    -1715                 return this.getSceneIndex(this.currentScene);
    -1716             },
    -1717             /**
    -1718              * Return the running browser name.
    -1719              * @return {string} the browser name.
    -1720              */
    -1721             getBrowserName:function () {
    -1722                 return this.browserInfo.browser;
    -1723             },
    -1724             /**
    -1725              * Return the running browser version.
    -1726              * @return {string} the browser version.
    -1727              */
    -1728             getBrowserVersion:function () {
    -1729                 return this.browserInfo.version;
    -1730             },
    -1731             /**
    -1732              * Return the operating system name.
    -1733              * @return {string} the os name.
    -1734              */
    -1735             getOSName:function () {
    -1736                 return this.browserInfo.OS;
    -1737             },
    -1738             /**
    -1739              * Gets the resource with the specified resource name.
    -1740              * The Director holds a collection called <code>imagesCache</code>
    -1741              * where you can store a JSON of the form
    -1742              *  <code>[ { id: imageId, image: imageObject } ]</code>.
    -1743              * This structure will be used as a resources cache.
    -1744              * There's a CAAT.Module.ImagePreloader class to preload resources and
    -1745              * generate this structure on loading finalization.
    -1746              *
    -1747              * @param sId {object} an String identifying a resource.
    -1748              */
    -1749             getImage:function (sId) {
    -1750                 var ret = this.imagesCache[sId];
    -1751                 if (ret) {
    -1752                     return ret;
    -1753                 }
    -1754 
    -1755                 //for (var i = 0; i < this.imagesCache.length; i++) {
    -1756                 for( var i in this.imagesCache ) {
    -1757                     if (this.imagesCache[i].id === sId) {
    -1758                         return this.imagesCache[i].image;
    -1759                     }
    -1760                 }
    -1761 
    -1762                 return null;
    -1763             },
    -1764             musicPlay: function(id) {
    -1765                 return this.audioManager.playMusic(id);
    -1766             },
    -1767             musicStop : function() {
    -1768                 this.audioManager.stopMusic();
    -1769             },
    -1770             /**
    -1771              * Adds an audio to the cache.
    -1772              *
    -1773              * @see CAAT.Module.Audio.AudioManager.addAudio
    -1774              * @return this
    -1775              */
    -1776             addAudio:function (id, url) {
    -1777                 this.audioManager.addAudio(id, url);
    -1778                 return this;
    -1779             },
    -1780             /**
    -1781              * Plays the audio instance identified by the id.
    -1782              * @param id {object} the object used to store a sound in the audioCache.
    -1783              */
    -1784             audioPlay:function (id) {
    -1785                 return this.audioManager.play(id);
    -1786             },
    -1787             /**
    -1788              * Loops an audio instance identified by the id.
    -1789              * @param id {object} the object used to store a sound in the audioCache.
    -1790              *
    -1791              * @return {HTMLElement|null} the value from audioManager.loop
    -1792              */
    -1793             audioLoop:function (id) {
    -1794                 return this.audioManager.loop(id);
    -1795             },
    -1796             endSound:function () {
    -1797                 return this.audioManager.endSound();
    -1798             },
    -1799             setSoundEffectsEnabled:function (enabled) {
    -1800                 return this.audioManager.setSoundEffectsEnabled(enabled);
    -1801             },
    -1802             setMusicEnabled:function (enabled) {
    -1803                 return this.audioManager.setMusicEnabled(enabled);
    -1804             },
    -1805             isMusicEnabled:function () {
    -1806                 return this.audioManager.isMusicEnabled();
    -1807             },
    -1808             isSoundEffectsEnabled:function () {
    -1809                 return this.audioManager.isSoundEffectsEnabled();
    -1810             },
    -1811             setVolume:function (id, volume) {
    -1812                 return this.audioManager.setVolume(id, volume);
    -1813             },
    -1814             /**
    -1815              * Removes Director's scenes.
    -1816              */
    -1817             emptyScenes:function () {
    -1818                 this.scenes = [];
    -1819             },
    -1820             /**
    -1821              * Adds an scene to this Director.
    -1822              * @param scene {CAAT.Foundation.Scene} a scene object.
    -1823              */
    -1824             addChild:function (scene) {
    -1825                 scene.parent = this;
    -1826                 this.childrenList.push(scene);
    -1827             },
    -1828             /**
    -1829              * @Deprecated use CAAT.loop instead.
    -1830              * @param fps
    -1831              * @param callback
    -1832              * @param callback2
    -1833              */
    -1834             loop:function (fps, callback, callback2) {
    -1835                 if (callback2) {
    -1836                     this.onRenderStart = callback;
    -1837                     this.onRenderEnd = callback2;
    -1838                 } else if (callback) {
    -1839                     this.onRenderEnd = callback;
    -1840                 }
    -1841                 CAAT.loop();
    -1842             },
    -1843             /**
    -1844              * Starts the director animation.If no scene is explicitly selected, the current Scene will
    -1845              * be the first scene added to the Director.
    -1846              * <p>
    -1847              * The fps parameter will set the animation quality. Higher values,
    -1848              * means CAAT will try to render more frames in the same second (at the
    -1849              * expense of cpu power at least until hardware accelerated canvas rendering
    -1850              * context are available). A value of 60 is a high frame rate and should not be exceeded.
    -1851              *
    -1852              */
    -1853             renderFrame:function () {
    -1854 
    -1855                 CAAT.currentDirector = this;
    -1856 
    -1857                 if (this.stopped) {
    -1858                     return;
    -1859                 }
    -1860 
    -1861                 var t = new Date().getTime(),
    -1862                     delta = t - this.timeline;
    -1863 
    -1864                 /*
    -1865                  check for massive frame time. if for example the current browser tab is minified or taken out of
    -1866                  foreground, the system will account for a bit time interval. minify that impact by lowering down
    -1867                  the elapsed time (virtual timelines FTW)
    -1868                  */
    -1869                 if (delta > 500) {
    -1870                     delta = 500;
    -1871                 }
    -1872 
    -1873                 if (this.onRenderStart) {
    -1874                     this.onRenderStart(delta);
    -1875                 }
    -1876 
    -1877                 this.render(delta);
    -1878 
    -1879                 if (this.debugInfo) {
    -1880                     this.debugInfo(this.statistics);
    -1881                 }
    -1882 
    -1883                 this.timeline = t;
    -1884 
    -1885                 if (this.onRenderEnd) {
    -1886                     this.onRenderEnd(delta);
    -1887                 }
    -1888 
    -1889                 this.needsRepaint = false;
    -1890             },
    -1891 
    -1892             /**
    -1893              * If the director has renderingMode: DIRTY, the timeline must be reset to register accurate frame measurement.
    -1894              */
    -1895             resetTimeline:function () {
    -1896                 this.timeline = new Date().getTime();
    -1897             },
    -1898 
    -1899             endLoop:function () {
    -1900             },
    -1901             /**
    -1902              * This method states whether the director must clear background before rendering
    -1903              * each frame.
    -1904              *
    -1905              * The clearing method could be:
    -1906              *  + CAAT.Director.CLEAR_ALL. previous to draw anything on screen the canvas will have clearRect called on it.
    -1907              *  + CAAT.Director.CLEAR_DIRTY_RECTS. Actors marked as invalid, or which have been moved, rotated or scaled
    -1908              *    will have their areas redrawn.
    -1909              *  + CAAT.Director.CLEAR_NONE. clears nothing.
    -1910              *
    -1911              * @param clear {CAAT.Director.CLEAR_ALL | CAAT.Director.CLEAR_NONE | CAAT.Director.CLEAR_DIRTY_RECTS}
    -1912              * @return this.
    -1913              */
    -1914             setClear:function (clear) {
    -1915                 this.clear = clear;
    -1916                 if (this.clear === CAAT.Foundation.Director.CLEAR_DIRTY_RECTS) {
    -1917                     this.dirtyRectsEnabled = true;
    -1918                 } else {
    -1919                     this.dirtyRectsEnabled= false;
    -1920                 }
    -1921                 return this;
    -1922             },
    -1923             /**
    -1924              * Get this Director's AudioManager instance.
    -1925              * @return {CAAT.AudioManager} the AudioManager instance.
    -1926              */
    -1927             getAudioManager:function () {
    -1928                 return this.audioManager;
    -1929             },
    -1930             /**
    -1931              * Acculumate dom elements position to properly offset on-screen mouse/touch events.
    -1932              * @param node
    -1933              */
    -1934             cumulateOffset:function (node, parent, prop) {
    -1935                 var left = prop + 'Left';
    -1936                 var top = prop + 'Top';
    -1937                 var x = 0, y = 0, style;
    -1938 
    -1939                 while (navigator.browser !== 'iOS' && node && node.style) {
    -1940                     if (node.currentStyle) {
    -1941                         style = node.currentStyle['position'];
    -1942                     } else {
    -1943                         style = (node.ownerDocument.defaultView || node.ownerDocument.parentWindow).getComputedStyle(node, null);
    -1944                         style = style ? style.getPropertyValue('position') : null;
    -1945                     }
    -1946 
    -1947 //                if (!/^(relative|absolute|fixed)$/.test(style)) {
    -1948                     if (!/^(fixed)$/.test(style)) {
    -1949                         x += node[left];
    -1950                         y += node[top];
    -1951                         node = node[parent];
    -1952                     } else {
    -1953                         break;
    -1954                     }
    -1955                 }
    -1956 
    -1957                 return {
    -1958                     x:x,
    -1959                     y:y,
    -1960                     style:style
    -1961                 };
    -1962             },
    -1963             getOffset:function (node) {
    -1964                 var res = this.cumulateOffset(node, 'offsetParent', 'offset');
    -1965                 if (res.style === 'fixed') {
    -1966                     var res2 = this.cumulateOffset(node, node.parentNode ? 'parentNode' : 'parentElement', 'scroll');
    -1967                     return {
    -1968                         x:res.x + res2.x,
    -1969                         y:res.y + res2.y
    -1970                     };
    -1971                 }
    -1972 
    -1973                 return {
    -1974                     x:res.x,
    -1975                     y:res.y
    -1976                 };
    -1977             },
    -1978             /**
    -1979              * Normalize input event coordinates to be related to (0,0) canvas position.
    -1980              * @param point {CAAT.Math.Point} canvas coordinate.
    -1981              * @param e {MouseEvent} a mouse event from an input event.
    -1982              */
    -1983             getCanvasCoord:function (point, e) {
    -1984 
    -1985                 var pt = new CAAT.Math.Point();
    -1986                 var posx = 0;
    -1987                 var posy = 0;
    -1988                 if (!e) e = window.event;
    -1989 
    -1990                 if (e.pageX || e.pageY) {
    -1991                     posx = e.pageX;
    -1992                     posy = e.pageY;
    -1993                 }
    -1994                 else if (e.clientX || e.clientY) {
    -1995                     posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
    -1996                     posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
    -1997                 }
    -1998 
    -1999                 var offset = this.getOffset(this.canvas);
    -2000 
    -2001                 posx -= offset.x;
    -2002                 posy -= offset.y;
    -2003 
    -2004                 posx*= this.SCREEN_RATIO;
    -2005                 posy*= this.SCREEN_RATIO;
    -2006 
    -2007                 //////////////
    -2008                 // transformar coordenada inversamente con affine transform de director.
    -2009 
    -2010                 pt.x = posx;
    -2011                 pt.y = posy;
    -2012                 if (!this.modelViewMatrixI) {
    -2013                     this.modelViewMatrixI = this.modelViewMatrix.getInverse();
    -2014                 }
    -2015                 this.modelViewMatrixI.transformCoord(pt);
    -2016                 posx = pt.x;
    -2017                 posy = pt.y
    -2018 
    -2019                 point.set(posx, posy);
    -2020                 this.screenMousePoint.set(posx, posy);
    -2021 
    -2022             },
    -2023 
    -2024             __mouseDownHandler:function (e) {
    -2025 
    -2026                 /*
    -2027                  was dragging and mousedown detected, can only mean a mouseOut's been performed and on mouseOver, no
    -2028                  button was presses. Then, send a mouseUp for the previos actor, and return;
    -2029                  */
    -2030                 if (this.dragging && this.lastSelectedActor) {
    -2031                     this.__mouseUpHandler(e);
    -2032                     return;
    -2033                 }
    -2034 
    -2035                 this.getCanvasCoord(this.mousePoint, e);
    -2036                 this.isMouseDown = true;
    -2037                 var lactor = this.findActorAtPosition(this.mousePoint);
    -2038 
    -2039                 if (null !== lactor) {
    -2040 
    -2041                     var pos = lactor.viewToModel(
    -2042                         new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    -2043 
    -2044                     lactor.mouseDown(
    -2045                         new CAAT.Event.MouseEvent().init(
    -2046                             pos.x,
    -2047                             pos.y,
    -2048                             e,
    -2049                             lactor,
    -2050                             new CAAT.Math.Point(
    -2051                                 this.screenMousePoint.x,
    -2052                                 this.screenMousePoint.y)));
    -2053                 }
    -2054 
    -2055                 this.lastSelectedActor = lactor;
    -2056             },
    -2057 
    -2058             __mouseUpHandler:function (e) {
    -2059 
    -2060                 this.isMouseDown = false;
    -2061                 this.getCanvasCoord(this.mousePoint, e);
    -2062 
    -2063                 var pos = null;
    -2064                 var lactor = this.lastSelectedActor;
    -2065 
    -2066                 if (null !== lactor) {
    -2067                     pos = lactor.viewToModel(
    -2068                         new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    -2069                     if (lactor.actionPerformed && lactor.contains(pos.x, pos.y)) {
    -2070                         lactor.actionPerformed(e)
    -2071                     }
    -2072 
    -2073                     lactor.mouseUp(
    -2074                         new CAAT.Event.MouseEvent().init(
    -2075                             pos.x,
    -2076                             pos.y,
    -2077                             e,
    -2078                             lactor,
    -2079                             this.screenMousePoint,
    -2080                             this.currentScene.time));
    -2081                 }
    -2082 
    -2083                 if (!this.dragging && null !== lactor) {
    -2084                     if (lactor.contains(pos.x, pos.y)) {
    -2085                         lactor.mouseClick(
    -2086                             new CAAT.Event.MouseEvent().init(
    -2087                                 pos.x,
    -2088                                 pos.y,
    -2089                                 e,
    -2090                                 lactor,
    -2091                                 this.screenMousePoint,
    -2092                                 this.currentScene.time));
    -2093                     }
    -2094                 }
    -2095 
    -2096                 this.dragging = false;
    -2097                 this.in_ = false;
    -2098 //            CAAT.setCursor('default');
    -2099             },
    -2100 
    -2101             __mouseMoveHandler:function (e) {
    -2102                 //this.getCanvasCoord(this.mousePoint, e);
    -2103 
    -2104                 var lactor;
    -2105                 var pos;
    -2106 
    -2107                 var ct = this.currentScene ? this.currentScene.time : 0;
    -2108 
    -2109                 // drag
    -2110 
    -2111                 if (this.isMouseDown && null!==this.lastSelectedActor) {
    -2112 
    -2113                     lactor = this.lastSelectedActor;
    -2114                     pos = lactor.viewToModel(
    -2115                         new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    -2116 
    -2117                     // check for mouse move threshold.
    -2118                     if (!this.dragging) {
    -2119                         if (Math.abs(this.prevMousePoint.x - pos.x) < CAAT.DRAG_THRESHOLD_X &&
    -2120                             Math.abs(this.prevMousePoint.y - pos.y) < CAAT.DRAG_THRESHOLD_Y) {
    -2121                             return;
    -2122                         }
    -2123                     }
    -2124 
    -2125                     this.dragging = true;
    -2126 
    -2127                     var px = lactor.x;
    -2128                     var py = lactor.y;
    -2129                     lactor.mouseDrag(
    -2130                         new CAAT.Event.MouseEvent().init(
    -2131                             pos.x,
    -2132                             pos.y,
    -2133                             e,
    -2134                             lactor,
    -2135                             new CAAT.Math.Point(
    -2136                                 this.screenMousePoint.x,
    -2137                                 this.screenMousePoint.y),
    -2138                             ct));
    -2139 
    -2140                     this.prevMousePoint.x = pos.x;
    -2141                     this.prevMousePoint.y = pos.y;
    -2142 
    -2143                     /**
    -2144                      * Element has not moved after drag, so treat it as a button.
    -2145                      */
    -2146                     if (px === lactor.x && py === lactor.y) {
    -2147 
    -2148                         var contains = lactor.contains(pos.x, pos.y);
    -2149 
    -2150                         if (this.in_ && !contains) {
    -2151                             lactor.mouseExit(
    -2152                                 new CAAT.Event.MouseEvent().init(
    -2153                                     pos.x,
    -2154                                     pos.y,
    -2155                                     e,
    -2156                                     lactor,
    -2157                                     this.screenMousePoint,
    -2158                                     ct));
    -2159                             this.in_ = false;
    -2160                         }
    -2161 
    -2162                         if (!this.in_ && contains) {
    -2163                             lactor.mouseEnter(
    -2164                                 new CAAT.Event.MouseEvent().init(
    -2165                                     pos.x,
    -2166                                     pos.y,
    -2167                                     e,
    -2168                                     lactor,
    -2169                                     this.screenMousePoint,
    -2170                                     ct));
    -2171                             this.in_ = true;
    -2172                         }
    -2173                     }
    -2174 
    -2175                     return;
    -2176                 }
    -2177 
    -2178                 // mouse move.
    -2179                 this.in_ = true;
    -2180 
    -2181                 lactor = this.findActorAtPosition(this.mousePoint);
    -2182 
    -2183                 // cambiamos de actor.
    -2184                 if (lactor !== this.lastSelectedActor) {
    -2185                     if (null !== this.lastSelectedActor) {
    -2186 
    -2187                         pos = this.lastSelectedActor.viewToModel(
    -2188                             new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    -2189 
    -2190                         this.lastSelectedActor.mouseExit(
    -2191                             new CAAT.Event.MouseEvent().init(
    -2192                                 pos.x,
    -2193                                 pos.y,
    -2194                                 e,
    -2195                                 this.lastSelectedActor,
    -2196                                 this.screenMousePoint,
    -2197                                 ct));
    -2198                     }
    -2199 
    -2200                     if (null !== lactor) {
    -2201                         pos = lactor.viewToModel(
    -2202                             new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    -2203 
    -2204                         lactor.mouseEnter(
    -2205                             new CAAT.Event.MouseEvent().init(
    -2206                                 pos.x,
    -2207                                 pos.y,
    -2208                                 e,
    -2209                                 lactor,
    -2210                                 this.screenMousePoint,
    -2211                                 ct));
    -2212                     }
    -2213                 }
    -2214 
    -2215                 pos = lactor.viewToModel(
    -2216                     new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    -2217 
    -2218                 if (null !== lactor) {
    -2219 
    -2220                     lactor.mouseMove(
    -2221                         new CAAT.Event.MouseEvent().init(
    -2222                             pos.x,
    -2223                             pos.y,
    -2224                             e,
    -2225                             lactor,
    -2226                             this.screenMousePoint,
    -2227                             ct));
    -2228                 }
    -2229 
    -2230                 this.prevMousePoint.x = pos.x;
    -2231                 this.prevMousePoint.y = pos.y;
    -2232 
    -2233                 this.lastSelectedActor = lactor;
    -2234             },
    -2235 
    -2236             __mouseOutHandler:function (e) {
    -2237 
    -2238                 if (this.dragging) {
    -2239                     return;
    -2240                 }
    -2241 
    -2242                 if (null !== this.lastSelectedActor) {
    -2243 
    -2244                     this.getCanvasCoord(this.mousePoint, e);
    -2245                     var pos = new CAAT.Math.Point(this.mousePoint.x, this.mousePoint.y, 0);
    -2246                     this.lastSelectedActor.viewToModel(pos);
    -2247 
    -2248                     var ev = new CAAT.Event.MouseEvent().init(
    -2249                         pos.x,
    -2250                         pos.y,
    -2251                         e,
    -2252                         this.lastSelectedActor,
    -2253                         this.screenMousePoint,
    -2254                         this.currentScene.time);
    -2255 
    -2256                     this.lastSelectedActor.mouseExit(ev);
    -2257                     this.lastSelectedActor.mouseOut(ev);
    -2258                     if (!this.dragging) {
    -2259                         this.lastSelectedActor = null;
    -2260                     }
    -2261                 } else {
    -2262                     this.isMouseDown = false;
    -2263                     this.in_ = false;
    -2264 
    -2265                 }
    -2266 
    -2267             },
    -2268 
    -2269             __mouseOverHandler:function (e) {
    -2270 
    -2271                 if (this.dragging) {
    -2272                     return;
    -2273                 }
    -2274 
    -2275                 var lactor;
    -2276                 var pos, ev;
    -2277 
    -2278                 if (null == this.lastSelectedActor) {
    -2279                     lactor = this.findActorAtPosition(this.mousePoint);
    -2280 
    -2281                     if (null !== lactor) {
    -2282 
    -2283                         pos = lactor.viewToModel(
    -2284                             new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    -2285 
    -2286                         ev = new CAAT.Event.MouseEvent().init(
    -2287                             pos.x,
    -2288                             pos.y,
    -2289                             e,
    -2290                             lactor,
    -2291                             this.screenMousePoint,
    -2292                             this.currentScene ? this.currentScene.time : 0);
    -2293 
    -2294                         lactor.mouseOver(ev);
    -2295                         lactor.mouseEnter(ev);
    -2296                     }
    -2297 
    -2298                     this.lastSelectedActor = lactor;
    -2299                 } else {
    -2300                     lactor = this.lastSelectedActor;
    -2301                     pos = lactor.viewToModel(
    -2302                         new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    -2303 
    -2304                     ev = new CAAT.Event.MouseEvent().init(
    -2305                         pos.x,
    -2306                         pos.y,
    -2307                         e,
    -2308                         lactor,
    -2309                         this.screenMousePoint,
    -2310                         this.currentScene.time);
    -2311 
    -2312                     lactor.mouseOver(ev);
    -2313                     lactor.mouseEnter(ev);
    -2314 
    -2315                 }
    -2316             },
    -2317 
    -2318             __mouseDBLClickHandler:function (e) {
    -2319 
    -2320                 this.getCanvasCoord(this.mousePoint, e);
    -2321                 if (null !== this.lastSelectedActor) {
    -2322                     /*
    -2323                      var pos = this.lastSelectedActor.viewToModel(
    -2324                      new CAAT.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    -2325                      */
    -2326                     this.lastSelectedActor.mouseDblClick(
    -2327                         new CAAT.Event.MouseEvent().init(
    -2328                             this.mousePoint.x,
    -2329                             this.mousePoint.y,
    -2330                             e,
    -2331                             this.lastSelectedActor,
    -2332                             this.screenMousePoint,
    -2333                             this.currentScene.time));
    -2334                 }
    -2335             },
    -2336 
    -2337             /**
    -2338              * Same as mouseDown but not preventing event.
    -2339              * Will only take care of first touch.
    -2340              * @param e
    -2341              */
    -2342             __touchStartHandler:function (e) {
    -2343 
    -2344                 if (e.target === this.canvas) {
    -2345                     e.preventDefault();
    -2346                     e.returnValue = false;
    -2347 
    -2348                     e = e.targetTouches[0];
    -2349 
    -2350                     var mp = this.mousePoint;
    -2351                     this.getCanvasCoord(mp, e);
    -2352                     if (mp.x < 0 || mp.y < 0 || mp.x >= this.width || mp.y >= this.height) {
    -2353                         return;
    -2354                     }
    -2355 
    -2356                     this.touching = true;
    -2357 
    -2358                     this.__mouseDownHandler(e);
    -2359                 }
    -2360             },
    -2361 
    -2362             __touchEndHandler:function (e) {
    -2363 
    -2364                 if (this.touching) {
    -2365                     e.preventDefault();
    -2366                     e.returnValue = false;
    -2367 
    -2368                     e = e.changedTouches[0];
    -2369                     var mp = this.mousePoint;
    -2370                     this.getCanvasCoord(mp, e);
    -2371 
    -2372                     this.touching = false;
    -2373 
    -2374                     this.__mouseUpHandler(e);
    -2375                 }
    -2376             },
    -2377 
    -2378             __touchMoveHandler:function (e) {
    -2379 
    -2380                 if (this.touching) {
    -2381                     e.preventDefault();
    -2382                     e.returnValue = false;
    -2383 
    -2384                     if (this.gesturing) {
    -2385                         return;
    -2386                     }
    -2387 
    -2388                     for (var i = 0; i < e.targetTouches.length; i++) {
    -2389                         var ee = e.targetTouches[i];
    -2390                         var mp = this.mousePoint;
    -2391                         this.getCanvasCoord(mp, ee);
    -2392                         this.__mouseMoveHandler(ee);
    -2393                     }
    -2394                 }
    -2395             },
    -2396 
    -2397             __gestureStart:function (scale, rotation) {
    -2398                 this.gesturing = true;
    -2399                 this.__gestureRotation = this.lastSelectedActor.rotationAngle;
    -2400                 this.__gestureSX = this.lastSelectedActor.scaleX - 1;
    -2401                 this.__gestureSY = this.lastSelectedActor.scaleY - 1;
    -2402             },
    -2403 
    -2404             __gestureChange:function (scale, rotation) {
    -2405                 if (typeof scale === 'undefined' || typeof rotation === 'undefined') {
    -2406                     return;
    -2407                 }
    -2408 
    -2409                 if (this.lastSelectedActor !== null && this.lastSelectedActor.isGestureEnabled()) {
    -2410                     this.lastSelectedActor.setRotation(rotation * Math.PI / 180 + this.__gestureRotation);
    -2411 
    -2412                     this.lastSelectedActor.setScale(
    -2413                         this.__gestureSX + scale,
    -2414                         this.__gestureSY + scale);
    -2415                 }
    -2416 
    -2417             },
    -2418 
    -2419             __gestureEnd:function (scale, rotation) {
    -2420                 this.gesturing = false;
    -2421                 this.__gestureRotation = 0;
    -2422                 this.__gestureScale = 0;
    -2423             },
    -2424 
    -2425             __touchEndHandlerMT:function (e) {
    -2426 
    -2427                 e.preventDefault();
    -2428                 e.returnValue = false;
    -2429 
    -2430                 var i, j;
    -2431                 var recent = [];
    -2432 
    -2433                 /**
    -2434                  * extrae actores afectados, y coordenadas relativas para ellos.
    -2435                  * crear una coleccion touch-id : { actor, touch-event }
    -2436                  */
    -2437                 for (i = 0; i < e.changedTouches.length; i++) {
    -2438                     var _touch = e.changedTouches[i];
    -2439                     var id = _touch.identifier;
    -2440                     recent.push(id);
    -2441                 }
    -2442 
    -2443 
    -2444                 /**
    -2445                  * para los touch identificados, extraer que actores se han afectado.
    -2446                  * crear eventos con la info de touch para cada uno.
    -2447                  */
    -2448 
    -2449                 var actors = {};
    -2450                 for (i = 0; i < recent.length; i++) {
    -2451                     var touchId = recent[ i ];
    -2452                     if (this.touches[ touchId ]) {
    -2453                         var actor = this.touches[ touchId ].actor;
    -2454 
    -2455                         if (!actors[actor.id]) {
    -2456                             actors[actor.id] = {
    -2457                                 actor:actor,
    -2458                                 touch:new CAAT.Event.TouchEvent().init(e, actor, this.currentScene.time)
    -2459                             };
    -2460                         }
    -2461 
    -2462                         var ev = actors[ actor.id ].touch;
    -2463                         ev.addChangedTouch(this.touches[ touchId ].touch);
    -2464                     }
    -2465                 }
    -2466 
    -2467                 /**
    -2468                  * remove ended touch info.
    -2469                  */
    -2470                 for (i = 0; i < e.changedTouches.length; i++) {
    -2471                     var touch = e.changedTouches[i];
    -2472                     var id = touch.identifier;
    -2473                     delete this.touches[id];
    -2474                 }
    -2475 
    -2476                 /**
    -2477                  * notificar a todos los actores.
    -2478                  */
    -2479                 for (var pr in actors) {
    -2480                     var data = actors[pr];
    -2481                     var actor = data.actor;
    -2482                     var touch = data.touch;
    -2483 
    -2484                     for (var actorId in this.touches) {
    -2485                         var tt = this.touches[actorId]
    -2486                         if (tt.actor.id === actor.id) {
    -2487                             touch.addTouch(tt.touch);
    -2488                         }
    -2489                     }
    -2490 
    -2491                     actor.touchEnd(touch);
    -2492                 }
    -2493             },
    -2494 
    -2495             __touchMoveHandlerMT:function (e) {
    -2496 
    -2497                 e.preventDefault();
    -2498                 e.returnValue = false;
    -2499 
    -2500                 var i;
    -2501                 var recent = [];
    -2502 
    -2503                 /**
    -2504                  * extrae actores afectados, y coordenadas relativas para ellos.
    -2505                  * crear una coleccion touch-id : { actor, touch-event }
    -2506                  */
    -2507                 for (i = 0; i < e.changedTouches.length; i++) {
    -2508                     var touch = e.changedTouches[i];
    -2509                     var id = touch.identifier;
    -2510 
    -2511                     if (this.touches[ id ]) {
    -2512                         var mp = this.mousePoint;
    -2513                         this.getCanvasCoord(mp, touch);
    -2514 
    -2515                         var actor = this.touches[ id ].actor;
    -2516                         mp = actor.viewToModel(mp);
    -2517 
    -2518                         this.touches[ id ] = {
    -2519                             actor:actor,
    -2520                             touch:new CAAT.Event.TouchInfo(id, mp.x, mp.y, actor)
    -2521                         };
    -2522 
    -2523                         recent.push(id);
    -2524                     }
    -2525                 }
    -2526 
    -2527                 /**
    -2528                  * para los touch identificados, extraer que actores se han afectado.
    -2529                  * crear eventos con la info de touch para cada uno.
    -2530                  */
    -2531 
    -2532                 var actors = {};
    -2533                 for (i = 0; i < recent.length; i++) {
    -2534                     var touchId = recent[ i ];
    -2535                     var actor = this.touches[ touchId ].actor;
    -2536 
    -2537                     if (!actors[actor.id]) {
    -2538                         actors[actor.id] = {
    -2539                             actor:actor,
    -2540                             touch:new CAAT.Event.TouchEvent().init(e, actor, this.currentScene.time)
    -2541                         };
    -2542                     }
    -2543 
    -2544                     var ev = actors[ actor.id ].touch;
    -2545                     ev.addTouch(this.touches[ touchId ].touch);
    -2546                     ev.addChangedTouch(this.touches[ touchId ].touch);
    -2547                 }
    -2548 
    -2549                 /**
    -2550                  * notificar a todos los actores.
    -2551                  */
    -2552                 for (var pr in actors) {
    -2553                     var data = actors[pr];
    -2554                     var actor = data.actor;
    -2555                     var touch = data.touch;
    -2556 
    -2557                     for (var actorId in this.touches) {
    -2558                         var tt = this.touches[actorId]
    -2559                         if (tt.actor.id === actor.id) {
    -2560                             touch.addTouch(tt.touch);
    -2561                         }
    -2562                     }
    -2563 
    -2564                     actor.touchMove(touch);
    -2565                 }
    -2566             },
    -2567 
    -2568             __touchCancelHandleMT:function (e) {
    -2569                 this.__touchEndHandlerMT(e);
    -2570             },
    -2571 
    -2572             __touchStartHandlerMT:function (e) {
    -2573                 e.preventDefault();
    -2574                 e.returnValue = false;
    -2575 
    -2576                 var i;
    -2577                 var recent = [];
    -2578                 var allInCanvas = true;
    -2579 
    -2580                 /**
    -2581                  * extrae actores afectados, y coordenadas relativas para ellos.
    -2582                  * crear una coleccion touch-id : { actor, touch-event }
    -2583                  */
    -2584                 for (i = 0; i < e.changedTouches.length; i++) {
    -2585                     var touch = e.changedTouches[i];
    -2586                     var id = touch.identifier;
    -2587                     var mp = this.mousePoint;
    -2588                     this.getCanvasCoord(mp, touch);
    -2589                     if (mp.x < 0 || mp.y < 0 || mp.x >= this.width || mp.y >= this.height) {
    -2590                         allInCanvas = false;
    -2591                         continue;
    -2592                     }
    -2593 
    -2594                     var actor = this.findActorAtPosition(mp);
    -2595                     if (actor !== null) {
    -2596                         mp = actor.viewToModel(mp);
    -2597 
    -2598                         if (!this.touches[ id ]) {
    -2599 
    -2600                             this.touches[ id ] = {
    -2601                                 actor:actor,
    -2602                                 touch:new CAAT.Event.TouchInfo(id, mp.x, mp.y, actor)
    -2603                             };
    -2604 
    -2605                             recent.push(id);
    -2606                         }
    -2607 
    -2608                     }
    -2609                 }
    -2610 
    -2611                 /**
    -2612                  * para los touch identificados, extraer que actores se han afectado.
    -2613                  * crear eventos con la info de touch para cada uno.
    -2614                  */
    -2615 
    -2616                 var actors = {};
    -2617                 for (i = 0; i < recent.length; i++) {
    -2618                     var touchId = recent[ i ];
    -2619                     var actor = this.touches[ touchId ].actor;
    -2620 
    -2621                     if (!actors[actor.id]) {
    -2622                         actors[actor.id] = {
    -2623                             actor:actor,
    -2624                             touch:new CAAT.Event.TouchEvent().init(e, actor, this.currentScene.time)
    -2625                         };
    -2626                     }
    -2627 
    -2628                     var ev = actors[ actor.id ].touch;
    -2629                     ev.addTouch(this.touches[ touchId ].touch);
    -2630                     ev.addChangedTouch(this.touches[ touchId ].touch);
    -2631                 }
    -2632 
    -2633                 /**
    -2634                  * notificar a todos los actores.
    -2635                  */
    -2636                 for (var pr in actors) {
    -2637                     var data = actors[pr];
    -2638                     var actor = data.actor;
    -2639                     var touch = data.touch;
    -2640 
    -2641                     for (var actorId in this.touches) {
    -2642                         var tt = this.touches[actorId]
    -2643                         if (tt.actor.id === actor.id) {
    -2644                             touch.addTouch(tt.touch);
    -2645                         }
    -2646                     }
    -2647 
    -2648                     actor.touchStart(touch);
    -2649                 }
    -2650 
    -2651             },
    -2652 
    -2653             __findTouchFirstActor:function () {
    -2654 
    -2655                 var t = Number.MAX_VALUE;
    -2656                 var actor = null;
    -2657                 for (var pr in this.touches) {
    -2658 
    -2659                     var touch = this.touches[pr];
    -2660 
    -2661                     if (touch.touch.time && touch.touch.time < t && touch.actor.isGestureEnabled()) {
    -2662                         actor = touch.actor;
    -2663                         t = touch.touch.time;
    -2664                     }
    -2665                 }
    -2666                 return actor;
    -2667             },
    -2668 
    -2669             __gesturedActor:null,
    -2670             __touchGestureStartHandleMT:function (e) {
    -2671                 var actor = this.__findTouchFirstActor();
    -2672 
    -2673                 if (actor !== null && actor.isGestureEnabled()) {
    -2674                     this.__gesturedActor = actor;
    -2675                     this.__gestureRotation = actor.rotationAngle;
    -2676                     this.__gestureSX = actor.scaleX - 1;
    -2677                     this.__gestureSY = actor.scaleY - 1;
    -2678 
    -2679 
    -2680                     actor.gestureStart(
    -2681                         e.rotation * Math.PI / 180,
    -2682                         e.scale + this.__gestureSX,
    -2683                         e.scale + this.__gestureSY);
    -2684                 }
    -2685             },
    -2686 
    -2687             __touchGestureEndHandleMT:function (e) {
    -2688 
    -2689                 if (null !== this.__gesturedActor && this.__gesturedActor.isGestureEnabled()) {
    -2690                     this.__gesturedActor.gestureEnd(
    -2691                         e.rotation * Math.PI / 180,
    -2692                         e.scale + this.__gestureSX,
    -2693                         e.scale + this.__gestureSY);
    -2694                 }
    -2695 
    -2696                 this.__gestureRotation = 0;
    -2697                 this.__gestureScale = 0;
    -2698 
    -2699 
    -2700             },
    -2701 
    -2702             __touchGestureChangeHandleMT:function (e) {
    -2703 
    -2704                 if (this.__gesturedActor !== null && this.__gesturedActor.isGestureEnabled()) {
    -2705                     this.__gesturedActor.gestureChange(
    -2706                         e.rotation * Math.PI / 180,
    -2707                         this.__gestureSX + e.scale,
    -2708                         this.__gestureSY + e.scale);
    -2709                 }
    -2710             },
    -2711 
    -2712 
    -2713             addHandlers:function (canvas) {
    -2714 
    -2715                 var me = this;
    -2716 
    -2717                 window.addEventListener('mouseup', function (e) {
    -2718                     if (me.touching) {
    -2719                         e.preventDefault();
    -2720                         e.cancelBubble = true;
    -2721                         if (e.stopPropagation) e.stopPropagation();
    -2722 
    -2723                         var mp = me.mousePoint;
    -2724                         me.getCanvasCoord(mp, e);
    -2725                         me.__mouseUpHandler(e);
    -2726 
    -2727                         me.touching = false;
    -2728                     }
    -2729                 }, false);
    -2730 
    -2731                 window.addEventListener('mousedown', function (e) {
    -2732                     if (e.target === canvas) {
    -2733                         e.preventDefault();
    -2734                         e.cancelBubble = true;
    -2735                         if (e.stopPropagation) e.stopPropagation();
    -2736 
    -2737                         var mp = me.mousePoint;
    -2738                         me.getCanvasCoord(mp, e);
    -2739                         if (mp.x < 0 || mp.y < 0 || mp.x >= me.width || mp.y >= me.height) {
    -2740                             return;
    -2741                         }
    -2742                         me.touching = true;
    -2743 
    -2744                         me.__mouseDownHandler(e);
    -2745                     }
    -2746                 }, false);
    -2747 
    -2748                 window.addEventListener('mouseover', function (e) {
    -2749                     if (e.target === canvas && !me.dragging) {
    -2750                         e.preventDefault();
    -2751                         e.cancelBubble = true;
    -2752                         if (e.stopPropagation) e.stopPropagation();
    -2753 
    -2754                         var mp = me.mousePoint;
    -2755                         me.getCanvasCoord(mp, e);
    -2756                         if (mp.x < 0 || mp.y < 0 || mp.x >= me.width || mp.y >= me.height) {
    -2757                             return;
    -2758                         }
    -2759 
    -2760                         me.__mouseOverHandler(e);
    -2761                     }
    -2762                 }, false);
    -2763 
    -2764                 window.addEventListener('mouseout', function (e) {
    -2765                     if (e.target === canvas && !me.dragging) {
    -2766                         e.preventDefault();
    -2767                         e.cancelBubble = true;
    -2768                         if (e.stopPropagation) e.stopPropagation();
    -2769 
    -2770                         var mp = me.mousePoint;
    -2771                         me.getCanvasCoord(mp, e);
    -2772                         me.__mouseOutHandler(e);
    -2773                     }
    -2774                 }, false);
    -2775 
    -2776                 window.addEventListener('mousemove', function (e) {
    -2777                     e.preventDefault();
    -2778                     e.cancelBubble = true;
    -2779                     if (e.stopPropagation) e.stopPropagation();
    -2780 
    -2781                     var mp = me.mousePoint;
    -2782                     me.getCanvasCoord(mp, e);
    -2783                     if (!me.dragging && ( mp.x < 0 || mp.y < 0 || mp.x >= me.width || mp.y >= me.height )) {
    -2784                         return;
    -2785                     }
    -2786                     me.__mouseMoveHandler(e);
    -2787                 }, false);
    -2788 
    -2789                 window.addEventListener("dblclick", function (e) {
    -2790                     if (e.target === canvas) {
    -2791                         e.preventDefault();
    -2792                         e.cancelBubble = true;
    -2793                         if (e.stopPropagation) e.stopPropagation();
    -2794                         var mp = me.mousePoint;
    -2795                         me.getCanvasCoord(mp, e);
    -2796                         if (mp.x < 0 || mp.y < 0 || mp.x >= me.width || mp.y >= me.height) {
    -2797                             return;
    -2798                         }
    -2799 
    -2800                         me.__mouseDBLClickHandler(e);
    -2801                     }
    -2802                 }, false);
    -2803 
    -2804                 if (CAAT.TOUCH_BEHAVIOR === CAAT.TOUCH_AS_MOUSE) {
    -2805                     canvas.addEventListener("touchstart", this.__touchStartHandler.bind(this), false);
    -2806                     canvas.addEventListener("touchmove", this.__touchMoveHandler.bind(this), false);
    -2807                     canvas.addEventListener("touchend", this.__touchEndHandler.bind(this), false);
    -2808                     canvas.addEventListener("gesturestart", function (e) {
    -2809                         if (e.target === canvas) {
    -2810                             e.preventDefault();
    -2811                             e.returnValue = false;
    -2812                             me.__gestureStart(e.scale, e.rotation);
    -2813                         }
    -2814                     }, false);
    -2815                     canvas.addEventListener("gestureend", function (e) {
    -2816                         if (e.target === canvas) {
    -2817                             e.preventDefault();
    -2818                             e.returnValue = false;
    -2819                             me.__gestureEnd(e.scale, e.rotation);
    -2820                         }
    -2821                     }, false);
    -2822                     canvas.addEventListener("gesturechange", function (e) {
    -2823                         if (e.target === canvas) {
    -2824                             e.preventDefault();
    -2825                             e.returnValue = false;
    -2826                             me.__gestureChange(e.scale, e.rotation);
    -2827                         }
    -2828                     }, false);
    -2829                 } else if (CAAT.TOUCH_BEHAVIOR === CAAT.TOUCH_AS_MULTITOUCH) {
    -2830                     canvas.addEventListener("touchstart", this.__touchStartHandlerMT.bind(this), false);
    -2831                     canvas.addEventListener("touchmove", this.__touchMoveHandlerMT.bind(this), false);
    -2832                     canvas.addEventListener("touchend", this.__touchEndHandlerMT.bind(this), false);
    -2833                     canvas.addEventListener("touchcancel", this.__touchCancelHandleMT.bind(this), false);
    -2834 
    -2835                     canvas.addEventListener("gesturestart", this.__touchGestureStartHandleMT.bind(this), false);
    -2836                     canvas.addEventListener("gestureend", this.__touchGestureEndHandleMT.bind(this), false);
    -2837                     canvas.addEventListener("gesturechange", this.__touchGestureChangeHandleMT.bind(this), false);
    -2838                 }
    -2839 
    -2840             },
    -2841 
    -2842             enableEvents:function (onElement) {
    -2843                 CAAT.RegisterDirector(this);
    -2844                 this.in_ = false;
    -2845                 this.createEventHandler(onElement);
    -2846             },
    -2847 
    -2848             createEventHandler:function (onElement) {
    -2849                 //var canvas= this.canvas;
    -2850                 this.in_ = false;
    -2851                 //this.addHandlers(canvas);
    -2852                 this.addHandlers(onElement);
    -2853             }
    -2854         }
    -2855     },
    -2856 
    -2857     onCreate:function () {
    -2858 
    -2859         if (typeof CAAT.__CSS__!=="undefined") {
    -2860 
    -2861             CAAT.Foundation.Director.prototype.clip = true;
    -2862             CAAT.Foundation.Director.prototype.glEnabled = false;
    -2863 
    -2864             CAAT.Foundation.Director.prototype.getRenderType = function () {
    -2865                 return 'CSS';
    -2866             };
    -2867 
    -2868             CAAT.Foundation.Director.prototype.setScaleProportional = function (w, h) {
    -2869 
    -2870                 var factor = Math.min(w / this.referenceWidth, h / this.referenceHeight);
    -2871                 this.setScaleAnchored(factor, factor, 0, 0);
    -2872 
    -2873                 this.eventHandler.style.width = '' + this.referenceWidth + 'px';
    -2874                 this.eventHandler.style.height = '' + this.referenceHeight + 'px';
    -2875             };
    -2876 
    -2877             CAAT.Foundation.Director.prototype.setBounds = function (x, y, w, h) {
    -2878                 CAAT.Foundation.Director.superclass.setBounds.call(this, x, y, w, h);
    -2879                 for (var i = 0; i < this.scenes.length; i++) {
    -2880                     this.scenes[i].setBounds(0, 0, w, h);
    -2881                 }
    -2882                 this.eventHandler.style.width = w + 'px';
    -2883                 this.eventHandler.style.height = h + 'px';
    -2884 
    -2885                 return this;
    -2886             };
    -2887 
    -2888             /**
    -2889              * In this DOM/CSS implementation, proxy is not taken into account since the event router is a top most
    -2890              * div in the document hierarchy (z-index 999999).
    -2891              * @param width
    -2892              * @param height
    -2893              * @param domElement
    -2894              * @param proxy
    -2895              */
    -2896             CAAT.Foundation.Director.prototype.initialize = function (width, height, domElement, proxy) {
    -2897 
    -2898                 this.timeline = new Date().getTime();
    -2899                 this.domElement = domElement;
    -2900                 this.style('position', 'absolute');
    -2901                 this.style('width', '' + width + 'px');
    -2902                 this.style('height', '' + height + 'px');
    -2903                 this.style('overflow', 'hidden');
    -2904 
    -2905                 this.enableEvents(domElement);
    -2906 
    -2907                 this.setBounds(0, 0, width, height);
    -2908 
    -2909                 this.checkDebug();
    -2910                 return this;
    -2911             };
    -2912 
    -2913             CAAT.Foundation.Director.prototype.render = function (time) {
    -2914 
    -2915                 this.time += time;
    -2916                 this.animate(this, time);
    -2917 
    -2918                 /**
    -2919                  * draw director active scenes.
    -2920                  */
    -2921                 var i, l, tt;
    -2922 
    -2923                 if (!navigator.isCocoonJS && CAAT.DEBUG) {
    -2924                     this.resetStats();
    -2925                 }
    -2926 
    -2927                 for (i = 0, l = this.childrenList.length; i < l; i++) {
    -2928                     var c = this.childrenList[i];
    -2929                     if (c.isInAnimationFrame(this.time) && !c.isPaused()) {
    -2930                         tt = c.time - c.start_time;
    -2931                         c.timerManager.checkTimers(tt);
    -2932                         c.timerManager.removeExpiredTimers();
    -2933                     }
    -2934                 }
    -2935 
    -2936                 for (i = 0, l = this.childrenList.length; i < l; i++) {
    -2937                     var c = this.childrenList[i];
    -2938                     if (c.isInAnimationFrame(this.time)) {
    -2939                         tt = c.time - c.start_time;
    -2940                         if (c.onRenderStart) {
    -2941                             c.onRenderStart(tt);
    -2942                         }
    -2943 
    -2944                         c.paintActor(this, tt);
    -2945 
    -2946                         if (c.onRenderEnd) {
    -2947                             c.onRenderEnd(tt);
    -2948                         }
    -2949 
    -2950                         if (!c.isPaused()) {
    -2951                             c.time += time;
    -2952                         }
    -2953 
    -2954                         if (!navigator.isCocoonJS && CAAT.DEBUG) {
    -2955                             this.statistics.size_discarded_by_dirtyRects += this.drDiscarded;
    -2956                             this.statistics.size_total += c.size_total;
    -2957                             this.statistics.size_active += c.size_active;
    -2958                             this.statistics.size_dirtyRects = this.nDirtyRects;
    -2959 
    -2960                         }
    -2961 
    -2962                     }
    -2963                 }
    -2964 
    -2965                 this.frameCounter++;
    -2966             };
    -2967 
    -2968             CAAT.Foundation.Director.prototype.addScene = function (scene) {
    -2969                 scene.setVisible(true);
    -2970                 scene.setBounds(0, 0, this.width, this.height);
    -2971                 this.scenes.push(scene);
    -2972                 scene.setEaseListener(this);
    -2973                 if (null === this.currentScene) {
    -2974                     this.setScene(0);
    -2975                 }
    -2976 
    -2977                 this.domElement.appendChild(scene.domElement);
    -2978             };
    -2979 
    -2980             CAAT.Foundation.Director.prototype.emptyScenes = function () {
    -2981                 this.scenes = [];
    -2982                 this.domElement.innerHTML = '';
    -2983                 this.createEventHandler();
    -2984             };
    -2985 
    -2986             CAAT.Foundation.Director.prototype.setClear = function (clear) {
    -2987                 return this;
    -2988             };
    -2989 
    -2990             CAAT.Foundation.Director.prototype.createEventHandler = function () {
    -2991                 this.eventHandler = document.createElement('div');
    -2992                 this.domElement.appendChild(this.eventHandler);
    -2993 
    -2994                 this.eventHandler.style.position = 'absolute';
    -2995                 this.eventHandler.style.left = '0';
    -2996                 this.eventHandler.style.top = '0';
    -2997                 this.eventHandler.style.zIndex = 999999;
    -2998                 this.eventHandler.style.width = '' + this.width + 'px';
    -2999                 this.eventHandler.style.height = '' + this.height + 'px';
    -3000 
    -3001                 this.canvas = this.eventHandler;
    -3002                 this.in_ = false;
    -3003 
    -3004                 this.addHandlers(this.canvas);
    -3005             };
    -3006 
    -3007             CAAT.Foundation.Director.prototype.inDirtyRect = function () {
    -3008                 return true;
    -3009             }
    -3010         }
    -3011     }
    -3012 });
    -3013 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Scene.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Scene.js.html deleted file mode 100644 index 8dceaf8c..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Scene.js.html +++ /dev/null @@ -1,606 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  */
    -  5 
    -  6 CAAT.Module({
    -  7 
    -  8     /**
    -  9      * @name Scene
    - 10      * @memberOf CAAT.Foundation
    - 11      * @extends CAAT.Foundation.ActorContainer
    - 12      *
    - 13      * @constructor
    - 14      *
    - 15      */
    - 16 
    - 17     defines:"CAAT.Foundation.Scene",
    - 18     depends: [
    - 19         "CAAT.Math.Point",
    - 20         "CAAT.Math.Matrix",
    - 21         "CAAT.PathUtil.Path",
    - 22         "CAAT.Behavior.GenericBehavior",
    - 23         "CAAT.Behavior.ContainerBehavior",
    - 24         "CAAT.Behavior.ScaleBehavior",
    - 25         "CAAT.Behavior.AlphaBehavior",
    - 26         "CAAT.Behavior.RotateBehavior",
    - 27         "CAAT.Behavior.PathBehavior",
    - 28         "CAAT.Foundation.ActorContainer",
    - 29         "CAAT.Foundation.Timer.TimerManager"
    - 30     ],
    - 31     aliases:["CAAT.Scene"],
    - 32     extendsClass:"CAAT.Foundation.ActorContainer",
    - 33     constants:{
    - 34         /**
    - 35          * @lends  CAAT.Foundation.Scene
    - 36          */
    - 37 
    - 38         /** @const @type {number} */ EASE_ROTATION:1, // Constant values to identify the type of Scene transition
    - 39         /** @const @type {number} */ EASE_SCALE:2, // to perform on Scene switching by the Director.
    - 40         /** @const @type {number} */ EASE_TRANSLATE:3
    - 41     },
    - 42     extendsWith:function () {
    - 43         return {
    - 44 
    - 45             /**
    - 46              * @lends  CAAT.Foundation.Scene.prototype
    - 47              */
    - 48 
    - 49             __init:function () {
    - 50                 this.__super();
    - 51                 this.timerManager = new CAAT.TimerManager();
    - 52                 this.fillStyle = null;
    - 53                 this.isGlobalAlpha = true;
    - 54                 return this;
    - 55             },
    - 56 
    - 57             /**
    - 58              * Behavior container used uniquely for Scene switching.
    - 59              * @type {CAAT.Behavior.ContainerBehavior}
    - 60              * @private
    - 61              */
    - 62             easeContainerBehaviour:null,
    - 63 
    - 64             /**
    - 65              * Array of container behaviour events observer.
    - 66              * @private
    - 67              */
    - 68             easeContainerBehaviourListener:null,
    - 69 
    - 70             /**
    - 71              * When Scene switching, this boolean identifies whether the Scene is being brought in, or taken away.
    - 72              * @type {boolean}
    - 73              * @private
    - 74              */
    - 75             easeIn:false,
    - 76 
    - 77 
    - 78             /**
    - 79              * is this scene paused ?
    - 80              * @type {boolean}
    - 81              * @private
    - 82              */
    - 83             paused:false,
    - 84 
    - 85             /**
    - 86              * This scene´s timer manager.
    - 87              * @type {CAAT.Foundation.Timer.TimerManager}
    - 88              * @private
    - 89              */
    - 90             timerManager:null,
    - 91 
    - 92             isPaused:function () {
    - 93                 return this.paused;
    - 94             },
    - 95 
    - 96             setPaused:function (paused) {
    - 97                 this.paused = paused;
    - 98             },
    - 99 
    -100             createTimer:function (startTime, duration, callback_timeout, callback_tick, callback_cancel) {
    -101                 return this.timerManager.createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel, this);
    -102             },
    -103 
    -104             setTimeout:function (duration, callback_timeout, callback_tick, callback_cancel) {
    -105                 return this.timerManager.createTimer(this.time, duration, callback_timeout, callback_tick, callback_cancel, this);
    -106             },
    -107 
    -108             /**
    -109              * Helper method to manage alpha transparency fading on Scene switch by the Director.
    -110              * @param time {number} time in milliseconds then fading will taableIne.
    -111              * @param isIn {boolean} whether this Scene is being brought in.
    -112              *
    -113              * @private
    -114              */
    -115             createAlphaBehaviour:function (time, isIn) {
    -116                 var ab = new CAAT.Behavior.AlphaBehavior();
    -117                 ab.setFrameTime(0, time);
    -118                 ab.startAlpha = isIn ? 0 : 1;
    -119                 ab.endAlpha = isIn ? 1 : 0;
    -120                 this.easeContainerBehaviour.addBehavior(ab);
    -121             },
    -122             /**
    -123              * Called from CAAT.Director to bring in an Scene.
    -124              * A helper method for easeTranslation.
    -125              * @param time {number} time in milliseconds for the Scene to be brought in.
    -126              * @param alpha {boolean} whether fading will be applied to the Scene.
    -127              * @param anchor {number} Scene switch anchor.
    -128              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    -129              */
    -130             easeTranslationIn:function (time, alpha, anchor, interpolator) {
    -131                 this.easeTranslation(time, alpha, anchor, true, interpolator);
    -132             },
    -133             /**
    -134              * Called from CAAT.Director to bring in an Scene.
    -135              * A helper method for easeTranslation.
    -136              * @param time {number} time in milliseconds for the Scene to be taken away.
    -137              * @param alpha {boolean} fading will be applied to the Scene.
    -138              * @param anchor {number} Scene switch anchor.
    -139              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    -140              */
    -141             easeTranslationOut:function (time, alpha, anchor, interpolator) {
    -142                 this.easeTranslation(time, alpha, anchor, false, interpolator);
    -143             },
    -144             /**
    -145              * This method will setup Scene behaviours to switch an Scene via a translation.
    -146              * The anchor value can only be
    -147              *  <li>CAAT.Actor.ANCHOR_LEFT
    -148              *  <li>CAAT.Actor.ANCHOR_RIGHT
    -149              *  <li>CAAT.Actor.ANCHOR_TOP
    -150              *  <li>CAAT.Actor.ANCHOR_BOTTOM
    -151              * if any other value is specified, any of the previous ones will be applied.
    -152              *
    -153              * @param time {number} time in milliseconds for the Scene.
    -154              * @param alpha {boolean} whether fading will be applied to the Scene.
    -155              * @param anchor {numnber} Scene switch anchor.
    -156              * @param isIn {boolean} whether the scene will be brought in.
    -157              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    -158              */
    -159             easeTranslation:function (time, alpha, anchor, isIn, interpolator) {
    -160 
    -161                 this.easeContainerBehaviour = new CAAT.Behavior.ContainerBehavior();
    -162                 this.easeIn = isIn;
    -163 
    -164                 var pb = new CAAT.Behavior.PathBehavior();
    -165                 if (interpolator) {
    -166                     pb.setInterpolator(interpolator);
    -167                 }
    -168 
    -169                 pb.setFrameTime(0, time);
    -170 
    -171                 // BUGBUG anchors: 1..4
    -172                 if (anchor < 1) {
    -173                     anchor = 1;
    -174                 } else if (anchor > 4) {
    -175                     anchor = 4;
    -176                 }
    -177 
    -178 
    -179                 switch (anchor) {
    -180                     case CAAT.Foundation.Actor.ANCHOR_TOP:
    -181                         if (isIn) {
    -182                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, -this.height + 1, 0, 0));
    -183                             this.setPosition(0,-this.height+1);
    -184                         } else {
    -185                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, 0, 0, -this.height + 1));
    -186                             this.setPosition(0,0);
    -187                         }
    -188                         break;
    -189                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM:
    -190                         if (isIn) {
    -191                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, this.height - 1, 0, 0));
    -192                             this.setPosition(0,this.height-1);
    -193                         } else {
    -194                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, 0, 0, this.height - 1));
    -195                             this.setPosition(0,0);
    -196                         }
    -197                         break;
    -198                     case CAAT.Foundation.Actor.ANCHOR_LEFT:
    -199                         if (isIn) {
    -200                             pb.setPath(new CAAT.PathUtil.Path().setLinear(-this.width + 1, 0, 0, 0));
    -201                             this.setPosition(-this.width+1,0);
    -202                         } else {
    -203                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, 0, -this.width + 1, 0));
    -204                             this.setPosition(0,0);
    -205                         }
    -206                         break;
    -207                     case CAAT.Foundation.Actor.ANCHOR_RIGHT:
    -208                         if (isIn) {
    -209                             pb.setPath(new CAAT.PathUtil.Path().setLinear(this.width - 1, 0, 0, 0));
    -210                             this.setPosition(this.width-1,0);
    -211                         } else {
    -212                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, 0, this.width - 1, 0));
    -213                             this.setPosition(0,0);
    -214                         }
    -215                         break;
    -216                 }
    -217 
    -218                 if (alpha) {
    -219                     this.createAlphaBehaviour(time, isIn);
    -220                 }
    -221 
    -222                 this.easeContainerBehaviour.addBehavior(pb);
    -223 
    -224                 this.easeContainerBehaviour.setFrameTime(this.time, time);
    -225                 this.easeContainerBehaviour.addListener(this);
    -226 
    -227                 this.emptyBehaviorList();
    -228                 CAAT.Foundation.Scene.superclass.addBehavior.call(this, this.easeContainerBehaviour);
    -229             },
    -230             /**
    -231              * Called from CAAT.Foundation.Director to bring in a Scene.
    -232              * A helper method for easeScale.
    -233              * @param time {number} time in milliseconds for the Scene to be brought in.
    -234              * @param alpha {boolean} whether fading will be applied to the Scene.
    -235              * @param anchor {number} Scene switch anchor.
    -236              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    -237              * @param starttime {number} scene time milliseconds from which the behavior will be applied.
    -238              */
    -239             easeScaleIn:function (starttime, time, alpha, anchor, interpolator) {
    -240                 this.easeScale(starttime, time, alpha, anchor, true, interpolator);
    -241                 this.easeIn = true;
    -242             },
    -243             /**
    -244              * Called from CAAT.Foundation.Director to take away a Scene.
    -245              * A helper method for easeScale.
    -246              * @param time {number} time in milliseconds for the Scene to be brought in.
    -247              * @param alpha {boolean} whether fading will be applied to the Scene.
    -248              * @param anchor {number} Scene switch anchor.
    -249              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    -250              * @param starttime {number} scene time milliseconds from which the behavior will be applied.
    -251              **/
    -252             easeScaleOut:function (starttime, time, alpha, anchor, interpolator) {
    -253                 this.easeScale(starttime, time, alpha, anchor, false, interpolator);
    -254                 this.easeIn = false;
    -255             },
    -256             /**
    -257              * Called from CAAT.Foundation.Director to bring in ot take away an Scene.
    -258              * @param time {number} time in milliseconds for the Scene to be brought in.
    -259              * @param alpha {boolean} whether fading will be applied to the Scene.
    -260              * @param anchor {number} Scene switch anchor.
    -261              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    -262              * @param starttime {number} scene time milliseconds from which the behavior will be applied.
    -263              * @param isIn boolean indicating whether the Scene is being brought in.
    -264              */
    -265             easeScale:function (starttime, time, alpha, anchor, isIn, interpolator) {
    -266                 this.easeContainerBehaviour = new CAAT.Behavior.ContainerBehavior();
    -267 
    -268                 var x = 0;
    -269                 var y = 0;
    -270                 var x2 = 0;
    -271                 var y2 = 0;
    -272 
    -273                 switch (anchor) {
    -274                     case CAAT.Foundation.Actor.ANCHOR_TOP_LEFT:
    -275                     case CAAT.Foundation.Actor.ANCHOR_TOP_RIGHT:
    -276                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM_LEFT:
    -277                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM_RIGHT:
    -278                     case CAAT.Foundation.Actor.ANCHOR_CENTER:
    -279                         x2 = 1;
    -280                         y2 = 1;
    -281                         break;
    -282                     case CAAT.Foundation.Actor.ANCHOR_TOP:
    -283                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM:
    -284                         x = 1;
    -285                         x2 = 1;
    -286                         y = 0;
    -287                         y2 = 1;
    -288                         break;
    -289                     case CAAT.Foundation.Actor.ANCHOR_LEFT:
    -290                     case CAAT.Foundation.Actor.ANCHOR_RIGHT:
    -291                         y = 1;
    -292                         y2 = 1;
    -293                         x = 0;
    -294                         x2 = 1;
    -295                         break;
    -296                     default:
    -297                         alert('scale anchor ?? ' + anchor);
    -298                 }
    -299 
    -300                 if (!isIn) {
    -301                     var tmp;
    -302                     tmp = x;
    -303                     x = x2;
    -304                     x2 = tmp;
    -305 
    -306                     tmp = y;
    -307                     y = y2;
    -308                     y2 = tmp;
    -309                 }
    -310 
    -311                 if (alpha) {
    -312                     this.createAlphaBehaviour(time, isIn);
    -313                 }
    -314 
    -315                 var anchorPercent = this.getAnchorPercent(anchor);
    -316                 var sb = new CAAT.Behavior.ScaleBehavior().
    -317                     setFrameTime(starttime, time).
    -318                     setValues(x, x2, y, y2, anchorPercent.x, anchorPercent.y);
    -319 
    -320                 if (interpolator) {
    -321                     sb.setInterpolator(interpolator);
    -322                 }
    -323 
    -324                 this.easeContainerBehaviour.addBehavior(sb);
    -325 
    -326                 this.easeContainerBehaviour.setFrameTime(this.time, time);
    -327                 this.easeContainerBehaviour.addListener(this);
    -328 
    -329                 this.emptyBehaviorList();
    -330                 CAAT.Foundation.Scene.superclass.addBehavior.call(this, this.easeContainerBehaviour);
    -331             },
    -332             /**
    -333              * Overriden method to disallow default behavior.
    -334              * Do not use directly.
    -335              */
    -336             addBehavior:function (behaviour) {
    -337                 return this;
    -338             },
    -339             /**
    -340              * Called from CAAT.Director to use Rotations for bringing in.
    -341              * This method is a Helper for the method easeRotation.
    -342              * @param time integer indicating time in milliseconds for the Scene to be brought in.
    -343              * @param alpha boolean indicating whether fading will be applied to the Scene.
    -344              * @param anchor integer indicating the Scene switch anchor.
    -345              * @param interpolator {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    -346              */
    -347             easeRotationIn:function (time, alpha, anchor, interpolator) {
    -348                 this.easeRotation(time, alpha, anchor, true, interpolator);
    -349                 this.easeIn = true;
    -350             },
    -351             /**
    -352              * Called from CAAT.Director to use Rotations for taking Scenes away.
    -353              * This method is a Helper for the method easeRotation.
    -354              * @param time integer indicating time in milliseconds for the Scene to be taken away.
    -355              * @param alpha boolean indicating whether fading will be applied to the Scene.
    -356              * @param anchor integer indicating the Scene switch anchor.
    -357              * @param interpolator {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    -358              */
    -359             easeRotationOut:function (time, alpha, anchor, interpolator) {
    -360                 this.easeRotation(time, alpha, anchor, false, interpolator);
    -361                 this.easeIn = false;
    -362             },
    -363             /**
    -364              * Called from CAAT.Director to use Rotations for taking away or bringing Scenes in.
    -365              * @param time integer indicating time in milliseconds for the Scene to be taken away or brought in.
    -366              * @param alpha boolean indicating whether fading will be applied to the Scene.
    -367              * @param anchor integer indicating the Scene switch anchor.
    -368              * @param interpolator {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    -369              * @param isIn boolean indicating whehter the Scene is brought in.
    -370              */
    -371             easeRotation:function (time, alpha, anchor, isIn, interpolator) {
    -372                 this.easeContainerBehaviour = new CAAT.Behavior.ContainerBehavior();
    -373 
    -374                 var start = 0;
    -375                 var end = 0;
    -376 
    -377                 if (anchor == CAAT.Foundation.Actor.ANCHOR_CENTER) {
    -378                     anchor = CAAT.Foundation.Actor.ANCHOR_TOP;
    -379                 }
    -380 
    -381                 switch (anchor) {
    -382                     case CAAT.Foundation.Actor.ANCHOR_TOP:
    -383                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM:
    -384                     case CAAT.Foundation.Actor.ANCHOR_LEFT:
    -385                     case CAAT.Foundation.Actor.ANCHOR_RIGHT:
    -386                         start = Math.PI * (Math.random() < 0.5 ? 1 : -1);
    -387                         break;
    -388                     case CAAT.Foundation.Actor.ANCHOR_TOP_LEFT:
    -389                     case CAAT.Foundation.Actor.ANCHOR_TOP_RIGHT:
    -390                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM_LEFT:
    -391                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM_RIGHT:
    -392                         start = Math.PI / 2 * (Math.random() < 0.5 ? 1 : -1);
    -393                         break;
    -394                     default:
    -395                         alert('rot anchor ?? ' + anchor);
    -396                 }
    -397 
    -398                 if (false === isIn) {
    -399                     var tmp = start;
    -400                     start = end;
    -401                     end = tmp;
    -402                 }
    -403 
    -404                 if (alpha) {
    -405                     this.createAlphaBehaviour(time, isIn);
    -406                 }
    -407 
    -408                 var anchorPercent = this.getAnchorPercent(anchor);
    -409                 var rb = new CAAT.Behavior.RotateBehavior().
    -410                     setFrameTime(0, time).
    -411                     setValues(start, end, anchorPercent.x, anchorPercent.y);
    -412 
    -413                 if (interpolator) {
    -414                     rb.setInterpolator(interpolator);
    -415                 }
    -416                 this.easeContainerBehaviour.addBehavior(rb);
    -417                 this.easeContainerBehaviour.setFrameTime(this.time, time);
    -418                 this.easeContainerBehaviour.addListener(this);
    -419 
    -420                 this.emptyBehaviorList();
    -421                 CAAT.Foundation.Scene.superclass.addBehavior.call(this, this.easeContainerBehaviour);
    -422             },
    -423             /**
    -424              * Registers a listener for listen for transitions events.
    -425              * Al least, the Director registers himself as Scene easing transition listener.
    -426              * When the transition is done, it restores the Scene's capability of receiving events.
    -427              * @param listener {function(caat_behavior,time,actor)} an object which contains a method of the form <code>
    -428              * behaviorExpired( caat_behaviour, time, actor);
    -429              */
    -430             setEaseListener:function (listener) {
    -431                 this.easeContainerBehaviourListener = listener;
    -432             },
    -433             /**
    -434              * Private.
    -435              * listener for the Scene's easeContainerBehaviour.
    -436              * @param actor
    -437              */
    -438             behaviorExpired:function (actor) {
    -439                 this.easeContainerBehaviourListener.easeEnd(this, this.easeIn);
    -440             },
    -441             /**
    -442              * This method should be overriden in case the developer wants to do some special actions when
    -443              * the scene has just been brought in.
    -444              */
    -445             activated:function () {
    -446             },
    -447             /**
    -448              * Scenes, do not expire the same way Actors do.
    -449              * It simply will be set expired=true, but the frameTime won't be modified.
    -450              */
    -451             setExpired:function (bExpired) {
    -452                 this.expired = bExpired;
    -453             },
    -454             /**
    -455              * An scene by default does not paint anything because has not fillStyle set.
    -456              * @param director
    -457              * @param time
    -458              */
    -459             paint:function (director, time) {
    -460 
    -461                 if (this.fillStyle) {
    -462                     var ctx = director.ctx;
    -463                     ctx.fillStyle = this.fillStyle;
    -464                     ctx.fillRect(0, 0, this.width, this.height);
    -465                 }
    -466             },
    -467             /**
    -468              * Find a pointed actor at position point.
    -469              * This method tries lo find the correctly pointed actor in two different ways.
    -470              *  + first of all, if inputList is defined, it will look for an actor in it.
    -471              *  + if no inputList is defined, it will traverse the scene graph trying to find a pointed actor.
    -472              * @param point <CAAT.Point>
    -473              */
    -474             findActorAtPosition:function (point) {
    -475                 var i, j;
    -476 
    -477                 var p = new CAAT.Math.Point();
    -478 
    -479                 if (this.inputList) {
    -480                     var il = this.inputList;
    -481                     for (i = 0; i < il.length; i++) {
    -482                         var ill = il[i];
    -483                         for (j = 0; j < ill.length; j++) {
    -484                             if ( ill[j].visible ) {
    -485                                 p.set(point.x, point.y);
    -486                                 var modelViewMatrixI = ill[j].worldModelViewMatrix.getInverse();
    -487                                 modelViewMatrixI.transformCoord(p);
    -488                                 if (ill[j].contains(p.x, p.y)) {
    -489                                     return ill[j];
    -490                                 }
    -491                             }
    -492                         }
    -493                     }
    -494                 }
    -495 
    -496                 p.set(point.x, point.y);
    -497                 return CAAT.Foundation.Scene.superclass.findActorAtPosition.call(this, p);
    -498             },
    -499 
    -500             /**
    -501              * Enable a number of input lists.
    -502              * These lists are set in case the developer doesn't want the to traverse the scene graph to find the pointed
    -503              * actor. The lists are a shortcut whete the developer can set what actors to look for input at first instance.
    -504              * The system will traverse the whole lists in order trying to find a pointed actor.
    -505              *
    -506              * Elements are added to each list either in head or tail.
    -507              *
    -508              * @param size <number> number of lists.
    -509              */
    -510             enableInputList:function (size) {
    -511                 this.inputList = [];
    -512                 for (var i = 0; i < size; i++) {
    -513                     this.inputList.push([]);
    -514                 }
    -515 
    -516                 return this;
    -517             },
    -518 
    -519             /**
    -520              * Add an actor to a given inputList.
    -521              * @param actor <CAAT.Actor> an actor instance
    -522              * @param index <number> the inputList index to add the actor to. This value will be clamped to the number of
    -523              * available lists.
    -524              * @param position <number> the position on the selected inputList to add the actor at. This value will be
    -525              * clamped to the number of available lists.
    -526              */
    -527             addActorToInputList:function (actor, index, position) {
    -528                 if (index < 0) index = 0; else if (index >= this.inputList.length) index = this.inputList.length - 1;
    -529                 var il = this.inputList[index];
    -530 
    -531                 if (typeof position === "undefined" || position >= il.length) {
    -532                     il.push(actor);
    -533                 } else if (position <= 0) {
    -534                     il.unshift(actor);
    -535                 } else {
    -536                     il.splice(position, 0, actor);
    -537                 }
    -538 
    -539                 return this;
    -540             },
    -541 
    -542             /**
    -543              * Remove all elements from an input list.
    -544              * @param index <number> the inputList index to add the actor to. This value will be clamped to the number of
    -545              * available lists so take care when emptying a non existant inputList index since you could end up emptying
    -546              * an undesired input list.
    -547              */
    -548             emptyInputList:function (index) {
    -549                 if (index < 0) index = 0; else if (index >= this.inputList.length) index = this.inputList.length - 1;
    -550                 this.inputList[index] = [];
    -551                 return this;
    -552             },
    -553 
    -554             /**
    -555              * remove an actor from a given input list index.
    -556              * If no index is supplied, the actor will be removed from every input list.
    -557              * @param actor <CAAT.Actor>
    -558              * @param index <!number> an optional input list index. This value will be clamped to the number of
    -559              * available lists.
    -560              */
    -561             removeActorFromInputList:function (actor, index) {
    -562                 if (typeof index === "undefined") {
    -563                     var i, j;
    -564                     for (i = 0; i < this.inputList.length; i++) {
    -565                         var il = this.inputList[i];
    -566                         for (j = 0; j < il.length; j++) {
    -567                             if (il[j] == actor) {
    -568                                 il.splice(j, 1);
    -569                             }
    -570                         }
    -571                     }
    -572                     return this;
    -573                 }
    -574 
    -575                 if (index < 0) index = 0; else if (index >= this.inputList.length) index = this.inputList.length - 1;
    -576                 var il = this.inputList[index];
    -577                 for (j = 0; j < il.length; j++) {
    -578                     if (il[j] == actor) {
    -579                         il.splice(j, 1);
    -580                     }
    -581                 }
    -582 
    -583                 return this;
    -584             },
    -585 
    -586             getIn : function( out_scene ) {
    -587 
    -588             },
    -589 
    -590             goOut : function( in_scene ) {
    -591 
    -592             }
    -593 
    -594         }
    -595     }
    -596 
    -597 
    -598 });
    -599 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImage.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImage.js.html deleted file mode 100644 index 4bdd1f11..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImage.js.html +++ /dev/null @@ -1,1173 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * TODO: allow set of margins, spacing, etc. to define subimages.
    -  5  *
    -  6  **/
    -  7 
    -  8 CAAT.Module({
    -  9 
    - 10     /**
    - 11      * @name SpriteImage
    - 12      * @memberOf CAAT.Foundation
    - 13      * @constructor
    - 14      */
    - 15 
    - 16 
    - 17     defines : "CAAT.Foundation.SpriteImage",
    - 18     aliases : ["CAAT.SpriteImage"],
    - 19     depends : [
    - 20         "CAAT.Foundation.SpriteImageHelper",
    - 21         "CAAT.Foundation.SpriteImageAnimationHelper",
    - 22         "CAAT.Math.Rectangle"
    - 23     ],
    - 24     constants:{
    - 25         /**
    - 26          * @lends  CAAT.Foundation.SpriteImage
    - 27          */
    - 28 
    - 29         /** @const @type {number} */ TR_NONE:0, // constants used to determine how to draw the sprite image,
    - 30         /** @const @type {number} */ TR_FLIP_HORIZONTAL:1,
    - 31         /** @const @type {number} */ TR_FLIP_VERTICAL:2,
    - 32         /** @const @type {number} */ TR_FLIP_ALL:3,
    - 33         /** @const @type {number} */ TR_FIXED_TO_SIZE:4,
    - 34         /** @const @type {number} */ TR_FIXED_WIDTH_TO_SIZE:6,
    - 35         /** @const @type {number} */ TR_TILE:5
    - 36     },
    - 37     extendsWith:function () {
    - 38 
    - 39         return {
    - 40 
    - 41             /**
    - 42              * @lends  CAAT.Foundation.SpriteImage.prototype
    - 43              */
    - 44 
    - 45             __init:function () {
    - 46                 this.paint = this.paintN;
    - 47                 this.setAnimationImageIndex([0]);
    - 48                 this.mapInfo = {};
    - 49                 this.animationsMap= {};
    - 50 
    - 51                 if ( arguments.length===1 ) {
    - 52                     this.initialize.call(this, arguments[0], 1, 1);
    - 53                 } else if ( arguments.length===3 ) {
    - 54                     this.initialize.apply(this, arguments);
    - 55                 }
    - 56                 return this;
    - 57             },
    - 58 
    - 59             /**
    - 60              * an Array defining the sprite frame sequence
    - 61              */
    - 62             animationImageIndex:null,
    - 63 
    - 64             /**
    - 65              * Previous animation frame time.
    - 66              */
    - 67             prevAnimationTime:-1,
    - 68 
    - 69             /**
    - 70              * how much Scene time to take before changing an Sprite frame.
    - 71              */
    - 72             changeFPS:1000,
    - 73 
    - 74             /**
    - 75              * any of the TR_* constants.
    - 76              */
    - 77             transformation:0,
    - 78 
    - 79             /**
    - 80              * the current sprite frame
    - 81              */
    - 82             spriteIndex:0,
    - 83 
    - 84             /**
    - 85              * current index of sprite frames array.
    - 86              */
    - 87             prevIndex:0,    //
    - 88 
    - 89             /**
    - 90              * current animation name
    - 91              */
    - 92             currentAnimation: null,
    - 93 
    - 94             /**
    - 95              * Image to get frames from.
    - 96              */
    - 97             image:null,
    - 98 
    - 99             /**
    -100              * Number of rows
    -101              */
    -102             rows:1,
    -103 
    -104             /**
    -105              * Number of columns.
    -106              */
    -107             columns:1,
    -108 
    -109             /**
    -110              * This sprite image image´s width
    -111              */
    -112             width:0,
    -113 
    -114             /**
    -115              * This sprite image image´s width
    -116              */
    -117             height:0,
    -118 
    -119             /**
    -120              * For each element in the sprite image array, its size.
    -121              */
    -122             singleWidth:0,
    -123 
    -124             /**
    -125              * For each element in the sprite image array, its height.
    -126              */
    -127             singleHeight:0,
    -128 
    -129             scaleX:1,
    -130             scaleY:1,
    -131 
    -132             /**
    -133              * Displacement offset to get the sub image from. Useful to make images shift.
    -134              */
    -135             offsetX:0,
    -136 
    -137             /**
    -138              * Displacement offset to get the sub image from. Useful to make images shift.
    -139              */
    -140             offsetY:0,
    -141 
    -142             /**
    -143              * When nesting sprite images, this value is the star X position of this sprite image in the parent.
    -144              */
    -145             parentOffsetX:0,    // para especificar una subimagen dentro un textmap.
    -146 
    -147             /**
    -148              * When nesting sprite images, this value is the star Y position of this sprite image in the parent.
    -149              */
    -150             parentOffsetY:0,
    -151 
    -152             /**
    -153              * The actor this sprite image belongs to.
    -154              */
    -155             ownerActor:null,
    -156 
    -157             /**
    -158              * If the sprite image is defined out of a JSON object (sprite packer for example), this is
    -159              * the subimages calculated definition map.
    -160              */
    -161             mapInfo:null,
    -162 
    -163             /**
    -164              * If the sprite image is defined out of a JSON object (sprite packer for example), this is
    -165              * the subimages original definition map.
    -166              */
    -167             map:null,
    -168 
    -169             /**
    -170              * This property allows to have multiple different animations defined for one actor.
    -171              * see demo31 for a sample.
    -172              */
    -173             animationsMap : null,
    -174 
    -175             /**
    -176              * When an animation sequence ends, this callback function will be called.
    -177              */
    -178             callback : null,        // on end animation callback
    -179 
    -180             /**
    -181              * pending: refactor -> font scale to a font object.
    -182              */
    -183             fontScale : 1,
    -184 
    -185             getOwnerActor : function() {
    -186                 return this.ownerActor;
    -187             },
    -188 
    -189             /**
    -190              * Add an animation to this sprite image.
    -191              * An animation is defines by an array of pretend-to-be-played sprite sequence.
    -192              *
    -193              * @param name {string} animation name.
    -194              * @param array {Array<number|string>} the sprite animation sequence array. It can be defined
    -195              *              as number array for Grid-like sprite images or strings for a map-like sprite
    -196              *              image.
    -197              * @param time {number} change animation sequence every 'time' ms.
    -198              * @param callback {function({SpriteImage},{string}} a callback function to invoke when the sprite
    -199              *              animation sequence has ended.
    -200              */
    -201             addAnimation : function( name, array, time, callback ) {
    -202                 this.animationsMap[name]= new CAAT.Foundation.SpriteImageAnimationHelper(array,time,callback);
    -203                 return this;
    -204             },
    -205 
    -206             setAnimationEndCallback : function(f) {
    -207                 this.callback= f;
    -208             },
    -209 
    -210             /**
    -211              * Start playing a SpriteImage animation.
    -212              * If it does not exist, nothing happens.
    -213              * @param name
    -214              */
    -215             playAnimation : function(name) {
    -216                 if (name===this.currentAnimation) {
    -217                     return this;
    -218                 }
    -219 
    -220                 var animation= this.animationsMap[name];
    -221                 if ( !animation ) {
    -222                     return this;
    -223                 }
    -224 
    -225                 this.currentAnimation= name;
    -226 
    -227                 this.setAnimationImageIndex( animation.animation );
    -228                 this.changeFPS= animation.time;
    -229                 this.callback= animation.onEndPlayCallback;
    -230 
    -231                 return this;
    -232             },
    -233 
    -234             setOwner:function (actor) {
    -235                 this.ownerActor = actor;
    -236                 return this;
    -237             },
    -238             getRows:function () {
    -239                 return this.rows;
    -240             },
    -241             getColumns:function () {
    -242                 return this.columns;
    -243             },
    -244 
    -245             getWidth:function () {
    -246                 var el = this.mapInfo[this.spriteIndex];
    -247                 return el.width;
    -248             },
    -249 
    -250             getHeight:function () {
    -251                 var el = this.mapInfo[this.spriteIndex];
    -252                 return el.height;
    -253             },
    -254 
    -255             getWrappedImageWidth:function () {
    -256                 return this.image.width;
    -257             },
    -258 
    -259             getWrappedImageHeight:function () {
    -260                 return this.image.height;
    -261             },
    -262 
    -263             /**
    -264              * Get a reference to the same image information (rows, columns, image and uv cache) of this
    -265              * SpriteImage. This means that re-initializing this objects image info (that is, calling initialize
    -266              * method) will change all reference's image information at the same time.
    -267              */
    -268             getRef:function () {
    -269                 var ret = new CAAT.Foundation.SpriteImage();
    -270                 ret.image = this.image;
    -271                 ret.rows = this.rows;
    -272                 ret.columns = this.columns;
    -273                 ret.width = this.width;
    -274                 ret.height = this.height;
    -275                 ret.singleWidth = this.singleWidth;
    -276                 ret.singleHeight = this.singleHeight;
    -277                 ret.mapInfo = this.mapInfo;
    -278                 ret.offsetX = this.offsetX;
    -279                 ret.offsetY = this.offsetY;
    -280                 ret.scaleX = this.scaleX;
    -281                 ret.scaleY = this.scaleY;
    -282                 ret.animationsMap= this.animationsMap;
    -283                 ret.parentOffsetX= this.parentOffsetX;
    -284                 ret.parentOffsetY= this.parentOffsetY;
    -285 
    -286                 ret.scaleFont= this.scaleFont;
    -287 
    -288                 return ret;
    -289             },
    -290             /**
    -291              * Set horizontal displacement to draw image. Positive values means drawing the image more to the
    -292              * right.
    -293              * @param x {number}
    -294              * @return this
    -295              */
    -296             setOffsetX:function (x) {
    -297                 this.offsetX = x;
    -298                 return this;
    -299             },
    -300             /**
    -301              * Set vertical displacement to draw image. Positive values means drawing the image more to the
    -302              * bottom.
    -303              * @param y {number}
    -304              * @return this
    -305              */
    -306             setOffsetY:function (y) {
    -307                 this.offsetY = y;
    -308                 return this;
    -309             },
    -310             setOffset:function (x, y) {
    -311                 this.offsetX = x;
    -312                 this.offsetY = y;
    -313                 return this;
    -314             },
    -315             /**
    -316              * Initialize a grid of subimages out of a given image.
    -317              * @param image {HTMLImageElement|Image} an image object.
    -318              * @param rows {number} number of rows.
    -319              * @param columns {number} number of columns
    -320              *
    -321              * @return this
    -322              */
    -323             initialize:function (image, rows, columns) {
    -324 
    -325                 if (!image) {
    -326                     console.log("Null image for SpriteImage.");
    -327                 }
    -328 
    -329                 if ( isString(image) ) {
    -330                     image= CAAT.currentDirector.getImage(image);
    -331                 }
    -332 
    -333                 this.parentOffsetX= 0;
    -334                 this.parentOffsetY= 0;
    -335 
    -336                 this.rows = rows;
    -337                 this.columns = columns;
    -338 
    -339                 if ( image instanceof CAAT.Foundation.SpriteImage || image instanceof CAAT.SpriteImage ) {
    -340                     this.image =        image.image;
    -341                     var sihelper= image.mapInfo[0];
    -342                     this.width= sihelper.width;
    -343                     this.height= sihelper.height;
    -344 
    -345                     this.parentOffsetX= sihelper.x;
    -346                     this.parentOffsetY= sihelper.y;
    -347 
    -348                     this.width= image.mapInfo[0].width;
    -349                     this.height= image.mapInfo[0].height;
    -350 
    -351                 } else {
    -352                     this.image = image;
    -353                     this.width = image.width;
    -354                     this.height = image.height;
    -355                     this.mapInfo = {};
    -356 
    -357                 }
    -358 
    -359                 this.singleWidth = Math.floor(this.width / columns);
    -360                 this.singleHeight = Math.floor(this.height / rows);
    -361 
    -362                 var i, sx0, sy0;
    -363                 var helper;
    -364 
    -365                 if (image.__texturePage) {
    -366                     image.__du = this.singleWidth / image.__texturePage.width;
    -367                     image.__dv = this.singleHeight / image.__texturePage.height;
    -368 
    -369 
    -370                     var w = this.singleWidth;
    -371                     var h = this.singleHeight;
    -372                     var mod = this.columns;
    -373                     if (image.inverted) {
    -374                         var t = w;
    -375                         w = h;
    -376                         h = t;
    -377                         mod = this.rows;
    -378                     }
    -379 
    -380                     var xt = this.image.__tx;
    -381                     var yt = this.image.__ty;
    -382 
    -383                     var tp = this.image.__texturePage;
    -384 
    -385                     for (i = 0; i < rows * columns; i++) {
    -386 
    -387 
    -388                         var c = ((i % mod) >> 0);
    -389                         var r = ((i / mod) >> 0);
    -390 
    -391                         var u = xt + c * w;  // esquina izq x
    -392                         var v = yt + r * h;
    -393 
    -394                         var u1 = u + w;
    -395                         var v1 = v + h;
    -396 
    -397                         helper = new CAAT.Foundation.SpriteImageHelper(u, v, (u1 - u), (v1 - v), tp.width, tp.height).setGL(
    -398                             u / tp.width,
    -399                             v / tp.height,
    -400                             u1 / tp.width,
    -401                             v1 / tp.height);
    -402 
    -403                         this.mapInfo[i] = helper;
    -404                     }
    -405 
    -406                 } else {
    -407                     for (i = 0; i < rows * columns; i++) {
    -408                         sx0 = ((i % this.columns) | 0) * this.singleWidth + this.parentOffsetX;
    -409                         sy0 = ((i / this.columns) | 0) * this.singleHeight + this.parentOffsetY;
    -410 
    -411                         helper = new CAAT.Foundation.SpriteImageHelper(sx0, sy0, this.singleWidth, this.singleHeight, image.width, image.height);
    -412                         this.mapInfo[i] = helper;
    -413                     }
    -414                 }
    -415 
    -416                 return this;
    -417             },
    -418 
    -419             /**
    -420              * Create elements as director.getImage values.
    -421              * Create as much as elements defined in this sprite image.
    -422              * The elements will be named prefix+<the map info element name>
    -423              * @param prefix
    -424              */
    -425             addElementsAsImages : function( prefix ) {
    -426                 for( var i in this.mapInfo ) {
    -427                     var si= new CAAT.Foundation.SpriteImage().initialize( this.image, 1, 1 );
    -428                     si.addElement(0, this.mapInfo[i]);
    -429                     si.setSpriteIndex(0);
    -430                     CAAT.currentDirector.addImage( prefix+i, si );
    -431                 }
    -432             },
    -433 
    -434             copy : function( other ) {
    -435                 this.initialize(other,1,1);
    -436                 this.mapInfo= other.mapInfo;
    -437                 return this;
    -438             },
    -439 
    -440             /**
    -441              * Must be used to draw actor background and the actor should have setClip(true) so that the image tiles
    -442              * properly.
    -443              * @param director
    -444              * @param time
    -445              * @param x
    -446              * @param y
    -447              */
    -448             paintTiled:function (director, time, x, y) {
    -449 
    -450                 // PENDING: study using a pattern
    -451 
    -452                 var el = this.mapInfo[this.spriteIndex];
    -453 
    -454                 var r = new CAAT.Math.Rectangle();
    -455                 this.ownerActor.AABB.intersect(director.AABB, r);
    -456 
    -457                 var w = this.getWidth();
    -458                 var h = this.getHeight();
    -459                 var xoff = (this.offsetX - this.ownerActor.x) % w;
    -460                 if (xoff > 0) {
    -461                     xoff = xoff - w;
    -462                 }
    -463                 var yoff = (this.offsetY - this.ownerActor.y) % h;
    -464                 if (yoff > 0) {
    -465                     yoff = yoff - h;
    -466                 }
    -467 
    -468                 var nw = (((r.width - xoff) / w) >> 0) + 1;
    -469                 var nh = (((r.height - yoff) / h) >> 0) + 1;
    -470                 var i, j;
    -471                 var ctx = director.ctx;
    -472 
    -473                 for (i = 0; i < nh; i++) {
    -474                     for (j = 0; j < nw; j++) {
    -475                         ctx.drawImage(
    -476                             this.image,
    -477                             el.x, el.y,
    -478                             el.width, el.height,
    -479                             (r.x - this.ownerActor.x + xoff + j * el.width) >> 0, (r.y - this.ownerActor.y + yoff + i * el.height) >> 0,
    -480                             el.width, el.height);
    -481                     }
    -482                 }
    -483             },
    -484 
    -485             /**
    -486              * Draws the subimage pointed by imageIndex horizontally inverted.
    -487              * @param director {CAAT.Foundation.Director}
    -488              * @param time {number} scene time.
    -489              * @param x {number} x position in canvas to draw the image.
    -490              * @param y {number} y position in canvas to draw the image.
    -491              *
    -492              * @return this
    -493              */
    -494             paintInvertedH:function (director, time, x, y) {
    -495 
    -496                 var el = this.mapInfo[this.spriteIndex];
    -497 
    -498                 var ctx = director.ctx;
    -499                 ctx.save();
    -500                 //ctx.translate(((0.5 + x) | 0) + el.width, (0.5 + y) | 0);
    -501                 ctx.translate((x | 0) + el.width, y | 0);
    -502                 ctx.scale(-1, 1);
    -503 
    -504 
    -505                 ctx.drawImage(
    -506                     this.image,
    -507                     el.x, el.y,
    -508                     el.width, el.height,
    -509                     this.offsetX >> 0, this.offsetY >> 0,
    -510                     el.width, el.height);
    -511 
    -512                 ctx.restore();
    -513 
    -514                 return this;
    -515             },
    -516             /**
    -517              * Draws the subimage pointed by imageIndex vertically inverted.
    -518              * @param director {CAAT.Foundation.Director}
    -519              * @param time {number} scene time.
    -520              * @param x {number} x position in canvas to draw the image.
    -521              * @param y {number} y position in canvas to draw the image.
    -522              *
    -523              * @return this
    -524              */
    -525             paintInvertedV:function (director, time, x, y) {
    -526 
    -527                 var el = this.mapInfo[this.spriteIndex];
    -528 
    -529                 var ctx = director.ctx;
    -530                 ctx.save();
    -531                 //ctx.translate((x + 0.5) | 0, (0.5 + y + el.height) | 0);
    -532                 ctx.translate(x | 0, (y + el.height) | 0);
    -533                 ctx.scale(1, -1);
    -534 
    -535                 ctx.drawImage(
    -536                     this.image,
    -537                     el.x, el.y,
    -538                     el.width, el.height,
    -539                     this.offsetX >> 0, this.offsetY >> 0,
    -540                     el.width, el.height);
    -541 
    -542                 ctx.restore();
    -543 
    -544                 return this;
    -545             },
    -546             /**
    -547              * Draws the subimage pointed by imageIndex both horizontal and vertically inverted.
    -548              * @param director {CAAT.Foundation.Director}
    -549              * @param time {number} scene time.
    -550              * @param x {number} x position in canvas to draw the image.
    -551              * @param y {number} y position in canvas to draw the image.
    -552              *
    -553              * @return this
    -554              */
    -555             paintInvertedHV:function (director, time, x, y) {
    -556 
    -557                 var el = this.mapInfo[this.spriteIndex];
    -558 
    -559                 var ctx = director.ctx;
    -560                 ctx.save();
    -561                 //ctx.translate((x + 0.5) | 0, (0.5 + y + el.height) | 0);
    -562                 ctx.translate(x | 0, (y + el.height) | 0);
    -563                 ctx.scale(1, -1);
    -564                 ctx.translate(el.width, 0);
    -565                 ctx.scale(-1, 1);
    -566 
    -567                 ctx.drawImage(
    -568                     this.image,
    -569                     el.x, el.y,
    -570                     el.width, el.height,
    -571                     this.offsetX >> 0, this.offsetY >> 0,
    -572                     el.width, el.height);
    -573 
    -574                 ctx.restore();
    -575 
    -576                 return this;
    -577             },
    -578             /**
    -579              * Draws the subimage pointed by imageIndex.
    -580              * @param director {CAAT.Foundation.Director}
    -581              * @param time {number} scene time.
    -582              * @param x {number} x position in canvas to draw the image.
    -583              * @param y {number} y position in canvas to draw the image.
    -584              *
    -585              * @return this
    -586              */
    -587             paintN:function (director, time, x, y) {
    -588 
    -589                 var el = this.mapInfo[this.spriteIndex];
    -590 
    -591                 director.ctx.drawImage(
    -592                     this.image,
    -593                     el.x, el.y,
    -594                     el.width, el.height,
    -595                     (this.offsetX + x) >> 0, (this.offsetY + y) >> 0,
    -596                     el.width, el.height);
    -597 
    -598                 return this;
    -599             },
    -600             paintAtRect:function (director, time, x, y, w, h) {
    -601 
    -602                 var el = this.mapInfo[this.spriteIndex];
    -603 
    -604                 director.ctx.drawImage(
    -605                     this.image,
    -606                     el.x, el.y,
    -607                     el.width, el.height,
    -608                     (this.offsetX + x) >> 0, (this.offsetY + y) >> 0,
    -609                     w, h);
    -610 
    -611                 return this;
    -612             },
    -613             /**
    -614              * Draws the subimage pointed by imageIndex.
    -615              * @param director {CAAT.Foundation.Director}
    -616              * @param time {number} scene time.
    -617              * @param x {number} x position in canvas to draw the image.
    -618              * @param y {number} y position in canvas to draw the image.
    -619              *
    -620              * @return this
    -621              */
    -622             paintScaledWidth:function (director, time, x, y) {
    -623 
    -624                 var el = this.mapInfo[this.spriteIndex];
    -625 
    -626                 director.ctx.drawImage(
    -627                     this.image,
    -628                     el.x, el.y,
    -629                     el.width, el.height,
    -630                     (this.offsetX + x) >> 0, (this.offsetY + y) >> 0,
    -631                     this.ownerActor.width, el.height);
    -632 
    -633                 return this;
    -634             },
    -635             paintChunk:function (ctx, dx, dy, x, y, w, h) {
    -636                 ctx.drawImage(this.image, x, y, w, h, dx, dy, w, h);
    -637             },
    -638             paintTile:function (ctx, index, x, y) {
    -639                 var el = this.mapInfo[index];
    -640                 ctx.drawImage(
    -641                     this.image,
    -642                     el.x, el.y,
    -643                     el.width, el.height,
    -644                     (this.offsetX + x) >> 0, (this.offsetY + y) >> 0,
    -645                     el.width, el.height);
    -646 
    -647                 return this;
    -648             },
    -649             /**
    -650              * Draws the subimage pointed by imageIndex scaled to the size of w and h.
    -651              * @param director {CAAT.Foundation.Director}
    -652              * @param time {number} scene time.
    -653              * @param x {number} x position in canvas to draw the image.
    -654              * @param y {number} y position in canvas to draw the image.
    -655              *
    -656              * @return this
    -657              */
    -658             paintScaled:function (director, time, x, y) {
    -659 
    -660                 var el = this.mapInfo[this.spriteIndex];
    -661 
    -662                 director.ctx.drawImage(
    -663                     this.image,
    -664                     el.x, el.y,
    -665                     el.width, el.height,
    -666                     (this.offsetX + x) >> 0, (this.offsetY + y) >> 0,
    -667                     this.ownerActor.width, this.ownerActor.height);
    -668 
    -669                 return this;
    -670             },
    -671             getCurrentSpriteImageCSSPosition:function () {
    -672                 var el = this.mapInfo[this.spriteIndex];
    -673 
    -674                 var x = -(el.x + this.parentOffsetX - this.offsetX);
    -675                 var y = -(el.y + this.parentOffsetY - this.offsetY);
    -676 
    -677                 return '' + x + 'px ' +
    -678                     y + 'px ' +
    -679                     (this.ownerActor.transformation === CAAT.Foundation.SpriteImage.TR_TILE ? 'repeat' : 'no-repeat');
    -680             },
    -681             /**
    -682              * Get the number of subimages in this compoundImage
    -683              * @return {number}
    -684              */
    -685             getNumImages:function () {
    -686                 return this.rows * this.columns;
    -687             },
    -688 
    -689             setUV:function (uvBuffer, uvIndex) {
    -690                 var im = this.image;
    -691 
    -692                 if (!im.__texturePage) {
    -693                     return;
    -694                 }
    -695 
    -696                 var index = uvIndex;
    -697                 var sIndex = this.spriteIndex;
    -698                 var el = this.mapInfo[this.spriteIndex];
    -699 
    -700                 var u = el.u;
    -701                 var v = el.v;
    -702                 var u1 = el.u1;
    -703                 var v1 = el.v1;
    -704                 if (this.offsetX || this.offsetY) {
    -705                     var w = this.ownerActor.width;
    -706                     var h = this.ownerActor.height;
    -707 
    -708                     var tp = im.__texturePage;
    -709 
    -710                     var _u = -this.offsetX / tp.width;
    -711                     var _v = -this.offsetY / tp.height;
    -712                     var _u1 = (w - this.offsetX) / tp.width;
    -713                     var _v1 = (h - this.offsetY) / tp.height;
    -714 
    -715                     u = _u + im.__u;
    -716                     v = _v + im.__v;
    -717                     u1 = _u1 + im.__u;
    -718                     v1 = _v1 + im.__v;
    -719                 }
    -720 
    -721                 if (im.inverted) {
    -722                     uvBuffer[index++] = u1;
    -723                     uvBuffer[index++] = v;
    -724 
    -725                     uvBuffer[index++] = u1;
    -726                     uvBuffer[index++] = v1;
    -727 
    -728                     uvBuffer[index++] = u;
    -729                     uvBuffer[index++] = v1;
    -730 
    -731                     uvBuffer[index++] = u;
    -732                     uvBuffer[index++] = v;
    -733                 } else {
    -734                     uvBuffer[index++] = u;
    -735                     uvBuffer[index++] = v;
    -736 
    -737                     uvBuffer[index++] = u1;
    -738                     uvBuffer[index++] = v;
    -739 
    -740                     uvBuffer[index++] = u1;
    -741                     uvBuffer[index++] = v1;
    -742 
    -743                     uvBuffer[index++] = u;
    -744                     uvBuffer[index++] = v1;
    -745                 }
    -746             },
    -747             /**
    -748              * Set the elapsed time needed to change the image index.
    -749              * @param fps an integer indicating the time in milliseconds to change.
    -750              * @return this
    -751              */
    -752             setChangeFPS:function (fps) {
    -753                 this.changeFPS = fps;
    -754                 return this;
    -755             },
    -756             /**
    -757              * Set the transformation to apply to the Sprite image.
    -758              * Any value of
    -759              *  <li>TR_NONE
    -760              *  <li>TR_FLIP_HORIZONTAL
    -761              *  <li>TR_FLIP_VERTICAL
    -762              *  <li>TR_FLIP_ALL
    -763              *
    -764              * @param transformation an integer indicating one of the previous values.
    -765              * @return this
    -766              */
    -767             setSpriteTransformation:function (transformation) {
    -768                 this.transformation = transformation;
    -769                 var v = CAAT.Foundation.SpriteImage;
    -770                 switch (transformation) {
    -771                     case v.TR_FLIP_HORIZONTAL:
    -772                         this.paint = this.paintInvertedH;
    -773                         break;
    -774                     case v.TR_FLIP_VERTICAL:
    -775                         this.paint = this.paintInvertedV;
    -776                         break;
    -777                     case v.TR_FLIP_ALL:
    -778                         this.paint = this.paintInvertedHV;
    -779                         break;
    -780                     case v.TR_FIXED_TO_SIZE:
    -781                         this.paint = this.paintScaled;
    -782                         break;
    -783                     case v.TR_FIXED_WIDTH_TO_SIZE:
    -784                         this.paint = this.paintScaledWidth;
    -785                         break;
    -786                     case v.TR_TILE:
    -787                         this.paint = this.paintTiled;
    -788                         break;
    -789                     default:
    -790                         this.paint = this.paintN;
    -791                 }
    -792                 this.ownerActor.invalidate();
    -793                 return this;
    -794             },
    -795 
    -796             resetAnimationTime:function () {
    -797                 this.prevAnimationTime = -1;
    -798                 return this;
    -799             },
    -800 
    -801             /**
    -802              * Set the sprite animation images index. This method accepts an array of objects which define indexes to
    -803              * subimages inside this sprite image.
    -804              * If the SpriteImage is instantiated by calling the method initialize( image, rows, cols ), the value of
    -805              * aAnimationImageIndex should be an array of numbers, which define the indexes into an array of subimages
    -806              * with size rows*columns.
    -807              * If the method InitializeFromMap( image, map ) is called, the value for aAnimationImageIndex is expected
    -808              * to be an array of strings which are the names of the subobjects contained in the map object.
    -809              *
    -810              * @param aAnimationImageIndex an array indicating the Sprite's frames.
    -811              */
    -812             setAnimationImageIndex:function (aAnimationImageIndex) {
    -813                 this.animationImageIndex = aAnimationImageIndex;
    -814                 this.spriteIndex = aAnimationImageIndex[0];
    -815                 this.prevAnimationTime = -1;
    -816 
    -817                 return this;
    -818             },
    -819             setSpriteIndex:function (index) {
    -820                 this.spriteIndex = index;
    -821                 return this;
    -822             },
    -823 
    -824             /**
    -825              * Draws the sprite image calculated and stored in spriteIndex.
    -826              *
    -827              * @param time {number} Scene time when the bounding box is to be drawn.
    -828              */
    -829             setSpriteIndexAtTime:function (time) {
    -830 
    -831                 if (this.animationImageIndex.length > 1) {
    -832                     if (this.prevAnimationTime === -1) {
    -833                         this.prevAnimationTime = time;
    -834 
    -835                         //thanks Phloog and ghthor, well spotted.
    -836                         this.spriteIndex = this.animationImageIndex[0];
    -837                         this.prevIndex= 0;
    -838                         this.ownerActor.invalidate();
    -839                     }
    -840                     else {
    -841                         var ttime = time;
    -842                         ttime -= this.prevAnimationTime;
    -843                         ttime /= this.changeFPS;
    -844                         ttime %= this.animationImageIndex.length;
    -845                         var idx = Math.floor(ttime);
    -846 //                    if ( this.spriteIndex!==idx ) {
    -847 
    -848                         if ( idx<this.prevIndex ) {   // we are getting back in time, or ended playing the animation
    -849                             if ( this.callback ) {
    -850                                 this.callback( this, time );
    -851                             }
    -852                         }
    -853 
    -854                         this.prevIndex= idx;
    -855                         this.spriteIndex = this.animationImageIndex[idx];
    -856                         this.ownerActor.invalidate();
    -857 //                    }
    -858                     }
    -859                 }
    -860             },
    -861 
    -862             getMapInfo:function (index) {
    -863                 return this.mapInfo[ index ];
    -864             },
    -865 
    -866             initializeFromGlyphDesigner : function( text ) {
    -867                 for (var i = 0; i < text.length; i++) {
    -868                     if (0 === text[i].indexOf("char ")) {
    -869                         var str = text[i].substring(5);
    -870                         var pairs = str.split(' ');
    -871                         var obj = {
    -872                             x: 0,
    -873                             y: 0,
    -874                             width: 0,
    -875                             height: 0,
    -876                             xadvance: 0,
    -877                             xoffset: 0,
    -878                             yoffset: 0
    -879                         };
    -880 
    -881                         for (var j = 0; j < pairs.length; j++) {
    -882                             var pair = pairs[j];
    -883                             var pairData = pair.split("=");
    -884                             var key = pairData[0];
    -885                             var value = pairData[1];
    -886                             if (value.charAt(0) === '"' && value.charAt(value.length - 1) === '"') {
    -887                                 value.substring(1, value.length - 1);
    -888                             }
    -889                             obj[ key ] = value;
    -890                         }
    -891 
    -892                         this.addElement(String.fromCharCode(obj.id), obj);
    -893                     }
    -894                 }
    -895 
    -896                 return this;
    -897             },
    -898 
    -899             /**
    -900              * This method takes the output generated from the tool at http://labs.hyperandroid.com/static/texture/spriter.html
    -901              * and creates a map into that image.
    -902              * @param image {Image|HTMLImageElement|Canvas} an image
    -903              * @param map {object} the map into the image to define subimages.
    -904              */
    -905             initializeFromMap:function (image, map) {
    -906                 this.initialize(image, 1, 1);
    -907 
    -908                 var key;
    -909                 var helper;
    -910                 var count = 0;
    -911 
    -912                 for (key in map) {
    -913                     var value = map[key];
    -914 
    -915                     helper = new CAAT.Foundation.SpriteImageHelper(
    -916                         parseFloat(value.x) + this.parentOffsetX,
    -917                         parseFloat(value.y) + this.parentOffsetY,
    -918                         parseFloat(value.width),
    -919                         parseFloat(value.height),
    -920                         image.width,
    -921                         image.height
    -922                     );
    -923 
    -924                     this.mapInfo[key] = helper;
    -925 
    -926                     // set a default spriteIndex
    -927                     if (!count) {
    -928                         this.setAnimationImageIndex([key]);
    -929                     }
    -930 
    -931                     count++;
    -932                 }
    -933 
    -934                 return this;
    -935             },
    -936 
    -937             initializeFromTexturePackerJSON : function( image, obj ) {
    -938 
    -939                 for( var img in obj.frames ) {
    -940                     var imgData= obj.frames[img];
    -941 
    -942                     var si_obj= {
    -943                         x: imgData.frame.x,
    -944                         y: imgData.frame.y,
    -945                         width: imgData.spriteSourceSize.w,
    -946                         height: imgData.spriteSourceSize.h,
    -947                         id: '0'
    -948                     };
    -949 
    -950                     var si= new CAAT.Foundation.SpriteImage().initialize( image, 1, 1 );
    -951                     si.addElement(0,si_obj);
    -952                     CAAT.currentDirector.addImage( img.substring(0,img.indexOf('.')), si );
    -953                 }
    -954             },
    -955 
    -956             /**
    -957              * Add one element to the spriteImage.
    -958              * @param key {string|number} index or sprite identifier.
    -959              * @param value object{
    -960              *      x: {number},
    -961              *      y: {number},
    -962              *      width: {number},
    -963              *      height: {number},
    -964              *      xoffset: {number=},
    -965              *      yoffset: {number=},
    -966              *      xadvance: {number=}
    -967              *      }
    -968              * @return {*}
    -969              */
    -970             addElement : function( key, value ) {
    -971                 var helper = new CAAT.Foundation.SpriteImageHelper(
    -972                     parseFloat(value.x) + this.parentOffsetX,
    -973                     parseFloat(value.y) + this.parentOffsetY,
    -974                     parseFloat(value.width),
    -975                     parseFloat(value.height),
    -976                     this.image.width,
    -977                     this.image.height );
    -978 
    -979                 helper.xoffset = typeof value.xoffset === 'undefined' ? 0 : parseFloat(value.xoffset);
    -980                 helper.yoffset = typeof value.yoffset === 'undefined' ? 0 : parseFloat(value.yoffset);
    -981                 helper.xadvance = typeof value.xadvance === 'undefined' ? value.width : parseFloat(value.xadvance);
    -982 
    -983                 this.mapInfo[key] = helper;
    -984 
    -985                 return this;
    -986             },
    -987 
    -988             /**
    -989              *
    -990              * @param image {Image|HTMLImageElement|Canvas}
    -991              * @param map object with pairs "<a char>" : {
    -992              *              id      : {number},
    -993              *              height  : {number},
    -994              *              xoffset : {number},
    -995              *              letter  : {string},
    -996              *              yoffset : {number},
    -997              *              width   : {number},
    -998              *              xadvance: {number},
    -999              *              y       : {number},
    -1000              *              x       : {number}
    -1001              *          }
    -1002              */
    -1003             initializeAsGlyphDesigner:function (image, map) {
    -1004                 this.initialize(image, 1, 1);
    -1005 
    -1006                 var key;
    -1007                 var helper;
    -1008                 var count = 0;
    -1009 
    -1010                 for (key in map) {
    -1011                     var value = map[key];
    -1012 
    -1013                     helper = new CAAT.Foundation.SpriteImageHelper(
    -1014                         parseFloat(value.x) + this.parentOffsetX,
    -1015                         parseFloat(value.y) + this.parentOffsetX,
    -1016                         parseFloat(value.width),
    -1017                         parseFloat(value.height),
    -1018                         image.width,
    -1019                         image.height
    -1020                     );
    -1021 
    -1022                     helper.xoffset = typeof value.xoffset === 'undefined' ? 0 : value.xoffset;
    -1023                     helper.yoffset = typeof value.yoffset === 'undefined' ? 0 : value.yoffset;
    -1024                     helper.xadvance = typeof value.xadvance === 'undefined' ? value.width : value.xadvance;
    -1025 
    -1026                     this.mapInfo[key] = helper;
    -1027 
    -1028                     // set a default spriteIndex
    -1029                     if (!count) {
    -1030                         this.setAnimationImageIndex([key]);
    -1031                     }
    -1032 
    -1033                     count++;
    -1034                 }
    -1035 
    -1036                 return this;
    -1037 
    -1038             },
    -1039 
    -1040 
    -1041             initializeAsFontMap:function (image, chars) {
    -1042                 this.initialize(image, 1, 1);
    -1043 
    -1044                 var helper;
    -1045                 var x = 0;
    -1046 
    -1047                 for (var i = 0; i < chars.length; i++) {
    -1048                     var value = chars[i];
    -1049 
    -1050                     helper = new CAAT.Foundation.SpriteImageHelper(
    -1051                         parseFloat(x) + this.parentOffsetX,
    -1052                         0 + this.parentOffsetY,
    -1053                         parseFloat(value.width),
    -1054                         image.height,
    -1055                         image.width,
    -1056                         image.height
    -1057                     );
    -1058 
    -1059                     helper.xoffset = 0;
    -1060                     helper.yoffset = 0;
    -1061                     helper.xadvance = value.width;
    -1062 
    -1063 
    -1064                     x += value.width;
    -1065 
    -1066                     this.mapInfo[chars[i].c] = helper;
    -1067 
    -1068                     // set a default spriteIndex
    -1069                     if (!i) {
    -1070                         this.setAnimationImageIndex([chars[i].c]);
    -1071                     }
    -1072                 }
    -1073 
    -1074                 return this;
    -1075             },
    -1076 
    -1077             /**
    -1078              * This method creates a font sprite image based on a proportional font
    -1079              * It assumes the font is evenly spaced in the image
    -1080              * Example:
    -1081              * var font =   new CAAT.SpriteImage().initializeAsMonoTypeFontMap(
    -1082              *  director.getImage('numbers'),
    -1083              *  "0123456789"
    -1084              * );
    -1085              */
    -1086 
    -1087             initializeAsMonoTypeFontMap:function (image, chars) {
    -1088                 var map = [];
    -1089                 var charArr = chars.split("");
    -1090 
    -1091                 var w = image.width / charArr.length >> 0;
    -1092 
    -1093                 for (var i = 0; i < charArr.length; i++) {
    -1094                     map.push({c:charArr[i], width:w });
    -1095                 }
    -1096 
    -1097                 return this.initializeAsFontMap(image, map);
    -1098             },
    -1099 
    -1100             stringWidth:function (str) {
    -1101                 var i, l, w = 0, charInfo;
    -1102 
    -1103                 for (i = 0, l = str.length; i < l; i++) {
    -1104                     charInfo = this.mapInfo[ str.charAt(i) ];
    -1105                     if (charInfo) {
    -1106                         w += charInfo.xadvance * this.fontScale;
    -1107                     }
    -1108                 }
    -1109 
    -1110                 return w;
    -1111             },
    -1112 
    -1113             stringHeight:function () {
    -1114                 if (this.fontHeight) {
    -1115                     return this.fontHeight * this.fontScale;
    -1116                 }
    -1117 
    -1118                 var y = 0;
    -1119                 for (var i in this.mapInfo) {
    -1120                     var mi = this.mapInfo[i];
    -1121 
    -1122                     var h = mi.height + mi.yoffset;
    -1123                     if (h > y) {
    -1124                         y = h;
    -1125                     }
    -1126                 }
    -1127 
    -1128                 this.fontHeight = y;
    -1129                 return this.fontHeight * this.fontScale;
    -1130             },
    -1131 
    -1132             drawText:function (str, ctx, x, y) {
    -1133                 var i, l, charInfo, w;
    -1134 
    -1135                 for (i = 0; i < str.length; i++) {
    -1136                     charInfo = this.mapInfo[ str.charAt(i) ];
    -1137                     if (charInfo) {
    -1138                         w = charInfo.width;
    -1139                         if ( w>0 && charInfo.height>0 ) {
    -1140                             ctx.drawImage(
    -1141                                 this.image,
    -1142                                 charInfo.x, charInfo.y,
    -1143                                 w, charInfo.height,
    -1144 
    -1145                                 x + charInfo.xoffset* this.fontScale, y + charInfo.yoffset* this.fontScale,
    -1146                                 w* this.fontScale, charInfo.height* this.fontScale);
    -1147                         }
    -1148                         x += charInfo.xadvance* this.fontScale;
    -1149                     }
    -1150                 }
    -1151             },
    -1152 
    -1153             getFontData : function() {
    -1154                 var as= (this.stringHeight() *.8)>>0;
    -1155                 return {
    -1156                     height : this.stringHeight(),
    -1157                     ascent : as,
    -1158                     descent: this.stringHeight() - as
    -1159                 };
    -1160 
    -1161             }
    -1162 
    -1163         }
    -1164     }
    -1165 });
    -1166 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageAnimationHelper.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageAnimationHelper.js.html deleted file mode 100644 index acb13762..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageAnimationHelper.js.html +++ /dev/null @@ -1,54 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      *
    -  5      * Define an animation frame sequence, name it and supply with a callback which be called when the
    -  6      * sequence ends playing.
    -  7      *
    -  8      * @name SpriteImageAnimationHelper
    -  9      * @memberOf CAAT.Foundation
    - 10      * @constructor
    - 11      */
    - 12 
    - 13     defines : "CAAT.Foundation.SpriteImageAnimationHelper",
    - 14     extendsWith : function() {
    - 15         return {
    - 16 
    - 17             /**
    - 18              * @lends  CAAT.Foundation.SpriteImageAnimationHelper.prototype
    - 19              */
    - 20 
    - 21             __init : function( animation, time, onEndPlayCallback ) {
    - 22                 this.animation= animation;
    - 23                 this.time= time;
    - 24                 this.onEndPlayCallback= onEndPlayCallback;
    - 25                 return this;
    - 26             },
    - 27 
    - 28             /**
    - 29              * A sequence of integer values defining a frame animation.
    - 30              * For example [1,2,3,4,3,2,3,4,3,2]
    - 31              * Array.<number>
    - 32              */
    - 33             animation :         null,
    - 34 
    - 35             /**
    - 36              * Time between any two animation frames.
    - 37              */
    - 38             time :              0,
    - 39 
    - 40             /**
    - 41              * Call this callback function when the sequence ends.
    - 42              */
    - 43             onEndPlayCallback : null
    - 44 
    - 45         }
    - 46     }
    - 47 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageHelper.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageHelper.js.html deleted file mode 100644 index f63eacc7..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageHelper.js.html +++ /dev/null @@ -1,58 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * Define a drawable sub-image inside a bigger image as an independant drawable item.
    -  5      *
    -  6      * @name SpriteImageHelper
    -  7      * @memberOf CAAT.Foundation
    -  8      * @constructor
    -  9      *
    - 10      *
    - 11      *
    - 12      */
    - 13 
    - 14 
    - 15     defines : "CAAT.Foundation.SpriteImageHelper",
    - 16 
    - 17     extendsWith : {
    - 18 
    - 19         /**
    - 20          * @lends  CAAT.Foundation.SpriteImageHelper.prototype
    - 21          */
    - 22 
    - 23         __init : function (x, y, w, h, iw, ih) {
    - 24             this.x = parseFloat(x);
    - 25             this.y = parseFloat(y);
    - 26             this.width = parseFloat(w);
    - 27             this.height = parseFloat(h);
    - 28 
    - 29             this.setGL(x / iw, y / ih, (x + w - 1) / iw, (y + h - 1) / ih);
    - 30             return this;
    - 31         },
    - 32 
    - 33         x:0,
    - 34         y:0,
    - 35         width:0,
    - 36         height:0,
    - 37         u:0,
    - 38         v:0,
    - 39         u1:0,
    - 40         v1:0,
    - 41 
    - 42         setGL:function (u, v, u1, v1) {
    - 43             this.u = u;
    - 44             this.v = v;
    - 45             this.u1 = u1;
    - 46             this.v1 = v1;
    - 47             return this;
    - 48         }
    - 49     }
    - 50 });
    - 51 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerManager.js.html deleted file mode 100644 index e1a58f47..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerManager.js.html +++ /dev/null @@ -1,141 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  */
    -  4 CAAT.Module({
    -  5 
    -  6     /**
    -  7      * @name Timer
    -  8      * @memberOf CAAT.Foundation
    -  9      * @namespace
    - 10      */
    - 11 
    - 12     /**
    - 13      * @name TimerManager
    - 14      * @memberOf CAAT.Foundation.Timer
    - 15      * @constructor
    - 16      */
    - 17 
    - 18     defines : "CAAT.Foundation.Timer.TimerManager",
    - 19     aliases : ["CAAT.TimerManager"],
    - 20     depends : [
    - 21         "CAAT.Foundation.Timer.TimerTask"
    - 22     ],
    - 23     extendsWith :   {
    - 24 
    - 25         /**
    - 26          * @lends CAAT.Foundation.Timer.TimerManager.prototype
    - 27          */
    - 28 
    - 29         __init:function () {
    - 30             this.timerList = [];
    - 31             return this;
    - 32         },
    - 33 
    - 34         /**
    - 35          * Collection of registered timers.
    - 36          * @type {CAAT.Foundation.Timer.TimerManager}
    - 37          * @private
    - 38          */
    - 39         timerList:null,
    - 40 
    - 41         /**
    - 42          * Index sequence to idenfity registered timers.
    - 43          * @private
    - 44          */
    - 45         timerSequence:0,
    - 46 
    - 47         /**
    - 48          * Check and apply timers in frame time.
    - 49          * @param time {number} the current Scene time.
    - 50          */
    - 51         checkTimers:function (time) {
    - 52             var tl = this.timerList;
    - 53             var i = tl.length - 1;
    - 54             while (i >= 0) {
    - 55                 if (!tl[i].remove) {
    - 56                     tl[i].checkTask(time);
    - 57                 }
    - 58                 i--;
    - 59             }
    - 60         },
    - 61         /**
    - 62          * Make sure the timertask is contained in the timer task list by adding it to the list in case it
    - 63          * is not contained.
    - 64          * @param timertask {CAAT.Foundation.Timer.TimerTask}.
    - 65          * @return this
    - 66          */
    - 67         ensureTimerTask:function (timertask) {
    - 68             if (!this.hasTimer(timertask)) {
    - 69                 this.timerList.push(timertask);
    - 70             }
    - 71             return this;
    - 72         },
    - 73         /**
    - 74          * Check whether the timertask is in this scene's timer task list.
    - 75          * @param timertask {CAAT.Foundation.Timer.TimerTask}.
    - 76          * @return {boolean} a boolean indicating whether the timertask is in this scene or not.
    - 77          */
    - 78         hasTimer:function (timertask) {
    - 79             var tl = this.timerList;
    - 80             var i = tl.length - 1;
    - 81             while (i >= 0) {
    - 82                 if (tl[i] === timertask) {
    - 83                     return true;
    - 84                 }
    - 85                 i--;
    - 86             }
    - 87 
    - 88             return false;
    - 89         },
    - 90         /**
    - 91          * Creates a timer task. Timertask object live and are related to scene's time, so when an Scene
    - 92          * is taken out of the Director the timer task is paused, and resumed on Scene restoration.
    - 93          *
    - 94          * @param startTime {number} an integer indicating the scene time this task must start executing at.
    - 95          * @param duration {number} an integer indicating the timerTask duration.
    - 96          * @param callback_timeout {function} timer on timeout callback function.
    - 97          * @param callback_tick {function} timer on tick callback function.
    - 98          * @param callback_cancel {function} timer on cancel callback function.
    - 99          *
    -100          * @return {CAAT.TimerTask} a CAAT.TimerTask class instance.
    -101          */
    -102         createTimer:function (startTime, duration, callback_timeout, callback_tick, callback_cancel, scene) {
    -103 
    -104             var tt = new CAAT.Foundation.Timer.TimerTask().create(
    -105                 startTime,
    -106                 duration,
    -107                 callback_timeout,
    -108                 callback_tick,
    -109                 callback_cancel);
    -110 
    -111             tt.taskId = this.timerSequence++;
    -112             tt.sceneTime = scene.time;
    -113             tt.owner = this;
    -114             tt.scene = scene;
    -115 
    -116             this.timerList.push(tt);
    -117 
    -118             return tt;
    -119         },
    -120         /**
    -121          * Removes expired timers. This method must not be called directly.
    -122          */
    -123         removeExpiredTimers:function () {
    -124             var i;
    -125             var tl = this.timerList;
    -126             for (i = 0; i < tl.length; i++) {
    -127                 if (tl[i].remove) {
    -128                     tl.splice(i, 1);
    -129                 }
    -130             }
    -131         }
    -132     }
    -133 });
    -134 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerTask.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerTask.js.html deleted file mode 100644 index f49bc1c9..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerTask.js.html +++ /dev/null @@ -1,145 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name TimerTask
    -  5      * @memberOf CAAT.Foundation.Timer
    -  6      * @constructor
    -  7      */
    -  8 
    -  9     defines : "CAAT.Foundation.Timer.TimerTask",
    - 10     aliases : ["CAAT.TimerTask"],
    - 11     extendsWith : {
    - 12 
    - 13         /**
    - 14          * @lends CAAT.Foundation.Timer.TimerTask.prototype
    - 15          */
    - 16 
    - 17         /**
    - 18          * Timer start time. Relative to Scene or Director time, depending who owns this TimerTask.
    - 19          */
    - 20         startTime:          0,
    - 21 
    - 22         /**
    - 23          * Timer duration.
    - 24          */
    - 25         duration:           0,
    - 26 
    - 27         /**
    - 28          * This callback will be called only once, when the timer expires.
    - 29          */
    - 30         callback_timeout:   null,
    - 31 
    - 32         /**
    - 33          * This callback will be called whenever the timer is checked in time.
    - 34          */
    - 35         callback_tick:      null,
    - 36 
    - 37         /**
    - 38          * This callback will be called when the timer is cancelled.
    - 39          */
    - 40         callback_cancel:    null,
    - 41 
    - 42         /**
    - 43          * What TimerManager instance owns this task.
    - 44          */
    - 45         owner:              null,
    - 46 
    - 47         /**
    - 48          * Scene or director instance that owns this TimerTask owner.
    - 49          */
    - 50         scene:              null,   // scene or director instance
    - 51 
    - 52         /**
    - 53          * An arbitrry id.
    - 54          */
    - 55         taskId:             0,
    - 56 
    - 57         /**
    - 58          * Remove this timer task on expiration/cancellation ?
    - 59          */
    - 60         remove:             false,
    - 61 
    - 62         /**
    - 63          * Create a TimerTask.
    - 64          * The taskId will be set by the scene.
    - 65          * @param startTime {number} an integer indicating TimerTask enable time.
    - 66          * @param duration {number} an integer indicating TimerTask duration.
    - 67          * @param callback_timeout {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on timeout callback function.
    - 68          * @param callback_tick {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on tick callback function.
    - 69          * @param callback_cancel {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on cancel callback function.
    - 70          *
    - 71          * @return this
    - 72          */
    - 73         create: function( startTime, duration, callback_timeout, callback_tick, callback_cancel ) {
    - 74             this.startTime=         startTime;
    - 75             this.duration=          duration;
    - 76             this.callback_timeout=  callback_timeout;
    - 77             this.callback_tick=     callback_tick;
    - 78             this.callback_cancel=   callback_cancel;
    - 79             return this;
    - 80         },
    - 81         /**
    - 82          * Performs TimerTask operation. The task will check whether it is in frame time, and will
    - 83          * either notify callback_timeout or callback_tick.
    - 84          *
    - 85          * @param time {number} an integer indicating scene time.
    - 86          * @return this
    - 87          *
    - 88          * @protected
    - 89          *
    - 90          */
    - 91         checkTask : function(time) {
    - 92             var ttime= time;
    - 93             ttime-= this.startTime;
    - 94             if ( ttime>=this.duration ) {
    - 95                 this.remove= true;
    - 96                 if( this.callback_timeout ) {
    - 97                     this.callback_timeout( time, ttime, this );
    - 98                 }
    - 99             } else {
    -100                 if ( this.callback_tick ) {
    -101                     this.callback_tick( time, ttime, this );
    -102                 }
    -103             }
    -104             return this;
    -105         },
    -106         remainingTime : function() {
    -107             return this.duration - (this.scene.time-this.startTime);
    -108         },
    -109         /**
    -110          * Reschedules this TimerTask by changing its startTime to current scene's time.
    -111          * @param time {number} an integer indicating scene time.
    -112          * @return this
    -113          */
    -114         reset : function( time ) {
    -115             this.remove= false;
    -116             this.startTime=  time;
    -117             this.owner.ensureTimerTask(this);
    -118             return this;
    -119         },
    -120         /**
    -121          * Cancels this timer by removing it on scene's next frame. The function callback_cancel will
    -122          * be called.
    -123          * @return this
    -124          */
    -125         cancel : function() {
    -126             this.remove= true;
    -127             if ( null!=this.callback_cancel ) {
    -128                 this.callback_cancel( this.scene.time, this.scene.time-this.startTime, this );
    -129             }
    -130             return this;
    -131         },
    -132         addTime : function( time ) {
    -133             this.duration+= time;
    -134             return this;
    -135         }
    -136     }
    -137 });
    -138 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Dock.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Dock.js.html deleted file mode 100644 index 352a9a29..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Dock.js.html +++ /dev/null @@ -1,390 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * In this file we'll be adding every useful Actor that is specific for certain purpose.
    -  5  *
    -  6  * + CAAT.Dock: a docking container that zooms in/out its actors.
    -  7  *
    -  8  */
    -  9 
    - 10 CAAT.Module( {
    - 11 
    - 12     /**
    - 13      * @name UI
    - 14      * @memberOf CAAT.Foundation
    - 15      * @namespace
    - 16      */
    - 17 
    - 18     /**
    - 19      * @name Dock
    - 20      * @memberOf CAAT.Foundation.UI
    - 21      * @extends CAAT.Foundation.ActorContainer
    - 22      * @constructor
    - 23      */
    - 24 
    - 25     defines : "CAAT.Foundation.UI.Dock",
    - 26     aliases : ["CAAT.Dock"],
    - 27     extendsClass : "CAAT.Foundation.ActorContainer",
    - 28     depends : [
    - 29         "CAAT.Foundation.ActorContainer",
    - 30         "CAAT.Behavior.GenericBehavior"
    - 31     ],
    - 32     constants : {
    - 33 
    - 34         /**
    - 35          * @lends CAAT.Foundation.UI.Dock
    - 36          */
    - 37 
    - 38         /**
    - 39          * @const
    - 40          */
    - 41         OP_LAYOUT_BOTTOM:   0,
    - 42         /**
    - 43          * @const
    - 44          */
    - 45         OP_LAYOUT_TOP:      1,
    - 46         /**
    - 47          * @const
    - 48          */
    - 49         OP_LAYOUT_LEFT:     2,
    - 50         /**
    - 51          * @const
    - 52          */
    - 53         OP_LAYOUT_RIGHT:    3
    - 54     },
    - 55     extendsWith : {
    - 56 
    - 57         /**
    - 58          * @lends CAAT.Foundation.UI.Dock.prototype
    - 59          */
    - 60 
    - 61         /**
    - 62          * scene the actor is in.
    - 63          */
    - 64         scene:              null,
    - 65 
    - 66         /**
    - 67          * resetting dimension timer task.
    - 68          */
    - 69         ttask:              null,
    - 70 
    - 71         /**
    - 72          * min contained actor size.
    - 73          */
    - 74         minSize:            0,
    - 75 
    - 76         /**
    - 77          * max contained actor size
    - 78          */
    - 79         maxSize:            0,
    - 80 
    - 81         /**
    - 82          * aproximated number of elements affected.
    - 83          */
    - 84         range:              2,
    - 85 
    - 86         /**
    - 87          * Any value from CAAT.Foundation.Dock.UI.OP_LAYOUT_*
    - 88          */
    - 89         layoutOp:           0,
    - 90 
    - 91         initialize : function(scene) {
    - 92             this.scene= scene;
    - 93             return this;
    - 94         },
    - 95         /**
    - 96          * Set the number of elements that will be affected (zoomed) when the mouse is inside the component.
    - 97          * @param range {number} a number. Defaults to 2.
    - 98          */
    - 99         setApplicationRange : function( range ) {
    -100             this.range= range;
    -101             return this;
    -102         },
    -103         /**
    -104          * Set layout orientation. Choose from
    -105          * <ul>
    -106          *  <li>CAAT.Dock.OP_LAYOUT_BOTTOM
    -107          *  <li>CAAT.Dock.OP_LAYOUT_TOP
    -108          *  <li>CAAT.Dock.OP_LAYOUT_BOTTOM
    -109          *  <li>CAAT.Dock.OP_LAYOUT_RIGHT
    -110          * </ul>
    -111          * By default, the layou operation is OP_LAYOUT_BOTTOM, that is, elements zoom bottom anchored.
    -112          *
    -113          * @param lo {number} one of CAAT.Dock.OP_LAYOUT_BOTTOM, CAAT.Dock.OP_LAYOUT_TOP,
    -114          * CAAT.Dock.OP_LAYOUT_BOTTOM, CAAT.Dock.OP_LAYOUT_RIGHT.
    -115          *
    -116          * @return this
    -117          */
    -118         setLayoutOp : function( lo ) {
    -119             this.layoutOp= lo;
    -120             return this;
    -121         },
    -122         /**
    -123          *
    -124          * Set maximum and minimum size of docked elements. By default, every contained actor will be
    -125          * of 'min' size, and will be scaled up to 'max' size.
    -126          *
    -127          * @param min {number}
    -128          * @param max {number}
    -129          * @return this
    -130          */
    -131         setSizes : function( min, max ) {
    -132             this.minSize= min;
    -133             this.maxSize= max;
    -134 
    -135             for( var i=0; i<this.childrenList.length; i++ ) {
    -136                 this.childrenList[i].width= min;
    -137                 this.childrenList[i].height= min;
    -138             }
    -139 
    -140             return this;
    -141         },
    -142         /**
    -143          * Lay out the docking elements. The lay out will be a row with the orientation set by calling
    -144          * the method <code>setLayoutOp</code>.
    -145          *
    -146          * @private
    -147          */
    -148         layout : function() {
    -149             var i,actor;
    -150 
    -151             var c= CAAT.Foundation.UI.Dock;
    -152 
    -153             if ( this.layoutOp===c.OP_LAYOUT_BOTTOM || this.layoutOp===c.OP_LAYOUT_TOP ) {
    -154 
    -155                 var currentWidth=0, currentX=0;
    -156 
    -157                 for( i=0; i<this.getNumChildren(); i++ ) {
    -158                     currentWidth+= this.getChildAt(i).width;
    -159                 }
    -160 
    -161                 currentX= (this.width-currentWidth)/2;
    -162 
    -163                 for( i=0; i<this.getNumChildren(); i++ ) {
    -164                     actor= this.getChildAt(i);
    -165                     actor.x= currentX;
    -166                     currentX+= actor.width;
    -167 
    -168                     if ( this.layoutOp===c.OP_LAYOUT_BOTTOM ) {
    -169                         actor.y= this.maxSize- actor.height;
    -170                     } else {
    -171                         actor.y= 0;
    -172                     }
    -173                 }
    -174             } else {
    -175 
    -176                 var currentHeight=0, currentY=0;
    -177 
    -178                 for( i=0; i<this.getNumChildren(); i++ ) {
    -179                     currentHeight+= this.getChildAt(i).height;
    -180                 }
    -181 
    -182                 currentY= (this.height-currentHeight)/2;
    -183 
    -184                 for( i=0; i<this.getNumChildren(); i++ ) {
    -185                     actor= this.getChildAt(i);
    -186                     actor.y= currentY;
    -187                     currentY+= actor.height;
    -188 
    -189                     if ( this.layoutOp===c.OP_LAYOUT_LEFT ) {
    -190                         actor.x= 0;
    -191                     } else {
    -192                         actor.x= this.width - actor.width;
    -193                     }
    -194                 }
    -195 
    -196             }
    -197 
    -198         },
    -199         mouseMove : function(mouseEvent) {
    -200             this.actorNotPointed();
    -201         },
    -202         mouseExit : function(mouseEvent) {
    -203             this.actorNotPointed();
    -204         },
    -205         /**
    -206          * Performs operation when the mouse is not in the dock element.
    -207          *
    -208          * @private
    -209          */
    -210         actorNotPointed : function() {
    -211 
    -212             var i;
    -213             var me= this;
    -214 
    -215             for( i=0; i<this.getNumChildren(); i++ ) {
    -216                 var actor= this.getChildAt(i);
    -217                 actor.emptyBehaviorList();
    -218                 actor.addBehavior(
    -219                         new CAAT.Behavior.GenericBehavior().
    -220                             setValues( actor.width, this.minSize, actor, 'width' ).
    -221                             setFrameTime( this.scene.time, 250 ) ).
    -222                     addBehavior(
    -223                         new CAAT.Behavior.GenericBehavior().
    -224                             setValues( actor.height, this.minSize, actor, 'height' ).
    -225                             setFrameTime( this.scene.time, 250 ) );
    -226 
    -227                 if ( i===this.getNumChildren()-1 ) {
    -228                     actor.behaviorList[0].addListener(
    -229                     {
    -230                         behaviorApplied : function(behavior,time,normalizedTime,targetActor,value) {
    -231                             targetActor.parent.layout();
    -232                         },
    -233                         behaviorExpired : function(behavior,time,targetActor) {
    -234                             for( i=0; i<me.getNumChildren(); i++ ) {
    -235                                 actor= me.getChildAt(i);
    -236                                 actor.width  = me.minSize;
    -237                                 actor.height = me.minSize;
    -238                             }
    -239                             targetActor.parent.layout();
    -240                         }
    -241                     });
    -242                 }
    -243             }
    -244         },
    -245         /**
    -246          *
    -247          * Perform the process of pointing a docking actor.
    -248          *
    -249          * @param x {number}
    -250          * @param y {number}
    -251          * @param pointedActor {CAAT.Actor}
    -252          *
    -253          * @private
    -254          */
    -255         actorPointed : function(x, y, pointedActor) {
    -256 
    -257             var index= this.findChild(pointedActor);
    -258             var c= CAAT.Foundation.UI.Dock;
    -259 
    -260             var across= 0;
    -261             if ( this.layoutOp===c.OP_LAYOUT_BOTTOM || this.layoutOp===c.OP_LAYOUT_TOP ) {
    -262                 across= x / pointedActor.width;
    -263             } else {
    -264                 across= y / pointedActor.height;
    -265             }
    -266             var i;
    -267 
    -268             for( i=0; i<this.childrenList.length; i++ ) {
    -269                 var actor= this.childrenList[i];
    -270                 actor.emptyBehaviorList();
    -271 
    -272                 var wwidth=0;
    -273                 if (i < index - this.range || i > index + this.range) {
    -274                     wwidth = this.minSize;
    -275                 } else if (i === index) {
    -276                     wwidth = this.maxSize;
    -277                 } else if (i < index) {
    -278                     wwidth=
    -279                         this.minSize +
    -280                         (this.maxSize-this.minSize) *
    -281                         (Math.cos((i - index - across + 1) / this.range * Math.PI) + 1) /
    -282                         2;
    -283                 } else {
    -284                     wwidth=
    -285                         this.minSize +
    -286                         (this.maxSize-this.minSize)*
    -287                         (Math.cos( (i - index - across) / this.range * Math.PI) + 1) /
    -288                         2;
    -289                 }
    -290 
    -291                 actor.height= wwidth;
    -292                 actor.width= wwidth;
    -293             }
    -294 
    -295             this.layout();
    -296         },
    -297         /**
    -298          * Perform the process of exiting the docking element, that is, animate elements to the minimum
    -299          * size.
    -300          *
    -301          * @param mouseEvent {CAAT.MouseEvent} a CAAT.MouseEvent object.
    -302          *
    -303          * @private
    -304          */
    -305         actorMouseExit : function(mouseEvent) {
    -306             if ( null!==this.ttask ) {
    -307                 this.ttask.cancel();
    -308             }
    -309 
    -310             var me= this;
    -311             this.ttask= this.scene.createTimer(
    -312                     this.scene.time,
    -313                     100,
    -314                     function timeout(sceneTime, time, timerTask) {
    -315                         me.actorNotPointed();
    -316                     },
    -317                     null,
    -318                     null);
    -319         },
    -320         /**
    -321          * Perform the beginning of docking elements.
    -322          * @param mouseEvent {CAAT.MouseEvent} a CAAT.MouseEvent object.
    -323          *
    -324          * @private
    -325          */
    -326         actorMouseEnter : function(mouseEvent) {
    -327             if ( null!==this.ttask ) {
    -328                 this.ttask.cancel();
    -329                 this.ttask= null;
    -330             }
    -331         },
    -332         /**
    -333          * Adds an actor to Dock.
    -334          * <p>
    -335          * Be aware that actor mouse functions must be set prior to calling this method. The Dock actor
    -336          * needs set his own actor input events functions for mouseEnter, mouseExit and mouseMove and
    -337          * will then chain to the original methods set by the developer.
    -338          *
    -339          * @param actor {CAAT.Actor} a CAAT.Actor instance.
    -340          *
    -341          * @return this
    -342          */
    -343         addChild : function(actor) {
    -344             var me= this;
    -345 
    -346             actor.__Dock_mouseEnter= actor.mouseEnter;
    -347             actor.__Dock_mouseExit=  actor.mouseExit;
    -348             actor.__Dock_mouseMove=  actor.mouseMove;
    -349 
    -350             /**
    -351              * @ignore
    -352              * @param mouseEvent
    -353              */
    -354             actor.mouseEnter= function(mouseEvent) {
    -355                 me.actorMouseEnter(mouseEvent);
    -356                 this.__Dock_mouseEnter(mouseEvent);
    -357             };
    -358             /**
    -359              * @ignore
    -360              * @param mouseEvent
    -361              */
    -362             actor.mouseExit= function(mouseEvent) {
    -363                 me.actorMouseExit(mouseEvent);
    -364                 this.__Dock_mouseExit(mouseEvent);
    -365             };
    -366             /**
    -367              * @ignore
    -368              * @param mouseEvent
    -369              */
    -370             actor.mouseMove= function(mouseEvent) {
    -371                 me.actorPointed( mouseEvent.point.x, mouseEvent.point.y, mouseEvent.source );
    -372                 this.__Dock_mouseMove(mouseEvent);
    -373             };
    -374 
    -375             actor.width= this.minSize;
    -376             actor.height= this.minSize;
    -377 
    -378             return CAAT.Foundation.UI.Dock.superclass.addChild.call(this,actor);
    -379         }
    -380     }
    -381 
    -382 });
    -383 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_IMActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_IMActor.js.html deleted file mode 100644 index 76813a36..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_IMActor.js.html +++ /dev/null @@ -1,74 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name IMActor
    -  5      * @memberOf CAAT.Foundation.UI
    -  6      * @extends CAAT.Foundation.Actor
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.Foundation.UI.IMActor",
    - 11     depends : [
    - 12         "CAAT.Foundation.Actor",
    - 13         "CAAT.Module.ImageProcessor.ImageProcessor"
    - 14     ],
    - 15     extendsClass : "CAAT.Foundation.Actor",
    - 16     extendsWith : {
    - 17 
    - 18         /**
    - 19          * @lends CAAT.Foundation.UI.IMActor.prototype
    - 20          */
    - 21 
    - 22         /**
    - 23          * Image processing interface.
    - 24          * @type { }
    - 25          */
    - 26         imageProcessor:         null,
    - 27 
    - 28         /**
    - 29          * Calculate another image processing frame every this milliseconds.
    - 30          */
    - 31         changeTime:             100,
    - 32 
    - 33         /**
    - 34          * Last scene time this actor calculated a frame.
    - 35          */
    - 36         lastApplicationTime:    -1,
    - 37 
    - 38         /**
    - 39          * Set the image processor.
    - 40          *
    - 41          * @param im {CAAT.ImageProcessor} a CAAT.ImageProcessor instance.
    - 42          */
    - 43         setImageProcessor : function(im) {
    - 44             this.imageProcessor= im;
    - 45             return this;
    - 46         },
    - 47         /**
    - 48          * Call image processor to update image every time milliseconds.
    - 49          * @param time an integer indicating milliseconds to elapse before updating the frame.
    - 50          */
    - 51         setImageProcessingTime : function( time ) {
    - 52             this.changeTime= time;
    - 53             return this;
    - 54         },
    - 55         paint : function( director, time ) {
    - 56             if ( time-this.lastApplicationTime>this.changeTime ) {
    - 57                 this.imageProcessor.apply( director, time );
    - 58                 this.lastApplicationTime= time;
    - 59             }
    - 60 
    - 61             var ctx= director.ctx;
    - 62             this.imageProcessor.paint( director, time );
    - 63         }
    - 64     }
    - 65 
    - 66 });
    - 67 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_InterpolatorActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_InterpolatorActor.js.html deleted file mode 100644 index 3b8c74f4..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_InterpolatorActor.js.html +++ /dev/null @@ -1,126 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  **/
    -  5 
    -  6 CAAT.Module( {
    -  7 
    -  8     /**
    -  9      * @name InterpolatorActor
    - 10      * @memberOf CAAT.Foundation.UI
    - 11      * @extends CAAT.Foundation.Actor
    - 12      * @constructor
    - 13      */
    - 14 
    - 15     defines : "CAAT.Foundation.UI.InterpolatorActor",
    - 16     aliases : ["CAAT.InterpolatorActor"],
    - 17     depends : [
    - 18         "CAAT.Foundation.Actor"
    - 19     ],
    - 20     extendsClass : "CAAT.Foundation.Actor",
    - 21     extendsWith : {
    - 22 
    - 23         /**
    - 24          * @lends CAAT.Foundation.UI.InterpolatorActor.prototype
    - 25          */
    - 26 
    - 27         /**
    - 28          * The interpolator instance to draw.
    - 29          * @type {CAAT.Behavior.Interpolator}
    - 30          */
    - 31         interpolator:   null,
    - 32 
    - 33         /**
    - 34          * This interpolator´s contour.
    - 35          * @type {Array.<CAAT.Math.Point>}
    - 36          */
    - 37         contour:        null,   // interpolator contour cache
    - 38 
    - 39         /**
    - 40          * Number of samples to calculate a contour.
    - 41          */
    - 42         S:              50,     // contour samples.
    - 43 
    - 44         /**
    - 45          * padding when drawing the interpolator.
    - 46          */
    - 47         gap:            5,      // border size in pixels.
    - 48 
    - 49         /**
    - 50          * Sets a padding border size. By default is 5 pixels.
    - 51          * @param gap {number} border size in pixels.
    - 52          * @return this
    - 53          */
    - 54         setGap : function( gap ) {
    - 55             this.gap= gap;
    - 56             return this;
    - 57         },
    - 58         /**
    - 59          * Sets the CAAT.Interpolator instance to draw.
    - 60          *
    - 61          * @param interpolator a CAAT.Interpolator instance.
    - 62          * @param size an integer indicating the number of polyline segments so draw to show the CAAT.Interpolator
    - 63          * instance.
    - 64          *
    - 65          * @return this
    - 66          */
    - 67         setInterpolator : function( interpolator, size ) {
    - 68             this.interpolator= interpolator;
    - 69             this.contour= interpolator.getContour(size || this.S);
    - 70 
    - 71             return this;
    - 72         },
    - 73         /**
    - 74          * Paint this actor.
    - 75          * @param director {CAAT.Director}
    - 76          * @param time {number} scene time.
    - 77          */
    - 78         paint : function( director, time ) {
    - 79 
    - 80             CAAT.InterpolatorActor.superclass.paint.call(this,director,time);
    - 81 
    - 82             if ( this.backgroundImage ) {
    - 83                 return this;
    - 84             }
    - 85 
    - 86             if ( this.interpolator ) {
    - 87 
    - 88                 var canvas= director.ctx;
    - 89 
    - 90                 var xs= (this.width-2*this.gap);
    - 91                 var ys= (this.height-2*this.gap);
    - 92 
    - 93                 canvas.beginPath();
    - 94                 canvas.moveTo(
    - 95                         this.gap +  xs*this.contour[0].x,
    - 96                         -this.gap + this.height - ys*this.contour[0].y);
    - 97 
    - 98                 for( var i=1; i<this.contour.length; i++ ) {
    - 99                     canvas.lineTo(
    -100                              this.gap + xs*this.contour[i].x,
    -101                             -this.gap + this.height - ys*this.contour[i].y);
    -102                 }
    -103 
    -104                 canvas.strokeStyle= this.strokeStyle;
    -105                 canvas.stroke();
    -106             }
    -107         },
    -108         /**
    -109          * Return the represented interpolator.
    -110          * @return {CAAT.Interpolator}
    -111          */
    -112         getInterpolator : function() {
    -113             return this.interpolator;
    -114         }
    -115     }
    -116 
    -117 
    -118 });
    -119 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Label.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Label.js.html deleted file mode 100644 index 3d2e6482..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Label.js.html +++ /dev/null @@ -1,1225 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name Label
    -  5      * @memberOf CAAT.Foundation.UI
    -  6      * @extends CAAT.Foundation.Actor
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.Foundation.UI.Label",
    - 11     depends : [
    - 12         "CAAT.Foundation.Actor",
    - 13         "CAAT.Foundation.SpriteImage",
    - 14         "CAAT.Module.Font.Font",
    - 15         "CAAT.Foundation.UI.Layout.LayoutManager"
    - 16     ],
    - 17     aliases : ["CAAT.UI.Label"],
    - 18     extendsClass : "CAAT.Foundation.Actor",
    - 19     extendsWith : function() {
    - 20 
    - 21         var DEBUG=0;
    - 22         var JUSTIFY_RATIO= .6;
    - 23 
    - 24         /**
    - 25          *
    - 26          * Current applied rendering context information.
    - 27          */
    - 28         var renderContextStyle= function(ctx) {
    - 29             this.ctx= ctx;
    - 30             return this;
    - 31         };
    - 32 
    - 33         renderContextStyle.prototype= {
    - 34 
    - 35             ctx         : null,
    - 36 
    - 37             defaultFS   : null,
    - 38             font        : null,
    - 39             fontSize    : null,
    - 40             fill        : null,
    - 41             stroke      : null,
    - 42             filled      : null,
    - 43             stroked     : null,
    - 44             strokeSize  : null,
    - 45             italic      : null,
    - 46             bold        : null,
    - 47             alignment   : null,
    - 48             tabSize     : null,
    - 49             shadow      : null,
    - 50             shadowBlur  : null,
    - 51             shadowColor : null,
    - 52 
    - 53             sfont       : null,
    - 54 
    - 55             chain       : null,
    - 56 
    - 57             setDefault : function( defaultStyles ) {
    - 58                 this.defaultFS  =   24;
    - 59                 this.font       =   "Arial";
    - 60                 this.fontSize   =   this.defaultFS;
    - 61                 this.fill       =   '#000';
    - 62                 this.stroke     =   '#f00';
    - 63                 this.filled     =   true;
    - 64                 this.stroked    =   false;
    - 65                 this.strokeSize =   1;
    - 66                 this.italic     =   false;
    - 67                 this.bold       =   false;
    - 68                 this.alignment  =   "left";
    - 69                 this.tabSize    =   75;
    - 70                 this.shadow     =   false;
    - 71                 this.shadowBlur =   0;
    - 72                 this.shadowColor=   "#000";
    - 73 
    - 74                 for( var style in defaultStyles ) {
    - 75                     if ( defaultStyles.hasOwnProperty(style) ) {
    - 76                         this[style]= defaultStyles[style];
    - 77                     }
    - 78                 }
    - 79 
    - 80                 this.__setFont();
    - 81 
    - 82                 return this;
    - 83             },
    - 84 
    - 85             setStyle : function( styles ) {
    - 86                 if ( typeof styles!=="undefined" ) {
    - 87                     for( var style in styles ) {
    - 88                         this[style]= styles[style];
    - 89                     }
    - 90                 }
    - 91                 return this;
    - 92             },
    - 93 
    - 94             applyStyle : function() {
    - 95                 this.__setFont();
    - 96 
    - 97                 return this;
    - 98             },
    - 99 
    -100             clone : function( ) {
    -101                 var c= new renderContextStyle( this.ctx );
    -102                 var pr;
    -103                 for( pr in this ) {
    -104                     if ( this.hasOwnProperty(pr) ) {
    -105                         c[pr]= this[pr];
    -106                     }
    -107                 }
    -108                 /*
    -109                 c.defaultFS  =   this.defaultFS;
    -110                 c.font       =   this.font;
    -111                 c.fontSize   =   this.fontSize;
    -112                 c.fill       =   this.fill;
    -113                 c.stroke     =   this.stroke;
    -114                 c.filled     =   this.filled;
    -115                 c.stroked    =   this.stroked;
    -116                 c.strokeSize =   this.strokeSize;
    -117                 c.italic     =   this.italic;
    -118                 c.bold       =   this.bold;
    -119                 c.alignment  =   this.alignment;
    -120                 c.tabSize    =   this.tabSize;
    -121                 */
    -122 
    -123                 var me= this;
    -124                 while( me.chain ) {
    -125                     me= me.chain;
    -126                     for( pr in me ) {
    -127                         if ( c[pr]===null  && me.hasOwnProperty(pr) ) {
    -128                             c[pr]= me[pr];
    -129                         }
    -130                     }
    -131                 }
    -132 
    -133                 c.__setFont();
    -134 
    -135                 return c;
    -136             },
    -137 
    -138             __getProperty : function( prop ) {
    -139                 var me= this;
    -140                 var res;
    -141                 do {
    -142                     res= me[prop];
    -143                     if ( res!==null ) {
    -144                         return res;
    -145                     }
    -146                     me= me.chain;
    -147                 } while( me );
    -148 
    -149                 return null;
    -150             },
    -151 
    -152             image : function( ctx ) {
    -153                 this.__setShadow( ctx );
    -154             },
    -155 
    -156             text : function( ctx, text, x, y ) {
    -157 
    -158                 this.__setShadow( ctx );
    -159 
    -160                 ctx.font= this.__getProperty("sfont");
    -161 
    -162                 if ( this.filled ) {
    -163                     this.__fillText( ctx,text,x,y );
    -164                 }
    -165                 if ( this.stroked ) {
    -166                     this.__strokeText( ctx,text,x,y );
    -167                 }
    -168             },
    -169 
    -170             __setShadow : function( ctx ) {
    -171                 if ( this.__getProperty("shadow" ) ) {
    -172                     ctx.shadowBlur= this.__getProperty("shadowBlur");
    -173                     ctx.shadowColor= this.__getProperty("shadowColor");
    -174                 }
    -175             },
    -176 
    -177             __fillText : function( ctx, text, x, y ) {
    -178                 ctx.fillStyle= this.__getProperty("fill");
    -179                 ctx.fillText( text, x, y );
    -180             },
    -181 
    -182             __strokeText : function( ctx, text, x, y ) {
    -183                 ctx.strokeStyle= this.__getProperty("stroke");
    -184                 ctx.lineWidth= this.__getProperty("strokeSize");
    -185                 ctx.beginPath();
    -186                 ctx.strokeText( text, x, y );
    -187             },
    -188 
    -189             __setFont : function() {
    -190                 var italic= this.__getProperty("italic");
    -191                 var bold= this.__getProperty("bold");
    -192                 var fontSize= this.__getProperty("fontSize");
    -193                 var font= this.__getProperty("font");
    -194 
    -195                 this.sfont= (italic ? "italic " : "") +
    -196                     (bold ? "bold " : "") +
    -197                     fontSize + "px " +
    -198                     font;
    -199 
    -200                 this.ctx.font= this.__getProperty("sfont");
    -201             },
    -202 
    -203             setBold : function( bool ) {
    -204                 if ( bool!=this.bold ) {
    -205                     this.bold= bool;
    -206                     this.__setFont();
    -207                 }
    -208             },
    -209 
    -210             setItalic : function( bool ) {
    -211                 if ( bool!=this.italic ) {
    -212                     this.italic= bool;
    -213                     this.__setFont();
    -214                 }
    -215             },
    -216 
    -217             setStroked : function( bool ) {
    -218                 this.stroked= bool;
    -219             },
    -220 
    -221             setFilled : function( bool ) {
    -222                 this.filled= bool;
    -223             },
    -224 
    -225             getTabPos : function( x ) {
    -226                 var ts= this.__getProperty("tabSize");
    -227                 return (((x/ts)>>0)+1)*ts;
    -228             },
    -229 
    -230             setFillStyle : function( style ) {
    -231                 this.fill= style;
    -232             },
    -233 
    -234             setStrokeStyle : function( style ) {
    -235                 this.stroke= style;
    -236             },
    -237 
    -238             setStrokeSize : function( size ) {
    -239                 this.strokeSize= size;
    -240             },
    -241 
    -242             setAlignment : function( alignment ) {
    -243                 this.alignment= alignment;
    -244             },
    -245 
    -246             setFontSize : function( size ) {
    -247                 if ( size!==this.fontSize ) {
    -248                     this.fontSize= size;
    -249                     this.__setFont();
    -250                 }
    -251             }
    -252         };
    -253 
    -254         /**
    -255          * This class keeps track of styles, images, and the current applied style.
    -256          */
    -257         var renderContext= function() {
    -258             this.text= "";
    -259             return this;
    -260         };
    -261 
    -262         renderContext.prototype= {
    -263 
    -264             x           :   0,
    -265             y           :   0,
    -266             width       :   0,
    -267             text        :   null,
    -268 
    -269             crcs        :   null,   // current rendering context style
    -270             rcs         :   null,   // rendering content styles stack
    -271 
    -272             styles      :   null,
    -273             images      :   null,
    -274 
    -275             lines       :   null,
    -276 
    -277             documentHeight  : 0,
    -278 
    -279             anchorStack     : null,
    -280 
    -281             __nextLine : function() {
    -282                 this.x= 0;
    -283                 this.currentLine= new DocumentLine(
    -284                     CAAT.Module.Font.Font.getFontMetrics( this.crcs.sfont)  );
    -285                 this.lines.push( this.currentLine );
    -286             },
    -287 
    -288             /**
    -289              *
    -290              * @param image {CAAT.SpriteImage}
    -291              * @param r {number=}
    -292              * @param c {number=}
    -293              * @private
    -294              */
    -295             __image : function( image, r, c ) {
    -296 
    -297 
    -298                 var image_width;
    -299 
    -300                 if ( typeof r!=="undefined" && typeof c!=="undefined" ) {
    -301                     image_width= image.getWidth();
    -302                 } else {
    -303                     image_width= ( image instanceof CAAT.Foundation.SpriteImage ) ? image.getWidth() : image.getWrappedImageWidth();
    -304                 }
    -305 
    -306                 // la imagen cabe en este sitio.
    -307                 if ( this.width ) {
    -308                     if ( image_width + this.x > this.width && this.x>0 ) {
    -309                         this.__nextLine();
    -310                     }
    -311                 }
    -312 
    -313                 this.currentLine.addElementImage( new DocumentElementImage(
    -314                     this.x,
    -315                     image,
    -316                     r,
    -317                     c,
    -318                     this.crcs.clone(),
    -319                     this.__getCurrentAnchor() ) );
    -320 
    -321                 this.x+= image_width;
    -322             },
    -323 
    -324             __text : function() {
    -325 
    -326                 if ( this.text.length===0 ) {
    -327                     return;
    -328                 }
    -329 
    -330                 var text_width= this.ctx.measureText(this.text).width;
    -331 
    -332                 // la palabra cabe en este sitio.
    -333                 if ( this.width ) {
    -334                     if ( text_width + this.x > this.width && this.x>0 ) {
    -335                         this.__nextLine();
    -336                     }
    -337                 }
    -338 
    -339                 //this.crcs.text( this.text, this.x, this.y );
    -340                 this.currentLine.addElement( new DocumentElementText(
    -341                     this.text,
    -342                     this.x,
    -343                     text_width,
    -344                     0, //this.crcs.__getProperty("fontSize"), calculated later
    -345                     this.crcs.clone(),
    -346                     this.__getCurrentAnchor() ) ) ;
    -347 
    -348                 this.x+= text_width;
    -349 
    -350                 this.text="";
    -351             },
    -352 
    -353             fchar : function( _char ) {
    -354 
    -355                 if ( _char===' ' ) {
    -356 
    -357                     this.__text();
    -358 
    -359                     this.x+= this.ctx.measureText(_char).width;
    -360                     if ( this.width ) {
    -361                         if ( this.x > this.width ) {
    -362                             this.__nextLine();
    -363                         }
    -364                     }
    -365                 } else {
    -366                     this.text+= _char;
    -367                 }
    -368             },
    -369 
    -370             end : function() {
    -371                 if ( this.text.length>0 ) {
    -372                     this.__text();
    -373                 }
    -374 
    -375                 var y=0;
    -376                 var lastLineEstimatedDescent= 0;
    -377                 for( var i=0; i<this.lines.length; i++ ) {
    -378                     var inc= this.lines[i].getHeight();
    -379 
    -380                     if ( inc===0 ) {
    -381                         // lineas vacias al menos tienen tamaño del estilo por defecto
    -382                         inc= this.styles["default"].fontSize;
    -383                     }
    -384                     y+= inc;
    -385 
    -386                     /**
    -387                      * add the estimated descent of the last text line to document height's.
    -388                      * the descent is estimated to be a 20% of font's height.
    -389                      */
    -390                     if ( i===this.lines.length-1 ) {
    -391                         lastLineEstimatedDescent= (inc*.25)>>0;
    -392                     }
    -393 
    -394                     this.lines[i].setY(y);
    -395                 }
    -396 
    -397                 this.documentHeight= y + lastLineEstimatedDescent;
    -398             },
    -399 
    -400             getDocumentHeight : function() {
    -401                 return this.documentHeight;
    -402             },
    -403 
    -404             __getCurrentAnchor : function() {
    -405                 if ( this.anchorStack.length ) {
    -406                     return this.anchorStack[ this.anchorStack.length-1 ];
    -407                 }
    -408 
    -409                 return null;
    -410             },
    -411 
    -412             __resetAppliedStyles : function() {
    -413                 this.rcs= [];
    -414                 this.__pushDefaultStyles();
    -415             },
    -416 
    -417             __pushDefaultStyles : function() {
    -418                 this.crcs= new renderContextStyle(this.ctx).setDefault( this.styles["default"] );
    -419                 this.rcs.push( this.crcs );
    -420             },
    -421 
    -422             __pushStyle : function( style ) {
    -423                 var pcrcs= this.crcs;
    -424                 this.crcs= new renderContextStyle(this.ctx);
    -425                 this.crcs.chain= pcrcs;
    -426                 this.crcs.setStyle( style );
    -427                 this.crcs.applyStyle( );
    -428 
    -429                 this.rcs.push( this.crcs );
    -430             },
    -431 
    -432             __popStyle : function() {
    -433                 // make sure you don't remove default style.
    -434                 if ( this.rcs.length>1 ) {
    -435                     this.rcs.pop();
    -436                     this.crcs= this.rcs[ this.rcs.length-1 ];
    -437                     this.crcs.applyStyle();
    -438                 }
    -439             },
    -440 
    -441             __popAnchor : function() {
    -442                 if ( this.anchorStack.length> 0 ) {
    -443                     this.anchorStack.pop();
    -444                 }
    -445             },
    -446 
    -447             __pushAnchor : function( anchor ) {
    -448                 this.anchorStack.push( anchor );
    -449             },
    -450 
    -451             start : function( ctx, styles, images, width ) {
    -452                 this.x=0;
    -453                 this.y=0;
    -454                 this.width= typeof width!=="undefined" ? width : 0;
    -455                 this.ctx= ctx;
    -456                 this.lines= [];
    -457                 this.styles= styles;
    -458                 this.images= images;
    -459                 this.anchorStack= [];
    -460 
    -461                 this.__resetAppliedStyles();
    -462                 this.__nextLine();
    -463 
    -464             },
    -465 
    -466             setTag  : function( tag ) {
    -467 
    -468                 var pairs, style;
    -469 
    -470                 this.__text();
    -471 
    -472                 tag= tag.toLowerCase();
    -473                 if ( tag==='b' ) {
    -474                     this.crcs.setBold( true );
    -475                 } else if ( tag==='/b' ) {
    -476                     this.crcs.setBold( false );
    -477                 } else if ( tag==='i' ) {
    -478                     this.crcs.setItalic( true );
    -479                 } else if ( tag==='/i' ) {
    -480                     this.crcs.setItalic( false );
    -481                 } else if ( tag==='stroked' ) {
    -482                     this.crcs.setStroked( true );
    -483                 } else if ( tag==='/stroked' ) {
    -484                     this.crcs.setStroked( false );
    -485                 } else if ( tag==='filled' ) {
    -486                     this.crcs.setFilled( true );
    -487                 } else if ( tag==='/filled' ) {
    -488                     this.crcs.setFilled( false );
    -489                 } else if ( tag==='tab' ) {
    -490                     this.x= this.crcs.getTabPos( this.x );
    -491                 } else if ( tag==='br' ) {
    -492                     this.__nextLine();
    -493                 } else if ( tag==='/a' ) {
    -494                     this.__popAnchor();
    -495                 } else if ( tag==='/style' ) {
    -496                     if ( this.rcs.length>1 ) {
    -497                         this.__popStyle();
    -498                     } else {
    -499                         /**
    -500                          * underflow pop de estilos. eres un cachondo.
    -501                          */
    -502                     }
    -503                 } else {
    -504                     if ( tag.indexOf("fillcolor")===0 ) {
    -505                         pairs= tag.split("=");
    -506                         this.crcs.setFillStyle( pairs[1] );
    -507                     } else if ( tag.indexOf("strokecolor")===0 ) {
    -508                         pairs= tag.split("=");
    -509                         this.crcs.setStrokeStyle( pairs[1] );
    -510                     } else if ( tag.indexOf("strokesize")===0 ) {
    -511                         pairs= tag.split("=");
    -512                         this.crcs.setStrokeSize( pairs[1]|0 );
    -513                     } else if ( tag.indexOf("fontsize")===0 ) {
    -514                         pairs= tag.split("=");
    -515                         this.crcs.setFontSize( pairs[1]|0 );
    -516                     } else if ( tag.indexOf("style")===0 ) {
    -517                         pairs= tag.split("=");
    -518                         style= this.styles[ pairs[1] ];
    -519                         if ( style ) {
    -520                             this.__pushStyle( style );
    -521                         }
    -522                     } else if ( tag.indexOf("image")===0) {
    -523                         pairs= tag.split("=")[1].split(",");
    -524                         var image= pairs[0];
    -525                         if ( this.images[image] ) {
    -526                             var r= 0, c=0;
    -527                             if ( pairs.length>=3 ) {
    -528                                 r= pairs[1]|0;
    -529                                 c= pairs[2]|0;
    -530                             }
    -531                             this.__image( this.images[image], r, c );
    -532                         } else if (CAAT.currentDirector.getImage(image) ) {
    -533                             this.__image( CAAT.currentDirector.getImage(image) );
    -534                         }
    -535                     } else if ( tag.indexOf("a=")===0 ) {
    -536                         pairs= tag.split("=");
    -537                         this.__pushAnchor( pairs[1] );
    -538                     }
    -539                 }
    -540             }
    -541         };
    -542 
    -543         /**
    -544          * Abstract document element.
    -545          * The document contains a collection of DocumentElementText and DocumentElementImage.
    -546          * @param anchor
    -547          * @param style
    -548          */
    -549         var DocumentElement= function( anchor, style ) {
    -550             this.link= anchor;
    -551             this.style= style;
    -552             return this;
    -553         };
    -554 
    -555         DocumentElement.prototype= {
    -556             x       : null,
    -557             y       : null,
    -558             width   : null,
    -559             height  : null,
    -560 
    -561             style   : null,
    -562 
    -563             link    : null,
    -564 
    -565             isLink : function() {
    -566                 return this.link;
    -567             },
    -568 
    -569             setLink : function( link ) {
    -570                 this.link= link;
    -571                 return this;
    -572             },
    -573 
    -574             getLink : function() {
    -575                 return this.link;
    -576             },
    -577 
    -578             contains : function(x,y) {
    -579                 return false;
    -580             }
    -581 
    -582         };
    -583 
    -584         /**
    -585          * This class represents an image in the document.
    -586          * @param x
    -587          * @param image
    -588          * @param r
    -589          * @param c
    -590          * @param style
    -591          * @param anchor
    -592          */
    -593         var DocumentElementImage= function( x, image, r, c, style, anchor ) {
    -594 
    -595             DocumentElementImage.superclass.constructor.call(this, anchor, style);
    -596 
    -597             this.x= x;
    -598             this.image= image;
    -599             this.row= r;
    -600             this.column= c;
    -601             this.width= image.getWidth();
    -602             this.height= image.getHeight();
    -603 
    -604             if ( this.image instanceof CAAT.SpriteImage || this.image instanceof CAAT.Foundation.SpriteImage ) {
    -605 
    -606                 if ( typeof r==="undefined" || typeof c==="undefined" ) {
    -607                     this.spriteIndex= 0;
    -608                 } else {
    -609                     this.spriteIndex= r*image.columns+c;
    -610                 }
    -611                 this.paint= this.paintSI;
    -612             }
    -613 
    -614             return this;
    -615         };
    -616 
    -617         DocumentElementImage.prototype= {
    -618             image   : null,
    -619             row     : null,
    -620             column  : null,
    -621             spriteIndex : null,
    -622 
    -623             paint : function( ctx ) {
    -624                 this.style.image( ctx );
    -625                 ctx.drawImage( this.image, this.x, -this.height+1);
    -626                 if ( DEBUG ) {
    -627                     ctx.strokeRect( this.x, -this.height+1, this.width, this.height );
    -628                 }
    -629             },
    -630 
    -631             paintSI : function( ctx ) {
    -632                 this.style.image( ctx );
    -633                 this.image.setSpriteIndex( this.spriteIndex );
    -634                 this.image.paint( { ctx: ctx }, 0, this.x,  -this.height+1 );
    -635                 if ( DEBUG ) {
    -636                     ctx.strokeRect( this.x, -this.height+1, this.width, this.height );
    -637                 }
    -638             },
    -639 
    -640             getHeight : function() {
    -641                 return this.image instanceof CAAT.Foundation.SpriteImage ? this.image.getHeight() : this.image.height;
    -642             },
    -643 
    -644             getFontMetrics : function() {
    -645                 return null;
    -646             },
    -647 
    -648             contains : function(x,y) {
    -649                 return x>=this.x && x<=this.x+this.width && y>=this.y && y<this.y + this.height;
    -650             },
    -651 
    -652             setYPosition : function( baseline ) {
    -653                 this.y= baseline - this.height + 1;
    -654             }
    -655 
    -656         };
    -657 
    -658         /**
    -659          * This class represents a text in the document. The text will have applied the styles selected
    -660          * when it was defined.
    -661          * @param text
    -662          * @param x
    -663          * @param width
    -664          * @param height
    -665          * @param style
    -666          * @param anchor
    -667          */
    -668         var DocumentElementText= function( text,x,width,height,style, anchor) {
    -669 
    -670             DocumentElementText.superclass.constructor.call(this, anchor, style);
    -671 
    -672             this.x=         x;
    -673             this.y=         0;
    -674             this.width=     width;
    -675             this.text=      text;
    -676             this.style=     style;
    -677             this.fm=        CAAT.Module.Font.Font.getFontMetrics( style.sfont );
    -678             this.height=    this.fm.height;
    -679 
    -680             return this;
    -681         };
    -682 
    -683         DocumentElementText.prototype= {
    -684 
    -685             text    : null,
    -686             style   : null,
    -687             fm      : null,
    -688 
    -689             bl      : null,     // where baseline was set. current 0 in ctx.
    -690 
    -691             paint : function( ctx ) {
    -692                 this.style.text( ctx, this.text, this.x, 0 );
    -693                 if ( DEBUG ) {
    -694                     ctx.strokeRect( this.x, -this.fm.ascent, this.width, this.height);
    -695                 }
    -696             },
    -697 
    -698             getHeight : function() {
    -699                 return this.fm.height;
    -700             },
    -701 
    -702             getFontMetrics : function() {
    -703                 return this.fm; //CAAT.Font.getFontMetrics( this.style.sfont);
    -704             },
    -705 
    -706             contains : function( x, y ) {
    -707                 return x>= this.x && x<=this.x+this.width &&
    -708                     y>= this.y && y<= this.y+this.height;
    -709             },
    -710 
    -711             setYPosition : function( baseline ) {
    -712                 this.bl= baseline;
    -713                 this.y= baseline - this.fm.ascent;
    -714             }
    -715         };
    -716 
    -717         extend( DocumentElementImage, DocumentElement );
    -718         extend( DocumentElementText, DocumentElement );
    -719 
    -720         /**
    -721          * This class represents a document line.
    -722          * It contains a collection of DocumentElement objects.
    -723          */
    -724         var DocumentLine= function( defaultFontMetrics ) {
    -725             this.elements= [];
    -726             this.defaultFontMetrics= defaultFontMetrics;
    -727             return this;
    -728         };
    -729 
    -730         DocumentLine.prototype= {
    -731             elements    : null,
    -732             width       : 0,
    -733             height      : 0,
    -734             defaultHeight : 0,  // default line height in case it is empty.
    -735             y           : 0,
    -736             x           : 0,
    -737             alignment   : null,
    -738 
    -739             baselinePos : 0,
    -740 
    -741             addElement : function( element ) {
    -742                 this.width= Math.max( this.width, element.x + element.width );
    -743                 this.height= Math.max( this.height, element.height );
    -744                 this.elements.push( element );
    -745                 this.alignment= element.style.__getProperty("alignment");
    -746             },
    -747 
    -748             addElementImage : function( element ) {
    -749                 this.width= Math.max( this.width, element.x + element.width );
    -750                 this.height= Math.max( this.height, element.height );
    -751                 this.elements.push( element );
    -752             },
    -753 
    -754             getHeight : function() {
    -755                 return this.height;
    -756             },
    -757 
    -758             setY : function( y ) {
    -759                 this.y= y;
    -760             },
    -761 
    -762             getY : function() {
    -763                 return this.y;
    -764             },
    -765 
    -766             paint : function( ctx ) {
    -767                 ctx.save();
    -768                 ctx.translate(this.x,this.y + this.baselinePos );
    -769 
    -770                 for( var i=0; i<this.elements.length; i++ ) {
    -771                     this.elements[i].paint(ctx);
    -772                 }
    -773 
    -774                 ctx.restore();
    -775 
    -776             },
    -777 
    -778             setAlignment : function( width ) {
    -779                 var j;
    -780 
    -781                 if ( this.alignment==="center" ) {
    -782                     this.x= (width - this.width)/2;
    -783                 } else if ( this.alignment==="right" ) {
    -784                     this.x= width - this.width;
    -785                 } else if ( this.alignment==="justify" ) {
    -786 
    -787                     // justify: only when text overflows further than document's 80% width
    -788                     if ( this.width / width >= JUSTIFY_RATIO && this.elements.length>1 ) {
    -789                         var remaining= width - this.width;
    -790 
    -791                         var forEachElement= (remaining/(this.elements.length-1))|0;
    -792                         for( j=1; j<this.elements.length ; j++ ) {
    -793                             this.elements[j].x+= j*forEachElement;
    -794                         }
    -795 
    -796                         remaining= width - this.width - forEachElement*(this.elements.length-1);
    -797                         for( j=0; j<remaining; j++ ) {
    -798                             this.elements[this.elements.length-1-j].x+= remaining-j;
    -799                         }
    -800                     }
    -801                 }
    -802             },
    -803 
    -804             adjustHeight : function() {
    -805                 var biggestFont=null;
    -806                 var biggestImage=null;
    -807                 var i;
    -808 
    -809                 for( i=0; i<this.elements.length; i+=1 ) {
    -810                     var elem= this.elements[i];
    -811 
    -812                     var fm= elem.getFontMetrics();
    -813                     if ( null!=fm ) {           // gest a fontMetrics, is a DocumentElementText (text)
    -814                         if ( !biggestFont ) {
    -815                             biggestFont= fm;
    -816                         } else {
    -817                             if ( fm.ascent > biggestFont.ascent ) {
    -818                                 biggestFont= fm;
    -819                             }
    -820                         }
    -821                     } else {                    // no FontMetrics, it is an image.
    -822                         if (!biggestImage) {
    -823                             biggestImage= elem;
    -824                         } else {
    -825                             if ( elem.getHeight() > elem.getHeight() ) {
    -826                                 biggestImage= elem;
    -827                             }
    -828                         }
    -829                     }
    -830                 }
    -831 
    -832                 this.baselinePos= Math.max(
    -833                     biggestFont ? biggestFont.ascent : this.defaultFontMetrics.ascent,
    -834                     biggestImage ? biggestImage.getHeight() : this.defaultFontMetrics.ascent );
    -835                 this.height= this.baselinePos + (biggestFont!=null ? biggestFont.descent : this.defaultFontMetrics.descent );
    -836 
    -837                 for( i=0; i<this.elements.length; i++ ) {
    -838                     this.elements[i].setYPosition( this.baselinePos );
    -839                 }
    -840 
    -841                 return this.height;
    -842             },
    -843 
    -844             /**
    -845              * Every element is positioned at line's baseline.
    -846              * @param x
    -847              * @param y
    -848              * @private
    -849              */
    -850             __getElementAt : function( x, y ) {
    -851                 for( var i=0; i<this.elements.length; i++ ) {
    -852                     var elem= this.elements[i];
    -853                     if ( elem.contains(x,y) ) {
    -854                         return elem;
    -855                     }
    -856                 }
    -857 
    -858                 return null;
    -859             }
    -860         };
    -861 
    -862         return {
    -863 
    -864             /**
    -865              * @lends CAAT.Foundation.UI.Label.prototype
    -866              */
    -867 
    -868 
    -869             __init : function() {
    -870                 this.__super();
    -871 
    -872                 this.rc= new renderContext();
    -873                 this.lines= [];
    -874                 this.styles= {};
    -875                 this.images= {};
    -876 
    -877                 return this;
    -878             },
    -879 
    -880             /**
    -881              * This Label document´s horizontal alignment.
    -882              * @type {CAAT.Foundation.UI.Layout.LayoutManager}
    -883              * @private
    -884              */
    -885             halignment  :   CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.LEFT,
    -886 
    -887             /**
    -888              * This Label document´s vertical alignment.
    -889              * @type {CAAT.Foundation.UI.Layout.LayoutManager}
    -890              * @private
    -891              */
    -892             valignment  :   CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.TOP,
    -893 
    -894             /**
    -895              * This label text.
    -896              * @type {string}
    -897              * @private
    -898              */
    -899             text        :   null,
    -900 
    -901             /**
    -902              * This label document´s render context
    -903              * @type {RenderContext}
    -904              * @private
    -905              */
    -906             rc          :   null,
    -907 
    -908             /**
    -909              * Styles object.
    -910              * @private
    -911              */
    -912             styles      :   null,
    -913 
    -914             /**
    -915              * Calculated document width.
    -916              * @private
    -917              */
    -918             documentWidth   : 0,
    -919 
    -920             /**
    -921              * Calculated document Height.
    -922              * @private
    -923              */
    -924             documentHeight  : 0,
    -925 
    -926             /**
    -927              * Document x position.
    -928              * @private
    -929              */
    -930             documentX       : 0,
    -931 
    -932             /**
    -933              * Document y position.
    -934              * @private
    -935              */
    -936             documentY       : 0,
    -937 
    -938             /**
    -939              * Does this label document flow ?
    -940              * @private
    -941              */
    -942             reflow      :   true,
    -943 
    -944             /**
    -945              * Collection of text lines calculated for the label.
    -946              * @private
    -947              */
    -948             lines       :   null,   // calculated elements lines...
    -949 
    -950             /**
    -951              * Collection of image objects in this label´s document.
    -952              * @private
    -953              */
    -954             images      :   null,
    -955 
    -956             /**
    -957              * Registered callback to notify on anchor click event.
    -958              * @private
    -959              */
    -960             clickCallback   : null,
    -961 
    -962             matchTextSize : true,
    -963 
    -964             /**
    -965              * Make the label actor the size the label document has been calculated for.
    -966              * @param match {boolean}
    -967              */
    -968             setMatchTextSize : function( match ) {
    -969                 this.matchTextSize= match;
    -970                 if ( match ) {
    -971                     this.width= this.preferredSize.width;
    -972                     this.height= this.preferredSize.height;
    -973                 }
    -974             },
    -975 
    -976             setStyle : function( name, styleData ) {
    -977                 this.styles[ name ]= styleData;
    -978                 return this;
    -979             },
    -980 
    -981             addImage : function( name, spriteImage ) {
    -982                 this.images[ name ]= spriteImage;
    -983                 return this;
    -984             },
    -985 
    -986             setSize : function(w,h) {
    -987                 CAAT.Foundation.UI.Label.superclass.setSize.call( this, w, h );
    -988                 this.setText( this.text, this.width );
    -989                 return this;
    -990             },
    -991 
    -992             setBounds : function( x,y,w,h ) {
    -993                 CAAT.Foundation.UI.Label.superclass.setBounds.call( this,x,y,w,h );
    -994                 this.setText( this.text, this.width );
    -995                 return this;
    -996             },
    -997 
    -998             setText : function( _text, width ) {
    -999 
    -1000                 if ( null===_text ) {
    -1001                    return;
    -1002                 }
    -1003 
    -1004                 var cached= this.cached;
    -1005                 if ( cached ) {
    -1006                     this.stopCacheAsBitmap();
    -1007                 }
    -1008 
    -1009                 this.documentWidth= 0;
    -1010                 this.documentHeight= 0;
    -1011 
    -1012                 this.text= _text;
    -1013 
    -1014                 var i, l, text;
    -1015                 var tag_closes_at_pos, tag;
    -1016                 var _char;
    -1017                 var ctx= CAAT.currentDirector.ctx;
    -1018                 ctx.save();
    -1019 
    -1020                 text= this.text;
    -1021 
    -1022                 i=0;
    -1023                 l=text.length;
    -1024 
    -1025                 this.rc.start( ctx, this.styles, this.images, width );
    -1026 
    -1027                 while( i<l ) {
    -1028                     _char= text.charAt(i);
    -1029 
    -1030                     if ( _char==='\\' ) {
    -1031                         i+=1;
    -1032                         this.rc.fchar( text.charAt(i) );
    -1033                         i+=1;
    -1034 
    -1035                     } else if ( _char==='<' ) {   // try an enhancement.
    -1036 
    -1037                         // try finding another '>' and see whether it matches a tag
    -1038                         tag_closes_at_pos= text.indexOf('>', i+1);
    -1039                         if ( -1!==tag_closes_at_pos ) {
    -1040                             tag= text.substr( i+1, tag_closes_at_pos-i-1 );
    -1041                             if ( tag.indexOf("<")!==-1 ) {
    -1042                                 this.rc.fchar( _char );
    -1043                                 i+=1;
    -1044                             } else {
    -1045                                 this.rc.setTag( tag );
    -1046                                 i= tag_closes_at_pos+1;
    -1047                             }
    -1048                         }
    -1049                     } else {
    -1050                         this.rc.fchar( _char );
    -1051                         i+= 1;
    -1052                     }
    -1053                 }
    -1054 
    -1055                 this.rc.end();
    -1056                 this.lines= this.rc.lines;
    -1057 
    -1058                 this.__calculateDocumentDimension( typeof width==="undefined" ? 0 : width );
    -1059                 this.setLinesAlignment();
    -1060 
    -1061                 ctx.restore();
    -1062 
    -1063                 this.setPreferredSize( this.documentWidth, this.documentHeight );
    -1064                 this.invalidateLayout();
    -1065 
    -1066                 this.setDocumentPosition();
    -1067 
    -1068                 if ( cached ) {
    -1069                     this.cacheAsBitmap(0,cached);
    -1070                 }
    -1071 
    -1072                 if ( this.matchTextSize ) {
    -1073                     this.width= this.preferredSize.width;
    -1074                     this.height= this.preferredSize.height;
    -1075                 }
    -1076 
    -1077                 return this;
    -1078             },
    -1079 
    -1080             setVerticalAlignment : function( align ) {
    -1081                 this.valignment= align;
    -1082                 this.setDocumentPosition();
    -1083                 return this;
    -1084             },
    -1085 
    -1086             setHorizontalAlignment : function( align ) {
    -1087                 this.halignment= align;
    -1088                 this.setDocumentPosition();
    -1089                 return this;
    -1090             },
    -1091 
    -1092             setDocumentPosition : function( halign, valign ) {
    -1093 
    -1094                 if ( typeof halign!=="undefined" ) {
    -1095                     this.setHorizontalAlignment(halign);
    -1096                 }
    -1097                 if ( typeof valign!=="undefined" ) {
    -1098                     this.setVerticalAlignment(valign);
    -1099                 }
    -1100 
    -1101                 var xo=0, yo=0;
    -1102 
    -1103                 if ( this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER ) {
    -1104                     yo= (this.height - this.documentHeight )/2;
    -1105                 } else if ( this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.BOTTOM ) {
    -1106                     yo= this.height - this.documentHeight;
    -1107                 }
    -1108 
    -1109                 if ( this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER ) {
    -1110                     xo= (this.width - this.documentWidth )/2;
    -1111                 } else if ( this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.RIGHT ) {
    -1112                     xo= this.width - this.documentWidth;
    -1113                 }
    -1114 
    -1115                 this.documentX= xo;
    -1116                 this.documentY= yo;
    -1117             },
    -1118 
    -1119             __calculateDocumentDimension : function( suggestedWidth ) {
    -1120                 var i;
    -1121                 var y= 0;
    -1122 
    -1123                 this.documentWidth= 0;
    -1124                 this.documentHeight= 0;
    -1125                 for( i=0; i<this.lines.length; i++ ) {
    -1126                     this.lines[i].y =y;
    -1127                     this.documentWidth= Math.max( this.documentWidth, this.lines[i].width );
    -1128                     this.documentHeight+= this.lines[i].adjustHeight();
    -1129                     y+= this.lines[i].getHeight();
    -1130                 }
    -1131 
    -1132                 this.documentWidth= Math.max( this.documentWidth, suggestedWidth );
    -1133 
    -1134                 return this;
    -1135             },
    -1136 
    -1137             setLinesAlignment : function() {
    -1138 
    -1139                 for( var i=0; i<this.lines.length; i++ ) {
    -1140                     this.lines[i].setAlignment( this.documentWidth )
    -1141                 }
    -1142             },
    -1143 
    -1144             paint : function( director, time ) {
    -1145 
    -1146                 if ( this.cached===CAAT.Foundation.Actor.CACHE_NONE ) {
    -1147                     var ctx= director.ctx;
    -1148 
    -1149                     ctx.save();
    -1150 
    -1151                     ctx.textBaseline="alphabetic";
    -1152                     ctx.translate( this.documentX, this.documentY );
    -1153 
    -1154                     for( var i=0; i<this.lines.length; i++ ) {
    -1155                         var line= this.lines[i];
    -1156                         line.paint( director.ctx );
    -1157 
    -1158                         if ( DEBUG ) {
    -1159                             ctx.strokeRect( line.x, line.y, line.width, line.height );
    -1160                         }
    -1161                     }
    -1162 
    -1163                     ctx.restore();
    -1164                 } else {
    -1165                     if ( this.backgroundImage ) {
    -1166                         this.backgroundImage.paint(director,time,0,0);
    -1167                     }
    -1168                 }
    -1169             },
    -1170 
    -1171             __getDocumentElementAt : function( x, y ) {
    -1172 
    -1173                 x-= this.documentX;
    -1174                 y-= this.documentY;
    -1175 
    -1176                 for( var i=0; i<this.lines.length; i++ ) {
    -1177                     var line= this.lines[i];
    -1178 
    -1179                     if ( line.x<=x && line.y<=y && line.x+line.width>=x && line.y+line.height>=y ) {
    -1180                         return line.__getElementAt( x - line.x, y - line.y );
    -1181                     }
    -1182                 }
    -1183 
    -1184                 return null;
    -1185             },
    -1186 
    -1187             mouseExit : function(e) {
    -1188                 CAAT.setCursor( "default");
    -1189             },
    -1190 
    -1191             mouseMove : function(e) {
    -1192                 var elem= this.__getDocumentElementAt(e.x, e.y);
    -1193                 if ( elem && elem.getLink() ) {
    -1194                     CAAT.setCursor( "pointer");
    -1195                 } else {
    -1196                     CAAT.setCursor( "default");
    -1197                 }
    -1198             },
    -1199 
    -1200             mouseClick : function(e) {
    -1201                 if ( this.clickCallback ) {
    -1202                     var elem= this.__getDocumentElementAt(e.x, e.y);
    -1203                     if ( elem.getLink() ) {
    -1204                         this.clickCallback( elem.getLink() );
    -1205                     }
    -1206                 }
    -1207             },
    -1208 
    -1209             setClickCallback : function( callback ) {
    -1210                 this.clickCallback= callback;
    -1211                 return this;
    -1212             }
    -1213         }
    -1214 
    -1215     }
    -1216 
    -1217 });
    -1218 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BorderLayout.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BorderLayout.js.html deleted file mode 100644 index 612c419e..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BorderLayout.js.html +++ /dev/null @@ -1,226 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name BorderLayout
    -  5      * @memberOf CAAT.Foundation.UI.Layout
    -  6      * @extends CAAT.Foundation.UI.Layout.LayoutManager
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.Foundation.UI.Layout.BorderLayout",
    - 11     aliases : ["CAAT.UI.BorderLayout"],
    - 12     depends : [
    - 13         "CAAT.Foundation.UI.Layout.LayoutManager",
    - 14         "CAAT.Math.Dimension"
    - 15     ],
    - 16     extendsClass : "CAAT.Foundation.UI.Layout.LayoutManager",
    - 17     extendsWith : {
    - 18 
    - 19         /**
    - 20          * @lends CAAT.Foundation.UI.Layout.BorderLayout.prototype
    - 21          */
    - 22 
    - 23 
    - 24         __init : function() {
    - 25             this.__super();
    - 26             return this;
    - 27         },
    - 28 
    - 29         /**
    - 30          * An actor to position left.
    - 31          */
    - 32         left    : null,
    - 33 
    - 34         /**
    - 35          * An actor to position right.
    - 36          */
    - 37         right   : null,
    - 38 
    - 39         /**
    - 40          * An actor to position top.
    - 41          */
    - 42         top     : null,
    - 43 
    - 44         /**
    - 45          * An actor to position botton.
    - 46          */
    - 47         bottom  : null,
    - 48 
    - 49         /**
    - 50          * An actor to position center.
    - 51          */
    - 52         center  : null,
    - 53 
    - 54         addChild : function( child, constraint ) {
    - 55 
    - 56             if ( typeof constraint==="undefined" ) {
    - 57                 constraint="center";
    - 58             }
    - 59 
    - 60             CAAT.Foundation.UI.Layout.BorderLayout.superclass.addChild.call( this, child, constraint );
    - 61 
    - 62             if ( constraint==="left" ) {
    - 63                 this.left= child;
    - 64             } else if ( constraint==="right" ) {
    - 65                 this.right= child;
    - 66             } else if ( constraint==="top" ) {
    - 67                 this.top= child;
    - 68             } else if ( constraint==="bottom" ) {
    - 69                 this.bottom= child;
    - 70             } else {
    - 71                 //"center"
    - 72                 this.center= child;
    - 73             }
    - 74         },
    - 75 
    - 76         removeChild : function( child ) {
    - 77             if ( this.center===child ) {
    - 78                 this.center=null;
    - 79             } else if ( this.left===child ) {
    - 80                 this.left= null;
    - 81             } else if ( this.right===child ) {
    - 82                 this.right= null;
    - 83             } else if ( this.top===child ) {
    - 84                 this.top= null;
    - 85             } else if ( this.bottom===child ) {
    - 86                 this.bottom= null;
    - 87             }
    - 88         },
    - 89 
    - 90         __getChild : function( constraint ) {
    - 91             if ( constraint==="center" ) {
    - 92                 return this.center;
    - 93             } else if ( constraint==="left" ) {
    - 94                 return this.left;
    - 95             } else if ( constraint==="right" ) {
    - 96                 return this.right;
    - 97             } else if ( constraint==="top" ) {
    - 98                 return this.top;
    - 99             } else if ( constraint==="bottom" ) {
    -100                 return this.bottom;
    -101             }
    -102         },
    -103 
    -104         getMinimumLayoutSize : function( container ) {
    -105             var c, d;
    -106             var dim= new CAAT.Math.Dimension();
    -107 
    -108             if ((c=this.__getChild("right")) != null) {
    -109                 d = c.getMinimumSize();
    -110                 dim.width += d.width + this.hgap;
    -111                 dim.height = Math.max(d.height, dim.height);
    -112             }
    -113             if ((c=this.__getChild("left")) != null) {
    -114                 d = c.getMinimumSize();
    -115                 dim.width += d.width + this.hgap;
    -116                 dim.height = Math.max(d.height, dim.height);
    -117             }
    -118             if ((c=this.__getChild("center")) != null) {
    -119                 d = c.getMinimumSize();
    -120                 dim.width += d.width;
    -121                 dim.height = Math.max(d.height, dim.height);
    -122             }
    -123             if ((c=this.__getChild("top")) != null) {
    -124                 d = c.getMinimumSize();
    -125                 dim.width = Math.max(d.width, dim.width);
    -126                 dim.height += d.height + this.vgap;
    -127             }
    -128             if ((c=this.__getChild("bottom")) != null) {
    -129                 d = c.getMinimumSize();
    -130                 dim.width = Math.max(d.width, dim.width);
    -131                 dim.height += d.height + this.vgap;
    -132             }
    -133 
    -134             dim.width += this.padding.left + this.padding.right;
    -135             dim.height += this.padding.top + this.padding.bottom;
    -136 
    -137             return dim;
    -138         },
    -139 
    -140         getPreferredLayoutSize : function( container ) {
    -141             var c, d;
    -142             var dim= new CAAT.Dimension();
    -143 
    -144             if ((c=this.__getChild("left")) != null) {
    -145                 d = c.getPreferredSize();
    -146                 dim.width += d.width + this.hgap;
    -147                 dim.height = Math.max(d.height, dim.height);
    -148             }
    -149             if ((c=this.__getChild("right")) != null) {
    -150                 d = c.getPreferredSize();
    -151                 dim.width += d.width + this.hgap;
    -152                 dim.height = Math.max(d.height, dim.height);
    -153             }
    -154             if ((c=this.__getChild("center")) != null) {
    -155                 d = c.getPreferredSize();
    -156                 dim.width += d.width;
    -157                 dim.height = Math.max(d.height, dim.height);
    -158             }
    -159             if ((c=this.__getChild("top")) != null) {
    -160                 d = c.getPreferredSize();
    -161                 dim.width = Math.max(d.width, dim.width);
    -162                 dim.height += d.height + this.vgap;
    -163             }
    -164             if ((c=this.__getChild("bottom")) != null) {
    -165                 d = c.getPreferredSize();
    -166                 dim.width = Math.max(d.width, dim.width);
    -167                 dim.height += d.height + this.vgap;
    -168             }
    -169 
    -170             dim.width += this.padding.left + this.padding.right;
    -171             dim.height += this.padding.top + this.padding.bottom;
    -172 
    -173             return dim;
    -174         },
    -175 
    -176         doLayout : function( container ) {
    -177 
    -178             var top = this.padding.top;
    -179             var bottom = container.height - this.padding.bottom;
    -180             var left = this.padding.left;
    -181             var right = container.width - this.padding.right;
    -182             var c, d;
    -183 
    -184             if ((c=this.__getChild("top")) != null) {
    -185                 c.setSize(right - left, c.height);
    -186                 d = c.getPreferredSize();
    -187                 c.setBounds(left, top, right - left, d.height);
    -188                 top += d.height + this.vgap;
    -189             }
    -190             if ((c=this.__getChild("bottom")) != null) {
    -191                 c.setSize(right - left, c.height);
    -192                 d = c.getPreferredSize();
    -193                 c.setBounds(left, bottom - d.height, right - left, d.height);
    -194                 bottom -= d.height + this.vgap;
    -195             }
    -196             if ((c=this.__getChild("right")) != null) {
    -197                 c.setSize(c.width, bottom - top);
    -198                 d = c.getPreferredSize();
    -199                 c.setBounds(right - d.width, top, d.width, bottom - top);
    -200                 right -= d.width + this.hgap;
    -201             }
    -202             if ((c=this.__getChild("left")) != null) {
    -203                 c.setSize(c.width, bottom - top);
    -204                 d = c.getPreferredSize();
    -205                 c.setBounds(left, top, d.width, bottom - top);
    -206                 left += d.width + this.hgap;
    -207             }
    -208             if ((c=this.__getChild("center")) != null) {
    -209                 c.setBounds(left, top, right - left, bottom - top);
    -210             }
    -211 
    -212             CAAT.Foundation.UI.Layout.BorderLayout.superclass.doLayout.call(this, container);
    -213         }
    -214 
    -215 
    -216     }
    -217 
    -218 });
    -219 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BoxLayout.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BoxLayout.js.html deleted file mode 100644 index 4f49cbfa..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BoxLayout.js.html +++ /dev/null @@ -1,255 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name BoxLayout
    -  5      * @memberOf CAAT.Foundation.UI.Layout
    -  6      * @extends CAAT.Foundation.UI.Layout.LayoutManager
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines:"CAAT.Foundation.UI.Layout.BoxLayout",
    - 11     aliases:["CAAT.UI.BoxLayout"],
    - 12     depends:[
    - 13         "CAAT.Foundation.UI.Layout.LayoutManager",
    - 14         "CAAT.Math.Dimension"
    - 15     ],
    - 16     extendsClass:"CAAT.Foundation.UI.Layout.LayoutManager",
    - 17     extendsWith:function () {
    - 18 
    - 19         return {
    - 20 
    - 21             /**
    - 22              * @lends CAAT.Foundation.UI.Layout.BoxLayout.prototype
    - 23              */
    - 24 
    - 25             /**
    - 26              * Stack elements in this axis.
    - 27              * @type {CAAT.Foundation.UI.Layout.LayoutManager}
    - 28              */
    - 29             axis:CAAT.Foundation.UI.Layout.LayoutManager.AXIS.Y,
    - 30 
    - 31             /**
    - 32              * Vertical alignment.
    - 33              * @type {CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT}
    - 34              */
    - 35             valign:CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER,
    - 36 
    - 37             /**
    - 38              * Horizontal alignment.
    - 39              * @type {CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT}
    - 40              */
    - 41             halign:CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER,
    - 42 
    - 43             setAxis:function (axis) {
    - 44                 this.axis = axis;
    - 45                 this.invalidateLayout();
    - 46                 return this;
    - 47             },
    - 48 
    - 49             setHorizontalAlignment:function (align) {
    - 50                 this.halign = align;
    - 51                 this.invalidateLayout();
    - 52                 return this;
    - 53             },
    - 54 
    - 55             setVerticalAlignment:function (align) {
    - 56                 this.valign = align;
    - 57                 this.invalidateLayout();
    - 58                 return this;
    - 59             },
    - 60 
    - 61             doLayout:function (container) {
    - 62 
    - 63                 if (this.axis === CAAT.Foundation.UI.Layout.LayoutManager.AXIS.Y) {
    - 64                     this.doLayoutVertical(container);
    - 65                 } else {
    - 66                     this.doLayoutHorizontal(container);
    - 67                 }
    - 68 
    - 69                 CAAT.Foundation.UI.Layout.BoxLayout.superclass.doLayout.call(this, container);
    - 70             },
    - 71 
    - 72             doLayoutHorizontal:function (container) {
    - 73 
    - 74                 var computedW = 0, computedH = 0;
    - 75                 var yoffset = 0, xoffset;
    - 76                 var i, l, actor;
    - 77 
    - 78                 // calculamos ancho y alto de los elementos.
    - 79                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    - 80 
    - 81                     actor = container.getChildAt(i);
    - 82                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    - 83                         if (computedH < actor.height) {
    - 84                             computedH = actor.height;
    - 85                         }
    - 86 
    - 87                         computedW += actor.width;
    - 88                         if (i > 0) {
    - 89                             computedW += this.hgap;
    - 90                         }
    - 91                     }
    - 92                 }
    - 93 
    - 94                 switch (this.halign) {
    - 95                     case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.LEFT:
    - 96                         xoffset = this.padding.left;
    - 97                         break;
    - 98                     case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.RIGHT:
    - 99                         xoffset = container.width - computedW - this.padding.right;
    -100                         break;
    -101                     default:
    -102                         xoffset = (container.width - computedW) / 2;
    -103                 }
    -104 
    -105                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    -106                     actor = container.getChildAt(i);
    -107                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    -108                         switch (this.valign) {
    -109                             case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.TOP:
    -110                                 yoffset = this.padding.top;
    -111                                 break;
    -112                             case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.BOTTOM:
    -113                                 yoffset = container.height - this.padding.bottom - actor.height;
    -114                                 break;
    -115                             default:
    -116                                 yoffset = (container.height - actor.height) / 2;
    -117                         }
    -118 
    -119                         this.__setActorPosition(actor, xoffset, yoffset);
    -120 
    -121                         xoffset += actor.width + this.hgap;
    -122                     }
    -123                 }
    -124 
    -125             },
    -126 
    -127             __setActorPosition:function (actor, xoffset, yoffset) {
    -128                 if (this.animated) {
    -129                     if (this.newChildren.indexOf(actor) !== -1) {
    -130                         actor.setPosition(xoffset, yoffset);
    -131                         actor.setScale(0, 0);
    -132                         actor.scaleTo(1, 1, 500, 0, .5, .5, this.newElementInterpolator);
    -133                     } else {
    -134                         actor.moveTo(xoffset, yoffset, 500, 0, this.moveElementInterpolator);
    -135                     }
    -136                 } else {
    -137                     actor.setPosition(xoffset, yoffset);
    -138                 }
    -139             },
    -140 
    -141             doLayoutVertical:function (container) {
    -142 
    -143                 var computedW = 0, computedH = 0;
    -144                 var yoffset, xoffset;
    -145                 var i, l, actor;
    -146 
    -147                 // calculamos ancho y alto de los elementos.
    -148                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    -149 
    -150                     actor = container.getChildAt(i);
    -151                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    -152                         if (computedW < actor.width) {
    -153                             computedW = actor.width;
    -154                         }
    -155 
    -156                         computedH += actor.height;
    -157                         if (i > 0) {
    -158                             computedH += this.vgap;
    -159                         }
    -160                     }
    -161                 }
    -162 
    -163                 switch (this.valign) {
    -164                     case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.TOP:
    -165                         yoffset = this.padding.top;
    -166                         break;
    -167                     case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.BOTTOM:
    -168                         yoffset = container.height - computedH - this.padding.bottom;
    -169                         break;
    -170                     default:
    -171                         yoffset = (container.height - computedH) / 2;
    -172                 }
    -173 
    -174                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    -175                     actor = container.getChildAt(i);
    -176                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    -177                         switch (this.halign) {
    -178                             case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.LEFT:
    -179                                 xoffset = this.padding.left;
    -180                                 break;
    -181                             case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.RIGHT:
    -182                                 xoffset = container.width - this.padding.right - actor.width;
    -183                                 break;
    -184                             default:
    -185                                 xoffset = (container.width - actor.width) / 2;
    -186                         }
    -187 
    -188                         this.__setActorPosition(actor, xoffset, yoffset);
    -189 
    -190                         yoffset += actor.height + this.vgap;
    -191                     }
    -192                 }
    -193             },
    -194 
    -195             getPreferredLayoutSize:function (container) {
    -196 
    -197                 var dim = new CAAT.Math.Dimension();
    -198                 var computedW = 0, computedH = 0;
    -199                 var i, l;
    -200 
    -201                 // calculamos ancho y alto de los elementos.
    -202                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    -203 
    -204                     var actor = container.getChildAt(i);
    -205                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    -206                         var ps = actor.getPreferredSize();
    -207 
    -208                         if (computedH < ps.height) {
    -209                             computedH = ps.height;
    -210                         }
    -211                         computedW += ps.width;
    -212                     }
    -213                 }
    -214 
    -215                 dim.width = computedW;
    -216                 dim.height = computedH;
    -217 
    -218                 return dim;
    -219             },
    -220 
    -221             getMinimumLayoutSize:function (container) {
    -222                 var dim = new CAAT.Math.Dimension();
    -223                 var computedW = 0, computedH = 0;
    -224                 var i, l;
    -225 
    -226                 // calculamos ancho y alto de los elementos.
    -227                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    -228 
    -229                     var actor = container.getChildAt(i);
    -230                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    -231                         var ps = actor.getMinimumSize();
    -232 
    -233                         if (computedH < ps.height) {
    -234                             computedH = ps.height;
    -235                         }
    -236                         computedW += ps.width;
    -237                     }
    -238                 }
    -239 
    -240                 dim.width = computedW;
    -241                 dim.height = computedH;
    -242 
    -243                 return dim;
    -244             }
    -245         }
    -246     }
    -247 });
    -248 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_GridLayout.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_GridLayout.js.html deleted file mode 100644 index fafe6f2d..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_GridLayout.js.html +++ /dev/null @@ -1,186 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name GridLayout
    -  5      * @memberOf CAAT.Foundation.UI.Layout
    -  6      * @extends CAAT.Foundation.UI.Layout.LayoutManager
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.Foundation.UI.Layout.GridLayout",
    - 11     aliases : ["CAAT.UI.GridLayout"],
    - 12     depends : [
    - 13         "CAAT.Foundation.UI.Layout.LayoutManager",
    - 14         "CAAT.Math.Dimension"
    - 15     ],
    - 16     extendsClass : "CAAT.Foundation.UI.Layout.LayoutManager",
    - 17     extendsWith : {
    - 18 
    - 19         /**
    - 20          * @lends CAAT.Foundation.UI.Layout.GridLayout.prototype
    - 21          */
    - 22 
    - 23         __init : function( rows, columns ) {
    - 24             this.__super();
    - 25             this.rows= rows;
    - 26             this.columns= columns;
    - 27 
    - 28             return this;
    - 29         },
    - 30 
    - 31         /**
    - 32          * Layout elements using this number of rows.
    - 33          */
    - 34         rows    : 0,
    - 35 
    - 36         /**
    - 37          * Layout elements using this number of columns.
    - 38          */
    - 39         columns : 2,
    - 40 
    - 41         doLayout : function( container ) {
    - 42 
    - 43             var actors= [];
    - 44             for( var i=0; i<container.getNumChildren(); i++ ) {
    - 45                 var child= container.getChildAt(i);
    - 46                 if (!child.preventLayout && child.isVisible() && child.isInAnimationFrame( CAAT.getCurrentSceneTime()) ) {
    - 47                     actors.push(child);
    - 48                 }
    - 49             }
    - 50             var nactors= actors.length;
    - 51 
    - 52             if (nactors.length=== 0) {
    - 53                 return;
    - 54             }
    - 55 
    - 56             var nrows = this.rows;
    - 57             var ncols = this.columns;
    - 58 
    - 59             if (nrows > 0) {
    - 60                 ncols = Math.floor( (nactors + nrows - 1) / nrows );
    - 61             } else {
    - 62                 nrows = Math.floor( (nactors + ncols - 1) / ncols );
    - 63             }
    - 64 
    - 65             var totalGapsWidth = (ncols - 1) * this.hgap;
    - 66             var widthWOInsets = container.width - (this.padding.left + this.padding.right);
    - 67             var widthOnComponent = Math.floor( (widthWOInsets - totalGapsWidth) / ncols );
    - 68             var extraWidthAvailable = Math.floor( (widthWOInsets - (widthOnComponent * ncols + totalGapsWidth)) / 2 );
    - 69 
    - 70             var totalGapsHeight = (nrows - 1) * this.vgap;
    - 71             var heightWOInsets = container.height - (this.padding.top + this.padding.bottom);
    - 72             var heightOnComponent = Math.floor( (heightWOInsets - totalGapsHeight) / nrows );
    - 73             var extraHeightAvailable = Math.floor( (heightWOInsets - (heightOnComponent * nrows + totalGapsHeight)) / 2 );
    - 74 
    - 75             for (var c = 0, x = this.padding.left + extraWidthAvailable; c < ncols ; c++, x += widthOnComponent + this.hgap) {
    - 76                 for (var r = 0, y = this.padding.top + extraHeightAvailable; r < nrows ; r++, y += heightOnComponent + this.vgap) {
    - 77                     var i = r * ncols + c;
    - 78                     if (i < actors.length) {
    - 79                         var child= actors[i];
    - 80                         if ( !child.preventLayout && child.isVisible() && child.isInAnimationFrame( CAAT.getCurrentSceneTime() ) ) {
    - 81                             if ( !this.animated ) {
    - 82                                 child.setBounds(
    - 83                                     x + (widthOnComponent-child.width)/2,
    - 84                                     y,
    - 85                                     widthOnComponent,
    - 86                                     heightOnComponent);
    - 87                             } else {
    - 88                                 if ( child.width!==widthOnComponent || child.height!==heightOnComponent ) {
    - 89                                     child.setSize(widthOnComponent, heightOnComponent);
    - 90                                     if ( this.newChildren.indexOf( child ) !==-1 ) {
    - 91                                         child.setPosition(
    - 92                                             x + (widthOnComponent-child.width)/2,
    - 93                                             y );
    - 94                                         child.setScale(0.01,0.01);
    - 95                                         child.scaleTo( 1,1, 500, 0,.5,.5, this.newElementInterpolator );
    - 96                                     } else {
    - 97                                         child.moveTo(
    - 98                                             x + (widthOnComponent-child.width)/2,
    - 99                                             y,
    -100                                             500,
    -101                                             0,
    -102                                             this.moveElementInterpolator );
    -103                                     }
    -104                                 }
    -105                             }
    -106                         }
    -107                     }
    -108                 }
    -109             }
    -110 
    -111             CAAT.Foundation.UI.Layout.GridLayout.superclass.doLayout.call(this, container);
    -112         },
    -113 
    -114         getMinimumLayoutSize : function( container ) {
    -115             var nrows = this.rows;
    -116             var ncols = this.columns;
    -117             var nchildren= container.getNumChildren();
    -118             var w=0, h=0, i;
    -119 
    -120             if (nrows > 0) {
    -121                 ncols = Math.ceil( (nchildren + nrows - 1) / nrows );
    -122             } else {
    -123                 nrows = Math.ceil( (nchildren + ncols - 1) / ncols );
    -124             }
    -125 
    -126             for ( i= 0; i < nchildren; i+=1 ) {
    -127                 var actor= container.getChildAt(i);
    -128                 if ( !actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame( CAAT.getCurrentSceneTime() ) ) {
    -129                     var d = actor.getMinimumSize();
    -130                     if (w < d.width) {
    -131                         w = d.width;
    -132                     }
    -133                     if (h < d.height) {
    -134                         h = d.height;
    -135                     }
    -136                 }
    -137             }
    -138 
    -139             return new CAAT.Math.Dimension(
    -140                 this.padding.left + this.padding.right + ncols * w + (ncols - 1) * this.hgap,
    -141                 this.padding.top + this.padding.bottom + nrows * h + (nrows - 1) * this.vgap
    -142             );
    -143         },
    -144 
    -145         getPreferredLayoutSize : function( container ) {
    -146 
    -147             var nrows = this.rows;
    -148             var ncols = this.columns;
    -149             var nchildren= container.getNumChildren();
    -150             var w=0, h=0, i;
    -151 
    -152             if (nrows > 0) {
    -153                 ncols = Math.ceil( (nchildren + nrows - 1) / nrows );
    -154             } else {
    -155                 nrows = Math.ceil( (nchildren + ncols - 1) / ncols );
    -156             }
    -157 
    -158             for ( i= 0; i < nchildren; i+=1 ) {
    -159                 var actor= container.getChildAt(i);
    -160                 if ( !actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame( CAAT.getCurrentSceneTime() ) ) {
    -161                     var d = actor.getPreferredSize();
    -162                     if (w < d.width) {
    -163                         w = d.width;
    -164                     }
    -165                     if (h < d.height) {
    -166                         h = d.height;
    -167                     }
    -168                 }
    -169             }
    -170 
    -171             return new CAAT.Math.Dimension(
    -172                 this.padding.left + this.padding.right + ncols * w + (ncols - 1) * this.hgap,
    -173                 this.padding.top + this.padding.bottom + nrows * h + (nrows - 1) * this.vgap
    -174             );
    -175         }
    -176 
    -177     }
    -178 });
    -179 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_LayoutManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_LayoutManager.js.html deleted file mode 100644 index 8ccaf7d0..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_LayoutManager.js.html +++ /dev/null @@ -1,187 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name Layout
    -  5      * @memberOf CAAT.Foundation.UI
    -  6      * @namespace
    -  7      */
    -  8 
    -  9     /**
    - 10      * @name LayoutManager
    - 11      * @memberOf CAAT.Foundation.UI.Layout
    - 12      * @constructor
    - 13      */
    - 14 
    - 15     defines : "CAAT.Foundation.UI.Layout.LayoutManager",
    - 16     aliases : ["CAAT.UI.LayoutManager"],
    - 17     depends : [
    - 18         "CAAT.Behavior.Interpolator"
    - 19     ],
    - 20     constants : {
    - 21 
    - 22         /**
    - 23          * @lends CAAT.Foundation.UI.Layout.LayoutManager
    - 24          */
    - 25 
    - 26         /**
    - 27          * @enum {number}
    - 28          */
    - 29         AXIS: {
    - 30             X : 0,
    - 31             Y : 1
    - 32         },
    - 33 
    - 34         /**
    - 35          * @enum {number}
    - 36          */
    - 37         ALIGNMENT : {
    - 38             LEFT :  0,
    - 39             RIGHT:  1,
    - 40             CENTER: 2,
    - 41             TOP:    3,
    - 42             BOTTOM: 4,
    - 43             JUSTIFY:5
    - 44         }
    - 45 
    - 46     },
    - 47     extendsWith : function() {
    - 48 
    - 49         return {
    - 50 
    - 51             /**
    - 52              * @lends CAAT.Foundation.UI.Layout.LayoutManager.prototype
    - 53              */
    - 54 
    - 55 
    - 56             __init : function( ) {
    - 57 
    - 58                 this.newChildren= [];
    - 59                 this.padding= {
    - 60                     left:   2,
    - 61                     right:  2,
    - 62                     top:    2,
    - 63                     bottom: 2
    - 64                 };
    - 65 
    - 66                 return this;
    - 67             },
    - 68 
    - 69             /**
    - 70              * If animation enabled, new element interpolator.
    - 71              */
    - 72             newElementInterpolator : new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.1,.7),
    - 73 
    - 74             /**
    - 75              * If animation enabled, relayout elements interpolator.
    - 76              */
    - 77             moveElementInterpolator : new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(2),
    - 78 
    - 79             /**
    - 80              * Defines insets:
    - 81              * @type {{ left, right, top, botton }}
    - 82              */
    - 83             padding : null,
    - 84 
    - 85             /**
    - 86              * Needs relayout ??
    - 87              */
    - 88             invalid : true,
    - 89 
    - 90             /**
    - 91              * Horizontal gap between children.
    - 92              */
    - 93             hgap        : 2,
    - 94 
    - 95             /**
    - 96              * Vertical gap between children.
    - 97              */
    - 98             vgap        : 2,
    - 99 
    -100             /**
    -101              * Animate on adding/removing elements.
    -102              */
    -103             animated    : false,
    -104 
    -105             /**
    -106              * pending to be laid-out actors.
    -107              */
    -108             newChildren : null,
    -109 
    -110             setAnimated : function( animate ) {
    -111                 this.animated= animate;
    -112                 return this;
    -113             },
    -114 
    -115             setHGap : function( gap ) {
    -116                 this.hgap= gap;
    -117                 this.invalidateLayout();
    -118                 return this;
    -119             },
    -120 
    -121             setVGap : function( gap ) {
    -122                 this.vgap= gap;
    -123                 this.invalidateLayout();
    -124                 return this;
    -125             },
    -126 
    -127             setAllPadding : function( s ) {
    -128                 this.padding.left= s;
    -129                 this.padding.right= s;
    -130                 this.padding.top= s;
    -131                 this.padding.bottom= s;
    -132                 this.invalidateLayout();
    -133                 return this;
    -134             },
    -135 
    -136             setPadding : function( l,r, t,b ) {
    -137                 this.padding.left= l;
    -138                 this.padding.right= r;
    -139                 this.padding.top= t;
    -140                 this.padding.bottom= b;
    -141                 this.invalidateLayout();
    -142                 return this;
    -143             },
    -144 
    -145             addChild : function( child, constraints ) {
    -146                 this.newChildren.push( child );
    -147             },
    -148 
    -149             removeChild : function( child ) {
    -150 
    -151             },
    -152 
    -153             doLayout : function( container ) {
    -154                 this.newChildren= [];
    -155                 this.invalid= false;
    -156             },
    -157 
    -158             invalidateLayout : function( container ) {
    -159                 this.invalid= true;
    -160             },
    -161 
    -162             getMinimumLayoutSize : function( container ) {
    -163 
    -164             },
    -165 
    -166             getPreferredLayoutSize : function(container ) {
    -167 
    -168             },
    -169 
    -170             isValid : function() {
    -171                 return !this.invalid;
    -172             },
    -173 
    -174             isInvalidated : function() {
    -175                 return this.invalid;
    -176             }
    -177         }
    -178     }
    -179 });
    -180 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_PathActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_PathActor.js.html deleted file mode 100644 index c1f9dfdb..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_PathActor.js.html +++ /dev/null @@ -1,167 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * An actor to show the path and its handles in the scene graph. 
    -  5  *
    -  6  **/
    -  7 CAAT.Module( {
    -  8 
    -  9     /**
    - 10      * @name PathActor
    - 11      * @memberOf CAAT.Foundation.UI
    - 12      * @extends CAAT.Foundation.Actor
    - 13      * @constructor
    - 14      */
    - 15 
    - 16     defines : "CAAT.Foundation.UI.PathActor",
    - 17     aliases : ["CAAT.PathActor"],
    - 18     depends : [
    - 19         "CAAT.Foundation.Actor"
    - 20     ],
    - 21     extendsClass : "CAAT.Foundation.Actor",
    - 22     extendsWith : {
    - 23 
    - 24         /**
    - 25          * @lends CAAT.Foundation.UI.PathActor.prototype
    - 26          */
    - 27 
    - 28         /**
    - 29          * Path to draw.
    - 30          * @type {CAAT.PathUtil.Path}
    - 31          */
    - 32 		path                    : null,
    - 33 
    - 34         /**
    - 35          * Calculated path´s bounding box.
    - 36          */
    - 37 		pathBoundingRectangle   : null,
    - 38 
    - 39         /**
    - 40          * draw the bounding rectangle too ?
    - 41          */
    - 42 		bOutline                : false,
    - 43 
    - 44         /**
    - 45          * Outline the path in this color.
    - 46          */
    - 47         outlineColor            : 'black',
    - 48 
    - 49         /**
    - 50          * If the path is interactive, some handlers are shown to modify the path.
    - 51          * This callback function will be called when the path is interactively changed.
    - 52          */
    - 53         onUpdateCallback        : null,
    - 54 
    - 55         /**
    - 56          * Set this path as interactive.
    - 57          */
    - 58         interactive             : false,
    - 59 
    - 60         /**
    - 61          * Return the contained path.
    - 62          * @return {CAAT.Path}
    - 63          */
    - 64         getPath : function() {
    - 65             return this.path;
    - 66         },
    - 67 
    - 68         /**
    - 69          * Sets the path to manage.
    - 70          * @param path {CAAT.PathUtil.PathSegment}
    - 71          * @return this
    - 72          */
    - 73 		setPath : function(path) {
    - 74 			this.path= path;
    - 75             if ( path!=null ) {
    - 76 			    this.pathBoundingRectangle= path.getBoundingBox();
    - 77                 this.setInteractive( this.interactive );
    - 78             }
    - 79             return this;
    - 80 		},
    - 81         /**
    - 82          * Paint this actor.
    - 83          * @param director {CAAT.Foundation.Director}
    - 84          * @param time {number}. Scene time.
    - 85          */
    - 86 		paint : function(director, time) {
    - 87 
    - 88             CAAT.Foundation.UI.PathActor.superclass.paint.call( this, director, time );
    - 89 
    - 90             if ( !this.path ) {
    - 91                 return;
    - 92             }
    - 93 
    - 94             var ctx= director.ctx;
    - 95 
    - 96             ctx.strokeStyle='#000';
    - 97 			this.path.paint(director, this.interactive);
    - 98 
    - 99             if ( this.bOutline ) {
    -100                 ctx.strokeStyle= this.outlineColor;
    -101                 ctx.strokeRect(
    -102                     this.pathBoundingRectangle.x,
    -103                     this.pathBoundingRectangle.y,
    -104                     this.pathBoundingRectangle.width,
    -105                     this.pathBoundingRectangle.height
    -106                 );
    -107             }
    -108 		},
    -109         /**
    -110          * Enables/disables drawing of the contained path's bounding box.
    -111          * @param show {boolean} whether to show the bounding box
    -112          * @param color {=string} optional parameter defining the path's bounding box stroke style.
    -113          */
    -114         showBoundingBox : function(show, color) {
    -115             this.bOutline= show;
    -116             if ( show && color ) {
    -117                 this.outlineColor= color;
    -118             }
    -119             return this;
    -120         },
    -121         /**
    -122          * Set the contained path as interactive. This means it can be changed on the fly by manipulation
    -123          * of its control points.
    -124          * @param interactive
    -125          */
    -126         setInteractive : function(interactive) {
    -127             this.interactive= interactive;
    -128             if ( this.path ) {
    -129                 this.path.setInteractive(interactive);
    -130             }
    -131             return this;
    -132         },
    -133         setOnUpdateCallback : function( fn ) {
    -134             this.onUpdateCallback= fn;
    -135             return this;
    -136         },
    -137         /**
    -138          * Route mouse dragging functionality to the contained path.
    -139          * @param mouseEvent {CAAT.Event.MouseEvent}
    -140          */
    -141 		mouseDrag : function(mouseEvent) {
    -142 			this.path.drag(mouseEvent.point.x, mouseEvent.point.y, this.onUpdateCallback);
    -143 		},
    -144         /**
    -145          * Route mouse down functionality to the contained path.
    -146          * @param mouseEvent {CAAT.Event.MouseEvent}
    -147          */
    -148 		mouseDown : function(mouseEvent) {
    -149 			this.path.press(mouseEvent.point.x, mouseEvent.point.y);
    -150 		},
    -151         /**
    -152          * Route mouse up functionality to the contained path.
    -153          * @param mouseEvent {CAAT.Event.MouseEvent}
    -154          */
    -155 		mouseUp : function(mouseEvent) {
    -156 			this.path.release();
    -157 		}
    -158 	}
    -159 });
    -160 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_ShapeActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_ShapeActor.js.html deleted file mode 100644 index 4147595d..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_ShapeActor.js.html +++ /dev/null @@ -1,235 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name ShapeActor
    -  5      * @memberOf CAAT.Foundation.UI
    -  6      * @extends CAAT.Foundation.ActorContainer
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.Foundation.UI.ShapeActor",
    - 11     aliases : ["CAAT.ShapeActor"],
    - 12     extendsClass : "CAAT.Foundation.ActorContainer",
    - 13     depends : [
    - 14         "CAAT.Foundation.ActorContainer"
    - 15     ],
    - 16     constants : {
    - 17 
    - 18         /**
    - 19          * @lends CAAT.Foundation.UI.ShapeActor
    - 20          */
    - 21 
    - 22         /** @const */ SHAPE_CIRCLE:   0,      // Constants to describe different shapes.
    - 23         /** @const */ SHAPE_RECTANGLE:1
    - 24     },
    - 25     extendsWith : {
    - 26 
    - 27         /**
    - 28          * @lends CAAT.Foundation.UI.ShapeActor.prototype
    - 29          */
    - 30 
    - 31         __init : function() {
    - 32             this.__super();
    - 33             this.compositeOp= 'source-over';
    - 34 
    - 35             /**
    - 36              * Thanks Svend Dutz and Thomas Karolski for noticing this call was not performed by default,
    - 37              * so if no explicit call to setShape was made, nothing would be drawn.
    - 38              */
    - 39             this.setShape( CAAT.Foundation.UI.ShapeActor.SHAPE_CIRCLE );
    - 40             return this;
    - 41         },
    - 42 
    - 43         /**
    - 44          * Define this actor shape: rectangle or circle
    - 45          */
    - 46         shape:          0,      // shape type. One of the constant SHAPE_* values
    - 47 
    - 48         /**
    - 49          * Set this shape composite operation when drawing it.
    - 50          */
    - 51         compositeOp:    null,   // a valid canvas rendering context string describing compositeOps.
    - 52 
    - 53         /**
    - 54          * Stroke the shape with this line width.
    - 55          */
    - 56         lineWidth:      1,
    - 57 
    - 58         /**
    - 59          * Stroke the shape with this line cap.
    - 60          */
    - 61         lineCap:        null,
    - 62 
    - 63         /**
    - 64          * Stroke the shape with this line Join.
    - 65          */
    - 66         lineJoin:       null,
    - 67 
    - 68         /**
    - 69          * Stroke the shape with this line mitter limit.
    - 70          */
    - 71         miterLimit:     null,
    - 72 
    - 73         /**
    - 74          * 
    - 75          * @param l {number>0}
    - 76          */
    - 77         setLineWidth : function(l)  {
    - 78             this.lineWidth= l;
    - 79             return this;
    - 80         },
    - 81         /**
    - 82          *
    - 83          * @param lc {string{butt|round|square}}
    - 84          */
    - 85         setLineCap : function(lc)   {
    - 86             this.lineCap= lc;
    - 87             return this;
    - 88         },
    - 89         /**
    - 90          *
    - 91          * @param lj {string{bevel|round|miter}}
    - 92          */
    - 93         setLineJoin : function(lj)  {
    - 94             this.lineJoin= lj;
    - 95             return this;
    - 96         },
    - 97         /**
    - 98          *
    - 99          * @param ml {integer>0}
    -100          */
    -101         setMiterLimit : function(ml)    {
    -102             this.miterLimit= ml;
    -103             return this;
    -104         },
    -105         getLineCap : function() {
    -106             return this.lineCap;
    -107         },
    -108         getLineJoin : function()    {
    -109             return this.lineJoin;
    -110         },
    -111         getMiterLimit : function()  {
    -112             return this.miterLimit;
    -113         },
    -114         getLineWidth : function()   {
    -115             return this.lineWidth;
    -116         },
    -117         /**
    -118          * Sets shape type.
    -119          * No check for parameter validity is performed.
    -120          * Set paint method according to the shape.
    -121          * @param iShape an integer with any of the SHAPE_* constants.
    -122          * @return this
    -123          */
    -124         setShape : function(iShape) {
    -125             this.shape= iShape;
    -126             this.paint= this.shape===CAAT.Foundation.UI.ShapeActor.SHAPE_CIRCLE ?
    -127                     this.paintCircle :
    -128                     this.paintRectangle;
    -129             return this;
    -130         },
    -131         /**
    -132          * Sets the composite operation to apply on shape drawing.
    -133          * @param compositeOp an string with a valid canvas rendering context string describing compositeOps.
    -134          * @return this
    -135          */
    -136         setCompositeOp : function(compositeOp){
    -137             this.compositeOp= compositeOp;
    -138             return this;
    -139         },
    -140         /**
    -141          * Draws the shape.
    -142          * Applies the values of fillStype, strokeStyle, compositeOp, etc.
    -143          *
    -144          * @param director a valid CAAT.Director instance.
    -145          * @param time an integer with the Scene time the Actor is being drawn.
    -146          */
    -147         paint : function(director,time) {
    -148         },
    -149         /**
    -150          * @private
    -151          * Draws a circle.
    -152          * @param director a valid CAAT.Director instance.
    -153          * @param time an integer with the Scene time the Actor is being drawn.
    -154          */
    -155         paintCircle : function(director,time) {
    -156 
    -157             if ( this.cached ) {
    -158                 CAAT.Foundation.ActorContainer.prototype.paint.call( this, director, time );
    -159                 return;
    -160             }
    -161 
    -162             var ctx= director.ctx;
    -163 
    -164             ctx.lineWidth= this.lineWidth;
    -165 
    -166             ctx.globalCompositeOperation= this.compositeOp;
    -167             if ( null!==this.fillStyle ) {
    -168                 ctx.fillStyle= this.fillStyle;
    -169                 ctx.beginPath();
    -170                 ctx.arc( this.width/2, this.height/2, Math.min(this.width,this.height)/2- this.lineWidth/2, 0, 2*Math.PI, false );
    -171                 ctx.fill();
    -172             }
    -173 
    -174             if ( null!==this.strokeStyle ) {
    -175                 ctx.strokeStyle= this.strokeStyle;
    -176                 ctx.beginPath();
    -177                 ctx.arc( this.width/2, this.height/2, Math.min(this.width,this.height)/2- this.lineWidth/2, 0, 2*Math.PI, false );
    -178                 ctx.stroke();
    -179             }
    -180         },
    -181         /**
    -182          *
    -183          * Private
    -184          * Draws a Rectangle.
    -185          *
    -186          * @param director a valid CAAT.Director instance.
    -187          * @param time an integer with the Scene time the Actor is being drawn.
    -188          */
    -189         paintRectangle : function(director,time) {
    -190 
    -191             if ( this.cached ) {
    -192                 CAAT.Foundation.ActorContainer.prototype.paint.call( this, director, time );
    -193                 return;
    -194             }
    -195 
    -196             var ctx= director.ctx;
    -197 
    -198             ctx.lineWidth= this.lineWidth;
    -199 
    -200             if ( this.lineCap ) {
    -201                 ctx.lineCap= this.lineCap;
    -202             }
    -203             if ( this.lineJoin )    {
    -204                 ctx.lineJoin= this.lineJoin;
    -205             }
    -206             if ( this.miterLimit )  {
    -207                 ctx.miterLimit= this.miterLimit;
    -208             }
    -209 
    -210             ctx.globalCompositeOperation= this.compositeOp;
    -211             if ( null!==this.fillStyle ) {
    -212                 ctx.fillStyle= this.fillStyle;
    -213                 ctx.beginPath();
    -214                 ctx.fillRect(0,0,this.width,this.height);
    -215                 ctx.fill();
    -216             }
    -217 
    -218             if ( null!==this.strokeStyle ) {
    -219                 ctx.strokeStyle= this.strokeStyle;
    -220                 ctx.beginPath();
    -221                 ctx.strokeRect(0,0,this.width,this.height);
    -222                 ctx.stroke();
    -223             }
    -224         }
    -225     }
    -226 
    -227 });
    -228 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_StarActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_StarActor.js.html deleted file mode 100644 index 4aaa4201..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_StarActor.js.html +++ /dev/null @@ -1,237 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name StarActor
    -  5      * @memberOf CAAT.Foundation.UI
    -  6      * @extends CAAT.Foundation.ActorContainer
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.Foundation.UI.StarActor",
    - 11     aliases : ["CAAT.StarActor"],
    - 12     depends : [
    - 13         "CAAT.Foundation.ActorContainer"
    - 14     ],
    - 15     extendsClass : "CAAT.Foundation.ActorContainer",
    - 16     extendsWith : {
    - 17 
    - 18         /**
    - 19          * @lends CAAT.Foundation.UI.StarActor.prototype
    - 20          */
    - 21 
    - 22         __init : function() {
    - 23             this.__super();
    - 24             this.compositeOp= 'source-over';
    - 25             return this;
    - 26         },
    - 27 
    - 28         /**
    - 29          * Number of star peaks.
    - 30          */
    - 31         nPeaks:         0,
    - 32 
    - 33         /**
    - 34          * Maximum radius.
    - 35          */
    - 36         maxRadius:      0,
    - 37 
    - 38         /**
    - 39          * Minimum radius.
    - 40          */
    - 41         minRadius:      0,
    - 42 
    - 43         /**
    - 44          * Staring angle in radians.
    - 45          */
    - 46         initialAngle:   0,
    - 47 
    - 48         /**
    - 49          * Draw the star with this composite operation.
    - 50          */
    - 51         compositeOp:    null,
    - 52 
    - 53         /**
    - 54          *
    - 55          */
    - 56         lineWidth:      1,
    - 57 
    - 58         /**
    - 59          *
    - 60          */
    - 61         lineCap:        null,
    - 62 
    - 63         /**
    - 64          *
    - 65          */
    - 66         lineJoin:       null,
    - 67 
    - 68         /**
    - 69          *
    - 70          */
    - 71         miterLimit:     null,
    - 72 
    - 73         /**
    - 74          *
    - 75          * @param l {number>0}
    - 76          */
    - 77         setLineWidth : function(l)  {
    - 78             this.lineWidth= l;
    - 79             return this;
    - 80         },
    - 81         /**
    - 82          *
    - 83          * @param lc {string{butt|round|square}}
    - 84          */
    - 85         setLineCap : function(lc)   {
    - 86             this.lineCap= lc;
    - 87             return this;
    - 88         },
    - 89         /**
    - 90          *
    - 91          * @param lj {string{bevel|round|miter}}
    - 92          */
    - 93         setLineJoin : function(lj)  {
    - 94             this.lineJoin= lj;
    - 95             return this;
    - 96         },
    - 97         /**
    - 98          *
    - 99          * @param ml {integer>0}
    -100          */
    -101         setMiterLimit : function(ml)    {
    -102             this.miterLimit= ml;
    -103             return this;
    -104         },
    -105         getLineCap : function() {
    -106             return this.lineCap;
    -107         },
    -108         getLineJoin : function()    {
    -109             return this.lineJoin;
    -110         },
    -111         getMiterLimit : function()  {
    -112             return this.miterLimit;
    -113         },
    -114         getLineWidth : function()   {
    -115             return this.lineWidth;
    -116         },
    -117         /**
    -118          * Sets whether the star will be color filled.
    -119          * @param filled {boolean}
    -120          * @deprecated
    -121          */
    -122         setFilled : function( filled ) {
    -123             return this;
    -124         },
    -125         /**
    -126          * Sets whether the star will be outlined.
    -127          * @param outlined {boolean}
    -128          * @deprecated
    -129          */
    -130         setOutlined : function( outlined ) {
    -131             return this;
    -132         },
    -133         /**
    -134          * Sets the composite operation to apply on shape drawing.
    -135          * @param compositeOp an string with a valid canvas rendering context string describing compositeOps.
    -136          * @return this
    -137          */
    -138         setCompositeOp : function(compositeOp){
    -139             this.compositeOp= compositeOp;
    -140             return this;
    -141         },
    -142         /**
    -143          * 
    -144          * @param angle {number} number in radians.
    -145          */
    -146         setInitialAngle : function(angle) {
    -147             this.initialAngle= angle;
    -148             return this;
    -149         },
    -150         /**
    -151          * Initialize the star values.
    -152          * <p>
    -153          * The star actor will be of size 2*maxRadius.
    -154          *
    -155          * @param nPeaks {number} number of star points.
    -156          * @param maxRadius {number} maximum star radius
    -157          * @param minRadius {number} minimum star radius
    -158          *
    -159          * @return this
    -160          */
    -161         initialize : function(nPeaks, maxRadius, minRadius) {
    -162             this.setSize( 2*maxRadius, 2*maxRadius );
    -163 
    -164             this.nPeaks= nPeaks;
    -165             this.maxRadius= maxRadius;
    -166             this.minRadius= minRadius;
    -167 
    -168             return this;
    -169         },
    -170         /**
    -171          * Paint the star.
    -172          *
    -173          * @param director {CAAT.Director}
    -174          * @param timer {number}
    -175          */
    -176         paint : function(director, timer) {
    -177 
    -178             var ctx=        director.ctx;
    -179             var centerX=    this.width/2;
    -180             var centerY=    this.height/2;
    -181             var r1=         this.maxRadius;
    -182             var r2=         this.minRadius;
    -183             var ix=         centerX + r1*Math.cos(this.initialAngle);
    -184             var iy=         centerY + r1*Math.sin(this.initialAngle);
    -185 
    -186             ctx.lineWidth= this.lineWidth;
    -187             if ( this.lineCap ) {
    -188                 ctx.lineCap= this.lineCap;
    -189             }
    -190             if ( this.lineJoin )    {
    -191                 ctx.lineJoin= this.lineJoin;
    -192             }
    -193             if ( this.miterLimit )  {
    -194                 ctx.miterLimit= this.miterLimit;
    -195             }
    -196 
    -197             ctx.globalCompositeOperation= this.compositeOp;
    -198 
    -199             ctx.beginPath();
    -200             ctx.moveTo(ix,iy);
    -201 
    -202             for( var i=1; i<this.nPeaks*2; i++ )   {
    -203                 var angleStar= Math.PI/this.nPeaks * i + this.initialAngle;
    -204                var rr= (i%2===0) ? r1 : r2;
    -205                 var x= centerX + rr*Math.cos(angleStar);
    -206                 var y= centerY + rr*Math.sin(angleStar);
    -207                 ctx.lineTo(x,y);
    -208             }
    -209 
    -210             ctx.lineTo(
    -211                 centerX + r1*Math.cos(this.initialAngle),
    -212                 centerY + r1*Math.sin(this.initialAngle) );
    -213 
    -214             ctx.closePath();
    -215             
    -216             if ( this.fillStyle ) {
    -217                 ctx.fillStyle= this.fillStyle;
    -218                 ctx.fill();
    -219             }
    -220 
    -221             if ( this.strokeStyle ) {
    -222                 ctx.strokeStyle= this.strokeStyle;
    -223                 ctx.stroke();
    -224             }
    -225 
    -226         }
    -227     }
    -228 
    -229 });
    -230 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_TextActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_TextActor.js.html deleted file mode 100644 index 54f2545d..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_TextActor.js.html +++ /dev/null @@ -1,615 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name TextActor
    -  5      * @memberOf CAAT.Foundation.UI
    -  6      * @extends CAAT.Foundation.Actor
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.Foundation.UI.TextActor",
    - 11     aliases : ["CAAT.TextActor"],
    - 12     extendsClass : "CAAT.Foundation.Actor",
    - 13     constants : {
    - 14         TRAVERSE_PATH_FORWARD: 1,
    - 15         TRAVERSE_PATH_BACKWARD: -1
    - 16     },
    - 17     depends : [
    - 18         "CAAT.Foundation.Actor",
    - 19         "CAAT.Foundation.SpriteImage",
    - 20         "CAAT.Module.Font.Font",
    - 21         "CAAT.Math.Point",
    - 22         "CAAT.Behavior.Interpolator"
    - 23     ],
    - 24     extendsWith : {
    - 25 
    - 26         /**
    - 27          * @lends CAAT.Foundation.UI.TextActor.prototype
    - 28          */
    - 29 
    - 30         __init : function() {
    - 31             this.__super();
    - 32             this.font= "10px sans-serif";
    - 33             this.textAlign= "left";
    - 34             this.outlineColor= "black";
    - 35             this.clip= false;
    - 36             this.__calcFontData();
    - 37 
    - 38             return this;
    - 39         },
    - 40 
    - 41         /**
    - 42          * a valid canvas rendering context font description. Default font will be "10px sans-serif".
    - 43          */
    - 44 		font:			    null,
    - 45 
    - 46         /**
    - 47          * Font info. Calculated in CAAT.
    - 48          */
    - 49         fontData:           null,
    - 50 
    - 51         /**
    - 52          * a valid canvas rendering context textAlign string. Any of:
    - 53          *   start, end, left, right, center.
    - 54          * defaults to "left".
    - 55          */
    - 56 		textAlign:		    null,
    - 57 
    - 58         /**
    - 59          * a valid canvas rendering context textBaseLine string. Any of:
    - 60          *   top, hanging, middle, alphabetic, ideographic, bottom.
    - 61          * defaults to "top".
    - 62          */
    - 63 		textBaseline:	    "top",
    - 64 
    - 65         /**
    - 66          * a boolean indicating whether the text should be filled.
    - 67          */
    - 68 		fill:			    true,
    - 69 
    - 70         /**
    - 71          * text fill color
    - 72          */
    - 73         textFillStyle   :   '#eee',
    - 74 
    - 75         /**
    - 76          * a string with the text to draw.
    - 77          */
    - 78 		text:			    null,
    - 79 
    - 80         /**
    - 81          * calculated text width in pixels.
    - 82          */
    - 83 		textWidth:		    0,
    - 84 
    - 85         /**
    - 86          * calculated text height in pixels.
    - 87          */
    - 88         textHeight:         0,
    - 89 
    - 90         /**
    - 91          * a boolean indicating whether the text should be outlined. not all browsers support it.
    - 92          */
    - 93 		outline:		    false,
    - 94 
    - 95         /**
    - 96          * a valid color description string.
    - 97          */
    - 98 		outlineColor:	    null,
    - 99 
    -100         /**
    -101          * text's stroke line width.
    -102          */
    -103         lineWidth:          1,
    -104 
    -105         /**
    -106          * a CAAT.PathUtil.Path which will be traversed by the text.
    -107          */
    -108 		path:			    null,
    -109 
    -110         /**
    -111          * A CAAT.Behavior.Interpolator to apply to the path traversal.
    -112          */
    -113         pathInterpolator:	null,
    -114 
    -115         /**
    -116          * time to be taken to traverse the path. ms.
    -117          */
    -118         pathDuration:       10000,
    -119 
    -120         /**
    -121          * traverse the path forward (1) or backwards (-1).
    -122          */
    -123 		sign:			    1,      //
    -124 
    -125         lx:                 0,
    -126         ly:                 0,
    -127 
    -128         /**
    -129          * Set the text to be filled. The default Filling style will be set by calling setFillStyle method.
    -130          * Default value is true.
    -131          * @param fill {boolean} a boolean indicating whether the text will be filled.
    -132          * @return this;
    -133          */
    -134         setFill : function( fill ) {
    -135             this.stopCacheAsBitmap();
    -136             this.fill= fill;
    -137             return this;
    -138         },
    -139         setLineWidth : function( lw ) {
    -140             this.stopCacheAsBitmap();
    -141             this.lineWidth= lw;
    -142             return this;
    -143         },
    -144         setTextFillStyle : function( style ) {
    -145             this.stopCacheAsBitmap();
    -146             this.textFillStyle= style;
    -147             return this;
    -148         },
    -149         /**
    -150          * Sets whether the text will be outlined.
    -151          * @param outline {boolean} a boolean indicating whether the text will be outlined.
    -152          * @return this;
    -153          */
    -154         setOutline : function( outline ) {
    -155             this.stopCacheAsBitmap();
    -156             this.outline= outline;
    -157             return this;
    -158         },
    -159         setPathTraverseDirection : function(direction) {
    -160             this.sign= direction;
    -161             return this;
    -162         },
    -163         /**
    -164          * Defines text's outline color.
    -165          *
    -166          * @param color {string} sets a valid canvas context color.
    -167          * @return this.
    -168          */
    -169         setOutlineColor : function( color ) {
    -170             this.stopCacheAsBitmap();
    -171             this.outlineColor= color;
    -172             return this;
    -173         },
    -174         /**
    -175          * Set the text to be shown by the actor.
    -176          * @param sText a string with the text to be shwon.
    -177          * @return this
    -178          */
    -179 		setText : function( sText ) {
    -180             this.stopCacheAsBitmap();
    -181 			this.text= sText;
    -182             if ( null===this.text || this.text==="" ) {
    -183                 this.width= this.height= 0;
    -184             }
    -185             this.calcTextSize( CAAT.currentDirector );
    -186 
    -187             this.invalidate();
    -188 
    -189             return this;
    -190         },
    -191         setTextAlign : function( align ) {
    -192             this.textAlign= align;
    -193             this.__setLocation();
    -194             return this;
    -195         },
    -196         /**
    -197          * Sets text alignment
    -198          * @param align
    -199          * @deprecated use setTextAlign
    -200          */
    -201         setAlign : function( align ) {
    -202             return this.setTextAlign(align);
    -203         },
    -204         /**
    -205          * Set text baseline.
    -206          * @param baseline
    -207          */
    -208         setTextBaseline : function( baseline ) {
    -209             this.stopCacheAsBitmap();
    -210             this.textBaseline= baseline;
    -211             return this;
    -212 
    -213         },
    -214         setBaseline : function( baseline ) {
    -215             this.stopCacheAsBitmap();
    -216             return this.setTextBaseline(baseline);
    -217         },
    -218         /**
    -219          * Sets the font to be applied for the text.
    -220          * @param font a string with a valid canvas rendering context font description.
    -221          * @return this
    -222          */
    -223         setFont : function(font) {
    -224 
    -225             this.stopCacheAsBitmap();
    -226 
    -227             if ( !font ) {
    -228                 font= "10px sans-serif";
    -229             }
    -230 
    -231             if ( font instanceof CAAT.Module.Font.Font ) {
    -232                 font.setAsSpriteImage();
    -233             } else if (font instanceof CAAT.Foundation.SpriteImage ) {
    -234                 //CAAT.log("WARN: setFont will no more accept a CAAT.SpriteImage as argument.");
    -235             }
    -236             this.font= font;
    -237 
    -238             this.__calcFontData();
    -239             this.calcTextSize( CAAT.director[0] );
    -240 
    -241             return this;
    -242 		},
    -243 
    -244         setLocation : function( x,y) {
    -245             this.lx= x;
    -246             this.ly= y;
    -247             this.__setLocation();
    -248             return this;
    -249         },
    -250 
    -251         setPosition : function( x,y ) {
    -252             this.lx= x;
    -253             this.ly= y;
    -254             this.__setLocation();
    -255             return this;
    -256         },
    -257 
    -258         setBounds : function( x,y,w,h ) {
    -259             this.lx= x;
    -260             this.ly= y;
    -261             this.setSize(w,h);
    -262             this.__setLocation();
    -263             return this;
    -264         },
    -265 
    -266         setSize : function( w, h ) {
    -267             CAAT.Foundation.UI.TextActor.superclass.setSize.call(this,w,h);
    -268             this.__setLocation();
    -269             return this;
    -270         },
    -271 
    -272         /**
    -273          * @private
    -274          */
    -275         __setLocation : function() {
    -276 
    -277             var nx, ny;
    -278 
    -279             if ( this.textAlign==="center" ) {
    -280                 nx= this.lx - this.width/2;
    -281             } else if ( this.textAlign==="right" || this.textAlign==="end" ) {
    -282                 nx= this.lx - this.width;
    -283             } else {
    -284                 nx= this.lx;
    -285             }
    -286 
    -287             if ( this.textBaseline==="bottom" ) {
    -288                 ny= this.ly - this.height;
    -289             } else if ( this.textBaseline==="middle" ) {
    -290                 ny= this.ly - this.height/2;
    -291             } else if ( this.textBaseline==="alphabetic" ) {
    -292                 ny= this.ly - this.fontData.ascent;
    -293             } else {
    -294                 ny= this.ly;
    -295             }
    -296 
    -297             CAAT.Foundation.UI.TextActor.superclass.setLocation.call( this, nx, ny );
    -298         },
    -299 
    -300         centerAt : function(x,y) {
    -301             this.textAlign="left";
    -302             this.textBaseline="top";
    -303             return CAAT.Foundation.UI.TextActor.superclass.centerAt.call( this, x, y );
    -304         },
    -305 
    -306         /**
    -307          * Calculates the text dimension in pixels and stores the values in textWidth and textHeight
    -308          * attributes.
    -309          * If Actor's width and height were not set, the Actor's dimension will be set to these values.
    -310          * @param director a CAAT.Director instance.
    -311          * @return this
    -312          */
    -313         calcTextSize : function(director) {
    -314 
    -315             if ( typeof this.text==='undefined' || null===this.text || ""===this.text ) {
    -316                 this.textWidth= 0;
    -317                 this.textHeight= 0;
    -318                 return this;
    -319             }
    -320 
    -321             if ( director.glEnabled ) {
    -322                 return this;
    -323             }
    -324 
    -325             if ( this.font instanceof CAAT.Foundation.SpriteImage ) {
    -326                 this.textWidth= this.font.stringWidth( this.text );
    -327                 this.textHeight=this.font.stringHeight();
    -328                 this.width= this.textWidth;
    -329                 this.height= this.textHeight;
    -330                 this.fontData= this.font.getFontData();
    -331 /*
    -332                 var as= (this.font.singleHeight *.8)>>0;
    -333                 this.fontData= {
    -334                     height : this.font.singleHeight,
    -335                     ascent : as,
    -336                     descent: this.font.singleHeight - as
    -337                 };
    -338 */
    -339                 return this;
    -340             }
    -341 
    -342             if ( this.font instanceof CAAT.Module.Font.Font ) {
    -343                 this.textWidth= this.font.stringWidth( this.text );
    -344                 this.textHeight=this.font.stringHeight();
    -345                 this.width= this.textWidth;
    -346                 this.height= this.textHeight;
    -347                 this.fontData= this.font.getFontData();
    -348                 return this;
    -349             }
    -350 
    -351             var ctx= director.ctx;
    -352 
    -353             ctx.save();
    -354             ctx.font= this.font;
    -355 
    -356             this.textWidth= ctx.measureText( this.text ).width;
    -357             if (this.width===0) {
    -358                 this.width= this.textWidth;
    -359             }
    -360 /*
    -361             var pos= this.font.indexOf("px");
    -362             if (-1===pos) {
    -363                 pos= this.font.indexOf("pt");
    -364             }
    -365             if ( -1===pos ) {
    -366                 // no pt or px, so guess a size: 32. why not ?
    -367                 this.textHeight= 32;
    -368             } else {
    -369                 var s =  this.font.substring(0, pos );
    -370                 this.textHeight= parseInt(s,10);
    -371             }
    -372 */
    -373 
    -374             this.textHeight= this.fontData.height;
    -375             this.setSize( this.textWidth, this.textHeight );
    -376 
    -377             ctx.restore();
    -378 
    -379             return this;
    -380         },
    -381 
    -382         __calcFontData : function() {
    -383             this.fontData= CAAT.Module.Font.Font.getFontMetrics( this.font );
    -384         },
    -385 
    -386         /**
    -387          * Custom paint method for TextActor instances.
    -388          * If the path attribute is set, the text will be drawn traversing the path.
    -389          *
    -390          * @param director a valid CAAT.Director instance.
    -391          * @param time an integer with the Scene time the Actor is being drawn.
    -392          */
    -393 		paint : function(director, time) {
    -394 
    -395             if (!this.text) {
    -396                 return;
    -397             }
    -398 
    -399             CAAT.Foundation.UI.TextActor.superclass.paint.call(this, director, time );
    -400 
    -401             if ( this.cached ) {
    -402                 // cacheAsBitmap sets this actor's background image as a representation of itself.
    -403                 // So if after drawing the background it was cached, we're done.
    -404                 return;
    -405             }
    -406 
    -407 			if ( null===this.text) {
    -408 				return;
    -409 			}
    -410 
    -411             if ( this.textWidth===0 || this.textHeight===0 ) {
    -412                 this.calcTextSize(director);
    -413             }
    -414 
    -415 			var ctx= director.ctx;
    -416 			
    -417 			if ( this.font instanceof CAAT.Module.Font.Font || this.font instanceof CAAT.Foundation.SpriteImage ) {
    -418 				this.drawSpriteText(director,time);
    -419                 return;
    -420 			}
    -421 
    -422 			if( null!==this.font ) {
    -423 				ctx.font= this.font;
    -424 			}
    -425 
    -426             /**
    -427              * always draw text with middle or bottom, top is buggy in FF.
    -428              * @type {String}
    -429              */
    -430             ctx.textBaseline="alphabetic";
    -431 
    -432 			if (null===this.path) {
    -433 
    -434                 if ( null!==this.textAlign ) {
    -435                     ctx.textAlign= this.textAlign;
    -436                 }
    -437 
    -438                 var tx=0;
    -439                 if ( this.textAlign==='center') {
    -440                     tx= (this.width/2)|0;
    -441                 } else if ( this.textAlign==='right' ) {
    -442                     tx= this.width;
    -443                 }
    -444 
    -445 				if ( this.fill ) {
    -446                     if ( null!==this.textFillStyle ) {
    -447                         ctx.fillStyle= this.textFillStyle;
    -448                     }
    -449 					ctx.fillText( this.text, tx, this.fontData.ascent  );
    -450 				}
    -451 
    -452                 if ( this.outline ) {
    -453                     if (null!==this.outlineColor ) {
    -454                         ctx.strokeStyle= this.outlineColor;
    -455                     }
    -456 
    -457                     ctx.lineWidth= this.lineWidth;
    -458                     ctx.beginPath();
    -459 					ctx.strokeText( this.text, tx, this.fontData.ascent );
    -460 				}
    -461 			}
    -462 			else {
    -463 				this.drawOnPath(director,time);
    -464 			}
    -465 		},
    -466         /**
    -467          * Private.
    -468          * Draw the text traversing a path.
    -469          * @param director a valid CAAT.Director instance.
    -470          * @param time an integer with the Scene time the Actor is being drawn.
    -471          */
    -472 		drawOnPath : function(director, time) {
    -473 
    -474 			var ctx= director.ctx;
    -475 
    -476             if ( this.fill && null!==this.textFillStyle ) {
    -477                 ctx.fillStyle= this.textFillStyle;
    -478             }
    -479 
    -480             if ( this.outline && null!==this.outlineColor ) {
    -481                 ctx.strokeStyle= this.outlineColor;
    -482             }
    -483 
    -484 			var textWidth=this.sign * this.pathInterpolator.getPosition(
    -485                     (time%this.pathDuration)/this.pathDuration ).y * this.path.getLength() ;
    -486 			var p0= new CAAT.Math.Point(0,0,0);
    -487 			var p1= new CAAT.Math.Point(0,0,0);
    -488 
    -489 			for( var i=0; i<this.text.length; i++ ) {
    -490 				var caracter= this.text[i].toString();
    -491 				var charWidth= ctx.measureText( caracter ).width;
    -492 
    -493                 // guonjien: remove "+charWidth/2" since it destroys the kerning. and he's right!!!. thanks.
    -494 				var currentCurveLength= textWidth;
    -495 
    -496 				p0= this.path.getPositionFromLength(currentCurveLength).clone();
    -497 				p1= this.path.getPositionFromLength(currentCurveLength-0.1).clone();
    -498 
    -499 				var angle= Math.atan2( p0.y-p1.y, p0.x-p1.x );
    -500 
    -501 				ctx.save();
    -502 
    -503                     if ( CAAT.CLAMP ) {
    -504 					    ctx.translate( p0.x>>0, p0.y>>0 );
    -505                     } else {
    -506                         ctx.translate( p0.x, p0.y );
    -507                     }
    -508 					ctx.rotate( angle );
    -509                     if ( this.fill ) {
    -510 					    ctx.fillText(caracter,0,0);
    -511                     }
    -512                     if ( this.outline ) {
    -513                         ctx.beginPath();
    -514                         ctx.lineWidth= this.lineWidth;
    -515                         ctx.strokeText(caracter,0,0);
    -516                     }
    -517 
    -518 				ctx.restore();
    -519 
    -520 				textWidth+= charWidth;
    -521 			}
    -522 		},
    -523 		
    -524 		/**
    -525          * Private.
    -526          * Draw the text using a sprited font instead of a canvas font.
    -527          * @param director a valid CAAT.Director instance.
    -528          * @param time an integer with the Scene time the Actor is being drawn.
    -529          */
    -530 		drawSpriteText: function(director, time) {
    -531 			if (null===this.path) {
    -532 				this.font.drawText( this.text, director.ctx, 0, 0);
    -533 			} else {
    -534 				this.drawSpriteTextOnPath(director, time);
    -535 			}
    -536 		},
    -537 		
    -538 		/**
    -539          * Private.
    -540          * Draw the text traversing a path using a sprited font.
    -541          * @param director a valid CAAT.Director instance.
    -542          * @param time an integer with the Scene time the Actor is being drawn.
    -543          */
    -544 		drawSpriteTextOnPath: function(director, time) {
    -545 			var context= director.ctx;
    -546 
    -547 			var textWidth=this.sign * this.pathInterpolator.getPosition(
    -548                     (time%this.pathDuration)/this.pathDuration ).y * this.path.getLength() ;
    -549 			var p0= new CAAT.Math.Point(0,0,0);
    -550 			var p1= new CAAT.Math.Point(0,0,0);
    -551 
    -552 			for( var i=0; i<this.text.length; i++ ) {
    -553 				var character= this.text[i].toString();
    -554 				var charWidth= this.font.stringWidth(character);
    -555 
    -556 				//var pathLength= this.path.getLength();
    -557 
    -558 				var currentCurveLength= charWidth/2 + textWidth;
    -559 
    -560 				p0= this.path.getPositionFromLength(currentCurveLength).clone();
    -561 				p1= this.path.getPositionFromLength(currentCurveLength-0.1).clone();
    -562 
    -563 				var angle= Math.atan2( p0.y-p1.y, p0.x-p1.x );
    -564 
    -565 				context.save();
    -566 
    -567                 if ( CAAT.CLAMP ) {
    -568 				    context.translate( p0.x|0, p0.y|0 );
    -569                 } else {
    -570                     context.translate( p0.x, p0.y );
    -571                 }
    -572 				context.rotate( angle );
    -573 				
    -574 				var y = this.textBaseline === "bottom" ? 0 - this.font.getHeight() : 0;
    -575 				
    -576 				this.font.drawText(character, context, 0, y);
    -577 
    -578 				context.restore();
    -579 
    -580 				textWidth+= charWidth;
    -581 			}
    -582 		},
    -583 		
    -584         /**
    -585          * Set the path, interpolator and duration to draw the text on.
    -586          * @param path a valid CAAT.Path instance.
    -587          * @param interpolator a CAAT.Interpolator object. If not set, a Linear Interpolator will be used.
    -588          * @param duration an integer indicating the time to take to traverse the path. Optional. 10000 ms
    -589          * by default.
    -590          */
    -591 		setPath : function( path, interpolator, duration ) {
    -592 			this.path= path;
    -593             this.pathInterpolator= interpolator || new CAAT.Behavior.Interpolator().createLinearInterpolator();
    -594             this.pathDuration= duration || 10000;
    -595 
    -596             /*
    -597                 parent could not be set by the time this method is called.
    -598                 so the actors bounds set is removed.
    -599                 the developer must ensure to call setbounds properly on actor.
    -600              */
    -601 			this.mouseEnabled= false;
    -602 
    -603             return this;
    -604 		}
    -605 	}
    -606 
    -607 });
    -608 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_CatmullRom.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_CatmullRom.js.html deleted file mode 100644 index ff8bb301..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_CatmullRom.js.html +++ /dev/null @@ -1,130 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name CatmullRom
    -  5      * @memberOf CAAT.Math
    -  6      * @extends CAAT.Math.Curve
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines:"CAAT.Math.CatmullRom",
    - 11     depends:["CAAT.Math.Curve"],
    - 12     extendsClass:"CAAT.Math.Curve",
    - 13     aliases:["CAAT.CatmullRom"],
    - 14     extendsWith:function () {
    - 15         return {
    - 16 
    - 17             /**
    - 18              * @lends CAAT.Math.CatmullRom.prototype
    - 19              */
    - 20 
    - 21             /**
    - 22              * Set curve control points.
    - 23              * @param p0 <CAAT.Point>
    - 24              * @param p1 <CAAT.Point>
    - 25              * @param p2 <CAAT.Point>
    - 26              * @param p3 <CAAT.Point>
    - 27              */
    - 28             setCurve:function (p0, p1, p2, p3) {
    - 29 
    - 30                 this.coordlist = [];
    - 31                 this.coordlist.push(p0);
    - 32                 this.coordlist.push(p1);
    - 33                 this.coordlist.push(p2);
    - 34                 this.coordlist.push(p3);
    - 35 
    - 36                 this.update();
    - 37 
    - 38                 return this;
    - 39             },
    - 40             /**
    - 41              * Paint the contour by solving again the entire curve.
    - 42              * @param director {CAAT.Director}
    - 43              */
    - 44             paint:function (director) {
    - 45 
    - 46                 var x1, y1;
    - 47 
    - 48                 // Catmull rom solves from point 1 !!!
    - 49 
    - 50                 x1 = this.coordlist[1].x;
    - 51                 y1 = this.coordlist[1].y;
    - 52 
    - 53                 var ctx = director.ctx;
    - 54 
    - 55                 ctx.save();
    - 56                 ctx.beginPath();
    - 57                 ctx.moveTo(x1, y1);
    - 58 
    - 59                 var point = new CAAT.Point();
    - 60 
    - 61                 for (var t = this.k; t <= 1 + this.k; t += this.k) {
    - 62                     this.solve(point, t);
    - 63                     ctx.lineTo(point.x, point.y);
    - 64                 }
    - 65 
    - 66                 ctx.stroke();
    - 67                 ctx.restore();
    - 68 
    - 69                 CAAT.Math.CatmullRom.superclass.paint.call(this, director);
    - 70             },
    - 71             /**
    - 72              * Solves the curve for any given parameter t.
    - 73              * @param point {CAAT.Point} the point to store the solved value on the curve.
    - 74              * @param t {number} a number in the range 0..1
    - 75              */
    - 76             solve:function (point, t) {
    - 77                 var c = this.coordlist;
    - 78 
    - 79                 // Handy from CAKE. Thanks.
    - 80                 var af = ((-t + 2) * t - 1) * t * 0.5
    - 81                 var bf = (((3 * t - 5) * t) * t + 2) * 0.5
    - 82                 var cf = ((-3 * t + 4) * t + 1) * t * 0.5
    - 83                 var df = ((t - 1) * t * t) * 0.5
    - 84 
    - 85                 point.x = c[0].x * af + c[1].x * bf + c[2].x * cf + c[3].x * df;
    - 86                 point.y = c[0].y * af + c[1].y * bf + c[2].y * cf + c[3].y * df;
    - 87 
    - 88                 return point;
    - 89 
    - 90             },
    - 91 
    - 92             applyAsPath:function (director) {
    - 93 
    - 94                 var ctx = director.ctx;
    - 95 
    - 96                 var point = new CAAT.Math.Point();
    - 97 
    - 98                 for (var t = this.k; t <= 1 + this.k; t += this.k) {
    - 99                     this.solve(point, t);
    -100                     ctx.lineTo(point.x, point.y);
    -101                 }
    -102 
    -103                 return this;
    -104             },
    -105 
    -106             /**
    -107              * Return the first curve control point.
    -108              * @return {CAAT.Point}
    -109              */
    -110             endCurvePosition:function () {
    -111                 return this.coordlist[ this.coordlist.length - 2 ];
    -112             },
    -113             /**
    -114              * Return the last curve control point.
    -115              * @return {CAAT.Point}
    -116              */
    -117             startCurvePosition:function () {
    -118                 return this.coordlist[ 1 ];
    -119             }
    -120         }
    -121     }
    -122 });
    -123 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Curve.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Curve.js.html deleted file mode 100644 index ace184de..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Curve.js.html +++ /dev/null @@ -1,210 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  **/
    -  5 
    -  6 CAAT.Module({
    -  7 
    -  8     /**
    -  9      * @name Curve
    - 10      * @memberOf CAAT.Math
    - 11      * @constructor
    - 12      */
    - 13 
    - 14     defines:"CAAT.Math.Curve",
    - 15     depends:["CAAT.Math.Point"],
    - 16     extendsWith:function () {
    - 17 
    - 18         return {
    - 19 
    - 20             /**
    - 21              * @lends CAAT.Math.Curve.prototype
    - 22              */
    - 23 
    - 24             /**
    - 25              * A collection of CAAT.Math.Point objects.
    - 26              */
    - 27             coordlist:null,
    - 28 
    - 29             /**
    - 30              * Minimun solver step.
    - 31              */
    - 32             k:0.05,
    - 33 
    - 34             /**
    - 35              * Curve length.
    - 36              */
    - 37             length:-1,
    - 38 
    - 39             /**
    - 40              * If this segments belongs to an interactive path, the handlers will be this size.
    - 41              */
    - 42             HANDLE_SIZE:20,
    - 43 
    - 44             /**
    - 45              * Draw interactive handlers ?
    - 46              */
    - 47             drawHandles:true,
    - 48 
    - 49             /**
    - 50              * Paint the curve control points.
    - 51              * @param director {CAAT.Director}
    - 52              */
    - 53             paint:function (director) {
    - 54                 if (false === this.drawHandles) {
    - 55                     return;
    - 56                 }
    - 57 
    - 58                 var cl = this.coordlist;
    - 59                 var ctx = director.ctx;
    - 60 
    - 61                 // control points
    - 62                 ctx.save();
    - 63                 ctx.beginPath();
    - 64 
    - 65                 ctx.strokeStyle = '#a0a0a0';
    - 66                 ctx.moveTo(cl[0].x, cl[0].y);
    - 67                 ctx.lineTo(cl[1].x, cl[1].y);
    - 68                 ctx.stroke();
    - 69                 if (this.cubic) {
    - 70                     ctx.moveTo(cl[2].x, cl[2].y);
    - 71                     ctx.lineTo(cl[3].x, cl[3].y);
    - 72                     ctx.stroke();
    - 73                 }
    - 74 
    - 75 
    - 76                 ctx.globalAlpha = 0.5;
    - 77                 for (var i = 0; i < this.coordlist.length; i++) {
    - 78                     ctx.fillStyle = '#7f7f00';
    - 79                     var w = this.HANDLE_SIZE / 2;
    - 80                     ctx.beginPath();
    - 81                     ctx.arc(cl[i].x, cl[i].y, w, 0, 2 * Math.PI, false);
    - 82                     ctx.fill();
    - 83                 }
    - 84 
    - 85                 ctx.restore();
    - 86             },
    - 87             /**
    - 88              * Signal the curve has been modified and recalculate curve length.
    - 89              */
    - 90             update:function () {
    - 91                 this.calcLength();
    - 92             },
    - 93             /**
    - 94              * This method must be overriden by subclasses. It is called whenever the curve must be solved for some time=t.
    - 95              * The t parameter must be in the range 0..1
    - 96              * @param point {CAAT.Point} to store curve solution for t.
    - 97              * @param t {number}
    - 98              * @return {CAAT.Point} the point parameter.
    - 99              */
    -100             solve:function (point, t) {
    -101             },
    -102             /**
    -103              * Get an array of points defining the curve contour.
    -104              * @param numSamples {number} number of segments to get.
    -105              */
    -106             getContour:function (numSamples) {
    -107                 var contour = [], i;
    -108 
    -109                 for (i = 0; i <= numSamples; i++) {
    -110                     var point = new CAAT.Math.Point();
    -111                     this.solve(point, i / numSamples);
    -112                     contour.push(point);
    -113                 }
    -114 
    -115                 return contour;
    -116             },
    -117             /**
    -118              * Calculates a curve bounding box.
    -119              *
    -120              * @param rectangle {CAAT.Rectangle} a rectangle to hold the bounding box.
    -121              * @return {CAAT.Rectangle} the rectangle parameter.
    -122              */
    -123             getBoundingBox:function (rectangle) {
    -124                 if (!rectangle) {
    -125                     rectangle = new CAAT.Math.Rectangle();
    -126                 }
    -127 
    -128                 // thanks yodesoft.com for spotting the first point is out of the BB
    -129                 rectangle.setEmpty();
    -130                 rectangle.union(this.coordlist[0].x, this.coordlist[0].y);
    -131 
    -132                 var pt = new CAAT.Math.Point();
    -133                 for (var t = this.k; t <= 1 + this.k; t += this.k) {
    -134                     this.solve(pt, t);
    -135                     rectangle.union(pt.x, pt.y);
    -136                 }
    -137 
    -138                 return rectangle;
    -139             },
    -140             /**
    -141              * Calculate the curve length by incrementally solving the curve every substep=CAAT.Curve.k. This value defaults
    -142              * to .05 so at least 20 iterations will be performed.
    -143              *
    -144              * @return {number} the approximate curve length.
    -145              */
    -146             calcLength:function () {
    -147                 var x1, y1;
    -148                 x1 = this.coordlist[0].x;
    -149                 y1 = this.coordlist[0].y;
    -150                 var llength = 0;
    -151                 var pt = new CAAT.Math.Point();
    -152                 for (var t = this.k; t <= 1 + this.k; t += this.k) {
    -153                     this.solve(pt, t);
    -154                     llength += Math.sqrt((pt.x - x1) * (pt.x - x1) + (pt.y - y1) * (pt.y - y1));
    -155                     x1 = pt.x;
    -156                     y1 = pt.y;
    -157                 }
    -158 
    -159                 this.length = llength;
    -160                 return llength;
    -161             },
    -162             /**
    -163              * Return the cached curve length.
    -164              * @return {number} the cached curve length.
    -165              */
    -166             getLength:function () {
    -167                 return this.length;
    -168             },
    -169             /**
    -170              * Return the first curve control point.
    -171              * @return {CAAT.Point}
    -172              */
    -173             endCurvePosition:function () {
    -174                 return this.coordlist[ this.coordlist.length - 1 ];
    -175             },
    -176             /**
    -177              * Return the last curve control point.
    -178              * @return {CAAT.Point}
    -179              */
    -180             startCurvePosition:function () {
    -181                 return this.coordlist[ 0 ];
    -182             },
    -183 
    -184             setPoints:function (points) {
    -185             },
    -186 
    -187             setPoint:function (point, index) {
    -188                 if (index >= 0 && index < this.coordlist.length) {
    -189                     this.coordlist[index] = point;
    -190                 }
    -191             },
    -192             /**
    -193              *
    -194              * @param director <=CAAT.Director>
    -195              */
    -196             applyAsPath:function (director) {
    -197             }
    -198         }
    -199     }
    -200 
    -201 });
    -202 
    -203 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix.js.html deleted file mode 100644 index d49e821d..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix.js.html +++ /dev/null @@ -1,431 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  **/
    -  5 
    -  6 
    -  7 CAAT.Module({
    -  8 
    -  9     /**
    - 10      * @name Matrix
    - 11      * @memberOf CAAT.Math
    - 12      * @constructor
    - 13      */
    - 14 
    - 15 
    - 16     defines:"CAAT.Math.Matrix",
    - 17     depends:["CAAT.Math.Point"],
    - 18     aliases:["CAAT.Matrix"],
    - 19     onCreate : function() {
    - 20         CAAT.Math.Matrix.prototype.transformRenderingContext= CAAT.Math.Matrix.prototype.transformRenderingContext_NoClamp;
    - 21         CAAT.Math.Matrix.prototype.transformRenderingContextSet= CAAT.Math.Matrix.prototype.transformRenderingContextSet_NoClamp;
    - 22     },
    - 23     constants : {
    - 24 
    - 25         /**
    - 26          * @lends CAAT.Math.Matrix.prototype
    - 27          */
    - 28 
    - 29         setCoordinateClamping : function( clamp ) {
    - 30             if ( clamp ) {
    - 31                 CAAT.Matrix.prototype.transformRenderingContext= CAAT.Matrix.prototype.transformRenderingContext_Clamp;
    - 32                 CAAT.Matrix.prototype.transformRenderingContextSet= CAAT.Matrix.prototype.transformRenderingContextSet_Clamp;
    - 33                 CAAT.Math.Matrix.prototype.transformRenderingContext= CAAT.Matrix.prototype.transformRenderingContext_Clamp;
    - 34                 CAAT.Math.Matrix.prototype.transformRenderingContextSet= CAAT.Matrix.prototype.transformRenderingContextSet_Clamp;
    - 35             } else {
    - 36                 CAAT.Matrix.prototype.transformRenderingContext= CAAT.Matrix.prototype.transformRenderingContext_NoClamp;
    - 37                 CAAT.Matrix.prototype.transformRenderingContextSet= CAAT.Matrix.prototype.transformRenderingContextSet_NoClamp;
    - 38                 CAAT.Math.Matrix.prototype.transformRenderingContext= CAAT.Matrix.prototype.transformRenderingContext_NoClamp;
    - 39                 CAAT.Math.Matrix.prototype.transformRenderingContextSet= CAAT.Matrix.prototype.transformRenderingContextSet_NoClamp;
    - 40             }
    - 41         },
    - 42         /**
    - 43          * Create a scale matrix.
    - 44          * @param scalex {number} x scale magnitude.
    - 45          * @param scaley {number} y scale magnitude.
    - 46          *
    - 47          * @return {CAAT.Matrix} a matrix object.
    - 48          *
    - 49          * @static
    - 50          */
    - 51         scale:function (scalex, scaley) {
    - 52             var m = new CAAT.Math.Matrix();
    - 53 
    - 54             m.matrix[0] = scalex;
    - 55             m.matrix[4] = scaley;
    - 56 
    - 57             return m;
    - 58         },
    - 59         /**
    - 60          * Create a new rotation matrix and set it up for the specified angle in radians.
    - 61          * @param angle {number}
    - 62          * @return {CAAT.Matrix} a matrix object.
    - 63          *
    - 64          * @static
    - 65          */
    - 66         rotate:function (angle) {
    - 67             var m = new CAAT.Math.Matrix();
    - 68             m.setRotation(angle);
    - 69             return m;
    - 70         },
    - 71         /**
    - 72          * Create a translation matrix.
    - 73          * @param x {number} x translation magnitude.
    - 74          * @param y {number} y translation magnitude.
    - 75          *
    - 76          * @return {CAAT.Matrix} a matrix object.
    - 77          * @static
    - 78          *
    - 79          */
    - 80         translate:function (x, y) {
    - 81             var m = new CAAT.Math.Matrix();
    - 82 
    - 83             m.matrix[2] = x;
    - 84             m.matrix[5] = y;
    - 85 
    - 86             return m;
    - 87         }
    - 88     },
    - 89     extendsWith:function () {
    - 90         return {
    - 91 
    - 92             /**
    - 93              * @lends CAAT.Math.Matrix.prototype
    - 94              */
    - 95 
    - 96             /**
    - 97              * An array of 9 numbers.
    - 98              */
    - 99             matrix:null,
    -100 
    -101             __init:function () {
    -102                 this.matrix = [
    -103                     1.0, 0.0, 0.0,
    -104                     0.0, 1.0, 0.0, 0.0, 0.0, 1.0 ];
    -105 
    -106                 if (typeof Float32Array !== "undefined") {
    -107                     this.matrix = new Float32Array(this.matrix);
    -108                 }
    -109 
    -110                 return this;
    -111             },
    -112 
    -113             /**
    -114              * Transform a point by this matrix. The parameter point will be modified with the transformation values.
    -115              * @param point {CAAT.Point}.
    -116              * @return {CAAT.Point} the parameter point.
    -117              */
    -118             transformCoord:function (point) {
    -119                 var x = point.x;
    -120                 var y = point.y;
    -121 
    -122                 var tm = this.matrix;
    -123 
    -124                 point.x = x * tm[0] + y * tm[1] + tm[2];
    -125                 point.y = x * tm[3] + y * tm[4] + tm[5];
    -126 
    -127                 return point;
    -128             },
    -129 
    -130             setRotation:function (angle) {
    -131 
    -132                 this.identity();
    -133 
    -134                 var tm = this.matrix;
    -135                 var c = Math.cos(angle);
    -136                 var s = Math.sin(angle);
    -137                 tm[0] = c;
    -138                 tm[1] = -s;
    -139                 tm[3] = s;
    -140                 tm[4] = c;
    -141 
    -142                 return this;
    -143             },
    -144 
    -145             setScale:function (scalex, scaley) {
    -146                 this.identity();
    -147 
    -148                 this.matrix[0] = scalex;
    -149                 this.matrix[4] = scaley;
    -150 
    -151                 return this;
    -152             },
    -153 
    -154             /**
    -155              * Sets this matrix as a translation matrix.
    -156              * @param x
    -157              * @param y
    -158              */
    -159             setTranslate:function (x, y) {
    -160                 this.identity();
    -161 
    -162                 this.matrix[2] = x;
    -163                 this.matrix[5] = y;
    -164 
    -165                 return this;
    -166             },
    -167             /**
    -168              * Copy into this matrix the given matrix values.
    -169              * @param matrix {CAAT.Matrix}
    -170              * @return this
    -171              */
    -172             copy:function (matrix) {
    -173                 matrix = matrix.matrix;
    -174 
    -175                 var tmatrix = this.matrix;
    -176                 tmatrix[0] = matrix[0];
    -177                 tmatrix[1] = matrix[1];
    -178                 tmatrix[2] = matrix[2];
    -179                 tmatrix[3] = matrix[3];
    -180                 tmatrix[4] = matrix[4];
    -181                 tmatrix[5] = matrix[5];
    -182                 tmatrix[6] = matrix[6];
    -183                 tmatrix[7] = matrix[7];
    -184                 tmatrix[8] = matrix[8];
    -185 
    -186                 return this;
    -187             },
    -188             /**
    -189              * Set this matrix to the identity matrix.
    -190              * @return this
    -191              */
    -192             identity:function () {
    -193 
    -194                 var m = this.matrix;
    -195                 m[0] = 1.0;
    -196                 m[1] = 0.0;
    -197                 m[2] = 0.0;
    -198 
    -199                 m[3] = 0.0;
    -200                 m[4] = 1.0;
    -201                 m[5] = 0.0;
    -202 
    -203                 m[6] = 0.0;
    -204                 m[7] = 0.0;
    -205                 m[8] = 1.0;
    -206 
    -207                 return this;
    -208             },
    -209             /**
    -210              * Multiply this matrix by a given matrix.
    -211              * @param m {CAAT.Matrix}
    -212              * @return this
    -213              */
    -214             multiply:function (m) {
    -215 
    -216                 var tm = this.matrix;
    -217                 var mm = m.matrix;
    -218 
    -219                 var tm0 = tm[0];
    -220                 var tm1 = tm[1];
    -221                 var tm2 = tm[2];
    -222                 var tm3 = tm[3];
    -223                 var tm4 = tm[4];
    -224                 var tm5 = tm[5];
    -225                 var tm6 = tm[6];
    -226                 var tm7 = tm[7];
    -227                 var tm8 = tm[8];
    -228 
    -229                 var mm0 = mm[0];
    -230                 var mm1 = mm[1];
    -231                 var mm2 = mm[2];
    -232                 var mm3 = mm[3];
    -233                 var mm4 = mm[4];
    -234                 var mm5 = mm[5];
    -235                 var mm6 = mm[6];
    -236                 var mm7 = mm[7];
    -237                 var mm8 = mm[8];
    -238 
    -239                 tm[0] = tm0 * mm0 + tm1 * mm3 + tm2 * mm6;
    -240                 tm[1] = tm0 * mm1 + tm1 * mm4 + tm2 * mm7;
    -241                 tm[2] = tm0 * mm2 + tm1 * mm5 + tm2 * mm8;
    -242                 tm[3] = tm3 * mm0 + tm4 * mm3 + tm5 * mm6;
    -243                 tm[4] = tm3 * mm1 + tm4 * mm4 + tm5 * mm7;
    -244                 tm[5] = tm3 * mm2 + tm4 * mm5 + tm5 * mm8;
    -245                 tm[6] = tm6 * mm0 + tm7 * mm3 + tm8 * mm6;
    -246                 tm[7] = tm6 * mm1 + tm7 * mm4 + tm8 * mm7;
    -247                 tm[8] = tm6 * mm2 + tm7 * mm5 + tm8 * mm8;
    -248 
    -249                 return this;
    -250             },
    -251             /**
    -252              * Premultiply this matrix by a given matrix.
    -253              * @param m {CAAT.Matrix}
    -254              * @return this
    -255              */
    -256             premultiply:function (m) {
    -257 
    -258                 var m00 = m.matrix[0] * this.matrix[0] + m.matrix[1] * this.matrix[3] + m.matrix[2] * this.matrix[6];
    -259                 var m01 = m.matrix[0] * this.matrix[1] + m.matrix[1] * this.matrix[4] + m.matrix[2] * this.matrix[7];
    -260                 var m02 = m.matrix[0] * this.matrix[2] + m.matrix[1] * this.matrix[5] + m.matrix[2] * this.matrix[8];
    -261 
    -262                 var m10 = m.matrix[3] * this.matrix[0] + m.matrix[4] * this.matrix[3] + m.matrix[5] * this.matrix[6];
    -263                 var m11 = m.matrix[3] * this.matrix[1] + m.matrix[4] * this.matrix[4] + m.matrix[5] * this.matrix[7];
    -264                 var m12 = m.matrix[3] * this.matrix[2] + m.matrix[4] * this.matrix[5] + m.matrix[5] * this.matrix[8];
    -265 
    -266                 var m20 = m.matrix[6] * this.matrix[0] + m.matrix[7] * this.matrix[3] + m.matrix[8] * this.matrix[6];
    -267                 var m21 = m.matrix[6] * this.matrix[1] + m.matrix[7] * this.matrix[4] + m.matrix[8] * this.matrix[7];
    -268                 var m22 = m.matrix[6] * this.matrix[2] + m.matrix[7] * this.matrix[5] + m.matrix[8] * this.matrix[8];
    -269 
    -270                 this.matrix[0] = m00;
    -271                 this.matrix[1] = m01;
    -272                 this.matrix[2] = m02;
    -273 
    -274                 this.matrix[3] = m10;
    -275                 this.matrix[4] = m11;
    -276                 this.matrix[5] = m12;
    -277 
    -278                 this.matrix[6] = m20;
    -279                 this.matrix[7] = m21;
    -280                 this.matrix[8] = m22;
    -281 
    -282 
    -283                 return this;
    -284             },
    -285             /**
    -286              * Creates a new inverse matrix from this matrix.
    -287              * @return {CAAT.Matrix} an inverse matrix.
    -288              */
    -289             getInverse:function () {
    -290                 var tm = this.matrix;
    -291 
    -292                 var m00 = tm[0];
    -293                 var m01 = tm[1];
    -294                 var m02 = tm[2];
    -295                 var m10 = tm[3];
    -296                 var m11 = tm[4];
    -297                 var m12 = tm[5];
    -298                 var m20 = tm[6];
    -299                 var m21 = tm[7];
    -300                 var m22 = tm[8];
    -301 
    -302                 var newMatrix = new CAAT.Math.Matrix();
    -303 
    -304                 var determinant = m00 * (m11 * m22 - m21 * m12) - m10 * (m01 * m22 - m21 * m02) + m20 * (m01 * m12 - m11 * m02);
    -305                 if (determinant === 0) {
    -306                     return null;
    -307                 }
    -308 
    -309                 var m = newMatrix.matrix;
    -310 
    -311                 m[0] = m11 * m22 - m12 * m21;
    -312                 m[1] = m02 * m21 - m01 * m22;
    -313                 m[2] = m01 * m12 - m02 * m11;
    -314 
    -315                 m[3] = m12 * m20 - m10 * m22;
    -316                 m[4] = m00 * m22 - m02 * m20;
    -317                 m[5] = m02 * m10 - m00 * m12;
    -318 
    -319                 m[6] = m10 * m21 - m11 * m20;
    -320                 m[7] = m01 * m20 - m00 * m21;
    -321                 m[8] = m00 * m11 - m01 * m10;
    -322 
    -323                 newMatrix.multiplyScalar(1 / determinant);
    -324 
    -325                 return newMatrix;
    -326             },
    -327             /**
    -328              * Multiply this matrix by a scalar.
    -329              * @param scalar {number} scalar value
    -330              *
    -331              * @return this
    -332              */
    -333             multiplyScalar:function (scalar) {
    -334                 var i;
    -335 
    -336                 for (i = 0; i < 9; i++) {
    -337                     this.matrix[i] *= scalar;
    -338                 }
    -339 
    -340                 return this;
    -341             },
    -342 
    -343             /**
    -344              *
    -345              * @param ctx
    -346              */
    -347             transformRenderingContextSet_NoClamp:function (ctx) {
    -348                 var m = this.matrix;
    -349                 ctx.setTransform(m[0], m[3], m[1], m[4], m[2], m[5]);
    -350                 return this;
    -351             },
    -352 
    -353             /**
    -354              *
    -355              * @param ctx
    -356              */
    -357             transformRenderingContext_NoClamp:function (ctx) {
    -358                 var m = this.matrix;
    -359                 ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
    -360                 return this;
    -361             },
    -362 
    -363             /**
    -364              *
    -365              * @param ctx
    -366              */
    -367             transformRenderingContextSet_Clamp:function (ctx) {
    -368                 var m = this.matrix;
    -369                 ctx.setTransform(m[0], m[3], m[1], m[4], m[2] >> 0, m[5] >> 0);
    -370                 return this;
    -371             },
    -372 
    -373             /**
    -374              *
    -375              * @param ctx
    -376              */
    -377             transformRenderingContext_Clamp:function (ctx) {
    -378                 var m = this.matrix;
    -379                 ctx.transform(m[0], m[3], m[1], m[4], m[2] >> 0, m[5] >> 0);
    -380                 return this;
    -381             },
    -382 
    -383             setModelViewMatrix:function ( x, y, sx, sy, r  ) {
    -384                 var c, s, _m00, _m01, _m10, _m11;
    -385                 var mm0, mm1, mm2, mm3, mm4, mm5;
    -386                 var mm;
    -387 
    -388                 mm = this.matrix;
    -389 
    -390                 mm0 = 1;
    -391                 mm1 = 0;
    -392                 mm3 = 0;
    -393                 mm4 = 1;
    -394 
    -395                 mm2 = x;
    -396                 mm5 = y;
    -397 
    -398                 c = Math.cos(r);
    -399                 s = Math.sin(r);
    -400                 _m00 = mm0;
    -401                 _m01 = mm1;
    -402                 _m10 = mm3;
    -403                 _m11 = mm4;
    -404                 mm0 = _m00 * c + _m01 * s;
    -405                 mm1 = -_m00 * s + _m01 * c;
    -406                 mm3 = _m10 * c + _m11 * s;
    -407                 mm4 = -_m10 * s + _m11 * c;
    -408 
    -409                 mm0 = mm0 * this.scaleX;
    -410                 mm1 = mm1 * this.scaleY;
    -411                 mm3 = mm3 * this.scaleX;
    -412                 mm4 = mm4 * this.scaleY;
    -413 
    -414                 mm[0] = mm0;
    -415                 mm[1] = mm1;
    -416                 mm[2] = mm2;
    -417                 mm[3] = mm3;
    -418                 mm[4] = mm4;
    -419                 mm[5] = mm5;
    -420             }
    -421         }
    -422     }
    -423 });
    -424 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix3.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix3.js.html deleted file mode 100644 index a066b4ff..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix3.js.html +++ /dev/null @@ -1,553 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  **/
    -  5 
    -  6 CAAT.Module({
    -  7 
    -  8     /**
    -  9      * @name Matrix3
    - 10      * @memberOf CAAT.Math
    - 11      * @constructor
    - 12      */
    - 13 
    - 14     defines:"CAAT.Math.Matrix3",
    - 15     aliases:["CAAT.Matrix3"],
    - 16     extendsWith:function () {
    - 17         return {
    - 18 
    - 19             /**
    - 20              * @lends CAAT.Math.Matrix3.prototype
    - 21              */
    - 22 
    - 23             /**
    - 24              * An Array of 4 Array of 4 numbers.
    - 25              */
    - 26             matrix:null,
    - 27 
    - 28             /**
    - 29              * An array of 16 numbers.
    - 30              */
    - 31             fmatrix:null,
    - 32 
    - 33             __init:function () {
    - 34                 this.matrix = [
    - 35                     [1, 0, 0, 0],
    - 36                     [0, 1, 0, 0],
    - 37                     [0, 0, 1, 0],
    - 38                     [0, 0, 0, 1]
    - 39                 ];
    - 40 
    - 41                 this.fmatrix = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
    - 42 
    - 43                 return this;
    - 44             },
    - 45 
    - 46             transformCoord:function (point) {
    - 47                 var x = point.x;
    - 48                 var y = point.y;
    - 49                 var z = point.z;
    - 50 
    - 51                 point.x = x * this.matrix[0][0] + y * this.matrix[0][1] + z * this.matrix[0][2] + this.matrix[0][3];
    - 52                 point.y = x * this.matrix[1][0] + y * this.matrix[1][1] + z * this.matrix[1][2] + this.matrix[1][3];
    - 53                 point.z = x * this.matrix[2][0] + y * this.matrix[2][1] + z * this.matrix[2][2] + this.matrix[2][3];
    - 54 
    - 55                 return point;
    - 56             },
    - 57             initialize:function (x0, y0, z0, x1, y1, z1, x2, y2, z2) {
    - 58                 this.identity();
    - 59                 this.matrix[0][0] = x0;
    - 60                 this.matrix[0][1] = y0;
    - 61                 this.matrix[0][2] = z0;
    - 62 
    - 63                 this.matrix[1][0] = x1;
    - 64                 this.matrix[1][1] = y1;
    - 65                 this.matrix[1][2] = z1;
    - 66 
    - 67                 this.matrix[2][0] = x2;
    - 68                 this.matrix[2][1] = y2;
    - 69                 this.matrix[2][2] = z2;
    - 70 
    - 71                 return this;
    - 72             },
    - 73             initWithMatrix:function (matrixData) {
    - 74                 this.matrix = matrixData;
    - 75                 return this;
    - 76             },
    - 77             flatten:function () {
    - 78                 var d = this.fmatrix;
    - 79                 var s = this.matrix;
    - 80                 d[ 0] = s[0][0];
    - 81                 d[ 1] = s[1][0];
    - 82                 d[ 2] = s[2][0];
    - 83                 d[ 3] = s[3][0];
    - 84 
    - 85                 d[ 4] = s[0][1];
    - 86                 d[ 5] = s[1][1];
    - 87                 d[ 6] = s[2][1];
    - 88                 d[ 7] = s[2][1];
    - 89 
    - 90                 d[ 8] = s[0][2];
    - 91                 d[ 9] = s[1][2];
    - 92                 d[10] = s[2][2];
    - 93                 d[11] = s[3][2];
    - 94 
    - 95                 d[12] = s[0][3];
    - 96                 d[13] = s[1][3];
    - 97                 d[14] = s[2][3];
    - 98                 d[15] = s[3][3];
    - 99 
    -100                 return this.fmatrix;
    -101             },
    -102 
    -103             /**
    -104              * Set this matrix to identity matrix.
    -105              * @return this
    -106              */
    -107             identity:function () {
    -108                 for (var i = 0; i < 4; i++) {
    -109                     for (var j = 0; j < 4; j++) {
    -110                         this.matrix[i][j] = (i === j) ? 1.0 : 0.0;
    -111                     }
    -112                 }
    -113 
    -114                 return this;
    -115             },
    -116             /**
    -117              * Get this matri'x internal representation data. The bakced structure is a 4x4 array of number.
    -118              */
    -119             getMatrix:function () {
    -120                 return this.matrix;
    -121             },
    -122             /**
    -123              * Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate around
    -124              * xy axis.
    -125              *
    -126              * @param xy {Number} radians to rotate.
    -127              *
    -128              * @return this
    -129              */
    -130             rotateXY:function (xy) {
    -131                 return this.rotate(xy, 0, 0);
    -132             },
    -133             /**
    -134              * Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate around
    -135              * xz axis.
    -136              *
    -137              * @param xz {Number} radians to rotate.
    -138              *
    -139              * @return this
    -140              */
    -141             rotateXZ:function (xz) {
    -142                 return this.rotate(0, xz, 0);
    -143             },
    -144             /**
    -145              * Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate aroind
    -146              * yz axis.
    -147              *
    -148              * @param yz {Number} radians to rotate.
    -149              *
    -150              * @return this
    -151              */
    -152             rotateYZ:function (yz) {
    -153                 return this.rotate(0, 0, yz);
    -154             },
    -155             /**
    -156              *
    -157              * @param xy
    -158              * @param xz
    -159              * @param yz
    -160              */
    -161             setRotate:function (xy, xz, yz) {
    -162                 var m = this.rotate(xy, xz, yz);
    -163                 this.copy(m);
    -164                 return this;
    -165             },
    -166             /**
    -167              * Creates a matrix to represent arbitrary rotations around the given planes.
    -168              * @param xy {number} radians to rotate around xy plane.
    -169              * @param xz {number} radians to rotate around xz plane.
    -170              * @param yz {number} radians to rotate around yz plane.
    -171              *
    -172              * @return {CAAT.Matrix3} a newly allocated matrix.
    -173              * @static
    -174              */
    -175             rotate:function (xy, xz, yz) {
    -176                 var res = new CAAT.Math.Matrix3();
    -177                 var s, c, m;
    -178 
    -179                 if (xy !== 0) {
    -180                     m = new CAAT.Math.Math.Matrix3();
    -181                     s = Math.sin(xy);
    -182                     c = Math.cos(xy);
    -183                     m.matrix[1][1] = c;
    -184                     m.matrix[1][2] = -s;
    -185                     m.matrix[2][1] = s;
    -186                     m.matrix[2][2] = c;
    -187                     res.multiply(m);
    -188                 }
    -189 
    -190                 if (xz !== 0) {
    -191                     m = new CAAT.Math.Matrix3();
    -192                     s = Math.sin(xz);
    -193                     c = Math.cos(xz);
    -194                     m.matrix[0][0] = c;
    -195                     m.matrix[0][2] = -s;
    -196                     m.matrix[2][0] = s;
    -197                     m.matrix[2][2] = c;
    -198                     res.multiply(m);
    -199                 }
    -200 
    -201                 if (yz !== 0) {
    -202                     m = new CAAT.Math.Matrix3();
    -203                     s = Math.sin(yz);
    -204                     c = Math.cos(yz);
    -205                     m.matrix[0][0] = c;
    -206                     m.matrix[0][1] = -s;
    -207                     m.matrix[1][0] = s;
    -208                     m.matrix[1][1] = c;
    -209                     res.multiply(m);
    -210                 }
    -211 
    -212                 return res;
    -213             },
    -214             /**
    -215              * Creates a new matrix being a copy of this matrix.
    -216              * @return {CAAT.Matrix3} a newly allocated matrix object.
    -217              */
    -218             getClone:function () {
    -219                 var m = new CAAT.Math.Matrix3();
    -220                 m.copy(this);
    -221                 return m;
    -222             },
    -223             /**
    -224              * Multiplies this matrix by another matrix.
    -225              *
    -226              * @param n {CAAT.Matrix3} a CAAT.Matrix3 object.
    -227              * @return this
    -228              */
    -229             multiply:function (m) {
    -230                 var n = this.getClone();
    -231 
    -232                 var nm = n.matrix;
    -233                 var n00 = nm[0][0];
    -234                 var n01 = nm[0][1];
    -235                 var n02 = nm[0][2];
    -236                 var n03 = nm[0][3];
    -237 
    -238                 var n10 = nm[1][0];
    -239                 var n11 = nm[1][1];
    -240                 var n12 = nm[1][2];
    -241                 var n13 = nm[1][3];
    -242 
    -243                 var n20 = nm[2][0];
    -244                 var n21 = nm[2][1];
    -245                 var n22 = nm[2][2];
    -246                 var n23 = nm[2][3];
    -247 
    -248                 var n30 = nm[3][0];
    -249                 var n31 = nm[3][1];
    -250                 var n32 = nm[3][2];
    -251                 var n33 = nm[3][3];
    -252 
    -253                 var mm = m.matrix;
    -254                 var m00 = mm[0][0];
    -255                 var m01 = mm[0][1];
    -256                 var m02 = mm[0][2];
    -257                 var m03 = mm[0][3];
    -258 
    -259                 var m10 = mm[1][0];
    -260                 var m11 = mm[1][1];
    -261                 var m12 = mm[1][2];
    -262                 var m13 = mm[1][3];
    -263 
    -264                 var m20 = mm[2][0];
    -265                 var m21 = mm[2][1];
    -266                 var m22 = mm[2][2];
    -267                 var m23 = mm[2][3];
    -268 
    -269                 var m30 = mm[3][0];
    -270                 var m31 = mm[3][1];
    -271                 var m32 = mm[3][2];
    -272                 var m33 = mm[3][3];
    -273 
    -274                 this.matrix[0][0] = n00 * m00 + n01 * m10 + n02 * m20 + n03 * m30;
    -275                 this.matrix[0][1] = n00 * m01 + n01 * m11 + n02 * m21 + n03 * m31;
    -276                 this.matrix[0][2] = n00 * m02 + n01 * m12 + n02 * m22 + n03 * m32;
    -277                 this.matrix[0][3] = n00 * m03 + n01 * m13 + n02 * m23 + n03 * m33;
    -278 
    -279                 this.matrix[1][0] = n10 * m00 + n11 * m10 + n12 * m20 + n13 * m30;
    -280                 this.matrix[1][1] = n10 * m01 + n11 * m11 + n12 * m21 + n13 * m31;
    -281                 this.matrix[1][2] = n10 * m02 + n11 * m12 + n12 * m22 + n13 * m32;
    -282                 this.matrix[1][3] = n10 * m03 + n11 * m13 + n12 * m23 + n13 * m33;
    -283 
    -284                 this.matrix[2][0] = n20 * m00 + n21 * m10 + n22 * m20 + n23 * m30;
    -285                 this.matrix[2][1] = n20 * m01 + n21 * m11 + n22 * m21 + n23 * m31;
    -286                 this.matrix[2][2] = n20 * m02 + n21 * m12 + n22 * m22 + n23 * m32;
    -287                 this.matrix[2][3] = n20 * m03 + n21 * m13 + n22 * m23 + n23 * m33;
    -288 
    -289                 return this;
    -290             },
    -291             /**
    -292              * Pre multiplies this matrix by a given matrix.
    -293              *
    -294              * @param m {CAAT.Matrix3} a CAAT.Matrix3 object.
    -295              *
    -296              * @return this
    -297              */
    -298             premultiply:function (m) {
    -299                 var n = this.getClone();
    -300 
    -301                 var nm = n.matrix;
    -302                 var n00 = nm[0][0];
    -303                 var n01 = nm[0][1];
    -304                 var n02 = nm[0][2];
    -305                 var n03 = nm[0][3];
    -306 
    -307                 var n10 = nm[1][0];
    -308                 var n11 = nm[1][1];
    -309                 var n12 = nm[1][2];
    -310                 var n13 = nm[1][3];
    -311 
    -312                 var n20 = nm[2][0];
    -313                 var n21 = nm[2][1];
    -314                 var n22 = nm[2][2];
    -315                 var n23 = nm[2][3];
    -316 
    -317                 var n30 = nm[3][0];
    -318                 var n31 = nm[3][1];
    -319                 var n32 = nm[3][2];
    -320                 var n33 = nm[3][3];
    -321 
    -322                 var mm = m.matrix;
    -323                 var m00 = mm[0][0];
    -324                 var m01 = mm[0][1];
    -325                 var m02 = mm[0][2];
    -326                 var m03 = mm[0][3];
    -327 
    -328                 var m10 = mm[1][0];
    -329                 var m11 = mm[1][1];
    -330                 var m12 = mm[1][2];
    -331                 var m13 = mm[1][3];
    -332 
    -333                 var m20 = mm[2][0];
    -334                 var m21 = mm[2][1];
    -335                 var m22 = mm[2][2];
    -336                 var m23 = mm[2][3];
    -337 
    -338                 var m30 = mm[3][0];
    -339                 var m31 = mm[3][1];
    -340                 var m32 = mm[3][2];
    -341                 var m33 = mm[3][3];
    -342 
    -343                 this.matrix[0][0] = n00 * m00 + n01 * m10 + n02 * m20;
    -344                 this.matrix[0][1] = n00 * m01 + n01 * m11 + n02 * m21;
    -345                 this.matrix[0][2] = n00 * m02 + n01 * m12 + n02 * m22;
    -346                 this.matrix[0][3] = n00 * m03 + n01 * m13 + n02 * m23 + n03;
    -347                 this.matrix[1][0] = n10 * m00 + n11 * m10 + n12 * m20;
    -348                 this.matrix[1][1] = n10 * m01 + n11 * m11 + n12 * m21;
    -349                 this.matrix[1][2] = n10 * m02 + n11 * m12 + n12 * m22;
    -350                 this.matrix[1][3] = n10 * m03 + n11 * m13 + n12 * m23 + n13;
    -351                 this.matrix[2][0] = n20 * m00 + n21 * m10 + n22 * m20;
    -352                 this.matrix[2][1] = n20 * m01 + n21 * m11 + n22 * m21;
    -353                 this.matrix[2][2] = n20 * m02 + n21 * m12 + n22 * m22;
    -354                 this.matrix[2][3] = n20 * m03 + n21 * m13 + n22 * m23 + n23;
    -355 
    -356                 return this;
    -357             },
    -358             /**
    -359              * Set this matrix translation values to be the given parameters.
    -360              *
    -361              * @param x {number} x component of translation point.
    -362              * @param y {number} y component of translation point.
    -363              * @param z {number} z component of translation point.
    -364              *
    -365              * @return this
    -366              */
    -367             setTranslate:function (x, y, z) {
    -368                 this.identity();
    -369                 this.matrix[0][3] = x;
    -370                 this.matrix[1][3] = y;
    -371                 this.matrix[2][3] = z;
    -372                 return this;
    -373             },
    -374             /**
    -375              * Create a translation matrix.
    -376              * @param x {number}
    -377              * @param y {number}
    -378              * @param z {number}
    -379              * @return {CAAT.Matrix3} a new matrix.
    -380              */
    -381             translate:function (x, y, z) {
    -382                 var m = new CAAT.Math.Matrix3();
    -383                 m.setTranslate(x, y, z);
    -384                 return m;
    -385             },
    -386             setScale:function (sx, sy, sz) {
    -387                 this.identity();
    -388                 this.matrix[0][0] = sx;
    -389                 this.matrix[1][1] = sy;
    -390                 this.matrix[2][2] = sz;
    -391                 return this;
    -392             },
    -393             scale:function (sx, sy, sz) {
    -394                 var m = new CAAT.Math.Matrix3();
    -395                 m.setScale(sx, sy, sz);
    -396                 return m;
    -397             },
    -398             /**
    -399              * Set this matrix as the rotation matrix around the given axes.
    -400              * @param xy {number} radians of rotation around z axis.
    -401              * @param xz {number} radians of rotation around y axis.
    -402              * @param yz {number} radians of rotation around x axis.
    -403              *
    -404              * @return this
    -405              */
    -406             rotateModelView:function (xy, xz, yz) {
    -407                 var sxy = Math.sin(xy);
    -408                 var sxz = Math.sin(xz);
    -409                 var syz = Math.sin(yz);
    -410                 var cxy = Math.cos(xy);
    -411                 var cxz = Math.cos(xz);
    -412                 var cyz = Math.cos(yz);
    -413 
    -414                 this.matrix[0][0] = cxz * cxy;
    -415                 this.matrix[0][1] = -cxz * sxy;
    -416                 this.matrix[0][2] = sxz;
    -417                 this.matrix[0][3] = 0;
    -418                 this.matrix[1][0] = syz * sxz * cxy + sxy * cyz;
    -419                 this.matrix[1][1] = cyz * cxy - syz * sxz * sxy;
    -420                 this.matrix[1][2] = -syz * cxz;
    -421                 this.matrix[1][3] = 0;
    -422                 this.matrix[2][0] = syz * sxy - cyz * sxz * cxy;
    -423                 this.matrix[2][1] = cyz * sxz * sxy + syz * cxy;
    -424                 this.matrix[2][2] = cyz * cxz;
    -425                 this.matrix[2][3] = 0;
    -426                 this.matrix[3][0] = 0;
    -427                 this.matrix[3][1] = 0;
    -428                 this.matrix[3][2] = 0;
    -429                 this.matrix[3][3] = 1;
    -430 
    -431                 return this;
    -432             },
    -433             /**
    -434              * Copy a given matrix values into this one's.
    -435              * @param m {CAAT.Matrix} a matrix
    -436              *
    -437              * @return this
    -438              */
    -439             copy:function (m) {
    -440                 for (var i = 0; i < 4; i++) {
    -441                     for (var j = 0; j < 4; j++) {
    -442                         this.matrix[i][j] = m.matrix[i][j];
    -443                     }
    -444                 }
    -445 
    -446                 return this;
    -447             },
    -448             /**
    -449              * Calculate this matrix's determinant.
    -450              * @return {number} matrix determinant.
    -451              */
    -452             calculateDeterminant:function () {
    -453 
    -454                 var mm = this.matrix;
    -455                 var m11 = mm[0][0], m12 = mm[0][1], m13 = mm[0][2], m14 = mm[0][3],
    -456                     m21 = mm[1][0], m22 = mm[1][1], m23 = mm[1][2], m24 = mm[1][3],
    -457                     m31 = mm[2][0], m32 = mm[2][1], m33 = mm[2][2], m34 = mm[2][3],
    -458                     m41 = mm[3][0], m42 = mm[3][1], m43 = mm[3][2], m44 = mm[3][3];
    -459 
    -460                 return  m14 * m22 * m33 * m41 +
    -461                     m12 * m24 * m33 * m41 +
    -462                     m14 * m23 * m31 * m42 +
    -463                     m13 * m24 * m31 * m42 +
    -464 
    -465                     m13 * m21 * m34 * m42 +
    -466                     m11 * m23 * m34 * m42 +
    -467                     m14 * m21 * m32 * m43 +
    -468                     m11 * m24 * m32 * m43 +
    -469 
    -470                     m13 * m22 * m31 * m44 +
    -471                     m12 * m23 * m31 * m44 +
    -472                     m12 * m21 * m33 * m44 +
    -473                     m11 * m22 * m33 * m44 +
    -474 
    -475                     m14 * m23 * m32 * m41 -
    -476                     m13 * m24 * m32 * m41 -
    -477                     m13 * m22 * m34 * m41 -
    -478                     m12 * m23 * m34 * m41 -
    -479 
    -480                     m14 * m21 * m33 * m42 -
    -481                     m11 * m24 * m33 * m42 -
    -482                     m14 * m22 * m31 * m43 -
    -483                     m12 * m24 * m31 * m43 -
    -484 
    -485                     m12 * m21 * m34 * m43 -
    -486                     m11 * m22 * m34 * m43 -
    -487                     m13 * m21 * m32 * m44 -
    -488                     m11 * m23 * m32 * m44;
    -489             },
    -490             /**
    -491              * Return a new matrix which is this matrix's inverse matrix.
    -492              * @return {CAAT.Matrix3} a new matrix.
    -493              */
    -494             getInverse:function () {
    -495                 var mm = this.matrix;
    -496                 var m11 = mm[0][0], m12 = mm[0][1], m13 = mm[0][2], m14 = mm[0][3],
    -497                     m21 = mm[1][0], m22 = mm[1][1], m23 = mm[1][2], m24 = mm[1][3],
    -498                     m31 = mm[2][0], m32 = mm[2][1], m33 = mm[2][2], m34 = mm[2][3],
    -499                     m41 = mm[3][0], m42 = mm[3][1], m43 = mm[3][2], m44 = mm[3][3];
    -500 
    -501                 var m2 = new CAAT.Math.Matrix3();
    -502                 m2.matrix[0][0] = m23 * m34 * m42 + m24 * m32 * m43 + m22 * m33 * m44 - m24 * m33 * m42 - m22 * m34 * m43 - m23 * m32 * m44;
    -503                 m2.matrix[0][1] = m14 * m33 * m42 + m12 * m34 * m43 + m13 * m32 * m44 - m12 * m33 * m44 - m13 * m34 * m42 - m14 * m32 * m43;
    -504                 m2.matrix[0][2] = m13 * m24 * m42 + m12 * m23 * m44 + m14 * m22 * m43 - m12 * m24 * m43 - m13 * m22 * m44 - m14 * m23 * m42;
    -505                 m2.matrix[0][3] = m14 * m23 * m32 + m12 * m24 * m33 + m13 * m22 * m34 - m13 * m24 * m32 - m14 * m22 * m33 - m12 * m23 * m34;
    -506 
    -507                 m2.matrix[1][0] = m24 * m33 * m41 + m21 * m34 * m43 + m23 * m31 * m44 - m23 * m34 * m41 - m24 * m31 * m43 - m21 * m33 * m44;
    -508                 m2.matrix[1][1] = m13 * m34 * m41 + m14 * m31 * m43 + m11 * m33 * m44 - m14 * m33 * m41 - m11 * m34 * m43 - m13 * m31 * m44;
    -509                 m2.matrix[1][2] = m14 * m23 * m41 + m11 * m24 * m43 + m13 * m21 * m44 - m13 * m24 * m41 - m14 * m21 * m43 - m11 * m23 * m44;
    -510                 m2.matrix[1][3] = m13 * m24 * m31 + m14 * m21 * m33 + m11 * m23 * m34 - m14 * m23 * m31 - m11 * m24 * m33 - m13 * m21 * m34;
    -511 
    -512                 m2.matrix[2][0] = m22 * m34 * m41 + m24 * m31 * m42 + m21 * m32 * m44 - m24 * m32 * m41 - m21 * m34 * m42 - m22 * m31 * m44;
    -513                 m2.matrix[2][1] = m14 * m32 * m41 + m11 * m34 * m42 + m12 * m31 * m44 - m11 * m32 * m44 - m12 * m34 * m41 - m14 * m31 * m42;
    -514                 m2.matrix[2][2] = m13 * m24 * m41 + m14 * m21 * m42 + m11 * m22 * m44 - m14 * m22 * m41 - m11 * m24 * m42 - m12 * m21 * m44;
    -515                 m2.matrix[2][3] = m14 * m22 * m31 + m11 * m24 * m32 + m12 * m21 * m34 - m11 * m22 * m34 - m12 * m24 * m31 - m14 * m21 * m32;
    -516 
    -517                 m2.matrix[3][0] = m23 * m32 * m41 + m21 * m33 * m42 + m22 * m31 * m43 - m22 * m33 * m41 - m23 * m31 * m42 - m21 * m32 * m43;
    -518                 m2.matrix[3][1] = m12 * m33 * m41 + m13 * m31 * m42 + m11 * m32 * m43 - m13 * m32 * m41 - m11 * m33 * m42 - m12 * m31 * m43;
    -519                 m2.matrix[3][2] = m13 * m22 * m41 + m11 * m23 * m42 + m12 * m21 * m43 - m11 * m22 * m43 - m12 * m23 * m41 - m13 * m21 * m42;
    -520                 m2.matrix[3][3] = m12 * m23 * m31 + m13 * m21 * m32 + m11 * m22 * m33 - m13 * m22 * m31 - m11 * m23 * m32 - m12 * m21 * m33;
    -521 
    -522                 return m2.multiplyScalar(1 / this.calculateDeterminant());
    -523             },
    -524             /**
    -525              * Multiply this matrix by a scalar.
    -526              * @param scalar {number} scalar value
    -527              *
    -528              * @return this
    -529              */
    -530             multiplyScalar:function (scalar) {
    -531                 var i, j;
    -532 
    -533                 for (i = 0; i < 4; i++) {
    -534                     for (j = 0; j < 4; j++) {
    -535                         this.matrix[i][j] *= scalar;
    -536                     }
    -537                 }
    -538 
    -539                 return this;
    -540             }
    -541 
    -542         }
    -543     }
    -544 
    -545 });
    -546 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Audio_AudioManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Audio_AudioManager.js.html deleted file mode 100644 index 706bd098..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Audio_AudioManager.js.html +++ /dev/null @@ -1,570 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * Sound implementation.
    -  5  */
    -  6 
    -  7 CAAT.Module({
    -  8 
    -  9     /**
    - 10      * @name Module
    - 11      * @memberOf CAAT
    - 12      * @namespace
    - 13      */
    - 14 
    - 15     /**
    - 16      * @name Audio
    - 17      * @memberOf CAAT.Module
    - 18      * @namespace
    - 19      */
    - 20 
    - 21     /**
    - 22      * @name AudioManager
    - 23      * @memberOf CAAT.Module.Audio
    - 24      * @constructor
    - 25      */
    - 26 
    - 27     defines:"CAAT.Module.Audio.AudioManager",
    - 28     extendsWith:function () {
    - 29         return {
    - 30 
    - 31             /**
    - 32              * @lends CAAT.Module.Audio.AudioManager.prototype
    - 33              */
    - 34 
    - 35             __init:function () {
    - 36                 this.isFirefox= navigator.userAgent.match(/Firefox/g)!==null;
    - 37                 return this;
    - 38             },
    - 39 
    - 40             isFirefox : false,
    - 41 
    - 42             /**
    - 43              * The only background music audio channel.
    - 44              */
    - 45             musicChannel: null,
    - 46 
    - 47             /**
    - 48              * Is music enabled ?
    - 49              */
    - 50             musicEnabled:true,
    - 51 
    - 52             /**
    - 53              * Are FX sounds enabled ?
    - 54              */
    - 55             fxEnabled:true,
    - 56 
    - 57             /**
    - 58              * A collection of Audio objects.
    - 59              */
    - 60             audioCache:null,
    - 61 
    - 62             /**
    - 63              * A cache of empty Audio objects.
    - 64              */
    - 65             channels:null,
    - 66 
    - 67             /**
    - 68              * Currently used Audio objects.
    - 69              */
    - 70             workingChannels:null,
    - 71 
    - 72             /**
    - 73              * Currently looping Audio objects.
    - 74              */
    - 75             loopingChannels:[],
    - 76 
    - 77             /**
    - 78              * available formats for audio elements.
    - 79              * the system will load audio files with the extensions in this preferred order.
    - 80              */
    - 81             audioFormatExtensions : [
    - 82                 'ogg',
    - 83                 'wav',
    - 84                 'x-wav',
    - 85                 'mp3'
    - 86             ],
    - 87 
    - 88             currentAudioFormatExtension : 'ogg',
    - 89 
    - 90             /**
    - 91              * Audio formats.
    - 92              * @dict
    - 93              */
    - 94             audioTypes:{               // supported audio formats. Don't remember where i took them from :S
    - 95                 'ogg':  'audio/ogg',
    - 96                 'mp3':  'audio/mpeg;',
    - 97                 'wav':  'audio/wav',
    - 98                 'x-wav':'audio/x-wav',
    - 99                 'mp4':  'audio/mp4"'
    -100             },
    -101 
    -102             /**
    -103              * Initializes the sound subsystem by creating a fixed number of Audio channels.
    -104              * Every channel registers a handler for sound playing finalization. If a callback is set, the
    -105              * callback function will be called with the associated sound id in the cache.
    -106              *
    -107              * @param numChannels {number} number of channels to pre-create. 8 by default.
    -108              *
    -109              * @return this.
    -110              */
    -111             initialize:function (numChannels ) {
    -112 
    -113                 this.setAudioFormatExtensions( this.audioFormatExtensions );
    -114 
    -115                 this.audioCache = [];
    -116                 this.channels = [];
    -117                 this.workingChannels = [];
    -118 
    -119                 for (var i = 0; i <= numChannels; i++) {
    -120                     var channel = document.createElement('audio');
    -121 
    -122                     if (null !== channel) {
    -123                         channel.finished = -1;
    -124                         this.channels.push(channel);
    -125                         var me = this;
    -126                         channel.addEventListener(
    -127                             'ended',
    -128                             // on sound end, set channel to available channels list.
    -129                             function (audioEvent) {
    -130                                 var target = audioEvent.target;
    -131                                 var i;
    -132 
    -133                                 // remove from workingChannels
    -134                                 for (i = 0; i < me.workingChannels.length; i++) {
    -135                                     if (me.workingChannels[i] === target) {
    -136                                         me.workingChannels.splice(i, 1);
    -137                                         break;
    -138                                     }
    -139                                 }
    -140 
    -141                                 if (target.caat_callback) {
    -142                                     target.caat_callback(target.caat_id);
    -143                                 }
    -144 
    -145                                 // set back to channels.
    -146                                 me.channels.push(target);
    -147                             },
    -148                             false
    -149                         );
    -150                     }
    -151                 }
    -152 
    -153                 this.musicChannel= this.channels.pop();
    -154 
    -155                 return this;
    -156             },
    -157 
    -158             setAudioFormatExtensions : function( formats ) {
    -159                 this.audioFormatExtensions= formats;
    -160                 this.__setCurrentAudioFormatExtension();
    -161                 return this;
    -162             },
    -163 
    -164             __setCurrentAudioFormatExtension : function( ) {
    -165 
    -166                 var audio= new Audio();
    -167 
    -168                 for( var i= 0, l=this.audioFormatExtensions.length; i<l; i+=1 ) {
    -169                     var res= audio.canPlayType( this.audioTypes[this.audioFormatExtensions[i]]).toLowerCase();
    -170                     if ( res!=="no" && res!=="" ) {
    -171                         this.currentAudioFormatExtension= this.audioFormatExtensions[i];
    -172                         console.log("Audio type set to: "+this.currentAudioFormatExtension);
    -173                         return;
    -174                     }
    -175                 }
    -176 
    -177                 this.currentAudioFormatExtension= null;
    -178             },
    -179 
    -180             __getAudioUrl : function( url ) {
    -181 
    -182                 if ( this.currentAudioFormatExtension===null ) {
    -183                     return url;
    -184                 }
    -185 
    -186                 var lio= url.lastIndexOf( "." );
    -187                 if ( lio<0 ) {
    -188                     console.log("Audio w/o extension: "+url);
    -189                     lio= url.length()-1;
    -190                 }
    -191 
    -192                 var uri= url.substring( 0, lio+1 ) + this.currentAudioFormatExtension;
    -193                 return uri;
    -194             },
    -195 
    -196             /**
    -197              * Tries to add an audio tag to the available list of valid audios. The audio is described by a url.
    -198              * @param id {object} an object to associate the audio element (if suitable to be played).
    -199              * @param url {string} a string describing an url.
    -200              * @param endplaying_callback {function} callback to be called upon sound end.
    -201              *
    -202              * @return {boolean} a boolean indicating whether the browser can play this resource.
    -203              *
    -204              * @private
    -205              */
    -206             addAudioFromURL:function (id, url, endplaying_callback) {
    -207                 var audio = document.createElement('audio');
    -208 
    -209                 if (null !== audio) {
    -210 
    -211                     audio.src = this.__getAudioUrl(url);
    -212                     console.log("Loading audio: "+audio.src);
    -213                     audio.preload = "auto";
    -214                     audio.load();
    -215                     if (endplaying_callback) {
    -216                         audio.caat_callback = endplaying_callback;
    -217                         audio.caat_id = id;
    -218                     }
    -219                     this.audioCache.push({ id:id, audio:audio });
    -220 
    -221                     return true;
    -222                 }
    -223 
    -224                 return false;
    -225             },
    -226             /**
    -227              * Tries to add an audio tag to the available list of valid audios. The audio element comes from
    -228              * an HTMLAudioElement.
    -229              * @param id {object} an object to associate the audio element (if suitable to be played).
    -230              * @param audio {HTMLAudioElement} a DOM audio node.
    -231              * @param endplaying_callback {function} callback to be called upon sound end.
    -232              *
    -233              * @return {boolean} a boolean indicating whether the browser can play this resource.
    -234              *
    -235              * @private
    -236              */
    -237             addAudioFromDomNode:function (id, audio, endplaying_callback) {
    -238 
    -239                 var extension = audio.src.substr(audio.src.lastIndexOf('.') + 1);
    -240                 if (audio.canPlayType(this.audioTypes[extension])) {
    -241                     if (endplaying_callback) {
    -242                         audio.caat_callback = endplaying_callback;
    -243                         audio.caat_id = id;
    -244                     }
    -245                     this.audioCache.push({ id:id, audio:audio });
    -246 
    -247                     return true;
    -248                 }
    -249 
    -250                 return false;
    -251             },
    -252             /**
    -253              * Adds an elements to the audio cache.
    -254              * @param id {object} an object to associate the audio element (if suitable to be played).
    -255              * @param element {URL|HTMLElement} an url or html audio tag.
    -256              * @param endplaying_callback {function} callback to be called upon sound end.
    -257              *
    -258              * @return {boolean} a boolean indicating whether the browser can play this resource.
    -259              *
    -260              * @private
    -261              */
    -262             addAudioElement:function (id, element, endplaying_callback) {
    -263                 if (typeof element === "string") {
    -264                     return this.addAudioFromURL(id, element, endplaying_callback);
    -265                 } else {
    -266                     try {
    -267                         if (element instanceof HTMLAudioElement) {
    -268                             return this.addAudioFromDomNode(id, element, endplaying_callback);
    -269                         }
    -270                     }
    -271                     catch (e) {
    -272                     }
    -273                 }
    -274 
    -275                 return false;
    -276             },
    -277             /**
    -278              * creates an Audio object and adds it to the audio cache.
    -279              * This function expects audio data described by two elements, an id and an object which will
    -280              * describe an audio element to be associated with the id. The object will be of the form
    -281              * array, dom node or a url string.
    -282              *
    -283              * <p>
    -284              * The audio element can be one of the two forms:
    -285              *
    -286              * <ol>
    -287              *  <li>Either an HTMLAudioElement/Audio object or a string url.
    -288              *  <li>An array of elements of the previous form.
    -289              * </ol>
    -290              *
    -291              * <p>
    -292              * When the audio attribute is an array, this function will iterate throught the array elements
    -293              * until a suitable audio element to be played is found. When this is the case, the other array
    -294              * elements won't be taken into account. The valid form of using this addAudio method will be:
    -295              *
    -296              * <p>
    -297              * 1.<br>
    -298              * addAudio( id, url } ). In this case, if the resource pointed by url is
    -299              * not suitable to be played (i.e. a call to the Audio element's canPlayType method return 'no')
    -300              * no resource will be added under such id, so no sound will be played when invoking the play(id)
    -301              * method.
    -302              * <p>
    -303              * 2.<br>
    -304              * addAudio( id, dom_audio_tag ). In this case, the same logic than previous case is applied, but
    -305              * this time, the parameter url is expected to be an audio tag present in the html file.
    -306              * <p>
    -307              * 3.<br>
    -308              * addAudio( id, [array_of_url_or_domaudiotag] ). In this case, the function tries to locate a valid
    -309              * resource to be played in any of the elements contained in the array. The array element's can
    -310              * be any type of case 1 and 2. As soon as a valid resource is found, it will be associated to the
    -311              * id in the valid audio resources to be played list.
    -312              *
    -313              * @return this
    -314              */
    -315             addAudio:function (id, array_of_url_or_domnodes, endplaying_callback) {
    -316 
    -317                 if (array_of_url_or_domnodes instanceof Array) {
    -318                     /*
    -319                      iterate throught array elements until we can safely add an audio element.
    -320                      */
    -321                     for (var i = 0; i < array_of_url_or_domnodes.length; i++) {
    -322                         if (this.addAudioElement(id, array_of_url_or_domnodes[i], endplaying_callback)) {
    -323                             break;
    -324                         }
    -325                     }
    -326                 } else {
    -327                     this.addAudioElement(id, array_of_url_or_domnodes, endplaying_callback);
    -328                 }
    -329 
    -330                 return this;
    -331             },
    -332             /**
    -333              * Returns an audio object.
    -334              * @param aId {object} the id associated to the target Audio object.
    -335              * @return {object} the HTMLAudioElement addociated to the given id.
    -336              */
    -337             getAudio:function (aId) {
    -338                 for (var i = 0; i < this.audioCache.length; i++) {
    -339                     if (this.audioCache[i].id === aId) {
    -340                         return this.audioCache[i].audio;
    -341                     }
    -342                 }
    -343 
    -344                 return null;
    -345             },
    -346 
    -347             stopMusic : function() {
    -348                 this.musicChannel.pause();
    -349             },
    -350 
    -351             playMusic : function(id) {
    -352                 if (!this.musicEnabled) {
    -353                     return null;
    -354                 }
    -355 
    -356                 var audio_in_cache = this.getAudio(id);
    -357                 // existe el audio, y ademas hay un canal de audio disponible.
    -358                 if (null !== audio_in_cache) {
    -359                     var audio =this.musicChannel;
    -360                     if (null !== audio) {
    -361                         audio.src = audio_in_cache.src;
    -362                         audio.preload = "auto";
    -363 
    -364                         if (this.isFirefox) {
    -365                             audio.addEventListener(
    -366                                 'ended',
    -367                                 // on sound end, restart music.
    -368                                 function (audioEvent) {
    -369                                     var target = audioEvent.target;
    -370                                     target.currentTime = 0;
    -371                                 },
    -372                                 false
    -373                             );
    -374                         } else {
    -375                             audio.loop = true;
    -376                         }
    -377                         audio.load();
    -378                         audio.play();
    -379                         return audio;
    -380                     }
    -381                 }
    -382 
    -383                 return null;
    -384             },
    -385 
    -386             /**
    -387              * Set an audio object volume.
    -388              * @param id {object} an audio Id
    -389              * @param volume {number} volume to set. The volume value is not checked.
    -390              *
    -391              * @return this
    -392              */
    -393             setVolume:function (id, volume) {
    -394                 var audio = this.getAudio(id);
    -395                 if (null != audio) {
    -396                     audio.volume = volume;
    -397                 }
    -398 
    -399                 return this;
    -400             },
    -401 
    -402             /**
    -403              * Plays an audio file from the cache if any sound channel is available.
    -404              * The playing sound will occupy a sound channel and when ends playing will leave
    -405              * the channel free for any other sound to be played in.
    -406              * @param id {object} an object identifying a sound in the sound cache.
    -407              * @return { id: {Object}, audio: {(Audio|HTMLAudioElement)} }
    -408              */
    -409             play:function (id) {
    -410                 if (!this.fxEnabled) {
    -411                     return null;
    -412                 }
    -413 
    -414                 var audio = this.getAudio(id);
    -415                 // existe el audio, y ademas hay un canal de audio disponible.
    -416                 if (null !== audio && this.channels.length > 0) {
    -417                     var channel = this.channels.shift();
    -418                     channel.src = audio.src;
    -419 //                    channel.load();
    -420                     channel.volume = audio.volume;
    -421                     channel.play();
    -422                     this.workingChannels.push(channel);
    -423                 } else {
    -424                     console.log("Can't play audio: "+id);
    -425                 }
    -426 
    -427                 return audio;
    -428             },
    -429 
    -430             /**
    -431              * cancel all instances of a sound identified by id. This id is the value set
    -432              * to identify a sound.
    -433              * @param id
    -434              * @return {*}
    -435              */
    -436             cancelPlay : function(id) {
    -437 
    -438                 for( var i=0 ; this.workingChannels.length; i++ ) {
    -439                     var audio= this.workingChannels[i];
    -440                     if ( audio.caat_id===id ) {
    -441                         audio.pause();
    -442                         this.channels.push(audio);
    -443                         this.workingChannels.splice(i,1);
    -444                     }
    -445                 }
    -446 
    -447                 return this;
    -448             },
    -449 
    -450             /**
    -451              * cancel a channel sound
    -452              * @param audioObject
    -453              * @return {*}
    -454              */
    -455             cancelPlayByChannel : function(audioObject) {
    -456 
    -457                 for( var i=0 ; this.workingChannels.length; i++ ) {
    -458                     if ( this.workingChannels[i]===audioObject ) {
    -459                         this.channels.push(audioObject);
    -460                         this.workingChannels.splice(i,1);
    -461                         return this;
    -462                     }
    -463                 }
    -464 
    -465                 return this;
    -466             },
    -467 
    -468             /**
    -469              * This method creates a new AudioChannel to loop the sound with.
    -470              * It returns an Audio object so that the developer can cancel the sound loop at will.
    -471              * The user must call <code>pause()</code> method to stop playing a loop.
    -472              * <p>
    -473              * Firefox does not honor the loop property, so looping is performed by attending end playing
    -474              * event on audio elements.
    -475              *
    -476              * @return {HTMLElement} an Audio instance if a valid sound id is supplied. Null otherwise
    -477              */
    -478             loop:function (id) {
    -479 
    -480                 if (!this.musicEnabled) {
    -481                     return null;
    -482                 }
    -483 
    -484                 var audio_in_cache = this.getAudio(id);
    -485                 // existe el audio, y ademas hay un canal de audio disponible.
    -486                 if (null !== audio_in_cache) {
    -487                     var audio = document.createElement('audio');
    -488                     if (null !== audio) {
    -489                         audio.src = audio_in_cache.src;
    -490                         audio.preload = "auto";
    -491 
    -492                         if (this.isFirefox) {
    -493                             audio.addEventListener(
    -494                                 'ended',
    -495                                 // on sound end, set channel to available channels list.
    -496                                 function (audioEvent) {
    -497                                     var target = audioEvent.target;
    -498                                     target.currentTime = 0;
    -499                                 },
    -500                                 false
    -501                             );
    -502                         } else {
    -503                             audio.loop = true;
    -504                         }
    -505                         audio.load();
    -506                         audio.play();
    -507                         this.loopingChannels.push(audio);
    -508                         return audio;
    -509                     }
    -510                 }
    -511 
    -512                 return null;
    -513             },
    -514             /**
    -515              * Cancel all playing audio channels
    -516              * Get back the playing channels to available channel list.
    -517              *
    -518              * @return this
    -519              */
    -520             endSound:function () {
    -521                 var i;
    -522                 for (i = 0; i < this.workingChannels.length; i++) {
    -523                     this.workingChannels[i].pause();
    -524                     this.channels.push(this.workingChannels[i]);
    -525                 }
    -526 
    -527                 for (i = 0; i < this.loopingChannels.length; i++) {
    -528                     this.loopingChannels[i].pause();
    -529                 }
    -530 
    -531                 this.workingChannels= [];
    -532                 this.loopingChannels= [];
    -533 
    -534                 this.stopMusic();
    -535 
    -536                 return this;
    -537             },
    -538             setSoundEffectsEnabled:function (enable) {
    -539                 this.fxEnabled = enable;
    -540                 for (var i = 0; i < this.loopingChannels.length; i++) {
    -541                     if (enable) {
    -542                         this.loopingChannels[i].play();
    -543                     } else {
    -544                         this.loopingChannels[i].pause();
    -545                     }
    -546                 }
    -547                 return this;
    -548             },
    -549             isSoundEffectsEnabled:function () {
    -550                 return this.fxEnabled;
    -551             },
    -552             setMusicEnabled:function (enable) {
    -553                 this.musicEnabled = enable;
    -554                 this.stopMusic();
    -555                 return this;
    -556             },
    -557             isMusicEnabled:function () {
    -558                 return this.musicEnabled;
    -559             }
    -560         }
    -561     }
    -562 });
    -563 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CSS_csskeyframehelper.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CSS_csskeyframehelper.js.html deleted file mode 100644 index b5ae464d..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CSS_csskeyframehelper.js.html +++ /dev/null @@ -1,185 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * This object manages CSS3 transitions reflecting applying behaviors.
    -  5  *
    -  6  **/
    -  7 
    -  8 (function() {
    -  9 
    - 10     /**
    - 11      * @name CSS
    - 12      * @memberOf CAAT
    - 13      * @namespace
    - 14      */
    - 15 
    - 16     CAAT.CSS= {};
    - 17 
    - 18     /**
    - 19      * @lends CAAT.CSS
    - 20      */
    - 21 
    - 22 
    - 23     /**
    - 24      * Guess a browser custom prefix.
    - 25      * @type {*}
    - 26      */
    - 27     CAAT.CSS.PREFIX= (function() {
    - 28 
    - 29         var prefix = "";
    - 30         var prefixes = ['WebKit', 'Moz', 'O'];
    - 31         var keyframes= "";
    - 32 
    - 33         // guess this browser vendor prefix.
    - 34         for (var i = 0; i < prefixes.length; i++) {
    - 35             if (window[prefixes[i] + 'CSSKeyframeRule']) {
    - 36                 prefix = prefixes[i].toLowerCase();
    - 37                 break;
    - 38             }
    - 39         }
    - 40 
    - 41         CAAT.CSS.PROP_ANIMATION= '-'+prefix+'-animation';
    - 42 
    - 43         return prefix;
    - 44     })();
    - 45 
    - 46     /**
    - 47      * Apply a given @key-frames animation to a DOM element.
    - 48      * @param domElement {DOMElement}
    - 49      * @param name {string} animation name
    - 50      * @param duration_millis {number}
    - 51      * @param delay_millis {number}
    - 52      * @param forever {boolean}
    - 53      */
    - 54     CAAT.CSS.applyKeyframe= function( domElement, name, duration_millis, delay_millis, forever ) {
    - 55         domElement.style[CAAT.CSS.PROP_ANIMATION]= name+' '+(duration_millis/1000)+'s '+(delay_millis/1000)+'s linear both '+(forever ? 'infinite' : '') ;
    - 56     };
    - 57 
    - 58     /**
    - 59      * Remove a @key-frames animation from the stylesheet.
    - 60      * @param name
    - 61      */
    - 62     CAAT.CSS.unregisterKeyframes= function( name ) {
    - 63         var index= CAAT.CSS.getCSSKeyframesIndex(name);
    - 64         if ( null!==index ) {
    - 65             document.styleSheets[ index.sheetIndex ].deleteRule( index.index );
    - 66         }
    - 67     };
    - 68 
    - 69     /**
    - 70      *
    - 71      * @param kfDescriptor {object}
    - 72      *      {
    - 73      *          name{string},
    - 74      *          behavior{CAAT.Behavior},
    - 75      *          size{!number},
    - 76      *          overwrite{boolean}
    - 77      *      }
    - 78      *  }
    - 79      */
    - 80     CAAT.CSS.registerKeyframes= function( kfDescriptor ) {
    - 81 
    - 82         var name=       kfDescriptor.name;
    - 83         var behavior=   kfDescriptor.behavior;
    - 84         var size=       kfDescriptor.size;
    - 85         var overwrite=  kfDescriptor.overwrite;
    - 86 
    - 87         if ( typeof name==='undefined' || typeof behavior==='undefined' ) {
    - 88             throw 'Keyframes must be defined by a name and a CAAT.Behavior instance.';
    - 89         }
    - 90 
    - 91         if ( typeof size==='undefined' ) {
    - 92             size= 100;
    - 93         }
    - 94         if ( typeof overwrite==='undefined' ) {
    - 95             overwrite= false;
    - 96         }
    - 97 
    - 98         // find if keyframes has already a name set.
    - 99         var cssRulesIndex= CAAT.CSS.getCSSKeyframesIndex(name);
    -100         if (null!==cssRulesIndex && !overwrite) {
    -101             return;
    -102         }
    -103 
    -104         var keyframesRule= behavior.calculateKeyFramesData(CAAT.CSS.PREFIX, name, size, kfDescriptor.anchorX, kfDescriptor.anchorY );
    -105 
    -106         if (document.styleSheets) {
    -107             if ( !document.styleSheets.length) {
    -108                 var s = document.createElement('style');
    -109                 s.type="text/css";
    -110 
    -111                 document.getElementsByTagName('head')[ 0 ].appendChild(s);
    -112             }
    -113 
    -114             if ( null!==cssRulesIndex ) {
    -115                 document.styleSheets[ cssRulesIndex.sheetIndex ].deleteRule( cssRulesIndex.index );
    -116             }
    -117 
    -118             var index= cssRulesIndex ? cssRulesIndex.sheetIndex : 0;
    -119             document.styleSheets[ index ].insertRule( keyframesRule, 0 );
    -120         }
    -121 
    -122         return keyframesRule;
    -123     };
    -124 
    -125     CAAT.CSS.getCSSKeyframesIndex= function(name) {
    -126         var ss = document.styleSheets;
    -127         for (var i = ss.length - 1; i >= 0; i--) {
    -128             try {
    -129                 var s = ss[i],
    -130                     rs = s.cssRules ? s.cssRules :
    -131                          s.rules ? s.rules :
    -132                          [];
    -133 
    -134                 for (var j = rs.length - 1; j >= 0; j--) {
    -135                     if ( ( rs[j].type === window.CSSRule.WEBKIT_KEYFRAMES_RULE ||
    -136                            rs[j].type === window.CSSRule.MOZ_KEYFRAMES_RULE ) && rs[j].name === name) {
    -137 
    -138                         return {
    -139                             sheetIndex : i,
    -140                             index: j
    -141                         };
    -142                     }
    -143                 }
    -144             } catch(e) {
    -145             }
    -146         }
    -147 
    -148         return null;
    -149     };
    -150 
    -151     CAAT.CSS.getCSSKeyframes= function(name) {
    -152 
    -153         var ss = document.styleSheets;
    -154         for (var i = ss.length - 1; i >= 0; i--) {
    -155             try {
    -156                 var s = ss[i],
    -157                     rs = s.cssRules ? s.cssRules :
    -158                          s.rules ? s.rules :
    -159                          [];
    -160 
    -161                 for (var j = rs.length - 1; j >= 0; j--) {
    -162                     if ( ( rs[j].type === window.CSSRule.WEBKIT_KEYFRAMES_RULE ||
    -163                            rs[j].type === window.CSSRule.MOZ_KEYFRAMES_RULE ) && rs[j].name === name) {
    -164 
    -165                         return rs[j];
    -166                     }
    -167                 }
    -168             }
    -169             catch(e) {
    -170             }
    -171         }
    -172         return null;
    -173     };
    -174 
    -175 
    -176 
    -177 })();
    -178 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_Quadtree.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_Quadtree.js.html deleted file mode 100644 index caa5c240..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_Quadtree.js.html +++ /dev/null @@ -1,138 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * This file contains the definition for objects QuadTree and HashMap.
    -  5  * Quadtree offers an exact list of collisioning areas, while HashMap offers a list of potentially colliding
    -  6  * elements.
    -  7  * Specially suited for static content.
    -  8  *
    -  9  **/
    - 10 
    - 11 CAAT.Module({
    - 12 
    - 13     /**
    - 14      * @name Collision
    - 15      * @memberOf CAAT.Module
    - 16      * @namespace
    - 17      */
    - 18 
    - 19     /**
    - 20      * @name QuadTree
    - 21      * @memberOf CAAT.Module.Collision
    - 22      * @constructor
    - 23      */
    - 24 
    - 25     defines:"CAAT.Module.Collision.QuadTree",
    - 26     depends:[
    - 27         "CAAT.Math.Rectangle"
    - 28     ],
    - 29     extendsClass:"CAAT.Math.Rectangle",
    - 30     extendsWith:function () {
    - 31 
    - 32         var QT_MAX_ELEMENTS = 1;
    - 33         var QT_MIN_WIDTH = 32;
    - 34 
    - 35         return {
    - 36 
    - 37             /**
    - 38              * @lends CAAT.Module.Collision.QuadTree.prototype
    - 39              */
    - 40 
    - 41             /**
    - 42              * For each quadtree level this keeps the list of overlapping elements.
    - 43              */
    - 44             bgActors:null,
    - 45 
    - 46             /**
    - 47              * For each quadtree, this quadData keeps another 4 quadtrees up to the  maximum recursion level.
    - 48              */
    - 49             quadData:null,
    - 50 
    - 51             create:function (l, t, r, b, backgroundElements, minWidth, maxElements) {
    - 52 
    - 53                 if (typeof minWidth === 'undefined') {
    - 54                     minWidth = QT_MIN_WIDTH;
    - 55                 }
    - 56                 if (typeof maxElements === 'undefined') {
    - 57                     maxElements = QT_MAX_ELEMENTS;
    - 58                 }
    - 59 
    - 60                 var cx = (l + r) / 2;
    - 61                 var cy = (t + b) / 2;
    - 62 
    - 63                 this.x = l;
    - 64                 this.y = t;
    - 65                 this.x1 = r;
    - 66                 this.y1 = b;
    - 67                 this.width = r - l;
    - 68                 this.height = b - t;
    - 69 
    - 70                 this.bgActors = this.__getOverlappingActorList(backgroundElements);
    - 71 
    - 72                 if (this.bgActors.length <= maxElements || this.width <= minWidth) {
    - 73                     return this;
    - 74                 }
    - 75 
    - 76                 this.quadData = new Array(4);
    - 77                 this.quadData[0] = new CAAT.Module.Collision.QuadTree().create(l, t, cx, cy, this.bgActors);  // TL
    - 78                 this.quadData[1] = new CAAT.Module.Collision.QuadTree().create(cx, t, r, cy, this.bgActors);  // TR
    - 79                 this.quadData[2] = new CAAT.Module.Collision.QuadTree().create(l, cy, cx, b, this.bgActors);  // BL
    - 80                 this.quadData[3] = new CAAT.Module.Collision.QuadTree().create(cx, cy, r, b, this.bgActors);
    - 81 
    - 82                 return this;
    - 83             },
    - 84 
    - 85             __getOverlappingActorList:function (actorList) {
    - 86                 var tmpList = [];
    - 87                 for (var i = 0, l = actorList.length; i < l; i++) {
    - 88                     var actor = actorList[i];
    - 89                     if (this.intersects(actor.AABB)) {
    - 90                         tmpList.push(actor);
    - 91                     }
    - 92                 }
    - 93                 return tmpList;
    - 94             },
    - 95 
    - 96             /**
    - 97              * Call this method to thet the list of colliding elements with the parameter rectangle.
    - 98              * @param rectangle
    - 99              * @return {Array}
    -100              */
    -101             getOverlappingActors:function (rectangle) {
    -102                 var i, j, l;
    -103                 var overlappingActors = [];
    -104                 var qoverlappingActors;
    -105                 var actors = this.bgActors;
    -106                 var actor;
    -107 
    -108                 if (this.quadData) {
    -109                     for (i = 0; i < 4; i++) {
    -110                         if (this.quadData[i].intersects(rectangle)) {
    -111                             qoverlappingActors = this.quadData[i].getOverlappingActors(rectangle);
    -112                             for (j = 0, l = qoverlappingActors.length; j < l; j++) {
    -113                                 overlappingActors.push(qoverlappingActors[j]);
    -114                             }
    -115                         }
    -116                     }
    -117                 } else {
    -118                     for (i = 0, l = actors.length; i < l; i++) {
    -119                         actor = actors[i];
    -120                         if (rectangle.intersects(actor.AABB)) {
    -121                             overlappingActors.push(actor);
    -122                         }
    -123                     }
    -124                 }
    -125 
    -126                 return overlappingActors;
    -127             }
    -128         }
    -129     }
    -130 });
    -131 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_SpatialHash.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_SpatialHash.js.html deleted file mode 100644 index 14a0e524..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_SpatialHash.js.html +++ /dev/null @@ -1,247 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3 
    -  4     /**
    -  5      * @name SpatialHash
    -  6      * @memberOf CAAT.Module.Collision
    -  7      * @constructor
    -  8      */
    -  9 
    - 10 
    - 11     defines : "CAAT.Module.Collision.SpatialHash",
    - 12     aliases : ["CAAT.SpatialHash"],
    - 13     depends : [
    - 14         "CAAT.Math.Rectangle"
    - 15     ],
    - 16     extendsWith : {
    - 17 
    - 18         /**
    - 19          * @lends CAAT.Module.Collision.SpatialHash.prototype
    - 20          */
    - 21 
    - 22         /**
    - 23          * A collection ob objects to test collision among them.
    - 24          */
    - 25         elements    :   null,
    - 26 
    - 27         /**
    - 28          * Space width
    - 29          */
    - 30         width       :   null,
    - 31 
    - 32         /**
    - 33          * Space height
    - 34          */
    - 35         height      :   null,
    - 36 
    - 37         /**
    - 38          * Rows to partition the space.
    - 39          */
    - 40         rows        :   null,
    - 41 
    - 42         /**
    - 43          * Columns to partition the space.
    - 44          */
    - 45         columns     :   null,
    - 46 
    - 47         xcache      :   null,
    - 48         ycache      :   null,
    - 49         xycache     :   null,
    - 50 
    - 51         rectangle   :   null,
    - 52 
    - 53         /**
    - 54          * Spare rectangle to hold temporary calculations.
    - 55          */
    - 56         r0          :   null,
    - 57 
    - 58         /**
    - 59          * Spare rectangle to hold temporary calculations.
    - 60          */
    - 61         r1          :   null,
    - 62 
    - 63         initialize : function( w,h, rows,columns ) {
    - 64 
    - 65             var i, j;
    - 66 
    - 67             this.elements= [];
    - 68             for( i=0; i<rows*columns; i++ ) {
    - 69                 this.elements.push( [] );
    - 70             }
    - 71 
    - 72             this.width=     w;
    - 73             this.height=    h;
    - 74 
    - 75             this.rows=      rows;
    - 76             this.columns=   columns;
    - 77 
    - 78             this.xcache= [];
    - 79             for( i=0; i<w; i++ ) {
    - 80                 this.xcache.push( (i/(w/columns))>>0 );
    - 81             }
    - 82 
    - 83             this.ycache= [];
    - 84             for( i=0; i<h; i++ ) {
    - 85                 this.ycache.push( (i/(h/rows))>>0 );
    - 86             }
    - 87 
    - 88             this.xycache=[];
    - 89             for( i=0; i<this.rows; i++ ) {
    - 90 
    - 91                 this.xycache.push( [] );
    - 92                 for( j=0; j<this.columns; j++ ) {
    - 93                     this.xycache[i].push( j + i*columns  );
    - 94                 }
    - 95             }
    - 96 
    - 97             this.rectangle= new CAAT.Math.Rectangle().setBounds( 0, 0, w, h );
    - 98             this.r0=        new CAAT.Math.Rectangle();
    - 99             this.r1=        new CAAT.Math.Rectangle();
    -100 
    -101             return this;
    -102         },
    -103 
    -104         clearObject : function() {
    -105             var i;
    -106 
    -107             for( i=0; i<this.rows*this.columns; i++ ) {
    -108                 this.elements[i]= [];
    -109             }
    -110 
    -111             return this;
    -112         },
    -113 
    -114         /**
    -115          * Add an element of the form { id, x,y,width,height, rectangular }
    -116          */
    -117         addObject : function( obj  ) {
    -118             var x= obj.x|0;
    -119             var y= obj.y|0;
    -120             var width= obj.width|0;
    -121             var height= obj.height|0;
    -122 
    -123             var cells= this.__getCells( x,y,width,height );
    -124             for( var i=0; i<cells.length; i++ ) {
    -125                 this.elements[ cells[i] ].push( obj );
    -126             }
    -127         },
    -128 
    -129         __getCells : function( x,y,width,height ) {
    -130 
    -131             var cells= [];
    -132             var i;
    -133 
    -134             if ( this.rectangle.contains(x,y) ) {
    -135                 cells.push( this.xycache[ this.ycache[y] ][ this.xcache[x] ] );
    -136             }
    -137 
    -138             /**
    -139              * if both squares lay inside the same cell, it is not crossing a boundary.
    -140              */
    -141             if ( this.rectangle.contains(x+width-1,y+height-1) ) {
    -142                 var c= this.xycache[ this.ycache[y+height-1] ][ this.xcache[x+width-1] ];
    -143                 if ( c===cells[0] ) {
    -144                     return cells;
    -145                 }
    -146                 cells.push( c );
    -147             }
    -148 
    -149             /**
    -150              * the other two AABB points lie inside the screen as well.
    -151              */
    -152             if ( this.rectangle.contains(x+width-1,y) ) {
    -153                 var c= this.xycache[ this.ycache[y] ][ this.xcache[x+width-1] ];
    -154                 if ( c===cells[0] || c===cells[1] ) {
    -155                     return cells;
    -156                 }
    -157                 cells.push(c);
    -158             }
    -159 
    -160             // worst case, touching 4 screen cells.
    -161             if ( this.rectangle.contains(x+width-1,y+height-1) ) {
    -162                 var c= this.xycache[ this.ycache[y+height-1] ][ this.xcache[x] ];
    -163                 cells.push(c);
    -164             }
    -165 
    -166             return cells;
    -167         },
    -168 
    -169         solveCollision : function( callback ) {
    -170             var i,j,k;
    -171 
    -172             for( i=0; i<this.elements.length; i++ ) {
    -173                 var cell= this.elements[i];
    -174 
    -175                 if ( cell.length>1 ) {  // at least 2 elements could collide
    -176                     this._solveCollisionCell( cell, callback );
    -177                 }
    -178             }
    -179         },
    -180 
    -181         _solveCollisionCell : function( cell, callback ) {
    -182             var i,j;
    -183 
    -184             for( i=0; i<cell.length; i++ ) {
    -185 
    -186                 var pivot= cell[i];
    -187                 this.r0.setBounds( pivot.x, pivot.y, pivot.width, pivot.height );
    -188 
    -189                 for( j=i+1; j<cell.length; j++ ) {
    -190                     var c= cell[j];
    -191 
    -192                     if ( this.r0.intersects( this.r1.setBounds( c.x, c.y, c.width, c.height ) ) ) {
    -193                         callback( pivot, c );
    -194                     }
    -195                 }
    -196             }
    -197         },
    -198 
    -199         /**
    -200          *
    -201          * @param x
    -202          * @param y
    -203          * @param w
    -204          * @param h
    -205          * @param oncollide function that returns boolean. if returns true, stop testing collision.
    -206          */
    -207         collide : function( x,y,w,h, oncollide ) {
    -208             x|=0;
    -209             y|=0;
    -210             w|=0;
    -211             h|=0;
    -212 
    -213             var cells= this.__getCells( x,y,w,h );
    -214             var i,j,l;
    -215             var el= this.elements;
    -216 
    -217             this.r0.setBounds( x,y,w,h );
    -218 
    -219             for( i=0; i<cells.length; i++ ) {
    -220                 var cell= cells[i];
    -221 
    -222                 var elcell= el[cell];
    -223                 for( j=0, l=elcell.length; j<l; j++ ) {
    -224                     var obj= elcell[j];
    -225 
    -226                     this.r1.setBounds( obj.x, obj.y, obj.width, obj.height );
    -227 
    -228                     // collides
    -229                     if ( this.r0.intersects( this.r1 ) ) {
    -230                         if ( oncollide(obj) ) {
    -231                             return;
    -232                         }
    -233                     }
    -234                 }
    -235             }
    -236         }
    -237 
    -238     }
    -239 });
    -240 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_ColorUtil_Color.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_ColorUtil_Color.js.html deleted file mode 100644 index 3cb5b8f5..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_ColorUtil_Color.js.html +++ /dev/null @@ -1,301 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * @author: Mario Gonzalez (@onedayitwilltake) and Ibon Tolosana (@hyperandroid)
    -  5  *
    -  6  * Helper classes for color manipulation.
    -  7  *
    -  8  **/
    -  9 
    - 10 CAAT.Module({
    - 11 
    - 12     /**
    - 13      * @name ColorUtil
    - 14      * @memberOf CAAT.Module
    - 15      * @namespace
    - 16      */
    - 17 
    - 18     /**
    - 19      * @name Color
    - 20      * @memberOf CAAT.Module.ColorUtil
    - 21      * @namespace
    - 22      */
    - 23 
    - 24 
    - 25     defines:"CAAT.Module.ColorUtil.Color",
    - 26     depends:[
    - 27     ],
    - 28     constants:{
    - 29 
    - 30         /**
    - 31          * @lends CAAT.Module.ColorUtil.Color
    - 32          */
    - 33 
    - 34         /**
    - 35          * Enumeration to define types of color ramps.
    - 36          * @enum {number}
    - 37          */
    - 38         RampEnumeration:{
    - 39             RAMP_RGBA:0,
    - 40             RAMP_RGB:1,
    - 41             RAMP_CHANNEL_RGB:2,
    - 42             RAMP_CHANNEL_RGBA:3,
    - 43             RAMP_CHANNEL_RGB_ARRAY:4,
    - 44             RAMP_CHANNEL_RGBA_ARRAY:5
    - 45         },
    - 46 
    - 47         /**
    - 48          * HSV to RGB color conversion
    - 49          * <p>
    - 50          * H runs from 0 to 360 degrees<br>
    - 51          * S and V run from 0 to 100
    - 52          * <p>
    - 53          * Ported from the excellent java algorithm by Eugene Vishnevsky at:
    - 54          * http://www.cs.rit.edu/~ncs/color/t_convert.html
    - 55          *
    - 56          * @static
    - 57          */
    - 58         hsvToRgb:function (h, s, v) {
    - 59             var r, g, b, i, f, p, q, t;
    - 60 
    - 61             // Make sure our arguments stay in-range
    - 62             h = Math.max(0, Math.min(360, h));
    - 63             s = Math.max(0, Math.min(100, s));
    - 64             v = Math.max(0, Math.min(100, v));
    - 65 
    - 66             // We accept saturation and value arguments from 0 to 100 because that's
    - 67             // how Photoshop represents those values. Internally, however, the
    - 68             // saturation and value are calculated from a range of 0 to 1. We make
    - 69             // That conversion here.
    - 70             s /= 100;
    - 71             v /= 100;
    - 72 
    - 73             if (s === 0) {
    - 74                 // Achromatic (grey)
    - 75                 r = g = b = v;
    - 76                 return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
    - 77             }
    - 78 
    - 79             h /= 60; // sector 0 to 5
    - 80             i = Math.floor(h);
    - 81             f = h - i; // factorial part of h
    - 82             p = v * (1 - s);
    - 83             q = v * (1 - s * f);
    - 84             t = v * (1 - s * (1 - f));
    - 85 
    - 86             switch (i) {
    - 87                 case 0:
    - 88                     r = v;
    - 89                     g = t;
    - 90                     b = p;
    - 91                     break;
    - 92 
    - 93                 case 1:
    - 94                     r = q;
    - 95                     g = v;
    - 96                     b = p;
    - 97                     break;
    - 98 
    - 99                 case 2:
    -100                     r = p;
    -101                     g = v;
    -102                     b = t;
    -103                     break;
    -104 
    -105                 case 3:
    -106                     r = p;
    -107                     g = q;
    -108                     b = v;
    -109                     break;
    -110 
    -111                 case 4:
    -112                     r = t;
    -113                     g = p;
    -114                     b = v;
    -115                     break;
    -116 
    -117                 default: // case 5:
    -118                     r = v;
    -119                     g = p;
    -120                     b = q;
    -121             }
    -122 
    -123             return new CAAT.Module.ColorUtil.Color(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255));
    -124         },
    -125 
    -126         /**
    -127          * Interpolate the color between two given colors. The return value will be a calculated color
    -128          * among the two given initial colors which corresponds to the 'step'th color of the 'nsteps'
    -129          * calculated colors.
    -130          * @param r0 {number} initial color red component.
    -131          * @param g0 {number} initial color green component.
    -132          * @param b0 {number} initial color blue component.
    -133          * @param r1 {number} final color red component.
    -134          * @param g1 {number} final color green component.
    -135          * @param b1 {number} final color blue component.
    -136          * @param nsteps {number} number of colors to calculate including the two given colors. If 16 is passed as value,
    -137          * 14 colors plus the two initial ones will be calculated.
    -138          * @param step {number} return this color index of all the calculated colors.
    -139          *
    -140          * @return { {r{number}, g{number}, b{number}} } return an object with the new calculated color components.
    -141          * @static
    -142          */
    -143         interpolate:function (r0, g0, b0, r1, g1, b1, nsteps, step) {
    -144 
    -145             var r, g, b;
    -146 
    -147             if (step <= 0) {
    -148                 return {
    -149                     r:r0,
    -150                     g:g0,
    -151                     b:b0
    -152                 };
    -153             } else if (step >= nsteps) {
    -154                 return {
    -155                     r:r1,
    -156                     g:g1,
    -157                     b:b1
    -158                 };
    -159             }
    -160 
    -161             r = (r0 + (r1 - r0) / nsteps * step) >> 0;
    -162             g = (g0 + (g1 - g0) / nsteps * step) >> 0;
    -163             b = (b0 + (b1 - b0) / nsteps * step) >> 0;
    -164 
    -165             if (r > 255) {
    -166                 r = 255;
    -167             } else if (r < 0) {
    -168                 r = 0;
    -169             }
    -170             if (g > 255) {
    -171                 g = 255;
    -172             } else if (g < 0) {
    -173                 g = 0;
    -174             }
    -175             if (b > 255) {
    -176                 b = 255;
    -177             } else if (b < 0) {
    -178                 b = 0;
    -179             }
    -180 
    -181             return {
    -182                 r:r,
    -183                 g:g,
    -184                 b:b
    -185             };
    -186         },
    -187 
    -188         /**
    -189          * Generate a ramp of colors from an array of given colors.
    -190          * @param fromColorsArray {[number]} an array of colors. each color is defined by an integer number from which
    -191          * color components will be extracted. Be aware of the alpha component since it will also be interpolated for
    -192          * new colors.
    -193          * @param rampSize {number} number of colors to produce.
    -194          * @param returnType {CAAT.ColorUtils.RampEnumeration} a value of CAAT.ColorUtils.RampEnumeration enumeration.
    -195          *
    -196          * @return { [{number},{number},{number},{number}] } an array of integers each of which represents a color of
    -197          * the calculated color ramp.
    -198          *
    -199          * @static
    -200          */
    -201         makeRGBColorRamp:function (fromColorsArray, rampSize, returnType) {
    -202 
    -203             var ramp = [], nc = fromColorsArray.length - 1, chunk = rampSize / nc, i, j,
    -204                 na, nr, ng, nb,
    -205                 c, a0, r0, g0, b0,
    -206                 c1, a1, r1, g1, b1,
    -207                 da, dr, dg, db;
    -208 
    -209             for (i = 0; i < nc; i += 1) {
    -210                 c = fromColorsArray[i];
    -211                 a0 = (c >> 24) & 0xff;
    -212                 r0 = (c & 0xff0000) >> 16;
    -213                 g0 = (c & 0xff00) >> 8;
    -214                 b0 = c & 0xff;
    -215 
    -216                 c1 = fromColorsArray[i + 1];
    -217                 a1 = (c1 >> 24) & 0xff;
    -218                 r1 = (c1 & 0xff0000) >> 16;
    -219                 g1 = (c1 & 0xff00) >> 8;
    -220                 b1 = c1 & 0xff;
    -221 
    -222                 da = (a1 - a0) / chunk;
    -223                 dr = (r1 - r0) / chunk;
    -224                 dg = (g1 - g0) / chunk;
    -225                 db = (b1 - b0) / chunk;
    -226 
    -227                 for (j = 0; j < chunk; j += 1) {
    -228                     na = (a0 + da * j) >> 0;
    -229                     nr = (r0 + dr * j) >> 0;
    -230                     ng = (g0 + dg * j) >> 0;
    -231                     nb = (b0 + db * j) >> 0;
    -232 
    -233                     var re = CAAT.Module.ColorUtil.Color.RampEnumeration;
    -234 
    -235                     switch (returnType) {
    -236                         case re.RAMP_RGBA:
    -237                             ramp.push('argb(' + na + ',' + nr + ',' + ng + ',' + nb + ')');
    -238                             break;
    -239                         case re.RAMP_RGB:
    -240                             ramp.push('rgb(' + nr + ',' + ng + ',' + nb + ')');
    -241                             break;
    -242                         case re.RAMP_CHANNEL_RGB:
    -243                             ramp.push(0xff000000 | nr << 16 | ng << 8 | nb);
    -244                             break;
    -245                         case re.RAMP_CHANNEL_RGBA:
    -246                             ramp.push(na << 24 | nr << 16 | ng << 8 | nb);
    -247                             break;
    -248                         case re.RAMP_CHANNEL_RGBA_ARRAY:
    -249                             ramp.push([ nr, ng, nb, na ]);
    -250                             break;
    -251                         case re.RAMP_CHANNEL_RGB_ARRAY:
    -252                             ramp.push([ nr, ng, nb ]);
    -253                             break;
    -254                     }
    -255                 }
    -256             }
    -257 
    -258             return ramp;
    -259 
    -260         },
    -261 
    -262         random:function () {
    -263             var a = '0123456789abcdef';
    -264             var c = '#';
    -265             for (var i = 0; i < 3; i++) {
    -266                 c += a[ (Math.random() * a.length) >> 0 ];
    -267             }
    -268             return c;
    -269         }
    -270     },
    -271 
    -272     extendsWith:{
    -273         __init:function (r, g, b) {
    -274             this.r = r || 255;
    -275             this.g = g || 255;
    -276             this.b = b || 255;
    -277             return this;
    -278         },
    -279 
    -280         r:255,
    -281         g:255,
    -282         b:255,
    -283 
    -284         /**
    -285          * Get color hexadecimal representation.
    -286          * @return {string} a string with color hexadecimal representation.
    -287          */
    -288         toHex:function () {
    -289             // See: http://jsperf.com/rgb-decimal-to-hex/5
    -290             return ('000000' + ((this.r << 16) + (this.g << 8) + this.b).toString(16)).slice(-6);
    -291         }
    -292     }
    -293 });
    -294 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Debug_Debug.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Debug_Debug.js.html deleted file mode 100644 index 8ea2dc42..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Debug_Debug.js.html +++ /dev/null @@ -1,473 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * Get realtime Debug information of CAAT's activity.
    -  5  * Set CAAT.DEBUG=1 before any CAAT.Director object creation.
    -  6  * This class creates a DOM node called 'caat-debug' and associated styles
    -  7  * The debug panel is minimized by default and shows short information. It can be expanded and minimized again by clicking on it
    -  8  *
    -  9  */
    - 10 
    - 11 CAAT.Module( {
    - 12 
    - 13     /**
    - 14      * @name Debug
    - 15      * @memberOf CAAT.Module
    - 16      * @namespace
    - 17      */
    - 18 
    - 19     /**
    - 20      * @name Debug
    - 21      * @memberOf CAAT.Module.Debug
    - 22      * @constructor
    - 23      */
    - 24 
    - 25     defines : "CAAT.Module.Debug.Debug",
    - 26     depends : [
    - 27         "CAAT.Event.AnimationLoop"
    - 28     ],
    - 29     extendsWith : {
    - 30 
    - 31         /**
    - 32          * @lends CAAT.Module.Debug.Debug.prototype
    - 33          */
    - 34 
    - 35         width:              0,
    - 36         height:             0,
    - 37         canvas:             null,
    - 38         ctx:                null,
    - 39         statistics:         null,
    - 40         framerate:          null,
    - 41         textContainer:      null,
    - 42         textFPS:            null,
    - 43         textEntitiesTotal:  null,
    - 44         textEntitiesActive: null,
    - 45         textDraws:          null,
    - 46         textDrawTime:       null,
    - 47         textRAFTime:        null,
    - 48         textDirtyRects:     null,
    - 49         textDiscardDR:      null,
    - 50 
    - 51         frameTimeAcc :      0,
    - 52         frameRAFAcc :       0,
    - 53 
    - 54         canDebug:           false,
    - 55 
    - 56         SCALE:  60,
    - 57 
    - 58         debugTpl: 
    - 59             "    <style type=\"text/css\">"+
    - 60             "        #caat-debug {"+
    - 61             "            z-index: 10000;"+
    - 62             "            position:fixed;"+
    - 63             "            bottom:0;"+
    - 64             "            left:0;"+
    - 65             "            width:100%;"+
    - 66             "            background-color: rgba(0,0,0,0.8);"+
    - 67             "        }"+
    - 68             "        #caat-debug.caat_debug_max {"+
    - 69             "            margin-bottom: 0px;"+
    - 70             "        }"+
    - 71             "        .caat_debug_bullet {"+
    - 72             "            display:inline-block;"+
    - 73             "            background-color:#f00;"+
    - 74             "            width:8px;"+
    - 75             "            height:8px;"+
    - 76             "            border-radius: 4px;"+
    - 77             "            margin-left:10px;"+
    - 78             "            margin-right:2px;"+
    - 79             "        }"+
    - 80             "        .caat_debug_description {"+
    - 81             "            font-size:11px;"+
    - 82             "            font-family: helvetica, arial;"+
    - 83             "            color: #aaa;"+
    - 84             "            display: inline-block;"+
    - 85             "        }"+
    - 86             "        .caat_debug_value {"+
    - 87             "            font-size:11px;"+
    - 88             "            font-family: helvetica, arial;"+
    - 89             "            color: #fff;"+
    - 90             "            width:25px;"+
    - 91             "            text-align: right;"+
    - 92             "            display: inline-block;"+
    - 93             "            margin-right: .3em;"+
    - 94             "        }"+
    - 95             "        .caat_debug_indicator {"+
    - 96             "            float: right;"+
    - 97             "        }"+
    - 98             "        #debug_tabs {"+
    - 99             "            border-top: 1px solid #888;"+
    -100             "            height:25px;"+
    -101             "        }"+
    -102             "        .tab_max_min {"+
    -103             "            font-family: helvetica, arial;"+
    -104             "            font-size: 12px;"+
    -105             "            font-weight: bold;"+
    -106             "            color: #888;"+
    -107             "            border-right: 1px solid #888;"+
    -108             "            float: left;"+
    -109             "            cursor: pointer;"+
    -110             "            padding-left: 5px;"+
    -111             "            padding-right: 5px;"+
    -112             "            padding-top: 5px;"+
    -113             "            height: 20px;"+
    -114             "        }"+
    -115             "        .debug_tabs_content_hidden {"+
    -116             "            display: none;"+
    -117             "            width: 100%;"+
    -118             "        }"+
    -119             "        .debug_tabs_content_visible {"+
    -120             "            display: block;"+
    -121             "            width: 100%;"+
    -122             "        }"+
    -123             "        .checkbox_enabled {"+
    -124             "            display:inline-block;"+
    -125             "            background-color:#eee;"+
    -126             "            border: 1px solid #eee;"+
    -127             "            width:6px;"+
    -128             "            height:8px;"+
    -129             "            margin-left:12px;"+
    -130             "            margin-right:2px;"+
    -131             "            cursor: pointer;"+
    -132             "        }"+
    -133             "        .checkbox_disabled {"+
    -134             "            display:inline-block;"+
    -135             "            width:6px;"+
    -136             "            height:8px;"+
    -137             "            background-color: #333;"+
    -138             "            border: 1px solid #eee;"+
    -139             "            margin-left:12px;"+
    -140             "            margin-right:2px;"+
    -141             "            cursor: pointer;"+
    -142             "        }"+
    -143             "        .checkbox_description {"+
    -144             "            font-size:11px;"+
    -145             "            font-family: helvetica, arial;"+
    -146             "            color: #fff;"+
    -147             "        }"+
    -148             "        .debug_tab {"+
    -149             "            font-family: helvetica, arial;"+
    -150             "            font-size: 12px;"+
    -151             "            color: #fff;"+
    -152             "            border-right: 1px solid #888;"+
    -153             "            float: left;"+
    -154             "            padding-left: 5px;"+
    -155             "            padding-right: 5px;"+
    -156             "            height: 20px;"+
    -157             "            padding-top: 5px;"+
    -158             "            cursor: default;"+
    -159             "        }"+
    -160             "        .debug_tab_selected {"+
    -161             "            background-color: #444;"+
    -162             "            cursor: default;"+
    -163             "        }"+
    -164             "        .debug_tab_not_selected {"+
    -165             "            background-color: #000;"+
    -166             "            cursor: pointer;"+
    -167             "        }"+
    -168             "    </style>"+
    -169             "    <div id=\"caat-debug\">"+
    -170             "        <div id=\"debug_tabs\">"+
    -171             "            <span class=\"tab_max_min\" onCLick=\"javascript: var debug = document.getElementById('debug_tabs_content');if (debug.className === 'debug_tabs_content_visible') {debug.className = 'debug_tabs_content_hidden'} else {debug.className = 'debug_tabs_content_visible'}\"> CAAT Debug panel </span>"+
    -172             "            <span id=\"caat-debug-tab0\" class=\"debug_tab debug_tab_selected\">Performance</span>"+
    -173             "            <span id=\"caat-debug-tab1\" class=\"debug_tab debug_tab_not_selected\">Controls</span>"+
    -174             "            <span class=\"caat_debug_indicator\">"+
    -175             "                <span class=\"caat_debug_bullet\" style=\"background-color:#0f0;\"></span>"+
    -176             "                <span class=\"caat_debug_description\">Draw Time: </span>"+
    -177             "                <span class=\"caat_debug_value\" id=\"textDrawTime\">5.46</span>"+
    -178             "                <span class=\"caat_debug_description\">ms.</span>"+
    -179             "            </span>"+
    -180             "            <span class=\"caat_debug_indicator\">"+
    -181             "                <span class=\"caat_debug_bullet\" style=\"background-color:#f00;\"></span>"+
    -182             "                <span class=\"caat_debug_description\">FPS: </span>"+
    -183             "                <span class=\"caat_debug_value\" id=\"textFPS\">48</span>"+
    -184             "            </span>"+
    -185             "        </div>"+
    -186             "        <div id=\"debug_tabs_content\" class=\"debug_tabs_content_hidden\">"+
    -187             "            <div id=\"caat-debug-tab0-content\">"+
    -188             "                <canvas id=\"caat-debug-canvas\" height=\"60\"></canvas>"+
    -189             "                <div>"+
    -190             "                    <span>"+
    -191             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#0f0;\"></span>"+
    -192             "                        <span class=\"caat_debug_description\">RAF Time:</span>"+
    -193             "                        <span class=\"caat_debug_value\" id=\"textRAFTime\">20.76</span>"+
    -194             "                        <span class=\"caat_debug_description\">ms.</span>"+
    -195             "                    </span>"+
    -196             "                    <span>"+
    -197             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#0ff;\"></span>"+
    -198             "                        <span class=\"caat_debug_description\">Entities Total: </span>"+
    -199             "                        <span class=\"caat_debug_value\" id=\"textEntitiesTotal\">41</span>"+
    -200             "                    </span>"+
    -201             "                    <span>"+
    -202             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#0ff;\"></span>"+
    -203             "                        <span class=\"caat_debug_description\">Entities Active: </span>"+
    -204             "                        <span class=\"caat_debug_value\" id=\"textEntitiesActive\">37</span>"+
    -205             "                    </span>"+
    -206             "                    <span>"+
    -207             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#00f;\"></span>"+
    -208             "                        <span class=\"caat_debug_description\">Draws: </span>"+
    -209             "                        <span class=\"caat_debug_value\" id=\"textDraws\">0</span>"+
    -210             "                    </span>"+
    -211             "                    <span>"+
    -212             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#00f;\"></span>"+
    -213             "                        <span class=\"caat_debug_description\">DirtyRects: </span>"+
    -214             "                        <span class=\"caat_debug_value\" id=\"textDirtyRects\">0</span>"+
    -215             "                    </span>"+
    -216             "                    <span>"+
    -217             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#00f;\"></span>"+
    -218             "                        <span class=\"caat_debug_description\">Discard DR: </span>"+
    -219             "                        <span class=\"caat_debug_value\" id=\"textDiscardDR\">0</span>"+
    -220             "                    </span>"+
    -221             "                </div>"+
    -222             "            </div>"+
    -223             "            <div id=\"caat-debug-tab1-content\">"+
    -224             "                <div>"+
    -225             "                    <div>"+
    -226             "                        <span id=\"control-sound\"></span>"+
    -227             "                        <span class=\"checkbox_description\">Sound</span>"+
    -228             "                    </div>"+
    -229             "                    <div>"+
    -230             "                        <span id=\"control-music\"></span>"+
    -231             "                        <span class=\"checkbox_description\">Music</span>"+
    -232             "                    </div>"+
    -233             "                    <div>"+
    -234             "                        <span id=\"control-aabb\"></span>"+
    -235             "                        <span class=\"checkbox_description\">AA Bounding Boxes</span>"+
    -236             "                    </div>"+
    -237             "                    <div>"+
    -238             "                        <span id=\"control-bb\"></span>"+
    -239             "                        <span class=\"checkbox_description\">Bounding Boxes</span>"+
    -240             "                    </div>"+
    -241             "                    <div>"+
    -242             "                        <span id=\"control-dr\"></span>"+
    -243             "                        <span class=\"checkbox_description\">Dirty Rects</span>"+
    -244             "                    </div>"+
    -245             "                </div>"+
    -246             "            </div>"+
    -247             "        </div>"+
    -248             "    </div>",
    -249 
    -250 
    -251         setScale : function(s) {
    -252             this.scale= s;
    -253             return this;
    -254         },
    -255 
    -256         initialize: function(w,h) {
    -257             w= window.innerWidth;
    -258 
    -259             this.width= w;
    -260             this.height= h;
    -261 
    -262             this.framerate = {
    -263                 refreshInterval: CAAT.FPS_REFRESH || 500,   // refresh every ? ms, updating too quickly gives too large rounding errors
    -264                 frames: 0,                                  // number offrames since last refresh
    -265                 timeLastRefresh: 0,                         // When was the framerate counter refreshed last
    -266                 fps: 0,                                     // current framerate
    -267                 prevFps: -1,                                // previously drawn FPS
    -268                 fpsMin: 1000,                               // minimum measured framerate
    -269                 fpsMax: 0                                   // maximum measured framerate
    -270             };
    -271 
    -272             var debugContainer= document.getElementById('caat-debug');
    -273             if (!debugContainer) {
    -274                 var wrap = document.createElement('div');
    -275                 wrap.innerHTML=this.debugTpl;
    -276                 document.body.appendChild(wrap);
    -277 
    -278                 eval( ""+
    -279                     " var __x= CAAT;" +
    -280                     "        function initCheck( name, bool, callback ) {"+
    -281                     "            var elem= document.getElementById(name);"+
    -282                     "            if ( elem ) {"+
    -283                     "                elem.className= (bool) ? \"checkbox_enabled\" : \"checkbox_disabled\";"+
    -284                     "                if ( callback ) {"+
    -285                     "                    elem.addEventListener( \"click\", (function(elem, callback) {"+
    -286                     "                        return function(e) {"+
    -287                     "                            elem.__value= !elem.__value;"+
    -288                     "                            elem.className= (elem.__value) ? \"checkbox_enabled\" : \"checkbox_disabled\";"+
    -289                     "                            callback(e,elem.__value);"+
    -290                     "                        }"+
    -291                     "                    })(elem, callback), false );"+
    -292                     "                }"+
    -293                     "                elem.__value= bool;"+
    -294                     "            }"+
    -295                     "        }"+
    -296                     "        function setupTabs() {"+
    -297                     "            var numTabs=0;"+
    -298                     "            var elem;"+
    -299                     "            var elemContent;"+
    -300                     "            do {"+
    -301                     "                elem= document.getElementById(\"caat-debug-tab\"+numTabs);"+
    -302                     "                if ( elem ) {"+
    -303                     "                    elemContent= document.getElementById(\"caat-debug-tab\"+numTabs+\"-content\");"+
    -304                     "                    if ( elemContent ) {"+
    -305                     "                        elemContent.style.display= numTabs===0 ? 'block' : 'none';"+
    -306                     "                        elem.className= numTabs===0 ? \"debug_tab debug_tab_selected\" : \"debug_tab debug_tab_not_selected\";"+
    -307                     "                        elem.addEventListener( \"click\", (function(tabIndex) {"+
    -308                     "                            return function(e) {"+
    -309                     "                                for( var i=0; i<numTabs; i++ ) {"+
    -310                     "                                    var _elem= document.getElementById(\"caat-debug-tab\"+i);"+
    -311                     "                                    var _elemContent= document.getElementById(\"caat-debug-tab\"+i+\"-content\");"+
    -312                     "                                    _elemContent.style.display= i===tabIndex ? 'block' : 'none';"+
    -313                     "                                    _elem.className= i===tabIndex ? \"debug_tab debug_tab_selected\" : \"debug_tab debug_tab_not_selected\";"+
    -314                     "                                }"+
    -315                     "                            }"+
    -316                     "                        })(numTabs), false );"+
    -317                     "                    }"+
    -318                     "                    numTabs++;"+
    -319                     "                }"+
    -320                     "            } while( elem );"+
    -321                     "        }"+
    -322                     "        initCheck( \"control-sound\", __x.director[0].isSoundEffectsEnabled(), function(e, bool) {"+
    -323                     "            __x.director[0].setSoundEffectsEnabled(bool);"+
    -324                     "        } );"+
    -325                     "        initCheck( \"control-music\", __x.director[0].isMusicEnabled(), function(e, bool) {"+
    -326                     "            __x.director[0].setMusicEnabled(bool);"+
    -327                     "        } );"+
    -328                     "        initCheck( \"control-aabb\", CAAT.DEBUGBB, function(e,bool) {"+
    -329                     "            CAAT.DEBUGAABB= bool;"+
    -330                     "            __x.director[0].currentScene.dirty= true;"+
    -331                     "        } );"+
    -332                     "        initCheck( \"control-bb\", CAAT.DEBUGBB, function(e,bool) {"+
    -333                     "            CAAT.DEBUGBB= bool;"+
    -334                     "            if ( bool ) {"+
    -335                     "                CAAT.DEBUGAABB= true;"+
    -336                     "            }"+
    -337                     "            __x.director[0].currentScene.dirty= true;"+
    -338                     "        } );"+
    -339                     "        initCheck( \"control-dr\", CAAT.DEBUG_DIRTYRECTS , function( e,bool ) {"+
    -340                     "            CAAT.DEBUG_DIRTYRECTS= bool;"+
    -341                     "        });"+
    -342                     "        setupTabs();" );
    -343 
    -344             }
    -345 
    -346             this.canvas= document.getElementById('caat-debug-canvas');
    -347             if ( null===this.canvas ) {
    -348                 this.canDebug= false;
    -349                 return;
    -350             }
    -351 
    -352             this.canvas.width= w;
    -353             this.canvas.height=h;
    -354             this.ctx= this.canvas.getContext('2d');
    -355 
    -356             this.ctx.fillStyle= '#000';
    -357             this.ctx.fillRect(0,0,this.width,this.height);
    -358 
    -359             this.textFPS= document.getElementById("textFPS");
    -360             this.textDrawTime= document.getElementById("textDrawTime");
    -361             this.textRAFTime= document.getElementById("textRAFTime");
    -362             this.textEntitiesTotal= document.getElementById("textEntitiesTotal");
    -363             this.textEntitiesActive= document.getElementById("textEntitiesActive");
    -364             this.textDraws= document.getElementById("textDraws");
    -365             this.textDirtyRects= document.getElementById("textDirtyRects");
    -366             this.textDiscardDR= document.getElementById("textDiscardDR");
    -367 
    -368 
    -369             this.canDebug= true;
    -370 
    -371             return this;
    -372         },
    -373 
    -374         debugInfo : function( statistics ) {
    -375             this.statistics= statistics;
    -376 
    -377             var cc= CAAT;
    -378 
    -379             this.frameTimeAcc+= cc.FRAME_TIME;
    -380             this.frameRAFAcc+= cc.REQUEST_ANIMATION_FRAME_TIME;
    -381 
    -382             /* Update the framerate counter */
    -383             this.framerate.frames++;
    -384             var tt= new Date().getTime() ;
    -385             if ( tt> this.framerate.timeLastRefresh + this.framerate.refreshInterval ) {
    -386                 this.framerate.fps = ( ( this.framerate.frames * 1000 ) / ( tt - this.framerate.timeLastRefresh ) ) | 0;
    -387                 this.framerate.fpsMin = this.framerate.frames > 0 ? Math.min( this.framerate.fpsMin, this.framerate.fps ) : this.framerate.fpsMin;
    -388                 this.framerate.fpsMax = Math.max( this.framerate.fpsMax, this.framerate.fps );
    -389 
    -390                 this.textFPS.innerHTML= this.framerate.fps;
    -391 
    -392                 var value= ((this.frameTimeAcc*100/this.framerate.frames)|0)/100;
    -393                 this.frameTimeAcc=0;
    -394                 this.textDrawTime.innerHTML= value;
    -395 
    -396                 var value2= ((this.frameRAFAcc*100/this.framerate.frames)|0)/100;
    -397                 this.frameRAFAcc=0;
    -398                 this.textRAFTime.innerHTML= value2;
    -399 
    -400                 this.framerate.timeLastRefresh = tt;
    -401                 this.framerate.frames = 0;
    -402 
    -403                 this.paint(value2);
    -404             }
    -405 
    -406             this.textEntitiesTotal.innerHTML= this.statistics.size_total;
    -407             this.textEntitiesActive.innerHTML= this.statistics.size_active;
    -408             this.textDirtyRects.innerHTML= this.statistics.size_dirtyRects;
    -409             this.textDraws.innerHTML= this.statistics.draws;
    -410             this.textDiscardDR.innerHTML= this.statistics.size_discarded_by_dirty_rects;
    -411         },
    -412 
    -413         paint : function( rafValue ) {
    -414             var ctx= this.ctx;
    -415             var t=0;
    -416 
    -417             ctx.drawImage(
    -418                 this.canvas,
    -419                 1, 0, this.width-1, this.height,
    -420                 0, 0, this.width-1, this.height );
    -421 
    -422             ctx.strokeStyle= 'black';
    -423             ctx.beginPath();
    -424             ctx.moveTo( this.width-.5, 0 );
    -425             ctx.lineTo( this.width-.5, this.height );
    -426             ctx.stroke();
    -427 
    -428             ctx.strokeStyle= '#a22';
    -429             ctx.beginPath();
    -430             t= this.height-((20/this.SCALE*this.height)>>0)-.5;
    -431             ctx.moveTo( .5, t );
    -432             ctx.lineTo( this.width+.5, t );
    -433             ctx.stroke();
    -434 
    -435             ctx.strokeStyle= '#aa2';
    -436             ctx.beginPath();
    -437             t= this.height-((30/this.SCALE*this.height)>>0)-.5;
    -438             ctx.moveTo( .5, t );
    -439             ctx.lineTo( this.width+.5, t );
    -440             ctx.stroke();
    -441 
    -442             var fps = Math.min( this.height-(this.framerate.fps/this.SCALE*this.height), 59 );
    -443             if (-1===this.framerate.prevFps) {
    -444                 this.framerate.prevFps= fps|0;
    -445             }
    -446 
    -447             ctx.strokeStyle= '#0ff';//this.framerate.fps<15 ? 'red' : this.framerate.fps<30 ? 'yellow' : 'green';
    -448             ctx.beginPath();
    -449             ctx.moveTo( this.width, (fps|0)-.5 );
    -450             ctx.lineTo( this.width, this.framerate.prevFps-.5 );
    -451             ctx.stroke();
    -452 
    -453             this.framerate.prevFps= fps;
    -454 
    -455 
    -456             var t1= ((this.height-(rafValue/this.SCALE*this.height))>>0)-.5;
    -457             ctx.strokeStyle= '#ff0';
    -458             ctx.beginPath();
    -459             ctx.moveTo( this.width, t1 );
    -460             ctx.lineTo( this.width, t1 );
    -461             ctx.stroke();
    -462         }
    -463     }
    -464 
    -465 });
    -466 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMBumpMapping.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMBumpMapping.js.html deleted file mode 100644 index feee121f..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMBumpMapping.js.html +++ /dev/null @@ -1,275 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3 
    -  4     /**
    -  5      * @name IMBumpMapping
    -  6      * @memberOf CAAT.Module.Image.ImageProcessor
    -  7      * @extends CAAT.Module.Image.ImageProcessor.ImageProcessor
    -  8      * @constructor
    -  9      */
    - 10 
    - 11 
    - 12     defines : "CAAT.Module.Image.ImageProcess.IMBumpMapping",
    - 13     depends : [
    - 14         "CAAT.Module.Image.ImageProcess.ImageProcessor"
    - 15     ],
    - 16     extendsClass : "CAAT.Module.Image.ImageProcess.ImageProcessor",
    - 17     extendsWith : {
    - 18 
    - 19         /**
    - 20          * @lends CAAT.Module.Image.ImageProcessor.IMBumpMapping.prototype
    - 21          */
    - 22 
    - 23         // bump
    - 24         m_avgX:         null,
    - 25         m_avgY:         null,
    - 26         m_tt:           null,
    - 27         phong:          null,
    - 28 
    - 29         m_radius:       75,
    - 30 
    - 31         m_lightcolor:   null,
    - 32         bcolor:         false,
    - 33         lightPosition:  [],
    - 34 
    - 35         /**
    - 36          * Initializes internal bump effect data.
    - 37          *
    - 38          * @param image {HTMLImageElement}
    - 39          * @param radius {number} lights radius.
    - 40          *
    - 41          * @private
    - 42          */
    - 43         prepareBump : function(image, radius) {
    - 44             var i,j;
    - 45 
    - 46             this.m_radius= (radius ? radius : 75);
    - 47 
    - 48             var imageData= this.grabPixels(image);
    - 49 
    - 50             this.m_tt= this.makeArray(this.height,0);
    - 51             for( i=0; i<this.height; i++ ){
    - 52                 this.m_tt[ i ]=this.width*i;
    - 53             }
    - 54 
    - 55             this.m_avgX= this.makeArray2D(this.height,this.width,0);
    - 56             this.m_avgY= this.makeArray2D(this.height,this.width,0);
    - 57 
    - 58             var bump=this.makeArray2D(this.height,this.width,0);
    - 59 
    - 60             if ( null===imageData ) {
    - 61                 return;
    - 62             }
    - 63             
    - 64             var sourceImagePixels= imageData.data;
    - 65 
    - 66             for (i=0;i<this.height;i++) {
    - 67                 for (j=0;j<this.width;j++) {
    - 68                     var pos= (i*this.width+j)*4;
    - 69                     bump[i][j]=
    - 70                         sourceImagePixels[pos  ]+
    - 71                         sourceImagePixels[pos+1]+
    - 72                         sourceImagePixels[pos+2];
    - 73                 }
    - 74             }
    - 75 
    - 76             bump= this.soften( bump );
    - 77 
    - 78             for (var x=1;x<this.width-1;x++)    {
    - 79                 for (var y=1;y<this.height-1;y++)   {
    - 80                     this.m_avgX[y][x]=Math.floor(bump[y][x+1]-bump[y][x-1]);
    - 81                     this.m_avgY[y][x]=Math.floor(bump[y+1][x]-bump[y-1][x]);
    - 82                 }
    - 83             }
    - 84 
    - 85             bump=null;
    - 86         },
    - 87         /**
    - 88          * Soften source images extracted data on prepareBump method.
    - 89          * @param bump bidimensional array of black and white source image version.
    - 90          * @return bidimensional array with softened version of source image's b&w representation.
    - 91          */
    - 92         soften : function( bump ) {
    - 93             var temp;
    - 94             var sbump=this.makeArray2D( this.height,this.width, 0);
    - 95 
    - 96             for (var j=0;j<this.width;j++) {
    - 97                 for (var i=0;i<this.height;i++) {
    - 98                     temp=(bump[i][j]);
    - 99                     temp+=(bump[(i+1)%this.height][j]);
    -100                     temp+=(bump[(i+this.height-1)%this.height][j]);
    -101                     temp+=(bump[i][(j+1)%this.width]);
    -102                     temp+=(bump[i][(j+this.width-1)%this.width]);
    -103                     temp+=(bump[(i+1)%this.height][(j+1)%this.width]);
    -104                     temp+=(bump[(i+this.height-1)%this.height][(j+this.width-1)%this.width]);
    -105                     temp+=(bump[(i+this.height-1)%this.height][(j+1)%this.width]);
    -106                     temp+=(bump[(i+1)%this.height][(j+this.width-1)%this.width]);
    -107                     temp/=9;
    -108                     sbump[i][j]=temp/3;
    -109                 }
    -110             }
    -111 
    -112             return sbump;
    -113         },
    -114         /**
    -115          * Create a phong image to apply bump effect.
    -116          * @private
    -117          */
    -118         calculatePhong : function( ) {
    -119             this.phong= this.makeArray2D(this.m_radius,this.m_radius,0);
    -120 
    -121             var i,j,z;
    -122             for( i=0; i<this.m_radius; i++ ) {
    -123                 for( j=0; j<this.m_radius; j++ ) {
    -124                     var x= j/this.m_radius;
    -125                     var y= i/this.m_radius;
    -126                     z= (1-Math.sqrt(x*x+y*y))*0.8;
    -127                     if ( z<0 ) {
    -128                         z=0;
    -129                     }
    -130                     this.phong[ i ][ j ]= Math.floor(z*255);
    -131                 }
    -132             }
    -133         },
    -134         /**
    -135          * Generates a bump image.
    -136          * @param dstPixels {ImageData.data} destinarion pixel array to store the calculated image.
    -137          */
    -138         drawColored : function(dstPixels)	{
    -139             var i,j,k;
    -140             for( i=0; i<this.height; i++ ) {
    -141                 for( j=0; j<this.width; j++ ){
    -142 
    -143                     var rrr=0;
    -144                     var ggg=0;
    -145                     var bbb=0;
    -146 
    -147                     for( k=0; k<this.m_lightcolor.length; k++ ) {
    -148 
    -149                         var lx= this.lightPosition[k].x;
    -150                         var ly= this.lightPosition[k].y;
    -151 
    -152                         var dx=Math.floor(Math.abs(this.m_avgX[i][j]-j+lx));
    -153                         var dy=Math.floor(Math.abs(this.m_avgY[i][j]-i+ly));
    -154 
    -155                         if (dx>=this.m_radius) {
    -156                             dx=this.m_radius-1;
    -157                         }
    -158                         if (dy>=this.m_radius) {
    -159                             dy=this.m_radius-1;
    -160                         }
    -161 
    -162                         var c= this.phong[ dx ] [ dy ];
    -163                         var r=0;
    -164                         var g=0;
    -165                         var b=0;
    -166 
    -167                         if ( c>=0 ) {// oscurecer
    -168                             r= (this.m_lightcolor[k][0]*c/128);
    -169                             g= (this.m_lightcolor[k][1]*c/128);
    -170                             b= (this.m_lightcolor[k][2]*c/128);
    -171                         }
    -172                         else {			// blanquear.
    -173                             c=128+c;
    -174                             var rr= (this.m_lightcolor[k][0]);
    -175                             var gg= (this.m_lightcolor[k][1]);
    -176                             var bb= (this.m_lightcolor[k][2]);
    -177 
    -178                             r= Math.floor(rr+ (255-rr)*c/128);
    -179                             g= Math.floor(gg+ (255-gg)*c/128);
    -180                             b= Math.floor(bb+ (255-bb)*c/128);
    -181                         }
    -182 
    -183                         rrr+=r;
    -184                         ggg+=g;
    -185                         bbb+=b;
    -186                     }
    -187 
    -188                     if ( rrr>255 ) {
    -189                         rrr=255;
    -190                     }
    -191                     if ( ggg>255 ) {
    -192                         ggg=255;
    -193                     }
    -194                     if ( bbb>255 ) {
    -195                         bbb=255;
    -196                     }
    -197 
    -198                     var pos= (j+this.m_tt[i])*4;
    -199                     dstPixels[pos  ]= rrr;
    -200                     dstPixels[pos+1]= ggg;
    -201                     dstPixels[pos+2]= bbb;
    -202                     dstPixels[pos+3]= 255;
    -203                 }
    -204             }
    -205         },
    -206         /**
    -207          * Sets lights color.
    -208          * @param colors_rgb_array an array of arrays. Each internal array has three integers defining an RGB color.
    -209          * ie:
    -210          *  [
    -211          *     [ 255,0,0 ],
    -212          *     [ 0,255,0 ]
    -213          *  ]
    -214          * @return this
    -215          */
    -216         setLightColors : function( colors_rgb_array ) {
    -217             this.m_lightcolor= colors_rgb_array;
    -218             this.lightPosition= [];
    -219             for( var i=0; i<this.m_lightcolor.length; i++ ) {
    -220                 var x= this.width*Math.random();
    -221                 var y= this.height*Math.random();
    -222                 this.lightPosition.push( new CAAT.Math.Point().set(x,y) );
    -223             }
    -224             return this;
    -225         },
    -226         /**
    -227          * Initialize the bump image processor.
    -228          * @param image {HTMLImageElement} source image to bump.
    -229          * @param radius {number} light radius.
    -230          */
    -231         initialize : function(image,radius) {
    -232             CAAT.Module.Image.ImageProcess.IMBumpMapping.superclass.initialize.call(this,image.width,image.height);
    -233 
    -234             this.setLightColors(
    -235                     [
    -236                         [255,128,0],
    -237                         [0,0,255]
    -238                     ]);
    -239 
    -240             this.prepareBump(image,radius);
    -241             this.calculatePhong();
    -242 
    -243             return this;
    -244         },
    -245         /**
    -246          * Set a light position.
    -247          * @param lightIndex {number} light index to position.
    -248          * @param x {number} light x coordinate.
    -249          * @param y {number} light y coordinate.
    -250          * @return this
    -251          */
    -252         setLightPosition : function( lightIndex, x, y ) {
    -253             this.lightPosition[lightIndex].set(x,y);
    -254             return this;
    -255         },
    -256         /**
    -257          * Applies the bump effect and makes it visible on the canvas surface.
    -258          * @param director {CAAT.Director}
    -259          * @param time {number}
    -260          */
    -261         applyIM : function(director,time) {
    -262             this.drawColored(this.bufferImage);
    -263             return CAAT.Module.Image.ImageProcess.IMBumpMapping.superclass.applyIM.call(this,director,time);
    -264         }
    -265     }
    -266 
    -267 });
    -268 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMPlasma.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMPlasma.js.html deleted file mode 100644 index b4f6d49d..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMPlasma.js.html +++ /dev/null @@ -1,181 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name IMPlasma
    -  5      * @memberOf CAAT.Module.Image.ImageProcessor
    -  6      * @extends CAAT.Module.Image.ImageProcessor.ImageProcessor
    -  7      * @constructor
    -  8      */
    -  9 
    - 10 
    - 11     defines : "CAAT.Module.Image.ImageProcess.IMPlasma",
    - 12     depends : [
    - 13         "CAAT.Module.Image.ImageProcess.ImageProcessor",
    - 14         "CAAT.Module.ColorUtil.Color"
    - 15     ],
    - 16     extendsClass : "CAAT.Module.Image.ImageProcess.ImageProcessor",
    - 17     extendsWith : {
    - 18 
    - 19         /**
    - 20          * @lends CAAT.Module.Image.ImageProcessor.IMPlasma.prototype
    - 21          */
    - 22 
    - 23         wavetable: null,
    - 24         m_colorMap: null,
    - 25         spd1: 1,
    - 26         spd2: 2,
    - 27         spd3: 3,
    - 28         spd4: 4,
    - 29         pos1: 0,
    - 30         pos2: 0,
    - 31         pos3: 0,
    - 32         pos4: 0,
    - 33         tpos1: 0,
    - 34         tpos2: 0,
    - 35         tpos3: 0,
    - 36         tpos4: 0,
    - 37         m_colorMapSize: 256,
    - 38         i1: 0,
    - 39         i2: 0,
    - 40         i3: 0,
    - 41         i4: 0,
    - 42         b1: false,
    - 43         b2: false,
    - 44         b3: false,
    - 45         b4: false,
    - 46 
    - 47         color: [0xffffffff, 0xffff00ff, 0xffffff00, 0xff00ff00, 0xffff0000, 0xff0000ff, 0xff000000],
    - 48 
    - 49         /**
    - 50          * Initialize the plasma image processor.
    - 51          * <p>
    - 52          * This image processor creates a color ramp of 256 elements from the colors of the parameter 'colors'.
    - 53          * Be aware of color definition since the alpha values count to create the ramp.
    - 54          *
    - 55          * @param width {number}
    - 56          * @param height {number}
    - 57          * @param colors {Array.<number>} an array of color values.
    - 58          *
    - 59          * @return this
    - 60          */
    - 61         initialize : function(width,height,colors) {
    - 62             CAAT.IMPlasma.superclass.initialize.call(this,width,height);
    - 63 
    - 64             this.wavetable= [];
    - 65             for (var x=0; x<256; x++)   {
    - 66                 this.wavetable.push( Math.floor(32 * (1 + Math.cos(x*2 * Math.PI / 256))) );
    - 67             }
    - 68 
    - 69             this.pos1=Math.floor(255*Math.random());
    - 70             this.pos2=Math.floor(255*Math.random());
    - 71             this.pos3=Math.floor(255*Math.random());
    - 72             this.pos4=Math.floor(255*Math.random());
    - 73 
    - 74             this.m_colorMap= CAAT.Module.ColorUtil.Color.makeRGBColorRamp(
    - 75                     colors!==null ? colors : this.color,
    - 76                     256,
    - 77                     CAAT.Module.ColorUtil.Color.RampEnumeration.RAMP_CHANNEL_RGBA_ARRAY );
    - 78 
    - 79             this.setB();
    - 80 
    - 81             return this;
    - 82         },
    - 83         /**
    - 84          * Initialize internal plasma structures. Calling repeatedly this method will make the plasma
    - 85          * look different.
    - 86          */
    - 87         setB : function() {
    - 88 
    - 89             this.b1= Math.random()>0.5;
    - 90             this.b2= Math.random()>0.5;
    - 91             this.b3= Math.random()>0.5;
    - 92             this.b4= Math.random()>0.5;
    - 93 
    - 94             this.spd1= Math.floor((Math.random()*3+1)*(Math.random()<0.5?1:-1));
    - 95             this.spd2= Math.floor((Math.random()*3+1)*(Math.random()<0.5?1:-1));
    - 96             this.spd3= Math.floor((Math.random()*3+1)*(Math.random()<0.5?1:-1));
    - 97             this.spd4= Math.floor((Math.random()*3+1)*(Math.random()<0.5?1:-1));
    - 98 
    - 99             this.i1= Math.floor((Math.random()*2.4+1)*(Math.random()<0.5?1:-1));
    -100             this.i2= Math.floor((Math.random()*2.4+1)*(Math.random()<0.5?1:-1));
    -101             this.i3= Math.floor((Math.random()*2.4+1)*(Math.random()<0.5?1:-1));
    -102             this.i4= Math.floor((Math.random()*2.4+1)*(Math.random()<0.5?1:-1));
    -103         },
    -104         /**
    -105          * Apply image processing to create the plasma and call superclass's apply to make the result
    -106          * visible.
    -107          * @param director {CAAT.Director}
    -108          * @param time {number}
    -109          *
    -110          * @return this
    -111          */
    -112         apply : function(director,time) {
    -113 
    -114             var v = 0;
    -115 	        this.tpos1 = this.pos1;
    -116 	        this.tpos2 = this.pos2;
    -117 
    -118             var bi= this.bufferImage;
    -119             var cm= this.m_colorMap;
    -120             var wt= this.wavetable;
    -121             var z;
    -122             var cmz;
    -123 
    -124 	        for (var x=0; x<this.height; x++) {
    -125                 this.tpos3 = this.pos3;
    -126                 this.tpos4 = this.pos4;
    -127 
    -128                 for(var y=0; y<this.width; y++) {
    -129                     // mix at will, or at your own risk.
    -130                     var o1= this.tpos1+this.tpos2+this.tpos3;
    -131                     var o2= this.tpos2+this.tpos3-this.tpos1;
    -132                     var o3= this.tpos3+this.tpos4-this.tpos2;
    -133                     var o4= this.tpos4+this.tpos1-this.tpos2;
    -134 
    -135                     // set different directions. again, change at will.
    -136                     if ( this.b1 ) o1= -o1;
    -137                     if ( this.b2 ) o2= -o2;
    -138                     if ( this.b3 ) o3= -o3;
    -139                     if ( this.b4 ) o4= -o4;
    -140 
    -141                     z = Math.floor( wt[o1&255] + wt[o2&255] + wt[o3&255] + wt[o4&255] );
    -142                     cmz= cm[z];
    -143 
    -144                     bi[ v++ ]= cmz[0];
    -145                     bi[ v++ ]= cmz[1];
    -146                     bi[ v++ ]= cmz[2];
    -147                     bi[ v++ ]= cmz[3];
    -148 
    -149                     this.tpos3 += this.i1;
    -150                     this.tpos3&=255;
    -151                     this.tpos4 += this.i2;
    -152                     this.tpos4&=255;
    -153                 }
    -154 
    -155                 this.tpos1 += this.i3;
    -156                 this.tpos1&=255;
    -157                 this.tpos2 += this.i4;
    -158                 this.tpos2&=255;
    -159             }
    -160 
    -161             this.pos1 += this.spd1;
    -162             this.pos2 -= this.spd2;
    -163             this.pos3 += this.spd3;
    -164             this.pos4 -= this.spd4;
    -165             this.pos1&=255;
    -166             this.pos3&=255;
    -167             this.pos2&=255;
    -168             this.pos4&=255;
    -169 
    -170             return CAAT.Module.Image.ImageProcess.IMPlasma.superclass.applyIM.call(this,director,time);
    -171         }
    -172     }
    -173 });
    -174 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMRotoZoom.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMRotoZoom.js.html deleted file mode 100644 index 6484bc5d..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMRotoZoom.js.html +++ /dev/null @@ -1,210 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name IMRotoZoom
    -  5      * @memberOf CAAT.Module.Image.ImageProcessor
    -  6      * @extends CAAT.Module.Image.ImageProcessor.ImageProcessor
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.Module.Image.ImageProcess.IMRotoZoom",
    - 11     depends : [
    - 12         "CAAT.Module.Image.ImageProcess.ImageProcessor"
    - 13     ],
    - 14     extendsClass : "CAAT.Module.Image.ImageProcess.ImageProcessor",
    - 15     extendsWith : {
    - 16 
    - 17         /**
    - 18          * @lends CAAT.Module.Image.ImageProcessor.IMRotoZoom.prototype
    - 19          */
    - 20 
    - 21         m_alignv:       1,
    - 22         m_alignh:       1,
    - 23         distortion:     2,
    - 24         mask:           0,
    - 25         shift:          0,
    - 26         sourceImageData:null,   // pattern to fill area with.
    - 27 
    - 28         /**
    - 29          * Initialize the rotozoom.
    - 30          * @param width {number}
    - 31          * @param height {number}
    - 32          * @param patternImage {HTMLImageElement} image to tile with.
    - 33          *
    - 34          * @return this
    - 35          */
    - 36         initialize : function( width, height, patternImage ) {
    - 37             CAAT.Module.Image.ImageProcess.IMRotoZoom.superclass.initialize.call(this,width,height);
    - 38 
    - 39             this.clear( 255,128,0, 255 );
    - 40 
    - 41             this.sourceImageData= this.grabPixels(patternImage);
    - 42 
    - 43             if ( null!==this.sourceImageData ) {
    - 44                 // patternImage must be 2^n sized.
    - 45                 switch( this.sourceImageData.width ) {
    - 46                     case 1024:
    - 47                         this.mask=1023;
    - 48                         this.shift=10;
    - 49                         break;
    - 50                     case 512:
    - 51                         this.mask=511;
    - 52                         this.shift=9;
    - 53                         break;
    - 54                     case 256:
    - 55                         this.mask=255;
    - 56                         this.shift=8;
    - 57                         break;
    - 58                     case 128:
    - 59                         this.mask=127;
    - 60                         this.shift=7;
    - 61                         break;
    - 62                     case 64:
    - 63                         this.mask=63;
    - 64                         this.shift=6;
    - 65                         break;
    - 66                     case 32:
    - 67                         this.mask=31;
    - 68                         this.shift=5;
    - 69                         break;
    - 70                     case 16:
    - 71                         this.mask=15;
    - 72                         this.shift=4;
    - 73                         break;
    - 74                     case 8:
    - 75                         this.mask=7;
    - 76                         this.shift=3;
    - 77                         break;
    - 78                 }
    - 79             }
    - 80 
    - 81             this.setCenter();
    - 82 
    - 83             return this;
    - 84         },
    - 85         /**
    - 86          * Performs the process of tiling rotozoom.
    - 87          * @param director {CAAT.Director}
    - 88          * @param time {number}
    - 89          *
    - 90          * @private
    - 91          */
    - 92         rotoZoom: function(director,time)  {
    - 93 
    - 94             var timer = new Date().getTime();
    - 95 
    - 96             var angle=Math.PI*2 * Math.cos(timer * 0.0001);
    - 97             var distance= 600+ 550*Math.sin(timer*0.0002);
    - 98 
    - 99             var dist= this.distortion;
    -100 
    -101             var off=0;
    -102             var ddx=Math.floor(Math.cos(angle)*distance);
    -103             var ddy=Math.floor(Math.sin(angle)*distance);
    -104 
    -105             var hh=0, ww=0;
    -106 
    -107             switch( this.m_alignh )	{
    -108                 case 0:
    -109                     hh = 0;
    -110                     break;
    -111                 case 1:
    -112                     hh = (this.height >> 1);
    -113                     break;
    -114                 case 2:
    -115                     hh = this.height - 1;
    -116                     break;
    -117             }
    -118 
    -119             switch (this.m_alignv) {
    -120                 case 0:
    -121                     ww = 0;
    -122                     break;
    -123                 case 1:
    -124                     ww = (this.width >> 1);
    -125                     break;
    -126                 case 2:
    -127                     ww = this.width - 1;
    -128                     break;
    -129             }
    -130 
    -131             var i = (((this.width >> 1) << 8)  - ddx * ww + ddy * hh)&0xffff;
    -132             var j = (((this.height >> 1) << 8) - ddy * ww - ddx * hh) & 0xffff;
    -133 
    -134             var srcwidth=   this.sourceImageData.width;
    -135             var srcheight=  this.sourceImageData.height;
    -136             var srcdata=    this.sourceImageData.data;
    -137             var bi=         this.bufferImage;
    -138             var dstoff;
    -139             var addx;
    -140             var addy;
    -141 
    -142             while (off < this.width * this.height * 4) {
    -143                 addx = i;
    -144                 addy = j;
    -145 
    -146                 for (var m = 0; m < this.width; m++) {
    -147                     dstoff = ((addy >> this.shift) & this.mask) * srcwidth + ((addx >> this.shift) & this.mask);
    -148                     dstoff <<= 2;
    -149 
    -150                     bi[ off++ ] = srcdata[ dstoff++ ];
    -151                     bi[ off++ ] = srcdata[ dstoff++ ];
    -152                     bi[ off++ ] = srcdata[ dstoff++ ];
    -153                     bi[ off++ ] = srcdata[ dstoff++ ];
    -154 
    -155                     addx += ddx;
    -156                     addy += ddy;
    -157 
    -158                 }
    -159 
    -160                 dist += this.distortion;
    -161                 i -= ddy;
    -162                 j += ddx - dist;
    -163             }
    -164         },
    -165         /**
    -166          * Perform and apply the rotozoom effect.
    -167          * @param director {CAAT.Director}
    -168          * @param time {number}
    -169          * @return this
    -170          */
    -171         applyIM : function(director,time) {
    -172             if ( null!==this.sourceImageData ) {
    -173                 this.rotoZoom(director,time);
    -174             }
    -175             return CAAT.Module.Image.ImageProcess.IMRotoZoom.superclass.applyIM.call(this,director,time);
    -176         },
    -177         /**
    -178          * Change the effect's rotation anchor. Call this method repeatedly to make the effect look
    -179          * different.
    -180          */
    -181         setCenter: function() {
    -182             var d = Math.random();
    -183             if (d < 0.33) {
    -184                 this.m_alignv = 0;
    -185             } else if (d < 0.66) {
    -186                 this.m_alignv = 1;
    -187             } else {
    -188                 this.m_alignv = 2;
    -189             }
    -190 
    -191             d = Math.random();
    -192             if (d < 0.33) {
    -193                 this.m_alignh = 0;
    -194             } else if (d < 0.66) {
    -195                 this.m_alignh = 1;
    -196             } else {
    -197                 this.m_alignh = 2;
    -198             }
    -199         }
    -200 
    -201     }
    -202 });
    -203 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_ImageProcessor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_ImageProcessor.js.html deleted file mode 100644 index 1411bdd1..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_ImageProcessor.js.html +++ /dev/null @@ -1,207 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name Image
    -  5      * @memberOf CAAT.Module
    -  6      * @namespace
    -  7      */
    -  8 
    -  9     /**
    - 10      * @name ImageProcessor
    - 11      * @memberOf CAAT.Module.Image
    - 12      * @namespace
    - 13      */
    - 14 
    - 15     /**
    - 16      * @name ImageProcessor
    - 17      * @memberOf CAAT.Module.Image.ImageProcessor
    - 18      * @constructor
    - 19      */
    - 20 
    - 21 
    - 22     defines : "CAAT.Module.Image.ImageProcessor.ImageProcessor",
    - 23     extendsWith : {
    - 24 
    - 25         /**
    - 26          * @lends CAAT.Module.Image.ImageProcessor.ImageProcessor.prototype
    - 27          */
    - 28 
    - 29         canvas:     null,
    - 30         ctx:        null,
    - 31         width:      0,
    - 32         height:     0,
    - 33         imageData:  null,
    - 34         bufferImage:null,
    - 35 
    - 36         /**
    - 37          * Grabs an image pixels.
    - 38          *
    - 39          * @param image {HTMLImageElement}
    - 40          * @return {ImageData} returns an ImageData object with the image representation or null in
    - 41          * case the pixels can not be grabbed.
    - 42          *
    - 43          * @static
    - 44          */
    - 45         grabPixels : function(image) {
    - 46             var canvas= document.createElement('canvas');
    - 47             if ( canvas!==null ) {
    - 48                 canvas.width= image.width;
    - 49                 canvas.height= image.height;
    - 50                 var ctx= canvas.getContext('2d');
    - 51                 ctx.drawImage(image,0,0);
    - 52                 try {
    - 53                     var imageData= ctx.getImageData(0,0,canvas.width,canvas.height);
    - 54                     return imageData;
    - 55                 }
    - 56                 catch(e) {
    - 57                     CAAT.log('error pixelgrabbing.', image);
    - 58                     return null;
    - 59                 }
    - 60             }
    - 61             return null;
    - 62         },
    - 63         /**
    - 64          * Helper method to create an array.
    - 65          *
    - 66          * @param size {number} integer number of elements in the array.
    - 67          * @param initValue {number} initial array values.
    - 68          *
    - 69          * @return {[]} an array of 'initialValue' elements.
    - 70          *
    - 71          * @static
    - 72          */
    - 73         makeArray : function(size, initValue) {
    - 74             var a= [];
    - 75 
    - 76             for(var i=0; i<size; i++ )  {
    - 77                 a.push( initValue );
    - 78             }
    - 79 
    - 80             return a;
    - 81         },
    - 82         /**
    - 83          * Helper method to create a bidimensional array.
    - 84          *
    - 85          * @param size {number} number of array rows.
    - 86          * @param size2 {number} number of array columns.
    - 87          * @param initvalue array initial values.
    - 88          *
    - 89          * @return {[]} a bidimensional array of 'initvalue' elements.
    - 90          *
    - 91          * @static
    - 92          *
    - 93          */
    - 94         makeArray2D : function (size, size2, initvalue)  {
    - 95             var a= [];
    - 96 
    - 97             for( var i=0; i<size; i++ ) {
    - 98                 a.push( this.makeArray(size2,initvalue) );
    - 99             }
    -100 
    -101             return a;
    -102         },
    -103         /**
    -104          * Initializes and creates an offscreen Canvas object. It also creates an ImageData object and
    -105          * initializes the internal bufferImage attribute to imageData's data.
    -106          * @param width {number} canvas width.
    -107          * @param height {number} canvas height.
    -108          * @return this
    -109          */
    -110         initialize : function(width,height) {
    -111 
    -112             this.width=  width;
    -113             this.height= height;
    -114 
    -115             this.canvas= document.createElement('canvas');
    -116             if ( this.canvas!==null ) {
    -117                 this.canvas.width= width;
    -118                 this.canvas.height= height;
    -119                 this.ctx= this.canvas.getContext('2d');
    -120                 this.imageData= this.ctx.getImageData(0,0,width,height);
    -121                 this.bufferImage= this.imageData.data;
    -122             }
    -123 
    -124             return this;
    -125         },
    -126         /**
    -127          * Clear this ImageData object to the given color components.
    -128          * @param r {number} red color component 0..255.
    -129          * @param g {number} green color component 0..255.
    -130          * @param b {number} blue color component 0..255.
    -131          * @param a {number} alpha color component 0..255.
    -132          * @return this
    -133          */
    -134         clear : function( r,g,b,a ) {
    -135             if ( null===this.imageData ) {
    -136                 return this;
    -137             }
    -138             var data= this.imageData.data;
    -139             for( var i=0; i<this.width*this.height; i++ ) {
    -140                 data[i*4+0]= r;
    -141                 data[i*4+1]= g;
    -142                 data[i*4+2]= b;
    -143                 data[i*4+3]= a;
    -144             }
    -145             this.imageData.data= data;
    -146 
    -147             return this;
    -148         },
    -149         /**
    -150          * Get this ImageData.
    -151          * @return {ImageData}
    -152          */
    -153         getImageData : function() {
    -154             return this.ctx.getImageData(0,0,this.width,this.height);
    -155         },
    -156         /**
    -157          * Sets canvas pixels to be the applied effect. After process pixels, this method must be called
    -158          * to show the result of such processing.
    -159          * @param director {CAAT.Director}
    -160          * @param time {number}
    -161          * @return this
    -162          */
    -163         applyIM : function(director, time) {
    -164             if ( null!==this.imageData ) {
    -165                 this.imageData.data= this.bufferImage;
    -166                 this.ctx.putImageData(this.imageData, 0, 0);
    -167             }
    -168             return this;
    -169         },
    -170         /**
    -171          * Returns the offscreen canvas.
    -172          * @return {HTMLCanvasElement}
    -173          */
    -174         getCanvas : function() {
    -175             return this.canvas;
    -176         },
    -177         /**
    -178          * Creates a pattern that will make this ImageProcessor object suitable as a fillStyle value.
    -179          * This effect can be drawn too as an image by calling: canvas_context.drawImage methods.
    -180          * @param type {string} the pattern type. if no value is supplied 'repeat' will be used.
    -181          * @return CanvasPattern.
    -182          */
    -183         createPattern : function( type ) {
    -184             return this.ctx.createPattern(this.canvas,type ? type : 'repeat');
    -185         },
    -186         /**
    -187          * Paint this ImageProcessor object result.
    -188          * @param director {CAAT.Director}.
    -189          * @param time {number} scene time.
    -190          */
    -191         paint : function( director, time ) {
    -192             if ( null!==this.canvas ) {
    -193                 var ctx= director.ctx;
    -194                 ctx.drawImage( this.getCanvas(), 0, 0 );
    -195             }
    -196         }
    -197     }
    -198 
    -199 });
    -200 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_ImagePreloader.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_ImagePreloader.js.html deleted file mode 100644 index ec8d6d0b..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_ImagePreloader.js.html +++ /dev/null @@ -1,108 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * Image/Resource preloader.
    -  5  *
    -  6  *
    -  7  **/
    -  8 
    -  9 CAAT.Module( {
    - 10 
    - 11 
    - 12     /**
    - 13      * @name Preloader
    - 14      * @memberOf CAAT.Module
    - 15      * @namespace
    - 16      */
    - 17 
    - 18     /**
    - 19      * @name ImagePreloader
    - 20      * @memberOf CAAT.Module.Preloader
    - 21      * @constructor
    - 22      */
    - 23 
    - 24     defines : "CAAT.Module.Preloader.ImagePreloader",
    - 25     aliases : ["CAAT.ImagePreloader"],
    - 26     extendsWith : {
    - 27 
    - 28         /**
    - 29          * @lends CAAT.Module.Preloader.ImagePreloader.prototype
    - 30          */
    - 31 
    - 32         __init : function()   {
    - 33             this.images = [];
    - 34             return this;
    - 35         },
    - 36 
    - 37         /**
    - 38          * a list of elements to load.
    - 39          * @type {Array.<{ id, image }>}
    - 40          */
    - 41         images:                 null,
    - 42 
    - 43         /**
    - 44          * notification callback invoked for each image loaded.
    - 45          */
    - 46         notificationCallback:   null,
    - 47 
    - 48         /**
    - 49          * elements counter.
    - 50          */
    - 51         imageCounter:           0,
    - 52 
    - 53         /**
    - 54          * Start images loading asynchronous process. This method will notify every image loaded event
    - 55          * and is responsibility of the caller to count the number of loaded images to see if it fits his
    - 56          * needs.
    - 57          * 
    - 58          * @param aImages {{ id:{url}, id2:{url}, ...} an object with id/url pairs.
    - 59          * @param callback_loaded_one_image {function( imageloader {CAAT.ImagePreloader}, counter {number}, images {{ id:{string}, image: {Image}}} )}
    - 60          * function to call on every image load.
    - 61          */
    - 62         loadImages: function( aImages, callback_loaded_one_image, callback_error ) {
    - 63 
    - 64             if (!aImages) {
    - 65                 if (callback_loaded_one_image ) {
    - 66                     callback_loaded_one_image(0,[]);
    - 67                 }
    - 68             }
    - 69 
    - 70             var me= this, i;
    - 71             this.notificationCallback = callback_loaded_one_image;
    - 72             this.images= [];
    - 73             for( i=0; i<aImages.length; i++ ) {
    - 74                 this.images.push( {id:aImages[i].id, image: new Image() } );
    - 75             }
    - 76 
    - 77             for( i=0; i<aImages.length; i++ ) {
    - 78                 this.images[i].image.onload = function imageLoaded() {
    - 79                     me.imageCounter++;
    - 80                     me.notificationCallback(me.imageCounter, me.images);
    - 81                 };
    - 82 
    - 83                 this.images[i].image.onerror= (function(index) {
    - 84                         return function(e) {
    - 85                             if ( callback_error ) {
    - 86                                 callback_error( e, index );
    - 87                             }
    - 88                         }
    - 89                     })(i);
    - 90 
    - 91                 this.images[i].image.src= aImages[i].url;
    - 92             }
    - 93 
    - 94             if ( aImages.length===0 ) {
    - 95                 callback_loaded_one_image(0,[]);
    - 96             }
    - 97         }
    - 98 
    - 99     }
    -100 });
    -101 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_Preloader.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_Preloader.js.html deleted file mode 100644 index 38cbfb88..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_Preloader.js.html +++ /dev/null @@ -1,169 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * Image/Resource preloader.
    -  5  *
    -  6  *
    -  7  **/
    -  8 
    -  9 CAAT.Module( {
    - 10 
    - 11 
    - 12     /**
    - 13      * @name Preloader
    - 14      * @memberOf CAAT.Module.Preloader
    - 15      * @constructor
    - 16      */
    - 17 
    - 18     defines : "CAAT.Module.Preloader.Preloader",
    - 19     extendsWith : function() {
    - 20 
    - 21         var descriptor= function(id, path, loader) {
    - 22 
    - 23             var me= this;
    - 24 
    - 25             this.id=    id;
    - 26             this.path=  path;
    - 27             this.image= new Image();
    - 28             this.loader= loader;
    - 29 
    - 30             this.image.onload= this.onload.bind(this);
    - 31             this.image.onerror= this.onerror.bind(this);
    - 32 
    - 33             return this;
    - 34         };
    - 35 
    - 36         descriptor.prototype= {
    - 37             id : null,
    - 38             path : null,
    - 39             image : null,
    - 40             loader : null,
    - 41 
    - 42             onload : function(e) {
    - 43                 this.loader.__onload(this);
    - 44                 this.image.onload= null;
    - 45                 this.image.onerror= null;
    - 46             },
    - 47 
    - 48             onerror : function(e) {
    - 49                 this.loader.__onerror(this);
    - 50             },
    - 51 
    - 52             load : function() {
    - 53                 this.image.src= this.path;
    - 54             },
    - 55 
    - 56             clear : function() {
    - 57                 this.loader= null;
    - 58 
    - 59             }
    - 60         };
    - 61 
    - 62         return {
    - 63 
    - 64             /**
    - 65              * @lends CAAT.Module.Preloader.Preloader.prototype
    - 66              */
    - 67 
    - 68             __init : function()   {
    - 69                 this.elements= [];
    - 70                 this.baseURL= "";
    - 71                 return this;
    - 72             },
    - 73 
    - 74             currentGroup : null,
    - 75 
    - 76             /**
    - 77              * a list of elements to load.
    - 78              * @type {Array.<{ id, image }>}
    - 79              */
    - 80             elements:       null,
    - 81 
    - 82             /**
    - 83              * elements counter.
    - 84              */
    - 85             imageCounter:   0,
    - 86 
    - 87             /**
    - 88              * Callback finished loading.
    - 89              */
    - 90             cfinished:      null,
    - 91 
    - 92             /**
    - 93              * Callback element loaded.
    - 94              */
    - 95             cloaded:        null,
    - 96 
    - 97             /**
    - 98              * Callback error loading.
    - 99              */
    -100             cerrored:       null,
    -101 
    -102             /**
    -103              * loaded elements count.
    -104              */
    -105             loadedCount:    0,
    -106 
    -107             baseURL : null,
    -108 
    -109             addElement : function( id, path ) {
    -110                 this.elements.push( new descriptor(id,this.baseURL+path,this) );
    -111                 return this;
    -112             },
    -113 
    -114             clear : function() {
    -115                 for( var i=0; i<this.elements.length; i++ ) {
    -116                     this.elements[i].clear();
    -117                 }
    -118                 this.elements= null;
    -119             },
    -120 
    -121             __onload : function( d ) {
    -122                 if ( this.cloaded ) {
    -123                     this.cloaded(d.id);
    -124                 }
    -125 
    -126                 this.loadedCount++;
    -127                 if ( this.loadedCount===this.elements.length ) {
    -128                     if ( this.cfinished ) {
    -129                         this.cfinished( this.elements );
    -130                     }
    -131                 }
    -132             },
    -133 
    -134             __onerror : function( d ) {
    -135                 if ( this.cerrored ) {
    -136                     this.cerrored(d.id);
    -137                 }
    -138             },
    -139 
    -140             setBaseURL : function( base ) {
    -141                 this.baseURL= base;
    -142                 return this;
    -143             },
    -144 
    -145             load: function( onfinished, onload_one, onerror ) {
    -146 
    -147                 this.cfinished= onfinished;
    -148                 this.cloaded= onload_one;
    -149                 this.cerroed= onerror;
    -150 
    -151                 var i;
    -152 
    -153                 for( i=0; i<this.elements.length; i++ ) {
    -154                     this.elements[i].load();
    -155                 }
    -156 
    -157                 return this;
    -158             }
    -159         }
    -160     }
    -161 });
    -162 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Util_ImageUtil.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Util_ImageUtil.js.html deleted file mode 100644 index e14ccccf..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Util_ImageUtil.js.html +++ /dev/null @@ -1,234 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  */
    -  4 CAAT.Module({
    -  5 
    -  6     /**
    -  7      * @name ImageUtil
    -  8      * @memberOf CAAT.Module.Image
    -  9      * @namespace
    - 10      */
    - 11 
    - 12     defines:"CAAT.Module.Image.ImageUtil",
    - 13     depends : [
    - 14         "CAAT.Math.Matrix"
    - 15     ],
    - 16     extendsWith:{
    - 17 
    - 18     },
    - 19     constants:{
    - 20 
    - 21         /**
    - 22          * @lends CAAT.Module.Image.ImageUtil
    - 23          */
    - 24 
    - 25         createAlphaSpriteSheet:function (maxAlpha, minAlpha, sheetSize, image, bg_fill_style) {
    - 26 
    - 27             if (maxAlpha < minAlpha) {
    - 28                 var t = maxAlpha;
    - 29                 maxAlpha = minAlpha;
    - 30                 minAlpha = t;
    - 31             }
    - 32 
    - 33             var canvas = document.createElement('canvas');
    - 34             canvas.width = image.width;
    - 35             canvas.height = image.height * sheetSize;
    - 36             var ctx = canvas.getContext('2d');
    - 37             ctx.fillStyle = bg_fill_style ? bg_fill_style : 'rgba(255,255,255,0)';
    - 38             ctx.fillRect(0, 0, image.width, image.height * sheetSize);
    - 39 
    - 40             var i;
    - 41             for (i = 0; i < sheetSize; i++) {
    - 42                 ctx.globalAlpha = 1 - (maxAlpha - minAlpha) / sheetSize * (i + 1);
    - 43                 ctx.drawImage(image, 0, i * image.height);
    - 44             }
    - 45 
    - 46             return canvas;
    - 47         },
    - 48 
    - 49         /**
    - 50          * Creates a rotated canvas image element.
    - 51          */
    - 52         rotate:function (image, angle) {
    - 53 
    - 54             angle = angle || 0;
    - 55             if (!angle) {
    - 56                 return image;
    - 57             }
    - 58 
    - 59             var canvas = document.createElement("canvas");
    - 60             canvas.width = image.height;
    - 61             canvas.height = image.width;
    - 62             var ctx = canvas.getContext('2d');
    - 63             ctx.globalAlpha = 1;
    - 64             ctx.fillStyle = 'rgba(0,0,0,0)';
    - 65             ctx.clearRect(0, 0, canvas.width, canvas.height);
    - 66 
    - 67             var m = new CAAT.Math.Matrix();
    - 68             m.multiply(new CAAT.Math.Matrix().setTranslate(canvas.width / 2, canvas.width / 2));
    - 69             m.multiply(new CAAT.Math.Matrix().setRotation(angle * Math.PI / 180));
    - 70             m.multiply(new CAAT.Math.Matrix().setTranslate(-canvas.width / 2, -canvas.width / 2));
    - 71             m.transformRenderingContext(ctx);
    - 72             ctx.drawImage(image, 0, 0);
    - 73 
    - 74             return canvas;
    - 75         },
    - 76 
    - 77         /**
    - 78          * Remove an image's padding transparent border.
    - 79          * Transparent means that every scan pixel is alpha=0.
    - 80          */
    - 81         optimize:function (image, threshold, areas) {
    - 82             threshold >>= 0;
    - 83 
    - 84             var atop = true;
    - 85             var abottom = true;
    - 86             var aleft = true;
    - 87             var aright = true;
    - 88             if (typeof areas !== 'undefined') {
    - 89                 if (typeof areas.top !== 'undefined') {
    - 90                     atop = areas.top;
    - 91                 }
    - 92                 if (typeof areas.bottom !== 'undefined') {
    - 93                     abottom = areas.bottom;
    - 94                 }
    - 95                 if (typeof areas.left !== 'undefined') {
    - 96                     aleft = areas.left;
    - 97                 }
    - 98                 if (typeof areas.right !== 'undefined') {
    - 99                     aright = areas.right;
    -100                 }
    -101             }
    -102 
    -103 
    -104             var canvas = document.createElement('canvas');
    -105             canvas.width = image.width;
    -106             canvas.height = image.height;
    -107             var ctx = canvas.getContext('2d');
    -108 
    -109             ctx.fillStyle = 'rgba(0,0,0,0)';
    -110             ctx.fillRect(0, 0, image.width, image.height);
    -111             ctx.drawImage(image, 0, 0);
    -112 
    -113             var imageData = ctx.getImageData(0, 0, image.width, image.height);
    -114             var data = imageData.data;
    -115 
    -116             var i, j;
    -117             var miny = 0, maxy = canvas.height - 1;
    -118             var minx = 0, maxx = canvas.width - 1;
    -119 
    -120             var alpha = false;
    -121 
    -122             if (atop) {
    -123                 for (i = 0; i < canvas.height; i++) {
    -124                     for (j = 0; j < canvas.width; j++) {
    -125                         if (data[i * canvas.width * 4 + 3 + j * 4] > threshold) {
    -126                             alpha = true;
    -127                             break;
    -128                         }
    -129                     }
    -130 
    -131                     if (alpha) {
    -132                         break;
    -133                     }
    -134                 }
    -135                 // i contiene el indice del ultimo scan que no es transparente total.
    -136                 miny = i;
    -137             }
    -138 
    -139             if (abottom) {
    -140                 alpha = false;
    -141                 for (i = canvas.height - 1; i >= miny; i--) {
    -142                     for (j = 0; j < canvas.width; j++) {
    -143                         if (data[i * canvas.width * 4 + 3 + j * 4] > threshold) {
    -144                             alpha = true;
    -145                             break;
    -146                         }
    -147                     }
    -148 
    -149                     if (alpha) {
    -150                         break;
    -151                     }
    -152                 }
    -153                 maxy = i;
    -154             }
    -155 
    -156             if (aleft) {
    -157                 alpha = false;
    -158                 for (j = 0; j < canvas.width; j++) {
    -159                     for (i = miny; i <= maxy; i++) {
    -160                         if (data[i * canvas.width * 4 + 3 + j * 4 ] > threshold) {
    -161                             alpha = true;
    -162                             break;
    -163                         }
    -164                     }
    -165                     if (alpha) {
    -166                         break;
    -167                     }
    -168                 }
    -169                 minx = j;
    -170             }
    -171 
    -172             if (aright) {
    -173                 alpha = false;
    -174                 for (j = canvas.width - 1; j >= minx; j--) {
    -175                     for (i = miny; i <= maxy; i++) {
    -176                         if (data[i * canvas.width * 4 + 3 + j * 4 ] > threshold) {
    -177                             alpha = true;
    -178                             break;
    -179                         }
    -180                     }
    -181                     if (alpha) {
    -182                         break;
    -183                     }
    -184                 }
    -185                 maxx = j;
    -186             }
    -187 
    -188             if (0 === minx && 0 === miny && canvas.width - 1 === maxx && canvas.height - 1 === maxy) {
    -189                 return canvas;
    -190             }
    -191 
    -192             var width = maxx - minx + 1;
    -193             var height = maxy - miny + 1;
    -194             var id2 = ctx.getImageData(minx, miny, width, height);
    -195 
    -196             canvas.width = width;
    -197             canvas.height = height;
    -198             ctx = canvas.getContext('2d');
    -199             ctx.putImageData(id2, 0, 0);
    -200 
    -201             return canvas;
    -202         },
    -203 
    -204 
    -205         createThumb:function (image, w, h, best_fit) {
    -206             w = w || 24;
    -207             h = h || 24;
    -208             var canvas = document.createElement('canvas');
    -209             canvas.width = w;
    -210             canvas.height = h;
    -211             var ctx = canvas.getContext('2d');
    -212 
    -213             if (best_fit) {
    -214                 var max = Math.max(image.width, image.height);
    -215                 var ww = image.width / max * w;
    -216                 var hh = image.height / max * h;
    -217                 ctx.drawImage(image, (w - ww) / 2, (h - hh) / 2, ww, hh);
    -218             } else {
    -219                 ctx.drawImage(image, 0, 0, w, h);
    -220             }
    -221 
    -222             return canvas;
    -223         }
    -224     }
    -225 
    -226 })
    -227 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_Template.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_Template.js.html deleted file mode 100644 index cc76c5bd..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_Template.js.html +++ /dev/null @@ -1,98 +0,0 @@ -
      1 CAAT.Module({
    -  2     defines : "CAAT.Module.Initialization.Template",
    -  3     depends : [
    -  4         "CAAT.Foundation.Director",
    -  5         "CAAT.Module.Preloader.ImagePreloader"
    -  6     ],
    -  7     constants: {
    -  8         init : function( width, height, runHere, imagesURL, onEndLoading )   {
    -  9 
    - 10             var canvascontainer= document.getElementById(runHere);
    - 11             var director;
    - 12 
    - 13             if ( CAAT.__CSS__ ) {   // css renderer
    - 14                 if ( canvascontainer ) {
    - 15                     if ( false===canvascontainer instanceof HTMLDivElement ) {
    - 16                         canvascontainer= null;
    - 17                     }
    - 18                 }
    - 19 
    - 20                 if ( canvascontainer===null ) {
    - 21                     canvascontainer= document.createElement('div'); // create a new DIV
    - 22                     document.body.appendChild(canvascontainer);
    - 23                 }
    - 24 
    - 25                 director= new CAAT.Foundation.Director().
    - 26                     initialize(
    - 27                         width||800,
    - 28                         height||600,
    - 29                         canvascontainer);
    - 30 
    - 31             } else {
    - 32 
    - 33                 if ( canvascontainer ) {
    - 34                     if ( canvascontainer instanceof HTMLDivElement ) {
    - 35                         var ncanvascontainer= document.createElement("canvas");
    - 36                         canvascontainer.appendChild(ncanvascontainer);
    - 37                         canvascontainer= ncanvascontainer;
    - 38                     } else if ( false==canvascontainer instanceof HTMLCanvasElement ) {
    - 39                         var ncanvascontainer= document.createElement("canvas");
    - 40                         document.body.appendChild(ncanvascontainer);
    - 41                         canvascontainer= ncanvascontainer;
    - 42                     }
    - 43                 } else {
    - 44                     canvascontainer= document.createElement('canvas');
    - 45                     document.body.appendChild(canvascontainer);
    - 46                 }
    - 47 
    - 48                 director= new CAAT.Foundation.Director().
    - 49                         initialize(
    - 50                             width||800,
    - 51                             height||600,
    - 52                             canvascontainer);
    - 53             }
    - 54 
    - 55             /**
    - 56              * Load splash images. It is supossed the splash has some images.
    - 57              */
    - 58             new CAAT.Module.Preloader.ImagePreloader().loadImages(
    - 59                 imagesURL,
    - 60                 function on_load( counter, images ) {
    - 61 
    - 62                     if ( counter===images.length ) {
    - 63 
    - 64                         director.emptyScenes();
    - 65                         director.setImagesCache(images);
    - 66 
    - 67                         onEndLoading(director);
    - 68 
    - 69                         /**
    - 70                          * Change this sentence's parameters to play with different entering-scene
    - 71                          * curtains.
    - 72                          * just perform a director.setScene(0) to play first director's scene.
    - 73                          */
    - 74                         director.easeIn(
    - 75                                 0,
    - 76                                 CAAT.Foundation.Scene.EASE_SCALE,
    - 77                                 2000,
    - 78                                 false,
    - 79                                 CAAT.Foundation.Actor.ANCHOR_CENTER,
    - 80                                 new CAAT.Behavior.Interpolator().createElasticOutInterpolator(2.5, .4) );
    - 81 
    - 82                         CAAT.loop(60);
    - 83 
    - 84                     }
    - 85                 }
    - 86             );
    - 87 
    - 88         }
    - 89     }
    - 90 });
    - 91 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_TemplateWithSplash.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_TemplateWithSplash.js.html deleted file mode 100644 index 1633a96e..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_TemplateWithSplash.js.html +++ /dev/null @@ -1,189 +0,0 @@ -
      1 CAAT.Module({
    -  2     defines : "CAAT.Module.Initialization.TemplateWithSplash",
    -  3     depends : [
    -  4         "CAAT.Foundation.Director",
    -  5         "CAAT.Module.Preloader.ImagePreloader"
    -  6     ],
    -  7     constants: {
    -  8 
    -  9         init : function( width, height, runHere, minTime, imagesURL, onEndSplash, splash_path, spinner_path )   {
    - 10 
    - 11             function createSplashScene(director, showTime, sceneCreationCallback) {
    - 12 
    - 13                 var spinnerImg= director.getImage('spinner');
    - 14                 var splashImg=  director.getImage('splash');
    - 15                 var scene=      director.createScene();
    - 16                 var TIME=       showTime;
    - 17                 var time=       new Date().getTime();
    - 18 
    - 19                 if ( splashImg ) {
    - 20                     scene.addChild(
    - 21                             new CAAT.Foundation.Actor().
    - 22                                 setBackgroundImage(splashImg, false).
    - 23                                 setBounds(0,0,director.width,director.height).
    - 24                                 setImageTransformation( CAAT.Foundation.SpriteImage.TR_FIXED_TO_SIZE )
    - 25                             );
    - 26                 }
    - 27 
    - 28                 if ( spinnerImg ) {
    - 29                     scene.addChild(
    - 30                             new CAAT.Foundation.Actor().
    - 31                                 setBackgroundImage(spinnerImg).
    - 32                                 centerAt( scene.width/2, scene.height/2).
    - 33                                 addBehavior(
    - 34                                     new CAAT.Behavior.RotateBehavior().
    - 35                                             setValues(0,2*Math.PI).
    - 36                                             setFrameTime(0,1000).
    - 37                                             setCycle(true)
    - 38                                     )
    - 39                             );
    - 40                 }
    - 41 
    - 42                 scene.loadedImage = function(count, images) {
    - 43 
    - 44                     if ( !images || count===images.length ) {
    - 45 
    - 46                         var difftime= new Date().getTime()-time;
    - 47                         if ( difftime<TIME ){
    - 48                             difftime= Math.abs(TIME-difftime);
    - 49                             if ( difftime>TIME ) {
    - 50                                 difftime= TIME;
    - 51                             }
    - 52 
    - 53                             setTimeout(
    - 54                                     function() {
    - 55                                         endSplash(director, images, sceneCreationCallback);
    - 56                                     },
    - 57                                     difftime );
    - 58 
    - 59                         } else {
    - 60                             endSplash(director, images, sceneCreationCallback);
    - 61                         }
    - 62 
    - 63                     }
    - 64                 };
    - 65 
    - 66                 return scene;
    - 67             }
    - 68             /**
    - 69              * Finish splash process by either timeout or resources allocation end.
    - 70              */
    - 71             function endSplash(director, images, onEndSplashCallback) {
    - 72 
    - 73                 director.emptyScenes();
    - 74                 director.setImagesCache(images);
    - 75                 director.setClear( true );
    - 76 
    - 77                 onEndSplashCallback(director);
    - 78 
    - 79                 /**
    - 80                  * Change this sentence's parameters to play with different entering-scene
    - 81                  * curtains.
    - 82                  * just perform a director.setScene(0) to play first director's scene.
    - 83                  */
    - 84 
    - 85                 director.setClear( CAAT.Foundation.Director.CLEAR_ALL );
    - 86                 director.easeIn(
    - 87                         0,
    - 88                         CAAT.Foundation.Scene.EASE_SCALE,
    - 89                         2000,
    - 90                         false,
    - 91                         CAAT.Foundation.Actor.ANCHOR_CENTER,
    - 92                         new CAAT.Behavior.Interpolator().createElasticOutInterpolator(2.5, .4) );
    - 93 
    - 94             }
    - 95 
    - 96             var canvascontainer= document.getElementById(runHere);
    - 97             var director;
    - 98 
    - 99             if ( CAAT.__CSS__ ) {   // css renderer
    -100                 if ( canvascontainer ) {
    -101                     if ( false===canvascontainer instanceof HTMLDivElement ) {
    -102                         canvascontainer= null;
    -103                     }
    -104                 }
    -105 
    -106                 if ( canvascontainer===null ) {
    -107                     canvascontainer= document.createElement('div'); // create a new DIV
    -108                     document.body.appendChild(canvascontainer);
    -109                 }
    -110 
    -111                 director= new CAAT.Foundation.Director().
    -112                     initialize(
    -113                         width||800,
    -114                         height||600,
    -115                         canvascontainer);
    -116 
    -117             } else {
    -118 
    -119                 if ( canvascontainer ) {
    -120                     if ( canvascontainer instanceof HTMLDivElement ) {
    -121                         var ncanvascontainer= document.createElement("canvas");
    -122                         canvascontainer.appendChild(ncanvascontainer);
    -123                         canvascontainer= ncanvascontainer;
    -124                     } else if ( false==canvascontainer instanceof HTMLCanvasElement ) {
    -125                         var ncanvascontainer= document.createElement("canvas");
    -126                         document.body.appendChild(ncanvascontainer);
    -127                         canvascontainer= ncanvascontainer;
    -128                     }
    -129                 } else {
    -130                     canvascontainer= document.createElement('canvas');
    -131                     document.body.appendChild(canvascontainer);
    -132                 }
    -133 
    -134                 director= new CAAT.Foundation.Director().
    -135                         initialize(
    -136                             width||800,
    -137                             height||600,
    -138                             canvascontainer);
    -139             }
    -140 
    -141 
    -142             /**
    -143              * Load splash images. It is supossed the splash has some images.
    -144              */
    -145             var imgs= [];
    -146             if ( splash_path ) {
    -147                 imgs.push( {id:'splash',   url: splash_path } );
    -148             }
    -149             if ( spinner_path ) {
    -150                 imgs.push( {id:'spinner',  url: spinner_path } );
    -151             }
    -152 
    -153             director.setClear( CAAT.Foundation.Director.CLEAR_DIRTY_RECTS );
    -154 
    -155             new CAAT.Module.Preloader.ImagePreloader().loadImages(
    -156                 imgs,
    -157                 function on_load( counter, images ) {
    -158 
    -159                     if ( counter===images.length ) {
    -160 
    -161                         director.setImagesCache(images);
    -162                         var splashScene= createSplashScene(director, minTime || 5000, onEndSplash);
    -163                         CAAT.loop(60);
    -164 
    -165                         if ( imagesURL && imagesURL.length>0 ) {
    -166                             /**
    -167                              * Load resources for non splash screen
    -168                              */
    -169                             new CAAT.Module.Preloader.ImagePreloader().loadImages(
    -170                                     imagesURL,
    -171                                     splashScene.loadedImage
    -172                             );
    -173                         } else {
    -174                             splashScene.loadedImage(0,null);
    -175                         }
    -176                     }
    -177                 }
    -178             );
    -179         }
    -180 
    -181     }
    -182 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_LayoutUtils_RowLayout.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_LayoutUtils_RowLayout.js.html deleted file mode 100644 index 0c7e92b9..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_LayoutUtils_RowLayout.js.html +++ /dev/null @@ -1,68 +0,0 @@ -
      1 CAAT.Module({
    -  2     defines:"CAAT.Module.LayoutUtils.RowLayout",
    -  3     constants:{
    -  4         Row:function (dst, what_to_layout_array, constraint_object) {
    -  5 
    -  6             var width = dst.width;
    -  7             var x = 0, y = 0, i = 0, l = 0;
    -  8             var actor_max_h = -Number.MAX_VALUE, actor_max_w = Number.MAX_VALUE;
    -  9 
    - 10             // compute max/min actor list size.
    - 11             for (i = what_to_layout_array.length - 1; i; i -= 1) {
    - 12                 if (actor_max_w < what_to_layout_array[i].width) {
    - 13                     actor_max_w = what_to_layout_array[i].width;
    - 14                 }
    - 15                 if (actor_max_h < what_to_layout_array[i].height) {
    - 16                     actor_max_h = what_to_layout_array[i].height;
    - 17                 }
    - 18             }
    - 19 
    - 20             if (constraint_object.padding_left) {
    - 21                 x = constraint_object.padding_left;
    - 22                 width -= x;
    - 23             }
    - 24             if (constraint_object.padding_right) {
    - 25                 width -= constraint_object.padding_right;
    - 26             }
    - 27 
    - 28             if (constraint_object.top) {
    - 29                 var top = parseInt(constraint_object.top, 10);
    - 30                 if (!isNaN(top)) {
    - 31                     y = top;
    - 32                 } else {
    - 33                     // not number
    - 34                     switch (constraint_object.top) {
    - 35                         case 'center':
    - 36                             y = (dst.height - actor_max_h) / 2;
    - 37                             break;
    - 38                         case 'top':
    - 39                             y = 0;
    - 40                             break;
    - 41                         case 'bottom':
    - 42                             y = dst.height - actor_max_h;
    - 43                             break;
    - 44                         default:
    - 45                             y = 0;
    - 46                     }
    - 47                 }
    - 48             }
    - 49 
    - 50             // space for each actor
    - 51             var actor_area = width / what_to_layout_array.length;
    - 52 
    - 53             for (i = 0, l = what_to_layout_array.length; i < l; i++) {
    - 54                 what_to_layout_array[i].setLocation(
    - 55                     x + i * actor_area + (actor_area - what_to_layout_array[i].width) / 2,
    - 56                     y);
    - 57             }
    - 58 
    - 59         }
    - 60     }
    - 61 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Locale_ResourceBundle.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Locale_ResourceBundle.js.html deleted file mode 100644 index 4bf1d5de..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Locale_ResourceBundle.js.html +++ /dev/null @@ -1,242 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name Locale
    -  5      * @memberOf CAAT.Module
    -  6      * @namespace
    -  7      */
    -  8 
    -  9     /**
    - 10      * @name ResourceBundle
    - 11      * @memberOf CAAT.Module.Locale
    - 12      * @constructor
    - 13      */
    - 14 
    - 15     defines:"CAAT.Module.Locale.ResourceBundle",
    - 16     extendsWith:function () {
    - 17 
    - 18         return {
    - 19 
    - 20             /**
    - 21              * @lends CAAT.Module.Locale.ResourceBundle.prototype
    - 22              */
    - 23 
    - 24 
    - 25             /**
    - 26              * Is this bundle valid ?
    - 27              */
    - 28             valid : false,
    - 29 
    - 30             /**
    - 31              * Original file contents.
    - 32              */
    - 33             localeInfo : null,      // content from resourceFile
    - 34 
    - 35             /**
    - 36              * Current set locale.
    - 37              */
    - 38             __currentLocale : null, // default locale data
    - 39 
    - 40             /**
    - 41              * Default locale info.
    - 42              */
    - 43             __defaultLocale : null,
    - 44 
    - 45             /**
    - 46              * <p>
    - 47              * Load a bundle file.
    - 48              * The expected file format is as follows:
    - 49              *
    - 50              * <code>
    - 51              * {
    - 52              *  "defaultLocale" : "en-US",
    - 53              *  "en-US" : {
    - 54              *          "key1", "value1",
    - 55              *          "key2", "value2",
    - 56              *          ...
    - 57              *      },
    - 58              *  "en-UK" : {
    - 59              *          "key1", "value1",
    - 60              *          "key2", "value2",
    - 61              *          ...
    - 62              *      }
    - 63              * }
    - 64              * </code>
    - 65              *
    - 66              * <p>
    - 67              * defaultLocale is compulsory.
    - 68              *
    - 69              * <p>
    - 70              * The function getString solves as follows:
    - 71              *
    - 72              * <li>a ResouceBundle object will honor browser/system locale by searching for these strings in
    - 73              *   the navigator object to define the value of currentLocale:
    - 74              *
    - 75              *   <ul>navigator.language
    - 76              *   <ul>navigator.browserLanguage
    - 77              *   <ul>navigator.systemLanguage
    - 78              *   <ul>navigator.userLanguage
    - 79              *
    - 80              * <li>the ResouceBundle class will also get defaultLocale value, and set the corresponding key
    - 81              *   as default Locale.
    - 82              *
    - 83              * <li>a call to getString(id,defaultValue) will work as follows:
    - 84              *
    - 85              * <pre>
    - 86              *   1)     will get the value associated in currentLocale[id]
    - 87              *   2)     if the value is set, it is returned.
    - 88              *   2.1)       else if it is not set, will get the value from defaultLocale[id] (sort of fallback)
    - 89              *   3)     if the value of defaultLocale is set, it is returned.
    - 90              *   3.1)       else defaultValue is returned.
    - 91              * </pre>
    - 92              *
    - 93              * @param resourceFile
    - 94              * @param asynch
    - 95              * @param onSuccess
    - 96              * @param onError
    - 97              * @return {*}
    - 98              * @private
    - 99              */
    -100             __init : function( resourceFile, asynch, onSuccess, onError ) {
    -101 
    -102                 this.loadDoc( resourceFile, asynch, onSuccess, onError );
    -103                 if ( this.valid ) {
    -104                     try {
    -105                         var locale= navigator.language || navigator.browserLanguage || navigator.systemLanguage  || navigator.userLanguage;
    -106                         this.__currentLocale= this.localeInfo[locale];
    -107                         this.__defaultLocale= this.localeInfo["defaultLocale"];
    -108 
    -109                         if ( typeof this.__currentLocale==='undefined' ) {
    -110                             this.__currentLocale= this.__defaultLocale;
    -111                         }
    -112 
    -113                         if ( !this.__currentLocale ) {
    -114                             onError("No available default or system defined locale('"+locale+"'");
    -115                         }
    -116 
    -117                         this.valid= false;
    -118 
    -119                     } catch(e) {
    -120                         onError("No default locale");
    -121                         this.valid= false;
    -122                     }
    -123                 }
    -124 
    -125                 return this;
    -126             },
    -127 
    -128             /**
    -129              * A formated string is a regular string that has embedded holder for string values.
    -130              * for example a string like:
    -131              *
    -132              * "hi this is a $2 $1"
    -133              *
    -134              * will be after calling __formatString( str, ["string","parameterized"] );
    -135              *
    -136              * "hi this is a parameterized string"
    -137              *
    -138              * IMPORTANT: Holder values start in 1.
    -139              *
    -140              * @param string {string} a parameterized string
    -141              * @param args {object} object whose keys are used to find holders and replace them in string parameter
    -142              * @return {string}
    -143              * @private
    -144              */
    -145             __formatString : function( string, args ) {
    -146 
    -147                 if ( !args ) {
    -148                     return string;
    -149                 }
    -150 
    -151                 for( var key in args ) {
    -152                     string= string.replace("$"+key, args[key]);
    -153                 }
    -154 
    -155                 return string;
    -156 
    -157             },
    -158 
    -159             /**
    -160              *
    -161              * @param id {string} a key from the bundle file.
    -162              * @param defaultValue {string} default value in case
    -163              * @param args {Array.<string>=} optional arguments array in case the returned string is a
    -164              *          parameterized string.
    -165              *
    -166              * @return {string}
    -167              */
    -168             getString : function(id, defaultValue, args) {
    -169 
    -170                 if ( this.valid ) {
    -171                     var str= this.__currentLocale[id];
    -172                     if ( str ) {
    -173                         return this.__formatString(str,args);
    -174                     } else {
    -175 
    -176                         if ( this.__currentLocale!==this.__defaultLocale ) {
    -177                             str= this.__defaultLocale[id];
    -178                             if ( str ) {
    -179                                 return this.__formatString(str,args);
    -180                             }
    -181                         }
    -182                     }
    -183                 }
    -184 
    -185                 return this.__formatString(defaultValue,args);
    -186             },
    -187 
    -188             loadDoc : function(resourceFile, asynch, onSuccess, onError ) {
    -189                 var me= this;
    -190 
    -191                 var req;
    -192                 if (window.XMLHttpRequest && !(window.ActiveXObject)) {
    -193                     try {
    -194                         req = new XMLHttpRequest();
    -195                     } catch (e) {
    -196                         req = null;
    -197                         onError(e);
    -198                     }
    -199                 } else if (window.ActiveXObject) {
    -200                     try {
    -201                         req = new ActiveXObject("Msxml2.XMLHTTP");
    -202                     } catch (e) {
    -203                         try {
    -204                             req = new ActiveXObject("Microsoft.XMLHTTP");
    -205                         } catch (e) {
    -206                             req = null;
    -207                             onError(e);
    -208                         }
    -209                     }
    -210                 }
    -211 
    -212                 if (req) {
    -213                     req.onreadystatechange = function () {
    -214                         if (req.readyState == 4) {
    -215                             if (req.status == 200) {
    -216                                 try {
    -217                                     me.localeInfo= JSON.parse(req.responseText);
    -218                                     me.valid= true;
    -219                                     onSuccess(me.localeInfo);
    -220                                 } catch(e) {
    -221                                     onError(e);
    -222                                 }
    -223                             } else {
    -224                                 onError("onReadyStateChange status="+req.status);
    -225                             }
    -226                         }
    -227                     };
    -228 
    -229                     req.open("GET", resourceFile, false);
    -230                     req.send("");
    -231                 }
    -232             }
    -233         }
    -234     }
    -235 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Runtime_BrowserInfo.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Runtime_BrowserInfo.js.html deleted file mode 100644 index 4f90f6a3..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Runtime_BrowserInfo.js.html +++ /dev/null @@ -1,170 +0,0 @@ -
      1 /**
    -  2  *
    -  3  * taken from: http://www.quirksmode.org/js/detect.html
    -  4  *
    -  5  * 20101008 Hyperandroid. IE9 seems to identify himself as Explorer and stopped calling himself MSIE.
    -  6  *          Added Explorer description to browser list. Thanks @alteredq for this tip.
    -  7  *
    -  8  */
    -  9 CAAT.Module({
    - 10 
    - 11     /**
    - 12      * @name Runtime
    - 13      * @memberOf CAAT.Module
    - 14      * @namespace
    - 15      */
    - 16 
    - 17     /**
    - 18      * @name BrowserInfo
    - 19      * @memberOf CAAT.Module.Runtime
    - 20      * @namespace
    - 21      */
    - 22 
    - 23     defines:"CAAT.Module.Runtime.BrowserInfo",
    - 24 
    - 25     constants: function() {
    - 26 
    - 27         /**
    - 28          * @lends CAAT.Module.Runtime.BrowserInfo
    - 29          */
    - 30 
    - 31         function searchString(data) {
    - 32             for (var i = 0; i < data.length; i++) {
    - 33                 var dataString = data[i].string;
    - 34                 var dataProp = data[i].prop;
    - 35                 this.versionSearchString = data[i].versionSearch || data[i].identity;
    - 36                 if (dataString) {
    - 37                     if (dataString.indexOf(data[i].subString) !== -1)
    - 38                         return data[i].identity;
    - 39                 }
    - 40                 else if (dataProp)
    - 41                     return data[i].identity;
    - 42             }
    - 43         }
    - 44 
    - 45         function searchVersion(dataString) {
    - 46             var index = dataString.indexOf(this.versionSearchString);
    - 47             if (index === -1) return;
    - 48             return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
    - 49         }
    - 50 
    - 51         var dataBrowser= [
    - 52             {
    - 53                 string:navigator.userAgent,
    - 54                 subString:"Chrome",
    - 55                 identity:"Chrome"
    - 56             },
    - 57             {   string:navigator.userAgent,
    - 58                 subString:"OmniWeb",
    - 59                 versionSearch:"OmniWeb/",
    - 60                 identity:"OmniWeb"
    - 61             },
    - 62             {
    - 63                 string:navigator.vendor,
    - 64                 subString:"Apple",
    - 65                 identity:"Safari",
    - 66                 versionSearch:"Version"
    - 67             },
    - 68             {
    - 69                 prop:window.opera,
    - 70                 identity:"Opera"
    - 71             },
    - 72             {
    - 73                 string:navigator.vendor,
    - 74                 subString:"iCab",
    - 75                 identity:"iCab"
    - 76             },
    - 77             {
    - 78                 string:navigator.vendor,
    - 79                 subString:"KDE",
    - 80                 identity:"Konqueror"
    - 81             },
    - 82             {
    - 83                 string:navigator.userAgent,
    - 84                 subString:"Firefox",
    - 85                 identity:"Firefox"
    - 86             },
    - 87             {
    - 88                 string:navigator.vendor,
    - 89                 subString:"Camino",
    - 90                 identity:"Camino"
    - 91             },
    - 92             {        // for newer Netscapes (6+)
    - 93                 string:navigator.userAgent,
    - 94                 subString:"Netscape",
    - 95                 identity:"Netscape"
    - 96             },
    - 97             {
    - 98                 string:navigator.userAgent,
    - 99                 subString:"MSIE",
    -100                 identity:"Explorer",
    -101                 versionSearch:"MSIE"
    -102             },
    -103             {
    -104                 string:navigator.userAgent,
    -105                 subString:"Explorer",
    -106                 identity:"Explorer",
    -107                 versionSearch:"Explorer"
    -108             },
    -109             {
    -110                 string:navigator.userAgent,
    -111                 subString:"Gecko",
    -112                 identity:"Mozilla",
    -113                 versionSearch:"rv"
    -114             },
    -115             { // for older Netscapes (4-)
    -116                 string:navigator.userAgent,
    -117                 subString:"Mozilla",
    -118                 identity:"Netscape",
    -119                 versionSearch:"Mozilla"
    -120             }
    -121         ];
    -122 
    -123         var dataOS=[
    -124             {
    -125                 string:navigator.platform,
    -126                 subString:"Win",
    -127                 identity:"Windows"
    -128             },
    -129             {
    -130                 string:navigator.platform,
    -131                 subString:"Mac",
    -132                 identity:"Mac"
    -133             },
    -134             {
    -135                 string:navigator.userAgent,
    -136                 subString:"iPhone",
    -137                 identity:"iPhone/iPod"
    -138             },
    -139             {
    -140                 string:navigator.platform,
    -141                 subString:"Linux",
    -142                 identity:"Linux"
    -143             }
    -144         ];
    -145 
    -146         var browser = searchString(dataBrowser) || "An unknown browser";
    -147         var version = searchVersion(navigator.userAgent) ||
    -148                       searchVersion(navigator.appVersion) ||
    -149                       "an unknown version";
    -150         var OS = searchString(dataOS) || "an unknown OS";
    -151 
    -152         var DevicePixelRatio = window.devicePixelRatio || 1;
    -153 
    -154         return {
    -155             browser: browser,
    -156             version: version,
    -157             OS: OS,
    -158             DevicePixelRatio : DevicePixelRatio
    -159         }
    -160 
    -161     }
    -162 });
    -163 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Bone.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Bone.js.html deleted file mode 100644 index 6894ed9e..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Bone.js.html +++ /dev/null @@ -1,514 +0,0 @@ -
      1 /**
    -  2  * Created with JetBrains WebStorm.
    -  3  * User: ibon
    -  4  * Date: 3/21/13
    -  5  * Time: 7:51 PM
    -  6  * To change this template use File | Settings | File Templates.
    -  7  */
    -  8 CAAT.Module({
    -  9 
    - 10     /**
    - 11      * @name Skeleton
    - 12      * @memberof CAAT.Module
    - 13      * @namespace
    - 14      */
    - 15 
    - 16     /**
    - 17      * @name Bone
    - 18      * @memberof CAAT.Module.Skeleton
    - 19      * @constructor
    - 20      */
    - 21 
    - 22     defines : "CAAT.Module.Skeleton.Bone",
    - 23     depends : [
    - 24         "CAAT.Behavior.Interpolator",
    - 25         "CAAT.Behavior.RotateBehavior",
    - 26         "CAAT.Behavior.PathBehavior",
    - 27         "CAAT.Behavior.ScaleBehavior",
    - 28         "CAAT.Behavior.ContainerBehavior"
    - 29     ],
    - 30     extendsWith : function() {
    - 31 
    - 32 
    - 33         /**
    - 34          * @lends CAAT.Module.Skeleton.Bone.prototype
    - 35          */
    - 36 
    - 37         var defPoint = { x: 0, y: 0 };
    - 38         var defScale = { scaleX: 1, scaleY: 1 };
    - 39         var defAngle = 0;
    - 40 
    - 41         var cangle;
    - 42         var cscale;
    - 43         var cpoint;
    - 44 
    - 45         function fntr(behavior, orgtime, time, actor, value) {
    - 46             cpoint= value;
    - 47         }
    - 48 
    - 49         function fnsc(behavior, orgtime, time, actor, value) {
    - 50             cscale= value;
    - 51         }
    - 52 
    - 53         function fnrt(behavior, orgtime, time, actor, value) {
    - 54             cangle= value;
    - 55         }
    - 56 
    - 57         return {
    - 58             id : null,
    - 59 
    - 60             wx : 0,
    - 61             wy : 0,
    - 62             wrotationAngle : 0,
    - 63             wscaleX : 0,
    - 64             wscaleY : 0,
    - 65 
    - 66             /**
    - 67              * Bone x position relative parent
    - 68              * @type number
    - 69              */
    - 70             x : 0,
    - 71 
    - 72             /**
    - 73              * Bone y position relative parent
    - 74              * @type {number}
    - 75              */
    - 76             y : 0,
    - 77 
    - 78             positionAnchorX : 0,
    - 79             positionAnchorY : 0,
    - 80 
    - 81             /**
    - 82              * Bone rotation angle
    - 83              * @type {number}
    - 84              */
    - 85             rotationAngle : 0,
    - 86             rotationAnchorX : 0,
    - 87             rotationAnchorY : 0.5,
    - 88 
    - 89             scaleX : 1,
    - 90             scaleY : 1,
    - 91             scaleAnchorX : .5,
    - 92             scaleAnchorY : .5,
    - 93 
    - 94             /**
    - 95              * Bone size.
    - 96              * @type number
    - 97              */
    - 98             size : 0,
    - 99 
    -100             /**
    -101              * @type CAAT.Math.Matrix
    -102              */
    -103             matrix : null,
    -104 
    -105             /**
    -106              * @type CAAT.Math.Matrix
    -107              */
    -108             wmatrix : null,
    -109 
    -110             /**
    -111              * @type CAAT.Skeleton.Bone
    -112              */
    -113             parent : null,
    -114 
    -115             /**
    -116              * @type CAAT.Behavior.ContainerBehavior
    -117              */
    -118             keyframesTranslate : null,
    -119 
    -120             /**
    -121              * @type CAAT.PathUtil.Path
    -122              */
    -123             keyframesTranslatePath : null,
    -124 
    -125             /**
    -126              * @type CAAT.Behavior.ContainerBehavior
    -127              */
    -128             keyframesScale : null,
    -129 
    -130             /**
    -131              * @type CAAT.Behavior.ContainerBehavior
    -132              */
    -133             keyframesRotate : null,
    -134 
    -135             /**
    -136              * @type object
    -137              */
    -138             keyframesByAnimation : null,
    -139 
    -140             currentAnimation : null,
    -141 
    -142             /**
    -143              * @type Array.<CAAT.Skeleton.Bone>
    -144              */
    -145             children : null,
    -146 
    -147             behaviorApplicationTime : -1,
    -148 
    -149             __init : function(id) {
    -150                 this.id= id;
    -151                 this.matrix= new CAAT.Math.Matrix();
    -152                 this.wmatrix= new CAAT.Math.Matrix();
    -153                 this.parent= null;
    -154                 this.children= [];
    -155 
    -156                 this.keyframesByAnimation = {};
    -157 
    -158                 return this;
    -159             },
    -160 
    -161             setBehaviorApplicationTime : function(t) {
    -162                 this.behaviorApplicationTime= t;
    -163                 return this;
    -164             },
    -165 
    -166             __createAnimation : function(name) {
    -167 
    -168                 var keyframesTranslate= new CAAT.Behavior.ContainerBehavior(true).setCycle(true, true).setId("keyframes_tr");
    -169                 var keyframesScale= new CAAT.Behavior.ContainerBehavior(true).setCycle(true, true).setId("keyframes_sc");
    -170                 var keyframesRotate= new CAAT.Behavior.ContainerBehavior(true).setCycle(true, true).setId("keyframes_rt");
    -171 
    -172                 keyframesTranslate.addListener( { behaviorApplied : fntr });
    -173                 keyframesScale.addListener( { behaviorApplied : fnsc });
    -174                 keyframesRotate.addListener( { behaviorApplied : fnrt });
    -175 
    -176                 var animData= {
    -177                     keyframesTranslate  : keyframesTranslate,
    -178                     keyframesScale      : keyframesScale,
    -179                     keyframesRotate     : keyframesRotate
    -180                 };
    -181 
    -182                 this.keyframesByAnimation[name]= animData;
    -183 
    -184                 return animData;
    -185             },
    -186 
    -187             __getAnimation : function(name) {
    -188                 var animation= this.keyframesByAnimation[ name ];
    -189                 if (!animation) {
    -190                     animation= this.__createAnimation(name);
    -191                 }
    -192 
    -193                 return animation;
    -194             },
    -195 
    -196             /**
    -197              *
    -198              * @param parent {CAAT.Skeleton.Bone}
    -199              * @returns {*}
    -200              */
    -201             __setParent : function( parent ) {
    -202                 this.parent= parent;
    -203                 return this;
    -204             },
    -205 
    -206             addBone : function( bone ) {
    -207                 this.children.push(bone);
    -208                 bone.__setParent(this);
    -209                 return this;
    -210             },
    -211 
    -212             __noValue : function( keyframes ) {
    -213                 keyframes.doValueApplication= false;
    -214                 if ( keyframes instanceof CAAT.Behavior.ContainerBehavior ) {
    -215                     this.__noValue( keyframes );
    -216                 }
    -217             },
    -218 
    -219             __setInterpolator : function(behavior, curve) {
    -220                 if (curve && curve!=="stepped") {
    -221                     behavior.setInterpolator(
    -222                             new CAAT.Behavior.Interpolator().createQuadricBezierInterpolator(
    -223                                     new CAAT.Math.Point(0,0),
    -224                                     new CAAT.Math.Point(curve[0], curve[1]),
    -225                                     new CAAT.Math.Point(curve[2], curve[3])
    -226                             )
    -227                     );
    -228                 }
    -229             },
    -230 
    -231             /**
    -232              *
    -233              * @param name {string} keyframe animation name
    -234              * @param angleStart {number} rotation start angle
    -235              * @param angleEnd {number} rotation end angle
    -236              * @param timeStart {number} keyframe start time
    -237              * @param timeEnd {number} keyframe end time
    -238              * @param curve {Array.<number>=} 4 numbers definint a quadric bezier info. two first points
    -239              *  assumed to be 0,0.
    -240              */
    -241             addRotationKeyframe : function( name, angleStart, angleEnd, timeStart, timeEnd, curve ) {
    -242 
    -243                 var as= 2*Math.PI*angleStart/360;
    -244                 var ae= 2*Math.PI*angleEnd/360;
    -245 
    -246                 // minimum distant between two angles.
    -247 
    -248                 if ( as<-Math.PI ) {
    -249                     if (Math.abs(as+this.rotationAngle)>2*Math.PI) {
    -250                         as= -(as+Math.PI);
    -251                     } else {
    -252                         as= (as+Math.PI);
    -253                     }
    -254                 } else if (as > Math.PI) {
    -255                     as -= 2 * Math.PI;
    -256                 }
    -257 
    -258                 if ( ae<-Math.PI ) {
    -259 
    -260                     if (Math.abs(ae+this.rotationAngle)>2*Math.PI) {
    -261                         ae= -(ae+Math.PI);
    -262                     } else {
    -263                         ae= (ae+Math.PI);
    -264                     }
    -265                 } else if ( ae>Math.PI ) {
    -266                     ae-=2*Math.PI;
    -267                 }
    -268 
    -269                 angleStart= -as;
    -270                 angleEnd= -ae;
    -271 
    -272                 var behavior= new CAAT.Behavior.RotateBehavior().
    -273                         setFrameTime( timeStart, timeEnd-timeStart+1).
    -274                         setValues( angleStart, angleEnd, 0, .5).
    -275                         setValueApplication(false);
    -276 
    -277                 this.__setInterpolator( behavior, curve );
    -278 
    -279                 var animation= this.__getAnimation(name);
    -280                 animation.keyframesRotate.addBehavior(behavior);
    -281             },
    -282 
    -283             endRotationKeyframes : function(name) {
    -284 
    -285             },
    -286 
    -287             addTranslationKeyframe : function( name, startX, startY, endX, endY, timeStart, timeEnd, curve ) {
    -288                 var behavior= new CAAT.Behavior.PathBehavior().
    -289                     setFrameTime( timeStart, timeEnd-timeStart+1).
    -290                     setValues( new CAAT.PathUtil.Path().
    -291                         setLinear( startX, startY, endX, endY )
    -292                     ).
    -293                     setValueApplication(false);
    -294 
    -295                 this.__setInterpolator( behavior, curve );
    -296 
    -297                 var animation= this.__getAnimation(name);
    -298                 animation.keyframesTranslate.addBehavior( behavior );
    -299             },
    -300 
    -301             addScaleKeyframe : function( name, scaleX, endScaleX, scaleY, endScaleY, timeStart, timeEnd, curve ) {
    -302                 var behavior= new CAAT.Behavior.ScaleBehavior().
    -303                     setFrameTime( timeStart, timeEnd-timeStart+1).
    -304                     setValues( scaleX, endScaleX, scaleY, endScaleY ).
    -305                     setValueApplication(false);
    -306 
    -307                 this.__setInterpolator( behavior, curve );
    -308 
    -309                 var animation= this.__getAnimation(name);
    -310                 animation.keyframesScale.addBehavior( behavior );
    -311             },
    -312 
    -313             endTranslationKeyframes : function(name) {
    -314 
    -315             },
    -316 
    -317             setSize : function(s) {
    -318                 this.width= s;
    -319                 this.height= 0;
    -320             },
    -321 
    -322             endScaleKeyframes : function(name) {
    -323 
    -324             },
    -325 
    -326             setPosition : function( x, y ) {
    -327                 this.x= x;
    -328                 this.y= -y;
    -329                 return this;
    -330             } ,
    -331 
    -332             /**
    -333              * default anchor values are for spine tool.
    -334              * @param angle {number}
    -335              * @param anchorX {number=}
    -336              * @param anchorY {number=}
    -337              * @returns {*}
    -338              */
    -339             setRotateTransform : function( angle, anchorX, anchorY ) {
    -340                 this.rotationAngle= -angle*2*Math.PI/360;
    -341                 this.rotationAnchorX= typeof anchorX!=="undefined" ? anchorX : 0;
    -342                 this.rotationAnchorY= typeof anchorY!=="undefined" ? anchorY : .5;
    -343                 return this;
    -344             },
    -345 
    -346             /**
    -347              *
    -348              * @param sx {number}
    -349              * @param sy {number}
    -350              * @param anchorX {number=} anchorX: .5 by default
    -351              * @param anchorY {number=} anchorY. .5 by default
    -352              * @returns {*}
    -353              */
    -354             setScaleTransform : function( sx, sy, anchorX, anchorY ) {
    -355                 this.scaleX= sx;
    -356                 this.scaleY= sy;
    -357                 this.scaleAnchorX= typeof anchorX!=="undefined" ? anchorX : .5;
    -358                 this.scaleAnchorY= typeof anchorY!=="undefined" ? anchorY : .5;
    -359                 return this;
    -360             },
    -361 
    -362 
    -363             __setModelViewMatrix : function() {
    -364                 var c, s, _m00, _m01, _m10, _m11;
    -365                 var mm0, mm1, mm2, mm3, mm4, mm5;
    -366                 var mm;
    -367 
    -368                 var mm = this.matrix.matrix;
    -369 
    -370                 mm0 = 1;
    -371                 mm1 = 0;
    -372                 mm3 = 0;
    -373                 mm4 = 1;
    -374 
    -375                 mm2 = this.wx - this.positionAnchorX * this.width;
    -376                 mm5 = this.wy - this.positionAnchorY * this.height;
    -377 
    -378                 if (this.wrotationAngle) {
    -379 
    -380                     var rx = this.rotationAnchorX * this.width;
    -381                     var ry = this.rotationAnchorY * this.height;
    -382 
    -383                     mm2 += mm0 * rx + mm1 * ry;
    -384                     mm5 += mm3 * rx + mm4 * ry;
    -385 
    -386                     c = Math.cos(this.wrotationAngle);
    -387                     s = Math.sin(this.wrotationAngle);
    -388                     _m00 = mm0;
    -389                     _m01 = mm1;
    -390                     _m10 = mm3;
    -391                     _m11 = mm4;
    -392                     mm0 = _m00 * c + _m01 * s;
    -393                     mm1 = -_m00 * s + _m01 * c;
    -394                     mm3 = _m10 * c + _m11 * s;
    -395                     mm4 = -_m10 * s + _m11 * c;
    -396 
    -397                     mm2 += -mm0 * rx - mm1 * ry;
    -398                     mm5 += -mm3 * rx - mm4 * ry;
    -399                 }
    -400                 if (this.wscaleX != 1 || this.wscaleY != 1) {
    -401 
    -402                     var sx = this.scaleAnchorX * this.width;
    -403                     var sy = this.scaleAnchorY * this.height;
    -404 
    -405                     mm2 += mm0 * sx + mm1 * sy;
    -406                     mm5 += mm3 * sx + mm4 * sy;
    -407 
    -408                     mm0 = mm0 * this.wscaleX;
    -409                     mm1 = mm1 * this.wscaleY;
    -410                     mm3 = mm3 * this.wscaleX;
    -411                     mm4 = mm4 * this.wscaleY;
    -412 
    -413                     mm2 += -mm0 * sx - mm1 * sy;
    -414                     mm5 += -mm3 * sx - mm4 * sy;
    -415                 }
    -416 
    -417                 mm[0] = mm0;
    -418                 mm[1] = mm1;
    -419                 mm[2] = mm2;
    -420                 mm[3] = mm3;
    -421                 mm[4] = mm4;
    -422                 mm[5] = mm5;
    -423 
    -424                 if (this.parent) {
    -425                     this.wmatrix.copy(this.parent.wmatrix);
    -426                     this.wmatrix.multiply(this.matrix);
    -427                 } else {
    -428                     this.wmatrix.identity();
    -429                 }
    -430             },
    -431 
    -432             setAnimation : function(name) {
    -433                 var animation= this.keyframesByAnimation[name];
    -434                 if (animation) {
    -435                     this.keyframesRotate= animation.keyframesRotate;
    -436                     this.keyframesScale= animation.keyframesScale;
    -437                     this.keyframesTranslate= animation.keyframesTranslate;
    -438                 }
    -439 
    -440                 for( var i= 0, l=this.children.length; i<l; i+=1 ) {
    -441                     this.children[i].setAnimation(name);
    -442                 }
    -443             },
    -444 
    -445             /**
    -446              * @param time {number}
    -447              */
    -448             apply : function( time, animationTime ) {
    -449 
    -450                 cpoint= defPoint;
    -451                 cangle= defAngle;
    -452                 cscale= defScale;
    -453 
    -454                 if (this.keyframesTranslate) {
    -455                     this.keyframesTranslate.apply(time);
    -456                 }
    -457 
    -458                 if ( this.keyframesRotate ) {
    -459                     this.keyframesRotate.apply(time);
    -460                 }
    -461 
    -462                 if ( this.keyframesScale ) {
    -463                     this.keyframesScale.apply(time);
    -464                 }
    -465 
    -466                 this.wx= cpoint.x + this.x;
    -467                 this.wy= cpoint.y + this.y;
    -468 
    -469                 this.wrotationAngle = cangle + this.rotationAngle;
    -470 
    -471                 this.wscaleX= cscale.scaleX * this.scaleX;
    -472                 this.wscaleY= cscale.scaleY * this.scaleY;
    -473 
    -474                 this.__setModelViewMatrix();
    -475 
    -476                 for( var i=0; i<this.children.length; i++ ) {
    -477                     this.children[i].apply(time);
    -478                 }
    -479             },
    -480 
    -481             transformContext : function(ctx) {
    -482                 var m= this.wmatrix.matrix;
    -483                 ctx.transform( m[0], m[3], m[1], m[4], m[2], m[5] );
    -484             },
    -485 
    -486             paint : function( actorMatrix, ctx ) {
    -487                 ctx.save();
    -488                     this.transformContext(ctx);
    -489 
    -490                     ctx.strokeStyle= 'blue';
    -491                     ctx.beginPath();
    -492                     ctx.moveTo(0,-2);
    -493                     ctx.lineTo(this.width,this.height);
    -494                     ctx.lineTo(0,2);
    -495                     ctx.lineTo(0,-2);
    -496                     ctx.stroke();
    -497                 ctx.restore();
    -498 
    -499                 for( var i=0; i<this.children.length; i++ ) {
    -500                     this.children[i].paint(actorMatrix, ctx);
    -501                 }
    -502 
    -503 
    -504             }
    -505         }
    -506     }
    -507 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_BoneActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_BoneActor.js.html deleted file mode 100644 index c67f389d..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_BoneActor.js.html +++ /dev/null @@ -1,265 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3 
    -  4     /**
    -  5      * @name BoneActor
    -  6      * @memberof CAAT.Module.Skeleton
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.Module.Skeleton.BoneActor",
    - 11     depends : [
    - 12         "CAAT.Module.Skeleton.BoneActorAttachment"
    - 13     ],
    - 14     extendsWith : function() {
    - 15 
    - 16         return {
    - 17 
    - 18             /**
    - 19              * @lends CAAT.Module.Skeleton.BoneActor.prototype
    - 20              */
    - 21 
    - 22             bone    : null,
    - 23             skinInfo : null,
    - 24             skinInfoByName : null,
    - 25             currentSkinInfo : null,
    - 26             skinDataKeyframes : null,
    - 27             parent : null,
    - 28             worldModelViewMatrix : null,
    - 29             skinMatrix : null,  // compositon of bone + skin info
    - 30             AABB : null,
    - 31 
    - 32             /**
    - 33              * @type {object}
    - 34              * @map {string}, { x:{number}, y: {number} }
    - 35              */
    - 36             attachments : null,
    - 37 
    - 38             __init : function() {
    - 39                 this.skinInfo= [];
    - 40                 this.worldModelViewMatrix= new CAAT.Math.Matrix();
    - 41                 this.skinMatrix= new CAAT.Math.Matrix();
    - 42                 this.skinInfoByName= {};
    - 43                 this.skinDataKeyframes= [];
    - 44                 this.attachments= [];
    - 45                 this.AABB= new CAAT.Math.Rectangle();
    - 46             },
    - 47 
    - 48             addAttachment : function( id, normalized_x, normalized_y, callback ) {
    - 49 
    - 50                 this.attachments.push( new CAAT.Module.Skeleton.BoneActorAttachment(id, normalized_x, normalized_y, callback) );
    - 51             },
    - 52 
    - 53             addAttachmentListener : function( al ) {
    - 54 
    - 55             },
    - 56 
    - 57             setBone : function(bone) {
    - 58                 this.bone= bone;
    - 59                 return this;
    - 60             },
    - 61 
    - 62             addSkinInfo : function( si ) {
    - 63                 if (null===this.currentSkinInfo) {
    - 64                     this.currentSkinInfo= si;
    - 65                 }
    - 66                 this.skinInfo.push( si );
    - 67                 this.skinInfoByName[ si.name ]= si;
    - 68                 return this;
    - 69             },
    - 70 
    - 71             setDefaultSkinInfoByName : function( name ) {
    - 72                 var v= this.skinInfoByName[name];
    - 73                 if (v) {
    - 74                     this.currentSkinInfo= v;
    - 75                 }
    - 76 
    - 77                 return this;
    - 78             },
    - 79 
    - 80             emptySkinDataKeyframe : function() {
    - 81                 this.skinDataKeyframes= [];
    - 82             },
    - 83 
    - 84             addSkinDataKeyframe : function( name, start, duration ) {
    - 85                 this.skinDataKeyframes.push( {
    - 86                     name : name,
    - 87                     start : start,
    - 88                     duration : duration
    - 89                 });
    - 90             },
    - 91 
    - 92             __getCurrentSkinInfo : function(time) {
    - 93                 if ( this.skinDataKeyframes.length ) {
    - 94                     time=(time%1000)/1000;
    - 95 
    - 96                     for( var i=0, l=this.skinDataKeyframes.length; i<l; i+=1 ) {
    - 97                         var sdkf= this.skinDataKeyframes[i];
    - 98                         if ( time>=sdkf.start && time<=sdkf.start+sdkf.duration ) {
    - 99                             return this.currentSkinInfo= this.skinInfoByName[ sdkf.name ];
    -100                         }
    -101                     }
    -102 
    -103                     return null;
    -104                 }
    -105 
    -106                 return this.currentSkinInfo;
    -107             },
    -108 
    -109             paint : function( ctx, time ) {
    -110 
    -111                 var skinInfo= this.__getCurrentSkinInfo(time);
    -112 
    -113                 if (!skinInfo || !skinInfo.image) {
    -114                     return;
    -115                 }
    -116 
    -117                 /*
    -118                     var w= skinInfo.width*.5;
    -119                     var h= skinInfo.height*.5;
    -120 
    -121                     ctx.translate(skinInfo.x, skinInfo.y );
    -122                     ctx.rotate(skinInfo.angle);
    -123                     ctx.scale(skinInfo.scaleX, skinInfo.scaleY);
    -124                     ctx.translate( -w, -h);
    -125                 */
    -126 
    -127                 this.worldModelViewMatrix.transformRenderingContextSet(ctx);
    -128                 skinInfo.matrix.transformRenderingContext( ctx );
    -129                 ctx.drawImage( skinInfo.image, 0, 0, skinInfo.image.width, skinInfo.image.height );
    -130 
    -131             },
    -132 
    -133             setupAnimation : function(time) {
    -134                 this.setModelViewMatrix();
    -135                 this.prepareAABB(time);
    -136                 this.__setupAttachments();
    -137             },
    -138 
    -139             prepareAABB : function(time) {
    -140                 var skinInfo= this.__getCurrentSkinInfo(time);
    -141                 var x=0, y=0, w, h;
    -142 
    -143                 if ( skinInfo ) {
    -144                     w= skinInfo.width;
    -145                     h= skinInfo.height;
    -146                 } else {
    -147                     w= h= 1;
    -148                 }
    -149 
    -150                 var vv= [
    -151                     new CAAT.Math.Point(x,y),
    -152                     new CAAT.Math.Point(x+w,0),
    -153                     new CAAT.Math.Point(x+w, y+h),
    -154                     new CAAT.Math.Point(x, y + h)
    -155                 ];
    -156 
    -157                 var AABB= this.AABB;
    -158                 var vvv;
    -159 
    -160                 /**
    -161                  * cache the bone+skin matrix for later usage in attachment calculations.
    -162                  */
    -163                 var amatrix= this.skinMatrix;
    -164                 amatrix.copy( this.worldModelViewMatrix );
    -165                 amatrix.multiply( this.currentSkinInfo.matrix );
    -166 
    -167                 for( var i=0; i<vv.length; i++ ) {
    -168                     vv[i]= amatrix.transformCoord(vv[i]);
    -169                 }
    -170 
    -171                 var xmin = Number.MAX_VALUE, xmax = -Number.MAX_VALUE;
    -172                 var ymin = Number.MAX_VALUE, ymax = -Number.MAX_VALUE;
    -173 
    -174                 vvv = vv[0];
    -175                 if (vvv.x < xmin) {
    -176                     xmin = vvv.x;
    -177                 }
    -178                 if (vvv.x > xmax) {
    -179                     xmax = vvv.x;
    -180                 }
    -181                 if (vvv.y < ymin) {
    -182                     ymin = vvv.y;
    -183                 }
    -184                 if (vvv.y > ymax) {
    -185                     ymax = vvv.y;
    -186                 }
    -187                 vvv = vv[1];
    -188                 if (vvv.x < xmin) {
    -189                     xmin = vvv.x;
    -190                 }
    -191                 if (vvv.x > xmax) {
    -192                     xmax = vvv.x;
    -193                 }
    -194                 if (vvv.y < ymin) {
    -195                     ymin = vvv.y;
    -196                 }
    -197                 if (vvv.y > ymax) {
    -198                     ymax = vvv.y;
    -199                 }
    -200                 vvv = vv[2];
    -201                 if (vvv.x < xmin) {
    -202                     xmin = vvv.x;
    -203                 }
    -204                 if (vvv.x > xmax) {
    -205                     xmax = vvv.x;
    -206                 }
    -207                 if (vvv.y < ymin) {
    -208                     ymin = vvv.y;
    -209                 }
    -210                 if (vvv.y > ymax) {
    -211                     ymax = vvv.y;
    -212                 }
    -213                 vvv = vv[3];
    -214                 if (vvv.x < xmin) {
    -215                     xmin = vvv.x;
    -216                 }
    -217                 if (vvv.x > xmax) {
    -218                     xmax = vvv.x;
    -219                 }
    -220                 if (vvv.y < ymin) {
    -221                     ymin = vvv.y;
    -222                 }
    -223                 if (vvv.y > ymax) {
    -224                     ymax = vvv.y;
    -225                 }
    -226 
    -227                 AABB.x = xmin;
    -228                 AABB.y = ymin;
    -229                 AABB.x1 = xmax;
    -230                 AABB.y1 = ymax;
    -231                 AABB.width = (xmax - xmin);
    -232                 AABB.height = (ymax - ymin);
    -233             },
    -234 
    -235             setModelViewMatrix : function() {
    -236 
    -237                 if (this.parent) {
    -238                     this.worldModelViewMatrix.copy(this.parent.worldModelViewMatrix);
    -239                     this.worldModelViewMatrix.multiply(this.bone.wmatrix);
    -240 
    -241                 } else {
    -242                     this.worldModelViewMatrix.identity();
    -243                 }
    -244             },
    -245 
    -246             __setupAttachments : function( ) {
    -247                 for( var i= 0, l=this.attachments.length; i<l; i+=1 ) {
    -248                     var attachment= this.attachments[ i ];
    -249                     attachment.transform( this.skinMatrix, this.currentSkinInfo.width, this.currentSkinInfo.height );
    -250                 }
    -251             },
    -252 
    -253             getAttachment : function( id ) {
    -254                 return this.attachments[id];
    -255             }
    -256         }
    -257     }
    -258 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Skeleton.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Skeleton.js.html deleted file mode 100644 index 099388a2..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Skeleton.js.html +++ /dev/null @@ -1,290 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name Skeleton
    -  5      * @memberof CAAT.Module.Skeleton
    -  6      * @constructor
    -  7      */
    -  8 
    -  9     defines : "CAAT.Module.Skeleton.Skeleton",
    - 10     depends : [
    - 11         "CAAT.Module.Skeleton.Bone"
    - 12     ],
    - 13     extendsWith : {
    - 14 
    - 15         /**
    - 16          * @lends CAAT.Module.Skeleton.Skeleton.prototype
    - 17          */
    - 18 
    - 19         bones : null,
    - 20         bonesArray : null,
    - 21         animation : null,
    - 22         root  : null,
    - 23         currentAnimationName : null,
    - 24         skeletonDataFromFile : null,
    - 25 
    - 26         __init : function(skeletonDataFromFile) {
    - 27             this.bones= {};
    - 28             this.bonesArray= [];
    - 29             this.animations= {};
    - 30 
    - 31             // bones
    - 32             if (skeletonDataFromFile) {
    - 33                 this.__setSkeleton( skeletonDataFromFile );
    - 34             }
    - 35         },
    - 36 
    - 37         getSkeletonDataFromFile : function() {
    - 38             return this.skeletonDataFromFile;
    - 39         },
    - 40 
    - 41         __setSkeleton : function( skeletonDataFromFile ) {
    - 42             this.skeletonDataFromFile= skeletonDataFromFile;
    - 43             for ( var i=0; i<skeletonDataFromFile.bones.length; i++ ) {
    - 44                 var boneInfo= skeletonDataFromFile.bones[i];
    - 45                 this.addBone(boneInfo);
    - 46             }
    - 47         },
    - 48 
    - 49         setSkeletonFromFile : function(url) {
    - 50             var me= this;
    - 51             new CAAT.Module.Preloader.XHR().load(
    - 52                     function( result, content ) {
    - 53                         if (result==="ok" ) {
    - 54                             me.__setSkeleton( JSON.parse(content) );
    - 55                         }
    - 56                     },
    - 57                     url,
    - 58                     false,
    - 59                     "GET"
    - 60             );
    - 61 
    - 62             return this;
    - 63         },
    - 64 
    - 65         addAnimationFromFile : function(name, url) {
    - 66             var me= this;
    - 67             new CAAT.Module.Preloader.XHR().load(
    - 68                     function( result, content ) {
    - 69                         if (result==="ok" ) {
    - 70                             me.addAnimation( name, JSON.parse(content) );
    - 71                         }
    - 72                     },
    - 73                     url,
    - 74                     false,
    - 75                     "GET"
    - 76             );
    - 77 
    - 78             return this;
    - 79         },
    - 80 
    - 81         addAnimation : function(name, animation) {
    - 82 
    - 83             // bones animation
    - 84             for( var bonename in animation.bones ) {
    - 85 
    - 86                 var boneanimation= animation.bones[bonename];
    - 87 
    - 88                 if ( boneanimation.rotate ) {
    - 89 
    - 90                     for( var i=0; i<boneanimation.rotate.length-1; i++ ) {
    - 91                         this.addRotationKeyframe(
    - 92                             name,
    - 93                             {
    - 94                                 boneId : bonename,
    - 95                                 angleStart : boneanimation.rotate[i].angle,
    - 96                                 angleEnd : boneanimation.rotate[i+1].angle,
    - 97                                 timeStart : boneanimation.rotate[i].time*1000,
    - 98                                 timeEnd : boneanimation.rotate[i+1].time*1000,
    - 99                                 curve : boneanimation.rotate[i].curve
    -100                             } );
    -101                     }
    -102                 }
    -103 
    -104                 if (boneanimation.translate) {
    -105 
    -106                     for( var i=0; i<boneanimation.translate.length-1; i++ ) {
    -107 
    -108                         this.addTranslationKeyframe(
    -109                             name,
    -110                             {
    -111                                 boneId      : bonename,
    -112                                 startX      : boneanimation.translate[i].x,
    -113                                 startY      : -boneanimation.translate[i].y,
    -114                                 endX        : boneanimation.translate[i+1].x,
    -115                                 endY        : -boneanimation.translate[i+1].y,
    -116                                 timeStart   : boneanimation.translate[i].time * 1000,
    -117                                 timeEnd     : boneanimation.translate[i+1].time * 1000,
    -118                                 curve       : "stepped" //boneanimation.translate[i].curve
    -119 
    -120                             });
    -121                     }
    -122                 }
    -123 
    -124                 if ( boneanimation.scale ) {
    -125                     for( var i=0; i<boneanimation.scale.length-1; i++ ) {
    -126                         this.addScaleKeyframe(
    -127                             name,
    -128                             {
    -129                                 boneId : bonename,
    -130                                 startScaleX : boneanimation.rotate[i].x,
    -131                                 endScaleX : boneanimation.rotate[i+1].x,
    -132                                 startScaleY : boneanimation.rotate[i].y,
    -133                                 endScaleY : boneanimation.rotate[i+1].y,
    -134                                 timeStart : boneanimation.rotate[i].time*1000,
    -135                                 timeEnd : boneanimation.rotate[i+1].time*1000,
    -136                                 curve : boneanimation.rotate[i].curve
    -137                             } );
    -138                     }
    -139                 }
    -140 
    -141                 this.endKeyframes( name, bonename );
    -142 
    -143             }
    -144 
    -145             if ( null===this.currentAnimationName ) {
    -146                 this.animations[name]= animation;
    -147                 this.setAnimation(name);
    -148             }
    -149 
    -150             return this;
    -151         },
    -152 
    -153         setAnimation : function(name) {
    -154             this.root.setAnimation( name );
    -155             this.currentAnimationName= name;
    -156         },
    -157 
    -158         getCurrentAnimationData : function() {
    -159             return this.animations[ this.currentAnimationName ];
    -160         },
    -161 
    -162         getAnimationDataByName : function(name) {
    -163             return this.animations[name];
    -164         },
    -165 
    -166         getNumBones : function() {
    -167             return this.bonesArray.length;
    -168         },
    -169 
    -170         getRoot : function() {
    -171             return this.root;
    -172         },
    -173 
    -174         calculate : function(time, animationTime) {
    -175             this.root.apply(time, animationTime);
    -176         },
    -177 
    -178         getBoneById : function(id) {
    -179             return this.bones[id];
    -180         },
    -181 
    -182         getBoneByIndex : function(index) {
    -183             return this.bonesArray[ index ];
    -184         },
    -185 
    -186         addBone : function( boneInfo ) {
    -187             var bone= new CAAT.Module.Skeleton.Bone(boneInfo.name);
    -188 
    -189             bone.setPosition(
    -190                 typeof boneInfo.x!=="undefined" ? boneInfo.x : 0,
    -191                 typeof boneInfo.y!=="undefined" ? boneInfo.y : 0 );
    -192             bone.setRotateTransform( boneInfo.rotation ? boneInfo.rotation : 0 );
    -193             bone.setSize( boneInfo.length ? boneInfo.length : 0, 0 );
    -194 
    -195             this.bones[boneInfo.name]= bone;
    -196 
    -197             if (boneInfo.parent) {
    -198 
    -199                 var parent= this.bones[boneInfo.parent];
    -200                 if ( parent ) {
    -201                     parent.addBone(bone);
    -202                 } else {
    -203                     console.log("Referenced parent Bone '"+boneInfo.parent+"' which does not exist");
    -204                 }
    -205             }
    -206 
    -207             this.bonesArray.push(bone);
    -208 
    -209             // BUGBUG should be an explicit root bone identification.
    -210             if (!this.root) {
    -211                 this.root= bone;
    -212             }
    -213         },
    -214 
    -215         addRotationKeyframe : function( name, keyframeInfo ) {
    -216             var bone= this.bones[ keyframeInfo.boneId ];
    -217             if ( bone ) {
    -218                 bone.addRotationKeyframe(
    -219                     name,
    -220                     keyframeInfo.angleStart,
    -221                     keyframeInfo.angleEnd,
    -222                     keyframeInfo.timeStart,
    -223                     keyframeInfo.timeEnd,
    -224                     keyframeInfo.curve
    -225                 )
    -226             } else {
    -227                 console.log("Rotation Keyframe for non-existant bone: '"+keyframeInfo.boneId+"'" );
    -228             }
    -229         },
    -230 
    -231         addScaleKeyframe : function( name, keyframeInfo ) {
    -232             var bone= this.bones[ keyframeInfo.boneId ];
    -233             if ( bone ) {
    -234                 bone.addRotationKeyframe(
    -235                     name,
    -236                     keyframeInfo.startScaleX,
    -237                     keyframeInfo.endScaleX,
    -238                     keyframeInfo.startScaleY,
    -239                     keyframeInfo.endScaleY,
    -240                     keyframeInfo.timeStart,
    -241                     keyframeInfo.timeEnd,
    -242                     keyframeInfo.curve
    -243                 )
    -244             } else {
    -245                 console.log("Scale Keyframe for non-existant bone: '"+keyframeInfo.boneId+"'" );
    -246             }
    -247         },
    -248 
    -249         addTranslationKeyframe : function( name, keyframeInfo ) {
    -250 
    -251             var bone= this.bones[ keyframeInfo.boneId ];
    -252             if ( bone ) {
    -253 
    -254                 bone.addTranslationKeyframe(
    -255                     name,
    -256                     keyframeInfo.startX,
    -257                     keyframeInfo.startY,
    -258                     keyframeInfo.endX,
    -259                     keyframeInfo.endY,
    -260                     keyframeInfo.timeStart,
    -261                     keyframeInfo.timeEnd,
    -262                     keyframeInfo.curve
    -263                 )
    -264             } else {
    -265                 console.log("Translation Keyframe for non-existant bone: '"+keyframeInfo.boneId+"'" );
    -266             }
    -267         },
    -268 
    -269         endKeyframes : function( name, boneId ) {
    -270             var bone= this.bones[boneId];
    -271             if (bone) {
    -272                 bone.endTranslationKeyframes(name);
    -273                 bone.endRotationKeyframes(name);
    -274                 bone.endScaleKeyframes(name);
    -275             }
    -276         },
    -277 
    -278         paint : function( actorMatrix, ctx ) {
    -279             this.root.paint(actorMatrix,ctx);
    -280         }
    -281 
    -282     }
    -283 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_SkeletonActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_SkeletonActor.js.html deleted file mode 100644 index 947f7677..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_SkeletonActor.js.html +++ /dev/null @@ -1,389 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name SkeletonActor
    -  5      * @memberof CAAT.Module.Skeleton.prototype
    -  6      * @constructor
    -  7      */
    -  8 
    -  9     defines: "CAAT.Module.Skeleton.SkeletonActor",
    - 10     extendsClass: "CAAT.Foundation.Actor",
    - 11     depends: [
    - 12         "CAAT.Module.Skeleton.Skeleton",
    - 13         "CAAT.Module.Skeleton.BoneActor",
    - 14         "CAAT.Foundation.Actor"
    - 15     ],
    - 16     extendsWith: function () {
    - 17 
    - 18 
    - 19 
    - 20         /**
    - 21          * Holder to keep animation slots information.
    - 22          */
    - 23         function SlotInfoData( sortId, attachment, name, bone ) {
    - 24 
    - 25             this.sortId= sortId;
    - 26             this.attachment= attachment;
    - 27             this.name= name;
    - 28             this.bone= bone;
    - 29 
    - 30             return this;
    - 31         }
    - 32 
    - 33         return {
    - 34 
    - 35             /**
    - 36              * @lends CAAT.Module.Skeleton.SkeletonActor
    - 37              */
    - 38 
    - 39             skeleton: null,
    - 40 
    - 41             /**
    - 42              * @type object
    - 43              * @map < boneId{string}, SlotInfoData >
    - 44              */
    - 45             slotInfo: null,
    - 46 
    - 47             /**
    - 48              * @type Array.<SlotInfoData>
    - 49              */
    - 50             slotInfoArray: null,
    - 51 
    - 52             /**
    - 53              * @type object
    - 54              * @map
    - 55              */
    - 56             skinByName: null,
    - 57 
    - 58             /**
    - 59              * @type CAAT.Foundation.Director
    - 60              */
    - 61             director: null,
    - 62 
    - 63             /**
    - 64              * @type boolean
    - 65              */
    - 66             _showBones: false,
    - 67 
    - 68             /**
    - 69              * Currently selected animation play time.
    - 70              * Zero to make it last for its default value.
    - 71              * @type number
    - 72              */
    - 73             animationDuration : 0,
    - 74 
    - 75             showAABB : false,
    - 76             bonesActor : null,
    - 77 
    - 78             __init: function (director, skeleton) {
    - 79                 this.__super();
    - 80 
    - 81                 this.director = director;
    - 82                 this.skeleton = skeleton;
    - 83                 this.slotInfo = {};
    - 84                 this.slotInfoArray = [];
    - 85                 this.bonesActor= [];
    - 86                 this.skinByName = {};
    - 87 
    - 88                 this.setSkin();
    - 89                 this.setAnimation("default");
    - 90 
    - 91                 return this;
    - 92             },
    - 93 
    - 94             showBones: function (show) {
    - 95                 this._showBones = show;
    - 96                 return this;
    - 97             },
    - 98 
    - 99             /**
    -100              * build an sprite-sheet composed of numSprites elements and organized in rows x columns
    -101              * @param numSprites {number}
    -102              * @param rows {number=}
    -103              * @param columns {number=}
    -104              */
    -105             buildSheet : function( numSprites, rows, columns ) {
    -106 
    -107                 var i, j,l;
    -108                 var AABBs= [];
    -109                 var maxTime= 1000;  // BUGBUG search for animation time.
    -110                 var ssItemWidth, ssItemHeight;  // sprite sheet item width and height
    -111                 var ssItemMinX= Number.MAX_VALUE, ssItemMinY= Number.MAX_VALUE;
    -112                 var ssItemMaxOffsetY, ssItemMaxOffsetX;
    -113 
    -114                 // prepare this actor's world model view matrix, but with no position.
    -115                 var px= this.x;
    -116                 var py= this.y;
    -117                 this.x= this.y= 0;
    -118                 this.setModelViewMatrix();
    -119 
    -120 
    -121                 rows= rows || 1;
    -122                 columns= columns || 1;
    -123 
    -124                 // calculate all sprite sheet frames aabb.
    -125                 for( j=0; j<numSprites; j++ ) {
    -126                     var aabb= new CAAT.Math.Rectangle();
    -127                     var time= maxTime/numSprites*j;
    -128                     AABBs.push( aabb );
    -129                     this.skeleton.calculate( time, this.animationDuration );
    -130 
    -131                     for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    -132                         var bone= this.bonesActor[i];
    -133                         var boneAABB;
    -134                         bone.setupAnimation(time);
    -135                         boneAABB= bone.AABB;
    -136                         aabb.unionRectangle(boneAABB);
    -137                         if ( boneAABB.x < ssItemMinX ) {
    -138                             ssItemMinX= boneAABB.x;
    -139                         }
    -140                     }
    -141                 }
    -142 
    -143                 // calculate offsets for each aabb and sprite-sheet element size.
    -144                 ssItemWidth= 0;
    -145                 ssItemHeight= 0;
    -146                 ssItemMinX= Number.MAX_VALUE;
    -147                 ssItemMinY= Number.MAX_VALUE;
    -148                 for( i=0; i<AABBs.length; i++ ) {
    -149                     if ( AABBs[i].x < ssItemMinX ) {
    -150                         ssItemMinX= AABBs[i].x;
    -151                     }
    -152                     if ( AABBs[i].y < ssItemMinY ) {
    -153                         ssItemMinY= AABBs[i].y;
    -154                     }
    -155                     if ( AABBs[i].width>ssItemWidth ) {
    -156                         ssItemWidth= AABBs[i].width;
    -157                     }
    -158                     if ( AABBs[i].height>ssItemHeight ) {
    -159                         ssItemHeight= AABBs[i].height;
    -160                     }
    -161                 }
    -162                 ssItemWidth= (ssItemWidth|0)+1;
    -163                 ssItemHeight= (ssItemHeight|0)+1;
    -164 
    -165                 // calculate every animation offset against biggest animation size.
    -166                 ssItemMaxOffsetY= -Number.MAX_VALUE;
    -167                 ssItemMaxOffsetX= -Number.MAX_VALUE;
    -168                 var offsetMinX=Number.MAX_VALUE, offsetMaxX=-Number.MAX_VALUE;
    -169                 for( i=0; i<AABBs.length; i++ ) {
    -170                     var offsetX= (ssItemWidth - AABBs[i].width)/2;
    -171                     var offsetY= (ssItemHeight - AABBs[i].height)/2;
    -172 
    -173                     if ( offsetY>ssItemMaxOffsetY ) {
    -174                         ssItemMaxOffsetY= offsetY;
    -175                     }
    -176 
    -177                     if ( offsetX>ssItemMaxOffsetX ) {
    -178                         ssItemMaxOffsetX= offsetX;
    -179                     }
    -180                 }
    -181 
    -182 
    -183                 // create a canvas of the neccessary size
    -184                 var canvas= document.createElement("canvas");
    -185                 canvas.width= ssItemWidth * numSprites;
    -186                 canvas.height= ssItemHeight;
    -187                 var ctx= canvas.getContext("2d");
    -188 
    -189                 // draw animation into canvas.
    -190                 for( j=0; j<numSprites; j++ ) {
    -191 
    -192                     //this.x= j*ssItemWidth + offsetMaxX - ssItemMaxOffsetX ;
    -193                     this.x= j*ssItemWidth - ssItemMinX;
    -194                     this.y= ssItemHeight - ssItemMaxOffsetY/2 - 1;
    -195 
    -196                     this.setModelViewMatrix();
    -197 
    -198                     var time= maxTime/numSprites*j;
    -199                     this.skeleton.calculate( time, this.animationDuration );
    -200 
    -201                     // prepare bones
    -202                     for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    -203                         this.bonesActor[i].setupAnimation(time);
    -204                         this.bonesActor[i].paint( ctx, time );
    -205                     }
    -206 
    -207                     ctx.restore();
    -208                 }
    -209 
    -210                 this.x= px;
    -211                 this.y= py;
    -212 
    -213                 return canvas;
    -214             },
    -215 
    -216             animate: function (director, time) {
    -217                 var i,l;
    -218 
    -219                 var ret= CAAT.Module.Skeleton.SkeletonActor.superclass.animate.call( this, director, time );
    -220 
    -221                 this.skeleton.calculate( time, this.animationDuration );
    -222 
    -223                 for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    -224                     this.bonesActor[i].setupAnimation(time);
    -225                 }
    -226 
    -227                 this.AABB.setEmpty();
    -228                 for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    -229                     this.AABB.unionRectangle(this.bonesActor[i].AABB);
    -230                 }
    -231 
    -232                 return ret;
    -233             },
    -234 
    -235             paint : function( director, time ) {
    -236                 CAAT.Module.Skeleton.SkeletonActor.superclass.paint.call(this,director,time);
    -237                 for( var i= 0, l=this.bonesActor.length; i<l; i+=1 ) {
    -238                     this.bonesActor[i].paint( director.ctx, time );
    -239                 }
    -240 
    -241 
    -242                 if (this._showBones && this.skeleton) {
    -243                     this.worldModelViewMatrix.transformRenderingContextSet(director.ctx);
    -244                     this.skeleton.paint(this.worldModelViewMatrix, director.ctx);
    -245                 }
    -246             },
    -247 
    -248             __addBoneActor : function( boneActor ) {
    -249                 this.bonesActor.push( boneActor );
    -250                 boneActor.parent= this;
    -251                 return this;
    -252             },
    -253 
    -254             setSkin: function (skin) {
    -255 
    -256                 this.bonesActor= [];
    -257                 this.slotInfoArray = [];
    -258                 this.slotInfo = {};
    -259 
    -260                 var skeletonData = this.skeleton.getSkeletonDataFromFile();
    -261 
    -262                 // slots info
    -263                 for (var slot = 0; slot < skeletonData.slots.length; slot++) {
    -264                     var slotInfo = skeletonData.slots[slot];
    -265                     var bone = this.skeleton.getBoneById(slotInfo.bone);
    -266                     if (bone) {
    -267                         var slotInfoData = new SlotInfoData(
    -268                                 slot,
    -269                                 slotInfo.attachment,
    -270                                 slotInfo.name,
    -271                                 slotInfo.bone );
    -272 
    -273                         this.slotInfo[ bone.id ] = slotInfoData;
    -274                         this.slotInfoArray.push(slotInfoData);
    -275 
    -276 
    -277                         var skinData = null;
    -278                         if (skin) {
    -279                             skinData = skeletonData.skins[skin][slotInfo.name];
    -280                         }
    -281                         if (!skinData) {
    -282                             skinData = skeletonData.skins["default"][slotInfo.name];
    -283                         }
    -284                         if (skinData) {
    -285 
    -286                             //create an actor for each slot data found.
    -287                             var boneActorSkin = new CAAT.Module.Skeleton.BoneActor();
    -288                             boneActorSkin.id = slotInfo.name;
    -289                             boneActorSkin.setBone(bone);
    -290 
    -291                             this.__addBoneActor(boneActorSkin);
    -292                             this.skinByName[slotInfo.name] = boneActorSkin;
    -293 
    -294                             // add skining info for each slot data.
    -295                             for (var skinDef in skinData) {
    -296                                 var skinInfo = skinData[skinDef];
    -297                                 var angle= -(skinInfo.rotation || 0) * 2 * Math.PI / 360;
    -298                                 var x= skinInfo.x|0;
    -299                                 var y= -skinInfo.y|0;
    -300                                 var w= skinInfo.width|0;
    -301                                 var h= skinInfo.height|0;
    -302                                 var scaleX= skinInfo.scaleX|1;
    -303                                 var scaleY= skinInfo.scaleY|1;
    -304 
    -305                                 var matrix= CAAT.Math.Matrix.translate( -skinInfo.width/2, -skinInfo.height/2 );
    -306                                 matrix.premultiply( CAAT.Math.Matrix.rotate( angle ) );
    -307                                 matrix.premultiply( CAAT.Math.Matrix.scale( scaleX, scaleY ) );
    -308                                 matrix.premultiply( CAAT.Math.Matrix.translate( x, y ) );
    -309 
    -310                                 /*
    -311                                 only needed values are:
    -312                                   + image
    -313                                   + matrix
    -314                                   + name
    -315 
    -316                                   all the rest are just to keep original values.
    -317                                  */
    -318                                 boneActorSkin.addSkinInfo({
    -319                                     angle: angle,
    -320                                     x: x,
    -321                                     y: y,
    -322                                     width: w,
    -323                                     height: h,
    -324                                     image: this.director.getImage(skinData[skinDef].name ? skinData[skinDef].name : skinDef),
    -325                                     matrix : matrix,
    -326                                     scaleX : scaleX,
    -327                                     scaleY : scaleY,
    -328                                     name: skinDef
    -329                                 });
    -330                             }
    -331 
    -332                             boneActorSkin.setDefaultSkinInfoByName(slotInfo.attachment);
    -333                         }
    -334                     } else {
    -335                         console.log("Unknown bone to apply skin: " + slotInfo.bone);
    -336                     }
    -337                 }
    -338 
    -339                 return this;
    -340             },
    -341 
    -342             setAnimation: function (name, animationDuration ) {
    -343 
    -344                 this.animationDuration= animationDuration||0;
    -345 
    -346                 var animationInfo = this.skeleton.getAnimationDataByName(name);
    -347                 if (!animationInfo) {
    -348                     return;
    -349                 }
    -350 
    -351                 var animationSlots = animationInfo.slots;
    -352                 for (var animationSlot in animationSlots) {
    -353                     var attachments = animationSlots[animationSlot].attachment;
    -354                     var boneActor = this.skinByName[ animationSlot ];
    -355                     if (boneActor) {
    -356                         boneActor.emptySkinDataKeyframe();
    -357                         for (var i = 0, l = attachments.length - 1; i < l; i += 1) {
    -358                             var start = attachments[i].time;
    -359                             var len = attachments[i + 1].time - attachments[i].time;
    -360                             boneActor.addSkinDataKeyframe(attachments[i].name, start, len);
    -361                         }
    -362                     } else {
    -363                         console.log("Adding skinDataKeyframe to unkown boneActor: " + animationSlot);
    -364                     }
    -365                 }
    -366 
    -367                 return this;
    -368             },
    -369 
    -370             getBoneActorById : function( id ) {
    -371                 return this.skinByName[id];
    -372             },
    -373 
    -374             addAttachment : function( slotId, normalized_x, normalized_y, callback ) {
    -375                 var slotBoneActor= this.getBoneActorById(slotId);
    -376                 if ( slotBoneActor ) {
    -377                     slotBoneActor.addAttachment(slotId,normalized_x,normalized_y,callback);
    -378                 }
    -379             }
    -380         }
    -381     }
    -382 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Storage_LocalStorage.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Storage_LocalStorage.js.html deleted file mode 100644 index 26c2f31f..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Storage_LocalStorage.js.html +++ /dev/null @@ -1,87 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  **/
    -  5 CAAT.Module({
    -  6 
    -  7     /**
    -  8      * @name Storage
    -  9      * @memberOf CAAT.Module
    - 10      * @namespace
    - 11      */
    - 12 
    - 13     /**
    - 14      * @name LocalStorage
    - 15      * @memberOf CAAT.Module.Storage
    - 16      * @namespace
    - 17      */
    - 18 
    - 19     defines : "CAAT.Module.Storage.LocalStorage",
    - 20     constants : {
    - 21 
    - 22         /**
    - 23          * @lends CAAT.Module.Storage.LocalStorage
    - 24          */
    - 25 
    - 26         /**
    - 27          * Stores an object in local storage. The data will be saved as JSON.stringify.
    - 28          * @param key {string} key to store data under.
    - 29          * @param data {object} an object.
    - 30          * @return this
    - 31          *
    - 32          * @static
    - 33          */
    - 34         save : function( key, data ) {
    - 35             try {
    - 36                 localStorage.setItem( key, JSON.stringify(data) );
    - 37             } catch(e) {
    - 38                 // eat it
    - 39             }
    - 40             return this;
    - 41         },
    - 42         /**
    - 43          * Retrieve a value from local storage.
    - 44          * @param key {string} the key to retrieve.
    - 45          * @return {object} object stored under the key parameter.
    - 46          *
    - 47          * @static
    - 48          */
    - 49         load : function( key, defValue ) {
    - 50             try {
    - 51                 var v= localStorage.getItem( key );
    - 52 
    - 53                 return null===v ? defValue : JSON.parse(v);
    - 54             } catch(e) {
    - 55                 return null;
    - 56             }
    - 57         },
    - 58 
    - 59         /**
    - 60          * Removes a value stored in local storage.
    - 61          * @param key {string}
    - 62          * @return this
    - 63          *
    - 64          * @static
    - 65          */
    - 66         remove : function( key ) {
    - 67             try {
    - 68                 localStorage.removeItem(key);
    - 69             } catch(e) {
    - 70                 // eat it
    - 71             }
    - 72             return this;
    - 73         }
    - 74     },
    - 75     extendsWith : {
    - 76 
    - 77     }
    - 78 
    - 79 });
    - 80 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureElement.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureElement.js.html deleted file mode 100644 index 3b34d0b2..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureElement.js.html +++ /dev/null @@ -1,56 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name TexturePacker
    -  5      * @memberOf CAAT.Module
    -  6      * @namespace
    -  7      */
    -  8 
    -  9     /**
    - 10      * @name TextureElement
    - 11      * @memberOf CAAT.Module.TexturePacker
    - 12      * @constructor
    - 13      */
    - 14 
    - 15 
    - 16     defines : "CAAT.Module.TexturePacker.TextureElement",
    - 17     extendsWith : {
    - 18 
    - 19         /**
    - 20          * @lends CAAT.Module.TexturePacker.TextureElement.prototype
    - 21          */
    - 22 
    - 23         /**
    - 24          *
    - 25          */
    - 26         inverted:   false,
    - 27 
    - 28         /**
    - 29          *
    - 30          */
    - 31         image:      null,
    - 32 
    - 33         /**
    - 34          *
    - 35          */
    - 36         u:          0,
    - 37 
    - 38         /**
    - 39          *
    - 40          */
    - 41         v:          0,
    - 42 
    - 43         /**
    - 44          *
    - 45          */
    - 46         glTexture:  null
    - 47     }
    - 48 });
    - 49 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePage.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePage.js.html deleted file mode 100644 index 6b9f482b..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePage.js.html +++ /dev/null @@ -1,303 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name TexturePage
    -  5      * @memberOf CAAT.Module.TexturePacker
    -  6      * @constructor
    -  7      */
    -  8 
    -  9 
    - 10     defines : "CAAT.Module.TexturePacker.TexturePage",
    - 11     depends : [
    - 12         "CAAT.Module.TexturePacker.TextureScanMap"
    - 13     ],
    - 14     extendsWith : {
    - 15 
    - 16         /**
    - 17          * @lends CAAT.Module.TexturePacker.TexturePage.prototype
    - 18          */
    - 19 
    - 20         __init : function(w,h) {
    - 21             this.width=         w || 1024;
    - 22             this.height=        h || 1024;
    - 23             this.images=        [];
    - 24 
    - 25             return this;
    - 26         },
    - 27 
    - 28         /**
    - 29          *
    - 30          */
    - 31         width:                  1024,
    - 32 
    - 33         /**
    - 34          *
    - 35          */
    - 36         height:                 1024,
    - 37 
    - 38         /**
    - 39          *
    - 40          */
    - 41         gl:                     null,
    - 42 
    - 43         /**
    - 44          *
    - 45          */
    - 46         texture:                null,
    - 47 
    - 48         /**
    - 49          *
    - 50          */
    - 51         allowImagesInvertion:   false,
    - 52 
    - 53         /**
    - 54          *
    - 55          */
    - 56         padding:                4,
    - 57 
    - 58         /**
    - 59          *
    - 60          */
    - 61         scan:                   null,
    - 62 
    - 63         /**
    - 64          *
    - 65          */
    - 66         images:                 null,
    - 67 
    - 68         /**
    - 69          *
    - 70          */
    - 71         criteria:               'area',
    - 72 
    - 73         initialize : function(gl) {
    - 74             this.gl= gl;
    - 75 
    - 76             // Fix firefox.
    - 77             gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
    - 78 
    - 79             this.texture = gl.createTexture();
    - 80 
    - 81             gl.bindTexture(gl.TEXTURE_2D, this.texture);
    - 82             gl.enable( gl.BLEND );
    - 83             gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
    - 84 
    - 85             var uarr= new Uint8Array(this.width*this.height*4);
    - 86             for (var jj = 0; jj < 4*this.width*this.height; ) {
    - 87                 uarr[jj++]=0;
    - 88                 uarr[jj++]=0;
    - 89                 uarr[jj++]=0;
    - 90                 uarr[jj++]=0;
    - 91             }
    - 92             gl.texImage2D(
    - 93                     gl.TEXTURE_2D,
    - 94                     0,
    - 95                     gl.RGBA,
    - 96                     this.width,
    - 97                     this.height,
    - 98                     0,
    - 99                     gl.RGBA,
    -100                     gl.UNSIGNED_BYTE,
    -101                     uarr);
    -102 
    -103             gl.enable( gl.BLEND );
    -104 
    -105             for( var i=0; i<this.images.length; i++ ) {
    -106 
    -107                 var img= this.images[i];
    -108                 if ( img.inverted ) {
    -109                     img= CAAT.Module.Image.ImageUtil.rotate( img, -90 );
    -110                 }
    -111 
    -112                 gl.texSubImage2D(
    -113                         gl.TEXTURE_2D,
    -114                         0,
    -115                         this.images[i].__tx, this.images[i].__ty,
    -116                         gl.RGBA,
    -117                         gl.UNSIGNED_BYTE,
    -118                         img );
    -119             }
    -120 
    -121         },
    -122         create: function(imagesCache) {
    -123 
    -124             var images= [];
    -125             for( var i=0; i<imagesCache.length; i++ ) {
    -126                 var img= imagesCache[i].image;
    -127                 if ( !img.__texturePage ) {
    -128                     images.push( img );
    -129                 }
    -130             }
    -131 
    -132             this.createFromImages(images);
    -133         },
    -134         clear : function() {
    -135             this.createFromImages([]);
    -136         },
    -137         update : function(invert,padding,width,height) {
    -138             this.allowImagesInvertion= invert;
    -139             this.padding= padding;
    -140 
    -141             if ( width<100 ) {
    -142                 width= 100;
    -143             }
    -144             if ( height<100 ) {
    -145                 height= 100;
    -146             }
    -147 
    -148             this.width=  width;
    -149             this.height= height;
    -150             
    -151             this.createFromImages(this.images);
    -152         },
    -153         createFromImages : function( images ) {
    -154 
    -155             var i;
    -156 
    -157             this.scan=   new CAAT.Module.TexturePacker.TextureScanMap( this.width, this.height );
    -158             this.images= [];
    -159 
    -160             if ( this.allowImagesInvertion ) {
    -161                 for( i=0; i<images.length; i++ ) {
    -162                     images[i].inverted= this.allowImagesInvertion && images[i].height<images[i].width;
    -163                 }
    -164             }
    -165 
    -166             var me= this;
    -167 
    -168             images.sort( function(a,b) {
    -169 
    -170                 var aarea= a.width*a.height;
    -171                 var barea= b.width*b.height;
    -172 
    -173                 if ( me.criteria==='width' ) {
    -174                     return a.width<b.width ? 1 : a.width>b.width ? -1 : 0;
    -175                 } else if ( me.criteria==='height' ) {
    -176                     return a.height<b.height ? 1 : a.height>b.height ? -1 : 0;
    -177                 }
    -178                 return aarea<barea ? 1 : aarea>barea ? -1 : 0;
    -179             });
    -180 
    -181             for( i=0; i<images.length; i++ ) {
    -182                 var img=  images[i];
    -183                 this.packImage(img);
    -184             }
    -185         },
    -186         addImage : function( image, invert, padding ) {
    -187             this.allowImagesInvertion= invert;
    -188             this.padding= padding;
    -189             this.images.push(image);
    -190             this.createFromImages(Array.prototype.slice.call(this.images));
    -191         },
    -192         endCreation : function() {
    -193             var gl= this.gl;
    -194             gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    -195             gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
    -196             gl.generateMipmap(gl.TEXTURE_2D);
    -197         },
    -198         deletePage : function() {
    -199             for( var i=0; i<this.images.length; i++ ) {
    -200                 delete this.images[i].__texturePage;
    -201                 delete this.images[i].__u;
    -202                 delete this.images[i].__v;
    -203             }
    -204 
    -205             this.gl.deleteTexture( this.texture );
    -206         },
    -207         toCanvas : function(canvass, outline) {
    -208 
    -209             canvass= canvass || document.createElement('canvas');
    -210             canvass.width= this.width;
    -211             canvass.height= this.height;
    -212             var ctxx= canvass.getContext('2d');
    -213             ctxx.fillStyle= 'rgba(0,0,0,0)';
    -214             ctxx.fillRect(0,0,this.width,this.height);
    -215 
    -216             for( var i=0; i<this.images.length; i++ ) {
    -217                 ctxx.drawImage(
    -218                         !this.images[i].inverted ?
    -219                                 this.images[i] :
    -220                                 CAAT.Modules.Image.ImageUtil.rotate( this.images[i], 90 ),
    -221                         this.images[i].__tx,
    -222                         this.images[i].__ty );
    -223                 if ( outline ) {
    -224                     ctxx.strokeStyle= 'red';
    -225                     ctxx.strokeRect(
    -226                             this.images[i].__tx,
    -227                             this.images[i].__ty,
    -228                             this.images[i].__w,
    -229                             this.images[i].__h );
    -230                 }
    -231             }
    -232 
    -233 
    -234             if (outline) {
    -235                 ctxx.strokeStyle= 'red';
    -236                 ctxx.strokeRect(0,0,this.width,this.height);
    -237             }
    -238 
    -239             return canvass;
    -240         },
    -241         packImage : function(img) {
    -242             var newWidth, newHeight;
    -243             if ( img.inverted ) {
    -244                 newWidth= img.height;
    -245                 newHeight= img.width;
    -246             } else {
    -247                 newWidth= img.width;
    -248                 newHeight= img.height;
    -249             }
    -250 
    -251             var w= newWidth;
    -252             var h= newHeight;
    -253 
    -254             var mod;
    -255 
    -256             // dejamos un poco de espacio para que las texturas no se pisen.
    -257             // coordenadas normalizadas 0..1 dan problemas cuando las texturas no estan
    -258             // alineadas a posicion mod 4,8...
    -259             if ( w && this.padding ) {
    -260                 mod= this.padding;
    -261                 if ( w+mod<=this.width ) {
    -262                     w+=mod;
    -263                 }
    -264             }
    -265             if ( h && this.padding ) {
    -266                 mod= this.padding;
    -267                 if ( h+mod<=this.height ) {
    -268                     h+=mod;
    -269                 }
    -270             }
    -271             
    -272             var where=  this.scan.whereFitsChunk( w, h );
    -273             if ( null!==where ) {
    -274                 this.images.push( img );
    -275 
    -276                 img.__tx= where.x;
    -277                 img.__ty= where.y;
    -278                 img.__u=  where.x / this.width;
    -279                 img.__v=  where.y / this.height;
    -280                 img.__u1= (where.x+newWidth) / this.width;
    -281                 img.__v1= (where.y+newHeight) / this.height;
    -282                 img.__texturePage= this;
    -283                 img.__w= newWidth;
    -284                 img.__h= newHeight;
    -285 
    -286                 this.scan.substract(where.x,where.y,w,h);
    -287             } else {
    -288                 CAAT.log('Imagen ',img.src,' de tamano ',img.width,img.height,' no cabe.');
    -289             }
    -290         },
    -291         changeHeuristic : function(criteria) {
    -292             this.criteria= criteria;
    -293         }
    -294     }
    -295 });
    -296 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePageManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePageManager.js.html deleted file mode 100644 index 8c77c931..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePageManager.js.html +++ /dev/null @@ -1,72 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  */
    -  4 
    -  5 CAAT.Module({
    -  6 
    -  7     /**
    -  8      * @name TexturePageManager
    -  9      * @memberOf CAAT.Module.TexturePacker
    - 10      * @constructor
    - 11      */
    - 12 
    - 13     defines : "CAAT.Module.TexturePacker.TexturePageManager",
    - 14     depends : [
    - 15         "CAAT.Module.TexturePacker.TexturePage"
    - 16     ],
    - 17     extendsWith : {
    - 18 
    - 19         /**
    - 20          * @lends CAAT.Module.TexturePacker.TexturePageManager.prototype
    - 21          */
    - 22 
    - 23         __init : function() {
    - 24             this.pages= [];
    - 25             return this;
    - 26         },
    - 27 
    - 28         /**
    - 29          *
    - 30          */
    - 31         pages:  null,
    - 32 
    - 33         createPages:    function(gl,width,height,imagesCache) {
    - 34 
    - 35             var end= false;
    - 36             while( !end ) {
    - 37                 var page= new CAAT.Module.TexturePacker.TexturePage(width,height);
    - 38                 page.create(imagesCache);
    - 39                 page.initialize(gl);
    - 40                 page.endCreation();
    - 41                 this.pages.push(page);
    - 42 
    - 43                 end= true;
    - 44                 for( var i=0; i<imagesCache.length; i++ ) {
    - 45                     // imagen sin asociacion de textura
    - 46                     if ( !imagesCache[i].image.__texturePage ) {
    - 47                         // cabe en la pagina ?? continua con otras paginas.
    - 48                         if ( imagesCache[i].image.width<=width && imagesCache[i].image.height<=height ) {
    - 49                             end= false;
    - 50                         }
    - 51                         break;
    - 52                     }
    - 53                 }
    - 54             }
    - 55         },
    - 56         deletePages : function() {
    - 57             for( var i=0; i<this.pages.length; i++ ) {
    - 58                 this.pages[i].deletePage();
    - 59             }
    - 60             this.pages= null;
    - 61         }
    - 62     }
    - 63 
    - 64 });
    - 65 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScan.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScan.js.html deleted file mode 100644 index 63271906..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScan.js.html +++ /dev/null @@ -1,116 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name TextureScan
    -  5      * @memberOf CAAT.Module.TexturePacker
    -  6      * @constructor
    -  7      */
    -  8 
    -  9     defines : "CAAT.Module.TexturePacker.TextureScan",
    - 10     depends : [
    - 11         "CAAT.Module.TexturePacker.TextureElement"
    - 12     ],
    - 13     extendsWith : {
    - 14 
    - 15         /**
    - 16          * @lends CAAT.Module.TexturePacker.TextureScan.prototype
    - 17          */
    - 18 
    - 19         __init : function(w) {
    - 20             this.freeChunks=[ {position:0, size:w||1024} ];
    - 21             return this;
    - 22         },
    - 23 
    - 24         /**
    - 25          *
    - 26          */
    - 27         freeChunks: null,
    - 28 
    - 29         /**
    - 30          * return an array of values where a chunk of width size fits in this scan.
    - 31          * @param width
    - 32          */
    - 33         findWhereFits : function( width ) {
    - 34             if ( this.freeChunks.length===0 ) {
    - 35                 return [];
    - 36             }
    - 37 
    - 38             var fitsOnPosition= [];
    - 39             var i;
    - 40 
    - 41             for( i=0; i<this.freeChunks.length; i++ ) {
    - 42                 var pos= 0;
    - 43                 while( pos+width<= this.freeChunks[i].size ) {
    - 44                     fitsOnPosition.push( pos+this.freeChunks[i].position );
    - 45                     pos+= width;
    - 46                 }
    - 47             }
    - 48 
    - 49             return fitsOnPosition;
    - 50         },
    - 51         fits : function( position, size ) {
    - 52             var i=0;
    - 53 
    - 54             for( i=0; i<this.freeChunks.length; i++ ) {
    - 55                 var fc= this.freeChunks[i];
    - 56                 if ( fc.position<=position && position+size<=fc.position+fc.size ) {
    - 57                     return true;
    - 58                 }
    - 59             }
    - 60 
    - 61             return false;
    - 62         },
    - 63         substract : function( position, size ) {
    - 64             var i=0;
    - 65 
    - 66             for( i=0; i<this.freeChunks.length; i++ ) {
    - 67                 var fc= this.freeChunks[i];
    - 68                 if ( fc.position<=position && position+size<=fc.position+fc.size ) {
    - 69                     var lp=0;
    - 70                     var ls=0;
    - 71                     var rp=0;
    - 72                     var rs=0;
    - 73 
    - 74                     lp= fc.position;
    - 75                     ls= position-fc.position;
    - 76 
    - 77                     rp= position+size;
    - 78                     rs= fc.position+fc.size - rp;
    - 79 
    - 80                     this.freeChunks.splice(i,1);
    - 81 
    - 82                     if ( ls>0 ) {
    - 83                         this.freeChunks.splice( i++,0,{position: lp, size:ls} );
    - 84                     }
    - 85                     if ( rs>0 ) {
    - 86                         this.freeChunks.splice( i,0,{position: rp, size:rs} );
    - 87                     }
    - 88 
    - 89                     return true;
    - 90                 }
    - 91             }
    - 92 
    - 93             return false;
    - 94         },
    - 95         log : function(index) {
    - 96             if ( 0===this.freeChunks.length ) {
    - 97                 CAAT.log('index '+index+' empty');
    - 98             } else {
    - 99                 var str='index '+index;
    -100                 for( var i=0; i<this.freeChunks.length; i++ ) {
    -101                     var fc= this.freeChunks[i];
    -102                     str+='['+fc.position+","+fc.size+"]";
    -103                 }
    -104                 CAAT.log(str);
    -105             }
    -106         }
    -107     }
    -108 });
    -109 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScanMap.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScanMap.js.html deleted file mode 100644 index fb1936e1..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScanMap.js.html +++ /dev/null @@ -1,137 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name TextureScanMap
    -  5      * @memberOf CAAT.Module.TexturePacker
    -  6      * @constructor
    -  7      */
    -  8 
    -  9     defines : "CAAT.Module.TexturePacker.TextureScanMap",
    - 10     depends : [
    - 11         "CAAT.Module.TexturePacker.TextureScan"
    - 12     ],
    - 13     extendsWith : {
    - 14 
    - 15         /**
    - 16          * @lends CAAT.Module.TexturePacker.TextureScanMap.prototype
    - 17          */
    - 18 
    - 19         __init : function(w,h) {
    - 20             this.scanMapHeight= h;
    - 21             this.scanMapWidth= w;
    - 22 
    - 23             this.scanMap= [];
    - 24             for( var i=0; i<this.scanMapHeight; i++ ) {
    - 25                 this.scanMap.push( new CAAT.Module.TexturePacker.TextureScan(this.scanMapWidth) );
    - 26             }
    - 27 
    - 28             return this;
    - 29         },
    - 30 
    - 31         /**
    - 32          *
    - 33          */
    - 34         scanMap:        null,
    - 35 
    - 36         /**
    - 37          *
    - 38          */
    - 39         scanMapWidth:   0,
    - 40 
    - 41         /**
    - 42          *
    - 43          */
    - 44         scanMapHeight:  0,
    - 45 
    - 46         /**
    - 47          * Always try to fit a chunk of size width*height pixels from left-top.
    - 48          * @param width
    - 49          * @param height
    - 50          */
    - 51         whereFitsChunk : function( width, height ) {
    - 52 
    - 53             // trivial rejection:
    - 54             if ( width>this.width||height>this.height) {
    - 55                 return null;
    - 56             }
    - 57 
    - 58             // find first fitting point
    - 59             var i,j,initialPosition= 0;
    - 60 
    - 61             while( initialPosition<=this.scanMapHeight-height) {
    - 62 
    - 63                 // para buscar sitio se buscara un sitio hasta el tamano de alto del trozo.
    - 64                 // mas abajo no va a caber.
    - 65 
    - 66                 // fitHorizontalPosition es un array con todas las posiciones de este scan donde
    - 67                 // cabe un chunk de tamano width.
    - 68                 var fitHorizontalPositions= null;
    - 69                 var foundPositionOnScan=    false;
    - 70 
    - 71                 for( ; initialPosition<=this.scanMapHeight-height; initialPosition++ ) {
    - 72                     fitHorizontalPositions= this.scanMap[ initialPosition ].findWhereFits( width );
    - 73 
    - 74                     // si no es nulo el array de resultados, quiere decir que en alguno de los puntos
    - 75                     // nos cabe un trozo de tamano width.
    - 76                     if ( null!==fitHorizontalPositions && fitHorizontalPositions.length>0 ) {
    - 77                         foundPositionOnScan= true;
    - 78                         break;
    - 79                     }
    - 80                 }
    - 81 
    - 82                 if ( foundPositionOnScan ) {
    - 83                     // j es el scan donde cabe un trozo de tamano width.
    - 84                     // comprobamos desde este scan que en todos los scan verticales cabe el trozo.
    - 85                     // se comprueba que cabe en alguno de los tamanos que la rutina de busqueda horizontal
    - 86                     // nos ha devuelto antes.
    - 87 
    - 88                     var minInitialPosition=Number.MAX_VALUE;
    - 89                     for( j=0; j<fitHorizontalPositions.length; j++ ) {
    - 90                         var fits= true;
    - 91                         for( i=initialPosition; i<initialPosition+height; i++ ) {
    - 92                             // hay un trozo que no cabe
    - 93                             if ( !this.scanMap[i].fits( fitHorizontalPositions[j], width ) ) {
    - 94                                 fits= false;
    - 95                                 break;
    - 96                             }
    - 97                         }
    - 98 
    - 99                         // se ha encontrado un trozo donde la imagen entra.
    -100                         // d.p.m. incluirla en posicion, y seguir con otra.
    -101                         if ( fits ) {
    -102                             return { x: fitHorizontalPositions[j], y: initialPosition };
    -103                         } 
    -104                     }
    -105 
    -106                     initialPosition++;
    -107                 } else {
    -108                     // no hay sitio en ningun scan.
    -109                     return null;
    -110                 }
    -111             }
    -112 
    -113             // no se ha podido encontrar un area en la textura para un trozo de tamano width*height
    -114             return null;
    -115         },
    -116         substract : function( x,y, width, height ) {
    -117             for( var i=0; i<height; i++ ) {
    -118                 if ( !this.scanMap[i+y].substract(x,width) ) {
    -119                     CAAT.log('Error: removing chunk ',width,height,' at ',x,y);
    -120                 }
    -121             }
    -122         },
    -123         log : function() {
    -124             for( var i=0; i<this.scanMapHeight; i++ ) {
    -125                 this.scanMap[i].log(i);
    -126             }
    -127         }
    -128     }
    -129 });
    -130 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_ArcPath.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_ArcPath.js.html deleted file mode 100644 index 09594dbd..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_ArcPath.js.html +++ /dev/null @@ -1,323 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name ArcPath
    -  5      * @memberOf CAAT.PathUtil
    -  6      * @extends CAAT.PathUtil.PathSegment
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines:"CAAT.PathUtil.ArcPath",
    - 11     depends:[
    - 12         "CAAT.PathUtil.PathSegment",
    - 13         "CAAT.Math.Point",
    - 14         "CAAT.Math.Rectangle"
    - 15     ],
    - 16     aliases:["CAAT.ArcPath"],
    - 17     extendsClass:"CAAT.PathUtil.PathSegment",
    - 18     extendsWith:function () {
    - 19 
    - 20         return {
    - 21 
    - 22             /**
    - 23              * @lends CAAT.PathUtil.ArcPath.prototype
    - 24              */
    - 25 
    - 26             __init:function () {
    - 27                 this.__super();
    - 28 
    - 29                 this.points = [];
    - 30                 this.points.push(new CAAT.Math.Point());
    - 31                 this.points.push(new CAAT.Math.Point());
    - 32 
    - 33                 this.newPosition = new CAAT.Math.Point();
    - 34 
    - 35                 return this;
    - 36             },
    - 37 
    - 38             /**
    - 39              * A collection of CAAT.Math.Point objects which defines the arc (center, start, end)
    - 40              */
    - 41             points:null,
    - 42 
    - 43             /**
    - 44              * Defined clockwise or counterclockwise ?
    - 45              */
    - 46             cw:true,
    - 47 
    - 48             /**
    - 49              * spare point for calculations
    - 50              */
    - 51             newPosition:null,
    - 52 
    - 53             /**
    - 54              * Arc radius.
    - 55              */
    - 56             radius:0,
    - 57 
    - 58             /**
    - 59              * Arc start angle.
    - 60              */
    - 61             startAngle:0,
    - 62 
    - 63             /**
    - 64              * Arc end angle.
    - 65              */
    - 66             angle:2 * Math.PI,
    - 67 
    - 68             /**
    - 69              * is a relative or absolute arc ?
    - 70              */
    - 71             arcTo:false,
    - 72 
    - 73             setRadius:function (r) {
    - 74                 this.radius = r;
    - 75                 return this;
    - 76             },
    - 77 
    - 78             isArcTo:function () {
    - 79                 return this.arcTo;
    - 80             },
    - 81 
    - 82             setArcTo:function (b) {
    - 83                 this.arcTo = b;
    - 84                 return this;
    - 85             },
    - 86 
    - 87             initialize:function (x, y, r, angle) {
    - 88                 this.setInitialPosition(x, y);
    - 89                 this.setFinalPosition(x + r, y);
    - 90                 this.angle = angle || 2 * Math.PI;
    - 91                 return this;
    - 92             },
    - 93 
    - 94             applyAsPath:function (director) {
    - 95                 var ctx = director.ctx;
    - 96                 if (!this.arcTo) {
    - 97                     ctx.arc(this.points[0].x, this.points[0].y, this.radius, this.startAngle, this.angle + this.startAngle, this.cw);
    - 98                 } else {
    - 99                     ctx.arcTo(this.points[0].x, this.points[0].y, this.points[1].x, this.points[1].y, this.radius);
    -100                 }
    -101                 return this;
    -102             },
    -103             setPoint:function (point, index) {
    -104                 if (index >= 0 && index < this.points.length) {
    -105                     this.points[index] = point;
    -106                 }
    -107             },
    -108             /**
    -109              * An array of {CAAT.Point} composed of two points.
    -110              * @param points {Array<CAAT.Point>}
    -111              */
    -112             setPoints:function (points) {
    -113                 this.points = [];
    -114                 this.points[0] = points[0];
    -115                 this.points[1] = points[1];
    -116                 this.updatePath();
    -117 
    -118                 return this;
    -119             },
    -120             setClockWise:function (cw) {
    -121                 this.cw = cw !== undefined ? cw : true;
    -122                 return this;
    -123             },
    -124             isClockWise:function () {
    -125                 return this.cw;
    -126             },
    -127             /**
    -128              * Set this path segment's starting position.
    -129              * This method should not be called again after setFinalPosition has been called.
    -130              * @param x {number}
    -131              * @param y {number}
    -132              */
    -133             setInitialPosition:function (x, y) {
    -134                 for (var i = 0, l = this.points.length; i < l; i++) {
    -135                     this.points[0].x = x;
    -136                     this.points[0].y = y;
    -137                 }
    -138 
    -139                 return this;
    -140             },
    -141             /**
    -142              * Set a rectangle from points[0] to (finalX, finalY)
    -143              * @param finalX {number}
    -144              * @param finalY {number}
    -145              */
    -146             setFinalPosition:function (finalX, finalY) {
    -147                 this.points[1].x = finalX;
    -148                 this.points[1].y = finalY;
    -149 
    -150                 this.updatePath(this.points[1]);
    -151                 return this;
    -152             },
    -153             /**
    -154              * An arc starts and ends in the same point.
    -155              */
    -156             endCurvePosition:function () {
    -157                 return this.points[0];
    -158             },
    -159             /**
    -160              * @inheritsDoc
    -161              */
    -162             startCurvePosition:function () {
    -163                 return this.points[0];
    -164             },
    -165             /**
    -166              * @inheritsDoc
    -167              */
    -168             getPosition:function (time) {
    -169 
    -170                 if (time > 1 || time < 0) {
    -171                     time %= 1;
    -172                 }
    -173                 if (time < 0) {
    -174                     time = 1 + time;
    -175                 }
    -176 
    -177                 if (-1 === this.length) {
    -178                     this.newPosition.set(this.points[0].x, this.points[0].y);
    -179                 } else {
    -180 
    -181                     var angle = this.angle * time * (this.cw ? 1 : -1) + this.startAngle;
    -182 
    -183                     this.newPosition.set(
    -184                         this.points[0].x + this.radius * Math.cos(angle),
    -185                         this.points[0].y + this.radius * Math.sin(angle)
    -186                     );
    -187                 }
    -188 
    -189                 return this.newPosition;
    -190             },
    -191             /**
    -192              * Returns initial path segment point's x coordinate.
    -193              * @return {number}
    -194              */
    -195             initialPositionX:function () {
    -196                 return this.points[0].x;
    -197             },
    -198             /**
    -199              * Returns final path segment point's x coordinate.
    -200              * @return {number}
    -201              */
    -202             finalPositionX:function () {
    -203                 return this.points[1].x;
    -204             },
    -205             /**
    -206              * Draws this path segment on screen. Optionally it can draw handles for every control point, in
    -207              * this case, start and ending path segment points.
    -208              * @param director {CAAT.Director}
    -209              * @param bDrawHandles {boolean}
    -210              */
    -211             paint:function (director, bDrawHandles) {
    -212 
    -213                 var ctx = director.ctx;
    -214 
    -215                 ctx.save();
    -216 
    -217                 ctx.strokeStyle = this.color;
    -218                 ctx.beginPath();
    -219                 if (!this.arcTo) {
    -220                     ctx.arc(this.points[0].x, this.points[0].y, this.radius, this.startAngle, this.startAngle + this.angle, this.cw);
    -221                 } else {
    -222                     ctx.arcTo(this.points[0].x, this.points[0].y, this.points[1].x, this.points[1].y, this.radius);
    -223                 }
    -224                 ctx.stroke();
    -225 
    -226                 if (bDrawHandles) {
    -227                     ctx.globalAlpha = 0.5;
    -228                     ctx.fillStyle = '#7f7f00';
    -229 
    -230                     for (var i = 0; i < this.points.length; i++) {
    -231                         this.drawHandle(ctx, this.points[i].x, this.points[i].y);
    -232                     }
    -233                 }
    -234 
    -235                 ctx.restore();
    -236             },
    -237             /**
    -238              * Get the number of control points. For this type of path segment, start and
    -239              * ending path segment points. Defaults to 2.
    -240              * @return {number}
    -241              */
    -242             numControlPoints:function () {
    -243                 return this.points.length;
    -244             },
    -245             /**
    -246              * @inheritsDoc
    -247              */
    -248             getControlPoint:function (index) {
    -249                 return this.points[index];
    -250             },
    -251             /**
    -252              * @inheritsDoc
    -253              */
    -254             getContour:function (iSize) {
    -255                 var contour = [];
    -256 
    -257                 for (var i = 0; i < iSize; i++) {
    -258                     contour.push(
    -259                         {
    -260                             x:this.points[0].x + this.radius * Math.cos(i * Math.PI / (iSize / 2)),
    -261                             y:this.points[0].y + this.radius * Math.sin(i * Math.PI / (iSize / 2))
    -262                         }
    -263                     );
    -264                 }
    -265 
    -266                 return contour;
    -267             },
    -268 
    -269             getPositionFromLength:function (iLength) {
    -270                 var ratio = iLength / this.length * (this.cw ? 1 : -1);
    -271                 return this.getPosition(ratio);
    -272                 /*
    -273                  this.newPosition.set(
    -274                  this.points[0].x + this.radius * Math.cos( 2*Math.PI * ratio ),
    -275                  this.points[0].y + this.radius * Math.sin( 2*Math.PI * ratio )
    -276                  );
    -277                  return this.newPosition;*/
    -278             },
    -279 
    -280             updatePath:function (point) {
    -281 
    -282                 // just move the circle, not modify radius.
    -283                 if (this.points[1] === point) {
    -284 
    -285                     if (!this.arcTo) {
    -286                         this.radius = Math.sqrt(
    -287                             ( this.points[0].x - this.points[1].x ) * ( this.points[0].x - this.points[1].x ) +
    -288                                 ( this.points[0].y - this.points[1].y ) * ( this.points[0].y - this.points[1].y )
    -289                         );
    -290                     }
    -291 
    -292                     this.length = this.angle * this.radius;
    -293                     this.startAngle = Math.atan2((this.points[1].y - this.points[0].y), (this.points[1].x - this.points[0].x));
    -294 
    -295                 } else if (this.points[0] === point) {
    -296                     this.points[1].set(
    -297                         this.points[0].x + this.radius * Math.cos(this.startAngle),
    -298                         this.points[0].y + this.radius * Math.sin(this.startAngle)
    -299                     );
    -300                 }
    -301 
    -302                 this.bbox.setEmpty();
    -303                 this.bbox.x = this.points[0].x - this.radius;
    -304                 this.bbox.y = this.points[0].y - this.radius;
    -305                 this.bbox.x1 = this.points[0].x + this.radius;
    -306                 this.bbox.y1 = this.points[0].y + this.radius;
    -307                 this.bbox.width = 2 * this.radius;
    -308                 this.bbox.height = 2 * this.radius;
    -309 
    -310                 return this;
    -311             }
    -312         }
    -313     }
    -314 
    -315 });
    -316 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_CurvePath.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_CurvePath.js.html deleted file mode 100644 index 8a20e013..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_CurvePath.js.html +++ /dev/null @@ -1,213 +0,0 @@ -
      1 /**
    -  2  * CAAT.CurvePath
    -  3  */
    -  4 CAAT.Module({
    -  5 
    -  6     /**
    -  7      * @name CurvePath
    -  8      * @memberOf CAAT.PathUtil
    -  9      * @extends CAAT.PathUtil.PathSegment
    - 10      * @constructor
    - 11      */
    - 12 
    - 13     defines:"CAAT.PathUtil.CurvePath",
    - 14     depends:[
    - 15         "CAAT.PathUtil.PathSegment",
    - 16         "CAAT.Math.Point",
    - 17         "CAAT.Math.Bezier"
    - 18     ],
    - 19     aliases:["CAAT.CurvePath"],
    - 20     extendsClass:"CAAT.PathUtil.PathSegment",
    - 21     extendsWith:function () {
    - 22         return {
    - 23 
    - 24             /**
    - 25              * @lends CAAT.PathUtil.CurvePath.prototype
    - 26              */
    - 27 
    - 28 
    - 29             __init:function () {
    - 30                 this.__super();
    - 31                 this.newPosition = new CAAT.Math.Point(0, 0, 0);
    - 32                 return this;
    - 33             },
    - 34 
    - 35             /**
    - 36              * A CAAT.Math.Curve instance.
    - 37              */
    - 38             curve:null,
    - 39 
    - 40             /**
    - 41              * spare holder for getPosition coordinate return.
    - 42              * @type {CAAT.Math.Point}
    - 43              */
    - 44             newPosition:null,
    - 45 
    - 46             applyAsPath:function (director) {
    - 47                 this.curve.applyAsPath(director);
    - 48                 return this;
    - 49             },
    - 50             setPoint:function (point, index) {
    - 51                 if (this.curve) {
    - 52                     this.curve.setPoint(point, index);
    - 53                 }
    - 54             },
    - 55             /**
    - 56              * Set this curve segment's points.
    - 57              * @param points {Array<CAAT.Point>}
    - 58              */
    - 59             setPoints:function (points) {
    - 60                 var curve = new CAAT.Math.Bezier();
    - 61                 curve.setPoints(points);
    - 62                 this.curve = curve;
    - 63                 return this;
    - 64             },
    - 65             /**
    - 66              * Set the pathSegment as a CAAT.Bezier quadric instance.
    - 67              * Parameters are quadric coordinates control points.
    - 68              *
    - 69              * @param p0x {number}
    - 70              * @param p0y {number}
    - 71              * @param p1x {number}
    - 72              * @param p1y {number}
    - 73              * @param p2x {number}
    - 74              * @param p2y {number}
    - 75              * @return this
    - 76              */
    - 77             setQuadric:function (p0x, p0y, p1x, p1y, p2x, p2y) {
    - 78                 var curve = new CAAT.Math.Bezier();
    - 79                 curve.setQuadric(p0x, p0y, p1x, p1y, p2x, p2y);
    - 80                 this.curve = curve;
    - 81                 this.updatePath();
    - 82 
    - 83                 return this;
    - 84             },
    - 85             /**
    - 86              * Set the pathSegment as a CAAT.Bezier cubic instance.
    - 87              * Parameters are cubic coordinates control points.
    - 88              * @param p0x {number}
    - 89              * @param p0y {number}
    - 90              * @param p1x {number}
    - 91              * @param p1y {number}
    - 92              * @param p2x {number}
    - 93              * @param p2y {number}
    - 94              * @param p3x {number}
    - 95              * @param p3y {number}
    - 96              * @return this
    - 97              */
    - 98             setCubic:function (p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {
    - 99                 var curve = new CAAT.Math.Bezier();
    -100                 curve.setCubic(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y);
    -101                 this.curve = curve;
    -102                 this.updatePath();
    -103 
    -104                 return this;
    -105             },
    -106             /**
    -107              * @inheritDoc
    -108              */
    -109             updatePath:function (point) {
    -110                 this.curve.update();
    -111                 this.length = this.curve.getLength();
    -112                 this.curve.getBoundingBox(this.bbox);
    -113                 return this;
    -114             },
    -115             /**
    -116              * @inheritDoc
    -117              */
    -118             getPosition:function (time) {
    -119 
    -120                 if (time > 1 || time < 0) {
    -121                     time %= 1;
    -122                 }
    -123                 if (time < 0) {
    -124                     time = 1 + time;
    -125                 }
    -126 
    -127                 this.curve.solve(this.newPosition, time);
    -128 
    -129                 return this.newPosition;
    -130             },
    -131             /**
    -132              * Gets the coordinate on the path relative to the path length.
    -133              * @param iLength {number} the length at which the coordinate will be taken from.
    -134              * @return {CAAT.Point} a CAAT.Point instance with the coordinate on the path corresponding to the
    -135              * iLenght parameter relative to segment's length.
    -136              */
    -137             getPositionFromLength:function (iLength) {
    -138                 this.curve.solve(this.newPosition, iLength / this.length);
    -139                 return this.newPosition;
    -140             },
    -141             /**
    -142              * Get path segment's first point's x coordinate.
    -143              * @return {number}
    -144              */
    -145             initialPositionX:function () {
    -146                 return this.curve.coordlist[0].x;
    -147             },
    -148             /**
    -149              * Get path segment's last point's y coordinate.
    -150              * @return {number}
    -151              */
    -152             finalPositionX:function () {
    -153                 return this.curve.coordlist[this.curve.coordlist.length - 1].x;
    -154             },
    -155             /**
    -156              * @inheritDoc
    -157              * @param director {CAAT.Director}
    -158              * @param bDrawHandles {boolean}
    -159              */
    -160             paint:function (director, bDrawHandles) {
    -161                 this.curve.drawHandles = bDrawHandles;
    -162                 director.ctx.strokeStyle = this.color;
    -163                 this.curve.paint(director, bDrawHandles);
    -164             },
    -165             /**
    -166              * @inheritDoc
    -167              */
    -168             numControlPoints:function () {
    -169                 return this.curve.coordlist.length;
    -170             },
    -171             /**
    -172              * @inheritDoc
    -173              * @param index
    -174              */
    -175             getControlPoint:function (index) {
    -176                 return this.curve.coordlist[index];
    -177             },
    -178             /**
    -179              * @inheritDoc
    -180              */
    -181             endCurvePosition:function () {
    -182                 return this.curve.endCurvePosition();
    -183             },
    -184             /**
    -185              * @inheritDoc
    -186              */
    -187             startCurvePosition:function () {
    -188                 return this.curve.startCurvePosition();
    -189             },
    -190             /**
    -191              * @inheritDoc
    -192              * @param iSize
    -193              */
    -194             getContour:function (iSize) {
    -195                 var contour = [];
    -196                 for (var i = 0; i <= iSize; i++) {
    -197                     contour.push({x:i / iSize, y:this.getPosition(i / iSize).y});
    -198                 }
    -199 
    -200                 return contour;
    -201             }
    -202         }
    -203     }
    -204 
    -205 });
    -206 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_LinearPath.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_LinearPath.js.html deleted file mode 100644 index 9ec5ce2a..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_LinearPath.js.html +++ /dev/null @@ -1,218 +0,0 @@ -
      1 /**
    -  2  * CAAT.LinearPath
    -  3  */
    -  4 CAAT.Module({
    -  5 
    -  6 
    -  7     /**
    -  8      * @name LinearPath
    -  9      * @memberOf CAAT.PathUtil
    - 10      * @extends CAAT.PathUtil.PathSegment
    - 11      * @constructor
    - 12      */
    - 13 
    - 14     defines:"CAAT.PathUtil.LinearPath",
    - 15     depends:[
    - 16         "CAAT.PathUtil.PathSegment",
    - 17         "CAAT.Math.Point"
    - 18     ],
    - 19     aliases:["CAAT.LinearPath"],
    - 20     extendsClass:"CAAT.PathUtil.PathSegment",
    - 21     extendsWith:function () {
    - 22 
    - 23         return  {
    - 24 
    - 25             /**
    - 26              * @lends CAAT.PathUtil.LinearPath.prototype
    - 27              */
    - 28 
    - 29             __init:function () {
    - 30                 this.__super();
    - 31 
    - 32                 this.points = [];
    - 33                 this.points.push(new CAAT.Math.Point());
    - 34                 this.points.push(new CAAT.Math.Point());
    - 35 
    - 36                 this.newPosition = new CAAT.Math.Point(0, 0, 0);
    - 37                 return this;
    - 38             },
    - 39 
    - 40             /**
    - 41              * A collection of points.
    - 42              * @type {Array.<CAAT.Math.Point>}
    - 43              */
    - 44             points:null,
    - 45 
    - 46             /**
    - 47              * spare holder for getPosition coordinate return.
    - 48              */
    - 49             newPosition:null,
    - 50 
    - 51             applyAsPath:function (director) {
    - 52                 // Fixed: Thanks https://github.com/roed
    - 53                 director.ctx.lineTo(this.points[1].x, this.points[1].y);
    - 54             },
    - 55             setPoint:function (point, index) {
    - 56                 if (index === 0) {
    - 57                     this.points[0] = point;
    - 58                 } else if (index === 1) {
    - 59                     this.points[1] = point;
    - 60                 }
    - 61             },
    - 62             /**
    - 63              * Update this segments length and bounding box info.
    - 64              */
    - 65             updatePath:function (point) {
    - 66                 var x = this.points[1].x - this.points[0].x;
    - 67                 var y = this.points[1].y - this.points[0].y;
    - 68                 this.length = Math.sqrt(x * x + y * y);
    - 69 
    - 70                 this.bbox.setEmpty();
    - 71                 this.bbox.union(this.points[0].x, this.points[0].y);
    - 72                 this.bbox.union(this.points[1].x, this.points[1].y);
    - 73 
    - 74                 return this;
    - 75             },
    - 76             setPoints:function (points) {
    - 77                 this.points[0] = points[0];
    - 78                 this.points[1] = points[1];
    - 79                 this.updatePath();
    - 80                 return this;
    - 81             },
    - 82             /**
    - 83              * Set this path segment's starting position.
    - 84              * @param x {number}
    - 85              * @param y {number}
    - 86              */
    - 87             setInitialPosition:function (x, y) {
    - 88                 this.points[0].x = x;
    - 89                 this.points[0].y = y;
    - 90                 this.newPosition.set(x, y);
    - 91                 return this;
    - 92             },
    - 93             /**
    - 94              * Set this path segment's ending position.
    - 95              * @param finalX {number}
    - 96              * @param finalY {number}
    - 97              */
    - 98             setFinalPosition:function (finalX, finalY) {
    - 99                 this.points[1].x = finalX;
    -100                 this.points[1].y = finalY;
    -101                 return this;
    -102             },
    -103             /**
    -104              * @inheritDoc
    -105              */
    -106             endCurvePosition:function () {
    -107                 return this.points[1];
    -108             },
    -109             /**
    -110              * @inheritsDoc
    -111              */
    -112             startCurvePosition:function () {
    -113                 return this.points[0];
    -114             },
    -115             /**
    -116              * @inheritsDoc
    -117              */
    -118             getPosition:function (time) {
    -119 
    -120                 if (time > 1 || time < 0) {
    -121                     time %= 1;
    -122                 }
    -123                 if (time < 0) {
    -124                     time = 1 + time;
    -125                 }
    -126 
    -127                 this.newPosition.set(
    -128                     (this.points[0].x + (this.points[1].x - this.points[0].x) * time),
    -129                     (this.points[0].y + (this.points[1].y - this.points[0].y) * time));
    -130 
    -131                 return this.newPosition;
    -132             },
    -133             getPositionFromLength:function (len) {
    -134                 return this.getPosition(len / this.length);
    -135             },
    -136             /**
    -137              * Returns initial path segment point's x coordinate.
    -138              * @return {number}
    -139              */
    -140             initialPositionX:function () {
    -141                 return this.points[0].x;
    -142             },
    -143             /**
    -144              * Returns final path segment point's x coordinate.
    -145              * @return {number}
    -146              */
    -147             finalPositionX:function () {
    -148                 return this.points[1].x;
    -149             },
    -150             /**
    -151              * Draws this path segment on screen. Optionally it can draw handles for every control point, in
    -152              * this case, start and ending path segment points.
    -153              * @param director {CAAT.Director}
    -154              * @param bDrawHandles {boolean}
    -155              */
    -156             paint:function (director, bDrawHandles) {
    -157 
    -158                 var ctx = director.ctx;
    -159 
    -160                 ctx.save();
    -161 
    -162                 ctx.strokeStyle = this.color;
    -163                 ctx.beginPath();
    -164                 ctx.moveTo(this.points[0].x, this.points[0].y);
    -165                 ctx.lineTo(this.points[1].x, this.points[1].y);
    -166                 ctx.stroke();
    -167 
    -168                 if (bDrawHandles) {
    -169                     ctx.globalAlpha = 0.5;
    -170                     ctx.fillStyle = '#7f7f00';
    -171                     ctx.beginPath();
    -172                     this.drawHandle(ctx, this.points[0].x, this.points[0].y);
    -173                     this.drawHandle(ctx, this.points[1].x, this.points[1].y);
    -174 
    -175                 }
    -176 
    -177                 ctx.restore();
    -178             },
    -179             /**
    -180              * Get the number of control points. For this type of path segment, start and
    -181              * ending path segment points. Defaults to 2.
    -182              * @return {number}
    -183              */
    -184             numControlPoints:function () {
    -185                 return 2;
    -186             },
    -187             /**
    -188              * @inheritsDoc
    -189              */
    -190             getControlPoint:function (index) {
    -191                 if (0 === index) {
    -192                     return this.points[0];
    -193                 } else if (1 === index) {
    -194                     return this.points[1];
    -195                 }
    -196             },
    -197             /**
    -198              * @inheritsDoc
    -199              */
    -200             getContour:function (iSize) {
    -201                 var contour = [];
    -202 
    -203                 contour.push(this.getPosition(0).clone());
    -204                 contour.push(this.getPosition(1).clone());
    -205 
    -206                 return contour;
    -207             }
    -208         }
    -209     }
    -210 });
    -211 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_Path.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_Path.js.html deleted file mode 100644 index 6c7cb2ed..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_Path.js.html +++ /dev/null @@ -1,1172 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name Path
    -  5      * @memberOf CAAT.PathUtil
    -  6      * @extends CAAT.PathUtil.PathSegment
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.PathUtil.Path",
    - 11     aliases : ["CAAT.Path"],
    - 12     depends : [
    - 13         "CAAT.PathUtil.PathSegment",
    - 14         "CAAT.PathUtil.ArcPath",
    - 15         "CAAT.PathUtil.CurvePath",
    - 16         "CAAT.PathUtil.LinearPath",
    - 17         "CAAT.PathUtil.RectPath",
    - 18         "CAAT.Math.Bezier",
    - 19         "CAAT.Math.CatmullRom",
    - 20         "CAAT.Math.Point",
    - 21         "CAAT.Math.Matrix"
    - 22     ],
    - 23     extendsClass : "CAAT.PathUtil.PathSegment",
    - 24     extendsWith : {
    - 25 
    - 26         /**
    - 27          * @lends CAAT.PathUtil.Path.prototype
    - 28          */
    - 29 
    - 30 
    - 31         __init : function()	{
    - 32                 this.__super();
    - 33 
    - 34                 this.newPosition=   new CAAT.Math.Point(0,0,0);
    - 35                 this.pathSegments=  [];
    - 36 
    - 37                 this.behaviorList=  [];
    - 38                 this.matrix=        new CAAT.Math.Matrix();
    - 39                 this.tmpMatrix=     new CAAT.Math.Matrix();
    - 40 
    - 41                 return this;
    - 42         },
    - 43 
    - 44         /**
    - 45          * A collection of PathSegments.
    - 46          * @type {Array.<CAAT.PathUtil.PathSegment>}
    - 47          */
    - 48 		pathSegments:	            null,   // a collection of CAAT.PathSegment instances.
    - 49 
    - 50         /**
    - 51          * For each path segment in this path, the normalized calculated duration.
    - 52          * precomputed segment duration relative to segment legnth/path length
    - 53          */
    - 54 		pathSegmentDurationTime:	null,
    - 55 
    - 56         /**
    - 57          * For each path segment in this path, the normalized calculated start time.
    - 58          * precomputed segment start time relative to segment legnth/path length and duration.
    - 59          */
    - 60 		pathSegmentStartTime:		null,
    - 61 
    - 62         /**
    - 63          * spare CAAT.Math.Point to return calculated values in the path.
    - 64          */
    - 65 		newPosition:	            null,
    - 66 
    - 67         /**
    - 68          * path length (sum of every segment length)
    - 69          */
    - 70 		pathLength:		            -1,
    - 71 
    - 72         /**
    - 73          * starting path x position
    - 74          */
    - 75 		beginPathX:		            -1,
    - 76 
    - 77         /**
    - 78          * starting path y position
    - 79          */
    - 80 		beginPathY:                 -1,
    - 81 
    - 82         /*
    - 83             last path coordinates position (using when building the path).
    - 84          */
    - 85 		trackPathX:		            -1,
    - 86 		trackPathY:		            -1,
    - 87 
    - 88         /*
    - 89             needed to drag control points.
    - 90           */
    - 91 		ax:                         -1,
    - 92 		ay:                         -1,
    - 93 		point:                      [],
    - 94 
    - 95         /**
    - 96          * Is this path interactive ?. If so, controls points can be moved with a CAAT.Foundation.UI.PathActor.
    - 97          */
    - 98         interactive:                true,
    - 99 
    -100         /**
    -101          * A list of behaviors to apply to this path.
    -102          * A path can be affine transformed to create a different path.
    -103          */
    -104         behaviorList:               null,
    -105 
    -106         /* rotation behavior info **/
    -107 
    -108         /**
    -109          * Path rotation angle.
    -110          */
    -111         rb_angle:                   0,
    -112 
    -113         /**
    -114          * Path rotation x anchor.
    -115          */
    -116         rb_rotateAnchorX:           .5,
    -117 
    -118         /**
    -119          * Path rotation x anchor.
    -120          */
    -121         rb_rotateAnchorY:           .5,
    -122 
    -123         /* scale behavior info **/
    -124 
    -125         /**
    -126          * Path X scale.
    -127          */
    -128         sb_scaleX:                  1,
    -129 
    -130         /**
    -131          * Path Y scale.
    -132          */
    -133         sb_scaleY:                  1,
    -134 
    -135         /**
    -136          * Path scale X anchor.
    -137          */
    -138         sb_scaleAnchorX:            .5,
    -139 
    -140         /**
    -141          * Path scale Y anchor.
    -142          */
    -143         sb_scaleAnchorY:            .5,
    -144 
    -145         /**
    -146          * Path translation anchor X.
    -147          */
    -148         tAnchorX:                   0,
    -149 
    -150         /**
    -151          * Path translation anchor Y.
    -152          */
    -153         tAnchorY:                   0,
    -154 
    -155         /* translate behavior info **/
    -156 
    -157         /**
    -158          * Path translation X.
    -159          */
    -160         tb_x:                       0,
    -161 
    -162         /**
    -163          * Path translation Y.
    -164          */
    -165         tb_y:                       0,
    -166 
    -167         /* behavior affine transformation matrix **/
    -168 
    -169         /**
    -170          * Path behaviors matrix.
    -171          */
    -172         matrix:                     null,
    -173 
    -174         /**
    -175          * Spare calculation matrix.
    -176          */
    -177         tmpMatrix:                  null,
    -178 
    -179         /**
    -180          * Original Path´s path segments points.
    -181          */
    -182         pathPoints:                 null,
    -183 
    -184         /**
    -185          * Path bounding box width.
    -186          */
    -187         width:                      0,
    -188 
    -189         /**
    -190          * Path bounding box height.
    -191          */
    -192         height:                     0,
    -193 
    -194         /**
    -195          * Path bounding box X position.
    -196          */
    -197         clipOffsetX             :   0,
    -198 
    -199         /**
    -200          * Path bounding box Y position.
    -201          */
    -202         clipOffsetY             :   0,
    -203 
    -204         /**
    -205          * Is this path closed ?
    -206          */
    -207         closed                  :   false,
    -208 
    -209         /**
    -210          * Apply this path as a Canvas context path.
    -211          * You must explicitly call context.beginPath
    -212          * @param director
    -213          * @return {*}
    -214          */
    -215         applyAsPath : function(director) {
    -216             var ctx= director.ctx;
    -217 
    -218             director.modelViewMatrix.transformRenderingContext( ctx );
    -219             ctx.globalCompositeOperation= 'source-out';
    -220             ctx.moveTo(
    -221                 this.getFirstPathSegment().startCurvePosition().x,
    -222                 this.getFirstPathSegment().startCurvePosition().y
    -223             );
    -224             for( var i=0; i<this.pathSegments.length; i++ ) {
    -225                 this.pathSegments[i].applyAsPath(director);
    -226             }
    -227             ctx.globalCompositeOperation= 'source-over';
    -228             return this;
    -229         },
    -230         /**
    -231          * Set whether this path should paint handles for every control point.
    -232          * @param interactive {boolean}.
    -233          */
    -234         setInteractive : function(interactive) {
    -235             this.interactive= interactive;
    -236             return this;
    -237         },
    -238         getFirstPathSegment : function() {
    -239             return this.pathSegments.length ?
    -240                 this.pathSegments[0] :
    -241                 null;
    -242         },
    -243         getLastPathSegment : function() {
    -244             return this.pathSegments.length ?
    -245                 this.pathSegments[ this.pathSegments.length-1 ] :
    -246                 null;
    -247         },
    -248         /**
    -249          * Return the last point of the last path segment of this compound path.
    -250          * @return {CAAT.Point}
    -251          */
    -252         endCurvePosition : function() {
    -253             if ( this.pathSegments.length ) {
    -254                 return this.pathSegments[ this.pathSegments.length-1 ].endCurvePosition();
    -255             } else {
    -256                 return new CAAT.Math.Point().set( this.beginPathX, this.beginPathY );
    -257             }
    -258         },
    -259         /**
    -260          * Return the first point of the first path segment of this compound path.
    -261          * @return {CAAT.Point}
    -262          */
    -263         startCurvePosition : function() {
    -264             return this.pathSegments[ 0 ].startCurvePosition();
    -265         },
    -266         /**
    -267          * Return the last path segment added to this path.
    -268          * @return {CAAT.PathSegment}
    -269          */
    -270         getCurrentPathSegment : function() {
    -271             return this.pathSegments[ this.pathSegments.length-1 ];
    -272         },
    -273         /**
    -274          * Set the path to be composed by a single LinearPath segment.
    -275          * @param x0 {number}
    -276          * @param y0 {number}
    -277          * @param x1 {number}
    -278          * @param y1 {number}
    -279          * @return this
    -280          */
    -281         setLinear : function(x0,y0,x1,y1) {
    -282             this.pathSegments= [];
    -283             this.beginPath(x0,y0);
    -284             this.addLineTo(x1,y1);
    -285             this.endPath();
    -286 
    -287             return this;
    -288         },
    -289         /**
    -290          * Set this path to be composed by a single Quadric Bezier path segment.
    -291          * @param x0 {number}
    -292          * @param y0 {number}
    -293          * @param x1 {number}
    -294          * @param y1 {number}
    -295          * @param x2 {number}
    -296          * @param y2 {number}
    -297          * @return this
    -298          */
    -299         setQuadric : function(x0,y0,x1,y1,x2,y2) {
    -300             this.beginPath(x0,y0);
    -301             this.addQuadricTo(x1,y1,x2,y2);
    -302             this.endPath();
    -303 
    -304             return this;
    -305         },
    -306         /**
    -307          * Sets this path to be composed by a single Cubic Bezier path segment.
    -308          * @param x0 {number}
    -309          * @param y0 {number}
    -310          * @param x1 {number}
    -311          * @param y1 {number}
    -312          * @param x2 {number}
    -313          * @param y2 {number}
    -314          * @param x3 {number}
    -315          * @param y3 {number}
    -316          *
    -317          * @return this
    -318          */
    -319         setCubic : function(x0,y0,x1,y1,x2,y2,x3,y3) {
    -320             this.beginPath(x0,y0);
    -321             this.addCubicTo(x1,y1,x2,y2,x3,y3);
    -322             this.endPath();
    -323 
    -324             return this;
    -325         },
    -326         setRectangle : function(x0,y0, x1,y1) {
    -327             this.beginPath(x0,y0);
    -328             this.addRectangleTo(x1,y1);
    -329             this.endPath();
    -330 
    -331             return this;
    -332         },
    -333         setCatmullRom : function( points, closed ) {
    -334             if ( closed ) {
    -335                 points = points.slice(0)
    -336                 points.unshift(points[points.length-1])
    -337                 points.push(points[1])
    -338                 points.push(points[2])
    -339             }
    -340 
    -341             for( var i=1; i<points.length-2; i++ ) {
    -342 
    -343                 var segment= new CAAT.PathUtil.CurvePath().setColor("#000").setParent(this);
    -344                 var cm= new CAAT.Math.CatmullRom().setCurve(
    -345                     points[ i-1 ],
    -346                     points[ i ],
    -347                     points[ i+1 ],
    -348                     points[ i+2 ]
    -349                 );
    -350                 segment.curve= cm;
    -351                 this.pathSegments.push(segment);
    -352             }
    -353             return this;
    -354         },
    -355         /**
    -356          * Add a CAAT.PathSegment instance to this path.
    -357          * @param pathSegment {CAAT.PathSegment}
    -358          * @return this
    -359          *
    -360          */
    -361 		addSegment : function(pathSegment) {
    -362             pathSegment.setParent(this);
    -363 			this.pathSegments.push(pathSegment);
    -364             return this;
    -365 		},
    -366         addArcTo : function( x1,y1, x2,y2, radius, cw, color ) {
    -367             var r= new CAAT.PathUtil.ArcPath();
    -368             r.setArcTo(true);
    -369             r.setRadius( radius );
    -370             r.setInitialPosition( x1,y1).
    -371                 setFinalPosition( x2,y2 );
    -372 
    -373 
    -374             r.setParent( this );
    -375             r.setColor( color );
    -376 
    -377             this.pathSegments.push(r);
    -378 
    -379             return this;
    -380         },
    -381         addRectangleTo : function( x1,y1, cw, color ) {
    -382             var r= new CAAT.PathUtil.RectPath();
    -383             r.setPoints([
    -384                     this.endCurvePosition(),
    -385                     new CAAT.Math.Point().set(x1,y1)
    -386                 ]);
    -387 
    -388             r.setClockWise(cw);
    -389             r.setColor(color);
    -390             r.setParent(this);
    -391 
    -392             this.pathSegments.push(r);
    -393 
    -394             return this;
    -395         },
    -396         /**
    -397          * Add a Quadric Bezier path segment to this path.
    -398          * The segment starts in the current last path coordinate.
    -399          * @param px1 {number}
    -400          * @param py1 {number}
    -401          * @param px2 {number}
    -402          * @param py2 {number}
    -403          * @param color {color=}. optional parameter. determines the color to draw the segment with (if
    -404          *         being drawn by a CAAT.PathActor).
    -405          *
    -406          * @return this
    -407          */
    -408 		addQuadricTo : function( px1,py1, px2,py2, color ) {
    -409 			var bezier= new CAAT.Math.Bezier();
    -410 
    -411             bezier.setPoints(
    -412                 [
    -413                     this.endCurvePosition(),
    -414                     new CAAT.Math.Point().set(px1,py1),
    -415                     new CAAT.Math.Point().set(px2,py2)
    -416                 ]);
    -417 
    -418 			this.trackPathX= px2;
    -419 			this.trackPathY= py2;
    -420 			
    -421 			var segment= new CAAT.PathUtil.CurvePath().setColor(color).setParent(this);
    -422 			segment.curve= bezier;
    -423 
    -424 			this.pathSegments.push(segment);
    -425 
    -426             return this;
    -427 		},
    -428         /**
    -429          * Add a Cubic Bezier segment to this path.
    -430          * The segment starts in the current last path coordinate.
    -431          * @param px1 {number}
    -432          * @param py1 {number}
    -433          * @param px2 {number}
    -434          * @param py2 {number}
    -435          * @param px3 {number}
    -436          * @param py3 {number}
    -437          * @param color {color=}. optional parameter. determines the color to draw the segment with (if
    -438          *         being drawn by a CAAT.PathActor).
    -439          *
    -440          * @return this
    -441          */
    -442 		addCubicTo : function( px1,py1, px2,py2, px3,py3, color ) {
    -443 			var bezier= new CAAT.Math.Bezier();
    -444 
    -445             bezier.setPoints(
    -446                 [
    -447                     this.endCurvePosition(),
    -448                     new CAAT.Math.Point().set(px1,py1),
    -449                     new CAAT.Math.Point().set(px2,py2),
    -450                     new CAAT.Math.Point().set(px3,py3)
    -451                 ]);
    -452 
    -453 			this.trackPathX= px3;
    -454 			this.trackPathY= py3;
    -455 			
    -456 			var segment= new CAAT.PathUtil.CurvePath().setColor(color).setParent(this);
    -457 			segment.curve= bezier;
    -458 
    -459 			this.pathSegments.push(segment);
    -460             return this;
    -461 		},
    -462         /**
    -463          * Add a Catmull-Rom segment to this path.
    -464          * The segment starts in the current last path coordinate.
    -465          * @param px1 {number}
    -466          * @param py1 {number}
    -467          * @param px2 {number}
    -468          * @param py2 {number}
    -469          * @param px3 {number}
    -470          * @param py3 {number}
    -471          * @param color {color=}. optional parameter. determines the color to draw the segment with (if
    -472          *         being drawn by a CAAT.PathActor).
    -473          *
    -474          * @return this
    -475          */
    -476 		addCatmullTo : function( px1,py1, px2,py2, px3,py3, color ) {
    -477 			var curve= new CAAT.Math.CatmullRom().setColor(color);
    -478 			curve.setCurve(this.trackPathX,this.trackPathY, px1,py1, px2,py2, px3,py3);
    -479 			this.trackPathX= px3;
    -480 			this.trackPathY= py3;
    -481 			
    -482 			var segment= new CAAT.PathUtil.CurvePath().setParent(this);
    -483 			segment.curve= curve;
    -484 
    -485 			this.pathSegments.push(segment);
    -486             return this;
    -487 		},
    -488         /**
    -489          * Adds a line segment to this path.
    -490          * The segment starts in the current last path coordinate.
    -491          * @param px1 {number}
    -492          * @param py1 {number}
    -493          * @param color {color=}. optional parameter. determines the color to draw the segment with (if
    -494          *         being drawn by a CAAT.PathActor).
    -495          *
    -496          * @return this
    -497          */
    -498 		addLineTo : function( px1,py1, color ) {
    -499 			var segment= new CAAT.PathUtil.LinearPath().setColor(color);
    -500             segment.setPoints( [
    -501                     this.endCurvePosition(),
    -502                     new CAAT.Math.Point().set(px1,py1)
    -503                 ]);
    -504 
    -505             segment.setParent(this);
    -506 
    -507 			this.trackPathX= px1;
    -508 			this.trackPathY= py1;
    -509 			
    -510 			this.pathSegments.push(segment);
    -511             return this;
    -512 		},
    -513         /**
    -514          * Set the path's starting point. The method startCurvePosition will return this coordinate.
    -515          * <p>
    -516          * If a call to any method of the form <code>add<Segment>To</code> is called before this calling
    -517          * this method, they will assume to start at -1,-1 and probably you'll get the wrong path.
    -518          * @param px0 {number}
    -519          * @param py0 {number}
    -520          *
    -521          * @return this
    -522          */
    -523 		beginPath : function( px0, py0 ) {
    -524 			this.trackPathX= px0;
    -525 			this.trackPathY= py0;
    -526 			this.beginPathX= px0;
    -527 			this.beginPathY= py0;
    -528             return this;
    -529 		},
    -530         /**
    -531          * <del>Close the path by adding a line path segment from the current last path
    -532          * coordinate to startCurvePosition coordinate</del>.
    -533          * <p>
    -534          * This method closes a path by setting its last path segment's last control point
    -535          * to be the first path segment's first control point.
    -536          * <p>
    -537          *     This method also sets the path as finished, and calculates all path's information
    -538          *     such as length and bounding box.
    -539          *
    -540          * @return this
    -541          */
    -542 		closePath : function()	{
    -543 
    -544             this.getLastPathSegment().setPoint(
    -545                 this.getFirstPathSegment().startCurvePosition(),
    -546                 this.getLastPathSegment().numControlPoints()-1 );
    -547 
    -548 
    -549 			this.trackPathX= this.beginPathX;
    -550 			this.trackPathY= this.beginPathY;
    -551 
    -552             this.closed= true;
    -553 
    -554 			this.endPath();
    -555             return this;
    -556 		},
    -557         /**
    -558          * Finishes the process of building the path. It involves calculating each path segments length
    -559          * and proportional length related to a normalized path length of 1.
    -560          * It also sets current paths length.
    -561          * These calculi are needed to traverse the path appropriately.
    -562          * <p>
    -563          * This method must be called explicitly, except when closing a path (that is, calling the
    -564          * method closePath) which calls this method as well.
    -565          *
    -566          * @return this
    -567          */
    -568 		endPath : function() {
    -569 
    -570 			this.pathSegmentStartTime=[];
    -571 			this.pathSegmentDurationTime= [];
    -572 
    -573             this.updatePath();
    -574 
    -575             return this;
    -576 		},
    -577         /**
    -578          * This method, returns a CAAT.Foundation.Point instance indicating a coordinate in the path.
    -579          * The returned coordinate is the corresponding to normalizing the path's length to 1,
    -580          * and then finding what path segment and what coordinate in that path segment corresponds
    -581          * for the input time parameter.
    -582          * <p>
    -583          * The parameter time must be a value ranging 0..1.
    -584          * If not constrained to these values, the parameter will be modulus 1, and then, if less
    -585          * than 0, be normalized to 1+time, so that the value always ranges from 0 to 1.
    -586          * <p>
    -587          * This method is needed when traversing the path throughout a CAAT.Interpolator instance.
    -588          *
    -589          *
    -590          * @param time {number} a value between 0 and 1 both inclusive. 0 will return path's starting coordinate.
    -591          * 1 will return path's end coordinate.
    -592          * @param open_contour {boolean=} treat this path as an open contour. It is intended for
    -593          * open paths, and interpolators which give values above 1. see tutorial 7.1.
    -594          * @link{../../documentation/tutorials/t7-1.html}
    -595          *
    -596          * @return {CAAT.Foundation.Point}
    -597          */
    -598 		getPosition : function(time, open_contour) {
    -599 
    -600             if (open_contour && (time>=1 || time<=0) ) {
    -601 
    -602                 var p0,p1,ratio, angle;
    -603 
    -604                 if ( time>=1 ) {
    -605                     // these values could be cached.
    -606                     p0= this.__getPositionImpl( .999 );
    -607                     p1= this.endCurvePosition();
    -608 
    -609                     angle= Math.atan2( p1.y - p0.y, p1.x - p0.x );
    -610                     ratio= time%1;
    -611 
    -612 
    -613                 } else {
    -614                     // these values could be cached.
    -615                     p0= this.__getPositionImpl( .001 );
    -616                     p1= this.startCurvePosition();
    -617 
    -618                     angle= Math.atan2( p1.y - p0.y, p1.x - p0.x );
    -619                     ratio= -time;
    -620                 }
    -621 
    -622                 var np= this.newPosition;
    -623                 var length= this.getLength();
    -624 
    -625                 np.x = p1.x + (ratio * length)*Math.cos(angle);
    -626                 np.y = p1.y + (ratio * length)*Math.sin(angle);
    -627 
    -628 
    -629                 return np;
    -630             }
    -631 
    -632             return this.__getPositionImpl(time);
    -633         },
    -634 
    -635         __getPositionImpl : function(time) {
    -636 
    -637             if ( time>1 || time<0 ) {
    -638                 time%=1;
    -639             }
    -640             if ( time<0 ) {
    -641                 time= 1+time;
    -642             }
    -643 
    -644             var ps= this.pathSegments;
    -645             var psst= this.pathSegmentStartTime;
    -646             var psdt= this.pathSegmentDurationTime;
    -647             var l=  0;
    -648             var r=  ps.length;
    -649             var m;
    -650             var np= this.newPosition;
    -651             var psstv;
    -652             while( l!==r ) {
    -653 
    -654                 m= ((r+l)/2)|0;
    -655                 psstv= psst[m];
    -656                 if ( psstv<=time && time<=psstv+psdt[m]) {
    -657                     time= psdt[m] ?
    -658                             (time-psstv)/psdt[m] :
    -659                             0;
    -660 
    -661                     // Clamp this segment's time to a maximum since it is relative to the path.
    -662                     // thanks https://github.com/donaldducky for spotting.
    -663                     if (time>1) {
    -664                         time=1;
    -665                     } else if (time<0 ) {
    -666                         time= 0;
    -667                     }
    -668 
    -669                     var pointInPath= ps[m].getPosition(time);
    -670                     np.x= pointInPath.x;
    -671                     np.y= pointInPath.y;
    -672                     return np;
    -673                 } else if ( time<psstv ) {
    -674                     r= m;
    -675                 } else /*if ( time>=psstv )*/ {
    -676                     l= m+1;
    -677                 }
    -678             }
    -679             return this.endCurvePosition();
    -680 
    -681 
    -682 		},
    -683         /**
    -684          * Analogously to the method getPosition, this method returns a CAAT.Point instance with
    -685          * the coordinate on the path that corresponds to the given length. The input length is
    -686          * related to path's length.
    -687          *
    -688          * @param iLength {number} a float with the target length.
    -689          * @return {CAAT.Point}
    -690          */
    -691 		getPositionFromLength : function(iLength) {
    -692 			
    -693 			iLength%=this.getLength();
    -694 			if (iLength<0 ) {
    -695 				iLength+= this.getLength();
    -696 			}
    -697 			
    -698 			var accLength=0;
    -699 			
    -700 			for( var i=0; i<this.pathSegments.length; i++ ) {
    -701 				if (accLength<=iLength && iLength<=this.pathSegments[i].getLength()+accLength) {
    -702 					iLength-= accLength;
    -703 					var pointInPath= this.pathSegments[i].getPositionFromLength(iLength);
    -704 					this.newPosition.x= pointInPath.x;
    -705 					this.newPosition.y= pointInPath.y;
    -706 					break;
    -707 				}
    -708 				accLength+= this.pathSegments[i].getLength();
    -709 			}
    -710 			
    -711 			return this.newPosition;
    -712 		},
    -713         /**
    -714          * Paints the path.
    -715          * This method is called by CAAT.PathActor instances.
    -716          * If the path is set as interactive (by default) path segment will draw curve modification
    -717          * handles as well.
    -718          *
    -719          * @param director {CAAT.Director} a CAAT.Director instance.
    -720          */
    -721 		paint : function( director ) {
    -722 			for( var i=0; i<this.pathSegments.length; i++ ) {
    -723 				this.pathSegments[i].paint(director,this.interactive);
    -724 			}
    -725 		},
    -726         /**
    -727          * Method invoked when a CAAT.PathActor stops dragging a control point.
    -728          */
    -729 		release : function() {
    -730 			this.ax= -1;
    -731 			this.ay= -1;
    -732 		},
    -733         isEmpty : function() {
    -734             return !this.pathSegments.length;
    -735         },
    -736         /**
    -737          * Returns an integer with the number of path segments that conform this path.
    -738          * @return {number}
    -739          */
    -740         getNumSegments : function() {
    -741             return this.pathSegments.length;
    -742         },
    -743         /**
    -744          * Gets a CAAT.PathSegment instance.
    -745          * @param index {number} the index of the desired CAAT.PathSegment.
    -746          * @return CAAT.PathSegment
    -747          */
    -748 		getSegment : function(index) {
    -749 			return this.pathSegments[index];
    -750 		},
    -751 
    -752         numControlPoints : function() {
    -753             return this.points.length;
    -754         },
    -755 
    -756         getControlPoint : function(index) {
    -757             return this.points[index];
    -758         },
    -759 
    -760         /**
    -761          * Indicates that some path control point has changed, and that the path must recalculate
    -762          * its internal data, ie: length and bbox.
    -763          */
    -764 		updatePath : function(point, callback) {
    -765             var i,j;
    -766 
    -767             this.length=0;
    -768             this.bbox.setEmpty();
    -769             this.points= [];
    -770 
    -771             var xmin= Number.MAX_VALUE, ymin= Number.MAX_VALUE;
    -772 			for( i=0; i<this.pathSegments.length; i++ ) {
    -773 				this.pathSegments[i].updatePath(point);
    -774                 this.length+= this.pathSegments[i].getLength();
    -775                 this.bbox.unionRectangle( this.pathSegments[i].bbox );
    -776 
    -777                 for( j=0; j<this.pathSegments[i].numControlPoints(); j++ ) {
    -778                     var pt= this.pathSegments[i].getControlPoint( j );
    -779                     this.points.push( pt );
    -780                     if ( pt.x < xmin ) {
    -781                         xmin= pt.x;
    -782                     }
    -783                     if ( pt.y < ymin ) {
    -784                         ymin= pt.y;
    -785                     }
    -786                 }
    -787 			}
    -788 
    -789             this.clipOffsetX= -xmin;
    -790             this.clipOffsetY= -ymin;
    -791 
    -792             this.width= this.bbox.width;
    -793             this.height= this.bbox.height;
    -794             this.setLocation( this.bbox.x, this.bbox.y );
    -795 
    -796             this.pathSegmentStartTime=      [];
    -797             this.pathSegmentDurationTime=   [];
    -798             
    -799             var i;
    -800             for( i=0; i<this.pathSegments.length; i++) {
    -801                 this.pathSegmentStartTime.push(0);
    -802                 this.pathSegmentDurationTime.push(0);
    -803             }
    -804 
    -805             for( i=0; i<this.pathSegments.length; i++) {
    -806                 this.pathSegmentDurationTime[i]= this.getLength() ? this.pathSegments[i].getLength()/this.getLength() : 0;
    -807                 if ( i>0 ) {
    -808                     this.pathSegmentStartTime[i]= this.pathSegmentStartTime[i-1]+this.pathSegmentDurationTime[i-1];
    -809                 } else {
    -810                     this.pathSegmentStartTime[0]= 0;
    -811                 }
    -812 
    -813                 this.pathSegments[i].endPath();
    -814             }
    -815 
    -816             this.extractPathPoints();
    -817 
    -818             if ( callback ) {
    -819                 callback(this);
    -820             }
    -821 
    -822             return this;
    -823 
    -824 		},
    -825         /**
    -826          * Sent by a CAAT.PathActor instance object to try to drag a path's control point.
    -827          * @param x {number}
    -828          * @param y {number}
    -829          */
    -830 		press: function(x,y) {
    -831             if (!this.interactive) {
    -832                 return;
    -833             }
    -834 
    -835             var HS= CAAT.Math.Curve.prototype.HANDLE_SIZE/2;
    -836 			for( var i=0; i<this.pathSegments.length; i++ ) {
    -837 				for( var j=0; j<this.pathSegments[i].numControlPoints(); j++ ) {
    -838 					var point= this.pathSegments[i].getControlPoint(j);
    -839 					if ( x>=point.x-HS &&
    -840 						 y>=point.y-HS &&
    -841 						 x<point.x+HS &&
    -842 						 y<point.y+HS ) {
    -843 						
    -844 						this.point= point;
    -845 						return;
    -846 					}
    -847 				}
    -848 			}
    -849 			this.point= null;
    -850 		},
    -851         /**
    -852          * Drags a path's control point.
    -853          * If the method press has not set needed internal data to drag a control point, this
    -854          * method will do nothing, regardless the user is dragging on the CAAT.PathActor delegate.
    -855          * @param x {number}
    -856          * @param y {number}
    -857          */
    -858 		drag : function(x,y,callback) {
    -859             if (!this.interactive) {
    -860                 return;
    -861             }
    -862 
    -863 			if ( null===this.point ) {
    -864 				return;
    -865 			}
    -866 			
    -867 			if ( -1===this.ax || -1===this.ay ) {
    -868 				this.ax= x;
    -869 				this.ay= y;
    -870 			}
    -871 			
    -872             this.point.x+= x-this.ax;
    -873             this.point.y+= y-this.ay;
    -874 
    -875 			this.ax= x;
    -876 			this.ay= y;
    -877 
    -878 			this.updatePath(this.point,callback);
    -879 		},
    -880         /**
    -881          * Returns a collection of CAAT.Point objects which conform a path's contour.
    -882          * @param iSize {number}. Number of samples for each path segment.
    -883          * @return {[CAAT.Point]}
    -884          */
    -885         getContour : function(iSize) {
    -886             var contour=[];
    -887             for( var i=0; i<=iSize; i++ ) {
    -888                 contour.push( new CAAT.Math.Point().set( i/iSize, this.getPosition(i/iSize).y, 0 ) );
    -889             }
    -890 
    -891             return contour;
    -892         },
    -893 
    -894         /**
    -895          * Reposition this path points.
    -896          * This operation will only take place if the supplied points array equals in size to
    -897          * this path's already set points.
    -898          * @param points {Array<CAAT.Point>}
    -899          */
    -900         setPoints : function( points ) {
    -901             if ( this.points.length===points.length ) {
    -902                 for( var i=0; i<points.length; i++ ) {
    -903                     this.points[i].x= points[i].x;
    -904                     this.points[i].y= points[i].y;
    -905                 }
    -906             }
    -907             return this;
    -908         },
    -909 
    -910         /**
    -911          * Set a point from this path.
    -912          * @param point {CAAT.Point}
    -913          * @param index {integer} a point index.
    -914          */
    -915         setPoint : function( point, index ) {
    -916             if ( index>=0 && index<this.points.length ) {
    -917                 this.points[index].x= point.x;
    -918                 this.points[index].y= point.y;
    -919             }
    -920             return this;
    -921         },
    -922 
    -923 
    -924         /**
    -925          * Removes all behaviors from an Actor.
    -926          * @return this
    -927          */
    -928 		emptyBehaviorList : function() {
    -929 			this.behaviorList=[];
    -930             return this;
    -931 		},
    -932 
    -933         extractPathPoints : function() {
    -934             if ( !this.pathPoints ) {
    -935                 var i;
    -936                 this.pathPoints= [];
    -937                 for ( i=0; i<this.numControlPoints(); i++ ) {
    -938                     this.pathPoints.push( this.getControlPoint(i).clone() );
    -939                 }
    -940             }
    -941 
    -942             return this;
    -943         },
    -944 
    -945         /**
    -946          * Add a Behavior to the Actor.
    -947          * An Actor accepts an undefined number of Behaviors.
    -948          *
    -949          * @param behavior {CAAT.Behavior} a CAAT.Behavior instance
    -950          * @return this
    -951          */
    -952 		addBehavior : function( behavior )	{
    -953 			this.behaviorList.push(behavior);
    -954 //            this.extractPathPoints();
    -955             return this;
    -956 		},
    -957         /**
    -958          * Remove a Behavior from the Actor.
    -959          * If the Behavior is not present at the actor behavior collection nothing happends.
    -960          *
    -961          * @param behavior {CAAT.Behavior} a CAAT.Behavior instance.
    -962          */
    -963         removeBehaviour : function( behavior ) {
    -964             var n= this.behaviorList.length-1;
    -965             while(n) {
    -966                 if ( this.behaviorList[n]===behavior ) {
    -967                     this.behaviorList.splice(n,1);
    -968                     return this;
    -969                 }
    -970             }
    -971 
    -972             return this;
    -973         },
    -974         /**
    -975          * Remove a Behavior with id param as behavior identifier from this actor.
    -976          * This function will remove ALL behavior instances with the given id.
    -977          *
    -978          * @param id {number} an integer.
    -979          * return this;
    -980          */
    -981         removeBehaviorById : function( id ) {
    -982             for( var n=0; n<this.behaviorList.length; n++ ) {
    -983                 if ( this.behaviorList[n].id===id) {
    -984                     this.behaviorList.splice(n,1);
    -985                 }
    -986             }
    -987 
    -988             return this;
    -989 
    -990         },
    -991 
    -992         applyBehaviors : function(time) {
    -993 //            if (this.behaviorList.length) {
    -994                 for( var i=0; i<this.behaviorList.length; i++ )	{
    -995                     this.behaviorList[i].apply(time,this);
    -996                 }
    -997 
    -998                 /** calculate behavior affine transform matrix **/
    -999                 this.setATMatrix();
    -1000 
    -1001                 for (i = 0; i < this.numControlPoints(); i++) {
    -1002                     this.setPoint(
    -1003                         this.matrix.transformCoord(
    -1004                             this.pathPoints[i].clone().translate( this.clipOffsetX, this.clipOffsetY )), i);
    -1005                 }
    -1006 //            }
    -1007 
    -1008             return this;
    -1009         },
    -1010 
    -1011         setATMatrix : function() {
    -1012             this.matrix.identity();
    -1013 
    -1014             var m= this.tmpMatrix.identity();
    -1015             var mm= this.matrix.matrix;
    -1016             var c,s,_m00,_m01,_m10,_m11;
    -1017             var mm0, mm1, mm2, mm3, mm4, mm5;
    -1018 
    -1019             var bbox= this.bbox;
    -1020             var bbw= bbox.width  ;
    -1021             var bbh= bbox.height ;
    -1022             var bbx= bbox.x;
    -1023             var bby= bbox.y
    -1024 
    -1025             mm0= 1;
    -1026             mm1= 0;
    -1027             mm3= 0;
    -1028             mm4= 1;
    -1029 
    -1030             mm2= this.tb_x - bbx - this.tAnchorX * bbw;
    -1031             mm5= this.tb_y - bby - this.tAnchorY * bbh;
    -1032 
    -1033             if ( this.rb_angle ) {
    -1034 
    -1035                 var rbx= (this.rb_rotateAnchorX*bbw + bbx);
    -1036                 var rby= (this.rb_rotateAnchorY*bbh + bby);
    -1037 
    -1038                 mm2+= mm0*rbx + mm1*rby;
    -1039                 mm5+= mm3*rbx + mm4*rby;
    -1040 
    -1041                 c= Math.cos( this.rb_angle );
    -1042                 s= Math.sin( this.rb_angle);
    -1043                 _m00= mm0;
    -1044                 _m01= mm1;
    -1045                 _m10= mm3;
    -1046                 _m11= mm4;
    -1047                 mm0=  _m00*c + _m01*s;
    -1048                 mm1= -_m00*s + _m01*c;
    -1049                 mm3=  _m10*c + _m11*s;
    -1050                 mm4= -_m10*s + _m11*c;
    -1051 
    -1052                 mm2+= -mm0*rbx - mm1*rby;
    -1053                 mm5+= -mm3*rbx - mm4*rby;
    -1054             }
    -1055 
    -1056             if ( this.sb_scaleX!=1 || this.sb_scaleY!=1 ) {
    -1057 
    -1058                 var sbx= (this.sb_scaleAnchorX*bbw + bbx);
    -1059                 var sby= (this.sb_scaleAnchorY*bbh + bby);
    -1060 
    -1061                 mm2+= mm0*sbx + mm1*sby;
    -1062                 mm5+= mm3*sbx + mm4*sby;
    -1063 
    -1064                 mm0= mm0*this.sb_scaleX;
    -1065                 mm1= mm1*this.sb_scaleY;
    -1066                 mm3= mm3*this.sb_scaleX;
    -1067                 mm4= mm4*this.sb_scaleY;
    -1068 
    -1069                 mm2+= -mm0*sbx - mm1*sby;
    -1070                 mm5+= -mm3*sbx - mm4*sby;
    -1071             }
    -1072 
    -1073             mm[0]= mm0;
    -1074             mm[1]= mm1;
    -1075             mm[2]= mm2;
    -1076             mm[3]= mm3;
    -1077             mm[4]= mm4;
    -1078             mm[5]= mm5;
    -1079 
    -1080             return this;
    -1081 
    -1082         },
    -1083 
    -1084         setRotationAnchored : function( angle, rx, ry ) {
    -1085             this.rb_angle=          angle;
    -1086             this.rb_rotateAnchorX=  rx;
    -1087             this.rb_rotateAnchorY=  ry;
    -1088             return this;
    -1089         },
    -1090 
    -1091         setRotationAnchor : function( ax, ay ) {
    -1092             this.rb_rotateAnchorX= ax;
    -1093             this.rb_rotateAnchorY= ay;
    -1094         },
    -1095 
    -1096         setRotation : function( angle ) {
    -1097             this.rb_angle= angle;
    -1098         },
    -1099 
    -1100         setScaleAnchored : function( scaleX, scaleY, sx, sy ) {
    -1101             this.sb_scaleX= scaleX;
    -1102             this.sb_scaleAnchorX= sx;
    -1103             this.sb_scaleY= scaleY;
    -1104             this.sb_scaleAnchorY= sy;
    -1105             return this;
    -1106         },
    -1107 
    -1108         setScale : function( sx, sy ) {
    -1109             this.sb_scaleX= sx;
    -1110             this.sb_scaleY= sy;
    -1111             return this;
    -1112         },
    -1113 
    -1114         setScaleAnchor : function( ax, ay ) {
    -1115             this.sb_scaleAnchorX= ax;
    -1116             this.sb_scaleAnchorY= ay;
    -1117             return this;
    -1118         },
    -1119 
    -1120         setPositionAnchor : function( ax, ay ) {
    -1121             this.tAnchorX= ax;
    -1122             this.tAnchorY= ay;
    -1123             return this;
    -1124         },
    -1125 
    -1126         setPositionAnchored : function( x,y,ax,ay ) {
    -1127             this.tb_x= x;
    -1128             this.tb_y= y;
    -1129             this.tAnchorX= ax;
    -1130             this.tAnchorY= ay;
    -1131             return this;
    -1132         },
    -1133 
    -1134         setPosition : function( x,y ) {
    -1135             this.tb_x= x;
    -1136             this.tb_y= y;
    -1137             return this;
    -1138         },
    -1139 
    -1140         setLocation : function( x, y ) {
    -1141             this.tb_x= x;
    -1142             this.tb_y= y;
    -1143             return this;
    -1144         },
    -1145 
    -1146         flatten : function( npatches, closed ) {
    -1147             var point= this.getPositionFromLength(0);
    -1148             var path= new CAAT.PathUtil.Path().beginPath( point.x, point.y );
    -1149             for( var i=0; i<npatches; i++ ) {
    -1150                 point= this.getPositionFromLength(i/npatches*this.length);
    -1151                 path.addLineTo( point.x, point.y  );
    -1152             }
    -1153             if ( closed) {
    -1154                 path.closePath();
    -1155             } else {
    -1156                 path.endPath();
    -1157             }
    -1158 
    -1159             return path;
    -1160         }
    -1161 
    -1162     }
    -1163 	
    -1164 });
    -1165 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_PathSegment.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_PathSegment.js.html deleted file mode 100644 index 631e91d5..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_PathSegment.js.html +++ /dev/null @@ -1,220 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  * These classes encapsulate different kinds of paths.
    -  5  * LinearPath, defines an straight line path, just 2 points.
    -  6  * CurvePath, defines a path based on a Curve. Curves can be bezier quadric/cubic and catmull-rom.
    -  7  * Path, is a general purpose class, which composes a path of different path segments (Linear or Curve paths).
    -  8  *
    -  9  * A path, has an interpolator which stablish the way the path is traversed (accelerating, by
    - 10  * easing functions, etc.). Normally, interpolators will be defined by CAAT.Behavior.Interpolator instances, but
    - 11  * general Paths could be used as well.
    - 12  *
    - 13  **/
    - 14 
    - 15 
    - 16 CAAT.Module({
    - 17 
    - 18     /**
    - 19      * @name PathUtil
    - 20      * @memberOf CAAT
    - 21      * @namespace
    - 22      */
    - 23 
    - 24     /**
    - 25      * @name PathSegment
    - 26      * @memberOf CAAT.PathUtil
    - 27      * @constructor
    - 28      */
    - 29 
    - 30     defines:"CAAT.PathUtil.PathSegment",
    - 31     depends:[
    - 32         "CAAT.Math.Rectangle",
    - 33         "CAAT.Math.Point",
    - 34         "CAAT.Math.Matrix",
    - 35         "CAAT.Math.Curve"
    - 36     ],
    - 37     extendsWith:function () {
    - 38         return {
    - 39 
    - 40             /**
    - 41              * @lends CAAT.PathUtil.PathSegment.prototype
    - 42              */
    - 43 
    - 44 
    - 45             __init:function () {
    - 46                 this.bbox = new CAAT.Math.Rectangle();
    - 47                 return this;
    - 48             },
    - 49 
    - 50             /**
    - 51              * Color to draw the segment.
    - 52              */
    - 53             color:'#000',
    - 54 
    - 55             /**
    - 56              * Segment length.
    - 57              */
    - 58             length:0,
    - 59 
    - 60             /**
    - 61              * Segment bounding box.
    - 62              */
    - 63             bbox:null,
    - 64 
    - 65             /**
    - 66              * Path this segment belongs to.
    - 67              */
    - 68             parent:null,
    - 69 
    - 70             /**
    - 71              * Set a PathSegment's parent
    - 72              * @param parent
    - 73              */
    - 74             setParent:function (parent) {
    - 75                 this.parent = parent;
    - 76                 return this;
    - 77             },
    - 78             setColor:function (color) {
    - 79                 if (color) {
    - 80                     this.color = color;
    - 81                 }
    - 82                 return this;
    - 83             },
    - 84             /**
    - 85              * Get path's last coordinate.
    - 86              * @return {CAAT.Point}
    - 87              */
    - 88             endCurvePosition:function () {
    - 89             },
    - 90 
    - 91             /**
    - 92              * Get path's starting coordinate.
    - 93              * @return {CAAT.Point}
    - 94              */
    - 95             startCurvePosition:function () {
    - 96             },
    - 97 
    - 98             /**
    - 99              * Set this path segment's points information.
    -100              * @param points {Array<CAAT.Point>}
    -101              */
    -102             setPoints:function (points) {
    -103             },
    -104 
    -105             /**
    -106              * Set a point from this path segment.
    -107              * @param point {CAAT.Point}
    -108              * @param index {integer} a point index.
    -109              */
    -110             setPoint:function (point, index) {
    -111             },
    -112 
    -113             /**
    -114              * Get a coordinate on path.
    -115              * The parameter time is normalized, that is, its values range from zero to one.
    -116              * zero will mean <code>startCurvePosition</code> and one will be <code>endCurvePosition</code>. Other values
    -117              * will be a position on the path relative to the path length. if the value is greater that 1, if will be set
    -118              * to modulus 1.
    -119              * @param time a float with a value between zero and 1 inclusive both.
    -120              *
    -121              * @return {CAAT.Point}
    -122              */
    -123             getPosition:function (time) {
    -124             },
    -125 
    -126             /**
    -127              * Gets Path length.
    -128              * @return {number}
    -129              */
    -130             getLength:function () {
    -131                 return this.length;
    -132             },
    -133 
    -134             /**
    -135              * Gets the path bounding box (or the rectangle that contains the whole path).
    -136              * @param rectangle a CAAT.Rectangle instance with the bounding box.
    -137              * @return {CAAT.Rectangle}
    -138              */
    -139             getBoundingBox:function () {
    -140                 return this.bbox;
    -141             },
    -142 
    -143             /**
    -144              * Gets the number of control points needed to create the path.
    -145              * Each PathSegment type can have different control points.
    -146              * @return {number} an integer with the number of control points.
    -147              */
    -148             numControlPoints:function () {
    -149             },
    -150 
    -151             /**
    -152              * Gets CAAT.Point instance with the 2d position of a control point.
    -153              * @param index an integer indicating the desired control point coordinate.
    -154              * @return {CAAT.Point}
    -155              */
    -156             getControlPoint:function (index) {
    -157             },
    -158 
    -159             /**
    -160              * Instruments the path has finished building, and that no more segments will be added to it.
    -161              * You could later add more PathSegments and <code>endPath</code> must be called again.
    -162              */
    -163             endPath:function () {
    -164             },
    -165 
    -166             /**
    -167              * Gets a polyline describing the path contour. The contour will be defined by as mush as iSize segments.
    -168              * @param iSize an integer indicating the number of segments of the contour polyline.
    -169              *
    -170              * @return {[CAAT.Point]}
    -171              */
    -172             getContour:function (iSize) {
    -173             },
    -174 
    -175             /**
    -176              * Recalculate internal path structures.
    -177              */
    -178             updatePath:function (point) {
    -179             },
    -180 
    -181             /**
    -182              * Draw this path using RenderingContext2D drawing primitives.
    -183              * The intention is to set a path or pathsegment as a clipping region.
    -184              *
    -185              * @param ctx {RenderingContext2D}
    -186              */
    -187             applyAsPath:function (director) {
    -188             },
    -189 
    -190             /**
    -191              * Transform this path with the given affinetransform matrix.
    -192              * @param matrix
    -193              */
    -194             transform:function (matrix) {
    -195             },
    -196 
    -197             drawHandle:function (ctx, x, y) {
    -198 
    -199                 ctx.beginPath();
    -200                 ctx.arc(
    -201                     x,
    -202                     y,
    -203                     CAAT.Math.Curve.prototype.HANDLE_SIZE / 2,
    -204                     0,
    -205                     2 * Math.PI,
    -206                     false);
    -207                 ctx.fill();
    -208             }
    -209         }
    -210     }
    -211 
    -212 });
    -213 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_RectPath.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_RectPath.js.html deleted file mode 100644 index 5b08db4f..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_RectPath.js.html +++ /dev/null @@ -1,328 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name RectPath
    -  5      * @memberOf CAAT.PathUtil
    -  6      * @extends CAAT.PathUtil.PathSegment
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines:"CAAT.PathUtil.RectPath",
    - 11     depends:[
    - 12         "CAAT.PathUtil.PathSegment",
    - 13         "CAAT.Math.Point",
    - 14         "CAAT.Math.Rectangle"
    - 15     ],
    - 16     aliases:["CAAT.RectPath", "CAAT.ShapePath"],
    - 17     extendsClass:"CAAT.PathUtil.PathSegment",
    - 18     extendsWith:function () {
    - 19 
    - 20         return {
    - 21 
    - 22             /**
    - 23              * @lends CAAT.PathUtil.RectPath.prototype
    - 24              */
    - 25 
    - 26             __init:function () {
    - 27                 this.__super();
    - 28 
    - 29                 this.points = [];
    - 30                 this.points.push(new CAAT.Math.Point());
    - 31                 this.points.push(new CAAT.Math.Point());
    - 32                 this.points.push(new CAAT.Math.Point());
    - 33                 this.points.push(new CAAT.Math.Point());
    - 34                 this.points.push(new CAAT.Math.Point());
    - 35 
    - 36                 this.newPosition = new CAAT.Math.Point();
    - 37 
    - 38                 return this;
    - 39             },
    - 40 
    - 41             /**
    - 42              * A collection of Points.
    - 43              * @type {Array.<CAAT.Math.Point>}
    - 44              */
    - 45             points:null,
    - 46 
    - 47             /**
    - 48              * Traverse this path clockwise or counterclockwise (false).
    - 49              */
    - 50             cw:true,
    - 51 
    - 52             /**
    - 53              * spare point for calculations
    - 54              */
    - 55             newPosition:null,
    - 56 
    - 57             applyAsPath:function (director) {
    - 58                 var ctx = director.ctx;
    - 59 
    - 60                 if (this.cw) {
    - 61                     ctx.lineTo(this.points[0].x, this.points[0].y);
    - 62                     ctx.lineTo(this.points[1].x, this.points[1].y);
    - 63                     ctx.lineTo(this.points[2].x, this.points[2].y);
    - 64                     ctx.lineTo(this.points[3].x, this.points[3].y);
    - 65                     ctx.lineTo(this.points[4].x, this.points[4].y);
    - 66                 } else {
    - 67                     ctx.lineTo(this.points[4].x, this.points[4].y);
    - 68                     ctx.lineTo(this.points[3].x, this.points[3].y);
    - 69                     ctx.lineTo(this.points[2].x, this.points[2].y);
    - 70                     ctx.lineTo(this.points[1].x, this.points[1].y);
    - 71                     ctx.lineTo(this.points[0].x, this.points[0].y);
    - 72                 }
    - 73                 return this;
    - 74             },
    - 75             setPoint:function (point, index) {
    - 76                 if (index >= 0 && index < this.points.length) {
    - 77                     this.points[index] = point;
    - 78                 }
    - 79             },
    - 80             /**
    - 81              * An array of {CAAT.Point} composed of two points.
    - 82              * @param points {Array<CAAT.Point>}
    - 83              */
    - 84             setPoints:function (points) {
    - 85                 this.points = [];
    - 86                 this.points.push(points[0]);
    - 87                 this.points.push(new CAAT.Math.Point().set(points[1].x, points[0].y));
    - 88                 this.points.push(points[1]);
    - 89                 this.points.push(new CAAT.Math.Point().set(points[0].x, points[1].y));
    - 90                 this.points.push(points[0].clone());
    - 91                 this.updatePath();
    - 92 
    - 93                 return this;
    - 94             },
    - 95             setClockWise:function (cw) {
    - 96                 this.cw = cw !== undefined ? cw : true;
    - 97                 return this;
    - 98             },
    - 99             isClockWise:function () {
    -100                 return this.cw;
    -101             },
    -102             /**
    -103              * Set this path segment's starting position.
    -104              * This method should not be called again after setFinalPosition has been called.
    -105              * @param x {number}
    -106              * @param y {number}
    -107              */
    -108             setInitialPosition:function (x, y) {
    -109                 for (var i = 0, l = this.points.length; i < l; i++) {
    -110                     this.points[i].x = x;
    -111                     this.points[i].y = y;
    -112                 }
    -113                 return this;
    -114             },
    -115             /**
    -116              * Set a rectangle from points[0] to (finalX, finalY)
    -117              * @param finalX {number}
    -118              * @param finalY {number}
    -119              */
    -120             setFinalPosition:function (finalX, finalY) {
    -121                 this.points[2].x = finalX;
    -122                 this.points[2].y = finalY;
    -123 
    -124                 this.points[1].x = finalX;
    -125                 this.points[1].y = this.points[0].y;
    -126 
    -127                 this.points[3].x = this.points[0].x;
    -128                 this.points[3].y = finalY;
    -129 
    -130                 this.points[4].x = this.points[0].x;
    -131                 this.points[4].y = this.points[0].y;
    -132 
    -133                 this.updatePath();
    -134                 return this;
    -135             },
    -136             /**
    -137              * @inheritDoc
    -138              */
    -139             endCurvePosition:function () {
    -140                 return this.points[4];
    -141             },
    -142             /**
    -143              * @inheritsDoc
    -144              */
    -145             startCurvePosition:function () {
    -146                 return this.points[0];
    -147             },
    -148             /**
    -149              * @inheritsDoc
    -150              */
    -151             getPosition:function (time) {
    -152 
    -153                 if (time > 1 || time < 0) {
    -154                     time %= 1;
    -155                 }
    -156                 if (time < 0) {
    -157                     time = 1 + time;
    -158                 }
    -159 
    -160                 if (-1 === this.length) {
    -161                     this.newPosition.set(0, 0);
    -162                 } else {
    -163                     var w = this.bbox.width / this.length;
    -164                     var h = this.bbox.height / this.length;
    -165                     var accTime = 0;
    -166                     var times;
    -167                     var segments;
    -168                     var index = 0;
    -169 
    -170                     if (this.cw) {
    -171                         segments = [0, 1, 2, 3, 4];
    -172                         times = [w, h, w, h];
    -173                     } else {
    -174                         segments = [4, 3, 2, 1, 0];
    -175                         times = [h, w, h, w];
    -176                     }
    -177 
    -178                     while (index < times.length) {
    -179                         if (accTime + times[index] < time) {
    -180                             accTime += times[index];
    -181                             index++;
    -182                         } else {
    -183                             break;
    -184                         }
    -185                     }
    -186                     time -= accTime;
    -187 
    -188                     var p0 = segments[index];
    -189                     var p1 = segments[index + 1];
    -190 
    -191                     // index tiene el indice del segmento en tiempo.
    -192                     this.newPosition.set(
    -193                         (this.points[p0].x + (this.points[p1].x - this.points[p0].x) * time / times[index]),
    -194                         (this.points[p0].y + (this.points[p1].y - this.points[p0].y) * time / times[index]));
    -195                 }
    -196 
    -197                 return this.newPosition;
    -198             },
    -199             /**
    -200              * Returns initial path segment point's x coordinate.
    -201              * @return {number}
    -202              */
    -203             initialPositionX:function () {
    -204                 return this.points[0].x;
    -205             },
    -206             /**
    -207              * Returns final path segment point's x coordinate.
    -208              * @return {number}
    -209              */
    -210             finalPositionX:function () {
    -211                 return this.points[2].x;
    -212             },
    -213             /**
    -214              * Draws this path segment on screen. Optionally it can draw handles for every control point, in
    -215              * this case, start and ending path segment points.
    -216              * @param director {CAAT.Director}
    -217              * @param bDrawHandles {boolean}
    -218              */
    -219             paint:function (director, bDrawHandles) {
    -220 
    -221                 var ctx = director.ctx;
    -222 
    -223                 ctx.save();
    -224 
    -225                 ctx.strokeStyle = this.color;
    -226                 ctx.beginPath();
    -227                 ctx.strokeRect(
    -228                     this.bbox.x, this.bbox.y,
    -229                     this.bbox.width, this.bbox.height);
    -230 
    -231                 if (bDrawHandles) {
    -232                     ctx.globalAlpha = 0.5;
    -233                     ctx.fillStyle = '#7f7f00';
    -234 
    -235                     for (var i = 0; i < this.points.length; i++) {
    -236                         this.drawHandle(ctx, this.points[i].x, this.points[i].y);
    -237                     }
    -238 
    -239                 }
    -240 
    -241                 ctx.restore();
    -242             },
    -243             /**
    -244              * Get the number of control points. For this type of path segment, start and
    -245              * ending path segment points. Defaults to 2.
    -246              * @return {number}
    -247              */
    -248             numControlPoints:function () {
    -249                 return this.points.length;
    -250             },
    -251             /**
    -252              * @inheritsDoc
    -253              */
    -254             getControlPoint:function (index) {
    -255                 return this.points[index];
    -256             },
    -257             /**
    -258              * @inheritsDoc
    -259              */
    -260             getContour:function (/*iSize*/) {
    -261                 var contour = [];
    -262 
    -263                 for (var i = 0; i < this.points.length; i++) {
    -264                     contour.push(this.points[i]);
    -265                 }
    -266 
    -267                 return contour;
    -268             },
    -269             updatePath:function (point) {
    -270 
    -271                 if (point) {
    -272                     if (point === this.points[0]) {
    -273                         this.points[1].y = point.y;
    -274                         this.points[3].x = point.x;
    -275                     } else if (point === this.points[1]) {
    -276                         this.points[0].y = point.y;
    -277                         this.points[2].x = point.x;
    -278                     } else if (point === this.points[2]) {
    -279                         this.points[3].y = point.y;
    -280                         this.points[1].x = point.x;
    -281                     } else if (point === this.points[3]) {
    -282                         this.points[0].x = point.x;
    -283                         this.points[2].y = point.y;
    -284                     }
    -285                     this.points[4].x = this.points[0].x;
    -286                     this.points[4].y = this.points[0].y;
    -287                 }
    -288 
    -289                 this.bbox.setEmpty();
    -290 
    -291                 for (var i = 0; i < 4; i++) {
    -292                     this.bbox.union(this.points[i].x, this.points[i].y);
    -293                 }
    -294 
    -295                 this.length = 2 * this.bbox.width + 2 * this.bbox.height;
    -296 
    -297                 this.points[0].x = this.bbox.x;
    -298                 this.points[0].y = this.bbox.y;
    -299 
    -300                 this.points[1].x = this.bbox.x + this.bbox.width;
    -301                 this.points[1].y = this.bbox.y;
    -302 
    -303                 this.points[2].x = this.bbox.x + this.bbox.width;
    -304                 this.points[2].y = this.bbox.y + this.bbox.height;
    -305 
    -306                 this.points[3].x = this.bbox.x;
    -307                 this.points[3].y = this.bbox.y + this.bbox.height;
    -308 
    -309                 this.points[4].x = this.bbox.x;
    -310                 this.points[4].y = this.bbox.y;
    -311 
    -312                 return this;
    -313             },
    -314 
    -315             getPositionFromLength:function (iLength) {
    -316                 return this.getPosition(iLength / (this.bbox.width * 2 + this.bbox.height * 2));
    -317             }
    -318         }
    -319     }
    -320 });
    -321 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_SVGPath.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_SVGPath.js.html deleted file mode 100644 index e3853808..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_SVGPath.js.html +++ /dev/null @@ -1,493 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * <p>
    -  5      * This class is a SVG Path parser.
    -  6      * By calling the method parsePath( svgpath ) an instance of CAAT.PathUtil.Path will be built by parsing
    -  7      * its contents.
    -  8      *
    -  9      * <p>
    - 10      * See <a href="../../demos/demo32/svgpath.html">demo32</a>
    - 11      *
    - 12      * @name SVGPath
    - 13      * @memberOf CAAT.PathUtil
    - 14      * @constructor
    - 15      */
    - 16 
    - 17     defines:"CAAT.PathUtil.SVGPath",
    - 18     depends:[
    - 19         "CAAT.PathUtil.Path"
    - 20     ],
    - 21     extendsWith:function () {
    - 22 
    - 23         var OK = 0;
    - 24         var EOF = 1;
    - 25         var NAN = 2;
    - 26 
    - 27         function error(pathInfo, c) {
    - 28             var cpos = c;
    - 29             if (cpos < 0) {
    - 30                 cpos = 0;
    - 31             }
    - 32             console.log("parse error near ..." + pathInfo.substr(cpos, 20));
    - 33         }
    - 34 
    - 35         return {
    - 36 
    - 37             /**
    - 38              * @lends CAAT.PathUtil.SVGPath.prototype
    - 39              */
    - 40 
    - 41 
    - 42             __init:function () {
    - 43 
    - 44             },
    - 45 
    - 46             /**
    - 47              * @private
    - 48              */
    - 49             c:0,
    - 50 
    - 51             /**
    - 52              * @private
    - 53              */
    - 54             bezierInfo:null,
    - 55 
    - 56             __skipBlank:function (pathInfo, c) {
    - 57                 var p = pathInfo.charAt(c);
    - 58                 while (c < pathInfo.length && (p == ' ' || p == '\n' || p == '\t' || p == ',')) {
    - 59                     ++c;
    - 60                     var p = pathInfo.charAt(c);
    - 61                 }
    - 62 
    - 63                 return c;
    - 64             },
    - 65 
    - 66             __maybeNumber:function (pathInfo, c) {
    - 67 
    - 68                 if (c < pathInfo.length - 2) {
    - 69 
    - 70                     var p = pathInfo.charAt(c);
    - 71                     var p1 = pathInfo.charAt(c + 1);
    - 72 
    - 73                     return  p == '-' ||
    - 74                         this.__isDigit(p) ||
    - 75                         (p === "." && this.__isDigit(p1) );
    - 76                 }
    - 77 
    - 78                 return false;
    - 79             },
    - 80 
    - 81             __isDigit:function (c) {
    - 82                 return c >= "0" && c <= "9";
    - 83             },
    - 84 
    - 85 
    - 86             __getNumber:function (pathInfo, c, v, error) {
    - 87                 c = this.__skipBlank(pathInfo, c);
    - 88                 if (c < pathInfo.length) {
    - 89                     var nc = this.__findNumber(pathInfo, c);
    - 90                     if (nc !== -1) {
    - 91                         v.push(parseFloat(pathInfo.substr(c, nc)));
    - 92                         c = this.__skipBlank(pathInfo, nc);
    - 93                         error.pos = c;
    - 94                         error.result = OK;
    - 95                         return;
    - 96                     } else {
    - 97                         error.result = NAN;
    - 98                         return;
    - 99                     }
    -100                 }
    -101 
    -102                 error.result = EOF;
    -103             },
    -104 
    -105             ____getNumbers:function (pathInfo, c, v, n, error) {
    -106 
    -107                 for (var i = 0; i < n; i++) {
    -108                     this.__getNumber(pathInfo, c, v, error);
    -109                     if (error.result != OK) {
    -110                         break;
    -111                     } else {
    -112                         c = error.pos;
    -113                     }
    -114                 }
    -115 
    -116                 return c;
    -117             },
    -118 
    -119 
    -120             __findNumber:function (pathInfo, c) {
    -121 
    -122                 var p;
    -123 
    -124                 if ((p = pathInfo.charAt(c)) == '-') {
    -125                     ++c;
    -126                 }
    -127 
    -128                 if (!this.__isDigit((p = pathInfo.charAt(c)))) {
    -129                     if ((p = pathInfo.charAt(c)) != '.' || !this.__isDigit(pathInfo.charAt(c + 1))) {
    -130                         return -1;
    -131                     }
    -132                 }
    -133 
    -134                 while (this.__isDigit((p = pathInfo.charAt(c)))) {
    -135                     ++c;
    -136                 }
    -137 
    -138                 if ((p = pathInfo.charAt(c)) == '.') {
    -139                     ++c;
    -140                     if (!this.__isDigit((p = pathInfo.charAt(c)))) {   // asumo un numero [d+]\. como valido.
    -141                         return c;
    -142                     }
    -143                     while (this.__isDigit((p = pathInfo.charAt(c)))) {
    -144                         ++c;
    -145                     }
    -146                 }
    -147 
    -148                 return c;
    -149             },
    -150 
    -151             __parseMoveTo:function (pathInfo, c, absolute, path, error) {
    -152 
    -153                 var numbers = [];
    -154 
    -155                 c = this.____getNumbers(pathInfo, c, numbers, 2, error);
    -156 
    -157                 if (error.result === OK) {
    -158                     if (!absolute) {
    -159                         numbers[0] += path.trackPathX;
    -160                         numbers[1] += path.trackPathY;
    -161                     }
    -162                     path.beginPath(numbers[0], numbers[1]);
    -163                 } else {
    -164                     return;
    -165                 }
    -166 
    -167                 if (this.__maybeNumber(pathInfo, c)) {
    -168                     c = this.parseLine(pathInfo, c, absolute, path, error);
    -169                 }
    -170 
    -171                 error.pos = c;
    -172             },
    -173 
    -174             __parseLine:function (pathInfo, c, absolute, path, error) {
    -175 
    -176                 var numbers = [];
    -177 
    -178                 do {
    -179                     c = this.____getNumbers(pathInfo, c, numbers, 2, error);
    -180                     if (!absolute) {
    -181                         numbers[0] += path.trackPathX;
    -182                         numbers[1] += path.trackPathY;
    -183                     }
    -184                     path.addLineTo(numbers[0], numbers[1]);
    -185 
    -186                 } while (this.__maybeNumber(pathInfo, c));
    -187 
    -188                 error.pos = c;
    -189             },
    -190 
    -191 
    -192             __parseLineH:function (pathInfo, c, absolute, path, error) {
    -193 
    -194                 var numbers = [];
    -195 
    -196                 do {
    -197                     c = this.____getNumbers(pathInfo, c, numbers, 1, error);
    -198 
    -199                     if (!absolute) {
    -200                         numbers[0] += path.trackPathX;
    -201                     }
    -202                     numbers[1].push(path.trackPathY);
    -203 
    -204                     path.addLineTo(numbers[0], numbers[1]);
    -205 
    -206                 } while (this.__maybeNumber(pathInfo, c));
    -207 
    -208                 error.pos = c;
    -209             },
    -210 
    -211             __parseLineV:function (pathInfo, c, absolute, path, error) {
    -212 
    -213                 var numbers = [ path.trackPathX ];
    -214 
    -215                 do {
    -216                     c = this.____getNumbers(pathInfo, c, numbers, 1, error);
    -217 
    -218                     if (!absolute) {
    -219                         numbers[1] += path.trackPathY;
    -220                     }
    -221 
    -222                     path.addLineTo(numbers[0], numbers[1]);
    -223 
    -224                 } while (this.__maybeNumber(pathInfo, c));
    -225 
    -226                 error.pos = c;
    -227             },
    -228 
    -229             __parseCubic:function (pathInfo, c, absolute, path, error) {
    -230 
    -231                 var v = [];
    -232 
    -233                 do {
    -234                     c = this.____getNumbers(pathInfo, c, v, 6, error);
    -235                     if (error.result === OK) {
    -236                         if (!absolute) {
    -237                             v[0] += path.trackPathX;
    -238                             v[1] += path.trackPathY;
    -239                             v[2] += path.trackPathX;
    -240                             v[3] += path.trackPathY;
    -241                             v[4] += path.trackPathX;
    -242                             v[5] += path.trackPathY;
    -243                         }
    -244 
    -245                         path.addCubicTo(v[0], v[1], v[2], v[3], v[4], v[5]);
    -246 
    -247 
    -248                         v.shift();
    -249                         v.shift();
    -250                         this.bezierInfo = v;
    -251 
    -252                     } else {
    -253                         return;
    -254                     }
    -255                 } while (this.__maybeNumber(pathInfo, c));
    -256 
    -257                 error.pos = c;
    -258             },
    -259 
    -260             __parseCubicS:function (pathInfo, c, absolute, path, error) {
    -261 
    -262                 var v = [];
    -263 
    -264                 do {
    -265                     c = this.____getNumbers(pathInfo, c, v, 4, error);
    -266                     if (error.result == OK) {
    -267                         if (!absolute) {
    -268 
    -269                             v[0] += path.trackPathX;
    -270                             v[1] += path.trackPathY;
    -271                             v[2] += path.trackPathX;
    -272                             v[3] += path.trackPathY;
    -273                         }
    -274 
    -275                         var x, y;
    -276 
    -277                         x = this.bezierInfo[2] + (this.bezierInfo[2] - this.bezierInfo[0]);
    -278                         y = this.bezierInfo[3] + (this.bezierInfo[3] - this.bezierInfo[1]);
    -279 
    -280                         path.addCubicTo(x, y, v[0], v[1], v[2], v[3]);
    -281 
    -282                         this.bezierInfo = v;
    -283 
    -284                     } else {
    -285                         return;
    -286                     }
    -287                 } while (this.__maybeNumber(c));
    -288 
    -289                 error.pos = c;
    -290             },
    -291 
    -292             __parseQuadricS:function (pathInfo, c, absolute, path, error) {
    -293 
    -294                 var v = [];
    -295 
    -296                 do {
    -297                     c = this.____getNumbers(pathInfo, c, v, 4, error);
    -298                     if (error.result === OK) {
    -299 
    -300                         if (!absolute) {
    -301 
    -302                             v[0] += path.trackPathX;
    -303                             v[1] += path.trackPathY;
    -304                         }
    -305 
    -306                         var x, y;
    -307 
    -308                         x = this.bezierInfo[2] + (this.bezierInfo[2] - this.bezierInfo[0]);
    -309                         y = this.bezierInfo[3] + (this.bezierInfo[3] - this.bezierInfo[1]);
    -310 
    -311                         path.addQuadricTo(x, y, v[0], v[1]);
    -312 
    -313                         this.bezierInfo = [];
    -314                         bezierInfo.push(x);
    -315                         bezierInfo.push(y);
    -316                         bezierInfo.push(v[0]);
    -317                         bezierInfo.push(v[1]);
    -318 
    -319 
    -320                     } else {
    -321                         return;
    -322                     }
    -323                 } while (this.__maybeNumber(c));
    -324 
    -325                 error.pos = c;
    -326             },
    -327 
    -328 
    -329             __parseQuadric:function (pathInfo, c, absolute, path, error) {
    -330 
    -331                 var v = [];
    -332 
    -333                 do {
    -334                     c = this.____getNumbers(pathInfo, c, v, 4, error);
    -335                     if (error.result === OK) {
    -336                         if (!absolute) {
    -337 
    -338                             v[0] += path.trackPathX;
    -339                             v[1] += path.trackPathY;
    -340                             v[2] += path.trackPathX;
    -341                             v[3] += path.trackPathY;
    -342                         }
    -343 
    -344                         path.addQuadricTo(v[0], v[1], v[2], v[3]);
    -345 
    -346                         this.bezierInfo = v;
    -347                     } else {
    -348                         return;
    -349                     }
    -350                 } while (this.__maybeNumber(c));
    -351 
    -352                 error.pos = c;
    -353             },
    -354 
    -355             __parseClosePath:function (pathInfo, c, path, error) {
    -356 
    -357                 path.closePath();
    -358                 error.pos= c;
    -359 
    -360             },
    -361 
    -362             /**
    -363              * This method will create a CAAT.PathUtil.Path object with as many contours as needed.
    -364              * @param pathInfo {string} a SVG path
    -365              * @return Array.<CAAT.PathUtil.Path>
    -366              */
    -367             parsePath:function (pathInfo) {
    -368 
    -369                 this.c = 0;
    -370                 this.contours= [];
    -371 
    -372                 var path = new CAAT.PathUtil.Path();
    -373                 this.contours.push( path );
    -374 
    -375                 this.c = this.__skipBlank(pathInfo, this.c);
    -376                 if (this.c === pathInfo.length) {
    -377                     return path;
    -378                 }
    -379 
    -380                 var ret = {
    -381                     pos:0,
    -382                     result:0
    -383                 }
    -384 
    -385                 while (this.c != pathInfo.length) {
    -386                     var segment = pathInfo.charAt(this.c);
    -387                     switch (segment) {
    -388                         case 'm':
    -389                             this.__parseMoveTo(pathInfo, this.c + 1, false, path, ret);
    -390                             break;
    -391                         case 'M':
    -392                             this.__parseMoveTo(pathInfo, this.c + 1, true, path, ret);
    -393                             break;
    -394                         case 'c':
    -395                             this.__parseCubic(pathInfo, this.c + 1, false, path, ret);
    -396                             break;
    -397                         case 'C':
    -398                             this.__parseCubic(pathInfo, this.c + 1, true, path, ret);
    -399                             break;
    -400                         case 's':
    -401                             this.__parseCubicS(pathInfo, this.c + 1, false, path, ret);
    -402                             break;
    -403                         case 'S':
    -404                             this.__parseCubicS(pathInfo, this.c + 1, true, path, ret);
    -405                             break;
    -406                         case 'q':
    -407                             this.__parseQuadric(pathInfo, this.c + 1, false, path, ret);
    -408                             break;
    -409                         case 'Q':
    -410                             this.__parseQuadricS(pathInfo, this.c + 1, true, path, ret);
    -411                             break;
    -412                         case 't':
    -413                             this.__parseQuadricS(pathInfo, this.c + 1, false, path, ret);
    -414                             break;
    -415                         case 'T':
    -416                             this.__parseQuadric(pathInfo, this.c + 1, true, path, ret);
    -417                             break;
    -418                         case 'l':
    -419                             this.__parseLine(pathInfo, this.c + 1, false, path, ret);
    -420                             break;
    -421                         case 'L':
    -422                             this.__parseLine(pathInfo, this.c + 1, true, path, ret);
    -423                             break;
    -424                         case 'h':
    -425                             this.__parseLineH(pathInfo, this.c + 1, false, path, ret);
    -426                             break;
    -427                         case 'H':
    -428                             this.__parseLineH(pathInfo, this.c + 1, true, path, ret);
    -429                             break;
    -430                         case 'v':
    -431                             this.__parseLineV(pathInfo, this.c + 1, false, path, ret);
    -432                             break;
    -433                         case 'V':
    -434                             this.__parseLineV(pathInfo, this.c + 1, true, path, ret);
    -435                             break;
    -436                         case 'z':
    -437                         case 'Z':
    -438                             this.__parseClosePath(pathInfo, this.c + 1, path, ret);
    -439                             path= new CAAT.PathUtil.Path();
    -440                             this.contours.push( path );
    -441                             break;
    -442                         case 0:
    -443                             break;
    -444                         default:
    -445                             error(pathInfo, this.c);
    -446                             break;
    -447                     }
    -448 
    -449                     if (ret.result != OK) {
    -450                         error(pathInfo, this.c);
    -451                         break;
    -452                     } else {
    -453                         this.c = ret.pos;
    -454                     }
    -455 
    -456                 } // while
    -457 
    -458                 var count= 0;
    -459                 var fpath= null;
    -460                 for( var i=0; i<this.contours.length; i++ ) {
    -461                     if ( !this.contours[i].isEmpty() ) {
    -462                         fpath= this.contours[i];
    -463                         if ( !fpath.closed ) {
    -464                             fpath.endPath();
    -465                         }
    -466                         count++;
    -467                     }
    -468                 }
    -469 
    -470                 if ( count===1 ) {
    -471                     return fpath;
    -472                 }
    -473 
    -474                 path= new CAAT.PathUtil.Path();
    -475                 for( var i=0; i<this.contours.length; i++ ) {
    -476                     if ( !this.contours[i].isEmpty() ) {
    -477                         path.addSegment( this.contours[i] );
    -478                     }
    -479                 }
    -480                 return path.endPath();
    -481 
    -482             }
    -483 
    -484         }
    -485     }
    -486 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_ColorProgram.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_ColorProgram.js.html deleted file mode 100644 index a56daec6..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_ColorProgram.js.html +++ /dev/null @@ -1,121 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name ColorProgram
    -  5      * @memberOf CAAT.WebGL
    -  6      * @extends CAAT.WebGL.Program
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.WebGL.ColorProgram",
    - 11     aliases : ["CAAT.ColorProgram"],
    - 12     extendsClass : "CAAT.WebGL.Program",
    - 13     depends : [
    - 14         "CAAT.WebGL.Program"
    - 15     ],
    - 16     extendsWith : {
    - 17 
    - 18         /**
    - 19          * @lends CAAT.WebGL.ColorProgram.prototype
    - 20          */
    - 21 
    - 22 
    - 23         __init : function(gl) {
    - 24             this.__super(gl);
    - 25             return this;
    - 26         },
    - 27 
    - 28         /**
    - 29          * int32 Array for color Buffer
    - 30          */
    - 31         colorBuffer:    null,
    - 32 
    - 33         /**
    - 34          * GLBuffer for vertex buffer.
    - 35          */
    - 36         vertexPositionBuffer:   null,
    - 37 
    - 38         /**
    - 39          * Float32 Array for vertex buffer.
    - 40          */
    - 41         vertexPositionArray:    null,
    - 42 
    - 43         getFragmentShader : function() {
    - 44             return this.getShader(this.gl, "x-shader/x-fragment",
    - 45                     "#ifdef GL_ES \n"+
    - 46                     "precision highp float; \n"+
    - 47                     "#endif \n"+
    - 48 
    - 49                     "varying vec4 color; \n"+
    - 50                             
    - 51                     "void main(void) { \n"+
    - 52                     "  gl_FragColor = color;\n"+
    - 53                     "}\n"
    - 54                     );
    - 55 
    - 56         },
    - 57         getVertexShader : function() {
    - 58             return this.getShader(this.gl, "x-shader/x-vertex",
    - 59                     "attribute vec3 aVertexPosition; \n"+
    - 60                     "attribute vec4 aColor; \n"+
    - 61                     "uniform mat4 uPMatrix; \n"+
    - 62                     "varying vec4 color; \n"+
    - 63 
    - 64                     "void main(void) { \n"+
    - 65                     "gl_Position = uPMatrix * vec4(aVertexPosition, 1.0); \n"+
    - 66                     "color= aColor; \n"+
    - 67                     "}\n"
    - 68                     );
    - 69         },
    - 70         initialize : function() {
    - 71             this.shaderProgram.vertexPositionAttribute =
    - 72                     this.gl.getAttribLocation(this.shaderProgram, "aVertexPosition");
    - 73             this.gl.enableVertexAttribArray(
    - 74                     this.shaderProgram.vertexPositionAttribute);
    - 75 
    - 76             this.shaderProgram.vertexColorAttribute =
    - 77                     this.gl.getAttribLocation(this.shaderProgram, "aColor");
    - 78             this.gl.enableVertexAttribArray(
    - 79                     this.shaderProgram.vertexColorAttribute);
    - 80 
    - 81             this.shaderProgram.pMatrixUniform =
    - 82                     this.gl.getUniformLocation(this.shaderProgram, "uPMatrix");
    - 83 
    - 84             this.useProgram();
    - 85 
    - 86             this.colorBuffer= this.gl.createBuffer();
    - 87             this.setColor( [1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1] );
    - 88 
    - 89             var maxTris=512, i;
    - 90             /// set vertex data
    - 91             this.vertexPositionBuffer = this.gl.createBuffer();
    - 92             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexPositionBuffer );
    - 93             this.vertexPositionArray= new Float32Array(maxTris*12);
    - 94             this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertexPositionArray, this.gl.DYNAMIC_DRAW);
    - 95             this.gl.vertexAttribPointer(this.shaderProgram.vertexPositionAttribute, 3, this.gl.FLOAT, false, 0, 0);
    - 96 
    - 97             return CAAT.ColorProgram.superclass.initialize.call(this);
    - 98         },
    - 99         setColor : function( colorArray ) {
    -100             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.colorBuffer );
    -101             this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(colorArray), this.gl.STATIC_DRAW);
    -102 
    -103             this.gl.vertexAttribPointer(
    -104                     this.shaderProgram.vertexColorAttribute,
    -105                     this.colorBuffer,
    -106                     this.gl.FLOAT,
    -107                     false,
    -108                     0,
    -109                     0);
    -110         }
    -111     }
    -112 
    -113 });
    -114 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_Program.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_Program.js.html deleted file mode 100644 index b4540612..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_Program.js.html +++ /dev/null @@ -1,144 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  */
    -  4 
    -  5 CAAT.Module( {
    -  6 
    -  7 
    -  8     /**
    -  9      * @name WebGL
    - 10      * @memberOf CAAT
    - 11      * @namespace
    - 12      */
    - 13 
    - 14     /**
    - 15      * @name Program
    - 16      * @memberOf CAAT.WebGL
    - 17      * @constructor
    - 18      */
    - 19 
    - 20 
    - 21     defines : "CAAT.WebGL.Program",
    - 22     extendsWith : {
    - 23 
    - 24         /**
    - 25          * @lends CAAT.WebGL.Program.prototype
    - 26          */
    - 27 
    - 28         __init : function(gl) {
    - 29             this.gl= gl;
    - 30             return this;
    - 31         },
    - 32 
    - 33         /**
    - 34          *
    - 35          */
    - 36         shaderProgram:  null,
    - 37 
    - 38         /**
    - 39          * Canvas 3D context.
    - 40          */
    - 41         gl:             null,
    - 42 
    - 43         /**
    - 44          * Set fragment shader's alpha composite value.
    - 45          * @param alpha {number} float value 0..1.
    - 46          */
    - 47         setAlpha : function( alpha ) {
    - 48 
    - 49         },
    - 50         getShader : function (gl,type,str) {
    - 51             var shader;
    - 52             if (type === "x-shader/x-fragment") {
    - 53                 shader = gl.createShader(gl.FRAGMENT_SHADER);
    - 54             } else if (type === "x-shader/x-vertex") {
    - 55                 shader = gl.createShader(gl.VERTEX_SHADER);
    - 56             } else {
    - 57                 return null;
    - 58             }
    - 59 
    - 60             gl.shaderSource(shader, str);
    - 61             gl.compileShader(shader);
    - 62 
    - 63             if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
    - 64                 alert(gl.getShaderInfoLog(shader));
    - 65                 return null;
    - 66             }
    - 67 
    - 68             return shader;
    - 69 
    - 70         },
    - 71         getDomShader : function(gl, id) {
    - 72             var shaderScript = document.getElementById(id);
    - 73             if (!shaderScript) {
    - 74                 return null;
    - 75             }
    - 76 
    - 77             var str = "";
    - 78             var k = shaderScript.firstChild;
    - 79             while (k) {
    - 80                 if (k.nodeType === 3) {
    - 81                     str += k.textContent;
    - 82                 }
    - 83                 k = k.nextSibling;
    - 84             }
    - 85 
    - 86             var shader;
    - 87             if (shaderScript.type === "x-shader/x-fragment") {
    - 88                 shader = gl.createShader(gl.FRAGMENT_SHADER);
    - 89             } else if (shaderScript.type === "x-shader/x-vertex") {
    - 90                 shader = gl.createShader(gl.VERTEX_SHADER);
    - 91             } else {
    - 92                 return null;
    - 93             }
    - 94 
    - 95             gl.shaderSource(shader, str);
    - 96             gl.compileShader(shader);
    - 97 
    - 98             if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
    - 99                 alert(gl.getShaderInfoLog(shader));
    -100                 return null;
    -101             }
    -102 
    -103             return shader;
    -104         },
    -105         initialize : function() {
    -106             return this;
    -107         },
    -108         getFragmentShader : function() {
    -109             return null;
    -110         },
    -111         getVertexShader : function() {
    -112             return null;
    -113         },
    -114         create : function() {
    -115             var gl= this.gl;
    -116 
    -117             this.shaderProgram = gl.createProgram();
    -118             gl.attachShader(this.shaderProgram, this.getVertexShader());
    -119             gl.attachShader(this.shaderProgram, this.getFragmentShader());
    -120             gl.linkProgram(this.shaderProgram);
    -121             gl.useProgram(this.shaderProgram);
    -122             return this;
    -123         },
    -124         setMatrixUniform : function( caatMatrix4 ) {
    -125             this.gl.uniformMatrix4fv(
    -126                     this.shaderProgram.pMatrixUniform,
    -127                     false,
    -128                     new Float32Array(caatMatrix4.flatten()));
    -129 
    -130         },
    -131         useProgram : function() {
    -132             this.gl.useProgram(this.shaderProgram);
    -133             return this;
    -134         }
    -135     }
    -136 });
    -137 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_TextureProgram.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_TextureProgram.js.html deleted file mode 100644 index d1fed22f..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_TextureProgram.js.html +++ /dev/null @@ -1,309 +0,0 @@ -
      1 CAAT.Module( {
    -  2 
    -  3     /**
    -  4      * @name TextureProgram
    -  5      * @memberOf CAAT.WebGL
    -  6      * @extends CAAT.WebGL.Program
    -  7      * @constructor
    -  8      */
    -  9 
    - 10     defines : "CAAT.WebGL.TextureProgram",
    - 11     aliases : ["CAAT.TextureProgram"],
    - 12     extendsClass : "CAAT.WebGL.Program",
    - 13     depends : [
    - 14         "CAAT.WebGL.Program"
    - 15     ],
    - 16     extendsWith : {
    - 17 
    - 18         /**
    - 19          * @lends CAAT.WebGL.TextureProgram.prototype
    - 20          */
    - 21 
    - 22         __init : function(gl) {
    - 23             this.__super(gl);
    - 24             return this;
    - 25         },
    - 26 
    - 27         /**
    - 28          * VertextBuffer GLBuffer
    - 29          */
    - 30         vertexPositionBuffer:   null,
    - 31 
    - 32         /**
    - 33          * VertextBuffer Float32 Array
    - 34          */
    - 35         vertexPositionArray:    null,
    - 36 
    - 37         /**
    - 38          * UVBuffer GLBuffer
    - 39          */
    - 40         vertexUVBuffer:         null,
    - 41 
    - 42         /**
    - 43          * VertexBuffer Float32 Array
    - 44          */
    - 45         vertexUVArray:          null,
    - 46 
    - 47         /**
    - 48          * VertexIndex GLBuffer.
    - 49          */
    - 50         vertexIndexBuffer:      null,
    - 51 
    - 52         /**
    - 53          * Lines GLBuffer
    - 54          */
    - 55         linesBuffer:            null,
    - 56 
    - 57         /**
    - 58          *
    - 59          */
    - 60         prevAlpha:              -1,
    - 61 
    - 62         /**
    - 63          *
    - 64          */
    - 65         prevR:                  -1,
    - 66 
    - 67         /**
    - 68          *
    - 69          */
    - 70         prevG:                  -1,
    - 71 
    - 72         /**
    - 73          *
    - 74          */
    - 75         prevB:                  -1,
    - 76 
    - 77         /**
    - 78          *
    - 79          */
    - 80         prevA:                  -1,
    - 81 
    - 82         /**
    - 83          *
    - 84          */
    - 85         prevTexture:            null,
    - 86 
    - 87         getFragmentShader : function() {
    - 88             return this.getShader( this.gl, "x-shader/x-fragment",
    - 89                     "#ifdef GL_ES \n"+
    - 90                     "precision highp float; \n"+
    - 91                     "#endif \n"+
    - 92 
    - 93                     "varying vec2 vTextureCoord; \n"+
    - 94                     "uniform sampler2D uSampler; \n"+
    - 95                     "uniform float alpha; \n"+
    - 96                     "uniform bool uUseColor;\n"+
    - 97                     "uniform vec4 uColor;\n"+
    - 98 
    - 99                     "void main(void) { \n"+
    -100 
    -101                     "if ( uUseColor ) {\n"+
    -102                     "  gl_FragColor= vec4(uColor.r*alpha, uColor.g*alpha, uColor.b*alpha, uColor.a*alpha);\n"+
    -103                     "} else { \n"+
    -104                     "  vec4 textureColor= texture2D(uSampler, vec2(vTextureCoord)); \n"+
    -105 // Fix FF   "  gl_FragColor = vec4(textureColor.rgb, textureColor.a * alpha); \n"+
    -106                     "  gl_FragColor = vec4(textureColor.r*alpha, textureColor.g*alpha, textureColor.b*alpha, textureColor.a * alpha ); \n"+
    -107                     "}\n"+
    -108 
    -109                     "}\n"
    -110                     );
    -111         },
    -112         getVertexShader : function() {
    -113             return this.getShader(this.gl, "x-shader/x-vertex",
    -114                     "attribute vec3 aVertexPosition; \n"+
    -115                     "attribute vec2 aTextureCoord; \n"+
    -116 
    -117                     "uniform mat4 uPMatrix; \n"+
    -118 
    -119                     "varying vec2 vTextureCoord; \n"+
    -120 
    -121                     "void main(void) { \n"+
    -122                     "gl_Position = uPMatrix * vec4(aVertexPosition, 1.0); \n"+
    -123                     "vTextureCoord = aTextureCoord;\n"+
    -124                     "}\n"
    -125                     );
    -126         },
    -127         useProgram : function() {
    -128             CAAT.TextureProgram.superclass.useProgram.call(this);
    -129 
    -130             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexPositionBuffer );
    -131             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexUVBuffer);
    -132             this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.vertexIndexBuffer);
    -133         },
    -134         initialize : function() {
    -135 
    -136             var i;
    -137 
    -138             this.linesBuffer= this.gl.createBuffer();
    -139             this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.linesBuffer );
    -140             var arr= [];
    -141             for( i=0; i<1024; i++ ) {
    -142                 arr[i]= i;
    -143             }
    -144             this.linesBufferArray= new Uint16Array(arr);
    -145             this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, this.linesBufferArray, this.gl.DYNAMIC_DRAW);
    -146 
    -147 
    -148             this.shaderProgram.vertexPositionAttribute =
    -149                     this.gl.getAttribLocation(this.shaderProgram, "aVertexPosition");
    -150             this.gl.enableVertexAttribArray(
    -151                     this.shaderProgram.vertexPositionAttribute);
    -152 
    -153             this.shaderProgram.textureCoordAttribute =
    -154                     this.gl.getAttribLocation(this.shaderProgram, "aTextureCoord");
    -155             this.gl.enableVertexAttribArray(
    -156                     this.shaderProgram.textureCoordAttribute);
    -157 
    -158             this.shaderProgram.pMatrixUniform =
    -159                     this.gl.getUniformLocation(this.shaderProgram, "uPMatrix");
    -160             this.shaderProgram.samplerUniform =
    -161                     this.gl.getUniformLocation(this.shaderProgram, "uSampler");
    -162             this.shaderProgram.alphaUniform   =
    -163                     this.gl.getUniformLocation(this.shaderProgram, "alpha");
    -164             this.shaderProgram.useColor =
    -165                     this.gl.getUniformLocation(this.shaderProgram, "uUseColor");
    -166             this.shaderProgram.color =
    -167                     this.gl.getUniformLocation(this.shaderProgram, "uColor");
    -168 
    -169             this.setAlpha(1);
    -170             this.setUseColor(false);
    -171 
    -172             var maxTris=4096;
    -173             /// set vertex data
    -174             this.vertexPositionBuffer = this.gl.createBuffer();
    -175             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexPositionBuffer );
    -176             this.vertexPositionArray= new Float32Array(maxTris*12);
    -177             this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertexPositionArray, this.gl.DYNAMIC_DRAW);
    -178             this.gl.vertexAttribPointer(this.shaderProgram.vertexPositionAttribute, 3, this.gl.FLOAT, false, 0, 0);
    -179 
    -180             // uv info
    -181             this.vertexUVBuffer= this.gl.createBuffer();
    -182             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexUVBuffer);
    -183             this.vertexUVArray= new Float32Array(maxTris*8);
    -184             this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertexUVArray, this.gl.DYNAMIC_DRAW);
    -185             this.gl.vertexAttribPointer(this.shaderProgram.textureCoordAttribute, 2, this.gl.FLOAT, false, 0, 0);
    -186 
    -187             // vertex index
    -188             this.vertexIndexBuffer = this.gl.createBuffer();
    -189             this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.vertexIndexBuffer);            
    -190             var vertexIndex = [];
    -191             for( i=0; i<maxTris; i++ ) {
    -192                 vertexIndex.push(0 + i*4); vertexIndex.push(1 + i*4); vertexIndex.push(2 + i*4);
    -193                 vertexIndex.push(0 + i*4); vertexIndex.push(2 + i*4); vertexIndex.push(3 + i*4);
    -194             }
    -195             this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vertexIndex), this.gl.DYNAMIC_DRAW);
    -196 
    -197             return CAAT.TextureProgram.superclass.initialize.call(this);
    -198         },
    -199         setUseColor : function( use,r,g,b,a ) {
    -200             this.gl.uniform1i(this.shaderProgram.useColor, use?1:0);
    -201             if ( use ) {
    -202                 if ( this.prevA!==a || this.prevR!==r || this.prevG!==g || this.prevB!==b ) {
    -203                     this.gl.uniform4f(this.shaderProgram.color, r,g,b,a );
    -204                     this.prevA= a;
    -205                     this.prevR= r;
    -206                     this.prevG= g;
    -207                     this.prevB= b;
    -208                 }
    -209             }
    -210         },
    -211         setTexture : function( glTexture ) {
    -212             if ( this.prevTexture!==glTexture ) {
    -213                 var gl= this.gl;
    -214 
    -215                 gl.activeTexture(gl.TEXTURE0);
    -216                 gl.bindTexture(gl.TEXTURE_2D, glTexture);
    -217                 gl.uniform1i(this.shaderProgram.samplerUniform, 0);
    -218 
    -219                 this.prevTexture= glTexture;
    -220             }
    -221 
    -222             return this;
    -223         },
    -224         updateVertexBuffer : function(vertexArray) {
    -225             var gl= this.gl;
    -226             gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexPositionBuffer );
    -227             gl.bufferSubData(gl.ARRAY_BUFFER, 0, vertexArray);
    -228             return this;
    -229         },
    -230         updateUVBuffer : function(uvArray) {
    -231             var gl= this.gl;
    -232             gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexUVBuffer );
    -233             gl.bufferSubData(gl.ARRAY_BUFFER, 0, uvArray);
    -234             return this;
    -235         },
    -236         setAlpha : function(alpha) {
    -237             if ( this.prevAlpha !== alpha ) {
    -238                 this.gl.uniform1f(
    -239                     this.shaderProgram.alphaUniform, alpha);
    -240                 this.prevAlpha= alpha;
    -241             }
    -242             return this;
    -243         },
    -244         /**
    -245          *
    -246          * @param lines_data {Float32Array} array of number with x,y,z coords for each line point.
    -247          * @param size {number} number of lines to draw.
    -248          * @param r
    -249          * @param g
    -250          * @param b
    -251          * @param a
    -252          * @param lineWidth {number} drawing line size.
    -253          */
    -254         drawLines : function( lines_data, size, r,g,b,a, lineWidth ) {
    -255             var gl= this.gl;
    -256 
    -257             this.setAlpha( a );
    -258 
    -259             gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.linesBuffer );
    -260             gl.lineWidth(lineWidth);
    -261 
    -262             this.updateVertexBuffer(lines_data);
    -263             this.setUseColor(true, r,g,b,1 );
    -264             gl.drawElements(gl.LINES, size, gl.UNSIGNED_SHORT, 0);
    -265 
    -266             /// restore
    -267             this.setAlpha( 1 );
    -268             this.setUseColor(false);
    -269             gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.vertexIndexBuffer);
    -270 
    -271         },
    -272         /**
    -273          * 
    -274          * @param polyline_data
    -275          * @param size
    -276          * @param r
    -277          * @param g
    -278          * @param b
    -279          * @param a
    -280          * @param lineWidth
    -281          */
    -282         drawPolylines : function( polyline_data, size, r,g,b,a, lineWidth ) {
    -283             var gl= this.gl;
    -284 
    -285             gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.linesBuffer );
    -286             gl.lineWidth(lineWidth);
    -287 
    -288             this.setAlpha(a);
    -289 
    -290             this.updateVertexBuffer(polyline_data);
    -291             this.setUseColor(true, r,g,b,1 );
    -292             gl.drawElements(gl.LINE_STRIP, size, gl.UNSIGNED_SHORT, 0);
    -293 
    -294             /// restore
    -295             this.setAlpha( 1 );
    -296             this.setUseColor(false);
    -297             gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.vertexIndexBuffer);
    -298 
    -299         }
    -300     }
    -301 });
    -302 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_core_class.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_core_class.js.html deleted file mode 100644 index 9ec7d6e8..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_core_class.js.html +++ /dev/null @@ -1,228 +0,0 @@ -
      1 
    -  2 extend = function (subc, superc) {
    -  3     var subcp = subc.prototype;
    -  4 
    -  5     // Class pattern.
    -  6     var CAATObject = function () {
    -  7     };
    -  8     CAATObject.prototype = superc.prototype;
    -  9 
    - 10     subc.prototype = new CAATObject();       // chain prototypes.
    - 11     subc.superclass = superc.prototype;
    - 12     subc.prototype.constructor = subc;
    - 13 
    - 14     // Reset constructor. See Object Oriented Javascript for an in-depth explanation of this.
    - 15     if (superc.prototype.constructor === Object.prototype.constructor) {
    - 16         superc.prototype.constructor = superc;
    - 17     }
    - 18 
    - 19     // los metodos de superc, que no esten en esta clase, crear un metodo que
    - 20     // llama al metodo de superc.
    - 21     for (var method in subcp) {
    - 22         if (subcp.hasOwnProperty(method)) {
    - 23             subc.prototype[method] = subcp[method];
    - 24 
    - 25             /**
    - 26              * Sintactic sugar to add a __super attribute on every overriden method.
    - 27              * Despite comvenient, it slows things down by 5fps.
    - 28              *
    - 29              * Uncomment at your own risk.
    - 30              *
    - 31              // tenemos en super un metodo con igual nombre.
    - 32              if ( superc.prototype[method]) {
    - 33             subc.prototype[method]= (function(fn, fnsuper) {
    - 34                 return function() {
    - 35                     var prevMethod= this.__super;
    - 36 
    - 37                     this.__super= fnsuper;
    - 38 
    - 39                     var retValue= fn.apply(
    - 40                             this,
    - 41                             Array.prototype.slice.call(arguments) );
    - 42 
    - 43                     this.__super= prevMethod;
    - 44 
    - 45                     return retValue;
    - 46                 };
    - 47             })(subc.prototype[method], superc.prototype[method]);
    - 48         }
    - 49              */
    - 50 
    - 51         }
    - 52     }
    - 53 };
    - 54 
    - 55 
    - 56 extendWith = function (base, subclass, with_object) {
    - 57     var CAATObject = function () {
    - 58     };
    - 59 
    - 60     CAATObject.prototype = base.prototype;
    - 61 
    - 62     subclass.prototype = new CAATObject();
    - 63     subclass.superclass = base.prototype;
    - 64     subclass.prototype.constructor = subclass;
    - 65 
    - 66     if (base.prototype.constructor === Object.prototype.constructor) {
    - 67         base.prototype.constructor = base;
    - 68     }
    - 69 
    - 70     if (with_object) {
    - 71         for (var method in with_object) {
    - 72             if (with_object.hasOwnProperty(method)) {
    - 73                 subclass.prototype[ method ] = with_object[method];
    - 74                 /*
    - 75                  if ( base.prototype[method]) {
    - 76                  subclass.prototype[method]= (function(fn, fnsuper) {
    - 77                  return function() {
    - 78                  var prevMethod= this.__super;
    - 79                  this.__super= fnsuper;
    - 80                  var retValue= fn.apply(this, arguments );
    - 81                  this.__super= prevMethod;
    - 82 
    - 83                  return retValue;
    - 84                  };
    - 85                  })(subclass.prototype[method], base.prototype[method]);
    - 86                  }
    - 87                  /**/
    - 88             }
    - 89         }
    - 90     }
    - 91 };
    - 92 
    - 93 
    - 94 
    - 95 function proxyFunction(object, method, preMethod, postMethod, errorMethod) {
    - 96 
    - 97     return function () {
    - 98 
    - 99         var args = Array.prototype.slice.call(arguments);
    -100 
    -101         // call pre-method hook if present.
    -102         if (preMethod) {
    -103             preMethod({
    -104                 object: object,
    -105                 method: method,
    -106                 arguments: args });
    -107         }
    -108 
    -109         var retValue = null;
    -110 
    -111         try {
    -112             // apply original object call with proxied object as
    -113             // function context.
    -114             retValue = object[method].apply(object, args);
    -115 
    -116             // everything went right on function call, the call
    -117             // post-method hook if present
    -118             if (postMethod) {
    -119                 /*var rr= */
    -120                 var ret2 = postMethod({
    -121                     object: object,
    -122                     method: method,
    -123                     arguments: args });
    -124 
    -125                 if (ret2) {
    -126                     retValue = ret2;
    -127                 }
    -128             }
    -129         } catch (e) {
    -130             // an exeception was thrown, call exception-method hook if
    -131             // present and return its result as execution result.
    -132             if (errorMethod) {
    -133                 retValue = errorMethod({
    -134                     object: object,
    -135                     method: method,
    -136                     arguments: args,
    -137                     exception: e});
    -138             } else {
    -139                 // since there's no error hook, just throw the exception
    -140                 throw e;
    -141             }
    -142         }
    -143 
    -144         // return original returned value to the caller.
    -145         return retValue;
    -146     };
    -147 
    -148 }
    -149 
    -150 function proxyAttribute( proxy, object, attribute, getter, setter) {
    -151 
    -152     proxy.__defineGetter__(attribute, function () {
    -153         if (getter) {
    -154             getter(object, attribute);
    -155         }
    -156         return object[attribute];
    -157     });
    -158     proxy.__defineSetter__(attribute, function (value) {
    -159         object[attribute] = value;
    -160         if (setter) {
    -161             setter(object, attribute, value);
    -162         }
    -163     });
    -164 }
    -165 
    -166 function proxyObject(object, preMethod, postMethod, errorMethod, getter, setter) {
    -167 
    -168     /**
    -169      * If not a function then only non privitive objects can be proxied.
    -170      * If it is a previously created proxy, return the proxy itself.
    -171      */
    -172     if (typeof object !== 'object' || isArray(object) || isString(object) || object.$proxy) {
    -173         return object;
    -174     }
    -175 
    -176     var proxy = {};
    -177 
    -178     // hold the proxied object as member. Needed to assign proper
    -179     // context on proxy method call.
    -180     proxy.$proxy = true;
    -181     proxy.$proxy_delegate = object;
    -182 
    -183     // For every element in the object to be proxied
    -184     for (var method in object) {
    -185 
    -186         if (method === "constructor") {
    -187             continue;
    -188         }
    -189 
    -190         // only function members
    -191         if (typeof object[method] === 'function') {
    -192             proxy[method] = proxyFunction(object, method, preMethod, postMethod, errorMethod );
    -193         } else {
    -194             proxyAttribute(proxy, object, method, getter, setter);
    -195         }
    -196     }
    -197 
    -198     // return our newly created and populated with functions proxied object.
    -199     return proxy;
    -200 }
    -201 
    -202 
    -203 CAAT.Module({
    -204     defines : "CAAT.Core.Class",
    -205     extendsWith : function() {
    -206 
    -207         /**
    -208          * See LICENSE file.
    -209          *
    -210          * Extend a prototype with another to form a classical OOP inheritance procedure.
    -211          *
    -212          * @param subc {object} Prototype to define the base class
    -213          * @param superc {object} Prototype to be extended (derived class).
    -214          */
    -215 
    -216 
    -217         return {
    -218 
    -219         };
    -220     }
    -221 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_bezier.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_bezier.js.html deleted file mode 100644 index c7618315..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_bezier.js.html +++ /dev/null @@ -1,267 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  **/
    -  5 
    -  6 CAAT.Module( {
    -  7 
    -  8     /**
    -  9      * @name Math
    - 10      * @memberOf CAAT
    - 11      * @namespace
    - 12      */
    - 13 
    - 14     /**
    - 15      * @name Bezier
    - 16      * @memberOf CAAT.Math
    - 17      * @extends CAAT.Math.Curve
    - 18      * @constructor
    - 19      */
    - 20 
    - 21     defines:    "CAAT.Math.Bezier",
    - 22     depends:    ["CAAT.Math.Curve"],
    - 23     extendsClass:    "CAAT.Math.Curve",
    - 24     aliases:    ["CAAT.Bezier"],
    - 25     extendsWith:    function() {
    - 26         return {
    - 27 
    - 28             /**
    - 29              * @lends CAAT.Math.Bezier.prototype
    - 30              */
    - 31 
    - 32             /**
    - 33              * This curbe is cubic or quadratic bezier ?
    - 34              */
    - 35             cubic:		false,
    - 36 
    - 37             applyAsPath : function( director ) {
    - 38 
    - 39                 var cc= this.coordlist;
    - 40 
    - 41                 if ( this.cubic ) {
    - 42                     director.ctx.bezierCurveTo(
    - 43                         cc[1].x,
    - 44                         cc[1].y,
    - 45                         cc[2].x,
    - 46                         cc[2].y,
    - 47                         cc[3].x,
    - 48                         cc[3].y
    - 49                     );
    - 50                 } else {
    - 51                     director.ctx.quadraticCurveTo(
    - 52                         cc[1].x,
    - 53                         cc[1].y,
    - 54                         cc[2].x,
    - 55                         cc[2].y
    - 56                     );
    - 57                 }
    - 58                 return this;
    - 59             },
    - 60             isQuadric : function() {
    - 61                 return !this.cubic;
    - 62             },
    - 63             isCubic : function() {
    - 64                 return this.cubic;
    - 65             },
    - 66             /**
    - 67              * Set this curve as a cubic bezier defined by the given four control points.
    - 68              * @param cp0x {number}
    - 69              * @param cp0y {number}
    - 70              * @param cp1x {number}
    - 71              * @param cp1y {number}
    - 72              * @param cp2x {number}
    - 73              * @param cp2y {number}
    - 74              * @param cp3x {number}
    - 75              * @param cp3y {number}
    - 76              */
    - 77             setCubic : function( cp0x,cp0y, cp1x,cp1y, cp2x,cp2y, cp3x,cp3y ) {
    - 78 
    - 79                 this.coordlist= [];
    - 80 
    - 81                 this.coordlist.push( new CAAT.Math.Point().set(cp0x, cp0y ) );
    - 82                 this.coordlist.push( new CAAT.Math.Point().set(cp1x, cp1y ) );
    - 83                 this.coordlist.push( new CAAT.Math.Point().set(cp2x, cp2y ) );
    - 84                 this.coordlist.push( new CAAT.Math.Point().set(cp3x, cp3y ) );
    - 85 
    - 86                 this.cubic= true;
    - 87                 this.update();
    - 88 
    - 89                 return this;
    - 90             },
    - 91             /**
    - 92              * Set this curve as a quadric bezier defined by the three control points.
    - 93              * @param cp0x {number}
    - 94              * @param cp0y {number}
    - 95              * @param cp1x {number}
    - 96              * @param cp1y {number}
    - 97              * @param cp2x {number}
    - 98              * @param cp2y {number}
    - 99              */
    -100             setQuadric : function(cp0x,cp0y, cp1x,cp1y, cp2x,cp2y ) {
    -101 
    -102                 this.coordlist= [];
    -103 
    -104                 this.coordlist.push( new CAAT.Math.Point().set(cp0x, cp0y ) );
    -105                 this.coordlist.push( new CAAT.Math.Point().set(cp1x, cp1y ) );
    -106                 this.coordlist.push( new CAAT.Math.Point().set(cp2x, cp2y ) );
    -107 
    -108                 this.cubic= false;
    -109                 this.update();
    -110 
    -111                 return this;
    -112             },
    -113             setPoints : function( points ) {
    -114                 if ( points.length===3 ) {
    -115                     this.coordlist= points;
    -116                     this.cubic= false;
    -117                     this.update();
    -118                 } else if (points.length===4 ) {
    -119                     this.coordlist= points;
    -120                     this.cubic= true;
    -121                     this.update();
    -122                 } else {
    -123                     throw 'points must be an array of 3 or 4 CAAT.Point instances.'
    -124                 }
    -125 
    -126                 return this;
    -127             },
    -128             /**
    -129              * Paint this curve.
    -130              * @param director {CAAT.Director}
    -131              */
    -132             paint : function( director ) {
    -133                 if ( this.cubic ) {
    -134                     this.paintCubic(director);
    -135                 } else {
    -136                     this.paintCuadric( director );
    -137                 }
    -138 
    -139                 CAAT.Math.Bezier.superclass.paint.call(this,director);
    -140 
    -141             },
    -142             /**
    -143              * Paint this quadric Bezier curve. Each time the curve is drawn it will be solved again from 0 to 1 with
    -144              * CAAT.Bezier.k increments.
    -145              *
    -146              * @param director {CAAT.Director}
    -147              * @private
    -148              */
    -149             paintCuadric : function( director ) {
    -150                 var x1,y1;
    -151                 x1 = this.coordlist[0].x;
    -152                 y1 = this.coordlist[0].y;
    -153 
    -154                 var ctx= director.ctx;
    -155 
    -156                 ctx.save();
    -157                 ctx.beginPath();
    -158                 ctx.moveTo(x1,y1);
    -159 
    -160                 var point= new CAAT.Math.Point();
    -161                 for(var t=this.k;t<=1+this.k;t+=this.k){
    -162                     this.solve(point,t);
    -163                     ctx.lineTo(point.x, point.y );
    -164                 }
    -165 
    -166                 ctx.stroke();
    -167                 ctx.restore();
    -168 
    -169             },
    -170             /**
    -171              * Paint this cubic Bezier curve. Each time the curve is drawn it will be solved again from 0 to 1 with
    -172              * CAAT.Bezier.k increments.
    -173              *
    -174              * @param director {CAAT.Director}
    -175              * @private
    -176              */
    -177             paintCubic : function( director ) {
    -178 
    -179                 var x1,y1;
    -180                 x1 = this.coordlist[0].x;
    -181                 y1 = this.coordlist[0].y;
    -182 
    -183                 var ctx= director.ctx;
    -184 
    -185                 ctx.save();
    -186                 ctx.beginPath();
    -187                 ctx.moveTo(x1,y1);
    -188 
    -189                 var point= new CAAT.Math.Point();
    -190                 for(var t=this.k;t<=1+this.k;t+=this.k){
    -191                     this.solve(point,t);
    -192                     ctx.lineTo(point.x, point.y );
    -193                 }
    -194 
    -195                 ctx.stroke();
    -196                 ctx.restore();
    -197             },
    -198             /**
    -199              * Solves the curve for any given parameter t.
    -200              * @param point {CAAT.Point} the point to store the solved value on the curve.
    -201              * @param t {number} a number in the range 0..1
    -202              */
    -203             solve : function(point,t) {
    -204                 if ( this.cubic ) {
    -205                     return this.solveCubic(point,t);
    -206                 } else {
    -207                     return this.solveQuadric(point,t);
    -208                 }
    -209             },
    -210             /**
    -211              * Solves a cubic Bezier.
    -212              * @param point {CAAT.Point} the point to store the solved value on the curve.
    -213              * @param t {number} the value to solve the curve for.
    -214              */
    -215             solveCubic : function(point,t) {
    -216 
    -217                 var t2= t*t;
    -218                 var t3= t*t2;
    -219 
    -220                 var cl= this.coordlist;
    -221                 var cl0= cl[0];
    -222                 var cl1= cl[1];
    -223                 var cl2= cl[2];
    -224                 var cl3= cl[3];
    -225 
    -226                 point.x=(
    -227                     cl0.x + t * (-cl0.x * 3 + t * (3 * cl0.x-
    -228                     cl0.x*t)))+t*(3*cl1.x+t*(-6*cl1.x+
    -229                     cl1.x*3*t))+t2*(cl2.x*3-cl2.x*3*t)+
    -230                     cl3.x * t3;
    -231 
    -232                 point.y=(
    -233                         cl0.y+t*(-cl0.y*3+t*(3*cl0.y-
    -234                         cl0.y*t)))+t*(3*cl1.y+t*(-6*cl1.y+
    -235                         cl1.y*3*t))+t2*(cl2.y*3-cl2.y*3*t)+
    -236                         cl3.y * t3;
    -237 
    -238                 return point;
    -239             },
    -240             /**
    -241              * Solves a quadric Bezier.
    -242              * @param point {CAAT.Point} the point to store the solved value on the curve.
    -243              * @param t {number} the value to solve the curve for.
    -244              */
    -245             solveQuadric : function(point,t) {
    -246                 var cl= this.coordlist;
    -247                 var cl0= cl[0];
    -248                 var cl1= cl[1];
    -249                 var cl2= cl[2];
    -250                 var t1= 1-t;
    -251 
    -252                 point.x= t1*t1*cl0.x + 2*t1*t*cl1.x + t*t*cl2.x;
    -253                 point.y= t1*t1*cl0.y + 2*t1*t*cl1.y + t*t*cl2.y;
    -254 
    -255                 return point;
    -256             }
    -257         }
    -258     }
    -259 });
    -260 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_dimension.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_dimension.js.html deleted file mode 100644 index 4e4c7d65..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_dimension.js.html +++ /dev/null @@ -1,44 +0,0 @@ -
      1 CAAT.Module({
    -  2 
    -  3     /**
    -  4      * @name Dimension
    -  5      * @memberOf CAAT.Math
    -  6      * @constructor
    -  7      */
    -  8 
    -  9 
    - 10     defines:"CAAT.Math.Dimension",
    - 11     aliases:["CAAT.Dimension"],
    - 12     extendsWith:function () {
    - 13         return {
    - 14 
    - 15             /**
    - 16              * @lends CAAT.Math.Dimension.prototype
    - 17              */
    - 18 
    - 19             /**
    - 20              * Width dimension.
    - 21              */
    - 22             width:0,
    - 23 
    - 24             /**
    - 25              * Height dimension.
    - 26              */
    - 27             height:0,
    - 28 
    - 29             __init:function (w, h) {
    - 30                 this.width = w;
    - 31                 this.height = h;
    - 32                 return this;
    - 33             }
    - 34         }
    - 35     }
    - 36 });
    - 37 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_point.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_point.js.html deleted file mode 100644 index 65077773..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_point.js.html +++ /dev/null @@ -1,243 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  **/
    -  5 CAAT.Module({
    -  6 
    -  7     /**
    -  8      * @name Point
    -  9      * @memberOf CAAT.Math
    - 10      * @constructor
    - 11      */
    - 12 
    - 13     defines:"CAAT.Math.Point",
    - 14     aliases:["CAAT.Point"],
    - 15     extendsWith:function () {
    - 16         return {
    - 17 
    - 18             /**
    - 19              * @lends CAAT.Math.Point.prototype
    - 20              */
    - 21 
    - 22 
    - 23             /**
    - 24              * point x coordinate.
    - 25              */
    - 26             x:0,
    - 27 
    - 28             /**
    - 29              * point y coordinate.
    - 30              */
    - 31             y:0,
    - 32 
    - 33             /**
    - 34              * point z coordinate.
    - 35              */
    - 36             z:0,
    - 37 
    - 38             __init:function (xpos, ypos, zpos) {
    - 39                 this.x = xpos;
    - 40                 this.y = ypos;
    - 41                 this.z = zpos || 0;
    - 42                 return this;
    - 43             },
    - 44 
    - 45             /**
    - 46              * Sets this point coordinates.
    - 47              * @param x {number}
    - 48              * @param y {number}
    - 49              * @param z {number=}
    - 50              *
    - 51              * @return this
    - 52              */
    - 53             set:function (x, y, z) {
    - 54                 this.x = x;
    - 55                 this.y = y;
    - 56                 this.z = z || 0;
    - 57                 return this;
    - 58             },
    - 59             /**
    - 60              * Create a new CAAT.Point equal to this one.
    - 61              * @return {CAAT.Point}
    - 62              */
    - 63             clone:function () {
    - 64                 var p = new CAAT.Math.Point(this.x, this.y, this.z);
    - 65                 return p;
    - 66             },
    - 67             /**
    - 68              * Translate this point to another position. The final point will be (point.x+x, point.y+y)
    - 69              * @param x {number}
    - 70              * @param y {number}
    - 71              *
    - 72              * @return this
    - 73              */
    - 74             translate:function (x, y, z) {
    - 75                 this.x += x;
    - 76                 this.y += y;
    - 77                 this.z += z;
    - 78 
    - 79                 return this;
    - 80             },
    - 81             /**
    - 82              * Translate this point to another point.
    - 83              * @param aPoint {CAAT.Point}
    - 84              * @return this
    - 85              */
    - 86             translatePoint:function (aPoint) {
    - 87                 this.x += aPoint.x;
    - 88                 this.y += aPoint.y;
    - 89                 this.z += aPoint.z;
    - 90                 return this;
    - 91             },
    - 92             /**
    - 93              * Substract a point from this one.
    - 94              * @param aPoint {CAAT.Point}
    - 95              * @return this
    - 96              */
    - 97             subtract:function (aPoint) {
    - 98                 this.x -= aPoint.x;
    - 99                 this.y -= aPoint.y;
    -100                 this.z -= aPoint.z;
    -101                 return this;
    -102             },
    -103             /**
    -104              * Multiply this point by a scalar.
    -105              * @param factor {number}
    -106              * @return this
    -107              */
    -108             multiply:function (factor) {
    -109                 this.x *= factor;
    -110                 this.y *= factor;
    -111                 this.z *= factor;
    -112                 return this;
    -113             },
    -114             /**
    -115              * Rotate this point by an angle. The rotation is held by (0,0) coordinate as center.
    -116              * @param angle {number}
    -117              * @return this
    -118              */
    -119             rotate:function (angle) {
    -120                 var x = this.x, y = this.y;
    -121                 this.x = x * Math.cos(angle) - Math.sin(angle) * y;
    -122                 this.y = x * Math.sin(angle) + Math.cos(angle) * y;
    -123                 this.z = 0;
    -124                 return this;
    -125             },
    -126             /**
    -127              *
    -128              * @param angle {number}
    -129              * @return this
    -130              */
    -131             setAngle:function (angle) {
    -132                 var len = this.getLength();
    -133                 this.x = Math.cos(angle) * len;
    -134                 this.y = Math.sin(angle) * len;
    -135                 this.z = 0;
    -136                 return this;
    -137             },
    -138             /**
    -139              *
    -140              * @param length {number}
    -141              * @return this
    -142              */
    -143             setLength:function (length) {
    -144                 var len = this.getLength();
    -145                 if (len)this.multiply(length / len);
    -146                 else this.x = this.y = this.z = length;
    -147                 return this;
    -148             },
    -149             /**
    -150              * Normalize this point, that is, both set coordinates proportionally to values raning 0..1
    -151              * @return this
    -152              */
    -153             normalize:function () {
    -154                 var len = this.getLength();
    -155                 this.x /= len;
    -156                 this.y /= len;
    -157                 this.z /= len;
    -158                 return this;
    -159             },
    -160             /**
    -161              * Return the angle from -Pi to Pi of this point.
    -162              * @return {number}
    -163              */
    -164             getAngle:function () {
    -165                 return Math.atan2(this.y, this.x);
    -166             },
    -167             /**
    -168              * Set this point coordinates proportinally to a maximum value.
    -169              * @param max {number}
    -170              * @return this
    -171              */
    -172             limit:function (max) {
    -173                 var aLenthSquared = this.getLengthSquared();
    -174                 if (aLenthSquared + 0.01 > max * max) {
    -175                     var aLength = Math.sqrt(aLenthSquared);
    -176                     this.x = (this.x / aLength) * max;
    -177                     this.y = (this.y / aLength) * max;
    -178                     this.z = (this.z / aLength) * max;
    -179                 }
    -180                 return this;
    -181             },
    -182             /**
    -183              * Get this point's lenght.
    -184              * @return {number}
    -185              */
    -186             getLength:function () {
    -187                 var length = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
    -188                 if (length < 0.005 && length > -0.005) return 0.000001;
    -189                 return length;
    -190 
    -191             },
    -192             /**
    -193              * Get this point's squared length.
    -194              * @return {number}
    -195              */
    -196             getLengthSquared:function () {
    -197                 var lengthSquared = this.x * this.x + this.y * this.y + this.z * this.z;
    -198                 if (lengthSquared < 0.005 && lengthSquared > -0.005) return 0;
    -199                 return lengthSquared;
    -200             },
    -201             /**
    -202              * Get the distance between two points.
    -203              * @param point {CAAT.Point}
    -204              * @return {number}
    -205              */
    -206             getDistance:function (point) {
    -207                 var deltaX = this.x - point.x;
    -208                 var deltaY = this.y - point.y;
    -209                 var deltaZ = this.z - point.z;
    -210                 return Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
    -211             },
    -212             /**
    -213              * Get the squared distance between two points.
    -214              * @param point {CAAT.Point}
    -215              * @return {number}
    -216              */
    -217             getDistanceSquared:function (point) {
    -218                 var deltaX = this.x - point.x;
    -219                 var deltaY = this.y - point.y;
    -220                 var deltaZ = this.z - point.z;
    -221                 return deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;
    -222             },
    -223             /**
    -224              * Get a string representation.
    -225              * @return {string}
    -226              */
    -227             toString:function () {
    -228                 return "(CAAT.Math.Point)" +
    -229                     " x:" + String(Math.round(Math.floor(this.x * 10)) / 10) +
    -230                     " y:" + String(Math.round(Math.floor(this.y * 10)) / 10) +
    -231                     " z:" + String(Math.round(Math.floor(this.z * 10)) / 10);
    -232             }
    -233         }
    -234     }
    -235 });
    -236 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_rectangle.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_rectangle.js.html deleted file mode 100644 index eda9bff9..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_math_rectangle.js.html +++ /dev/null @@ -1,222 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  */
    -  5 
    -  6 
    -  7 CAAT.Module( {
    -  8 
    -  9     /**
    - 10      * @name Rectangle
    - 11      * @memberOf CAAT.Math
    - 12      * @constructor
    - 13      */
    - 14 
    - 15 
    - 16     defines:        "CAAT.Math.Rectangle",
    - 17     aliases:        ["CAAT.Rectangle"],
    - 18     extendsWith:    function() {
    - 19         return {
    - 20 
    - 21             /**
    - 22              * @lends CAAT.Math.Rectangle.prototype
    - 23              */
    - 24 
    - 25             __init : function( x,y,w,h ) {
    - 26                 this.setLocation(x,y);
    - 27                 this.setDimension(w,h);
    - 28             },
    - 29 
    - 30             /**
    - 31              * Rectangle x position.
    - 32              */
    - 33             x:		0,
    - 34 
    - 35             /**
    - 36              * Rectangle y position.
    - 37              */
    - 38             y:		0,
    - 39 
    - 40             /**
    - 41              * Rectangle x1 position.
    - 42              */
    - 43             x1:		0,
    - 44 
    - 45             /**
    - 46              * Rectangle y1 position.
    - 47              */
    - 48             y1:		0,
    - 49 
    - 50             /**
    - 51              * Rectangle width.
    - 52              */
    - 53             width:	-1,
    - 54 
    - 55             /**
    - 56              * Rectangle height.
    - 57              */
    - 58             height:	-1,
    - 59 
    - 60             setEmpty : function() {
    - 61                 this.width=     -1;
    - 62                 this.height=    -1;
    - 63                 this.x=         0;
    - 64                 this.y=         0;
    - 65                 this.x1=        0;
    - 66                 this.y1=        0;
    - 67                 return this;
    - 68             },
    - 69             /**
    - 70              * Set this rectangle's location.
    - 71              * @param x {number}
    - 72              * @param y {number}
    - 73              */
    - 74             setLocation: function( x,y ) {
    - 75                 this.x= x;
    - 76                 this.y= y;
    - 77                 this.x1= this.x+this.width;
    - 78                 this.y1= this.y+this.height;
    - 79                 return this;
    - 80             },
    - 81             /**
    - 82              * Set this rectangle's dimension.
    - 83              * @param w {number}
    - 84              * @param h {number}
    - 85              */
    - 86             setDimension : function( w,h ) {
    - 87                 this.width= w;
    - 88                 this.height= h;
    - 89                 this.x1= this.x+this.width;
    - 90                 this.y1= this.y+this.height;
    - 91                 return this;
    - 92             },
    - 93             setBounds : function( x,y,w,h ) {
    - 94                 this.setLocation( x, y );
    - 95                 this.setDimension( w, h );
    - 96                 return this;
    - 97             },
    - 98             /**
    - 99              * Return whether the coordinate is inside this rectangle.
    -100              * @param px {number}
    -101              * @param py {number}
    -102              *
    -103              * @return {boolean}
    -104              */
    -105             contains : function(px,py) {
    -106                 //return px>=0 && px<this.width && py>=0 && py<this.height;
    -107                 return px>=this.x && px<this.x1 && py>=this.y && py<this.y1;
    -108             },
    -109             /**
    -110              * Return whether this rectangle is empty, that is, has zero dimension.
    -111              * @return {boolean}
    -112              */
    -113             isEmpty : function() {
    -114                 return this.width===-1 && this.height===-1;
    -115             },
    -116             /**
    -117              * Set this rectangle as the union of this rectangle and the given point.
    -118              * @param px {number}
    -119              * @param py {number}
    -120              */
    -121             union : function(px,py) {
    -122 
    -123                 if ( this.isEmpty() ) {
    -124                     this.x= px;
    -125                     this.x1= px;
    -126                     this.y= py;
    -127                     this.y1= py;
    -128                     this.width=0;
    -129                     this.height=0;
    -130                     return;
    -131                 }
    -132 
    -133                 this.x1= this.x+this.width;
    -134                 this.y1= this.y+this.height;
    -135 
    -136                 if ( py<this.y ) {
    -137                     this.y= py;
    -138                 }
    -139                 if ( px<this.x ) {
    -140                     this.x= px;
    -141                 }
    -142                 if ( py>this.y1 ) {
    -143                     this.y1= py;
    -144                 }
    -145                 if ( px>this.x1 ){
    -146                     this.x1= px;
    -147                 }
    -148 
    -149                 this.width= this.x1-this.x;
    -150                 this.height= this.y1-this.y;
    -151             },
    -152             unionRectangle : function( rectangle ) {
    -153                 this.union( rectangle.x , rectangle.y  );
    -154                 this.union( rectangle.x1, rectangle.y  );
    -155                 this.union( rectangle.x,  rectangle.y1 );
    -156                 this.union( rectangle.x1, rectangle.y1 );
    -157                 return this;
    -158             },
    -159             intersects : function( r ) {
    -160                 if ( r.isEmpty() || this.isEmpty() ) {
    -161                     return false;
    -162                 }
    -163 
    -164                 if ( r.x1<= this.x ) {
    -165                     return false;
    -166                 }
    -167                 if ( r.x >= this.x1 ) {
    -168                     return false;
    -169                 }
    -170                 if ( r.y1<= this.y ) {
    -171                     return false;
    -172                 }
    -173 
    -174                 return r.y < this.y1;
    -175             },
    -176 
    -177             intersectsRect : function( x,y,w,h ) {
    -178                 if ( -1===w || -1===h ) {
    -179                     return false;
    -180                 }
    -181 
    -182                 var x1= x+w-1;
    -183                 var y1= y+h-1;
    -184 
    -185                 if ( x1< this.x ) {
    -186                     return false;
    -187                 }
    -188                 if ( x > this.x1 ) {
    -189                     return false;
    -190                 }
    -191                 if ( y1< this.y ) {
    -192                     return false;
    -193                 }
    -194                 return y <= this.y1;
    -195 
    -196             },
    -197 
    -198             intersect : function( i, r ) {
    -199                 if ( typeof r==='undefined' ) {
    -200                     r= new CAAT.Math.Rectangle();
    -201                 }
    -202 
    -203                 r.x= Math.max( this.x, i.x );
    -204                 r.y= Math.max( this.y, i.y );
    -205                 r.x1=Math.min( this.x1, i.x1 );
    -206                 r.y1=Math.min( this.y1, i.y1 );
    -207                 r.width= r.x1-r.x;
    -208                 r.height=r.y1-r.y;
    -209 
    -210                 return r;
    -211             }
    -212         }
    -213 	}
    -214 });
    -215 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_modules_CircleManager_PackedCircle.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_modules_CircleManager_PackedCircle.js.html deleted file mode 100644 index 3ced438d..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_modules_CircleManager_PackedCircle.js.html +++ /dev/null @@ -1,205 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  ####  #####  ##### ####    ###  #   # ###### ###### ##     ##  #####  #     #      ########    ##    #  #  #####
    -  5  #   # #   #  ###   #   #  #####  ###    ##     ##   ##  #  ##    #    #     #     #   ##   #  #####  ###   ###
    -  6  ###  #   #  ##### ####   #   #   #   ######   ##   #########  #####  ##### ##### #   ##   #  #   #  #   # #####
    -  7  -
    -  8  File:
    -  9  PackedCircle.js
    - 10  Created By:
    - 11  Mario Gonzalez
    - 12  Project    :
    - 13  None
    - 14  Abstract:
    - 15  A single packed circle.
    - 16  Contains a reference to it's div, and information pertaining to it state.
    - 17  Basic Usage:
    - 18  http://onedayitwillmake.com/CirclePackJS/
    - 19  */
    - 20 
    - 21 CAAT.Module({
    - 22 
    - 23     /**
    - 24      * @name CircleManager
    - 25      * @memberOf CAAT.Module
    - 26      * @namespace
    - 27      */
    - 28 
    - 29     /**
    - 30      * @name PackedCircle
    - 31      * @memberOf CAAT.Module.CircleManager
    - 32      * @constructor
    - 33      */
    - 34 
    - 35     defines:"CAAT.Module.CircleManager.PackedCircle",
    - 36     depends:[
    - 37         "CAAT.Module.CircleManager.PackedCircle",
    - 38         "CAAT.Math.Point"
    - 39     ],
    - 40     constants:{
    - 41 
    - 42         /**
    - 43          * @lends CAAT.Module.CircleManager.PackedCircle
    - 44          */
    - 45 
    - 46         /** @const */ BOUNDS_RULE_WRAP:1, // Wrap to otherside
    - 47         /** @const */ BOUNDS_RULE_CONSTRAINT:2, // Constrain within bounds
    - 48         /** @const */ BOUNDS_RULE_DESTROY:4, // Destroy when it reaches the edge
    - 49         /** @const */ BOUNDS_RULE_IGNORE:8        // Ignore when reaching bounds
    - 50     },
    - 51     extendsWith:{
    - 52 
    - 53         /**
    - 54          * @lends CAAT.Module.CircleManager.PackedCircle.prototype
    - 55          */
    - 56 
    - 57         __init:function () {
    - 58             this.boundsRule = CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_IGNORE;
    - 59             this.position = new CAAT.Math.Point(0, 0, 0);
    - 60             this.offset = new CAAT.Math.Point(0, 0, 0);
    - 61             this.targetPosition = new CAAT.Math.Point(0, 0, 0);
    - 62             return this;
    - 63         },
    - 64 
    - 65         /**
    - 66          *
    - 67          */
    - 68         id:0,
    - 69 
    - 70         /**
    - 71          *
    - 72          */
    - 73         delegate:null,
    - 74 
    - 75         /**
    - 76          *
    - 77          */
    - 78         position:null,
    - 79 
    - 80         /**
    - 81          *
    - 82          */
    - 83         offset:null,
    - 84 
    - 85         /**
    - 86          *
    - 87          */
    - 88         targetPosition:null, // Where it wants to go
    - 89 
    - 90         /**
    - 91          *
    - 92          */
    - 93         targetChaseSpeed:0.02,
    - 94 
    - 95         /**
    - 96          *
    - 97          */
    - 98         isFixed:false,
    - 99 
    -100         /**
    -101          *
    -102          */
    -103         boundsRule:0,
    -104 
    -105         /**
    -106          *
    -107          */
    -108         collisionMask:0,
    -109 
    -110         /**
    -111          *
    -112          */
    -113         collisionGroup:0,
    -114 
    -115         containsPoint:function (aPoint) {
    -116             var distanceSquared = this.position.getDistanceSquared(aPoint);
    -117             return distanceSquared < this.radiusSquared;
    -118         },
    -119 
    -120         getDistanceSquaredFromPosition:function (aPosition) {
    -121             var distanceSquared = this.position.getDistanceSquared(aPosition);
    -122             // if it's shorter than either radius, we intersect
    -123             return distanceSquared < this.radiusSquared;
    -124         },
    -125 
    -126         intersects:function (aCircle) {
    -127             var distanceSquared = this.position.getDistanceSquared(aCircle.position);
    -128             return (distanceSquared < this.radiusSquared || distanceSquared < aCircle.radiusSquared);
    -129         },
    -130 
    -131         /**
    -132          * ACCESSORS
    -133          */
    -134         setPosition:function (aPosition) {
    -135             this.position = aPosition;
    -136             return this;
    -137         },
    -138 
    -139         setDelegate:function (aDelegate) {
    -140             this.delegate = aDelegate;
    -141             return this;
    -142         },
    -143 
    -144         setOffset:function (aPosition) {
    -145             this.offset = aPosition;
    -146             return this;
    -147         },
    -148 
    -149         setTargetPosition:function (aTargetPosition) {
    -150             this.targetPosition = aTargetPosition;
    -151             return this;
    -152         },
    -153 
    -154         setTargetChaseSpeed:function (aTargetChaseSpeed) {
    -155             this.targetChaseSpeed = aTargetChaseSpeed;
    -156             return this;
    -157         },
    -158 
    -159         setIsFixed:function (value) {
    -160             this.isFixed = value;
    -161             return this;
    -162         },
    -163 
    -164         setCollisionMask:function (aCollisionMask) {
    -165             this.collisionMask = aCollisionMask;
    -166             return this;
    -167         },
    -168 
    -169         setCollisionGroup:function (aCollisionGroup) {
    -170             this.collisionGroup = aCollisionGroup;
    -171             return this;
    -172         },
    -173 
    -174         setRadius:function (aRadius) {
    -175             this.radius = aRadius;
    -176             this.radiusSquared = this.radius * this.radius;
    -177             return this;
    -178         },
    -179 
    -180         initialize:function (overrides) {
    -181             if (overrides) {
    -182                 for (var i in overrides) {
    -183                     this[i] = overrides[i];
    -184                 }
    -185             }
    -186 
    -187             return this;
    -188         },
    -189 
    -190         dealloc:function () {
    -191             this.position = null;
    -192             this.offset = null;
    -193             this.delegate = null;
    -194             this.targetPosition = null;
    -195         }
    -196     }
    -197 });
    -198 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_modules_CircleManager_PackedCircleManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_modules_CircleManager_PackedCircleManager.js.html deleted file mode 100644 index c07cf24b..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_modules_CircleManager_PackedCircleManager.js.html +++ /dev/null @@ -1,405 +0,0 @@ -
      1 /**
    -  2  *
    -  3  * See LICENSE file.
    -  4  * 
    -  5 	  ####  #####  ##### ####    ###  #   # ###### ###### ##     ##  #####  #     #      ########    ##    #  #  #####
    -  6 	 #   # #   #  ###   #   #  #####  ###    ##     ##   ##  #  ##    #    #     #     #   ##   #  #####  ###   ###
    -  7 	 ###  #   #  ##### ####   #   #   #   ######   ##   #########  #####  ##### ##### #   ##   #  #   #  #   # #####
    -  8  -
    -  9  File:
    - 10  	PackedCircle.js
    - 11  Created By:
    - 12  	Mario Gonzalez
    - 13  Project	:
    - 14  	None
    - 15  Abstract:
    - 16  	 A single packed circle.
    - 17 	 Contains a reference to it's div, and information pertaining to it state.
    - 18  Basic Usage:
    - 19 	http://onedayitwillmake.com/CirclePackJS/
    - 20 */
    - 21 
    - 22 CAAT.Module( {
    - 23 
    - 24 
    - 25     /**
    - 26      * @name PackedCircleManager
    - 27      * @memberOf CAAT.Module.CircleManager
    - 28      * @constructor
    - 29      */
    - 30 
    - 31 
    - 32     defines : "CAAT.Module.CircleManager.PackedCircleManager",
    - 33     depends : [
    - 34         "CAAT.Math.Point",
    - 35         "CAAT.Math.Rectangle"
    - 36     ],
    - 37     extendsWith : {
    - 38 
    - 39         /**
    - 40          * @lends CAAT.Module.CircleManager.PackedCircleManager.prototype
    - 41          * @private
    - 42          */
    - 43 
    - 44         __init : function() {
    - 45             this.bounds= new CAAT.Math.Rectangle();
    - 46         },
    - 47 
    - 48         /**
    - 49          *
    - 50          */
    - 51 		allCircles:					[],
    - 52 
    - 53         /**
    - 54          *
    - 55          */
    - 56 		numberOfCollisionPasses:	1,
    - 57 
    - 58         /**
    - 59          *
    - 60          */
    - 61 		numberOfTargetingPasses:	0,
    - 62 
    - 63         /**
    - 64          *
    - 65          */
    - 66 		bounds:						null,
    - 67 
    - 68 		/**
    - 69 		 * Adds a circle to the simulation
    - 70 		 * @param aCircle
    - 71 		 */
    - 72 		addCircle: function(aCircle)
    - 73 		{
    - 74 			aCircle.id = this.allCircles.length;
    - 75 			this.allCircles.push(aCircle);
    - 76 			return this;
    - 77 		},
    - 78 
    - 79 		/**
    - 80 		 * Removes a circle from the simulations
    - 81 		 * @param aCircle	Circle to remove
    - 82 		 */
    - 83 		removeCircle: function(aCircle)
    - 84 		{
    - 85 			var index = 0,
    - 86 				found = false,
    - 87 				len = this.allCircles.length;
    - 88 
    - 89 			if(len === 0) {
    - 90 				throw "Error: (PackedCircleManager) attempting to remove circle, and allCircles.length === 0!!";
    - 91 			}
    - 92 
    - 93 			while (len--) {
    - 94 				if(this.allCircles[len] === aCircle) {
    - 95 					found = true;
    - 96 					index = len;
    - 97 					break;
    - 98 				}
    - 99 			}
    -100 
    -101 			if(!found) {
    -102 				throw "Could not locate circle in allCircles array!";
    -103 			}
    -104 
    -105 			// Remove
    -106 			this.allCircles[index].dealloc();
    -107 			this.allCircles[index] = null;
    -108 
    -109 			return this;
    -110 		},
    -111 
    -112 		/**
    -113 		 * Forces all circles to move to where their delegate position is
    -114 		 * Assumes all targets have a 'position' property!
    -115 		 */
    -116 		forceCirclesToMatchDelegatePositions: function()
    -117 		{
    -118 			var len = this.allCircles.length;
    -119 
    -120 			// push toward target position
    -121 			for(var n = 0; n < len; n++)
    -122 			{
    -123 				var aCircle = this.allCircles[n];
    -124 				if(!aCircle || !aCircle.delegate) {
    -125 					continue;
    -126 				}
    -127 
    -128 				aCircle.position.set(aCircle.delegate.x + aCircle.offset.x,
    -129 						aCircle.delegate.y + aCircle.offset.y);
    -130 			}
    -131 		},
    -132 
    -133 		pushAllCirclesTowardTarget: function(aTarget)
    -134 		{
    -135 			var v = new CAAT.Math.Point(0,0,0),
    -136 				circleList = this.allCircles,
    -137 				len = circleList.length;
    -138 
    -139 			// push toward target position
    -140 			for(var n = 0; n < this.numberOfTargetingPasses; n++)
    -141 			{
    -142 				for(var i = 0; i < len; i++)
    -143 				{
    -144 					var c = circleList[i];
    -145 
    -146 					if(c.isFixed) continue;
    -147 
    -148 					v.x = c.position.x - (c.targetPosition.x+c.offset.x);
    -149 					v.y = c.position.y - (c.targetPosition.y+c.offset.y);
    -150 					v.multiply(c.targetChaseSpeed);
    -151 
    -152 					c.position.x -= v.x;
    -153 					c.position.y -= v.y;
    -154 				}
    -155 			}
    -156 		},
    -157 
    -158 		/**
    -159 		 * Packs the circles towards the center of the bounds.
    -160 		 * Each circle will have it's own 'targetPosition' later on
    -161 		 */
    -162 		handleCollisions: function()
    -163 		{
    -164 			this.removeExpiredElements();
    -165 
    -166 			var v = new CAAT.Math.Point(0,0, 0),
    -167 				circleList = this.allCircles,
    -168 				len = circleList.length;
    -169 
    -170 			// Collide circles
    -171 			for(var n = 0; n < this.numberOfCollisionPasses; n++)
    -172 			{
    -173 				for(var i = 0; i < len; i++)
    -174 				{
    -175 					var ci = circleList[i];
    -176 
    -177 
    -178 					for (var j = i + 1; j< len; j++)
    -179 					{
    -180 						var cj = circleList[j];
    -181 
    -182 						if( !this.circlesCanCollide(ci, cj) ) continue;   // It's us!
    -183 
    -184 						var dx = cj.position.x - ci.position.x,
    -185 							dy = cj.position.y - ci.position.y;
    -186 
    -187 						// The distance between the two circles radii, but we're also gonna pad it a tiny bit
    -188 						var r = (ci.radius + cj.radius) * 1.08,
    -189 							d = ci.position.getDistanceSquared(cj.position);
    -190 
    -191 						/**
    -192 						 * Collision detected!
    -193 						 */
    -194 						if (d < (r * r) - 0.02 )
    -195 						{
    -196 							v.x = dx;
    -197 							v.y = dy;
    -198 							v.normalize();
    -199 
    -200 							var inverseForce = (r - Math.sqrt(d)) * 0.5;
    -201 							v.multiply(inverseForce);
    -202 
    -203 							// Move cj opposite of the collision as long as its not fixed
    -204 							if(!cj.isFixed)
    -205 							{
    -206 								if(ci.isFixed)
    -207 									v.multiply(2.2);	// Double inverse force to make up for the fact that the other object is fixed
    -208 
    -209 								// ADD the velocity
    -210 								cj.position.translatePoint(v);
    -211 							}
    -212 
    -213 							// Move ci opposite of the collision as long as its not fixed
    -214 							if(!ci.isFixed)
    -215 							{
    -216 								if(cj.isFixed)
    -217 									v.multiply(2.2);	// Double inverse force to make up for the fact that the other object is fixed
    -218 
    -219 								 // SUBTRACT the velocity
    -220 								ci.position.subtract(v);
    -221 							}
    -222 
    -223 							// Emit the collision event from each circle, with itself as the first parameter
    -224 //							if(this.dispatchCollisionEvents && n == this.numberOfCollisionPasses-1)
    -225 //							{
    -226 //								this.eventEmitter.emit('collision', cj, ci, v);
    -227 //							}
    -228 						}
    -229 					}
    -230 				}
    -231 			}
    -232 		},
    -233 
    -234 		handleBoundaryForCircle: function(aCircle, boundsRule)
    -235 		{
    -236 //			if(aCircle.boundsRule === true) return; // Ignore if being dragged
    -237 
    -238 			var xpos = aCircle.position.x;
    -239 			var ypos = aCircle.position.y;
    -240 
    -241 			var radius = aCircle.radius;
    -242 			var diameter = radius*2;
    -243 
    -244 			// Toggle these on and off,
    -245 			// Wrap and bounce, are opposite behaviors so pick one or the other for each axis, or bad things will happen.
    -246 			var wrapXMask = 1 << 0;
    -247 			var wrapYMask = 1 << 2;
    -248 			var constrainXMask = 1 << 3;
    -249 			var constrainYMask = 1 << 4;
    -250 			var emitEvent = 1 << 5;
    -251 
    -252 			// TODO: Promote to member variable
    -253 			// Convert to bitmask - Uncomment the one you want, or concact your own :)
    -254 	//		boundsRule = wrapY; // Wrap only Y axis
    -255 	//		boundsRule = wrapX; // Wrap only X axis
    -256 	//		boundsRule = wrapXMask | wrapYMask; // Wrap both X and Y axis
    -257 			boundsRule = wrapYMask | constrainXMask;  // Wrap Y axis, but constrain horizontally
    -258 
    -259 			// Wrap X
    -260 			if(boundsRule & wrapXMask && xpos-diameter > this.bounds.right) {
    -261 				aCircle.position.x = this.bounds.left + radius;
    -262 			} else if(boundsRule & wrapXMask && xpos+diameter < this.bounds.left) {
    -263 				aCircle.position.x = this.bounds.right - radius;
    -264 			}
    -265 			// Wrap Y
    -266 			if(boundsRule & wrapYMask && ypos-diameter > this.bounds.bottom) {
    -267 				aCircle.position.y = this.bounds.top - radius;
    -268 			} else if(boundsRule & wrapYMask && ypos+diameter < this.bounds.top) {
    -269 				aCircle.position.y = this.bounds.bottom + radius;
    -270 			}
    -271 
    -272 			// Constrain X
    -273 			if(boundsRule & constrainXMask && xpos+radius >= this.bounds.right) {
    -274 				aCircle.position.x = aCircle.position.x = this.bounds.right-radius;
    -275 			} else if(boundsRule & constrainXMask && xpos-radius < this.bounds.left) {
    -276 				aCircle.position.x = this.bounds.left + radius;
    -277 			}
    -278 
    -279 			// Constrain Y
    -280 			if(boundsRule & constrainYMask && ypos+radius > this.bounds.bottom) {
    -281 				aCircle.position.y = this.bounds.bottom - radius;
    -282 			} else if(boundsRule & constrainYMask && ypos-radius < this.bounds.top) {
    -283 				aCircle.position.y = this.bounds.top + radius;
    -284 			}
    -285 		},
    -286 
    -287 		/**
    -288 		 * Given an x,y position finds circle underneath and sets it to the currently grabbed circle
    -289 		 * @param {Number} xpos		An x position
    -290 		 * @param {Number} ypos		A y position
    -291 		 * @param {Number} buffer	A radiusSquared around the point in question where something is considered to match
    -292 		 */
    -293 		getCircleAt: function(xpos, ypos, buffer)
    -294 		{
    -295 			var circleList = this.allCircles;
    -296 			var len = circleList.length;
    -297 			var grabVector = new CAAT.Math.Point(xpos, ypos, 0);
    -298 
    -299 			// These are set every time a better match i found
    -300 			var closestCircle = null;
    -301 			var closestDistance = Number.MAX_VALUE;
    -302 
    -303 			// Loop thru and find the closest match
    -304 			for(var i = 0; i < len; i++)
    -305 			{
    -306 				var aCircle = circleList[i];
    -307 				if(!aCircle) continue;
    -308 				var distanceSquared = aCircle.position.getDistanceSquared(grabVector);
    -309 
    -310 				if(distanceSquared < closestDistance && distanceSquared < aCircle.radiusSquared + buffer)
    -311 				{
    -312 					closestDistance = distanceSquared;
    -313 					closestCircle = aCircle;
    -314 				}
    -315 			}
    -316 
    -317 			return closestCircle;
    -318 		},
    -319 
    -320 		circlesCanCollide: function(circleA, circleB)
    -321 		{
    -322 		    if(!circleA || !circleB || circleA===circleB) return false; 					// one is null (will be deleted next loop), or both point to same obj.
    -323 //			if(circleA.delegate == null || circleB.delegate == null) return false;					// This circle will be removed next loop, it's entity is already removed
    -324 
    -325 //			if(circleA.isFixed & circleB.isFixed) return false;
    -326 //			if(circleA.delegate .clientID === circleB.delegate.clientID) return false; 				// Don't let something collide with stuff it owns
    -327 
    -328 			// They dont want to collide
    -329 //			if((circleA.collisionGroup & circleB.collisionMask) == 0) return false;
    -330 //			if((circleB.collisionGroup & circleA.collisionMask) == 0) return false;
    -331 
    -332 			return true;
    -333 		},
    -334 /**
    -335  * Accessors
    -336  */
    -337 		setBounds: function(x, y, w, h)
    -338 		{
    -339 			this.bounds.x = x;
    -340 			this.bounds.y = y;
    -341 			this.bounds.width = w;
    -342 			this.bounds.height = h;
    -343 		},
    -344 
    -345 		setNumberOfCollisionPasses: function(value)
    -346 		{
    -347 			this.numberOfCollisionPasses = value;
    -348 			return this;
    -349 		},
    -350 
    -351 		setNumberOfTargetingPasses: function(value)
    -352 		{
    -353 			this.numberOfTargetingPasses = value;
    -354 			return this;
    -355 		},
    -356 
    -357 /**
    -358  * Helpers
    -359  */
    -360 		sortOnDistanceToTarget: function(circleA, circleB)
    -361 		{
    -362 			var valueA = circleA.getDistanceSquaredFromPosition(circleA.targetPosition);
    -363 			var valueB = circleB.getDistanceSquaredFromPosition(circleA.targetPosition);
    -364 			var comparisonResult = 0;
    -365 
    -366 			if(valueA > valueB) comparisonResult = -1;
    -367 			else if(valueA < valueB) comparisonResult = 1;
    -368 
    -369 			return comparisonResult;
    -370 		},
    -371 
    -372 /**
    -373  * Memory Management
    -374  */
    -375 		removeExpiredElements: function()
    -376 		{
    -377 			// remove null elements
    -378 			for (var k = this.allCircles.length; k >= 0; k--) {
    -379 				if (this.allCircles[k] === null)
    -380 					this.allCircles.splice(k, 1);
    -381 			}
    -382 		},
    -383 
    -384 		initialize : function(overrides)
    -385 		{
    -386 			if (overrides)
    -387 			{
    -388 				for (var i in overrides)
    -389 				{
    -390 					this[i] = overrides[i];
    -391 				}
    -392 			}
    -393 
    -394 			return this;
    -395 		}
    -396 	}
    -397 });
    -398 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_modules_Font_font.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_modules_Font_font.js.html deleted file mode 100644 index 85753834..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_modules_Font_font.js.html +++ /dev/null @@ -1,386 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  **/
    -  5 
    -  6 CAAT.Module({
    -  7 
    -  8     /**
    -  9      * @name Font
    - 10      * @memberOf CAAT.Module
    - 11      * @namespace
    - 12      */
    - 13 
    - 14     /**
    - 15      * @name Font
    - 16      * @memberOf CAAT.Module.Font
    - 17      * @constructor
    - 18      */
    - 19 
    - 20     defines : "CAAT.Module.Font.Font",
    - 21     aliases : "CAAT.Font",
    - 22     depends : [
    - 23         "CAAT.Foundation.SpriteImage"
    - 24     ],
    - 25     constants: {
    - 26 
    - 27         /**
    - 28          * @lends CAAT.Module.Font.Font
    - 29          */
    - 30 
    - 31         getFontMetrics:function (font) {
    - 32             var ret;
    - 33             if (CAAT.CSS_TEXT_METRICS) {
    - 34                 try {
    - 35                     ret = CAAT.Module.Font.Font.getFontMetricsCSS(font);
    - 36                     return ret;
    - 37                 } catch (e) {
    - 38 
    - 39                 }
    - 40             }
    - 41 
    - 42             return CAAT.Module.Font.Font.getFontMetricsNoCSS(font);
    - 43         },
    - 44 
    - 45         getFontMetricsNoCSS:function (font) {
    - 46 
    - 47             var re = /(\d+)p[x|t]/i;
    - 48             var res = re.exec(font);
    - 49 
    - 50             var height;
    - 51 
    - 52             if (!res) {
    - 53                 height = 32;     // no px or pt value in font. assume 32.)
    - 54             } else {
    - 55                 height = res[1] | 0;
    - 56             }
    - 57 
    - 58             var ascent = height - 1;
    - 59             var h = (height + height * .2) | 0;
    - 60             return {
    - 61                 height:h,
    - 62                 ascent:ascent,
    - 63                 descent:h - ascent
    - 64             }
    - 65 
    - 66         },
    - 67 
    - 68         /**
    - 69          * Totally ripped from:
    - 70          *
    - 71          * jQuery (offset function)
    - 72          * Daniel Earwicker: http://stackoverflow.com/questions/1134586/how-can-you-find-the-height-of-text-on-an-html-canvas
    - 73          *
    - 74          * @param font
    - 75          * @return {*}
    - 76          */
    - 77         getFontMetricsCSS:function (font) {
    - 78 
    - 79             function offset(elem) {
    - 80 
    - 81                 var box, docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, top, left;
    - 82                 var doc = elem && elem.ownerDocument;
    - 83                 docElem = doc.documentElement;
    - 84 
    - 85                 box = elem.getBoundingClientRect();
    - 86                 //win = getWindow( doc );
    - 87 
    - 88                 body = document.body;
    - 89                 win = doc.nodeType === 9 ? doc.defaultView || doc.parentWindow : false;
    - 90 
    - 91                 clientTop = docElem.clientTop || body.clientTop || 0;
    - 92                 clientLeft = docElem.clientLeft || body.clientLeft || 0;
    - 93                 scrollTop = win.pageYOffset || docElem.scrollTop;
    - 94                 scrollLeft = win.pageXOffset || docElem.scrollLeft;
    - 95                 top = box.top + scrollTop - clientTop;
    - 96                 left = box.left + scrollLeft - clientLeft;
    - 97 
    - 98                 return { top:top, left:left };
    - 99             }
    -100 
    -101             try {
    -102                 var text = document.createElement("span");
    -103                 text.style.font = font;
    -104                 text.innerHTML = "Hg";
    -105 
    -106                 var block = document.createElement("div");
    -107                 block.style.display = "inline-block";
    -108                 block.style.width = "1px";
    -109                 block.style.heigh = "0px";
    -110 
    -111                 var div = document.createElement("div");
    -112                 div.appendChild(text);
    -113                 div.appendChild(block);
    -114 
    -115 
    -116                 var body = document.body;
    -117                 body.appendChild(div);
    -118 
    -119                 try {
    -120 
    -121                     var result = {};
    -122 
    -123                     block.style.verticalAlign = 'baseline';
    -124                     result.ascent = offset(block).top - offset(text).top;
    -125 
    -126                     block.style.verticalAlign = 'bottom';
    -127                     result.height = offset(block).top - offset(text).top;
    -128 
    -129                     result.ascent = Math.ceil(result.ascent);
    -130                     result.height = Math.ceil(result.height);
    -131 
    -132                     result.descent = result.height - result.ascent;
    -133 
    -134                     return result;
    -135 
    -136                 } finally {
    -137                     body.removeChild(div);
    -138                 }
    -139             } catch (e) {
    -140                 return null;
    -141             }
    -142         }
    -143     },
    -144     extendsWith:function () {
    -145 
    -146         var UNKNOWN_CHAR_WIDTH = 10;
    -147 
    -148         return {
    -149 
    -150             /**
    -151              * @lends CAAT.Module.Font.Font.prototype
    -152              */
    -153 
    -154             fontSize:10,
    -155             fontSizeUnit:"px",
    -156             font:'Sans-Serif',
    -157             fontStyle:'',
    -158             fillStyle:'#fff',
    -159             strokeStyle:null,
    -160             strokeSize:1,
    -161             padding:0,
    -162             image:null,
    -163             charMap:null,
    -164 
    -165             height:0,
    -166             ascent:0,
    -167             descent:0,
    -168 
    -169             setPadding:function (padding) {
    -170                 this.padding = padding;
    -171                 return this;
    -172             },
    -173 
    -174             setFontStyle:function (style) {
    -175                 this.fontStyle = style;
    -176                 return this;
    -177             },
    -178 
    -179             setStrokeSize:function (size) {
    -180                 this.strokeSize = size;
    -181                 return this;
    -182             },
    -183 
    -184             setFontSize:function (fontSize) {
    -185                 this.fontSize = fontSize;
    -186                 this.fontSizeUnit = 'px';
    -187                 return this;
    -188             },
    -189 
    -190             setFont:function (font) {
    -191                 this.font = font;
    -192                 return this;
    -193             },
    -194 
    -195             setFillStyle:function (style) {
    -196                 this.fillStyle = style;
    -197                 return this;
    -198             },
    -199 
    -200             setStrokeStyle:function (style) {
    -201                 this.strokeStyle = style;
    -202                 return this;
    -203             },
    -204 
    -205             createDefault:function (padding) {
    -206                 var str = "";
    -207                 for (var i = 32; i < 128; i++) {
    -208                     str = str + String.fromCharCode(i);
    -209                 }
    -210 
    -211                 return this.create(str, padding);
    -212             },
    -213 
    -214             create:function (chars, padding) {
    -215 
    -216                 padding = padding | 0;
    -217                 this.padding = padding;
    -218 
    -219                 var canvas = document.createElement('canvas');
    -220                 var ctx = canvas.getContext('2d');
    -221 
    -222                 ctx.textBaseline = 'bottom';
    -223                 ctx.font = this.fontStyle + ' ' + this.fontSize + "" + this.fontSizeUnit + " " + this.font;
    -224 
    -225                 var textWidth = 0;
    -226                 var charWidth = [];
    -227                 var i;
    -228                 var x;
    -229                 var cchar;
    -230 
    -231                 for (i = 0; i < chars.length; i++) {
    -232                     var cw = Math.max(1, (ctx.measureText(chars.charAt(i)).width >> 0) + 1) + 2 * padding;
    -233                     charWidth.push(cw);
    -234                     textWidth += cw;
    -235                 }
    -236 
    -237 
    -238                 var fontMetrics = CAAT.Font.getFontMetrics(ctx.font);
    -239                 var baseline = "alphabetic", yoffset, canvasheight;
    -240 
    -241                 canvasheight = fontMetrics.height;
    -242                 this.ascent = fontMetrics.ascent;
    -243                 this.descent = fontMetrics.descent;
    -244                 this.height = fontMetrics.height;
    -245                 yoffset = fontMetrics.ascent;
    -246 
    -247                 canvas.width = textWidth;
    -248                 canvas.height = canvasheight;
    -249                 ctx = canvas.getContext('2d');
    -250 
    -251                 //ctx.textBaseline= 'bottom';
    -252                 ctx.textBaseline = baseline;
    -253                 ctx.font = this.fontStyle + ' ' + this.fontSize + "" + this.fontSizeUnit + " " + this.font;
    -254                 ctx.fillStyle = this.fillStyle;
    -255                 ctx.strokeStyle = this.strokeStyle;
    -256 
    -257                 this.charMap = {};
    -258 
    -259                 x = 0;
    -260                 for (i = 0; i < chars.length; i++) {
    -261                     cchar = chars.charAt(i);
    -262                     ctx.fillText(cchar, x + padding, yoffset);
    -263                     if (this.strokeStyle) {
    -264                         ctx.beginPath();
    -265                         ctx.lineWidth = this.strokeSize;
    -266                         ctx.strokeText(cchar, x + padding, yoffset);
    -267                     }
    -268                     this.charMap[cchar] = {
    -269                         x:x + padding,
    -270                         width:charWidth[i] - 2 * padding
    -271                     };
    -272                     x += charWidth[i];
    -273                 }
    -274 
    -275                 this.image = canvas;
    -276 
    -277                 return this;
    -278             },
    -279 
    -280             setAsSpriteImage:function () {
    -281                 var cm = [];
    -282                 var _index = 0;
    -283                 for (var i in this.charMap) {
    -284                     var _char = i;
    -285                     var charData = this.charMap[i];
    -286 
    -287                     cm[i] = {
    -288                         id:_index++,
    -289                         height:this.height,
    -290                         xoffset:0,
    -291                         letter:_char,
    -292                         yoffset:0,
    -293                         width:charData.width,
    -294                         xadvance:charData.width,
    -295                         x:charData.x,
    -296                         y:0
    -297                     };
    -298                 }
    -299 
    -300                 this.spriteImage = new CAAT.Foundation.SpriteImage().initializeAsGlyphDesigner(this.image, cm);
    -301                 return this;
    -302             },
    -303 
    -304             getAscent:function () {
    -305                 return this.ascent;
    -306             },
    -307 
    -308             getDescent:function () {
    -309                 return this.descent;
    -310             },
    -311 
    -312             stringHeight:function () {
    -313                 return this.height;
    -314             },
    -315 
    -316             getFontData:function () {
    -317                 return {
    -318                     height:this.height,
    -319                     ascent:this.ascent,
    -320                     descent:this.descent
    -321                 };
    -322             },
    -323 
    -324             stringWidth:function (str) {
    -325                 var i, l, w = 0, c;
    -326 
    -327                 for (i = 0, l = str.length; i < l; i++) {
    -328                     c = this.charMap[ str.charAt(i) ];
    -329                     if (c) {
    -330                         w += c.width;
    -331                     } else {
    -332                         w += UNKNOWN_CHAR_WIDTH;
    -333                     }
    -334                 }
    -335 
    -336                 return w;
    -337             },
    -338 
    -339             drawText:function (str, ctx, x, y) {
    -340                 var i, l, charInfo, w;
    -341                 var height = this.image.height;
    -342 
    -343                 for (i = 0, l = str.length; i < l; i++) {
    -344                     charInfo = this.charMap[ str.charAt(i) ];
    -345                     if (charInfo) {
    -346                         w = charInfo.width;
    -347                         if ( w>0 && charInfo.height>0 ) {
    -348                             ctx.drawImage(
    -349                                 this.image,
    -350                                 charInfo.x, 0,
    -351                                 w, height,
    -352                                 x, y,
    -353                                 w, height);
    -354                         }
    -355                         x += w;
    -356                     } else {
    -357                         ctx.strokeStyle = '#f00';
    -358                         ctx.strokeRect(x, y, UNKNOWN_CHAR_WIDTH, height);
    -359                         x += UNKNOWN_CHAR_WIDTH;
    -360                     }
    -361                 }
    -362             },
    -363 
    -364             save:function () {
    -365                 var str = "image/png";
    -366                 var strData = this.image.toDataURL(str);
    -367                 document.location.href = strData.replace(str, "image/octet-stream");
    -368             },
    -369 
    -370             drawSpriteText:function (director, time) {
    -371                 this.spriteImage.drawSpriteText(director, time);
    -372             }
    -373 
    -374         }
    -375     }
    -376 
    -377 });
    -378 
    -379 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_webgl_glu.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_webgl_glu.js.html deleted file mode 100644 index 24425635..00000000 --- a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_webgl_glu.js.html +++ /dev/null @@ -1,101 +0,0 @@ -
      1 /**
    -  2  * See LICENSE file.
    -  3  *
    -  4  */
    -  5 CAAT.Module( {
    -  6 
    -  7     /**
    -  8      * @name GLU
    -  9      * @memberOf CAAT.WebGL
    - 10      * @namespace
    - 11      */
    - 12 
    - 13     defines : "CAAT.WebGL.GLU",
    - 14     depends : [
    - 15         "CAAT.Math.Matrix3"
    - 16     ],
    - 17     constants : {
    - 18 
    - 19         /**
    - 20          * @lends CAAT.WebGL.GLU
    - 21          */
    - 22 
    - 23         /**
    - 24          * Create a perspective matrix.
    - 25          *
    - 26          * @param fovy
    - 27          * @param aspect
    - 28          * @param znear
    - 29          * @param zfar
    - 30          * @param viewportHeight
    - 31          */
    - 32         makePerspective : function (fovy, aspect, znear, zfar, viewportHeight) {
    - 33             var ymax = znear * Math.tan(fovy * Math.PI / 360.0);
    - 34             var ymin = -ymax;
    - 35             var xmin = ymin * aspect;
    - 36             var xmax = ymax * aspect;
    - 37 
    - 38             return makeFrustum(xmin, xmax, ymin, ymax, znear, zfar, viewportHeight);
    - 39         },
    - 40 
    - 41         /**
    - 42          * Create a matrix for a frustum.
    - 43          *
    - 44          * @param left
    - 45          * @param right
    - 46          * @param bottom
    - 47          * @param top
    - 48          * @param znear
    - 49          * @param zfar
    - 50          * @param viewportHeight
    - 51          */
    - 52         makeFrustum : function (left, right, bottom, top, znear, zfar, viewportHeight) {
    - 53             var X = 2*znear/(right-left);
    - 54             var Y = 2*znear/(top-bottom);
    - 55             var A = (right+left)/(right-left);
    - 56             var B = (top+bottom)/(top-bottom);
    - 57             var C = -(zfar+znear)/(zfar-znear);
    - 58             var D = -2*zfar*znear/(zfar-znear);
    - 59 
    - 60             return new CAAT.Math.Matrix3().initWithMatrix(
    - 61                     [
    - 62                         [X,  0,  A, -viewportHeight/2 ],
    - 63                         [0, -Y,  B,  viewportHeight/2 ],
    - 64                         [0,  0,  C,                 D ],
    - 65                         [0,  0, -1,                 0 ]
    - 66                     ]);
    - 67         },
    - 68 
    - 69         /**
    - 70          * Create an orthogonal projection matrix.
    - 71          * @param left
    - 72          * @param right
    - 73          * @param bottom
    - 74          * @param top
    - 75          * @param znear
    - 76          * @param zfar
    - 77          */
    - 78         makeOrtho : function (left, right, bottom, top, znear, zfar) {
    - 79             var tx = - (right + left) / (right - left) ;
    - 80             var ty = - (top + bottom) / (top - bottom) ;
    - 81             var tz = - (zfar + znear) / (zfar - znear);
    - 82 
    - 83             return new CAAT.Math.Matrix3().initWithMatrix(
    - 84                     [
    - 85                         [2 / (right - left), 0, 0, tx ],
    - 86                         [0, 2 / (top - bottom), 0, ty ],
    - 87                         [0, 0, -2 / (zfar- znear), tz ],
    - 88                         [0, 0, 0,                  1  ]
    - 89                     ]);
    - 90         }
    - 91 
    - 92     }
    - 93 });
    - 94 
    \ No newline at end of file From 3292231fae0b4ddd2bcb068bbf0d4ccea6da3bef Mon Sep 17 00:00:00 2001 From: ibon tolosana Date: Mon, 1 Jul 2013 05:00:57 -0700 Subject: [PATCH 48/52] * 07/01/2013 0.7 Build 6 * --------------------------- * Added functionality to AudioManager. The method director.setAudioFormatExtensions which proxies to audioManager.setAudioFormatExtensions sets a default audio object extension set. By default is [ 'ogg', 'mp3', 'wav', 'x-wav', 'mp4' ]. This means CAAT by default will try to find ogg files, then mp3, etc. It is not important whether the audio files add to director.addAudio have extension or not. CAAT will add the first suitable extension to be played from the supplied or default audioFormatExtension array. * Added __CLASS attribute to Class function. Now all objects are identified. * Fixed Director dynamic scale behavior. * Enhanced Skeletal animation support (Spine). * Fixed. Font error which prevented fonts to draw on screen. * Added. Method SpriteImage.addElementsAsImages which turns all subelements, either a grid defined by rows and columns or a JSON map into available images for director.getImage calls. * Fixed. Label object made tags to be incorrectly set in the document. * Fixed. Label now accepts images set by calling Label.setImage or images with names matching director.getImage calls. * Added demo35: Label usage. * Added demo36: Sprite maps. * Added. Method SpriteImage.initializeFromTexturePackerJSON which adds map sub-images as valid director.getImage values. --- build/caat-box2d-min.js | 4 +- build/caat-box2d.js | 6 +- build/caat-css-min.js | 4 +- build/caat-css.js | 4 +- build/caat-min.js | 291 +- build/caat.js | 4 +- changelog | 2 +- documentation/jsdoc/files.html | 1562 +++ documentation/jsdoc/index.html | 1178 +++ .../symbols/CAAT.Behavior.AlphaBehavior.html | 997 ++ .../CAAT.Behavior.BaseBehavior.Status.html | 660 ++ .../symbols/CAAT.Behavior.BaseBehavior.html | 2661 +++++ .../CAAT.Behavior.ContainerBehavior.html | 1469 +++ .../CAAT.Behavior.GenericBehavior.html | 877 ++ .../symbols/CAAT.Behavior.Interpolator.html | 1557 +++ ...CAAT.Behavior.PathBehavior.autorotate.html | 660 ++ .../symbols/CAAT.Behavior.PathBehavior.html | 1337 +++ .../symbols/CAAT.Behavior.RotateBehavior.html | 1275 +++ .../CAAT.Behavior.Scale1Behavior.Axis.html | 628 ++ .../symbols/CAAT.Behavior.Scale1Behavior.html | 1250 +++ .../symbols/CAAT.Behavior.ScaleBehavior.html | 1250 +++ .../jsdoc/symbols/CAAT.Behavior.html | 541 + documentation/jsdoc/symbols/CAAT.CSS.html | 875 ++ documentation/jsdoc/symbols/CAAT.Class.html | 541 + .../jsdoc/symbols/CAAT.Event.KeyEvent.html | 899 ++ .../jsdoc/symbols/CAAT.Event.MouseEvent.html | 1154 +++ .../jsdoc/symbols/CAAT.Event.TouchEvent.html | 1238 +++ .../jsdoc/symbols/CAAT.Event.TouchInfo.html | 627 ++ documentation/jsdoc/symbols/CAAT.Event.html | 541 + .../jsdoc/symbols/CAAT.Foundation.Actor.html | 8931 +++++++++++++++++ ...AAT.Foundation.ActorContainer.AddHint.html | 653 ++ .../CAAT.Foundation.ActorContainer.html | 2428 +++++ .../CAAT.Foundation.Box2D.B2DBodyActor.html | 1720 ++++ ...CAAT.Foundation.Box2D.B2DCircularBody.html | 731 ++ .../CAAT.Foundation.Box2D.B2DPolygonBody.html | 765 ++ .../jsdoc/symbols/CAAT.Foundation.Box2D.html | 541 + .../symbols/CAAT.Foundation.Director.html | 7654 ++++++++++++++ .../jsdoc/symbols/CAAT.Foundation.Scene.html | 2384 +++++ .../symbols/CAAT.Foundation.SpriteImage.html | 4134 ++++++++ ...Foundation.SpriteImageAnimationHelper.html | 744 ++ .../CAAT.Foundation.SpriteImageHelper.html | 702 ++ .../CAAT.Foundation.Timer.TimerManager.html | 953 ++ .../CAAT.Foundation.Timer.TimerTask.html | 1178 +++ .../jsdoc/symbols/CAAT.Foundation.Timer.html | 541 + .../symbols/CAAT.Foundation.UI.Dock.html | 1490 +++ .../symbols/CAAT.Foundation.UI.IMActor.html | 834 ++ .../CAAT.Foundation.UI.InterpolatorActor.html | 928 ++ .../symbols/CAAT.Foundation.UI.Label.html | 1861 ++++ ...AAT.Foundation.UI.Layout.BorderLayout.html | 1067 ++ .../CAAT.Foundation.UI.Layout.BoxLayout.html | 1110 ++ .../CAAT.Foundation.UI.Layout.GridLayout.html | 847 ++ ...AT.Foundation.UI.Layout.LayoutManager.html | 1528 +++ .../symbols/CAAT.Foundation.UI.Layout.html | 541 + .../symbols/CAAT.Foundation.UI.PathActor.html | 1211 +++ .../CAAT.Foundation.UI.ShapeActor.html | 1465 +++ .../symbols/CAAT.Foundation.UI.StarActor.html | 1539 +++ .../symbols/CAAT.Foundation.UI.TextActor.html | 2386 +++++ .../jsdoc/symbols/CAAT.Foundation.UI.html | 546 + .../jsdoc/symbols/CAAT.Foundation.html | 546 + documentation/jsdoc/symbols/CAAT.KEYS.html | 3316 ++++++ .../jsdoc/symbols/CAAT.KEY_MODIFIERS.html | 660 ++ .../jsdoc/symbols/CAAT.Math.Bezier.html | 1239 +++ .../jsdoc/symbols/CAAT.Math.CatmullRom.html | 865 ++ .../jsdoc/symbols/CAAT.Math.Curve.html | 1288 +++ .../jsdoc/symbols/CAAT.Math.Dimension.html | 702 ++ .../jsdoc/symbols/CAAT.Math.Matrix.html | 1604 +++ .../jsdoc/symbols/CAAT.Math.Matrix3.html | 1894 ++++ .../jsdoc/symbols/CAAT.Math.Point.html | 1582 +++ .../jsdoc/symbols/CAAT.Math.Rectangle.html | 1395 +++ documentation/jsdoc/symbols/CAAT.Math.html | 541 + .../CAAT.Module.Audio.AudioManager.html | 1984 ++++ .../jsdoc/symbols/CAAT.Module.Audio.html | 541 + ...AAT.Module.CircleManager.PackedCircle.html | 1688 ++++ ...ule.CircleManager.PackedCircleManager.html | 1397 +++ .../symbols/CAAT.Module.CircleManager.html | 541 + .../CAAT.Module.Collision.QuadTree.html | 829 ++ .../CAAT.Module.Collision.SpatialHash.html | 1181 +++ .../jsdoc/symbols/CAAT.Module.Collision.html | 541 + .../symbols/CAAT.Module.ColorUtil.Color.html | 886 ++ .../jsdoc/symbols/CAAT.Module.ColorUtil.html | 546 + .../symbols/CAAT.Module.Debug.Debug.html | 750 ++ .../jsdoc/symbols/CAAT.Module.Debug.html | 541 + .../jsdoc/symbols/CAAT.Module.Font.Font.html | 1486 +++ .../jsdoc/symbols/CAAT.Module.Font.html | 541 + ...le.Image.ImageProcessor.IMBumpMapping.html | 975 ++ ....Module.Image.ImageProcessor.IMPlasma.html | 732 ++ ...odule.Image.ImageProcessor.IMRotoZoom.html | 778 ++ ...e.Image.ImageProcessor.ImageProcessor.html | 1113 ++ .../CAAT.Module.Image.ImageProcessor.html | 541 + .../symbols/CAAT.Module.Image.ImageUtil.html | 805 ++ .../jsdoc/symbols/CAAT.Module.Image.html | 546 + .../CAAT.Module.Locale.ResourceBundle.html | 1026 ++ .../jsdoc/symbols/CAAT.Module.Locale.html | 541 + .../CAAT.Module.Preloader.ImagePreloader.html | 777 ++ .../CAAT.Module.Preloader.Preloader.html | 1090 ++ .../jsdoc/symbols/CAAT.Module.Preloader.html | 541 + .../CAAT.Module.Runtime.BrowserInfo.html | 654 ++ .../jsdoc/symbols/CAAT.Module.Runtime.html | 546 + .../CAAT.Module.Skeleton#SkeletonActor.html | 541 + .../symbols/CAAT.Module.Skeleton.Bone.html | 2217 ++++ .../CAAT.Module.Skeleton.BoneActor.html | 1286 +++ .../CAAT.Module.Skeleton.Skeleton.html | 1468 +++ .../jsdoc/symbols/CAAT.Module.Skeleton.html | 541 + .../CAAT.Module.Storage.LocalStorage.html | 732 ++ .../jsdoc/symbols/CAAT.Module.Storage.html | 546 + ...T.Module.TexturePacker.TextureElement.html | 724 ++ ...CAAT.Module.TexturePacker.TexturePage.html | 1424 +++ ...dule.TexturePacker.TexturePageManager.html | 750 ++ ...CAAT.Module.TexturePacker.TextureScan.html | 856 ++ ...T.Module.TexturePacker.TextureScanMap.html | 882 ++ .../symbols/CAAT.Module.TexturePacker.html | 541 + .../jsdoc/symbols/CAAT.ModuleManager.html | 541 + .../jsdoc/symbols/CAAT.PathUtil.ArcPath.html | 1834 ++++ .../symbols/CAAT.PathUtil.CurvePath.html | 1482 +++ .../symbols/CAAT.PathUtil.LinearPath.html | 1407 +++ .../jsdoc/symbols/CAAT.PathUtil.Path.html | 4511 +++++++++ .../symbols/CAAT.PathUtil.PathSegment.html | 1540 +++ .../jsdoc/symbols/CAAT.PathUtil.RectPath.html | 1508 +++ .../jsdoc/symbols/CAAT.PathUtil.SVGPath.html | 1689 ++++ .../jsdoc/symbols/CAAT.PathUtil.html | 541 + .../symbols/CAAT.WebGL.ColorProgram.html | 885 ++ .../jsdoc/symbols/CAAT.WebGL.GLU.html | 789 ++ .../jsdoc/symbols/CAAT.WebGL.Program.html | 1064 ++ .../symbols/CAAT.WebGL.TextureProgram.html | 1573 +++ documentation/jsdoc/symbols/CAAT.WebGL.html | 546 + documentation/jsdoc/symbols/CAAT.html | 2561 +++++ documentation/jsdoc/symbols/String.html | 562 ++ documentation/jsdoc/symbols/_global_.html | 749 ++ ...js_CAAT_src_Behavior_AlphaBehavior.js.html | 140 + ..._js_CAAT_src_Behavior_BaseBehavior.js.html | 667 ++ ...AAT_src_Behavior_ContainerBehavior.js.html | 456 + ..._CAAT_src_Behavior_GenericBehavior.js.html | 87 + ..._js_CAAT_src_Behavior_Interpolator.js.html | 493 + ..._js_CAAT_src_Behavior_PathBehavior.js.html | 352 + ...s_CAAT_src_Behavior_RotateBehavior.js.html | 220 + ...s_CAAT_src_Behavior_Scale1Behavior.js.html | 248 + ...js_CAAT_src_Behavior_ScaleBehavior.js.html | 227 + .../src/_Users_ibon_js_CAAT_src_CAAT.js.html | 20 + ..._Users_ibon_js_CAAT_src_Core_Class.js.html | 228 + ...rs_ibon_js_CAAT_src_Core_Constants.js.html | 127 + ...bon_js_CAAT_src_Core_ModuleManager.js.html | 925 ++ ...on_js_CAAT_src_Event_AnimationLoop.js.html | 219 + ...Users_ibon_js_CAAT_src_Event_Input.js.html | 216 + ...rs_ibon_js_CAAT_src_Event_KeyEvent.js.html | 241 + ..._ibon_js_CAAT_src_Event_MouseEvent.js.html | 116 + ..._ibon_js_CAAT_src_Event_TouchEvent.js.html | 135 + ...s_ibon_js_CAAT_src_Event_TouchInfo.js.html | 46 + ..._ibon_js_CAAT_src_Foundation_Actor.js.html | 2597 +++++ ...CAAT_src_Foundation_ActorContainer.js.html | 722 ++ ..._src_Foundation_Box2D_B2DBodyActor.js.html | 305 + ...c_Foundation_Box2D_B2DCircularBody.js.html | 106 + ...rc_Foundation_Box2D_B2DPolygonBody.js.html | 186 + ...on_js_CAAT_src_Foundation_Director.js.html | 3020 ++++++ ..._ibon_js_CAAT_src_Foundation_Scene.js.html | 606 ++ ...js_CAAT_src_Foundation_SpriteImage.js.html | 1173 +++ ...ndation_SpriteImageAnimationHelper.js.html | 54 + ...T_src_Foundation_SpriteImageHelper.js.html | 58 + ..._src_Foundation_Timer_TimerManager.js.html | 141 + ...AAT_src_Foundation_Timer_TimerTask.js.html | 145 + ...bon_js_CAAT_src_Foundation_UI_Dock.js.html | 390 + ..._js_CAAT_src_Foundation_UI_IMActor.js.html | 74 + ...rc_Foundation_UI_InterpolatorActor.js.html | 126 + ...on_js_CAAT_src_Foundation_UI_Label.js.html | 1225 +++ ..._Foundation_UI_Layout_BorderLayout.js.html | 226 + ...src_Foundation_UI_Layout_BoxLayout.js.html | 255 + ...rc_Foundation_UI_Layout_GridLayout.js.html | 186 + ...Foundation_UI_Layout_LayoutManager.js.html | 187 + ...s_CAAT_src_Foundation_UI_PathActor.js.html | 167 + ..._CAAT_src_Foundation_UI_ShapeActor.js.html | 235 + ...s_CAAT_src_Foundation_UI_StarActor.js.html | 237 + ...s_CAAT_src_Foundation_UI_TextActor.js.html | 615 ++ ...Users_ibon_js_CAAT_src_Math_Bezier.js.html | 267 + ...s_ibon_js_CAAT_src_Math_CatmullRom.js.html | 130 + ..._Users_ibon_js_CAAT_src_Math_Curve.js.html | 210 + ...rs_ibon_js_CAAT_src_Math_Dimension.js.html | 44 + ...Users_ibon_js_CAAT_src_Math_Matrix.js.html | 431 + ...sers_ibon_js_CAAT_src_Math_Matrix3.js.html | 553 + ..._Users_ibon_js_CAAT_src_Math_Point.js.html | 243 + ...rs_ibon_js_CAAT_src_Math_Rectangle.js.html | 226 + ...AAT_src_Modules_Audio_AudioManager.js.html | 570 ++ ..._src_Modules_CSS_csskeyframehelper.js.html | 185 + ...Modules_CircleManager_PackedCircle.js.html | 205 + ..._CircleManager_PackedCircleManager.js.html | 405 + ...AAT_src_Modules_Collision_Quadtree.js.html | 138 + ..._src_Modules_Collision_SpatialHash.js.html | 247 + ...s_CAAT_src_Modules_ColorUtil_Color.js.html | 301 + ...on_js_CAAT_src_Modules_Debug_Debug.js.html | 473 + ...ibon_js_CAAT_src_Modules_Font_Font.js.html | 387 + ...s_Image_ImageProcess_IMBumpMapping.js.html | 275 + ...odules_Image_ImageProcess_IMPlasma.js.html | 181 + ...ules_Image_ImageProcess_IMRotoZoom.js.html | 210 + ..._Image_ImageProcess_ImageProcessor.js.html | 207 + ...les_Image_Preloader_ImagePreloader.js.html | 108 + ..._Modules_Image_Preloader_Preloader.js.html | 169 + ...T_src_Modules_Image_Util_ImageUtil.js.html | 234 + ...rc_Modules_Initialization_Template.js.html | 98 + ..._Initialization_TemplateWithSplash.js.html | 189 + ..._src_Modules_LayoutUtils_RowLayout.js.html | 68 + ..._src_Modules_Locale_ResourceBundle.js.html | 242 + ...AT_src_Modules_Runtime_BrowserInfo.js.html | 170 + ..._js_CAAT_src_Modules_Skeleton_Bone.js.html | 514 + ...AAT_src_Modules_Skeleton_BoneActor.js.html | 265 + ...CAAT_src_Modules_Skeleton_Skeleton.js.html | 290 + ...src_Modules_Skeleton_SkeletonActor.js.html | 389 + ...T_src_Modules_Storage_LocalStorage.js.html | 87 + ...dules_TexturePacker_TextureElement.js.html | 56 + ..._Modules_TexturePacker_TexturePage.js.html | 303 + ...s_TexturePacker_TexturePageManager.js.html | 72 + ..._Modules_TexturePacker_TextureScan.js.html | 116 + ...dules_TexturePacker_TextureScanMap.js.html | 137 + ..._ibon_js_CAAT_src_PathUtil_ArcPath.js.html | 323 + ...bon_js_CAAT_src_PathUtil_CurvePath.js.html | 213 + ...on_js_CAAT_src_PathUtil_LinearPath.js.html | 218 + ...ers_ibon_js_CAAT_src_PathUtil_Path.js.html | 1172 +++ ...n_js_CAAT_src_PathUtil_PathSegment.js.html | 220 + ...ibon_js_CAAT_src_PathUtil_RectPath.js.html | 328 + ..._ibon_js_CAAT_src_PathUtil_SVGPath.js.html | 493 + ...bon_js_CAAT_src_WebGL_ColorProgram.js.html | 121 + .../_Users_ibon_js_CAAT_src_WebGL_GLU.js.html | 101 + ...ers_ibon_js_CAAT_src_WebGL_Program.js.html | 144 + ...n_js_CAAT_src_WebGL_TextureProgram.js.html | 309 + version.incremental | 2 +- version.nfo | 2 +- 223 files changed, 182627 insertions(+), 156 deletions(-) create mode 100644 documentation/jsdoc/files.html create mode 100644 documentation/jsdoc/index.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.AlphaBehavior.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.Status.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.ContainerBehavior.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.GenericBehavior.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.Interpolator.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.autorotate.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.RotateBehavior.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.Axis.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.ScaleBehavior.html create mode 100644 documentation/jsdoc/symbols/CAAT.Behavior.html create mode 100644 documentation/jsdoc/symbols/CAAT.CSS.html create mode 100644 documentation/jsdoc/symbols/CAAT.Class.html create mode 100644 documentation/jsdoc/symbols/CAAT.Event.KeyEvent.html create mode 100644 documentation/jsdoc/symbols/CAAT.Event.MouseEvent.html create mode 100644 documentation/jsdoc/symbols/CAAT.Event.TouchEvent.html create mode 100644 documentation/jsdoc/symbols/CAAT.Event.TouchInfo.html create mode 100644 documentation/jsdoc/symbols/CAAT.Event.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.Actor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.AddHint.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DBodyActor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DCircularBody.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DPolygonBody.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.Box2D.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.Director.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.Scene.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.SpriteImage.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageAnimationHelper.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageHelper.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerManager.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerTask.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.Timer.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.Dock.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.IMActor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.InterpolatorActor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.Label.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BorderLayout.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BoxLayout.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.GridLayout.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.LayoutManager.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.PathActor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.ShapeActor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.StarActor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.TextActor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.UI.html create mode 100644 documentation/jsdoc/symbols/CAAT.Foundation.html create mode 100644 documentation/jsdoc/symbols/CAAT.KEYS.html create mode 100644 documentation/jsdoc/symbols/CAAT.KEY_MODIFIERS.html create mode 100644 documentation/jsdoc/symbols/CAAT.Math.Bezier.html create mode 100644 documentation/jsdoc/symbols/CAAT.Math.CatmullRom.html create mode 100644 documentation/jsdoc/symbols/CAAT.Math.Curve.html create mode 100644 documentation/jsdoc/symbols/CAAT.Math.Dimension.html create mode 100644 documentation/jsdoc/symbols/CAAT.Math.Matrix.html create mode 100644 documentation/jsdoc/symbols/CAAT.Math.Matrix3.html create mode 100644 documentation/jsdoc/symbols/CAAT.Math.Point.html create mode 100644 documentation/jsdoc/symbols/CAAT.Math.Rectangle.html create mode 100644 documentation/jsdoc/symbols/CAAT.Math.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Audio.AudioManager.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Audio.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircle.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircleManager.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.CircleManager.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Collision.QuadTree.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Collision.SpatialHash.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Collision.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.ColorUtil.Color.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.ColorUtil.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Debug.Debug.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Debug.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Font.Font.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Font.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMBumpMapping.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMPlasma.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMRotoZoom.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.ImageProcessor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Image.ImageUtil.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Image.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Locale.ResourceBundle.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Locale.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Preloader.ImagePreloader.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Preloader.Preloader.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Preloader.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Runtime.BrowserInfo.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Runtime.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Skeleton#SkeletonActor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Skeleton.Bone.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Skeleton.BoneActor.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Skeleton.Skeleton.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Skeleton.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Storage.LocalStorage.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.Storage.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureElement.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePage.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePageManager.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScan.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScanMap.html create mode 100644 documentation/jsdoc/symbols/CAAT.Module.TexturePacker.html create mode 100644 documentation/jsdoc/symbols/CAAT.ModuleManager.html create mode 100644 documentation/jsdoc/symbols/CAAT.PathUtil.ArcPath.html create mode 100644 documentation/jsdoc/symbols/CAAT.PathUtil.CurvePath.html create mode 100644 documentation/jsdoc/symbols/CAAT.PathUtil.LinearPath.html create mode 100644 documentation/jsdoc/symbols/CAAT.PathUtil.Path.html create mode 100644 documentation/jsdoc/symbols/CAAT.PathUtil.PathSegment.html create mode 100644 documentation/jsdoc/symbols/CAAT.PathUtil.RectPath.html create mode 100644 documentation/jsdoc/symbols/CAAT.PathUtil.SVGPath.html create mode 100644 documentation/jsdoc/symbols/CAAT.PathUtil.html create mode 100644 documentation/jsdoc/symbols/CAAT.WebGL.ColorProgram.html create mode 100644 documentation/jsdoc/symbols/CAAT.WebGL.GLU.html create mode 100644 documentation/jsdoc/symbols/CAAT.WebGL.Program.html create mode 100644 documentation/jsdoc/symbols/CAAT.WebGL.TextureProgram.html create mode 100644 documentation/jsdoc/symbols/CAAT.WebGL.html create mode 100644 documentation/jsdoc/symbols/CAAT.html create mode 100644 documentation/jsdoc/symbols/String.html create mode 100644 documentation/jsdoc/symbols/_global_.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_AlphaBehavior.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_BaseBehavior.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ContainerBehavior.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_GenericBehavior.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Interpolator.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_PathBehavior.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_RotateBehavior.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Scale1Behavior.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ScaleBehavior.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_CAAT.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_Class.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_Constants.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_ModuleManager.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_AnimationLoop.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_Input.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_KeyEvent.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_MouseEvent.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchEvent.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchInfo.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Actor.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_ActorContainer.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DBodyActor.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DCircularBody.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DPolygonBody.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Director.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Scene.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImage.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageAnimationHelper.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageHelper.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerManager.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerTask.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Dock.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_IMActor.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_InterpolatorActor.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Label.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BorderLayout.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BoxLayout.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_GridLayout.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_LayoutManager.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_PathActor.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_ShapeActor.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_StarActor.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_TextActor.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Bezier.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_CatmullRom.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Curve.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Dimension.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix3.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Point.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Rectangle.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Audio_AudioManager.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CSS_csskeyframehelper.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CircleManager_PackedCircle.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CircleManager_PackedCircleManager.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_Quadtree.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_SpatialHash.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_ColorUtil_Color.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Debug_Debug.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Font_Font.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMBumpMapping.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMPlasma.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMRotoZoom.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_ImageProcessor.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_ImagePreloader.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_Preloader.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Util_ImageUtil.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_Template.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_TemplateWithSplash.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_LayoutUtils_RowLayout.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Locale_ResourceBundle.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Runtime_BrowserInfo.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Bone.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_BoneActor.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Skeleton.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_SkeletonActor.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Storage_LocalStorage.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureElement.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePage.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePageManager.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScan.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScanMap.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_ArcPath.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_CurvePath.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_LinearPath.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_Path.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_PathSegment.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_RectPath.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_SVGPath.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_ColorProgram.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_GLU.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_Program.js.html create mode 100644 documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_TextureProgram.js.html diff --git a/build/caat-box2d-min.js b/build/caat-box2d-min.js index 707a7284..bfa904a8 100644 --- a/build/caat-box2d-min.js +++ b/build/caat-box2d-min.js @@ -22,11 +22,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 4 +Version: 0.6 build: 6 Created on: DATE: 2013-07-01 -TIME: 04:32:54 +TIME: 04:58:33 */ diff --git a/build/caat-box2d.js b/build/caat-box2d.js index ce786082..420e2272 100644 --- a/build/caat-box2d.js +++ b/build/caat-box2d.js @@ -21,11 +21,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 51 +Version: 0.6 build: 5 Created on: -DATE: 2013-04-07 -TIME: 11:05:51 +DATE: 2013-07-01 +TIME: 04:58:33 */ diff --git a/build/caat-css-min.js b/build/caat-css-min.js index 183ba9fe..44a6dcd0 100644 --- a/build/caat-css-min.js +++ b/build/caat-css-min.js @@ -22,11 +22,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 4 +Version: 0.6 build: 6 Created on: DATE: 2013-07-01 -TIME: 04:32:54 +TIME: 04:58:33 */ diff --git a/build/caat-css.js b/build/caat-css.js index 0c25909c..5063e80f 100644 --- a/build/caat-css.js +++ b/build/caat-css.js @@ -21,11 +21,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 3 +Version: 0.6 build: 5 Created on: DATE: 2013-07-01 -TIME: 04:32:53 +TIME: 04:58:33 */ diff --git a/build/caat-min.js b/build/caat-min.js index 17e6b9f8..98c85f05 100644 --- a/build/caat-min.js +++ b/build/caat-min.js @@ -22,32 +22,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 52 +Version: 0.6 build: 6 Created on: -DATE: 2013-04-07 -TIME: 11:05:51 +DATE: 2013-07-01 +TIME: 04:58:33 */ -(function(a){function b(b){for(var b=b.split("."),c=a,d=0;d NOT solved."))},removeDependency:function(a){for(var b=0;b Can't extend non-existant class: "+this.baseClass);return}}else b= -e;b.extend(this.extendWith,this.constants,this.name,this.aliases,{decorated:this.decorated});console.log("Created module: "+this.name);this.callback&&this.callback()}};var g=function(a,b){this.path=a;this.module=b;return this};g.prototype={path:null,processed:false,module:null,setProcessed:function(){this.processed=true},isProcessed:function(){return this.processed}};var h=function(){this.nodes=[];this.loadedFiles=[];this.path={};this.solveListener=[];this.orderedSolvedModules=[];this.readyListener= -[];return this};h.baseURL="";h.modulePath={};h.sortedModulePath=[];h.symbol={};h.prototype={nodes:null,loadedFiles:null,solveListener:null,readyListener:null,orderedSolvedModules:null,addSolvedListener:function(a,b){this.solveListener.push({name:a,callback:b})},solved:function(a){var b;for(b=0;b catched "+d+" on module "+a.defines+" preCreation.")}if(!a.depends)a.depends= -[];if((b=a.depends)&&!isArray(b))b=[b],a.depends=b;for(c=0;c NOT solved."))},removeDependency:function(a){for(var b=0;b Can't extend non-existant class: "+this.baseClass);return}}else b=f;b.extend(this.extendWith,this.constants,this.name,this.aliases,{decorated:this.decorated});console.log("Created module: "+this.name);this.callback&&this.callback()}};var h=function(a,b){this.path=a;this.module=b;return this};h.prototype={path:null,processed:false,module:null,setProcessed:function(){this.processed=true},isProcessed:function(){return this.processed}};var i=function(){this.nodes=[];this.loadedFiles=[]; +this.path={};this.solveListener=[];this.orderedSolvedModules=[];this.readyListener=[];return this};i.baseURL="";i.modulePath={};i.sortedModulePath=[];i.symbol={};i.prototype={nodes:null,loadedFiles:null,solveListener:null,readyListener:null,orderedSolvedModules:null,addSolvedListener:function(a,b){this.solveListener.push({name:a,callback:b})},solved:function(a){var b;for(b=0;b catched "+ +d+" on module "+a.defines+" preCreation.")}if(!a.depends)a.depends=[];if((b=a.depends)&&!isArray(b))b=[b],a.depends=b;for(c=0;c>0,b[5]>>0);return this},transformRenderingContext_Clamp:function(a){var b=this.matrix;a.transform(b[0],b[3],b[1],b[4],b[2]>>0,b[5]>>0);return this},setModelViewMatrix:function(a,b,c,d,e){var f,g,h,i,j,k;k= @@ -79,9 +79,9 @@ CAAT.Module({defines:"CAAT.Math.Matrix3",aliases:["CAAT.Matrix3"],extendsWith:fu d*this.matrix[2][2]+this.matrix[2][3];return a},initialize:function(a,b,c,d,e,f,g,h,i){this.identity();this.matrix[0][0]=a;this.matrix[0][1]=b;this.matrix[0][2]=c;this.matrix[1][0]=d;this.matrix[1][1]=e;this.matrix[1][2]=f;this.matrix[2][0]=g;this.matrix[2][1]=h;this.matrix[2][2]=i;return this},initWithMatrix:function(a){this.matrix=a;return this},flatten:function(){var a=this.fmatrix,b=this.matrix;a[0]=b[0][0];a[1]=b[1][0];a[2]=b[2][0];a[3]=b[3][0];a[4]=b[0][1];a[5]=b[1][1];a[6]=b[2][1];a[7]=b[2][1]; a[8]=b[0][2];a[9]=b[1][2];a[10]=b[2][2];a[11]=b[3][2];a[12]=b[0][3];a[13]=b[1][3];a[14]=b[2][3];a[15]=b[3][3];return this.fmatrix},identity:function(){for(var a=0;a<4;a++)for(var b=0;b<4;b++)this.matrix[a][b]=a===b?1:0;return this},getMatrix:function(){return this.matrix},rotateXY:function(a){return this.rotate(a,0,0)},rotateXZ:function(a){return this.rotate(0,a,0)},rotateYZ:function(a){return this.rotate(0,0,a)},setRotate:function(a,b,c){this.copy(this.rotate(a,b,c));return this},rotate:function(a, b,c){var d=new CAAT.Math.Matrix3,e,f;a!==0&&(f=new CAAT.Math.Math.Matrix3,e=Math.sin(a),a=Math.cos(a),f.matrix[1][1]=a,f.matrix[1][2]=-e,f.matrix[2][1]=e,f.matrix[2][2]=a,d.multiply(f));b!==0&&(f=new CAAT.Math.Matrix3,e=Math.sin(b),a=Math.cos(b),f.matrix[0][0]=a,f.matrix[0][2]=-e,f.matrix[2][0]=e,f.matrix[2][2]=a,d.multiply(f));c!==0&&(f=new CAAT.Math.Matrix3,e=Math.sin(c),a=Math.cos(c),f.matrix[0][0]=a,f.matrix[0][1]=-e,f.matrix[1][0]=e,f.matrix[1][1]=a,d.multiply(f));return d},getClone:function(){var a= -new CAAT.Math.Matrix3;a.copy(this);return a},multiply:function(a){var b=this.getClone().matrix,c=b[0][0],d=b[0][1],e=b[0][2],f=b[0][3],g=b[1][0],h=b[1][1],i=b[1][2],j=b[1][3],k=b[2][0],m=b[2][1],o=b[2][2],b=b[2][3],n=a.matrix,a=n[0][0],p=n[0][1],q=n[0][2],r=n[0][3],t=n[1][0],s=n[1][1],u=n[1][2],v=n[1][3],w=n[2][0],x=n[2][1],y=n[2][2],z=n[2][3],A=n[3][0],B=n[3][1],C=n[3][2],n=n[3][3];this.matrix[0][0]=c*a+d*t+e*w+f*A;this.matrix[0][1]=c*p+d*s+e*x+f*B;this.matrix[0][2]=c*q+d*u+e*y+f*C;this.matrix[0][3]= -c*r+d*v+e*z+f*n;this.matrix[1][0]=g*a+h*t+i*w+j*A;this.matrix[1][1]=g*p+h*s+i*x+j*B;this.matrix[1][2]=g*q+h*u+i*y+j*C;this.matrix[1][3]=g*r+h*v+i*z+j*n;this.matrix[2][0]=k*a+m*t+o*w+b*A;this.matrix[2][1]=k*p+m*s+o*x+b*B;this.matrix[2][2]=k*q+m*u+o*y+b*C;this.matrix[2][3]=k*r+m*v+o*z+b*n;return this},premultiply:function(a){var b=this.getClone().matrix,c=b[0][0],d=b[0][1],e=b[0][2],f=b[0][3],g=b[1][0],h=b[1][1],i=b[1][2],j=b[1][3],k=b[2][0],m=b[2][1],o=b[2][2],b=b[2][3],n=a.matrix,a=n[0][0],p=n[0][1], -q=n[0][2],r=n[0][3],t=n[1][0],s=n[1][1],u=n[1][2],v=n[1][3],w=n[2][0],x=n[2][1],y=n[2][2],n=n[2][3];this.matrix[0][0]=c*a+d*t+e*w;this.matrix[0][1]=c*p+d*s+e*x;this.matrix[0][2]=c*q+d*u+e*y;this.matrix[0][3]=c*r+d*v+e*n+f;this.matrix[1][0]=g*a+h*t+i*w;this.matrix[1][1]=g*p+h*s+i*x;this.matrix[1][2]=g*q+h*u+i*y;this.matrix[1][3]=g*r+h*v+i*n+j;this.matrix[2][0]=k*a+m*t+o*w;this.matrix[2][1]=k*p+m*s+o*x;this.matrix[2][2]=k*q+m*u+o*y;this.matrix[2][3]=k*r+m*v+o*n+b;return this},setTranslate:function(a, +new CAAT.Math.Matrix3;a.copy(this);return a},multiply:function(a){var b=this.getClone().matrix,c=b[0][0],d=b[0][1],e=b[0][2],f=b[0][3],g=b[1][0],h=b[1][1],i=b[1][2],j=b[1][3],k=b[2][0],m=b[2][1],o=b[2][2],b=b[2][3],n=a.matrix,a=n[0][0],p=n[0][1],q=n[0][2],r=n[0][3],u=n[1][0],t=n[1][1],s=n[1][2],w=n[1][3],v=n[2][0],x=n[2][1],y=n[2][2],z=n[2][3],A=n[3][0],B=n[3][1],C=n[3][2],n=n[3][3];this.matrix[0][0]=c*a+d*u+e*v+f*A;this.matrix[0][1]=c*p+d*t+e*x+f*B;this.matrix[0][2]=c*q+d*s+e*y+f*C;this.matrix[0][3]= +c*r+d*w+e*z+f*n;this.matrix[1][0]=g*a+h*u+i*v+j*A;this.matrix[1][1]=g*p+h*t+i*x+j*B;this.matrix[1][2]=g*q+h*s+i*y+j*C;this.matrix[1][3]=g*r+h*w+i*z+j*n;this.matrix[2][0]=k*a+m*u+o*v+b*A;this.matrix[2][1]=k*p+m*t+o*x+b*B;this.matrix[2][2]=k*q+m*s+o*y+b*C;this.matrix[2][3]=k*r+m*w+o*z+b*n;return this},premultiply:function(a){var b=this.getClone().matrix,c=b[0][0],d=b[0][1],e=b[0][2],f=b[0][3],g=b[1][0],h=b[1][1],i=b[1][2],j=b[1][3],k=b[2][0],m=b[2][1],o=b[2][2],b=b[2][3],n=a.matrix,a=n[0][0],p=n[0][1], +q=n[0][2],r=n[0][3],u=n[1][0],t=n[1][1],s=n[1][2],w=n[1][3],v=n[2][0],x=n[2][1],y=n[2][2],n=n[2][3];this.matrix[0][0]=c*a+d*u+e*v;this.matrix[0][1]=c*p+d*t+e*x;this.matrix[0][2]=c*q+d*s+e*y;this.matrix[0][3]=c*r+d*w+e*n+f;this.matrix[1][0]=g*a+h*u+i*v;this.matrix[1][1]=g*p+h*t+i*x;this.matrix[1][2]=g*q+h*s+i*y;this.matrix[1][3]=g*r+h*w+i*n+j;this.matrix[2][0]=k*a+m*u+o*v;this.matrix[2][1]=k*p+m*t+o*x;this.matrix[2][2]=k*q+m*s+o*y;this.matrix[2][3]=k*r+m*w+o*n+b;return this},setTranslate:function(a, b,c){this.identity();this.matrix[0][3]=a;this.matrix[1][3]=b;this.matrix[2][3]=c;return this},translate:function(a,b,c){var d=new CAAT.Math.Matrix3;d.setTranslate(a,b,c);return d},setScale:function(a,b,c){this.identity();this.matrix[0][0]=a;this.matrix[1][1]=b;this.matrix[2][2]=c;return this},scale:function(a,b,c){var d=new CAAT.Math.Matrix3;d.setScale(a,b,c);return d},rotateModelView:function(a,b,c){var d=Math.sin(a),e=Math.sin(b),f=Math.sin(c),a=Math.cos(a),b=Math.cos(b),c=Math.cos(c);this.matrix[0][0]= b*a;this.matrix[0][1]=-b*d;this.matrix[0][2]=e;this.matrix[0][3]=0;this.matrix[1][0]=f*e*a+d*c;this.matrix[1][1]=c*a-f*e*d;this.matrix[1][2]=-f*b;this.matrix[1][3]=0;this.matrix[2][0]=f*d-c*e*a;this.matrix[2][1]=c*e*d+f*a;this.matrix[2][2]=c*b;this.matrix[2][3]=0;this.matrix[3][0]=0;this.matrix[3][1]=0;this.matrix[3][2]=0;this.matrix[3][3]=1;return this},copy:function(a){for(var b=0;b<4;b++)for(var c=0;c<4;c++)this.matrix[b][c]=a.matrix[b][c];return this},calculateDeterminant:function(){var a=this.matrix, b=a[0][0],c=a[0][1],d=a[0][2],e=a[0][3],f=a[1][0],g=a[1][1],h=a[1][2],i=a[1][3],j=a[2][0],k=a[2][1],m=a[2][2],o=a[2][3],n=a[3][0],p=a[3][1],q=a[3][2],a=a[3][3];return e*g*m*n+c*i*m*n+e*h*j*p+d*i*j*p+d*f*o*p+b*h*o*p+e*f*k*q+b*i*k*q+d*g*j*a+c*h*j*a+c*f*m*a+b*g*m*a+e*h*k*n-d*i*k*n-d*g*o*n-c*h*o*n-e*f*m*p-b*i*m*p-e*g*j*q-c*i*j*q-c*f*o*q-b*g*o*q-d*f*k*a-b*h*k*a},getInverse:function(){var a=this.matrix,b=a[0][0],c=a[0][1],d=a[0][2],e=a[0][3],f=a[1][0],g=a[1][1],h=a[1][2],i=a[1][3],j=a[2][0],k=a[2][1],m= @@ -117,23 +117,23 @@ CAAT.Module({defines:"CAAT.Behavior.BaseBehavior",constants:{Status:{NOT_STARTED b=(new CAAT.Behavior.Interpolator).createLinearInterpolator(true);return{__init:function(){this.lifecycleListenerList=[];this.setDefaultInterpolator();return this},lifecycleListenerList:null,behaviorStartTime:-1,behaviorDuration:-1,cycleBehavior:false,status:CAAT.Behavior.BaseBehavior.Status.NOT_STARTED,interpolator:null,actor:null,id:0,timeOffset:0,doValueApplication:true,solved:true,discardable:false,isRelative:false,setRelative:function(a){this.isRelative=a;return this},setRelativeValues:function(){this.isRelative= true;return this},parse:function(a){a.pingpong&&this.setPingPong();a.cycle&&this.setCycle(true);this.setDelayTime(a.delay||0,a.duration||1E3);a.interpolator&&this.setInterpolator(CAAT.Behavior.Interpolator.parse(a.interpolator))},setValueApplication:function(a){this.doValueApplication=a;return this},setTimeOffset:function(a){this.timeOffset=a;return this},setStatus:function(a){this.status=a;return this},setId:function(a){this.id=a;return this},setDefaultInterpolator:function(){this.interpolator=a; return this},setPingPong:function(){this.interpolator=b;return this},setFrameTime:function(a,b){this.behaviorStartTime=a;this.behaviorDuration=b;this.status=CAAT.Behavior.BaseBehavior.Status.NOT_STARTED;return this},setDelayTime:function(a,b){this.behaviorStartTime=a;this.behaviorDuration=b;this.status=CAAT.Behavior.BaseBehavior.Status.NOT_STARTED;this.expired=this.solved=false;return this},setOutOfFrameTime:function(){this.status=CAAT.Behavior.BaseBehavior.Status.EXPIRED;this.behaviorStartTime=Number.MAX_VALUE; -this.behaviorDuration=0;return this},setInterpolator:function(a){this.interpolator=a;return this},apply:function(a,b){if(!this.solved)this.behaviorStartTime+=a,this.solved=true;a+=this.timeOffset*this.behaviorDuration;var e=a;this.isBehaviorInTime(a,b)&&(a=this.normalizeTime(a),this.fireBehaviorAppliedEvent(b,e,a,this.setForTime(a,b)))},setCycle:function(a){this.cycleBehavior=a;return this},addListener:function(a){this.lifecycleListenerList.push(a);return this},emptyListenerList:function(){this.lifecycleListenerList= -[];return this},getStartTime:function(){return this.behaviorStartTime},getDuration:function(){return this.behaviorDuration},isBehaviorInTime:function(a,b){var e=CAAT.Behavior.BaseBehavior.Status;if(this.status===e.EXPIRED||this.behaviorStartTime<0)return false;this.cycleBehavior&&a>=this.behaviorStartTime&&(a=(a-this.behaviorStartTime)%this.behaviorDuration+this.behaviorStartTime);if(a>this.behaviorStartTime+this.behaviorDuration)return this.status!==e.EXPIRED&&this.setExpired(b,a),false;if(this.status=== -e.NOT_STARTED)this.status=e.STARTED,this.fireBehaviorStartedEvent(b,a);return this.behaviorStartTime<=a},fireBehaviorStartedEvent:function(a,b){for(var e=0,f=this.lifecycleListenerList.length;e=this.behaviorStartTime&&(a=(a-this.behaviorStartTime)%this.behaviorDuration+this.behaviorStartTime);if(a>this.behaviorStartTime+this.behaviorDuration)return this.status!== +e.EXPIRED&&this.setExpired(b,a),false;if(this.status===e.NOT_STARTED)this.status=e.STARTED,this.fireBehaviorStartedEvent(b,a);return this.behaviorStartTime<=a},fireBehaviorStartedEvent:function(a,b){for(var e=0,f=this.lifecycleListenerList.length;e>=0;for(var d= "@-"+a+"-keyframes "+b+" {",a=0;a<=c;a++)b=""+a/c*100+"%{opacity: "+this.calculateKeyFrameData(a/c)+"}",d+=b;d+="}";return d}}}}); -CAAT.Module({defines:"CAAT.Behavior.ContainerBehavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Behavior.GenericBehavior"],aliases:["CAAT.ContainerBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){if(a.behaviors&&a.behaviors.length)for(var b=0;b=d)){d=(d-c.behaviorStartTime)/c.behaviorDuration;c=c.getKeyFrameDataValues(d);for(var f in c)e[f]=c[f]}return e},calculateKeyFrameData:function(a,b){function c(a){if(f[a])h+=f[a];else if(prevValues&&(i=prevValues[a]))h+=i,f[a]=i}var d,e,f={},g;for(d=0;d=g&&(g=(g-e.behaviorStartTime)/e.behaviorDuration,g=e.calculateKeyFrameData(g),e=e.getPropertyName(b),typeof f[e]==="undefined"&&(f[e]=""),f[e]+=g+" "));var h="",i;c("translate");c("rotate");c("scale");d="";h&&(d="-"+b+"-transform: "+h+";");h="";c("opacity");h&&(d+=" opacity: "+h+";");d+=" -webkit-transform-origin: 0% 0%";return{rules:d,ret:f}},calculateKeyFramesData:function(a, -b,c,d,e){if(this.duration===Number.MAX_VALUE)return"";typeof d==="undefined"&&(d=0.5);typeof e==="undefined"&&(e=0.5);typeof c==="undefined"&&(c=100);for(var f="@-"+a+"-keyframes "+b+" {",g,h={},b=0;b<=c;b++){g=this.interpolator.getPosition(b/c).y;g=this.getKeyFrameDataValues(g);var i=""+b/c*100+"%{",j=g,k=void 0;for(k in h)j[k]||(j[k]=h[k]);h="-"+a+"-transform:";if(j.x||j.y)h+="translate("+(j.x||0)+"px,"+(j.y||0)+"px)";j.angle&&(h+=" rotate("+j.angle+"rad)");if(j.scaleX!==1||j.scaleY!==1)h+=" scale("+ -j.scaleX+","+j.scaleY+")";h+=";";j.alpha&&(h+=" opacity: "+j.alpha+";");if(d!==0.5||e!==0.5)h+=" -"+a+"-transform-origin:"+d*100+"% "+e*100+"%;";f+=i+h+"}\n";h=g}f+="}\n";return f}}}}); +CAAT.Module({defines:"CAAT.Behavior.ContainerBehavior",depends:["CAAT.Behavior.BaseBehavior","CAAT.Behavior.GenericBehavior"],aliases:["CAAT.ContainerBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){if(a.behaviors&&a.behaviors.length)for(var b=0;b=d)){d=(d-c.behaviorStartTime)/c.behaviorDuration; +c=c.getKeyFrameDataValues(d);for(var f in c)e[f]=c[f]}return e},calculateKeyFrameData:function(a,b){function c(a){if(f[a])h+=f[a];else if(prevValues&&(i=prevValues[a]))h+=i,f[a]=i}var d,e,f={},g;for(d=0;d=g&&(g=(g-e.behaviorStartTime)/e.behaviorDuration,g=e.calculateKeyFrameData(g), +e=e.getPropertyName(b),typeof f[e]==="undefined"&&(f[e]=""),f[e]+=g+" "));var h="",i;c("translate");c("rotate");c("scale");d="";h&&(d="-"+b+"-transform: "+h+";");h="";c("opacity");h&&(d+=" opacity: "+h+";");d+=" -webkit-transform-origin: 0% 0%";return{rules:d,ret:f}},calculateKeyFramesData:function(a,b,c,d,e){if(this.duration===Number.MAX_VALUE)return"";typeof d==="undefined"&&(d=0.5);typeof e==="undefined"&&(e=0.5);typeof c==="undefined"&&(c=100);for(var f="@-"+a+"-keyframes "+b+" {",g,h={},b=0;b<= +c;b++){g=this.interpolator.getPosition(b/c).y;g=this.getKeyFrameDataValues(g);var i=""+b/c*100+"%{",j=g,k=void 0;for(k in h)j[k]||(j[k]=h[k]);h="-"+a+"-transform:";if(j.x||j.y)h+="translate("+(j.x||0)+"px,"+(j.y||0)+"px)";j.angle&&(h+=" rotate("+j.angle+"rad)");if(j.scaleX!==1||j.scaleY!==1)h+=" scale("+j.scaleX+","+j.scaleY+")";h+=";";j.alpha&&(h+=" opacity: "+j.alpha+";");if(d!==0.5||e!==0.5)h+=" -"+a+"-transform-origin:"+d*100+"% "+e*100+"%;";f+=i+h+"}\n";h=g}f+="}\n";return f}}}}); CAAT.Module({defines:"CAAT.Behavior.GenericBehavior",depends:["CAAT.Behavior.BaseBehavior"],aliases:["CAAT.GenericBehavior"],extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{start:0,end:0,target:null,property:null,callback:null,setForTime:function(a,b){var c=this.start+a*(this.end-this.start);this.callback&&this.callback(c,this.target,b);this.property&&(this.target[this.property]=c)},setValues:function(a,b,c,d,e){this.start=a;this.end=b;this.target=c;this.property=d;this.callback= e;return this}}}}); CAAT.Module({defines:"CAAT.Behavior.PathBehavior",aliases:["CAAT.PathBehavior"],depends:["CAAT.Behavior.BaseBehavior","CAAT.Foundation.SpriteImage"],constants:{AUTOROTATE:{LEFT_TO_RIGHT:0,RIGHT_TO_LEFT:1,FREE:2},autorotate:{LEFT_TO_RIGHT:0,RIGHT_TO_LEFT:1,FREE:2}},extendsClass:"CAAT.Behavior.BaseBehavior",extendsWith:function(){return{parse:function(a){CAAT.Behavior.PathBehavior.superclass.parse.call(this,a);a.SVG&&this.setValues((new CAAT.PathUtil.SVGPath).parsePath(a.SVG));if(a.autoRotate)this.autoRotate=a.autoRotate}, @@ -159,19 +159,20 @@ CAAT.Module({defines:"CAAT.Module.Runtime.BrowserInfo",constants:function(){func {string:navigator.platform,subString:"Mac",identity:"Mac"},{string:navigator.userAgent,subString:"iPhone",identity:"iPhone/iPod"},{string:navigator.platform,subString:"Linux",identity:"Linux"}],d=a([{string:navigator.userAgent,subString:"Chrome",identity:"Chrome"},{string:navigator.userAgent,subString:"OmniWeb",versionSearch:"OmniWeb/",identity:"OmniWeb"},{string:navigator.vendor,subString:"Apple",identity:"Safari",versionSearch:"Version"},{prop:window.opera,identity:"Opera"},{string:navigator.vendor, subString:"iCab",identity:"iCab"},{string:navigator.vendor,subString:"KDE",identity:"Konqueror"},{string:navigator.userAgent,subString:"Firefox",identity:"Firefox"},{string:navigator.vendor,subString:"Camino",identity:"Camino"},{string:navigator.userAgent,subString:"Netscape",identity:"Netscape"},{string:navigator.userAgent,subString:"MSIE",identity:"Explorer",versionSearch:"MSIE"},{string:navigator.userAgent,subString:"Explorer",identity:"Explorer",versionSearch:"Explorer"},{string:navigator.userAgent, subString:"Gecko",identity:"Mozilla",versionSearch:"rv"},{string:navigator.userAgent,subString:"Mozilla",identity:"Netscape",versionSearch:"Mozilla"}])||"An unknown browser",e=b(navigator.userAgent)||b(navigator.appVersion)||"an unknown version",c=a(c)||"an unknown OS";return{browser:d,version:e,OS:c,DevicePixelRatio:window.devicePixelRatio||1}}}); -CAAT.Module({defines:"CAAT.Module.Audio.AudioManager",depends:["CAAT.Module.Runtime.BrowserInfo"],extendsWith:function(){return{__init:function(){this.browserInfo=CAAT.Module.Runtime.BrowserInfo;return this},musicChannel:null,browserInfo:null,musicEnabled:true,fxEnabled:true,audioCache:null,channels:null,workingChannels:null,loopingChannels:[],audioTypes:{mp3:"audio/mpeg;",ogg:'audio/ogg; codecs="vorbis"',wav:'audio/wav; codecs="1"',mp4:'audio/mp4; codecs="mp4a.40.2"'},initialize:function(a){this.audioCache= -[];this.channels=[];this.workingChannels=[];for(var b=0;b<=a;b++){var c=document.createElement("audio");if(null!==c){c.finished=-1;this.channels.push(c);var d=this;c.addEventListener("ended",function(a){var a=a.target,b;for(b=0;b0){var b= -this.channels.shift();b.src=a.src;b.volume=a.volume;b.play();this.workingChannels.push(b)}return a},cancelPlay:function(a){for(var b=0;this.workingChannels.length;b++){var c=this.workingChannels[b];c.caat_id===a&&(c.pause(),this.channels.push(c),this.workingChannels.splice(b,1))}return this},cancelPlayByChannel:function(a){for(var b=0;this.workingChannels.length;b++)if(this.workingChannels[b]===a){this.channels.push(a);this.workingChannels.splice(b,1);break}return this},loop:function(a){if(!this.musicEnabled)return null; -a=this.getAudio(a);if(null!==a){var b=document.createElement("audio");if(null!==b)return b.src=a.src,b.preload="auto",this.browserInfo.browser==="Firefox"?b.addEventListener("ended",function(a){a.target.currentTime=0},false):b.loop=true,b.load(),b.play(),this.loopingChannels.push(b),b}return null},endSound:function(){var a;for(a=0;a0?(a=this.channels.shift(),a.src=b.src,a.volume=b.volume,a.play(),this.workingChannels.push(a)):console.log("Can't play audio: "+a);return b},cancelPlay:function(a){for(var b=0;this.workingChannels.length;b++){var c=this.workingChannels[b];c.caat_id===a&&(c.pause(),this.channels.push(c),this.workingChannels.splice(b,1))}return this},cancelPlayByChannel:function(a){for(var b=0;this.workingChannels.length;b++)if(this.workingChannels[b]=== +a){this.channels.push(a);this.workingChannels.splice(b,1);break}return this},loop:function(a){if(!this.musicEnabled)return null;a=this.getAudio(a);if(null!==a){var b=document.createElement("audio");if(null!==b)return b.src=a.src,b.preload="auto",this.isFirefox?b.addEventListener("ended",function(a){a.target.currentTime=0},false):b.loop=true,b.load(),b.play(),this.loopingChannels.push(b),b}return null},endSound:function(){var a;for(a=0;a=g)return{r:d,g:e,b:f};a=a+(d-a)/g*h>>0;b=b+(e-b)/g*h>>0;c=c+(f-c)/g*h>>0;a>255?a=255:a<0&&(a=0);b>255?b=255:b<0&&(b=0);c>255?c=255:c<0&&(c=0);return{r:a,g:b,b:c}},makeRGBColorRamp:function(a,b,c){var d= -[],e=a.length-1;b/=e;var f,g,h,i,j,k,m,o,n,p,q,r,t,s;for(f=0;f>24&255;n=(m&16711680)>>16;p=(m&65280)>>8;m&=255;g=a[f+1];q=g>>24&255;r=(g&16711680)>>16;t=(g&65280)>>8;g&=255;q=(q-o)/b;r=(r-n)/b;t=(t-p)/b;s=(g-m)/b;for(g=0;g>0;i=n+r*g>>0;j=p+t*g>>0;k=m+s*g>>0;var u=CAAT.Module.ColorUtil.Color.RampEnumeration;switch(c){case u.RAMP_RGBA:d.push("argb("+h+","+i+","+j+","+k+")");break;case u.RAMP_RGB:d.push("rgb("+i+","+j+","+k+")");break;case u.RAMP_CHANNEL_RGB:d.push(4278190080| -i<<16|j<<8|k);break;case u.RAMP_CHANNEL_RGBA:d.push(h<<24|i<<16|j<<8|k);break;case u.RAMP_CHANNEL_RGBA_ARRAY:d.push([i,j,k,h]);break;case u.RAMP_CHANNEL_RGB_ARRAY:d.push([i,j,k])}}}return d},random:function(){for(var a="#",b=0;b<3;b++)a+="0123456789abcdef"[Math.random()*16>>0];return a}},extendsWith:{__init:function(a,b,c){this.r=a||255;this.g=b||255;this.b=c||255;return this},r:255,g:255,b:255,toHex:function(){return("000000"+((this.r<<16)+(this.g<<8)+this.b).toString(16)).slice(-6)}}}); +[],e=a.length-1;b/=e;var f,g,h,i,j,k,m,o,n,p,q,r,u,t;for(f=0;f>24&255;n=(m&16711680)>>16;p=(m&65280)>>8;m&=255;g=a[f+1];q=g>>24&255;r=(g&16711680)>>16;u=(g&65280)>>8;g&=255;q=(q-o)/b;r=(r-n)/b;u=(u-p)/b;t=(g-m)/b;for(g=0;g>0;i=n+r*g>>0;j=p+u*g>>0;k=m+t*g>>0;var s=CAAT.Module.ColorUtil.Color.RampEnumeration;switch(c){case s.RAMP_RGBA:d.push("argb("+h+","+i+","+j+","+k+")");break;case s.RAMP_RGB:d.push("rgb("+i+","+j+","+k+")");break;case s.RAMP_CHANNEL_RGB:d.push(4278190080| +i<<16|j<<8|k);break;case s.RAMP_CHANNEL_RGBA:d.push(h<<24|i<<16|j<<8|k);break;case s.RAMP_CHANNEL_RGBA_ARRAY:d.push([i,j,k,h]);break;case s.RAMP_CHANNEL_RGB_ARRAY:d.push([i,j,k])}}}return d},random:function(){for(var a="#",b=0;b<3;b++)a+="0123456789abcdef"[Math.random()*16>>0];return a}},extendsWith:{__init:function(a,b,c){this.r=a||255;this.g=b||255;this.b=c||255;return this},r:255,g:255,b:255,toHex:function(){return("000000"+((this.r<<16)+(this.g<<8)+this.b).toString(16)).slice(-6)}}}); CAAT.Module({defines:"CAAT.Module.Debug.Debug",depends:["CAAT.Event.AnimationLoop"],extendsWith:{width:0,height:0,canvas:null,ctx:null,statistics:null,framerate:null,textContainer:null,textFPS:null,textEntitiesTotal:null,textEntitiesActive:null,textDraws:null,textDrawTime:null,textRAFTime:null,textDirtyRects:null,textDiscardDR:null,frameTimeAcc:0,frameRAFAcc:0,canDebug:false,SCALE:60,debugTpl:'
    CAAT Debug panel Performance Controls Draw Time: 5.46 ms. FPS: 48
    RAF Time: 20.76 ms. Entities Total: 41 Entities Active: 37 Draws: 0 DirtyRects: 0 Discard DR: 0
    Sound
    Music
    AA Bounding Boxes
    Bounding Boxes
    Dirty Rects
    ', setScale:function(a){this.scale=a;return this},initialize:function(a,b){this.width=a=window.innerWidth;this.height=b;this.framerate={refreshInterval:CAAT.FPS_REFRESH||500,frames:0,timeLastRefresh:0,fps:0,prevFps:-1,fpsMin:1E3,fpsMax:0};if(!document.getElementById("caat-debug")){var c=document.createElement("div");c.innerHTML=this.debugTpl;document.body.appendChild(c);eval(' var __x= CAAT; function initCheck( name, bool, callback ) { var elem= document.getElementById(name); if ( elem ) { elem.className= (bool) ? "checkbox_enabled" : "checkbox_disabled"; if ( callback ) { elem.addEventListener( "click", (function(elem, callback) { return function(e) { elem.__value= !elem.__value; elem.className= (elem.__value) ? "checkbox_enabled" : "checkbox_disabled"; callback(e,elem.__value); } })(elem, callback), false ); } elem.__value= bool; } } function setupTabs() { var numTabs=0; var elem; var elemContent; do { elem= document.getElementById("caat-debug-tab"+numTabs); if ( elem ) { elemContent= document.getElementById("caat-debug-tab"+numTabs+"-content"); if ( elemContent ) { elemContent.style.display= numTabs===0 ? \'block\' : \'none\'; elem.className= numTabs===0 ? "debug_tab debug_tab_selected" : "debug_tab debug_tab_not_selected"; elem.addEventListener( "click", (function(tabIndex) { return function(e) { for( var i=0; i>0)-0.5;b.moveTo(0.5,c);b.lineTo(this.width+0.5,c);b.stroke();b.strokeStyle="#aa2";b.beginPath();c=this.height-(30/this.SCALE*this.height>>0)-0.5;b.moveTo(0.5,c);b.lineTo(this.width+0.5,c);b.stroke();c=Math.min(this.height-this.framerate.fps/this.SCALE*this.height,59);if(-1===this.framerate.prevFps)this.framerate.prevFps=c|0;b.strokeStyle= "#0ff";b.beginPath();b.moveTo(this.width,(c|0)-0.5);b.lineTo(this.width,this.framerate.prevFps-0.5);b.stroke();this.framerate.prevFps=c;a=(this.height-a/this.SCALE*this.height>>0)-0.5;b.strokeStyle="#ff0";b.beginPath();b.moveTo(this.width,a);b.lineTo(this.width,a);b.stroke()}}}); -CAAT.Module({defines:"CAAT.Module.Font.Font",aliases:"CAAT.Font",depends:["CAAT.Foundation.SpriteImage"],constants:{getFontMetrics:function(a){var b;if(CAAT.CSS_TEXT_METRICS)try{return b=CAAT.Module.Font.Font.getFontMetricsCSS(a)}catch(c){}return CAAT.Module.Font.Font.getFontMetricsNoCSS(a)},getFontMetricsNoCSS:function(a){var a=/(\d+)p[x|t]/i.exec(a),b;b=a?a[1]|0:32;a=b-1;b=b+b*0.2|0;return{height:b,ascent:a,descent:b-a}},getFontMetricsCSS:function(a){function b(a){var b,c,d;d=a&&a.ownerDocument; +CAAT.Module({defines:"CAAT.Module.Font.Font",aliases:"CAAT.Font",depends:["CAAT.Foundation.SpriteImage"],constants:{getFontMetrics:function(a){var b;if(CAAT.CSS_TEXT_METRICS)try{return b=CAAT.Module.Font.Font.getFontMetricsCSS(a)}catch(c){}return CAAT.Module.Font.Font.getFontMetricsNoCSS(a)},getFontMetricsNoCSS:function(a){var a=/(\d+)p[x|t]\s*/i.exec(a),b;b=a?a[1]|0:32;a=b-1;b=b+b*0.2|0;return{height:b,ascent:a,descent:b-a}},getFontMetricsCSS:function(a){function b(a){var b,c,d;d=a&&a.ownerDocument; b=d.documentElement;a=a.getBoundingClientRect();c=document.body;d=d.nodeType===9?d.defaultView||d.parentWindow:false;return{top:a.top+(d.pageYOffset||b.scrollTop)-(b.clientTop||c.clientTop||0),left:a.left+(d.pageXOffset||b.scrollLeft)-(b.clientLeft||c.clientLeft||0)}}try{var c=document.createElement("span");c.style.font=a;c.innerHTML="Hg";var d=document.createElement("div");d.style.display="inline-block";d.style.width="1px";d.style.heigh="0px";var e=document.createElement("div");e.appendChild(c); e.appendChild(d);var f=document.body;f.appendChild(e);try{return a={},d.style.verticalAlign="baseline",a.ascent=b(d).top-b(c).top,d.style.verticalAlign="bottom",a.height=b(d).top-b(c).top,a.ascent=Math.ceil(a.ascent),a.height=Math.ceil(a.height),a.descent=a.height-a.ascent,a}finally{f.removeChild(e)}}catch(g){return null}}},extendsWith:function(){return{fontSize:10,fontSizeUnit:"px",font:"Sans-Serif",fontStyle:"",fillStyle:"#fff",strokeStyle:null,strokeSize:1,padding:0,image:null,charMap:null,height:0, ascent:0,descent:0,setPadding:function(a){this.padding=a;return this},setFontStyle:function(a){this.fontStyle=a;return this},setStrokeSize:function(a){this.strokeSize=a;return this},setFontSize:function(a){this.fontSize=a;this.fontSizeUnit="px";return this},setFont:function(a){this.font=a;return this},setFillStyle:function(a){this.fillStyle=a;return this},setStrokeStyle:function(a){this.strokeStyle=a;return this},createDefault:function(a){for(var b="",c=32;c<128;c++)b+=String.fromCharCode(c);return this.create(b, a)},create:function(a,b){b|=0;this.padding=b;var c=document.createElement("canvas"),d=c.getContext("2d");d.textBaseline="bottom";d.font=this.fontStyle+" "+this.fontSize+""+this.fontSizeUnit+" "+this.font;var e=0,f=[],g,h;for(g=0;g>0)+1)+2*b;f.push(i);e+=i}g=CAAT.Font.getFontMetrics(d.font);d=g.height;this.ascent=g.ascent;this.descent=g.descent;this.height=g.height;i=g.ascent;c.width=e;c.height=d;d=c.getContext("2d");d.textBaseline= -"alphabetic";d.font=this.fontStyle+" "+this.fontSize+""+this.fontSizeUnit+" "+this.font;d.fillStyle=this.fillStyle;d.strokeStyle=this.strokeStyle;this.charMap={};for(g=e=0;g0&&g.height>0&&b.drawImage(this.image,g.x,0,h,i,c,d,h,i),c+=h):(b.strokeStyle="#f00",b.strokeRect(c,d,10,i),c+=10)},save:function(){var a=this.image.toDataURL("image/png");document.location.href=a.replace("image/png","image/octet-stream")},drawSpriteText:function(a,b){this.spriteImage.drawSpriteText(a,b)}}}}); +"alphabetic";d.font=this.fontStyle+" "+this.fontSize+""+this.fontSizeUnit+" "+this.font;d.fillStyle=this.fillStyle;d.strokeStyle=this.strokeStyle;this.charMap={};for(g=e=0;g0&&g.height>0&&b.drawImage(this.image,g.x,0,h,i,c,d,h,i),c+=h):(b.strokeStyle="#f00",b.strokeRect(c,d,10,i),c+=10)},save:function(){var a=this.image.toDataURL("image/png");document.location.href=a.replace("image/png","image/octet-stream")},drawSpriteText:function(a,b){this.spriteImage.drawSpriteText(a,b)}}}}); CAAT.Module({defines:"CAAT.Module.CircleManager.PackedCircle",depends:["CAAT.Module.CircleManager.PackedCircle","CAAT.Math.Point"],constants:{BOUNDS_RULE_WRAP:1,BOUNDS_RULE_CONSTRAINT:2,BOUNDS_RULE_DESTROY:4,BOUNDS_RULE_IGNORE:8},extendsWith:{__init:function(){this.boundsRule=CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_IGNORE;this.position=new CAAT.Math.Point(0,0,0);this.offset=new CAAT.Math.Point(0,0,0);this.targetPosition=new CAAT.Math.Point(0,0,0);return this},id:0,delegate:null,position:null, offset:null,targetPosition:null,targetChaseSpeed:0.02,isFixed:false,boundsRule:0,collisionMask:0,collisionGroup:0,containsPoint:function(a){return this.position.getDistanceSquared(a)>=0;var d=true,e=true,f=true,g=true;if(typeof c!== "undefined"){if(typeof c.top!=="undefined")d=c.top;if(typeof c.bottom!=="undefined")e=c.bottom;if(typeof c.left!=="undefined")f=c.left;if(typeof c.right!=="undefined")g=c.right}c=document.createElement("canvas");c.width=a.width;c.height=a.height;var h=c.getContext("2d");h.fillStyle="rgba(0,0,0,0)";h.fillRect(0,0,a.width,a.height);h.drawImage(a,0,0);var i=h.getImageData(0,0,a.width,a.height).data,j,a=0,k=c.height-1,m=0,o=c.width-1,n=false;if(d){for(d=0;d0?c=Math.ceil((d+b-1)/b):b=Math.ceil((d+c-1)/c) e=0,f=0,g;b>0?c=Math.ceil((d+b-1)/b):b=Math.ceil((d+c-1)/c);for(g=0;g>0)*e;var k=i+(d/h>>0)*f,m=g+e,o=k+f;g=(new CAAT.Foundation.SpriteImageHelper(g,k,m-g,o-k,j.width,j.height)).setGL(g/j.width,k/j.height,m/j.width,o/j.height);this.mapInfo[d]=g}}else for(d=0;d0&&(f-=d);var g=(this.offsetY-this.ownerActor.y)%e; -g>0&&(g-=e);for(var d=((c.width-f)/d>>0)+1,e=((c.height-g)/e>>0)+1,h,i=a.ctx,a=0;a>0,c.y-this.ownerActor.y+g+a*b.height>>0,b.width,b.height)},paintInvertedH:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate((c|0)+b.width,d|0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedV:function(a, -b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedHV:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.translate(b.width,0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this}, -paintN:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintAtRect:function(a,b,c,d,e,f){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,e,f);return this},paintScaledWidth:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+ -d>>0,this.ownerActor.width,b.height);return this},paintChunk:function(a,b,c,d,e,f,g){a.drawImage(this.image,d,e,f,g,b,c,f,g)},paintTile:function(a,b,c,d){b=this.mapInfo[b];a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintScaled:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,this.ownerActor.height);return this},getCurrentSpriteImageCSSPosition:function(){var a= -this.mapInfo[this.spriteIndex];return""+-(a.x+this.parentOffsetX-this.offsetX)+"px "+-(a.y+this.parentOffsetY-this.offsetY)+"px "+(this.ownerActor.transformation===CAAT.Foundation.SpriteImage.TR_TILE?"repeat":"no-repeat")},getNumImages:function(){return this.rows*this.columns},setUV:function(a,b){var c=this.image;if(c.__texturePage){var d=b,e=this.mapInfo[this.spriteIndex],f=e.u,g=e.v,h=e.u1,e=e.v1;if(this.offsetX||this.offsetY)f=c.__texturePage,g=-this.offsetY/f.height,h=(this.ownerActor.width-this.offsetX)/ -f.width,e=(this.ownerActor.height-this.offsetY)/f.height,f=-this.offsetX/f.width+c.__u,g+=c.__v,h+=c.__u,e+=c.__v;c.inverted?(a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e,a[d++]=f,a[d++]=g):(a[d++]=f,a[d++]=g,a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e)}},setChangeFPS:function(a){this.changeFPS=a;return this},setSpriteTransformation:function(a){this.transformation=a;var b=CAAT.Foundation.SpriteImage;switch(a){case b.TR_FLIP_HORIZONTAL:this.paint=this.paintInvertedH;break;case b.TR_FLIP_VERTICAL:this.paint= -this.paintInvertedV;break;case b.TR_FLIP_ALL:this.paint=this.paintInvertedHV;break;case b.TR_FIXED_TO_SIZE:this.paint=this.paintScaled;break;case b.TR_FIXED_WIDTH_TO_SIZE:this.paint=this.paintScaledWidth;break;case b.TR_TILE:this.paint=this.paintTiled;break;default:this.paint=this.paintN}this.ownerActor.invalidate();return this},resetAnimationTime:function(){this.prevAnimationTime=-1;return this},setAnimationImageIndex:function(a){this.animationImageIndex=a;this.spriteIndex=a[0];this.prevAnimationTime= --1;return this},setSpriteIndex:function(a){this.spriteIndex=a;return this},setSpriteIndexAtTime:function(a){if(this.animationImageIndex.length>1){if(this.prevAnimationTime===-1)this.prevAnimationTime=a,this.spriteIndex=this.animationImageIndex[0],this.prevIndex=0;else{var b=a;b-=this.prevAnimationTime;b/=this.changeFPS;b%=this.animationImageIndex.length;b=Math.floor(b);b>0,f=0;fa&&(a=c)}this.fontHeight=a;return this.fontHeight*this.fontScale},drawText:function(a,b,c,d){var e,f,g;for(e=0;e0&&f.height>0&&b.drawImage(this.image,f.x,f.y,g,f.height,c+f.xoffset*this.fontScale,d+f.yoffset*this.fontScale,g*this.fontScale,f.height*this.fontScale),c+=f.xadvance*this.fontScale},getFontData:function(){var a=this.stringHeight()*0.8>>0; -return{height:this.stringHeight(),ascent:a,descent:this.stringHeight()-a}}}}}); +CAAT.Module({defines:"CAAT.Foundation.SpriteImage",aliases:["CAAT.SpriteImage"],depends:["CAAT.Foundation.SpriteImageHelper","CAAT.Foundation.SpriteImageAnimationHelper","CAAT.Math.Rectangle"],constants:{TR_NONE:0,TR_FLIP_HORIZONTAL:1,TR_FLIP_VERTICAL:2,TR_FLIP_ALL:3,TR_FIXED_TO_SIZE:4,TR_FIXED_WIDTH_TO_SIZE:6,TR_TILE:5},extendsWith:function(){return{__init:function(){this.paint=this.paintN;this.setAnimationImageIndex([0]);this.mapInfo={};this.animationsMap={};arguments.length===1?this.initialize.call(this, +arguments[0],1,1):arguments.length===3&&this.initialize.apply(this,arguments);return this},animationImageIndex:null,prevAnimationTime:-1,changeFPS:1E3,transformation:0,spriteIndex:0,prevIndex:0,currentAnimation:null,image:null,rows:1,columns:1,width:0,height:0,singleWidth:0,singleHeight:0,scaleX:1,scaleY:1,offsetX:0,offsetY:0,parentOffsetX:0,parentOffsetY:0,ownerActor:null,mapInfo:null,map:null,animationsMap:null,callback:null,fontScale:1,getOwnerActor:function(){return this.ownerActor},addAnimation:function(a, +b,c,d){this.animationsMap[a]=new CAAT.Foundation.SpriteImageAnimationHelper(b,c,d);return this},setAnimationEndCallback:function(a){this.callback=a},playAnimation:function(a){if(a===this.currentAnimation)return this;var b=this.animationsMap[a];if(!b)return this;this.currentAnimation=a;this.setAnimationImageIndex(b.animation);this.changeFPS=b.time;this.callback=b.onEndPlayCallback;return this},setOwner:function(a){this.ownerActor=a;return this},getRows:function(){return this.rows},getColumns:function(){return this.columns}, +getWidth:function(){return this.mapInfo[this.spriteIndex].width},getHeight:function(){return this.mapInfo[this.spriteIndex].height},getWrappedImageWidth:function(){return this.image.width},getWrappedImageHeight:function(){return this.image.height},getRef:function(){var a=new CAAT.Foundation.SpriteImage;a.image=this.image;a.rows=this.rows;a.columns=this.columns;a.width=this.width;a.height=this.height;a.singleWidth=this.singleWidth;a.singleHeight=this.singleHeight;a.mapInfo=this.mapInfo;a.offsetX=this.offsetX; +a.offsetY=this.offsetY;a.scaleX=this.scaleX;a.scaleY=this.scaleY;a.animationsMap=this.animationsMap;a.parentOffsetX=this.parentOffsetX;a.parentOffsetY=this.parentOffsetY;a.scaleFont=this.scaleFont;return a},setOffsetX:function(a){this.offsetX=a;return this},setOffsetY:function(a){this.offsetY=a;return this},setOffset:function(a,b){this.offsetX=a;this.offsetY=b;return this},initialize:function(a,b,c){a||console.log("Null image for SpriteImage.");isString(a)&&(a=CAAT.currentDirector.getImage(a));this.parentOffsetY= +this.parentOffsetX=0;this.rows=b;this.columns=c;if(a instanceof CAAT.Foundation.SpriteImage||a instanceof CAAT.SpriteImage){this.image=a.image;var d=a.mapInfo[0];this.width=d.width;this.height=d.height;this.parentOffsetX=d.x;this.parentOffsetY=d.y;this.width=a.mapInfo[0].width;this.height=a.mapInfo[0].height}else this.image=a,this.width=a.width,this.height=a.height,this.mapInfo={};this.singleWidth=Math.floor(this.width/c);this.singleHeight=Math.floor(this.height/b);var e,f,g;if(a.__texturePage){a.__du= +this.singleWidth/a.__texturePage.width;a.__dv=this.singleHeight/a.__texturePage.height;e=this.singleWidth;f=this.singleHeight;var h=this.columns;if(a.inverted)d=e,e=f,f=d,h=this.rows;for(var a=this.image.__tx,i=this.image.__ty,j=this.image.__texturePage,d=0;d>0)*e;var k=i+(d/h>>0)*f,m=g+e,o=k+f;g=(new CAAT.Foundation.SpriteImageHelper(g,k,m-g,o-k,j.width,j.height)).setGL(g/j.width,k/j.height,m/j.width,o/j.height);this.mapInfo[d]=g}}else for(d=0;d0&&(f-=d);var g=(this.offsetY-this.ownerActor.y)%e;g>0&&(g-=e);for(var d=((c.width-f)/d>>0)+1,e=((c.height-g)/e>>0)+1,h,i=a.ctx,a=0;a>0,c.y-this.ownerActor.y+g+a*b.height>>0,b.width,b.height)},paintInvertedH:function(a, +b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate((c|0)+b.width,d|0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedV:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintInvertedHV:function(a, +b,c,d){b=this.mapInfo[this.spriteIndex];a=a.ctx;a.save();a.translate(c|0,d+b.height|0);a.scale(1,-1);a.translate(b.width,0);a.scale(-1,1);a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX>>0,this.offsetY>>0,b.width,b.height);a.restore();return this},paintN:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,b.width,b.height);return this},paintAtRect:function(a,b,c,d,e,f){b=this.mapInfo[this.spriteIndex]; +a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,e,f);return this},paintScaledWidth:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,b.height);return this},paintChunk:function(a,b,c,d,e,f,g){a.drawImage(this.image,d,e,f,g,b,c,f,g)},paintTile:function(a,b,c,d){b=this.mapInfo[b];a.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+ +d>>0,b.width,b.height);return this},paintScaled:function(a,b,c,d){b=this.mapInfo[this.spriteIndex];a.ctx.drawImage(this.image,b.x,b.y,b.width,b.height,this.offsetX+c>>0,this.offsetY+d>>0,this.ownerActor.width,this.ownerActor.height);return this},getCurrentSpriteImageCSSPosition:function(){var a=this.mapInfo[this.spriteIndex];return""+-(a.x+this.parentOffsetX-this.offsetX)+"px "+-(a.y+this.parentOffsetY-this.offsetY)+"px "+(this.ownerActor.transformation===CAAT.Foundation.SpriteImage.TR_TILE?"repeat": +"no-repeat")},getNumImages:function(){return this.rows*this.columns},setUV:function(a,b){var c=this.image;if(c.__texturePage){var d=b,e=this.mapInfo[this.spriteIndex],f=e.u,g=e.v,h=e.u1,e=e.v1;if(this.offsetX||this.offsetY)f=c.__texturePage,g=-this.offsetY/f.height,h=(this.ownerActor.width-this.offsetX)/f.width,e=(this.ownerActor.height-this.offsetY)/f.height,f=-this.offsetX/f.width+c.__u,g+=c.__v,h+=c.__u,e+=c.__v;c.inverted?(a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e,a[d++]=f,a[d++]= +g):(a[d++]=f,a[d++]=g,a[d++]=h,a[d++]=g,a[d++]=h,a[d++]=e,a[d++]=f,a[d++]=e)}},setChangeFPS:function(a){this.changeFPS=a;return this},setSpriteTransformation:function(a){this.transformation=a;var b=CAAT.Foundation.SpriteImage;switch(a){case b.TR_FLIP_HORIZONTAL:this.paint=this.paintInvertedH;break;case b.TR_FLIP_VERTICAL:this.paint=this.paintInvertedV;break;case b.TR_FLIP_ALL:this.paint=this.paintInvertedHV;break;case b.TR_FIXED_TO_SIZE:this.paint=this.paintScaled;break;case b.TR_FIXED_WIDTH_TO_SIZE:this.paint= +this.paintScaledWidth;break;case b.TR_TILE:this.paint=this.paintTiled;break;default:this.paint=this.paintN}this.ownerActor.invalidate();return this},resetAnimationTime:function(){this.prevAnimationTime=-1;return this},setAnimationImageIndex:function(a){this.animationImageIndex=a;this.spriteIndex=a[0];this.prevAnimationTime=-1;return this},setSpriteIndex:function(a){this.spriteIndex=a;return this},setSpriteIndexAtTime:function(a){if(this.animationImageIndex.length>1){if(this.prevAnimationTime===-1)this.prevAnimationTime= +a,this.spriteIndex=this.animationImageIndex[0],this.prevIndex=0;else{var b=a;b-=this.prevAnimationTime;b/=this.changeFPS;b%=this.animationImageIndex.length;b=Math.floor(b);b>0,f=0;fa&&(a=c)}this.fontHeight=a;return this.fontHeight*this.fontScale},drawText:function(a,b,c,d){var e,f,g;for(e=0;e0&&f.height>0&&b.drawImage(this.image,f.x,f.y,g,f.height,c+f.xoffset*this.fontScale,d+f.yoffset*this.fontScale,g*this.fontScale,f.height*this.fontScale),c+=f.xadvance*this.fontScale}, +getFontData:function(){var a=this.stringHeight()*0.8>>0;return{height:this.stringHeight(),ascent:a,descent:this.stringHeight()-a}}}}}); CAAT.Module({defines:"CAAT.Foundation.Actor",aliases:["CAAT.Actor"],depends:"CAAT.Math.Dimension,CAAT.Event.AnimationLoop,CAAT.Foundation.SpriteImage,CAAT.Core.Constants,CAAT.Behavior.PathBehavior,CAAT.Behavior.RotateBehavior,CAAT.Behavior.ScaleBehavior,CAAT.Behavior.Scale1Behavior,CAAT.PathUtil.LinearPath,CAAT.Event.AnimationLoop".split(","),constants:{ANCHOR_CENTER:0,ANCHOR_TOP:1,ANCHOR_BOTTOM:2,ANCHOR_LEFT:3,ANCHOR_RIGHT:4,ANCHOR_TOP_LEFT:5,ANCHOR_TOP_RIGHT:6,ANCHOR_BOTTOM_LEFT:7,ANCHOR_BOTTOM_RIGHT:8, ANCHOR_CUSTOM:9,CACHE_NONE:0,CACHE_SIMPLE:1,CACHE_DEEP:2},extendsWith:function(){var a=0;return{__init:function(){this.behaviorList=[];this.lifecycleListenerList=[];this.AABB=new CAAT.Math.Rectangle;this.viewVertices=[new CAAT.Math.Point(0,0,0),new CAAT.Math.Point(0,0,0),new CAAT.Math.Point(0,0,0),new CAAT.Math.Point(0,0,0)];this.scaleAnchor=CAAT.Foundation.Actor.ANCHOR_CENTER;this.modelViewMatrix=new CAAT.Math.Matrix;this.worldModelViewMatrix=new CAAT.Math.Matrix;this.resetTransform();this.setScale(1, 1);this.setRotation(0);this.id=a++;return this},__super:null,lifecycleListenerList:null,behaviorList:null,parent:null,x:0,y:0,width:0,height:0,preferredSize:null,minimumSize:null,start_time:0,duration:Number.MAX_VALUE,clip:false,clipPath:null,tAnchorX:0,tAnchorY:0,scaleX:1,scaleY:1,scaleTX:0.5,scaleTY:0.5,scaleAnchor:0,rotationAngle:0,rotationY:0.5,rotationX:0.5,alpha:1,isGlobalAlpha:false,frameAlpha:1,expired:false,discardable:false,pointed:false,mouseEnabled:true,visible:true,fillStyle:null,strokeStyle:null, -time:0,AABB:null,viewVertices:null,inFrame:false,dirty:true,wdirty:true,oldX:-1,oldY:-1,modelViewMatrix:null,worldModelViewMatrix:null,modelViewMatrixI:null,worldModelViewMatrixI:null,glEnabled:false,backgroundImage:null,id:null,size_active:1,size_total:1,__d_ax:-1,__d_ay:-1,gestureEnabled:false,invalid:true,cached:0,preventLayout:false,isAA:true,setPreventLayout:function(a){this.preventLayout=a;return this},invalidateLayout:function(){this.parent&&!this.parent.layoutInvalidated&&this.parent.invalidateLayout(); -return this},__validateLayout:function(){},setPreferredSize:function(a,c){if(!this.preferredSize)this.preferredSize=new CAAT.Math.Dimension;this.preferredSize.width=a;this.preferredSize.height=c;return this},getPreferredSize:function(){return this.preferredSize?this.preferredSize:this.getMinimumSize()},setMinimumSize:function(a,c){if(!this.minimumSize)this.minimumSize=new CAAT.Math.Dimension;this.minimumSize.width=a;this.minimumSize.height=c;return this},getMinimumSize:function(){return this.minimumSize? -this.minimumSize:new CAAT.Math.Dimension(this.width,this.height)},create:function(){return this},moveTo:function(a,c,d,e,f,g){if(!(a===this.x&&c===this.y)){var h=this.getBehavior("__moveTo");h||(h=(new CAAT.Behavior.PathBehavior).setId("__moveTo").setValues(new CAAT.PathUtil.LinearPath),this.addBehavior(h));h.path.setInitialPosition(this.x,this.y).setFinalPosition(a,c);h.setDelayTime(e?e:0,d);f&&h.setInterpolator(f);if(g)h.lifecycleListenerList=[],h.addListener({behaviorExpired:function(a,b,c){g(a, -b,c)}});return this}},rotateTo:function(a,c,d,e,f,g){if(a!==this.rotationAngle){var h=this.getBehavior("__rotateTo");h||(h=(new CAAT.Behavior.RotateBehavior).setId("__rotateTo").setValues(0,0,0.5,0.5),this.addBehavior(h));h.setValues(this.rotationAngle,a,e,f).setDelayTime(d?d:0,c);g&&h.setInterpolator(g);return this}},scaleTo:function(a,c,d,e,f,g,h){if(!(this.scaleX===a&&this.scaleY===c)){var i=this.getBehavior("__scaleTo");i||(i=(new CAAT.Behavior.ScaleBehavior).setId("__scaleTo").setValues(1,1, -1,1,0.5,0.5),this.addBehavior(i));i.setValues(this.scaleX,a,this.scaleY,c,f,g).setDelayTime(e?e:0,d);h&&i.setInterpolator(h);return this}},scaleXTo:function(a,c,d,e,f,g){return this.__scale1To(CAAT.Behavior.Scale1Behavior.AXIS_X,a,c,d,e,f,g)},scaleYTo:function(a,c,d,e,f,g){return this.__scale1To(CAAT.Behavior.Scale1Behavior.AXIS_Y,a,c,d,e,f,g)},__scale1To:function(a,c,d,e,f,g,h){if(!(a===CAAT.Behavior.Scale1Behavior.AXIS_X&&c===this.scaleX||a===CAAT.Behavior.Scale1Behavior.AXIS_Y&&c===this.scaleY)){var i= +time:0,AABB:null,viewVertices:null,inFrame:false,dirty:true,wdirty:true,oldX:-1,oldY:-1,modelViewMatrix:null,worldModelViewMatrix:null,modelViewMatrixI:null,worldModelViewMatrixI:null,glEnabled:false,backgroundImage:null,id:null,size_active:1,size_total:1,__d_ax:-1,__d_ay:-1,gestureEnabled:false,invalid:true,cached:0,preventLayout:false,isAA:true,isCachedActor:false,setCachedActor:function(a){this.isCachedActor=a;return this},setPreventLayout:function(a){this.preventLayout=a;return this},invalidateLayout:function(){this.parent&& +!this.parent.layoutInvalidated&&this.parent.invalidateLayout();return this},__validateLayout:function(){},setPreferredSize:function(a,c){if(!this.preferredSize)this.preferredSize=new CAAT.Math.Dimension;this.preferredSize.width=a;this.preferredSize.height=c;return this},getPreferredSize:function(){return this.preferredSize?this.preferredSize:this.getMinimumSize()},setMinimumSize:function(a,c){if(!this.minimumSize)this.minimumSize=new CAAT.Math.Dimension;this.minimumSize.width=a;this.minimumSize.height= +c;return this},getMinimumSize:function(){return this.minimumSize?this.minimumSize:new CAAT.Math.Dimension(this.width,this.height)},create:function(){return this},moveTo:function(a,c,d,e,f,g){if(!(a===this.x&&c===this.y)){var h=this.getBehavior("__moveTo");h||(h=(new CAAT.Behavior.PathBehavior).setId("__moveTo").setValues(new CAAT.PathUtil.LinearPath),this.addBehavior(h));h.path.setInitialPosition(this.x,this.y).setFinalPosition(a,c);h.setDelayTime(e?e:0,d);f&&h.setInterpolator(f);if(g)h.lifecycleListenerList= +[],h.addListener({behaviorExpired:function(a,b,c){g(a,b,c)}});return this}},rotateTo:function(a,c,d,e,f,g){if(a!==this.rotationAngle){var h=this.getBehavior("__rotateTo");h||(h=(new CAAT.Behavior.RotateBehavior).setId("__rotateTo").setValues(0,0,0.5,0.5),this.addBehavior(h));h.setValues(this.rotationAngle,a,e,f).setDelayTime(d?d:0,c);g&&h.setInterpolator(g);return this}},scaleTo:function(a,c,d,e,f,g,h){if(!(this.scaleX===a&&this.scaleY===c)){var i=this.getBehavior("__scaleTo");i||(i=(new CAAT.Behavior.ScaleBehavior).setId("__scaleTo").setValues(1, +1,1,1,0.5,0.5),this.addBehavior(i));i.setValues(this.scaleX,a,this.scaleY,c,f,g).setDelayTime(e?e:0,d);h&&i.setInterpolator(h);return this}},scaleXTo:function(a,c,d,e,f,g){return this.__scale1To(CAAT.Behavior.Scale1Behavior.AXIS_X,a,c,d,e,f,g)},scaleYTo:function(a,c,d,e,f,g){return this.__scale1To(CAAT.Behavior.Scale1Behavior.AXIS_Y,a,c,d,e,f,g)},__scale1To:function(a,c,d,e,f,g,h){if(!(a===CAAT.Behavior.Scale1Behavior.AXIS_X&&c===this.scaleX||a===CAAT.Behavior.Scale1Behavior.AXIS_Y&&c===this.scaleY)){var i= this.getBehavior("__scaleXTo");i||(i=(new CAAT.Behavior.Scale1Behavior).setId("__scaleXTo").setValues(1,1,a===CAAT.Behavior.Scale1Behavior.AXIS_X,0.5,0.5),this.addBehavior(i));i.setValues(a?this.scaleX:this.scaleY,c,f,g).setDelayTime(e?e:0,d);h&&i.setInterpolator(h);return this}},touchStart:function(){},touchMove:function(){},touchEnd:function(){},gestureStart:function(){},gestureChange:function(a,c,d){this.gestureEnabled&&(this.setRotation(a),this.setScale(c,d));return this},gestureEnd:function(){}, isVisible:function(){return this.visible},invalidate:function(){this.invalid=true;return this},setGestureEnabled:function(a){this.gestureEnabled=!!a;return this},isGestureEnabled:function(){return this.gestureEnabled},getId:function(){return this.id},setId:function(a){this.id=a;return this},setParent:function(a){this.parent=a;return this},setBackgroundImage:function(a,c){if(a){a=a instanceof CAAT.Foundation.SpriteImage?a.getRef():isString(a)?(new CAAT.Foundation.SpriteImage).initialize(CAAT.currentDirector.getImage(a), 1,1):(new CAAT.Foundation.SpriteImage).initialize(a,1,1);a.setOwner(this);this.backgroundImage=a;if(typeof c==="undefined"||c)this.width=a.getWidth(),this.height=a.getHeight();this.glEnabled=true;this.invalidate()}else this.backgroundImage=null;return this},setSpriteIndex:function(a){this.backgroundImage&&(this.backgroundImage.setSpriteIndex(a),this.invalidate());return this},setBackgroundImageOffset:function(a,c){this.backgroundImage&&this.backgroundImage.setOffset(a,c);return this},setAnimationImageIndex:function(a){this.backgroundImage&& @@ -410,27 +415,27 @@ d=0.5;break;case e.ANCHOR_RIGHT:c=1;d=0.5;break;case e.ANCHOR_TOP_RIGHT:c=1;d=0; e;this.scaleX=a;this.scaleY=c;this.dirty=true;return this},setRotationAnchor:function(a,c){this.rotationX=c;this.rotationY=a;this.dirty=true;return this},setRotation:function(a){this.rotationAngle=a;this.dirty=true;return this},setRotationAnchored:function(a,c,d){this.rotationAngle=a;this.rotationX=c;this.rotationY=d;this.dirty=true;return this},setSize:function(a,c){this.width=a;this.height=c;this.dirty=true;return this},setBounds:function(a,c,d,e){this.x=a;this.y=c;this.width=d;this.height=e;this.dirty= true;return this},setLocation:function(a,c){this.x=a;this.y=c;this.oldX=a;this.oldY=c;this.dirty=true;return this},setPosition:function(a,c){return this.setLocation(a,c)},setPositionAnchor:function(a,c){this.tAnchorX=a;this.tAnchorY=c;return this},setPositionAnchored:function(a,c,d,e){this.setLocation(a,c);this.tAnchorX=d;this.tAnchorY=e;return this},isInAnimationFrame:function(a){if(this.expired)return false;if(this.duration===Number.MAX_VALUE)return this.start_time<=a;return a>=this.start_time+ this.duration?(this.expired||this.setExpired(a),false):this.start_time<=a&&a=0&&c>=0&&af)f=d.x;if(d.yh)h=d.y;d=c[1];if(d.xf)f=d.x;if(d.yh)h=d.y;d=c[2];if(d.xf)f=d.x;if(d.yh)h=d.y;d=c[3];if(d.xf)f=d.x;if(d.yh)h=d.y;a.x=e;a.y=g;a.x1=f;a.y1=h;a.width=f-e;a.height=h-g;return this},paintActor:function(a,c){if(!this.visible||!a.inDirtyRect(this))return true;var d=a.ctx;this.frameAlpha=this.parent?this.parent.frameAlpha*this.alpha:1;d.globalAlpha=this.frameAlpha;this.worldModelViewMatrix.transformRenderingContextSet(d); -this.clip&&(d.beginPath(),this.clipPath?this.clipPath.applyAsPath(a):d.rect(0,0,this.width,this.height),d.clip());this.paint(a,c);return true},__paintActor:function(a,c){if(!this.visible)return true;var d=a.ctx;this.frameAlpha=this.alpha;var e=this.worldModelViewMatrix.matrix;d.setTransform(e[0],e[3],e[1],e[4],e[2],e[5],this.frameAlpha);this.paint(a,c);return true},paintActorGL:function(a){this.frameAlpha=this.parent.frameAlpha*this.alpha;if(this.glEnabled&&this.visible)if(this.glNeedsFlush(a)){a.glFlush(); -this.glSetShader(a);if(!this.__uv)this.__uv=new Float32Array(8);if(!this.__vv)this.__vv=new Float32Array(12);this.setGLCoords(this.__vv,0);this.setUV(this.__uv,0);a.glRender(this.__vv,12,this.__uv)}else{var c=a.coordsIndex;this.setGLCoords(a.coords,c);a.coordsIndex=c+12;this.setUV(a.uv,a.uvIndex);a.uvIndex+=8}},setGLCoords:function(a,c){var d=this.viewVertices;a[c++]=d[0].x;a[c++]=d[0].y;a[c++]=0;a[c++]=d[1].x;a[c++]=d[1].y;a[c++]=0;a[c++]=d[2].x;a[c++]=d[2].y;a[c++]=0;a[c++]=d[3].x;a[c++]=d[3].y; -a[c]=0},setUV:function(a,c){this.backgroundImage.setUV(a,c)},glNeedsFlush:function(a){return this.getTextureGLPage()!==a.currentTexturePage?true:this.frameAlpha!==a.currentOpacity?true:false},glSetShader:function(a){var c=this.getTextureGLPage();c!==a.currentTexturePage&&a.setGLTexturePage(c);this.frameAlpha!==a.currentOpacity&&a.setGLCurrentOpacity(this.frameAlpha)},endAnimate:function(){return this},initialize:function(a){if(a)for(var c in a)this[c]=a[c];return this},setClip:function(a,c){this.clip= -a;this.clipPath=c;return this},isCached:function(){return this.cached},stopCacheAsBitmap:function(){if(this.cached)this.backgroundImage=null,this.cached=CAAT.Foundation.Actor.CACHE_NONE},cacheAsBitmap:function(a,c){if(this.width<=0||this.height<=0)return this;var a=a||0,d=document.createElement("canvas");d.width=this.width;d.height=this.height;var e=d.getContext("2d");CAAT.Foundation.Actor.prototype.animate.call(this,CAAT.currentDirector,a);var e={ctx:e,modelViewMatrix:new CAAT.Math.Matrix,worldModelViewMatrix:new CAAT.Math.Matrix, -dirtyRectsEnabled:false,inDirtyRect:function(){return true},AABB:new CAAT.Math.Rectangle(0,0,this.width,this.height)},f=this.modelViewMatrix,g=this.worldModelViewMatrix;this.modelViewMatrix=new CAAT.Math.Matrix;this.worldModelViewMatrix=new CAAT.Math.Matrix;this.cached=CAAT.Foundation.Actor.CACHE_NONE;if(typeof c==="undefined")c=CAAT.Foundation.Actor.CACHE_SIMPLE;c===CAAT.Foundation.Actor.CACHE_DEEP?(this.animate(e,a),this.paintActor(e,a)):this instanceof CAAT.Foundation.ActorContainer||this instanceof -CAAT.ActorContainer?CAAT.Foundation.ActorContainer.superclass.paintActor.call(this,e,a):(this.animate(e,a),this.paintActor(e,a));this.setBackgroundImage(d);this.cached=c;this.modelViewMatrix=f;this.worldModelViewMatrix=g;return this},resetAsButton:function(){this.actionPerformed=null;this.mouseEnter=function(){};this.mouseExit=function(){};this.mouseDown=function(){};this.mouseUp=function(){};this.mouseClick=function(){};this.mouseDrag=function(){};return this},setAsButton:function(a,c,d,e,f,g){this.setBackgroundImage(a, -true);this.iNormal=c||0;this.iOver=d||this.iNormal;this.iPress=e||this.iNormal;this.iDisabled=f||this.iNormal;this.fnOnClick=g;this.enabled=true;this.setSpriteIndex(c);this.setEnabled=function(a){this.enabled=a;this.setSpriteIndex(this.enabled?this.iNormal:this.iDisabled);return this};this.actionPerformed=function(){this.enabled&&this.fnOnClick&&this.fnOnClick(this)};this.mouseEnter=function(){this.enabled&&(this.dragging?this.setSpriteIndex(this.iPress):this.setSpriteIndex(this.iOver),CAAT.setCursor("pointer"))}; -this.mouseExit=function(){this.enabled&&(this.setSpriteIndex(this.iNormal),CAAT.setCursor("default"))};this.mouseDown=function(){this.enabled&&this.setSpriteIndex(this.iPress)};this.mouseUp=function(){if(this.enabled)this.setSpriteIndex(this.iNormal),this.dragging=false};this.mouseClick=function(){};this.mouseDrag=function(){if(this.enabled)this.dragging=true};this.setButtonImageIndex=function(a,b,c,d){this.iNormal=a||0;this.iOver=b||this.iNormal;this.iPress=c||this.iNormal;this.iDisabled=d||this.iNormal; -this.setSpriteIndex(this.iNormal);return this};return this},findActorById:function(a){return this.id===a?this:null}}}}); +this.behaviorList,d=0;df)f=d.x;if(d.yh)h=d.y;d=c[1];if(d.xf)f=d.x;if(d.yh)h=d.y;d=c[2];if(d.xf)f=d.x;if(d.yh)h=d.y;d=c[3];if(d.xf)f=d.x;if(d.yh)h=d.y;a.x=e;a.y=g;a.x1=f;a.y1=h;a.width=f-e;a.height=h-g;return this},paintActor:function(a,c){if(!this.visible||!a.inDirtyRect(this))return true;var d=a.ctx;this.frameAlpha=this.parent?this.parent.frameAlpha*this.alpha: +1;d.globalAlpha=this.frameAlpha;a.modelViewMatrix.transformRenderingContextSet(d);this.worldModelViewMatrix.transformRenderingContext(d);this.clip&&(d.beginPath(),this.clipPath?this.clipPath.applyAsPath(a):d.rect(0,0,this.width,this.height),d.clip());this.paint(a,c);return true},__paintActor:function(a,c){if(!this.visible)return true;var d=a.ctx;this.frameAlpha=this.alpha;var e=this.worldModelViewMatrix.matrix;d.setTransform(e[0],e[3],e[1],e[4],e[2],e[5],this.frameAlpha);this.paint(a,c);return true}, +paintActorGL:function(a){this.frameAlpha=this.parent.frameAlpha*this.alpha;if(this.glEnabled&&this.visible)if(this.glNeedsFlush(a)){a.glFlush();this.glSetShader(a);if(!this.__uv)this.__uv=new Float32Array(8);if(!this.__vv)this.__vv=new Float32Array(12);this.setGLCoords(this.__vv,0);this.setUV(this.__uv,0);a.glRender(this.__vv,12,this.__uv)}else{var c=a.coordsIndex;this.setGLCoords(a.coords,c);a.coordsIndex=c+12;this.setUV(a.uv,a.uvIndex);a.uvIndex+=8}},setGLCoords:function(a,c){var d=this.viewVertices; +a[c++]=d[0].x;a[c++]=d[0].y;a[c++]=0;a[c++]=d[1].x;a[c++]=d[1].y;a[c++]=0;a[c++]=d[2].x;a[c++]=d[2].y;a[c++]=0;a[c++]=d[3].x;a[c++]=d[3].y;a[c]=0},setUV:function(a,c){this.backgroundImage.setUV(a,c)},glNeedsFlush:function(a){return this.getTextureGLPage()!==a.currentTexturePage?true:this.frameAlpha!==a.currentOpacity?true:false},glSetShader:function(a){var c=this.getTextureGLPage();c!==a.currentTexturePage&&a.setGLTexturePage(c);this.frameAlpha!==a.currentOpacity&&a.setGLCurrentOpacity(this.frameAlpha)}, +endAnimate:function(){return this},initialize:function(a){if(a)for(var c in a)this[c]=a[c];return this},setClip:function(a,c){this.clip=a;this.clipPath=c;return this},isCached:function(){return this.cached},stopCacheAsBitmap:function(){if(this.cached)this.backgroundImage=null,this.cached=CAAT.Foundation.Actor.CACHE_NONE},cacheAsBitmap:function(a,c){if(this.width<=0||this.height<=0)return this;var a=a||0,d=document.createElement("canvas");d.width=this.width;d.height=this.height;var e=d.getContext("2d"); +CAAT.Foundation.Actor.prototype.animate.call(this,CAAT.currentDirector,a);var e={ctx:e,modelViewMatrix:new CAAT.Math.Matrix,worldModelViewMatrix:new CAAT.Math.Matrix,dirtyRectsEnabled:false,inDirtyRect:function(){return true},AABB:new CAAT.Math.Rectangle(0,0,this.width,this.height)},f=this.modelViewMatrix,g=this.worldModelViewMatrix;this.modelViewMatrix=new CAAT.Math.Matrix;this.worldModelViewMatrix=new CAAT.Math.Matrix;this.cached=CAAT.Foundation.Actor.CACHE_NONE;if(typeof c==="undefined")c=CAAT.Foundation.Actor.CACHE_SIMPLE; +c===CAAT.Foundation.Actor.CACHE_DEEP?(this.animate(e,a),this.paintActor(e,a)):this instanceof CAAT.Foundation.ActorContainer||this instanceof CAAT.ActorContainer?CAAT.Foundation.ActorContainer.superclass.paintActor.call(this,e,a):(this.animate(e,a),this.paintActor(e,a));this.setBackgroundImage(d);this.cached=c;this.modelViewMatrix=f;this.worldModelViewMatrix=g;return this},resetAsButton:function(){this.actionPerformed=null;this.mouseEnter=function(){};this.mouseExit=function(){};this.mouseDown=function(){}; +this.mouseUp=function(){};this.mouseClick=function(){};this.mouseDrag=function(){};return this},setAsButton:function(a,c,d,e,f,g){this.setBackgroundImage(a,true);this.iNormal=c||0;this.iOver=d||this.iNormal;this.iPress=e||this.iNormal;this.iDisabled=f||this.iNormal;this.fnOnClick=g;this.enabled=true;this.setSpriteIndex(c);this.setEnabled=function(a){this.enabled=a;this.setSpriteIndex(this.enabled?this.iNormal:this.iDisabled);return this};this.actionPerformed=function(){this.enabled&&this.fnOnClick&& +this.fnOnClick(this)};this.mouseEnter=function(){this.enabled&&(this.dragging?this.setSpriteIndex(this.iPress):this.setSpriteIndex(this.iOver),CAAT.setCursor("pointer"))};this.mouseExit=function(){this.enabled&&(this.setSpriteIndex(this.iNormal),CAAT.setCursor("default"))};this.mouseDown=function(){this.enabled&&this.setSpriteIndex(this.iPress)};this.mouseUp=function(){if(this.enabled)this.setSpriteIndex(this.iNormal),this.dragging=false};this.mouseClick=function(){};this.mouseDrag=function(){if(this.enabled)this.dragging= +true};this.setButtonImageIndex=function(a,b,c,d){this.iNormal=a||0;this.iOver=b||this.iNormal;this.iPress=c||this.iNormal;this.iDisabled=d||this.iNormal;this.setSpriteIndex(this.iNormal);return this};return this},findActorById:function(a){return this.id===a?this:null}}}}); CAAT.Module({defines:"CAAT.Foundation.ActorContainer",aliases:["CAAT.ActorContainer"],depends:["CAAT.Foundation.Actor","CAAT.Math.Point","CAAT.Math.Rectangle"],constants:{ADDHINT:{CONFORM:1},AddHint:{CONFORM:1}},extendsClass:"CAAT.Foundation.Actor",extendsWith:function(){var a=CAAT.Foundation.Actor.CACHE_DEEP,b=CAAT.Foundation.ActorContainer.superclass,c=b.drawScreenBoundingBox,d=b.paintActor,e=b.paintActorGL,f=b.animate,g=b.findActorAtPosition,h=b.destroy;return{__init:function(a){this.__super(); this.childrenList=[];this.activeChildren=[];this.pendingChildrenList=[];if(typeof a!=="undefined")this.addHint=a,this.boundingBox=new CAAT.Math.Rectangle;return this},childrenList:null,activeChildren:null,pendingChildrenList:null,addHint:0,boundingBox:null,runion:new CAAT.Math.Rectangle,layoutManager:null,layoutInvalidated:true,setLayout:function(a){this.layoutManager=a;return this},setBounds:function(a,b,c,d){CAAT.Foundation.ActorContainer.superclass.setBounds.call(this,a,b,c,d);CAAT.currentDirector&& !CAAT.currentDirector.inValidation&&this.invalidateLayout();return this},__validateLayout:function(){this.__validateTree();this.layoutInvalidated=false},__validateTree:function(){if(this.layoutManager&&this.layoutManager.isInvalidated()){CAAT.currentDirector.inValidation=true;this.layoutManager.doLayout(this);for(var a=0;a=this.childrenList.length)b=this.childrenList.length;a.parent=this; -a.dirty=true;this.childrenList.splice(b,0,a);this.invalidateLayout();return this},findActorById:function(a){if(CAAT.Foundation.ActorContainer.superclass.findActorById.call(this,a))return this;for(var b=this.childrenList,c=0,d=b.length;c=0&&a=0;b--){var c=this.childrenList[b],d=new CAAT.Math.Point(a.x,a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},destroy:function(){for(var a=this.childrenList,b=a.length-1;b>=0;b--)a[b].destroy(); -h.call(this);return this},getNumChildren:function(){return this.childrenList.length},getNumActiveChildren:function(){return this.activeChildren.length},getChildAt:function(a){return this.childrenList[a]},setZOrder:function(a,b){var c=this.findChild(a);if(-1!==c){var d=this.childrenList;if(b!==c){if(b>=d.length)d.splice(c,1),d.push(a);else{c=d.splice(c,1);if(b<0)b=0;else if(b>d.length)b=d.length;d.splice(b,0,c[0])}this.invalidateLayout()}}}}}}); +b.dirtyRectsEnabled&&b.addDirtyRect(h.AABB);return true},endAnimate:function(){},addChildImmediately:function(a,b){return this.addChild(a,b)},addActorImmediately:function(a,b){return this.addChildImmediately(a,b)},addActor:function(a,b){return this.addChild(a,b)},addChild:function(a,b){if(a.parent!=null)throw"adding to a container an element with parent.";a.parent=this;this.childrenList.push(a);a.dirty=true;this.layoutManager?(this.layoutManager.addChild(a,b),this.invalidateLayout()):this.addHint=== +CAAT.Foundation.ActorContainer.AddHint.CONFORM&&this.recalcSize();return this},recalcSize:function(){var a=this.boundingBox;a.setEmpty();for(var b=this.childrenList,c,d=0;d=this.childrenList.length)b=this.childrenList.length;a.parent=this;a.dirty=true;this.childrenList.splice(b,0,a);this.invalidateLayout();return this},findActorById:function(a){if(CAAT.Foundation.ActorContainer.superclass.findActorById.call(this,a))return this;for(var b=this.childrenList,c=0,d=b.length;c=0&&a=0;b--){var c=this.childrenList[b],d=new CAAT.Math.Point(a.x,a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this}, +destroy:function(){for(var a=this.childrenList,b=a.length-1;b>=0;b--)a[b].destroy();h.call(this);return this},getNumChildren:function(){return this.childrenList.length},getNumActiveChildren:function(){return this.activeChildren.length},getChildAt:function(a){return this.childrenList[a]},setZOrder:function(a,b){var c=this.findChild(a);if(-1!==c){var d=this.childrenList;if(b!==c){if(b>=d.length)d.splice(c,1),d.push(a);else{c=d.splice(c,1);if(b<0)b=0;else if(b>d.length)b=d.length;d.splice(b,0,c[0])}this.invalidateLayout()}}}}}}); CAAT.Module({defines:"CAAT.Foundation.Scene",depends:"CAAT.Math.Point,CAAT.Math.Matrix,CAAT.PathUtil.Path,CAAT.Behavior.GenericBehavior,CAAT.Behavior.ContainerBehavior,CAAT.Behavior.ScaleBehavior,CAAT.Behavior.AlphaBehavior,CAAT.Behavior.RotateBehavior,CAAT.Behavior.PathBehavior,CAAT.Foundation.ActorContainer,CAAT.Foundation.Timer.TimerManager".split(","),aliases:["CAAT.Scene"],extendsClass:"CAAT.Foundation.ActorContainer",constants:{EASE_ROTATION:1,EASE_SCALE:2,EASE_TRANSLATE:3},extendsWith:function(){return{__init:function(){this.__super(); this.timerManager=new CAAT.TimerManager;this.fillStyle=null;this.isGlobalAlpha=true;return this},easeContainerBehaviour:null,easeContainerBehaviourListener:null,easeIn:false,paused:false,timerManager:null,isPaused:function(){return this.paused},setPaused:function(a){this.paused=a},createTimer:function(a,b,c,d,e){return this.timerManager.createTimer(a,b,c,d,e,this)},setTimeout:function(a,b,c,d){return this.timerManager.createTimer(this.time,a,b,c,d,this)},createAlphaBehaviour:function(a,b){var c=new CAAT.Behavior.AlphaBehavior; c.setFrameTime(0,a);c.startAlpha=b?0:1;c.endAlpha=b?1:0;this.easeContainerBehaviour.addBehavior(c)},easeTranslationIn:function(a,b,c,d){this.easeTranslation(a,b,c,true,d)},easeTranslationOut:function(a,b,c,d){this.easeTranslation(a,b,c,false,d)},easeTranslation:function(a,b,c,d,e){this.easeContainerBehaviour=new CAAT.Behavior.ContainerBehavior;this.easeIn=d;var f=new CAAT.Behavior.PathBehavior;e&&f.setInterpolator(e);f.setFrameTime(0,a);c<1?c=1:c>4&&(c=4);switch(c){case CAAT.Foundation.Actor.ANCHOR_TOP:d? @@ -462,19 +467,19 @@ constants:{RENDER_MODE_CONTINUOUS:1,RENDER_MODE_DIRTY:2,CLEAR_DIRTY_RECTS:1,CLEA new CAAT.Math.Point(0,0,0);this.isMouseDown=false;this.lastSelectedActor=null;this.dragging=false;this.cDirtyRects=[];this.sDirtyRects=[];this.dirtyRects=[];for(var a=0;a<64;a++)this.dirtyRects.push(new CAAT.Math.Rectangle);this.dirtyRectsIndex=0;this.touches={};this.timerManager=new CAAT.Foundation.Timer.TimerManager;this.__map={};return this},debug:false,renderMode:CAAT.Foundation.Director.RENDER_MODE_CONTINUOUS,onRenderStart:null,onRenderEnd:null,mousePoint:null,prevMousePoint:null,screenMousePoint:null, isMouseDown:false,lastSelectedActor:null,dragging:false,scenes:null,currentScene:null,canvas:null,ctx:null,time:0,timeline:0,imagesCache:null,audioManager:null,clear:CAAT.Foundation.Director.CLEAR_ALL,transitionScene:null,browserInfo:null,gl:null,glEnabled:false,glTextureManager:null,glTtextureProgram:null,glColorProgram:null,pMatrix:null,coords:null,coordsIndex:0,uv:null,uvIndex:0,front_to_back:false,statistics:{size_total:0,size_active:0,size_dirtyRects:0,draws:0,size_discarded_by_dirty_rects:0}, currentTexturePage:0,currentOpacity:1,intervalId:null,frameCounter:0,resize:1,onResizeCallback:null,__gestureScale:0,__gestureRotation:0,dirtyRects:null,cDirtyRects:null,sDirtyRects:null,dirtyRectsIndex:0,dirtyRectsEnabled:false,nDirtyRects:0,drDiscarded:0,stopped:false,needsRepaint:false,touches:null,timerManager:null,SCREEN_RATIO:1,__map:null,clean:function(){this.audioManager=this.imagesCache=this.currentScene=this.scenes=null;this.isMouseDown=false;this.lastSelectedActor=null;this.dragging=false; -this.__gestureRotation=this.__gestureScale=0;this.dirty=true;this.cDirtyRects=this.dirtyRects=null;this.dirtyRectsIndex=0;this.dirtyRectsEnabled=false;this.nDirtyRects=0;this.onResizeCallback=null;this.__map={};return this},cancelPlay:function(a){return this.audioManager.cancelPlay(a)},cancelPlayByChannel:function(a){return this.audioManager.cancelPlayByChannel(a)},setValueForKey:function(a,b){this.__map[a]=b;return this},getValueForKey:function(a){return this.__map[a]},createTimer:function(a,b,c, -d,e){return this.timerManager.createTimer(a,b,c,d,e,this)},requestRepaint:function(){this.needsRepaint=true},getCurrentScene:function(){return this.currentScene},checkDebug:function(){if(!navigator.isCocoonJS&&CAAT.DEBUG){var a=(new CAAT.Module.Debug.Debug).initialize(this.width,60);this.debugInfo=a.debugInfo.bind(a)}},getRenderType:function(){return this.glEnabled?"WEBGL":"CANVAS"},windowResized:function(a,b){var c=CAAT.Foundation.Director;switch(this.resize){case c.RESIZE_WIDTH:this.setBounds(0, -0,a,this.height);break;case c.RESIZE_HEIGHT:this.setBounds(0,0,this.width,b);break;case c.RESIZE_BOTH:this.setBounds(0,0,a,b);break;case c.RESIZE_PROPORTIONAL:this.setScaleProportional(a,b)}this.glEnabled&&this.glReset();if(this.onResizeCallback)this.onResizeCallback(this,a,b)},setScaleProportional:function(a,b){var c=Math.min(a/this.referenceWidth,b/this.referenceHeight);this.canvas.width=this.referenceWidth*c;this.canvas.height=this.referenceHeight*c;this.ctx=this.canvas.getContext(this.glEnabled? -"experimental-webgl":"2d");this.__setupRetina();this.setScaleAnchored(c*this.scaleX,c*this.scaleY,0,0);this.glEnabled&&this.glReset()},enableResizeEvents:function(a,b){var c=CAAT.Foundation.Director;a===c.RESIZE_BOTH||a===c.RESIZE_WIDTH||a===c.RESIZE_HEIGHT||a===c.RESIZE_PROPORTIONAL?(this.referenceWidth=this.width,this.referenceHeight=this.height,this.resize=a,CAAT.registerResizeListener(this),this.onResizeCallback=b,this.windowResized(window.innerWidth,window.innerHeight)):(CAAT.unregisterResizeListener(this), -this.onResizeCallback=null);return this},__setupRetina:function(){if(CAAT.RETINA_DISPLAY_ENABLED){var a=CAAT.Module.Runtime.BrowserInfo.DevicePixelRatio,b=this.ctx.webkitBackingStorePixelRatio||this.ctx.mozBackingStorePixelRatio||this.ctx.msBackingStorePixelRatio||this.ctx.oBackingStorePixelRatio||this.ctx.backingStorePixelRatio||1,c=a/b;a!==b?(a=this.canvas.width,b=this.canvas.height,this.canvas.width=a*c,this.canvas.height=b*c,this.canvas.style.width=a+"px",this.canvas.style.height=b+"px",this.setScaleAnchored(c, -c,0,0)):this.setScaleAnchored(1,1,0,0);this.SCREEN_RATIO=c}else this.setScaleAnchored(1,1,0,0);for(c=0;c=0;b--){var c=this.childrenList[b],d=new CAAT.Math.Point(a.x, a.y,0),c=c.findActorAtPosition(d);if(null!==c)return c}return this},resetStats:function(){this.statistics.size_total=0;this.statistics.size_active=0;this.statistics.draws=0;this.statistics.size_discarded_by_dirty_rects=0},render:function(a){if(!this.currentScene||!this.currentScene.isPaused()){this.time+=a;for(e=0,l=this.childrenList.length;e>0)+1)*b},setFillStyle:function(a){this.fill=a},setStrokeStyle:function(a){this.stroke= a},setStrokeSize:function(a){this.strokeSize=a},setAlignment:function(a){this.alignment=a},setFontSize:function(a){if(a!==this.fontSize)this.fontSize=a,this.__setFont()}};var b=function(){this.text="";return this};b.prototype={x:0,y:0,width:0,text:null,crcs:null,rcs:null,styles:null,images:null,lines:null,documentHeight:0,anchorStack:null,__nextLine:function(){this.x=0;this.currentLine=new f(CAAT.Module.Font.Font.getFontMetrics(this.crcs.sfont));this.lines.push(this.currentLine)},__image:function(a, -b,c){var e;e=b&&c?a.getWidth():a.getWrappedImageWidth();this.width&&e+this.x>this.width&&this.x>0&&this.__nextLine();this.currentLine.addElementImage(new d(this.x,a,b,c,this.crcs.clone(),this.__getCurrentAnchor()));this.x+=e},__text:function(){if(this.text.length!==0){var a=this.ctx.measureText(this.text).width;this.width&&a+this.x>this.width&&this.x>0&&this.__nextLine();this.currentLine.addElement(new e(this.text,this.x,a,0,this.crcs.clone(),this.__getCurrentAnchor()));this.x+=a;this.text=""}},fchar:function(a){a=== -" "?(this.__text(),this.x+=this.ctx.measureText(a).width,this.width&&this.x>this.width&&this.__nextLine()):this.text+=a},end:function(){this.text.length>0&&this.__text();for(var a=0,b=0,c=0;c>0);this.lines[c].setY(a)}this.documentHeight=a+b},getDocumentHeight:function(){return this.documentHeight},__getCurrentAnchor:function(){return this.anchorStack.length?this.anchorStack[this.anchorStack.length- -1]:null},__resetAppliedStyles:function(){this.rcs=[];this.__pushDefaultStyles()},__pushDefaultStyles:function(){this.crcs=(new a(this.ctx)).setDefault(this.styles["default"]);this.rcs.push(this.crcs)},__pushStyle:function(b){var c=this.crcs;this.crcs=new a(this.ctx);this.crcs.chain=c;this.crcs.setStyle(b);this.crcs.applyStyle();this.rcs.push(this.crcs)},__popStyle:function(){if(this.rcs.length>1)this.rcs.pop(),this.crcs=this.rcs[this.rcs.length-1],this.crcs.applyStyle()},__popAnchor:function(){this.anchorStack.length> -0&&this.anchorStack.pop()},__pushAnchor:function(a){this.anchorStack.push(a)},start:function(a,b,c,d){this.y=this.x=0;this.width=typeof d!=="undefined"?d:0;this.ctx=a;this.lines=[];this.styles=b;this.images=c;this.anchorStack=[];this.__resetAppliedStyles();this.__nextLine()},setTag:function(a){this.__text();a=a.toLowerCase();if(a==="b")this.crcs.setBold(true);else if(a==="/b")this.crcs.setBold(false);else if(a==="i")this.crcs.setItalic(true);else if(a==="/i")this.crcs.setItalic(false);else if(a=== -"stroked")this.crcs.setStroked(true);else if(a==="/stroked")this.crcs.setStroked(false);else if(a==="filled")this.crcs.setFilled(true);else if(a==="/filled")this.crcs.setFilled(false);else if(a==="tab")this.x=this.crcs.getTabPos(this.x);else if(a==="br")this.__nextLine();else if(a==="/a")this.__popAnchor();else if(a==="/style")this.rcs.length>1&&this.__popStyle();else if(a.indexOf("fillcolor")===0)a=a.split("="),this.crcs.setFillStyle(a[1]);else if(a.indexOf("strokecolor")===0)a=a.split("="),this.crcs.setStrokeStyle(a[1]); -else if(a.indexOf("strokesize")===0)a=a.split("="),this.crcs.setStrokeSize(a[1]|0);else if(a.indexOf("fontsize")===0)a=a.split("="),this.crcs.setFontSize(a[1]|0);else if(a.indexOf("style")===0)a=a.split("="),(a=this.styles[a[1]])&&this.__pushStyle(a);else if(a.indexOf("image")===0){var a=a.split("=")[1].split(","),b=a[0];if(this.images[b]){var c=0,d=0;a.length>=3&&(c=a[1]|0,d=a[2]|0);this.__image(this.images[b],c,d)}}else a.indexOf("a=")===0&&(a=a.split("="),this.__pushAnchor(a[1]))}};var c=function(a, -b){this.link=a;this.style=b;return this};c.prototype={x:null,y:null,width:null,height:null,style:null,link:null,isLink:function(){return this.link},setLink:function(a){this.link=a;return this},getLink:function(){return this.link},contains:function(){return false}};var d=function(a,b,c,e,f,m){d.superclass.constructor.call(this,m,f);this.x=a;this.image=b;this.row=c;this.column=e;this.width=b.getWidth();this.height=b.getHeight();if(this.image instanceof CAAT.SpriteImage||this.image instanceof CAAT.Foundation.SpriteImage)this.spriteIndex= -c*b.columns+e,this.paint=this.paintSI;return this};d.prototype={image:null,row:null,column:null,spriteIndex:null,paint:function(a){this.style.image(a);a.drawImage(this.image,this.x,-this.height+1)},paintSI:function(a){this.style.image(a);this.image.setSpriteIndex(this.spriteIndex);this.image.paint({ctx:a},0,this.x,-this.height+1)},getHeight:function(){return this.image instanceof CAAT.Foundation.SpriteImage?this.image.singleHeight:this.image.height},getFontMetrics:function(){return null},contains:function(a, -b){return a>=this.x&&a<=this.x+this.width&&b>=this.y&&b=this.x&&a<=this.x+this.width&&b>=this.y&&b<=this.y+this.height},setYPosition:function(a){this.bl=a;this.y=a-this.fm.ascent}};extend(d,c);extend(e,c);var f=function(a){this.elements=[];this.defaultFontMetrics=a;return this};f.prototype={elements:null,width:0,height:0,defaultHeight:0,y:0,x:0,alignment:null,baselinePos:0,addElement:function(a){this.width=Math.max(this.width,a.x+a.width);this.height=Math.max(this.height,a.height);this.elements.push(a);this.alignment=a.style.__getProperty("alignment")}, -addElementImage:function(a){this.width=Math.max(this.width,a.x+a.width);this.height=Math.max(this.height,a.height);this.elements.push(a)},getHeight:function(){return this.height},setY:function(a){this.y=a},getY:function(){return this.y},paint:function(a){a.save();a.translate(this.x,this.y+this.baselinePos);for(var b=0;b=0.6&&this.elements.length>1){var c=a-this.width,c=c/(this.elements.length-1)|0;for(b=1;ba.ascent&&(a=e):a=e:b?d.getHeight()>d.getHeight()&& -(b=d):b=d}this.baselinePos=Math.max(a?a.ascent:this.defaultFontMetrics.ascent,b?b.getHeight():this.defaultFontMetrics.ascent);this.height=this.baselinePos+(a!=null?a.descent:this.defaultFontMetrics.descent);for(c=0;c",d+1),-1!==o&&(n=f.substr(d+1,o-d-1),n.indexOf("<")!==-1?(this.rc.fchar(p),d+=1):(this.rc.setTag(n),d=o+1))):(this.rc.fchar(p),d+=1);this.rc.end();this.lines=this.rc.lines;this.__calculateDocumentDimension(typeof b==="undefined"?0:b);this.setLinesAlignment();q.restore();this.setPreferredSize(this.documentWidth,this.documentHeight);this.invalidateLayout();this.setDocumentPosition();c&&this.cacheAsBitmap(0,c);return this}},setVerticalAlignment:function(a){this.valignment= -a;this.setDocumentPosition();return this},setHorizontalAlignment:function(a){this.halignment=a;this.setDocumentPosition();return this},setDocumentPosition:function(){var a=0,b=0;this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER?b=(this.height-this.documentHeight)/2:this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.BOTTOM&&(b=this.height-this.documentHeight);this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER?a=(this.width-this.documentWidth)/ -2:this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.RIGHT&&(a=this.width-this.documentWidth);this.documentX=a;this.documentY=b},__calculateDocumentDimension:function(a){var b,c=0;for(b=this.documentHeight=this.documentWidth=0;b=a&&d.y+d.height>=b)return d.__getElementAt(a-d.x,b-d.y)}return null},mouseExit:function(){CAAT.setCursor("default")},mouseMove:function(a){(a=this.__getDocumentElementAt(a.x,a.y))&&a.getLink()?CAAT.setCursor("pointer"):CAAT.setCursor("default")},mouseClick:function(a){this.clickCallback&&(a=this.__getDocumentElementAt(a.x,a.y),a.getLink()&&this.clickCallback(a.getLink()))},setClickCallback:function(a){this.clickCallback=a;return this}}}}); +b,c){var e;e=typeof b!=="undefined"&&typeof c!=="undefined"?a.getWidth():a instanceof CAAT.Foundation.SpriteImage?a.getWidth():a.getWrappedImageWidth();this.width&&e+this.x>this.width&&this.x>0&&this.__nextLine();this.currentLine.addElementImage(new d(this.x,a,b,c,this.crcs.clone(),this.__getCurrentAnchor()));this.x+=e},__text:function(){if(this.text.length!==0){var a=this.ctx.measureText(this.text).width;this.width&&a+this.x>this.width&&this.x>0&&this.__nextLine();this.currentLine.addElement(new e(this.text, +this.x,a,0,this.crcs.clone(),this.__getCurrentAnchor()));this.x+=a;this.text=""}},fchar:function(a){a===" "?(this.__text(),this.x+=this.ctx.measureText(a).width,this.width&&this.x>this.width&&this.__nextLine()):this.text+=a},end:function(){this.text.length>0&&this.__text();for(var a=0,b=0,c=0;c>0);this.lines[c].setY(a)}this.documentHeight=a+b},getDocumentHeight:function(){return this.documentHeight}, +__getCurrentAnchor:function(){return this.anchorStack.length?this.anchorStack[this.anchorStack.length-1]:null},__resetAppliedStyles:function(){this.rcs=[];this.__pushDefaultStyles()},__pushDefaultStyles:function(){this.crcs=(new a(this.ctx)).setDefault(this.styles["default"]);this.rcs.push(this.crcs)},__pushStyle:function(b){var c=this.crcs;this.crcs=new a(this.ctx);this.crcs.chain=c;this.crcs.setStyle(b);this.crcs.applyStyle();this.rcs.push(this.crcs)},__popStyle:function(){if(this.rcs.length>1)this.rcs.pop(), +this.crcs=this.rcs[this.rcs.length-1],this.crcs.applyStyle()},__popAnchor:function(){this.anchorStack.length>0&&this.anchorStack.pop()},__pushAnchor:function(a){this.anchorStack.push(a)},start:function(a,b,c,d){this.y=this.x=0;this.width=typeof d!=="undefined"?d:0;this.ctx=a;this.lines=[];this.styles=b;this.images=c;this.anchorStack=[];this.__resetAppliedStyles();this.__nextLine()},setTag:function(a){this.__text();a=a.toLowerCase();if(a==="b")this.crcs.setBold(true);else if(a==="/b")this.crcs.setBold(false); +else if(a==="i")this.crcs.setItalic(true);else if(a==="/i")this.crcs.setItalic(false);else if(a==="stroked")this.crcs.setStroked(true);else if(a==="/stroked")this.crcs.setStroked(false);else if(a==="filled")this.crcs.setFilled(true);else if(a==="/filled")this.crcs.setFilled(false);else if(a==="tab")this.x=this.crcs.getTabPos(this.x);else if(a==="br")this.__nextLine();else if(a==="/a")this.__popAnchor();else if(a==="/style")this.rcs.length>1&&this.__popStyle();else if(a.indexOf("fillcolor")===0)a= +a.split("="),this.crcs.setFillStyle(a[1]);else if(a.indexOf("strokecolor")===0)a=a.split("="),this.crcs.setStrokeStyle(a[1]);else if(a.indexOf("strokesize")===0)a=a.split("="),this.crcs.setStrokeSize(a[1]|0);else if(a.indexOf("fontsize")===0)a=a.split("="),this.crcs.setFontSize(a[1]|0);else if(a.indexOf("style")===0)a=a.split("="),(a=this.styles[a[1]])&&this.__pushStyle(a);else if(a.indexOf("image")===0){var a=a.split("=")[1].split(","),b=a[0];if(this.images[b]){var c=0,d=0;a.length>=3&&(c=a[1]|0, +d=a[2]|0);this.__image(this.images[b],c,d)}else CAAT.currentDirector.getImage(b)&&this.__image(CAAT.currentDirector.getImage(b))}else a.indexOf("a=")===0&&(a=a.split("="),this.__pushAnchor(a[1]))}};var c=function(a,b){this.link=a;this.style=b;return this};c.prototype={x:null,y:null,width:null,height:null,style:null,link:null,isLink:function(){return this.link},setLink:function(a){this.link=a;return this},getLink:function(){return this.link},contains:function(){return false}};var d=function(a,b,c, +e,f,m){d.superclass.constructor.call(this,m,f);this.x=a;this.image=b;this.row=c;this.column=e;this.width=b.getWidth();this.height=b.getHeight();if(this.image instanceof CAAT.SpriteImage||this.image instanceof CAAT.Foundation.SpriteImage)this.spriteIndex=typeof c==="undefined"||typeof e==="undefined"?0:c*b.columns+e,this.paint=this.paintSI;return this};d.prototype={image:null,row:null,column:null,spriteIndex:null,paint:function(a){this.style.image(a);a.drawImage(this.image,this.x,-this.height+1)}, +paintSI:function(a){this.style.image(a);this.image.setSpriteIndex(this.spriteIndex);this.image.paint({ctx:a},0,this.x,-this.height+1)},getHeight:function(){return this.image instanceof CAAT.Foundation.SpriteImage?this.image.getHeight():this.image.height},getFontMetrics:function(){return null},contains:function(a,b){return a>=this.x&&a<=this.x+this.width&&b>=this.y&&b=this.x&&a<=this.x+this.width&&b>=this.y&&b<=this.y+this.height},setYPosition:function(a){this.bl=a;this.y=a-this.fm.ascent}}; +extend(d,c);extend(e,c);var f=function(a){this.elements=[];this.defaultFontMetrics=a;return this};f.prototype={elements:null,width:0,height:0,defaultHeight:0,y:0,x:0,alignment:null,baselinePos:0,addElement:function(a){this.width=Math.max(this.width,a.x+a.width);this.height=Math.max(this.height,a.height);this.elements.push(a);this.alignment=a.style.__getProperty("alignment")},addElementImage:function(a){this.width=Math.max(this.width,a.x+a.width);this.height=Math.max(this.height,a.height);this.elements.push(a)}, +getHeight:function(){return this.height},setY:function(a){this.y=a},getY:function(){return this.y},paint:function(a){a.save();a.translate(this.x,this.y+this.baselinePos);for(var b=0;b=0.6&&this.elements.length>1){var c=a-this.width,c=c/(this.elements.length- +1)|0;for(b=1;ba.ascent&&(a=e):a=e:b?d.getHeight()>d.getHeight()&&(b=d):b=d}this.baselinePos=Math.max(a?a.ascent:this.defaultFontMetrics.ascent,b?b.getHeight():this.defaultFontMetrics.ascent);this.height= +this.baselinePos+(a!=null?a.descent:this.defaultFontMetrics.descent);for(c=0;c", +d+1),-1!==o&&(n=f.substr(d+1,o-d-1),n.indexOf("<")!==-1?(this.rc.fchar(p),d+=1):(this.rc.setTag(n),d=o+1))):(this.rc.fchar(p),d+=1);this.rc.end();this.lines=this.rc.lines;this.__calculateDocumentDimension(typeof b==="undefined"?0:b);this.setLinesAlignment();q.restore();this.setPreferredSize(this.documentWidth,this.documentHeight);this.invalidateLayout();this.setDocumentPosition();c&&this.cacheAsBitmap(0,c);if(this.matchTextSize)this.width=this.preferredSize.width,this.height=this.preferredSize.height; +return this}},setVerticalAlignment:function(a){this.valignment=a;this.setDocumentPosition();return this},setHorizontalAlignment:function(a){this.halignment=a;this.setDocumentPosition();return this},setDocumentPosition:function(a,b){typeof a!=="undefined"&&this.setHorizontalAlignment(a);typeof b!=="undefined"&&this.setVerticalAlignment(b);var c=0,d=0;this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER?d=(this.height-this.documentHeight)/2:this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.BOTTOM&& +(d=this.height-this.documentHeight);this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER?c=(this.width-this.documentWidth)/2:this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.RIGHT&&(c=this.width-this.documentWidth);this.documentX=c;this.documentY=d},__calculateDocumentDimension:function(a){var b,c=0;for(b=this.documentHeight=this.documentWidth=0;b=a&&d.y+d.height>=b)return d.__getElementAt(a-d.x,b-d.y)}return null},mouseExit:function(){CAAT.setCursor("default")},mouseMove:function(a){(a=this.__getDocumentElementAt(a.x,a.y))&&a.getLink()?CAAT.setCursor("pointer"):CAAT.setCursor("default")},mouseClick:function(a){this.clickCallback&&(a=this.__getDocumentElementAt(a.x,a.y),a.getLink()&& +this.clickCallback(a.getLink()))},setClickCallback:function(a){this.clickCallback=a;return this}}}}); CAAT.Module({defines:"CAAT.Foundation.UI.PathActor",aliases:["CAAT.PathActor"],depends:["CAAT.Foundation.Actor"],extendsClass:"CAAT.Foundation.Actor",extendsWith:{path:null,pathBoundingRectangle:null,bOutline:false,outlineColor:"black",onUpdateCallback:null,interactive:false,getPath:function(){return this.path},setPath:function(a){this.path=a;if(a!=null)this.pathBoundingRectangle=a.getBoundingBox(),this.setInteractive(this.interactive);return this},paint:function(a,b){CAAT.Foundation.UI.PathActor.superclass.paint.call(this, a,b);if(this.path){var c=a.ctx;c.strokeStyle="#000";this.path.paint(a,this.interactive);if(this.bOutline)c.strokeStyle=this.outlineColor,c.strokeRect(this.pathBoundingRectangle.x,this.pathBoundingRectangle.y,this.pathBoundingRectangle.width,this.pathBoundingRectangle.height)}},showBoundingBox:function(a,b){if((this.bOutline=a)&&b)this.outlineColor=b;return this},setInteractive:function(a){this.interactive=a;this.path&&this.path.setInteractive(a);return this},setOnUpdateCallback:function(a){this.onUpdateCallback= a;return this},mouseDrag:function(a){this.path.drag(a.point.x,a.point.y,this.onUpdateCallback)},mouseDown:function(a){this.path.press(a.point.x,a.point.y)},mouseUp:function(){this.path.release()}}}); diff --git a/build/caat.js b/build/caat.js index dc14646a..fb8ec8d3 100644 --- a/build/caat.js +++ b/build/caat.js @@ -21,11 +21,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Version: 0.6 build: 3 +Version: 0.6 build: 5 Created on: DATE: 2013-07-01 -TIME: 04:32:53 +TIME: 04:58:32 */ diff --git a/changelog b/changelog index ea5e6a85..45dfd371 100644 --- a/changelog +++ b/changelog @@ -1,6 +1,6 @@ -* 07/01/2013 0.7 Build 3 * +* 07/01/2013 0.7 Build 6 * --------------------------- * Added functionality to AudioManager. The method director.setAudioFormatExtensions which proxies to audioManager.setAudioFormatExtensions diff --git a/documentation/jsdoc/files.html b/documentation/jsdoc/files.html new file mode 100644 index 00000000..bb93f836 --- /dev/null +++ b/documentation/jsdoc/files.html @@ -0,0 +1,1562 @@ + + + + + + JsDoc Reference - File Index + + + + + + + + +
    + +
    +

    Classes

    + +
    +
    + +
    +

    File Index

    + + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + \ No newline at end of file diff --git a/documentation/jsdoc/index.html b/documentation/jsdoc/index.html new file mode 100644 index 00000000..3fec5a25 --- /dev/null +++ b/documentation/jsdoc/index.html @@ -0,0 +1,1178 @@ + + + + + + JsDoc Reference - Index + + + + + + + + +
    + +
    +

    Classes

    + +
    +
    + +
    +

    Class Index

    + + +
    +

    _global_

    + +
    +
    + +
    +

    CAAT

    + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + +
    +

    CAAT.Class

    + +
    +
    + +
    +

    CAAT.CSS

    + +
    +
    + +
    +

    CAAT.Event

    + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + +
    +

    CAAT.KEYS

    + +
    +
    + +
    +

    CAAT.Math

    + +
    +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + +
    +

    CAAT.WebGL

    + +
    +
    + + +
    + + +
    + + +
    + + +
    + +
    +

    String

    + +
    +
    + + +
    +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + \ No newline at end of file diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.AlphaBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.AlphaBehavior.html new file mode 100644 index 00000000..9129fdbb --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.AlphaBehavior.html @@ -0,0 +1,997 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.AlphaBehavior + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Behavior.AlphaBehavior +

    + + +

    + +
    Extends + CAAT.Behavior.BaseBehavior.
    + + + + + +
    Defined in: AlphaBehavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   +
    + endAlpha +
    +
    Ending alpha transparency value.
    +
    <private>   + +
    Starting alpha transparency value.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      + +
    +
      +
    calculateKeyFramesData(prefix, name, keyframessize) +
    +
    +
      + +
    +
      + +
    +
      +
    parse(obj) +
    +
    +
      +
    setForTime(time, actor) +
    +
    Applies corresponding alpha transparency value for a given time.
    +
      +
    setValues(start, end) +
    +
    Set alpha transparency minimum and maximum value.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Behavior.AlphaBehavior() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + endAlpha + +
    +
    + Ending alpha transparency value. Between 0 and 1. + + +
    + + + + + + + + +
    + + +
    <private> + + + startAlpha + +
    +
    + Starting alpha transparency value. Between 0 and 1. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + + calculateKeyFrameData(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + calculateKeyFramesData(prefix, name, keyframessize) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + prefix + +
    +
    + +
    + name + +
    +
    + +
    + keyframessize + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getKeyFrameDataValues(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPropertyName() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + parse(obj) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + obj + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {number} + setForTime(time, actor) + +
    +
    + Applies corresponding alpha transparency value for a given time. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    the time to apply the scale for.
    + +
    + actor + +
    +
    the target actor to set transparency for.
    + +
    + + + + + +
    +
    Returns:
    + +
    {number} the alpha value set. Normalized from 0 (total transparency) to 1 (total opacity)
    + +
    + + + + +
    + + +
    + + + setValues(start, end) + +
    +
    + Set alpha transparency minimum and maximum value. +This value can be coerced by Actor's property isGloblAlpha. + + +
    + + + + +
    +
    Parameters:
    + +
    + start + +
    +
    {number} a float indicating the starting alpha value.
    + +
    + end + +
    +
    {number} a float indicating the ending alpha value.
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:15 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.Status.html b/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.Status.html new file mode 100644 index 00000000..69e3d577 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.Status.html @@ -0,0 +1,660 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.BaseBehavior.Status + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Behavior.BaseBehavior.Status +

    + + +

    + + + + + + +
    Defined in: BaseBehavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    Internal behavior status values.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   +
    + CAAT.Behavior.BaseBehavior.Status.EXPIRED +
    +
    +
    <static>   +
    + CAAT.Behavior.BaseBehavior.Status.NOT_STARTED +
    +
    +
    <static>   +
    + CAAT.Behavior.BaseBehavior.Status.STARTED +
    +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Behavior.BaseBehavior.Status +
    + +
    + Internal behavior status values. Do not assign directly. + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.Behavior.BaseBehavior.Status.EXPIRED + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.BaseBehavior.Status.NOT_STARTED + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.BaseBehavior.Status.STARTED + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:15 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.html new file mode 100644 index 00000000..52d9d0e7 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.BaseBehavior.html @@ -0,0 +1,2661 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.BaseBehavior + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Behavior.BaseBehavior +

    + + +

    + + + + + + +
    Defined in: BaseBehavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    The BaseBehavior is the base class of all Behavior modifiers: + +
  415. AlphaBehabior +
  416. RotateBehavior +
  417. ScaleBehavior +
  418. Scale1Behavior +
  419. PathBehavior +
  420. GenericBehavior +
  421. ContainerBehavior + +Behavior base class.
  422. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   +
    + actor +
    +
    The actor this behavior will be applied to.
    +
    <private>   + +
    Behavior application duration time related to scene time.
    +
    <private>   + +
    Behavior application start time related to scene time.
    +
    <private>   + +
    Will this behavior apply for ever in a loop ?
    +
    <private>   + +
    if true, this behavior will be removed from the this.actor instance when it expires.
    +
      + +
    Apply the behavior, or just calculate the values ?
    +
      +
    + id +
    +
    An id to identify this behavior.
    +
    <private>   + +
    An interpolator object to apply behaviors using easing functions, etc.
    +
      + +
    does this behavior apply relative values ??
    +
    <private>   + +
    Behavior lifecycle observer list.
    +
    <private>   +
    + solved +
    +
    Is this behavior solved ? When called setDelayTime, this flag identifies whether the behavior +is in time relative to the scene.
    +
    <private>   +
    + status +
    +
    behavior status.
    +
    <private>   + +
    Initial offset to apply this behavior the first time.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    Constructor delegate function.
    +
      +
    addListener(behaviorListener) +
    +
    Adds an observer to this behavior.
    +
      +
    apply(time, actor) +
    +
    This method must no be called directly.
    +
      + +
    Calculate a CSS3 @key-frame for this behavior at the given time.
    +
      +
    calculateKeyFramesData(prefix, name, keyframessize) +
    +
    Calculate a complete CSS3 @key-frame set for this behavior.
    +
      + +
    Remove all registered listeners to the behavior.
    +
    <private>   +
    fireBehaviorAppliedEvent(actor, time, normalizedTime, value) +
    +
    Notify observers about behavior being applied.
    +
    <private>   +
    fireBehaviorExpiredEvent(actor, time) +
    +
    Notify observers about expiration event.
    +
    <private>   +
    fireBehaviorStartedEvent(actor, time) +
    +
    Notify observers the first time the behavior is applied.
    +
      + +
    +
      + +
    Calculate a CSS3 @key-frame data values instead of building a CSS3 @key-frame value.
    +
      + +
    Get this behaviors CSS property name application.
    +
      + +
    +
      +
    initialize(overrides) +
    +
    +
      +
    isBehaviorInTime(time, actor) +
    +
    Chekcs whether the behaviour is in scene time.
    +
      +
    isCycle() +
    +
    +
    <private>   +
    normalizeTime(time) +
    +
    Convert scene time into something more manageable for the behavior.
    +
    <static>   +
    CAAT.Behavior.BaseBehavior.parse(obj) +
    +
    +
      +
    parse(obj) +
    +
    Parse a behavior of this type.
    +
      +
    setCycle(bool) +
    +
    Sets the behavior to cycle, ie apply forever.
    +
      + +
    Sets the default interpolator to a linear ramp, that is, behavior will be applied linearly.
    +
      +
    setDelayTime(delay, duration) +
    +
    Sets behavior start time and duration.
    +
    <private>   +
    setExpired(actor, time) +
    +
    Sets the behavior as expired.
    +
    <private>   +
    setForTime(actor, time) +
    +
    This method must be overriden for every Behavior breed.
    +
      +
    setFrameTime(startTime, duration) +
    +
    Sets behavior start time and duration.
    +
      +
    setId(id) +
    +
    Sets this behavior id.
    +
      +
    setInterpolator(interpolator) +
    +
    Changes behavior default interpolator to another instance of CAAT.Interpolator.
    +
      + +
    Make this behavior not applicable.
    +
      + +
    Sets default interpolator to be linear from 0.
    +
      +
    setRelative(bool) +
    +
    Set this behavior as relative value application to some other measures.
    +
      + +
    +
    <private>   +
    setStatus(st) +
    +
    Set this behavior status
    +
      +
    setTimeOffset(offset) +
    +
    Set this behavior offset time.
    +
      + +
    Set whether this behavior will apply behavior values to a reference Actor instance.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Behavior.BaseBehavior() +
    + +
    + The BaseBehavior is the base class of all Behavior modifiers: + +
  423. AlphaBehabior +
  424. RotateBehavior +
  425. ScaleBehavior +
  426. Scale1Behavior +
  427. PathBehavior +
  428. GenericBehavior +
  429. ContainerBehavior + +Behavior base class. + +

    +A behavior is defined by a frame time (behavior duration) and a behavior application function called interpolator. +In its default form, a behaviour is applied linearly, that is, the same amount of behavior is applied every same +time interval. +

    +A concrete Behavior, a rotateBehavior in example, will change a concrete Actor's rotationAngle during the specified +period. +

    +A behavior is guaranteed to notify (if any observer is registered) on behavior expiration. +

    +A behavior can keep an unlimited observers. Observers are objects of the form: +

    + +{ + behaviorExpired : function( behavior, time, actor); + behaviorApplied : function( behavior, time, normalizedTime, actor, value); +} + +

    +behaviorExpired: function( behavior, time, actor). This method will be called for any registered observer when +the scene time is greater than behavior's startTime+duration. This method will be called regardless of the time +granurality. +

    +behaviorApplied : function( behavior, time, normalizedTime, actor, value). This method will be called once per +frame while the behavior is not expired and is in frame time (behavior startTime>=scene time). This method can be +called multiple times. +

    +Every behavior is applied to a concrete Actor. +Every actor must at least define an start and end value. The behavior will set start-value at behaviorStartTime and +is guaranteed to apply end-value when scene time= behaviorStartTime+behaviorDuration. +

    +You can set behaviors to apply forever that is cyclically. When a behavior is cycle=true, won't notify +behaviorExpired to its registered observers. +

    +Other Behaviors simply must supply with the method setForTime(time, actor) overriden. + +

  430. + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + actor + +
    +
    + The actor this behavior will be applied to. + + +
    + + + + + + + + +
    + + +
    <private> + + + behaviorDuration + +
    +
    + Behavior application duration time related to scene time. + + +
    + + + + + + + + +
    + + +
    <private> + + + behaviorStartTime + +
    +
    + Behavior application start time related to scene time. + + +
    + + + + + + + + +
    + + +
    <private> + + + cycleBehavior + +
    +
    + Will this behavior apply for ever in a loop ? + + +
    + + + + + + + + +
    + + +
    <private> + + + discardable + +
    +
    + if true, this behavior will be removed from the this.actor instance when it expires. + + +
    + + + + + + + + +
    + + +
    + + + doValueApplication + +
    +
    + Apply the behavior, or just calculate the values ? + + +
    + + + + + + + + +
    + + +
    + + + id + +
    +
    + An id to identify this behavior. + + +
    + + + + + + + + +
    + + +
    <private> + + + interpolator + +
    +
    + An interpolator object to apply behaviors using easing functions, etc. +Unless otherwise specified, it will be linearly applied. + + +
    + + + + + + + + +
    + + +
    + + + isRelative + +
    +
    + does this behavior apply relative values ?? + + +
    + + + + + + + + +
    + + +
    <private> + + + lifecycleListenerList + +
    +
    + Behavior lifecycle observer list. + + +
    + + + + + + + + +
    + + +
    <private> + + + solved + +
    +
    + Is this behavior solved ? When called setDelayTime, this flag identifies whether the behavior +is in time relative to the scene. + + +
    + + + + + + + + +
    + + +
    <private> + + + status + +
    +
    + behavior status. + + +
    + + + + + + + + +
    + + +
    <private> + + + timeOffset + +
    +
    + Initial offset to apply this behavior the first time. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + {this} + __init() + +
    +
    + Constructor delegate function. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {this}
    + +
    + + + + +
    + + +
    + + + addListener(behaviorListener) + +
    +
    + Adds an observer to this behavior. + + +
    + + + + +
    +
    Parameters:
    + +
    + behaviorListener + +
    +
    an observer instance.
    + +
    + + + + + + + + +
    + + +
    + + + apply(time, actor) + +
    +
    + This method must no be called directly. +The director loop will call this method in orther to apply actor behaviors. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    the scene time the behaviro is being applied at.
    + +
    + actor + +
    +
    a CAAT.Actor instance the behavior is being applied to.
    + +
    + + + + + + + + +
    + + +
    + + + calculateKeyFrameData(time) + +
    +
    + Calculate a CSS3 @key-frame for this behavior at the given time. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + calculateKeyFramesData(prefix, name, keyframessize) + +
    +
    + Calculate a complete CSS3 @key-frame set for this behavior. + + +
    + + + + +
    +
    Parameters:
    + +
    + prefix + +
    +
    {string} browser vendor prefix
    + +
    + name + +
    +
    {string} keyframes animation name
    + +
    + keyframessize + +
    +
    {number} number of keyframes to generate
    + +
    + + + + + + + + +
    + + +
    + + + emptyListenerList() + +
    +
    + Remove all registered listeners to the behavior. + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + fireBehaviorAppliedEvent(actor, time, normalizedTime, value) + +
    +
    + Notify observers about behavior being applied. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    a CAAT.Actor instance the behavior is being applied to.
    + +
    + time + +
    +
    the scene time of behavior application.
    + +
    + normalizedTime + +
    +
    the normalized time (0..1) considering 0 behavior start time and 1 +behaviorStartTime+behaviorDuration.
    + +
    + value + +
    +
    the value being set for actor properties. each behavior will supply with its own value version.
    + +
    + + + + + + + + +
    + + +
    <private> + + + fireBehaviorExpiredEvent(actor, time) + +
    +
    + Notify observers about expiration event. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    a CAAT.Actor instance
    + +
    + time + +
    +
    an integer with the scene time the behavior was expired at.
    + +
    + + + + + + + + +
    + + +
    <private> + + + fireBehaviorStartedEvent(actor, time) + +
    +
    + Notify observers the first time the behavior is applied. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getDuration() + +
    +
    + + + +
    + + + + + + + + +
    +
    Returns:
    + +
    an integer indicating the behavior duration time in ms.
    + +
    + + + + +
    + + +
    + + + getKeyFrameDataValues(time) + +
    +
    + Calculate a CSS3 @key-frame data values instead of building a CSS3 @key-frame value. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + {String} + getPropertyName() + +
    +
    + Get this behaviors CSS property name application. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {String}
    + +
    + + + + +
    + + +
    + + + getStartTime() + +
    +
    + + + +
    + + + + + + + + +
    +
    Returns:
    + +
    an integer indicating the behavior start time in ms..
    + +
    + + + + +
    + + +
    + + + initialize(overrides) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + overrides + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + isBehaviorInTime(time, actor) + +
    +
    + Chekcs whether the behaviour is in scene time. +In case it gets out of scene time, and has not been tagged as expired, the behavior is expired and observers +are notified about that fact. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    the scene time to check the behavior against.
    + +
    + actor + +
    +
    the actor the behavior is being applied to.
    + +
    + + + + + +
    +
    Returns:
    + +
    a boolean indicating whether the behavior is in scene time.
    + +
    + + + + +
    + + +
    + + + isCycle() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + normalizeTime(time) + +
    +
    + Convert scene time into something more manageable for the behavior. +behaviorStartTime will be 0 and behaviorStartTime+behaviorDuration will be 1. +the time parameter will be proportional to those values. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    the scene time to be normalized. an integer.
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.BaseBehavior.parse(obj) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + obj + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + parse(obj) + +
    +
    + Parse a behavior of this type. + + +
    + + + + +
    +
    Parameters:
    + +
    + obj + +
    +
    {object} an object with a behavior definition.
    + +
    + + + + + + + + +
    + + +
    + + + setCycle(bool) + +
    +
    + Sets the behavior to cycle, ie apply forever. + + +
    + + + + +
    +
    Parameters:
    + +
    + bool + +
    +
    a boolean indicating whether the behavior is cycle.
    + +
    + + + + + + + + +
    + + +
    + + + setDefaultInterpolator() + +
    +
    + Sets the default interpolator to a linear ramp, that is, behavior will be applied linearly. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setDelayTime(delay, duration) + +
    +
    + Sets behavior start time and duration. Start time is relative to scene time. + +a call to + setFrameTime( scene.time, duration ) is equivalent to + setDelayTime( 0, duration ) + + +
    + + + + +
    +
    Parameters:
    + +
    + delay + +
    +
    {number}
    + +
    + duration + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    <private> + + + setExpired(actor, time) + +
    +
    + Sets the behavior as expired. +This method must not be called directly. It is an auxiliary method to isBehaviorInTime method. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    {CAAT.Actor}
    + +
    + time + +
    +
    {integer} the scene time.
    + +
    + + + + + + + + +
    + + +
    <private> + + + setForTime(actor, time) + +
    +
    + This method must be overriden for every Behavior breed. +Must not be called directly. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    {CAAT.Actor} a CAAT.Actor instance.
    + +
    + time + +
    +
    {number} an integer with the scene time.
    + +
    + + + + + + + + +
    + + +
    + + + setFrameTime(startTime, duration) + +
    +
    + Sets behavior start time and duration. Start time is set absolutely relative to scene time. + + +
    + + + + +
    +
    Parameters:
    + +
    + startTime + +
    +
    {number} an integer indicating behavior start time in scene time in ms..
    + +
    + duration + +
    +
    {number} an integer indicating behavior duration in ms.
    + +
    + + + + + + + + +
    + + +
    + + + setId(id) + +
    +
    + Sets this behavior id. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {object}
    + +
    + + + + + + + + +
    + + +
    + + + setInterpolator(interpolator) + +
    +
    + Changes behavior default interpolator to another instance of CAAT.Interpolator. +If the behavior is not defined by CAAT.Interpolator factory methods, the interpolation function must return +its values in the range 0..1. The behavior will only apply for such value range. + + +
    + + + + +
    +
    Parameters:
    + +
    + interpolator + +
    +
    a CAAT.Interpolator instance.
    + +
    + + + + + + + + +
    + + +
    + + {*} + setOutOfFrameTime() + +
    +
    + Make this behavior not applicable. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + setPingPong() + +
    +
    + Sets default interpolator to be linear from 0..1 and from 1..0. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {*} + setRelative(bool) + +
    +
    + Set this behavior as relative value application to some other measures. +Each Behavior will define its own. + + +
    + + + + +
    +
    Parameters:
    + +
    + bool + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + setRelativeValues() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + {*} + setStatus(st) + +
    +
    + Set this behavior status + + +
    + + + + +
    +
    Parameters:
    + +
    + st + +
    +
    {CAAT.Behavior.BaseBehavior.Status}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + {*} + setTimeOffset(offset) + +
    +
    + Set this behavior offset time. +This method is intended to make a behavior start applying (the first) time from a different +start time. + + +
    + + + + +
    +
    Parameters:
    + +
    + offset + +
    +
    {number} between 0 and 1
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + {*} + setValueApplication(apply) + +
    +
    + Set whether this behavior will apply behavior values to a reference Actor instance. + + +
    + + + + +
    +
    Parameters:
    + +
    + apply + +
    +
    {boolean}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:15 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.ContainerBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.ContainerBehavior.html new file mode 100644 index 00000000..c1c30037 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.ContainerBehavior.html @@ -0,0 +1,1469 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.ContainerBehavior + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Behavior.ContainerBehavior +

    + + +

    + +
    Extends + CAAT.Behavior.BaseBehavior.
    + + + + + +
    Defined in: ContainerBehavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + behaviors +
    +
    A collection of behaviors.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(conforming) +
    +
    +
      +
    addBehavior(behavior) +
    +
    Add a new behavior to the container.
    +
      +
    apply(time, actor) +
    +
    Applies every contained Behaviors.
    +
      +
    behaviorApplied(behavior, scenetime, time, actor, value) +
    +
    +
      +
    behaviorExpired(behavior, time, actor) +
    +
    This method is the observer implementation for every contained behavior.
    +
      +
    calculateKeyFrameData(referenceTime, prefix) +
    +
    +
      +
    calculateKeyFramesData(prefix, name, keyframessize, anchorX, anchorY) +
    +
    +
      +
    conformToDuration(duration) +
    +
    Proportionally change this container duration to its children.
    +
      + +
    Get a behavior by mathing its id.
    +
      +
    getKeyFrameDataValues(referenceTime) +
    +
    +
      +
    parse(obj) +
    +
    +
      +
    setCycle(cycle, recurse) +
    +
    +
      +
    setDelayTime(start, duration) +
    +
    +
      +
    setExpired(actor, time) +
    +
    Expire this behavior and the children applied at the parameter time.
    +
      +
    setForTime(time{number}) +
    +
    Implementation method of the behavior.
    +
      +
    setFrameTime(start, duration) +
    +
    +
    + + + +
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getPropertyName, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setDefaultInterpolator, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Behavior.ContainerBehavior() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + behaviors + +
    +
    + A collection of behaviors. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(conforming) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + conforming + +
    +
    {bool=} conform this behavior duration to that of its children.
    + +
    + + + + + + + + +
    + + +
    + + + addBehavior(behavior) + +
    +
    + Add a new behavior to the container. + + +
    + + + + +
    +
    Parameters:
    + +
    + behavior + +
    +
    {CAAT.Behavior.BaseBehavior}
    + +
    + + + + + + + + +
    + + +
    + + + apply(time, actor) + +
    +
    + Applies every contained Behaviors. +The application time the contained behaviors will receive will be ContainerBehavior related and not the +received time. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    an integer indicating the time to apply the contained behaviors at.
    + +
    + actor + +
    +
    a CAAT.Foundation.Actor instance indicating the actor to apply the behaviors for.
    + +
    + + + + + + + + +
    + + +
    + + + behaviorApplied(behavior, scenetime, time, actor, value) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + behavior + +
    +
    + +
    + scenetime + +
    +
    + +
    + time + +
    +
    + +
    + actor + +
    +
    + +
    + value + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + behaviorExpired(behavior, time, actor) + +
    +
    + This method is the observer implementation for every contained behavior. +If a container is Cycle=true, won't allow its contained behaviors to be expired. + + +
    + + + + +
    +
    Parameters:
    + +
    + behavior + +
    +
    a CAAT.Behavior.BaseBehavior instance which has been expired.
    + +
    + time + +
    +
    an integer indicating the time at which has become expired.
    + +
    + actor + +
    +
    a CAAT.Foundation.Actor the expired behavior is being applied to.
    + +
    + + + + + + + + +
    + + +
    + + + calculateKeyFrameData(referenceTime, prefix) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + referenceTime + +
    +
    + +
    + prefix + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + calculateKeyFramesData(prefix, name, keyframessize, anchorX, anchorY) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + prefix + +
    +
    + +
    + name + +
    +
    + +
    + keyframessize + +
    +
    + +
    + anchorX + +
    +
    + +
    + anchorY + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + conformToDuration(duration) + +
    +
    + Proportionally change this container duration to its children. + + +
    + + + + +
    +
    Parameters:
    + +
    + duration + +
    +
    {number} new duration in ms.
    + +
    + + + + + +
    +
    Returns:
    + +
    this;
    + +
    + + + + +
    + + +
    + + + getBehaviorById(id) + +
    +
    + Get a behavior by mathing its id. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {object}
    + +
    + + + + + + + + +
    + + +
    + + + getKeyFrameDataValues(referenceTime) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + referenceTime + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + parse(obj) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + obj + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setCycle(cycle, recurse) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + cycle + +
    +
    + +
    + recurse + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setDelayTime(start, duration) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + start + +
    +
    + +
    + duration + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {*} + setExpired(actor, time) + +
    +
    + Expire this behavior and the children applied at the parameter time. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    {CAAT.Foundation.Actor}
    + +
    + time + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + setForTime(time{number}) + +
    +
    + Implementation method of the behavior. +Just call implementation method for its contained behaviors. + + +
    + + + + +
    +
    Parameters:
    + +
    + time{number} + +
    +
    an integer indicating the time the behavior is being applied at.
    + +
    + actor{CAAT.Foundation.Actor} + +
    +
    an actor the behavior is being applied to.
    + +
    + + + + + + + + +
    + + +
    + + + setFrameTime(start, duration) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + start + +
    +
    + +
    + duration + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:15 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.GenericBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.GenericBehavior.html new file mode 100644 index 00000000..3d854425 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.GenericBehavior.html @@ -0,0 +1,877 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.GenericBehavior + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Behavior.GenericBehavior +

    + + +

    + +
    Extends + CAAT.Behavior.BaseBehavior.
    + + + + + +
    Defined in: GenericBehavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + callback +
    +
    this callback will be invoked for every behavior application.
    +
      +
    + end +
    +
    ending value.
    +
      +
    + property +
    +
    property to apply values to.
    +
      +
    + start +
    +
    starting value.
    +
      +
    + target +
    +
    target to apply this generic behvior.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    setForTime(time, actor) +
    +
    +
      +
    setValues(start, end, target, property, callback) +
    +
    Defines the values to apply this behavior.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, calculateKeyFrameData, calculateKeyFramesData, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getKeyFrameDataValues, getPropertyName, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, parse, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Behavior.GenericBehavior() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + callback + +
    +
    + this callback will be invoked for every behavior application. + + +
    + + + + + + + + +
    + + +
    + + + end + +
    +
    + ending value. + + +
    + + + + + + + + +
    + + +
    + + + property + +
    +
    + property to apply values to. + + +
    + + + + + + + + +
    + + +
    + + + start + +
    +
    + starting value. + + +
    + + + + + + + + +
    + + +
    + + + target + +
    +
    + target to apply this generic behvior. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + + setForTime(time, actor) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + actor + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setValues(start, end, target, property, callback) + +
    +
    + Defines the values to apply this behavior. + + +
    + + + + +
    +
    Parameters:
    + +
    + start + +
    +
    {number} initial behavior value.
    + +
    + end + +
    +
    {number} final behavior value.
    + +
    + target + +
    +
    {object} an object. Usually a CAAT.Actor.
    + +
    + property + +
    +
    {string} target object's property to set value to.
    + +
    + callback + +
    +
    {function} a function of the form function( target, value ).
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:15 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.Interpolator.html b/documentation/jsdoc/symbols/CAAT.Behavior.Interpolator.html new file mode 100644 index 00000000..b76a40d8 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.Interpolator.html @@ -0,0 +1,1557 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.Interpolator + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Behavior.Interpolator +

    + + +

    + + + + + + +
    Defined in: Interpolator.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
    <private>   +
    bounce(time) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    createCubicBezierInterpolator(p0, p1, p2, p3, bPingPong) +
    +
    Creates a Cubic bezier curbe as interpolator.
    +
      +
    createElasticInInterpolator(amplitude, p, bPingPong) +
    +
    +
      +
    createElasticInOutInterpolator(amplitude, p, bPingPong) +
    +
    +
      +
    createElasticOutInterpolator(amplitude, p, bPingPong) +
    +
    +
      +
    createExponentialInInterpolator(exponent, bPingPong) +
    +
    Set an exponential interpolator function.
    +
      +
    createExponentialInOutInterpolator(exponent, bPingPong) +
    +
    Set an exponential interpolator function.
    +
      +
    createExponentialOutInterpolator(exponent, bPingPong) +
    +
    Set an exponential interpolator function.
    +
      +
    createLinearInterpolator(bPingPong, bInverse) +
    +
    Set a linear interpolation function.
    +
      +
    createQuadricBezierInterpolator(p0, p1, p2, bPingPong) +
    +
    Creates a Quadric bezier curbe as interpolator.
    +
    <static>   +
    CAAT.Behavior.Interpolator.enumerateInterpolators() +
    +
    +
      +
    getContour(iSize) +
    +
    Gets an array of coordinates which define the polyline of the intepolator's curve contour.
    +
      +
    getPosition(time) +
    +
    Linear and inverse linear interpolation function.
    +
      +
    paint(ctx) +
    +
    Paints an interpolator on screen.
    +
    <static>   +
    CAAT.Behavior.Interpolator.parse(obj) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Behavior.Interpolator() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + bounce(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + createBackOutInterpolator(bPingPong) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + bPingPong + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + createBounceInInterpolator(bPingPong) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + bPingPong + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + createBounceInOutInterpolator(bPingPong) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + bPingPong + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + createBounceOutInterpolator(bPingPong) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + bPingPong + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + createCubicBezierInterpolator(p0, p1, p2, p3, bPingPong) + +
    +
    + Creates a Cubic bezier curbe as interpolator. + + +
    + + + + +
    +
    Parameters:
    + +
    + p0 + +
    +
    {CAAT.Math.Point}
    + +
    + p1 + +
    +
    {CAAT.Math.Point}
    + +
    + p2 + +
    +
    {CAAT.Math.Point}
    + +
    + p3 + +
    +
    {CAAT.Math.Point}
    + +
    + bPingPong + +
    +
    {boolean} a boolean indicating if the interpolator must ping-pong.
    + +
    + + + + + + + + +
    + + +
    + + + createElasticInInterpolator(amplitude, p, bPingPong) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + amplitude + +
    +
    + +
    + p + +
    +
    + +
    + bPingPong + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + createElasticInOutInterpolator(amplitude, p, bPingPong) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + amplitude + +
    +
    + +
    + p + +
    +
    + +
    + bPingPong + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + createElasticOutInterpolator(amplitude, p, bPingPong) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + amplitude + +
    +
    + +
    + p + +
    +
    + +
    + bPingPong + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + createExponentialInInterpolator(exponent, bPingPong) + +
    +
    + Set an exponential interpolator function. The function to apply will be Math.pow(time,exponent). +This function starts with 0 and ends in values of 1. + + +
    + + + + +
    +
    Parameters:
    + +
    + exponent + +
    +
    {number} exponent of the function.
    + +
    + bPingPong + +
    +
    {boolean}
    + +
    + + + + + + + + +
    + + +
    + + + createExponentialInOutInterpolator(exponent, bPingPong) + +
    +
    + Set an exponential interpolator function. Two functions will apply: +Math.pow(time*2,exponent)/2 for the first half of the function (t<0.5) and +1-Math.abs(Math.pow(time*2-2,exponent))/2 for the second half (t>=.5) +This function starts with 0 and goes to values of 1 and ends with values of 0. + + +
    + + + + +
    +
    Parameters:
    + +
    + exponent + +
    +
    {number} exponent of the function.
    + +
    + bPingPong + +
    +
    {boolean}
    + +
    + + + + + + + + +
    + + +
    + + + createExponentialOutInterpolator(exponent, bPingPong) + +
    +
    + Set an exponential interpolator function. The function to apply will be 1-Math.pow(time,exponent). +This function starts with 1 and ends in values of 0. + + +
    + + + + +
    +
    Parameters:
    + +
    + exponent + +
    +
    {number} exponent of the function.
    + +
    + bPingPong + +
    +
    {boolean}
    + +
    + + + + + + + + +
    + + +
    + + + createLinearInterpolator(bPingPong, bInverse) + +
    +
    + Set a linear interpolation function. + + +
    + + + + +
    +
    Parameters:
    + +
    + bPingPong + +
    +
    {boolean}
    + +
    + bInverse + +
    +
    {boolean} will values will be from 1 to 0 instead of 0 to 1 ?.
    + +
    + + + + + + + + +
    + + +
    + + + createQuadricBezierInterpolator(p0, p1, p2, bPingPong) + +
    +
    + Creates a Quadric bezier curbe as interpolator. + + +
    + + + + +
    +
    Parameters:
    + +
    + p0 + +
    +
    {CAAT.Math.Point}
    + +
    + p1 + +
    +
    {CAAT.Math.Point}
    + +
    + p2 + +
    +
    {CAAT.Math.Point}
    + +
    + bPingPong + +
    +
    {boolean} a boolean indicating if the interpolator must ping-pong.
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.Interpolator.enumerateInterpolators() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getContour(iSize) + +
    +
    + Gets an array of coordinates which define the polyline of the intepolator's curve contour. +Values for both coordinates range from 0 to 1. + + +
    + + + + +
    +
    Parameters:
    + +
    + iSize + +
    +
    {number} an integer indicating the number of contour segments.
    + +
    + + + + + +
    +
    Returns:
    + +
    Array. of object of the form {x:float, y:float}.
    + +
    + + + + +
    + + +
    + + + getPosition(time) + +
    +
    + Linear and inverse linear interpolation function. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + paint(ctx) + +
    +
    + Paints an interpolator on screen. + + +
    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    {CanvasRenderingContext}
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.Interpolator.parse(obj) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + obj + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:15 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.autorotate.html b/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.autorotate.html new file mode 100644 index 00000000..0cd3ba4c --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.autorotate.html @@ -0,0 +1,660 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.PathBehavior.AUTOROTATE + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Behavior.PathBehavior.AUTOROTATE +

    + + +

    + + + + + + +
    Defined in: PathBehavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    Internal PathBehavior rotation constants.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   +
    + CAAT.Behavior.PathBehavior.AUTOROTATE.FREE +
    +
    +
    <static>   +
    + CAAT.Behavior.PathBehavior.AUTOROTATE.LEFT_TO_RIGHT +
    +
    +
    <static>   +
    + CAAT.Behavior.PathBehavior.AUTOROTATE.RIGHT_TO_LEFT +
    +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Behavior.PathBehavior.AUTOROTATE +
    + +
    + Internal PathBehavior rotation constants. + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.Behavior.PathBehavior.AUTOROTATE.FREE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.PathBehavior.AUTOROTATE.LEFT_TO_RIGHT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.PathBehavior.AUTOROTATE.RIGHT_TO_LEFT + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:15 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.html new file mode 100644 index 00000000..56598435 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.PathBehavior.html @@ -0,0 +1,1337 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.PathBehavior + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Behavior.PathBehavior +

    + + +

    + +
    Extends + CAAT.Behavior.BaseBehavior.
    + + + + + +
    Defined in: PathBehavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   + +
    Whether to set rotation angle while traversing the path.
    +
    <private>   + +
    Autorotation hint.
    +
    <private>   +
    + path +
    +
    A path to traverse.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      + +
    +
      +
    calculateKeyFramesData(prefix, name, keyframessize) +
    +
    +
      + +
    +
      + +
    +
      +
    parse(obj) +
    +
    +
      + +
    Get a point on the path.
    +
      +
    setAutoRotate(autorotate, autorotateOp) +
    +
    Sets an actor rotation to be heading from past to current path's point.
    +
      +
    setForTime(time, actor) +
    +
    +
      + +
    +
      +
    setPath() +
    +
    Set the behavior path.
    +
      + +
    +
      +
    setTranslation(tx, ty) +
    +
    +
      + +
    Set the behavior path.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    __init, addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setStatus, setTimeOffset, setValueApplication
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Behavior.PathBehavior() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + autoRotate + +
    +
    + Whether to set rotation angle while traversing the path. + + +
    + + + + + + + + +
    + + +
    <private> + + + autoRotateOp + +
    +
    + Autorotation hint. + + +
    + + + + + + + + +
    + + +
    <private> + + + path + +
    +
    + A path to traverse. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + + calculateKeyFrameData(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + calculateKeyFramesData(prefix, name, keyframessize) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + prefix + +
    +
    + +
    + name + +
    +
    + +
    + keyframessize + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getKeyFrameDataValues(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPropertyName() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + parse(obj) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + obj + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {object} + positionOnTime(time) + +
    +
    + Get a point on the path. +If the time to get the point at is in behaviors frame time, a point on the path will be returned, otherwise +a default {x:-1, y:-1} point will be returned. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} the time at which the point will be taken from the path.
    + +
    + + + + + +
    +
    Returns:
    + +
    {object} an object of the form {x:float y:float}
    + +
    + + + + +
    + + +
    + + + setAutoRotate(autorotate, autorotateOp) + +
    +
    + Sets an actor rotation to be heading from past to current path's point. +Take into account that this will be incompatible with rotation Behaviors +since they will set their own rotation configuration. + + +
    + + + + +
    +
    Parameters:
    + +
    + autorotate + +
    +
    {boolean}
    + +
    + autorotateOp + +
    +
    {CAAT.PathBehavior.autorotate} whether the sprite is drawn heading to the right.
    + +
    + + + + + +
    +
    Returns:
    + +
    this.
    + +
    + + + + +
    + + +
    + + + setForTime(time, actor) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + actor + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setOpenContour(b) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + b + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPath() + +
    +
    + Set the behavior path. +The path can be any length, and will take behaviorDuration time to be traversed. + + +
    + + + + +
    +
    Parameters:
    + +
    + {CAAT.Path} + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setRelativeValues(x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setTranslation(tx, ty) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + tx + +
    +
    a float with xoffset.
    + +
    + ty + +
    +
    a float with yoffset.
    + +
    + + + + + + + +
    +
    See:
    + +
    Actor.setPositionAnchor
    + +
    + + +
    + + +
    + + + setValues() + +
    +
    + Set the behavior path. +The path can be any length, and will take behaviorDuration time to be traversed. + + +
    + + + + +
    +
    Parameters:
    + +
    + {CAAT.Path} + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:15 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.RotateBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.RotateBehavior.html new file mode 100644 index 00000000..6cf56943 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.RotateBehavior.html @@ -0,0 +1,1275 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.RotateBehavior + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Behavior.RotateBehavior +

    + + +

    + +
    Extends + CAAT.Behavior.BaseBehavior.
    + + + + + +
    Defined in: RotateBehavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   +
    + anchorX +
    +
    Rotation X anchor.
    +
    <private>   +
    + anchorY +
    +
    Rotation Y anchor.
    +
    <private>   +
    + endAngle +
    +
    End rotation angle.
    +
    <private>   + +
    Start rotation angle.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      + +
    +
      +
    calculateKeyFramesData(prefix, name, keyframessize) +
    +
    +
      + +
    +
      + +
    +
      +
    parse(obj) +
    +
    +
      +
    setAnchor(actor, rx, ry) +
    +
    Set the behavior rotation anchor.
    +
      +
    setAngles(start, end) +
    +
    +
      +
    setForTime(time, actor) +
    +
    +
      + +
    +
      +
    setValues(startAngle, endAngle, anchorx, anchory) +
    +
    Set behavior bound values.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setStatus, setTimeOffset, setValueApplication
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Behavior.RotateBehavior() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + anchorX + +
    +
    + Rotation X anchor. + + +
    + + + + + + + + +
    + + +
    <private> + + + anchorY + +
    +
    + Rotation Y anchor. + + +
    + + + + + + + + +
    + + +
    <private> + + + endAngle + +
    +
    + End rotation angle. + + +
    + + + + + + + + +
    + + +
    <private> + + + startAngle + +
    +
    + Start rotation angle. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + calculateKeyFrameData(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + calculateKeyFramesData(prefix, name, keyframessize) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + prefix + +
    +
    + +
    + name + +
    +
    + +
    + keyframessize + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getKeyFrameDataValues(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPropertyName() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + parse(obj) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + obj + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setAnchor(actor, rx, ry) + +
    +
    + Set the behavior rotation anchor. Use this method when setting an exact percent +by calling setValues is complicated. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    + +
    + rx + +
    +
    + +
    + ry + +
    +
    + +
    + + + + + + + +
    +
    See:
    + +
    CAAT.Actor + +These parameters are to set a custom rotation anchor point. if anchor==CAAT.Actor.ANCHOR_CUSTOM + the custom rotation point is set.
    + +
    + + +
    + + +
    + + + setAngles(start, end) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + start + +
    +
    + +
    + end + +
    +
    + +
    + + +
    +
    Deprecated:
    +
    + Use setValues instead +
    +
    + + + + + + + +
    + + +
    + + + setForTime(time, actor) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + actor + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setRelativeValues(r) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + r + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setValues(startAngle, endAngle, anchorx, anchory) + +
    +
    + Set behavior bound values. +if no anchorx,anchory values are supplied, the behavior will assume +50% for both values, that is, the actor's center. + +Be aware the anchor values are supplied in RELATIVE PERCENT to +actor's size. + + +
    + + + + +
    +
    Parameters:
    + +
    + startAngle + +
    +
    {float} indicating the starting angle.
    + +
    + endAngle + +
    +
    {float} indicating the ending angle.
    + +
    + anchorx + +
    +
    {float} the percent position for anchorX
    + +
    + anchory + +
    +
    {float} the percent position for anchorY
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.Axis.html b/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.Axis.html new file mode 100644 index 00000000..fda029fd --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.Axis.html @@ -0,0 +1,628 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.Scale1Behavior.AXIS + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Behavior.Scale1Behavior.AXIS +

    + + +

    + + + + + + +
    Defined in: Scale1Behavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   +
    + CAAT.Behavior.Scale1Behavior.AXIS.X +
    +
    +
    <static>   +
    + CAAT.Behavior.Scale1Behavior.AXIS.Y +
    +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Behavior.Scale1Behavior.AXIS +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.Behavior.Scale1Behavior.AXIS.X + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.Scale1Behavior.AXIS.Y + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.html new file mode 100644 index 00000000..ee88a9b4 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.Scale1Behavior.html @@ -0,0 +1,1250 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.Scale1Behavior + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Behavior.Scale1Behavior +

    + + +

    + +
    Extends + CAAT.Behavior.BaseBehavior.
    + + + + + +
    Defined in: Scale1Behavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   +
    + anchorX +
    +
    Scale X anchor.
    +
    <private>   +
    + anchorY +
    +
    Scale Y anchor.
    +
      +
    + applyOnX +
    +
    Apply on Axis X or Y ?
    +
    <private>   +
    + endScale +
    +
    End scale value.
    +
    <private>   + +
    Start scale value.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    applyOnAxis(axis) +
    +
    +
      + +
    +
      +
    calculateKeyFramesData(prefix, name, keyframessize) +
    +
    +
      + +
    +
      + +
    +
      +
    parse(obj) +
    +
    +
      +
    setAnchor(actor, x, y) +
    +
    Set an exact position scale anchor.
    +
      +
    setForTime(time, actor) +
    +
    +
      +
    setValues(start, end, anchorx, anchory, anchory) +
    +
    Define this scale behaviors values.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Behavior.Scale1Behavior() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + anchorX + +
    +
    + Scale X anchor. + + +
    + + + + + + + + +
    + + +
    <private> + + + anchorY + +
    +
    + Scale Y anchor. + + +
    + + + + + + + + +
    + + +
    + + + applyOnX + +
    +
    + Apply on Axis X or Y ? + + +
    + + + + + + + + +
    + + +
    <private> + + + endScale + +
    +
    + End scale value. + + +
    + + + + + + + + +
    + + +
    <private> + + + startScale + +
    +
    + Start scale value. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + applyOnAxis(axis) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + axis + +
    +
    {CAAT.Behavior.Scale1Behavior.AXIS}
    + +
    + + + + + + + + +
    + + +
    + + + calculateKeyFrameData(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + calculateKeyFramesData(prefix, name, keyframessize) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + prefix + +
    +
    + +
    + name + +
    +
    + +
    + keyframessize + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getKeyFrameDataValues(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPropertyName() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + parse(obj) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + obj + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setAnchor(actor, x, y) + +
    +
    + Set an exact position scale anchor. Use this method when it is hard to +set a thorough anchor position expressed in percentage. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setForTime(time, actor) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + actor + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setValues(start, end, anchorx, anchory, anchory) + +
    +
    + Define this scale behaviors values. + +Be aware the anchor values are supplied in RELATIVE PERCENT to +actor's size. + + +
    + + + + +
    +
    Parameters:
    + +
    + start + +
    +
    {number} initial X axis scale value.
    + +
    + end + +
    +
    {number} final X axis scale value.
    + +
    + anchorx + +
    +
    {float} the percent position for anchorX
    + +
    + anchory + +
    +
    {float} the percent position for anchorY
    + +
    + anchory + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    this.
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.ScaleBehavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.ScaleBehavior.html new file mode 100644 index 00000000..4d16138d --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.ScaleBehavior.html @@ -0,0 +1,1250 @@ + + + + + + + JsDoc Reference - CAAT.Behavior.ScaleBehavior + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Behavior.ScaleBehavior +

    + + +

    + +
    Extends + CAAT.Behavior.BaseBehavior.
    + + + + + +
    Defined in: ScaleBehavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private> <static>   +
    + CAAT.Behavior.ScaleBehavior.anchorX +
    +
    Scale X anchor value.
    +
    <private> <static>   +
    + CAAT.Behavior.ScaleBehavior.anchorY +
    +
    Scale Y anchor value.
    +
    <private> <static>   +
    + CAAT.Behavior.ScaleBehavior.endScaleX +
    +
    End X scale value.
    +
    <private> <static>   +
    + CAAT.Behavior.ScaleBehavior.endScaleY +
    +
    End Y scale value.
    +
    <private> <static>   +
    + CAAT.Behavior.ScaleBehavior.startScaleX +
    +
    Start X scale value.
    +
    <private> <static>   +
    + CAAT.Behavior.ScaleBehavior.startScaleY +
    +
    Start Y scale value.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Behavior.BaseBehavior:
    actor, behaviorDuration, behaviorStartTime, cycleBehavior, discardable, doValueApplication, id, interpolator, isRelative, lifecycleListenerList, solved, status, timeOffset
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private> <static>   +
    CAAT.Behavior.ScaleBehavior.__init() +
    +
    +
    <static>   +
    CAAT.Behavior.ScaleBehavior.calculateKeyFrameData(time) +
    +
    +
    <static>   +
    CAAT.Behavior.ScaleBehavior.calculateKeyFramesData(prefix, name, keyframessize) +
    +
    +
    <static>   +
    CAAT.Behavior.ScaleBehavior.getKeyFrameDataValues(time) +
    +
    +
    <static>   +
    CAAT.Behavior.ScaleBehavior.getPropertyName() +
    +
    +
    <static>   +
    CAAT.Behavior.ScaleBehavior.parse(obj) +
    +
    +
    <static>   +
    CAAT.Behavior.ScaleBehavior.setAnchor(actor, x, y) +
    +
    Set an exact position scale anchor.
    +
    <static>   +
    CAAT.Behavior.ScaleBehavior.setForTime(time, actor) +
    +
    Applies corresponding scale values for a given time.
    +
    <static>   +
    CAAT.Behavior.ScaleBehavior.setValues(startX, endX, startY, endY, anchorx, anchory) +
    +
    Define this scale behaviors values.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Behavior.BaseBehavior:
    addListener, apply, emptyListenerList, fireBehaviorAppliedEvent, fireBehaviorExpiredEvent, fireBehaviorStartedEvent, getDuration, getStartTime, initialize, isBehaviorInTime, isCycle, normalizeTime, setCycle, setDefaultInterpolator, setDelayTime, setExpired, setFrameTime, setId, setInterpolator, setOutOfFrameTime, setPingPong, setRelative, setRelativeValues, setStatus, setTimeOffset, setValueApplication
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Behavior.ScaleBehavior() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> <static> + + + CAAT.Behavior.ScaleBehavior.anchorX + +
    +
    + Scale X anchor value. + + +
    + + + + + + + + +
    + + +
    <private> <static> + + + CAAT.Behavior.ScaleBehavior.anchorY + +
    +
    + Scale Y anchor value. + + +
    + + + + + + + + +
    + + +
    <private> <static> + + + CAAT.Behavior.ScaleBehavior.endScaleX + +
    +
    + End X scale value. + + +
    + + + + + + + + +
    + + +
    <private> <static> + + + CAAT.Behavior.ScaleBehavior.endScaleY + +
    +
    + End Y scale value. + + +
    + + + + + + + + +
    + + +
    <private> <static> + + + CAAT.Behavior.ScaleBehavior.startScaleX + +
    +
    + Start X scale value. + + +
    + + + + + + + + +
    + + +
    <private> <static> + + + CAAT.Behavior.ScaleBehavior.startScaleY + +
    +
    + Start Y scale value. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> <static> + + + CAAT.Behavior.ScaleBehavior.__init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.ScaleBehavior.calculateKeyFrameData(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.ScaleBehavior.calculateKeyFramesData(prefix, name, keyframessize) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + prefix + +
    +
    + +
    + name + +
    +
    + +
    + keyframessize + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.ScaleBehavior.getKeyFrameDataValues(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.ScaleBehavior.getPropertyName() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.ScaleBehavior.parse(obj) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + obj + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Behavior.ScaleBehavior.setAnchor(actor, x, y) + +
    +
    + Set an exact position scale anchor. Use this method when it is hard to +set a thorough anchor position expressed in percentage. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + {object} + CAAT.Behavior.ScaleBehavior.setForTime(time, actor) + +
    +
    + Applies corresponding scale values for a given time. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    the time to apply the scale for.
    + +
    + actor + +
    +
    the target actor to Scale.
    + +
    + + + + + +
    +
    Returns:
    + +
    {object} an object of the form { scaleX: {float}, scaleY: {float}�}
    + +
    + + + + +
    + + +
    <static> + + + CAAT.Behavior.ScaleBehavior.setValues(startX, endX, startY, endY, anchorx, anchory) + +
    +
    + Define this scale behaviors values. + +Be aware the anchor values are supplied in RELATIVE PERCENT to +actor's size. + + +
    + + + + +
    +
    Parameters:
    + +
    + startX + +
    +
    {number} initial X axis scale value.
    + +
    + endX + +
    +
    {number} final X axis scale value.
    + +
    + startY + +
    +
    {number} initial Y axis scale value.
    + +
    + endY + +
    +
    {number} final Y axis scale value.
    + +
    + anchorx + +
    +
    {float} the percent position for anchorX
    + +
    + anchory + +
    +
    {float} the percent position for anchorY
    + +
    + + + + + +
    +
    Returns:
    + +
    this.
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Behavior.html b/documentation/jsdoc/symbols/CAAT.Behavior.html new file mode 100644 index 00000000..55cd7f5f --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Behavior.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Behavior + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Behavior +

    + + +

    + + + + + + +
    Defined in: BaseBehavior.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    Namespace for all behavior-based actor properties instrumenter objects.
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Behavior +
    + +
    + Namespace for all behavior-based actor properties instrumenter objects. + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:15 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.CSS.html b/documentation/jsdoc/symbols/CAAT.CSS.html new file mode 100644 index 00000000..9abd2598 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.CSS.html @@ -0,0 +1,875 @@ + + + + + + + JsDoc Reference - CAAT.CSS + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.CSS +

    + + +

    + + + + + + +
    Defined in: csskeyframehelper.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      +
    + CAAT.CSS +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   +
    + CAAT.CSS.PREFIX +
    +
    Guess a browser custom prefix.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <static>   +
    CAAT.CSS.applyKeyframe(domElement, name, duration_millis, delay_millis, forever) +
    +
    Apply a given @key-frames animation to a DOM element.
    +
    <static>   +
    CAAT.CSS.getCSSKeyframes(name) +
    +
    +
    <static>   +
    CAAT.CSS.getCSSKeyframesIndex(name) +
    +
    +
    <static>   +
    CAAT.CSS.registerKeyframes(kfDescriptor) +
    +
    +
    <static>   +
    CAAT.CSS.unregisterKeyframes(name) +
    +
    Remove a @key-frames animation from the stylesheet.
    +
    + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.CSS +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.CSS.PREFIX + +
    +
    + Guess a browser custom prefix. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <static> + + + CAAT.CSS.applyKeyframe(domElement, name, duration_millis, delay_millis, forever) + +
    +
    + Apply a given @key-frames animation to a DOM element. + + +
    + + + + +
    +
    Parameters:
    + +
    + domElement + +
    +
    {DOMElement}
    + +
    + name + +
    +
    {string} animation name
    + +
    + duration_millis + +
    +
    {number}
    + +
    + delay_millis + +
    +
    {number}
    + +
    + forever + +
    +
    {boolean}
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.CSS.getCSSKeyframes(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.CSS.getCSSKeyframesIndex(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.CSS.registerKeyframes(kfDescriptor) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + kfDescriptor + +
    +
    {object} + { + name{string}, + behavior{CAAT.Behavior}, + size{!number}, + overwrite{boolean} + } + }
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.CSS.unregisterKeyframes(name) + +
    +
    + Remove a @key-frames animation from the stylesheet. + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Class.html b/documentation/jsdoc/symbols/CAAT.Class.html new file mode 100644 index 00000000..d2aaf543 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Class.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Class + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Class +

    + + +

    + + + + + + +
    Defined in: ModuleManager.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      +
    + CAAT.Class() +
    +
    +
    + + + + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Class() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.html b/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.html new file mode 100644 index 00000000..dcda1de0 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Event.KeyEvent.html @@ -0,0 +1,899 @@ + + + + + + + JsDoc Reference - CAAT.Event.KeyEvent + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Event.KeyEvent +

    + + +

    + + + + + + +
    Defined in: KeyEvent.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(keyCode, up_or_down, modifiers, originalEvent) +
    +
    Define a key event.
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Event.KeyEvent() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(keyCode, up_or_down, modifiers, originalEvent) + +
    +
    + Define a key event. + + +
    + + + + +
    +
    Parameters:
    + +
    + keyCode + +
    +
    + +
    + up_or_down + +
    +
    + +
    + modifiers + +
    +
    + +
    + originalEvent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getAction() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getKeyCode() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getSourceEvent() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isAltPressed() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isControlPressed() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isShiftPressed() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + modifiers() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + preventDefault() + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Event.MouseEvent.html b/documentation/jsdoc/symbols/CAAT.Event.MouseEvent.html new file mode 100644 index 00000000..82b4d544 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Event.MouseEvent.html @@ -0,0 +1,1154 @@ + + + + + + + JsDoc Reference - CAAT.Event.MouseEvent + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Event.MouseEvent +

    + + +

    + + + + + + +
    Defined in: MouseEvent.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + alt +
    +
    was alt pressed ?
    +
      +
    + control +
    +
    Was control pressed ?
    +
      +
    + meta +
    +
    was Meta key pressed ?
    +
      +
    + point +
    +
    Transformed in-actor coordinate
    +
      + +
    Original mouse/touch screen coord
    +
      +
    + shift +
    +
    Was shift pressed ?
    +
      +
    + source +
    +
    Actor the event was produced in.
    +
      + +
    Original mouse/touch event
    +
      +
    + time +
    +
    scene time when the event was triggered.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    Constructor delegate
    +
      + +
    +
      +
    init(x, y, sourceEvent, source, screenPoint, time) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Event.MouseEvent() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + alt + +
    +
    + was alt pressed ? + + +
    + + + + + + + + +
    + + +
    + + + control + +
    +
    + Was control pressed ? + + +
    + + + + + + + + +
    + + +
    + + + meta + +
    +
    + was Meta key pressed ? + + +
    + + + + + + + + +
    + + +
    + + + point + +
    +
    + Transformed in-actor coordinate + + +
    + + + + + + + + +
    + + +
    + + + screenPoint + +
    +
    + Original mouse/touch screen coord + + +
    + + + + + + + + +
    + + +
    + + + shift + +
    +
    + Was shift pressed ? + + +
    + + + + + + + + +
    + + +
    + + + source + +
    +
    + Actor the event was produced in. + + +
    + + + + + + + + +
    + + +
    + + + sourceEvent + +
    +
    + Original mouse/touch event + + +
    + + + + + + + + +
    + + +
    + + + time + +
    +
    + scene time when the event was triggered. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + Constructor delegate + + +
    + + + + + + + + + + + +
    + + +
    + + + getSourceEvent() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + init(x, y, sourceEvent, source, screenPoint, time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + sourceEvent + +
    +
    + +
    + source + +
    +
    + +
    + screenPoint + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + isAltDown() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isControlDown() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isMetaDown() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isShiftDown() + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Event.TouchEvent.html b/documentation/jsdoc/symbols/CAAT.Event.TouchEvent.html new file mode 100644 index 00000000..e4391ac3 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Event.TouchEvent.html @@ -0,0 +1,1238 @@ + + + + + + + JsDoc Reference - CAAT.Event.TouchEvent + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Event.TouchEvent +

    + + +

    + + + + + + +
    Defined in: TouchEvent.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + alt +
    +
    Was alt pressed ?
    +
      + +
    changed touches collection
    +
      +
    + control +
    +
    Was control pressed ?
    +
      +
    + meta +
    +
    Was meta pressed ?
    +
      +
    + shift +
    +
    Was shift pressed ?
    +
      +
    + source +
    +
    Source Actor the event happened in.
    +
      + +
    Original touch event.
    +
      +
    + time +
    +
    Time the touch event was triggered at.
    +
      +
    + touches +
    +
    touches collection
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    Constructor delegate
    +
      +
    addChangedTouch(touchInfo) +
    +
    +
      +
    addTouch(touchInfo) +
    +
    +
      + +
    +
      +
    init(sourceEvent, source, time) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Event.TouchEvent() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + alt + +
    +
    + Was alt pressed ? + + +
    + + + + + + + + +
    + + +
    + + + changedTouches + +
    +
    + changed touches collection + + +
    + + + + + + + + +
    + + +
    + + + control + +
    +
    + Was control pressed ? + + +
    + + + + + + + + +
    + + +
    + + + meta + +
    +
    + Was meta pressed ? + + +
    + + + + + + + + +
    + + +
    + + + shift + +
    +
    + Was shift pressed ? + + +
    + + + + + + + + +
    + + +
    + + + source + +
    +
    + Source Actor the event happened in. + + +
    + + + + + + + + +
    + + +
    + + + sourceEvent + +
    +
    + Original touch event. + + +
    + + + + + + + + +
    + + +
    + + + time + +
    +
    + Time the touch event was triggered at. + + +
    + + + + + + + + +
    + + +
    + + + touches + +
    +
    + touches collection + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + Constructor delegate + + +
    + + + + + + + + + + + +
    + + +
    + + + addChangedTouch(touchInfo) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + touchInfo + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {*} + addTouch(touchInfo) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + touchInfo + +
    +
    <{ + id : , + point : { + x: , + y: }� + }>
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + getSourceEvent() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + init(sourceEvent, source, time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + sourceEvent + +
    +
    + +
    + source + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + isAltDown() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isControlDown() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isMetaDown() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isShiftDown() + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Event.TouchInfo.html b/documentation/jsdoc/symbols/CAAT.Event.TouchInfo.html new file mode 100644 index 00000000..a8e702e0 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Event.TouchInfo.html @@ -0,0 +1,627 @@ + + + + + + + JsDoc Reference - CAAT.Event.TouchInfo + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Event.TouchInfo +

    + + +

    + + + + + + +
    Defined in: TouchInfo.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(id, x, y, target) +
    +
    Constructor delegate.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Event.TouchInfo() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(id, x, y, target) + +
    +
    + Constructor delegate. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {number}
    + +
    + x + +
    +
    {number}
    + +
    + y + +
    +
    {number}
    + +
    + target + +
    +
    {DOMElement}
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Event.html b/documentation/jsdoc/symbols/CAAT.Event.html new file mode 100644 index 00000000..14ae0ccb --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Event.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Event + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Event +

    + + +

    + + + + + + +
    Defined in: KeyEvent.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Event +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Actor.html b/documentation/jsdoc/symbols/CAAT.Foundation.Actor.html new file mode 100644 index 00000000..c502f09f --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.Actor.html @@ -0,0 +1,8931 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.Actor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.Actor +

    + + +

    + + + + + + +
    Defined in: Actor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    CAAT.Foundation.Actor is the base animable element.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   +
    + __super +
    +
    +
      +
    + AABB +
    +
    This rectangle keeps the axis aligned bounding box in screen coords of this actor.
    +
      +
    + alpha +
    +
    Transparency value.
    +
    <static>   +
    + CAAT.Foundation.Actor.ANCHOR_BOTTOM +
    +
    +
    <static>   +
    + CAAT.Foundation.Actor.ANCHOR_BOTTOM_LEFT +
    +
    +
    <static>   +
    + CAAT.Foundation.Actor.ANCHOR_BOTTOM_RIGHT +
    +
    +
    <static>   +
    + CAAT.Foundation.Actor.ANCHOR_CENTER +
    +
    +
    <static>   +
    + CAAT.Foundation.Actor.ANCHOR_CUSTOM +
    +
    +
    <static>   +
    + CAAT.Foundation.Actor.ANCHOR_LEFT +
    +
    +
    <static>   +
    + CAAT.Foundation.Actor.ANCHOR_RIGHT +
    +
    +
    <static>   +
    + CAAT.Foundation.Actor.ANCHOR_TOP +
    +
    +
    <static>   +
    + CAAT.Foundation.Actor.ANCHOR_TOP_LEFT +
    +
    +
    <static>   +
    + CAAT.Foundation.Actor.ANCHOR_TOP_RIGHT +
    +
    +
      + +
    Define this actor´s background image.
    +
      + +
    A collection of behaviors to modify this actor´s properties.
    +
    <static>   +
    + CAAT.Foundation.Actor.CACHE_DEEP +
    +
    +
    <static>   +
    + CAAT.Foundation.Actor.CACHE_NONE +
    +
    +
    <static>   +
    + CAAT.Foundation.Actor.CACHE_SIMPLE +
    +
    +
      +
    + cached +
    +
    Caching as bitmap strategy.
    +
      +
    + clip +
    +
    Will this actor be clipped before being drawn on screen ?
    +
      +
    + clipPath +
    +
    If this.clip and this.clipPath===null, a rectangle will be used as clip area.
    +
    <private>   +
    + dirty +
    +
    Local matrix dirtyness flag.
    +
      + +
    Mark this actor as discardable.
    +
      +
    + duration +
    +
    Marks from the time this actor is going to be animated, during how much time.
    +
      +
    + expired +
    +
    Mark this actor as expired, or out of the scene time.
    +
      +
    + fillStyle +
    +
    any canvas rendering valid fill style.
    +
    <private>   + +
    +
      + +
    Is gesture recognition enabled on this actor ??
    +
      +
    + glEnabled +
    +
    Is this actor enabled on WebGL ?
    +
      +
    + height +
    +
    Actor's height.
    +
      +
    + id +
    +
    Set this actor´ id so that it can be later identified easily.
    +
      +
    + inFrame +
    +
    Is this actor processed in the last frame ?
    +
      +
    + invalid +
    +
    If dirty rects are enabled, this flag indicates the rendering engine to invalidate this +actor´s screen area.
    +
    <private>   +
    + isAA +
    +
    is this actor/container Axis aligned ? if so, much faster inverse matrices can be calculated.
    +
      + +
    if this actor is cached, when destroy is called, it does not call 'clean' method, which clears some +internal properties.
    +
      + +
    true to make all children transparent, false, only this actor/container will be transparent.
    +
      + +
    A collection of this Actors lifecycle observers.
    +
      + +
    actor's layout minimum size.
    +
      + +
    This actor´s affine transformation matrix.
    +
      + +
    +
      + +
    Enable or disable input on this actor.
    +
    <private>   +
    + oldX +
    +
    +
    <private>   +
    + oldY +
    +
    +
      +
    + parent +
    +
    This actor's parent container.
    +
      +
    + pointed +
    +
    +
      + +
    actor´s layout preferred size.
    +
      + +
    Exclude this actor from automatic layout on its parent.
    +
      + +
    This actor´s rotation angle in radians.
    +
      +
    + rotationX +
    +
    Rotation Anchor Y.
    +
      +
    + rotationY +
    +
    Rotation Anchor X.
    +
      + +
    A value that corresponds to any CAAT.Foundation.Actor.ANCHOR_* value.
    +
      +
    + scaleTX +
    +
    Scale Anchor X.
    +
      +
    + scaleTY +
    +
    Scale Anchor Y.
    +
      +
    + scaleX +
    +
    ScaleX value.
    +
      +
    + scaleY +
    +
    ScaleY value.
    +
      + +
    debug info.
    +
      + +
    debug info.
    +
      + +
    Marks since when this actor, relative to scene time, is going to be animated/drawn.
    +
      + +
    any canvas rendering valid stroke style.
    +
      +
    + tAnchorX +
    +
    Translation x anchor.
    +
      +
    + tAnchorY +
    +
    Translation y anchor.
    +
      +
    + time +
    +
    This actor´s scene time.
    +
      + +
    These 4 CAAT.Math.Point objects are the vertices of this actor´s non axis aligned bounding +box.
    +
      +
    + visible +
    +
    Make this actor visible or not.
    +
    <private>   +
    + wdirty +
    +
    Global matrix dirtyness flag.
    +
      +
    + width +
    +
    Actor's width.
    +
      + +
    This actor´s world affine transformation matrix.
    +
      + +
    +
      +
    + x +
    +
    x position on parent.
    +
      +
    + y +
    +
    y position on parent.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
    <private>   +
    __paintActor(director, time) +
    +
    for js2native
    +
    <private>   +
    __scale1To(axis, scale, duration, delay, anchorX, anchorY, interpolator) +
    +
    +
    <private>   + +
    +
      +
    addAnimation(name, array, time, callback) +
    +
    +
      +
    addBehavior(behavior) +
    +
    Add a Behavior to the Actor.
    +
      +
    addListener(actorListener) +
    +
    Adds an Actor's life cycle listener.
    +
      +
    animate(director, time) +
    +
    Private +This method is called by the Director instance.
    +
      +
    cacheAsBitmap(time, stragegy) +
    +
    +
      +
    centerAt(x, y) +
    +
    Center this actor at position (x,y).
    +
      +
    centerOn(x, y) +
    +
    Center this actor at position (x,y).
    +
      +
    clean() +
    +
    +
      +
    contains(x, y) +
    +
    Checks whether a coordinate is inside the Actor's bounding box.
    +
      +
    create() +
    +
    +
    <private>   +
    destroy(time) +
    +
    This method will be called internally by CAAT when an Actor is expired, and at the +same time, is flagged as discardable.
    +
      + +
    +
      +
    drawScreenBoundingBox(director, time) +
    +
    Draw a bounding box with on-screen coordinates regardless of the transformations +applied to the Actor.
    +
      + +
    Removes all behaviors from an Actor.
    +
      + +
    Enables a default dragging routine for the Actor.
    +
      +
    enableEvents(enable) +
    +
    Enable or disable the event bubbling for this Actor.
    +
      +
    endAnimate(director, time) +
    +
    +
      + +
    Private +This method does the needed point transformations across an Actor hierarchy to devise +whether the parameter point coordinate lies inside the Actor.
    +
      + +
    +
      +
    fireEvent(sEventType, time) +
    +
    Notifies the registered Actor's life cycle listener about some event.
    +
      +
    gestureChange(rotation, scaleX, scaleY) +
    +
    +
      +
    gestureEnd(rotation, scaleX, scaleY) +
    +
    +
      +
    gestureStart(rotation, scaleX, scaleY) +
    +
    +
      +
    getAnchor(anchor) +
    +
    Private.
    +
      +
    getAnchorPercent(anchor) +
    +
    +
      + +
    +
      +
    getId() +
    +
    +
      + +
    +
      + +
    +
      + +
    If GL is enables, get this background image's texture page, otherwise it will fail.
    +
      +
    glNeedsFlush(director) +
    +
    Test for compulsory gl flushing: + 1.
    +
      +
    glSetShader(director) +
    +
    Change texture shader program parameters.
    +
      +
    initialize(overrides) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
    <private>   + +
    This method is called by the Director to know whether the actor is on Scene time.
    +
      + +
    +
      +
    modelToModel(point, otherActor) +
    +
    Transform a local coordinate point on this Actor's coordinate system into +another point in otherActor's coordinate system.
    +
    <private>   +
    modelToView(point) +
    +
    Transform a point or array of points in model space to view space.
    +
      +
    mouseClick(mouseEvent) +
    +
    Default mouseClick handler.
    +
      +
    mouseDblClick(mouseEvent) +
    +
    Default double click handler
    +
      +
    mouseDown(mouseEvent) +
    +
    default mouse press in Actor handler.
    +
      +
    mouseDrag(mouseEvent) +
    +
    default Actor mouse drag handler.
    +
      +
    mouseEnter(mouseEvent) +
    +
    Default mouse enter on Actor handler.
    +
      +
    mouseExit(mouseEvent) +
    +
    Default mouse exit on Actor handler.
    +
      +
    mouseMove(mouseEvent) +
    +
    Default mouse move inside Actor handler.
    +
      +
    mouseOut(mouseEvent) +
    +
    +
      +
    mouseOver(mouseEvent) +
    +
    +
      +
    mouseUp(mouseEvent) +
    +
    default mouse release in Actor handler.
    +
      +
    moveTo(x, y, duration, delay, interpolator, callback) +
    +
    Move this actor to a position.
    +
      +
    paint(director, time) +
    +
    This method should me overriden by every custom Actor.
    +
      +
    paintActor(director, time) +
    +
    +
      +
    paintActorGL(director, time) +
    +
    Set coordinates and uv values for this actor.
    +
      +
    playAnimation(name) +
    +
    +
      + +
    Remove a Behavior with id param as behavior identifier from this actor.
    +
      +
    removeBehaviour(behavior) +
    +
    Remove a Behavior from the Actor.
    +
      +
    removeListener(actorListener) +
    +
    Removes an Actor's life cycle listener.
    +
      + +
    +
      + +
    +
      + +
    Remove all transformation values for the Actor.
    +
      +
    rotateTo(angle, duration, delay, anchorX, anchorY, interpolator) +
    +
    +
      +
    scaleTo(scaleX, scaleY, duration, delay, anchorX, anchorY, interpolator) +
    +
    +
      +
    scaleXTo(scaleX, duration, delay, anchorX, anchorY, interpolator) +
    +
    +
      +
    scaleYTo(scaleY, duration, delay, anchorX, anchorY, interpolator) +
    +
    +
      +
    setAlpha(alpha) +
    +
    Stablishes the Alpha transparency for the Actor.
    +
      + +
    +
      + +
    Set this actor's background SpriteImage its animation sequence.
    +
      +
    setAsButton(buttonImage, iNormal, iOver, iPress, iDisabled, fn) +
    +
    Set this actor behavior as if it were a Button.
    +
      +
    setBackgroundImage(image, adjust_size_to_image) +
    +
    Set this actor's background image.
    +
      + +
    Set this actor's background SpriteImage offset displacement.
    +
      +
    setBounds(x{number}, y{number}, w{number}, h{number}) +
    +
    Set location and dimension of an Actor at once.
    +
      +
    setButtonImageIndex(_normal, _over, _press, _disabled) +
    +
    +
      +
    setCachedActor(cached) +
    +
    +
      +
    setChangeFPS(time) +
    +
    +
      +
    setClip(enable, clipPath) +
    +
    Set this Actor's clipping area.
    +
      +
    setDiscardable(discardable) +
    +
    Set discardable property.
    +
      +
    setExpired(time) +
    +
    Sets this Actor as Expired.
    +
      +
    setFillStyle(style) +
    +
    Caches a fillStyle in the Actor.
    +
      +
    setFrameTime(startTime, duration) +
    +
    Sets the time life cycle for an Actor.
    +
      + +
    +
      +
    setGLCoords(glCoords, glCoordsIndex) +
    +
    TODO: set GLcoords for different image transformations.
    +
      +
    setGlobalAlpha(global) +
    +
    Set alpha composition scope.
    +
      +
    setGlobalAnchor(ax, ay) +
    +
    +
      +
    setId(id) +
    +
    +
      + +
    Set this background image transformation.
    +
      +
    setLocation(x{number}, y{number}) +
    +
    This method sets the position of an Actor inside its parent.
    +
      +
    setMinimumSize(pw, ph) +
    +
    Set this actors minimum layout size.
    +
      + +
    Set this model view matrix if the actor is Dirty.
    +
      + +
    Puts an Actor out of time line, that is, won't be transformed nor rendered.
    +
      +
    setPaint(paint) +
    +
    +
      +
    setParent(parent) +
    +
    Set this actor's parent.
    +
      +
    setPosition(x, y) +
    +
    +
      +
    setPositionAnchor(pax, pay) +
    +
    +
      +
    setPositionAnchored(x, y, pax, pay) +
    +
    +
      +
    setPreferredSize(pw, ph) +
    +
    Set this actors preferred layout size.
    +
      + +
    Make this actor not be laid out.
    +
      +
    setRotation(angle) +
    +
    A helper method for setRotationAnchored.
    +
      +
    setRotationAnchor(rax, ray) +
    +
    +
      +
    setRotationAnchored(angle, rx, ry) +
    +
    This method sets Actor rotation around a given position.
    +
      +
    setScale(sx, sy) +
    +
    A helper method to setScaleAnchored with an anchor of ANCHOR_CENTER
    +
      +
    setScaleAnchor(sax, say) +
    +
    +
      +
    setScaleAnchored(sx, sy, anchorx, anchory) +
    +
    Modify the dimensions on an Actor.
    +
    <private>   + +
    Calculates the 2D bounding box in canvas coordinates of the Actor.
    +
      +
    setSize(w, h) +
    +
    Sets an Actor's dimension
    +
      +
    setSpriteIndex(index) +
    +
    Set the actor's SpriteImage index from animation sheet.
    +
      +
    setStrokeStyle(style) +
    +
    Caches a stroke style in the Actor.
    +
      +
    setUV(uvBuffer, uvIndex) +
    +
    Set UV for this actor's quad.
    +
      +
    setVisible(visible) +
    +
    Set this actor invisible.
    +
      + +
    +
      +
    touchEnd(e) +
    +
    +
      +
    touchMove(e) +
    +
    +
      + +
    Touch Start only received when CAAT.TOUCH_BEHAVIOR= CAAT.TOUCH_AS_MULTITOUCH
    +
      +
    viewToModel(point) +
    +
    Transform a point from model to view space.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.Actor() +
    + +
    + CAAT.Foundation.Actor is the base animable element. It is the base object for Director, Scene and +Container. +

    CAAT.Actor is the simplest object instance CAAT manages. Every on-screen element is an Actor instance. + An Actor has entity, it has a size, position and can have input sent to it. Everything that has a + visual representation is an Actor, including Director and Scene objects.

    +

    This object has functionality for:

    +
      +
    1. Set location and size on screen. Actors are always rectangular shapes, but not needed to be AABB.
    2. +
    3. Set affine transforms (rotation, scale and translation).
    4. +
    5. Define life cycle.
    6. +
    7. Manage alpha transparency.
    8. +
    9. Manage and keep track of applied Behaviors. Behaviors apply transformations via key-framing.
    10. +
    11. Compose transformations. A container Actor will transform its children before they apply their own transformation.
    12. +
    13. Clipping capabilities. Either rectangular or arbitrary shapes.
    14. +
    15. The API is developed to allow method chaining when possible.
    16. +
    17. Handle input (either mouse events, touch, multitouch, keys and accelerometer).
    18. +
    19. Show an image.
    20. +
    21. Show some image animations.
    22. +
    23. etc.
    24. +
    + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + __super + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + AABB + +
    +
    + This rectangle keeps the axis aligned bounding box in screen coords of this actor. +In can be used, among other uses, to realize whether two given actors collide regardless +the affine transformation is being applied on them. + + +
    + + + + + + + + +
    + + +
    + + + alpha + +
    +
    + Transparency value. 0 is totally transparent, 1 is totally opaque. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.ANCHOR_BOTTOM + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.ANCHOR_BOTTOM_LEFT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.ANCHOR_BOTTOM_RIGHT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.ANCHOR_CENTER + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.ANCHOR_CUSTOM + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.ANCHOR_LEFT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.ANCHOR_RIGHT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.ANCHOR_TOP + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.ANCHOR_TOP_LEFT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.ANCHOR_TOP_RIGHT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + backgroundImage + +
    +
    + Define this actor´s background image. +See SpriteImage object. + + +
    + + + + + + + + +
    + + +
    + + + behaviorList + +
    +
    + A collection of behaviors to modify this actor´s properties. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.CACHE_DEEP + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.CACHE_NONE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Actor.CACHE_SIMPLE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + cached + +
    +
    + Caching as bitmap strategy. Suitable to cache very complex actors. + +0 : no cache. +CACHE_SIMPLE : if a container, only cache the container. +CACHE_DEEP : if a container, cache the container and recursively all of its children. + + +
    + + + + + + + + +
    + + +
    + + + clip + +
    +
    + Will this actor be clipped before being drawn on screen ? + + +
    + + + + + + + + +
    + + +
    + + + clipPath + +
    +
    + If this.clip and this.clipPath===null, a rectangle will be used as clip area. Otherwise, +clipPath contains a reference to a CAAT.PathUtil.Path object. + + +
    + + + + + + + + +
    + + +
    <private> + + + dirty + +
    +
    + Local matrix dirtyness flag. + + +
    + + + + + + + + +
    + + +
    + + + discardable + +
    +
    + Mark this actor as discardable. If an actor is expired and mark as discardable, if will be +removed from its parent. + + +
    + + + + + + + + +
    + + +
    + + + duration + +
    +
    + Marks from the time this actor is going to be animated, during how much time. +Forever by default. + + +
    + + + + + + + + +
    + + +
    + + + expired + +
    +
    + Mark this actor as expired, or out of the scene time. + + +
    + + + + + + + + +
    + + +
    + + + fillStyle + +
    +
    + any canvas rendering valid fill style. + + +
    + + + + + + + + +
    + + +
    <private> + + + frameAlpha + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + gestureEnabled + +
    +
    + Is gesture recognition enabled on this actor ?? + + +
    + + + + + + + + +
    + + +
    + + + glEnabled + +
    +
    + Is this actor enabled on WebGL ? + + +
    + + + + + + + + +
    + + +
    + + + height + +
    +
    + Actor's height. In parent's local coord. system. + + +
    + + + + + + + + +
    + + +
    + + + id + +
    +
    + Set this actor´ id so that it can be later identified easily. + + +
    + + + + + + + + +
    + + +
    + + + inFrame + +
    +
    + Is this actor processed in the last frame ? + + +
    + + + + + + + + +
    + + +
    + + + invalid + +
    +
    + If dirty rects are enabled, this flag indicates the rendering engine to invalidate this +actor´s screen area. + + +
    + + + + + + + + +
    + + +
    <private> + + + isAA + +
    +
    + is this actor/container Axis aligned ? if so, much faster inverse matrices can be calculated. + + +
    + + + + + + + + +
    + + +
    + + + isCachedActor + +
    +
    + if this actor is cached, when destroy is called, it does not call 'clean' method, which clears some +internal properties. + + +
    + + + + + + + + +
    + + +
    + + + isGlobalAlpha + +
    +
    + true to make all children transparent, false, only this actor/container will be transparent. + + +
    + + + + + + + + +
    + + +
    + + + lifecycleListenerList + +
    +
    + A collection of this Actors lifecycle observers. + + +
    + + + + + + + + +
    + + +
    + + + minimumSize + +
    +
    + actor's layout minimum size. + + +
    + + + + + + + + +
    + + +
    + + + modelViewMatrix + +
    +
    + This actor´s affine transformation matrix. + + +
    + + + + + + + + +
    + + +
    + + + modelViewMatrixI + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + mouseEnabled + +
    +
    + Enable or disable input on this actor. By default, all actors receive input. +See also priority lists. +see demo4 for an example of input and priority lists. + + +
    + + + + + + + + +
    + + +
    <private> + + + oldX + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <private> + + + oldY + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + parent + +
    +
    + This actor's parent container. + + +
    + + + + + + + + +
    + + +
    + + + pointed + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + preferredSize + +
    +
    + actor´s layout preferred size. + + +
    + + + + + + + + +
    + + +
    + + + preventLayout + +
    +
    + Exclude this actor from automatic layout on its parent. + + +
    + + + + + + + + +
    + + +
    + + + rotationAngle + +
    +
    + This actor´s rotation angle in radians. + + +
    + + + + + + + + +
    + + +
    + + + rotationX + +
    +
    + Rotation Anchor Y. CAAT uses different Anchors for position, rotation and scale. Value 0-1. + + +
    + + + + + + + + +
    + + +
    + + + rotationY + +
    +
    + Rotation Anchor X. CAAT uses different Anchors for position, rotation and scale. Value 0-1. + + +
    + + + + + + + + +
    + + +
    + + + scaleAnchor + +
    +
    + A value that corresponds to any CAAT.Foundation.Actor.ANCHOR_* value. + + +
    + + + + + + + + +
    + + +
    + + + scaleTX + +
    +
    + Scale Anchor X. Value 0-1 + + +
    + + + + + + + + +
    + + +
    + + + scaleTY + +
    +
    + Scale Anchor Y. Value 0-1 + + +
    + + + + + + + + +
    + + +
    + + + scaleX + +
    +
    + ScaleX value. + + +
    + + + + + + + + +
    + + +
    + + + scaleY + +
    +
    + ScaleY value. + + +
    + + + + + + + + +
    + + +
    + + + size_active + +
    +
    + debug info. + + +
    + + + + + + + + +
    + + +
    + + + size_total + +
    +
    + debug info. + + +
    + + + + + + + + +
    + + +
    + + + start_time + +
    +
    + Marks since when this actor, relative to scene time, is going to be animated/drawn. + + +
    + + + + + + + + +
    + + +
    + + + strokeStyle + +
    +
    + any canvas rendering valid stroke style. + + +
    + + + + + + + + +
    + + +
    + + + tAnchorX + +
    +
    + Translation x anchor. 0..1 + + +
    + + + + + + + + +
    + + +
    + + + tAnchorY + +
    +
    + Translation y anchor. 0..1 + + +
    + + + + + + + + +
    + + +
    + + + time + +
    +
    + This actor´s scene time. + + +
    + + + + + + + + +
    + + +
    + + + viewVertices + +
    +
    + These 4 CAAT.Math.Point objects are the vertices of this actor´s non axis aligned bounding +box. If the actor is not rotated, viewVertices and AABB define the same bounding box. + + +
    + + + + + + + + +
    + + +
    + + + visible + +
    +
    + Make this actor visible or not. +An invisible actor avoids making any calculation, applying any behavior on it. + + +
    + + + + + + + + +
    + + +
    <private> + + + wdirty + +
    +
    + Global matrix dirtyness flag. + + +
    + + + + + + + + +
    + + +
    + + + width + +
    +
    + Actor's width. In parent's local coord. system. + + +
    + + + + + + + + +
    + + +
    + + + worldModelViewMatrix + +
    +
    + This actor´s world affine transformation matrix. + + +
    + + + + + + + + +
    + + +
    + + + worldModelViewMatrixI + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + x + +
    +
    + x position on parent. In parent's local coord. system. + + +
    + + + + + + + + +
    + + +
    + + + y + +
    +
    + y position on parent. In parent's local coord. system. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + __paintActor(director, time) + +
    +
    + for js2native + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + {*} + __scale1To(axis, scale, duration, delay, anchorX, anchorY, interpolator) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + axis + +
    +
    {CAAT.Scale1Behavior.AXIS_X|CAAT.Scale1Behavior.AXIS_Y} scale application axis
    + +
    + scale + +
    +
    {number} new Y scale
    + +
    + duration + +
    +
    {number} time to rotate
    + +
    + delay + +
    +
    {=number} millis to start rotation
    + +
    + anchorX + +
    +
    {=number} rotation anchor x
    + +
    + anchorY + +
    +
    {=number} rotation anchor y
    + +
    + interpolator + +
    +
    {=CAAT.Bahavior.Interpolator}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    <private> + + + __validateLayout() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + addAnimation(name, array, time, callback) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + array + +
    +
    + +
    + time + +
    +
    + +
    + callback + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addBehavior(behavior) + +
    +
    + Add a Behavior to the Actor. +An Actor accepts an undefined number of Behaviors. + + +
    + + + + +
    +
    Parameters:
    + +
    + behavior + +
    +
    {CAAT.Behavior.BaseBehavior}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + addListener(actorListener) + +
    +
    + Adds an Actor's life cycle listener. +The developer must ensure the actorListener is not already a listener, otherwise +it will notified more than once. + + +
    + + + + +
    +
    Parameters:
    + +
    + actorListener + +
    +
    {object} an object with at least a method of the form: +actorLyfeCycleEvent( actor, string_event_type, long_time )
    + +
    + + + + + + + + +
    + + +
    + + + animate(director, time) + +
    +
    + Private +This method is called by the Director instance. +It applies the list of behaviors the Actor has registered. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    + +
    + time + +
    +
    an integer indicating the Scene time when the bounding box is to be drawn.
    + +
    + + + + + + + + +
    + + +
    + + + cacheAsBitmap(time, stragegy) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {Number=}
    + +
    + stragegy + +
    +
    {CAAT.Foundation.Actor.CACHE_SIMPLE | CAAT.Foundation.Actor.CACHE_DEEP}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + centerAt(x, y) + +
    +
    + Center this actor at position (x,y). + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number} x position
    + +
    + y + +
    +
    {number} y position
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + centerOn(x, y) + +
    +
    + Center this actor at position (x,y). + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number} x position
    + +
    + y + +
    +
    {number} y position
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + clean() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + contains(x, y) + +
    +
    + Checks whether a coordinate is inside the Actor's bounding box. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number} a float
    + +
    + y + +
    +
    {number} a float
    + +
    + + + + + +
    +
    Returns:
    + +
    boolean indicating whether it is inside.
    + +
    + + + + +
    + + +
    + + {*} + create() + +
    +
    + + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    <private> + + + destroy(time) + +
    +
    + This method will be called internally by CAAT when an Actor is expired, and at the +same time, is flagged as discardable. +It notifies the Actor life cycle listeners about the destruction event. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    an integer indicating the time at wich the Actor has been destroyed.
    + +
    + + + + + + + + +
    + + +
    + + + disableDrag() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + drawScreenBoundingBox(director, time) + +
    +
    + Draw a bounding box with on-screen coordinates regardless of the transformations +applied to the Actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Foundations.Director} object instance that contains the Scene the Actor is in.
    + +
    + time + +
    +
    {number} integer indicating the Scene time when the bounding box is to be drawn.
    + +
    + + + + + + + + +
    + + +
    + + + emptyBehaviorList() + +
    +
    + Removes all behaviors from an Actor. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + enableDrag() + +
    +
    + Enables a default dragging routine for the Actor. +This default dragging routine allows to: +
  431. scale the Actor by pressing shift+drag +
  432. rotate the Actor by pressing control+drag +
  433. scale non uniformly by pressing alt+shift+drag + + +
  434. + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + enableEvents(enable) + +
    +
    + Enable or disable the event bubbling for this Actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + enable + +
    +
    {boolean} a boolean indicating whether the event bubbling is enabled.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + endAnimate(director, time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    + +
    + time + +
    +
    an integer indicating the Scene time when the bounding box is to be drawn.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + findActorAtPosition(point) + +
    +
    + Private +This method does the needed point transformations across an Actor hierarchy to devise +whether the parameter point coordinate lies inside the Actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Math.Point}
    + +
    + + + + + +
    +
    Returns:
    + +
    null if the point is not inside the Actor. The Actor otherwise.
    + +
    + + + + +
    + + +
    + + + findActorById(id) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + fireEvent(sEventType, time) + +
    +
    + Notifies the registered Actor's life cycle listener about some event. + + +
    + + + + +
    +
    Parameters:
    + +
    + sEventType + +
    +
    an string indicating the type of event being notified.
    + +
    + time + +
    +
    an integer indicating the time related to Scene's timeline when the event +is being notified.
    + +
    + + + + + + + + +
    + + +
    + + + gestureChange(rotation, scaleX, scaleY) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + rotation + +
    +
    + +
    + scaleX + +
    +
    + +
    + scaleY + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + gestureEnd(rotation, scaleX, scaleY) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + rotation + +
    +
    + +
    + scaleX + +
    +
    + +
    + scaleY + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + gestureStart(rotation, scaleX, scaleY) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + rotation + +
    +
    + +
    + scaleX + +
    +
    + +
    + scaleY + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getAnchor(anchor) + +
    +
    + Private. +Gets a given anchor position referred to the Actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + anchor + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    an object of the form { x: float, y: float }
    + +
    + + + + +
    + + +
    + + + getAnchorPercent(anchor) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + anchor + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getBehavior(id) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getId() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getMinimumSize() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getPreferredSize() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {CAAT.GLTexturePage} + getTextureGLPage() + +
    +
    + If GL is enables, get this background image's texture page, otherwise it will fail. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.GLTexturePage}
    + +
    + + + + +
    + + +
    + + + glNeedsFlush(director) + +
    +
    + Test for compulsory gl flushing: + 1.- opacity has changed. + 2.- texture page has changed. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + glSetShader(director) + +
    +
    + Change texture shader program parameters. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + initialize(overrides) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + overrides + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + invalidate() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + invalidateLayout() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isCached() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isGestureEnabled() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + isInAnimationFrame(time) + +
    +
    + This method is called by the Director to know whether the actor is on Scene time. +In case it was necessary, this method will notify any life cycle behaviors about +an Actor expiration. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} time indicating the Scene time.
    + +
    + + + + + + + + +
    + + +
    + + + isVisible() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + modelToModel(point, otherActor) + +
    +
    + Transform a local coordinate point on this Actor's coordinate system into +another point in otherActor's coordinate system. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Math.Point}
    + +
    + otherActor + +
    +
    {CAAT.Math.Actor}
    + +
    + + + + + + + + +
    + + +
    <private> + + + modelToView(point) + +
    +
    + Transform a point or array of points in model space to view space. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Math.Point|Array} an object of the form {x : float, y: float}
    + +
    + + + + + +
    +
    Returns:
    + +
    the source transformed elements.
    + +
    + + + + +
    + + +
    + + + mouseClick(mouseEvent) + +
    +
    + Default mouseClick handler. +Mouse click events are received after a call to mouseUp method if no dragging was in progress. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.Event.MouseEvent}
    + +
    + + + + + + + + +
    + + +
    + + + mouseDblClick(mouseEvent) + +
    +
    + Default double click handler + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.Event.MouseEvent}
    + +
    + + + + + + + + +
    + + +
    + + + mouseDown(mouseEvent) + +
    +
    + default mouse press in Actor handler. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.Event.MouseEvent}
    + +
    + + + + + + + + +
    + + +
    + + + mouseDrag(mouseEvent) + +
    +
    + default Actor mouse drag handler. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.Event.MouseEvent}
    + +
    + + + + + + + + +
    + + +
    + + + mouseEnter(mouseEvent) + +
    +
    + Default mouse enter on Actor handler. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.Event.MouseEvent}
    + +
    + + + + + + + + +
    + + +
    + + + mouseExit(mouseEvent) + +
    +
    + Default mouse exit on Actor handler. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.Event.MouseEvent}
    + +
    + + + + + + + + +
    + + +
    + + + mouseMove(mouseEvent) + +
    +
    + Default mouse move inside Actor handler. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.Event.MouseEvent}
    + +
    + + + + + + + + +
    + + +
    + + + mouseOut(mouseEvent) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseOver(mouseEvent) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseUp(mouseEvent) + +
    +
    + default mouse release in Actor handler. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.Event.MouseEvent}
    + +
    + + + + + + + + +
    + + +
    + + + moveTo(x, y, duration, delay, interpolator, callback) + +
    +
    + Move this actor to a position. +It creates and adds a new PathBehavior. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number} new x position
    + +
    + y + +
    +
    {number} new y position
    + +
    + duration + +
    +
    {number} time to take to get to new position
    + +
    + delay + +
    +
    {=number} time to wait before start moving
    + +
    + interpolator + +
    +
    {=CAAT.Behavior.Interpolator} a CAAT.Behavior.Interpolator instance
    + +
    + callback + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + paint(director, time) + +
    +
    + This method should me overriden by every custom Actor. +It will be the drawing routine called by the Director to show every Actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Foundation.Director} instance that contains the Scene the Actor is in.
    + +
    + time + +
    +
    {number} indicating the Scene time in which the drawing is performed.
    + +
    + + + + + + + + +
    + + +
    + + + paintActor(director, time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    + +
    + time + +
    +
    an integer indicating the Scene time when the bounding box is to be drawn.
    + +
    + + + + + +
    +
    Returns:
    + +
    boolean indicating whether the Actor isInFrameTime
    + +
    + + + + +
    + + +
    + + + paintActorGL(director, time) + +
    +
    + Set coordinates and uv values for this actor. +This function uses Director's coords and indexCoords values. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + playAnimation(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + removeBehaviorById(id) + +
    +
    + Remove a Behavior with id param as behavior identifier from this actor. +This function will remove ALL behavior instances with the given id. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {number} an integer. +return this;
    + +
    + + + + + + + + +
    + + +
    + + + removeBehaviour(behavior) + +
    +
    + Remove a Behavior from the Actor. +If the Behavior is not present at the actor behavior collection nothing happends. + + +
    + + + + +
    +
    Parameters:
    + +
    + behavior + +
    +
    {CAAT.Behavior.BaseBehavior}
    + +
    + + + + + + + + +
    + + +
    + + + removeListener(actorListener) + +
    +
    + Removes an Actor's life cycle listener. +It will only remove the first occurrence of the given actorListener. + + +
    + + + + +
    +
    Parameters:
    + +
    + actorListener + +
    +
    {object} an Actor's life cycle listener.
    + +
    + + + + + + + + +
    + + +
    + + + resetAnimationTime() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + resetAsButton() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + resetTransform() + +
    +
    + Remove all transformation values for the Actor. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {*} + rotateTo(angle, duration, delay, anchorX, anchorY, interpolator) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + angle + +
    +
    {number} new rotation angle
    + +
    + duration + +
    +
    {number} time to rotate
    + +
    + delay + +
    +
    {number=} millis to start rotation
    + +
    + anchorX + +
    +
    {number=} rotation anchor x
    + +
    + anchorY + +
    +
    {number=} rotation anchor y
    + +
    + interpolator + +
    +
    {CAAT.Behavior.Interpolator=}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + {*} + scaleTo(scaleX, scaleY, duration, delay, anchorX, anchorY, interpolator) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + scaleX + +
    +
    {number} new X scale
    + +
    + scaleY + +
    +
    {number} new Y scale
    + +
    + duration + +
    +
    {number} time to rotate
    + +
    + delay + +
    +
    {=number} millis to start rotation
    + +
    + anchorX + +
    +
    {=number} rotation anchor x
    + +
    + anchorY + +
    +
    {=number} rotation anchor y
    + +
    + interpolator + +
    +
    {=CAAT.Behavior.Interpolator}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + {*} + scaleXTo(scaleX, duration, delay, anchorX, anchorY, interpolator) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + scaleX + +
    +
    {number} new X scale
    + +
    + duration + +
    +
    {number} time to rotate
    + +
    + delay + +
    +
    {=number} millis to start rotation
    + +
    + anchorX + +
    +
    {=number} rotation anchor x
    + +
    + anchorY + +
    +
    {=number} rotation anchor y
    + +
    + interpolator + +
    +
    {=CAAT.Behavior.Interpolator}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + {*} + scaleYTo(scaleY, duration, delay, anchorX, anchorY, interpolator) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + scaleY + +
    +
    {number} new Y scale
    + +
    + duration + +
    +
    {number} time to rotate
    + +
    + delay + +
    +
    {=number} millis to start rotation
    + +
    + anchorX + +
    +
    {=number} rotation anchor x
    + +
    + anchorY + +
    +
    {=number} rotation anchor y
    + +
    + interpolator + +
    +
    {=CAAT.Behavior.Interpolator}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + setAlpha(alpha) + +
    +
    + Stablishes the Alpha transparency for the Actor. +If it globalAlpha enabled, this alpha will the maximum alpha for every contained actors. +The alpha must be between 0 and 1. + + +
    + + + + +
    +
    Parameters:
    + +
    + alpha + +
    +
    a float indicating the alpha value.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setAnimationEndCallback(f) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + f + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setAnimationImageIndex(ii) + +
    +
    + Set this actor's background SpriteImage its animation sequence. +In its simplet's form a SpriteImage treats a given image as an array of rows by columns +subimages. If you define d Sprite Image of 2x2, you'll be able to draw any of the 4 subimages. +This method defines the animation sequence so that it could be set [0,2,1,3,2,1] as the +animation sequence + + +
    + + + + +
    +
    Parameters:
    + +
    + ii + +
    +
    {Array} an array of integers.
    + +
    + + + + + + + + +
    + + +
    + + + setAsButton(buttonImage, iNormal, iOver, iPress, iDisabled, fn) + +
    +
    + Set this actor behavior as if it were a Button. The actor size will be set as SpriteImage's +single size. + + +
    + + + + +
    +
    Parameters:
    + +
    + buttonImage + +
    +
    {CAAT.Foundation.SpriteImage} sprite image with button's state images.
    + +
    + iNormal + +
    +
    {number} button's normal state image index
    + +
    + iOver + +
    +
    {number} button's mouse over state image index
    + +
    + iPress + +
    +
    {number} button's pressed state image index
    + +
    + iDisabled + +
    +
    {number} button's disabled state image index
    + +
    + fn + +
    +
    {function(button{CAAT.Foundation.Actor})} callback function
    + +
    + + + + + + + + +
    + + +
    + + + setBackgroundImage(image, adjust_size_to_image) + +
    +
    + Set this actor's background image. +The need of a background image is to kept compatibility with the new CSSDirector class. +The image parameter can be either an Image/Canvas or a CAAT.Foundation.SpriteImage instance. If an image +is supplied, it will be wrapped into a CAAT.Foundation.SriteImage instance of 1 row by 1 column. +If the actor has set an image in the background, the paint method will draw the image, otherwise +and if set, will fill its background with a solid color. +If adjust_size_to_image is true, the host actor will be redimensioned to the size of one +single image from the SpriteImage (either supplied or generated because of passing an Image or +Canvas to the function). That means the size will be set to [width:SpriteImage.singleWidth, +height:singleHeight]. + +WARN: if using a CSS renderer, the image supplied MUST be a HTMLImageElement instance. + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    {Image|HTMLCanvasElement|CAAT.Foundation.SpriteImage}
    + +
    + adjust_size_to_image + +
    +
    {boolean} whether to set this actor's size based on image parameter.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + +
    +
    See:
    + +
    CAAT.Foundation.SpriteImage
    + +
    + + +
    + + +
    + + + setBackgroundImageOffset(ox, oy) + +
    +
    + Set this actor's background SpriteImage offset displacement. +The values can be either positive or negative meaning the texture space of this background +image does not start at (0,0) but at the desired position. + + +
    + + + + +
    +
    Parameters:
    + +
    + ox + +
    +
    {number} horizontal offset
    + +
    + oy + +
    +
    {number} vertical offset
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + +
    +
    See:
    + +
    CAAT.Foundation.SpriteImage
    + +
    + + +
    + + +
    + + + setBounds(x{number}, y{number}, w{number}, h{number}) + +
    +
    + Set location and dimension of an Actor at once. + + +
    + + + + +
    +
    Parameters:
    + +
    + x{number} + +
    +
    a float indicating Actor's x position.
    + +
    + y{number} + +
    +
    a float indicating Actor's y position
    + +
    + w{number} + +
    +
    a float indicating Actor's width
    + +
    + h{number} + +
    +
    a float indicating Actor's height
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setButtonImageIndex(_normal, _over, _press, _disabled) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + _normal + +
    +
    + +
    + _over + +
    +
    + +
    + _press + +
    +
    + +
    + _disabled + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setCachedActor(cached) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + cached + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setChangeFPS(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setClip(enable, clipPath) + +
    +
    + Set this Actor's clipping area. + + +
    + + + + +
    +
    Parameters:
    + +
    + enable + +
    +
    {boolean} enable clip area.
    + +
    + clipPath + +
    +
    {CAAT.Path.Path=} An optional path to apply clip with. If enabled and clipPath is not set, + a rectangle will be used.
    + +
    + + + + + + + + +
    + + +
    + + + setDiscardable(discardable) + +
    +
    + Set discardable property. If an actor is discardable, upon expiration will be removed from +scene graph and hence deleted. + + +
    + + + + +
    +
    Parameters:
    + +
    + discardable + +
    +
    {boolean} a boolean indicating whether the Actor is discardable.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setExpired(time) + +
    +
    + Sets this Actor as Expired. +If this is a Container, all the contained Actors won't be nor drawn nor will receive +any event. That is, expiring an Actor means totally taking it out the Scene's timeline. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} an integer indicating the time the Actor was expired at.
    + +
    + + + + + +
    +
    Returns:
    + +
    this.
    + +
    + + + + +
    + + +
    + + + setFillStyle(style) + +
    +
    + Caches a fillStyle in the Actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + style + +
    +
    a valid Canvas rendering context fillStyle.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setFrameTime(startTime, duration) + +
    +
    + Sets the time life cycle for an Actor. +These values are related to Scene time. + + +
    + + + + +
    +
    Parameters:
    + +
    + startTime + +
    +
    an integer indicating the time until which the Actor won't be visible on the Scene.
    + +
    + duration + +
    +
    an integer indicating how much the Actor will last once visible.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setGestureEnabled(enable) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + enable + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setGLCoords(glCoords, glCoordsIndex) + +
    +
    + TODO: set GLcoords for different image transformations. + + +
    + + + + +
    +
    Parameters:
    + +
    + glCoords + +
    +
    + +
    + glCoordsIndex + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setGlobalAlpha(global) + +
    +
    + Set alpha composition scope. global will mean this alpha value will be its children maximum. +If set to false, only this actor will have this alpha value. + + +
    + + + + +
    +
    Parameters:
    + +
    + global + +
    +
    {boolean} whether the alpha value should be propagated to children.
    + +
    + + + + + + + + +
    + + +
    + + + setGlobalAnchor(ax, ay) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ax + +
    +
    + +
    + ay + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setId(id) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setImageTransformation(it) + +
    +
    + Set this background image transformation. +If GL is enabled, this parameter has no effect. + + +
    + + + + +
    +
    Parameters:
    + +
    + it + +
    +
    any value from CAAT.Foundation.SpriteImage.TR_*
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setLocation(x{number}, y{number}) + +
    +
    + This method sets the position of an Actor inside its parent. + + +
    + + + + +
    +
    Parameters:
    + +
    + x{number} + +
    +
    a float indicating Actor's x position
    + +
    + y{number} + +
    +
    a float indicating Actor's y position
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {*} + setMinimumSize(pw, ph) + +
    +
    + Set this actors minimum layout size. + + +
    + + + + +
    +
    Parameters:
    + +
    + pw + +
    +
    {number}
    + +
    + ph + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + setModelViewMatrix() + +
    +
    + Set this model view matrix if the actor is Dirty. + + mm[2]+= this.x; + mm[5]+= this.y; + if ( this.rotationAngle ) { + this.modelViewMatrix.multiply( m.setTranslate( this.rotationX, this.rotationY) ); + this.modelViewMatrix.multiply( m.setRotation( this.rotationAngle ) ); + this.modelViewMatrix.multiply( m.setTranslate( -this.rotationX, -this.rotationY) ); c= Math.cos( this.rotationAngle ); + } + if ( this.scaleX!=1 || this.scaleY!=1 && (this.scaleTX || this.scaleTY )) { + this.modelViewMatrix.multiply( m.setTranslate( this.scaleTX , this.scaleTY ) ); + this.modelViewMatrix.multiply( m.setScale( this.scaleX, this.scaleY ) ); + this.modelViewMatrix.multiply( m.setTranslate( -this.scaleTX , -this.scaleTY ) ); + } + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setOutOfFrameTime() + +
    +
    + Puts an Actor out of time line, that is, won't be transformed nor rendered. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setPaint(paint) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + paint + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setParent(parent) + +
    +
    + Set this actor's parent. + + +
    + + + + +
    +
    Parameters:
    + +
    + parent + +
    +
    {CAAT.Foundation.ActorContainer}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setPosition(x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPositionAnchor(pax, pay) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pax + +
    +
    + +
    + pay + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPositionAnchored(x, y, pax, pay) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + pax + +
    +
    + +
    + pay + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {*} + setPreferredSize(pw, ph) + +
    +
    + Set this actors preferred layout size. + + +
    + + + + +
    +
    Parameters:
    + +
    + pw + +
    +
    {number}
    + +
    + ph + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + setPreventLayout(b) + +
    +
    + Make this actor not be laid out. + + +
    + + + + +
    +
    Parameters:
    + +
    + b + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setRotation(angle) + +
    +
    + A helper method for setRotationAnchored. This methods stablishes the center +of rotation to be the center of the Actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + angle + +
    +
    a float indicating the angle in radians to rotate the Actor.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setRotationAnchor(rax, ray) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + rax + +
    +
    + +
    + ray + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setRotationAnchored(angle, rx, ry) + +
    +
    + This method sets Actor rotation around a given position. + + +
    + + + + +
    +
    Parameters:
    + +
    + angle + +
    +
    {number} indicating the angle in radians to rotate the Actor.
    + +
    + rx + +
    +
    {number} value in the range 0..1
    + +
    + ry + +
    +
    {number} value in the range 0..1
    + +
    + + + + + +
    +
    Returns:
    + +
    this;
    + +
    + + + + +
    + + +
    + + + setScale(sx, sy) + +
    +
    + A helper method to setScaleAnchored with an anchor of ANCHOR_CENTER + + +
    + + + + +
    +
    Parameters:
    + +
    + sx + +
    +
    a float indicating a width size multiplier.
    + +
    + sy + +
    +
    a float indicating a height size multiplier.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + +
    +
    See:
    + +
    setScaleAnchored
    + +
    + + +
    + + +
    + + + setScaleAnchor(sax, say) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + sax + +
    +
    + +
    + say + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setScaleAnchored(sx, sy, anchorx, anchory) + +
    +
    + Modify the dimensions on an Actor. +The dimension will not affect the local coordinates system in opposition +to setSize or setBounds. + + +
    + + + + +
    +
    Parameters:
    + +
    + sx + +
    +
    {number} width scale.
    + +
    + sy + +
    +
    {number} height scale.
    + +
    + anchorx + +
    +
    {number} x anchor to perform the Scale operation.
    + +
    + anchory + +
    +
    {number} y anchor to perform the Scale operation.
    + +
    + + + + + +
    +
    Returns:
    + +
    this;
    + +
    + + + + +
    + + +
    <private> + + + setScreenBounds() + +
    +
    + Calculates the 2D bounding box in canvas coordinates of the Actor. +This bounding box takes into account the transformations applied hierarchically for +each Scene Actor. + + +
    + + + + + + + + + + + +
    + + +
    + + + setSize(w, h) + +
    +
    + Sets an Actor's dimension + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    a float indicating Actor's width.
    + +
    + h + +
    +
    a float indicating Actor's height.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setSpriteIndex(index) + +
    +
    + Set the actor's SpriteImage index from animation sheet. + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + +
    +
    See:
    + +
    CAAT.Foundation.SpriteImage
    + +
    + + +
    + + +
    + + + setStrokeStyle(style) + +
    +
    + Caches a stroke style in the Actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + style + +
    +
    a valid canvas rendering context stroke style.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setUV(uvBuffer, uvIndex) + +
    +
    + Set UV for this actor's quad. + + +
    + + + + +
    +
    Parameters:
    + +
    + uvBuffer + +
    +
    {Float32Array}
    + +
    + uvIndex + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setVisible(visible) + +
    +
    + Set this actor invisible. +The actor is animated but not visible. +A container won't show any of its children if set visible to false. + + +
    + + + + +
    +
    Parameters:
    + +
    + visible + +
    +
    {boolean} set this actor visible or not.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + stopCacheAsBitmap() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + touchEnd(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + touchMove(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + touchStart(e) + +
    +
    + Touch Start only received when CAAT.TOUCH_BEHAVIOR= CAAT.TOUCH_AS_MULTITOUCH + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + viewToModel(point) + +
    +
    + Transform a point from model to view space. +

    +WARNING: every call to this method calculates +actor's world model view matrix. + + +

    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Math.Point} a point in screen space to be transformed to model space.
    + +
    + + + + + +
    +
    Returns:
    + +
    the source point object
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.AddHint.html b/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.AddHint.html new file mode 100644 index 00000000..38ecc5ea --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.AddHint.html @@ -0,0 +1,653 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.ActorContainer.ADDHINT + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Foundation.ActorContainer.ADDHINT +

    + + +

    + + + + + + +
    Defined in: ActorContainer.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   +
    + CAAT.Foundation.ActorContainer.ADDHINT.CONFORM +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <static>   +
    CAAT.Foundation.ActorContainer.ADDHINT.extendsWith() +
    +
    +
    + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Foundation.ActorContainer.ADDHINT +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.Foundation.ActorContainer.ADDHINT.CONFORM + +
    +
    + + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <static> + + + CAAT.Foundation.ActorContainer.ADDHINT.extendsWith() + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:17 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.html b/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.html new file mode 100644 index 00000000..7fde28dc --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.ActorContainer.html @@ -0,0 +1,2428 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.ActorContainer + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.ActorContainer +

    + + +

    + +
    Extends + CAAT.Foundation.Actor.
    + + + + + +
    Defined in: ActorContainer.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   + +
    This container active children.
    +
    <private>   +
    + addHint +
    +
    Container redimension policy when adding children: + 0 : no resize.
    +
    <private>   + +
    If container redimension on children add, use this rectangle as bounding box store.
    +
      + +
    This container children.
    +
      + +
    +
      + +
    Define a layout manager for this container that enforces children position and/or sizes.
    +
    <private>   + +
    This container pending to be added children.
    +
    <private>   +
    + runion +
    +
    Spare rectangle to avoid new allocations when adding children to this container.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(hint) +
    +
    Constructor delegate
    +
    <private>   +
    __paintActor(director, time) +
    +
    +
    <private>   + +
    +
    <private>   + +
    +
      +
    addActor(child, constraint) +
    +
    +
      +
    addActorImmediately(child, constraint) +
    +
    +
      +
    addChild(child, constraint) +
    +
    Adds an Actor to this ActorContainer.
    +
      +
    addChildAt(child, index) +
    +
    Adds an Actor to this ActorContainer.
    +
      +
    addChildDelayed(child, constraint) +
    +
    Add a child element and make it active in the next frame.
    +
      +
    addChildImmediately(child, constraint) +
    +
    Adds an Actor to this Container.
    +
      +
    animate(director, time) +
    +
    Private.
    +
      +
    destroy() +
    +
    Destroys this ActorContainer.
    +
      +
    drawScreenBoundingBox(director, time) +
    +
    Draws this ActorContainer and all of its children screen bounding box.
    +
      + +
    Removes all children from this ActorContainer.
    +
      +
    endAnimate(director, time) +
    +
    Removes Actors from this ActorContainer which are expired and flagged as Discardable.
    +
    <private>   + +
    +
      + +
    Find the first actor with the supplied ID.
    +
      +
    findChild(child) +
    +
    Private +Gets a contained Actor z-index on this ActorContainer.
    +
      +
    getChildAt(iPosition) +
    +
    Returns the Actor at the iPosition(th) position.
    +
      + +
    +
      + +
    +
      + +
    Get number of Actors into this container.
    +
      + +
    +
      +
    paintActor(director, time) +
    +
    Private +Paints this container and every contained children.
    +
      +
    paintActorGL(director, time) +
    +
    +
      + +
    Recalc this container size by computing the union of every children bounding box.
    +
      +
    removeChild(child) +
    +
    Removed an Actor form this ActorContainer.
    +
      + +
    +
      + +
    +
      + +
    +
      +
    setBounds(x, y, w, h) +
    +
    +
      +
    setLayout(layout) +
    +
    +
      +
    setZOrder(actor, index) +
    +
    Changes an actor's ZOrder.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, emptyBehaviorList, enableDrag, enableEvents, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paint, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.ActorContainer() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + activeChildren + +
    +
    + This container active children. + + +
    + + + + + + + + +
    + + +
    <private> + + + addHint + +
    +
    + Container redimension policy when adding children: + 0 : no resize. + CAAT.Foundation.ActorContainer.AddHint.CONFORM : resize container to a bounding box. + + +
    + + + + + + + + +
    + + +
    <private> + + + boundingBox + +
    +
    + If container redimension on children add, use this rectangle as bounding box store. + + +
    + + + + + + + + +
    + + +
    + + + childrenList + +
    +
    + This container children. + + +
    + + + + + + + + +
    + + +
    + + + layoutInvalidated + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + layoutManager + +
    +
    + Define a layout manager for this container that enforces children position and/or sizes. + + +
    + + + + + + +
    +
    See:
    + +
    demo26 for an example of layouts.
    + +
    + + + +
    + + +
    <private> + + + pendingChildrenList + +
    +
    + This container pending to be added children. + + +
    + + + + + + + + +
    + + +
    <private> + + + runion + +
    +
    + Spare rectangle to avoid new allocations when adding children to this container. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + {*} + __init(hint) + +
    +
    + Constructor delegate + + +
    + + + + +
    +
    Parameters:
    + +
    + hint + +
    +
    {CAAT.Foundation.ActorContainer.AddHint}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    <private> + + + __paintActor(director, time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __validateLayout() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + __validateTree() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + addActor(child, constraint) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    + +
    + constraint + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addActorImmediately(child, constraint) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    + +
    + constraint + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addChild(child, constraint) + +
    +
    + Adds an Actor to this ActorContainer. +The Actor will be added to the container AFTER frame animation, and not on method call time. +Except the Director and in orther to avoid visual artifacts, the developer SHOULD NOT call this +method directly. + +If the container has addingHint as CAAT.Foundation.ActorContainer.AddHint.CONFORM, new continer size will be +calculated by summing up the union of every client actor bounding box. +This method will not take into acount actor's affine transformations, so the bounding box will be +AABB. + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    {CAAT.Foundation.Actor} object instance.
    + +
    + constraint + +
    +
    {object}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + addChildAt(child, index) + +
    +
    + Adds an Actor to this ActorContainer. + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    {CAAT.Foundation.Actor}.
    + +
    + index + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + addChildDelayed(child, constraint) + +
    +
    + Add a child element and make it active in the next frame. + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    {CAAT.Foundation.Actor}
    + +
    + constraint + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addChildImmediately(child, constraint) + +
    +
    + Adds an Actor to this Container. +The Actor will be added ON METHOD CALL, despite the rendering pipeline stage being executed at +the time of method call. + +This method is only used by director's transitionScene. + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    {CAAT.Foundation.Actor}
    + +
    + constraint + +
    +
    {object}
    + +
    + + + + + +
    +
    Returns:
    + +
    this.
    + +
    + + + + +
    + + +
    + + {boolean} + animate(director, time) + +
    +
    + Private. +Performs the animate method for this ActorContainer and every contained Actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    + +
    + time + +
    +
    an integer indicating the Scene time when the bounding box is to be drawn.
    + +
    + + + + + +
    +
    Returns:
    + +
    {boolean} is this actor in active children list ??
    + +
    + + + + +
    + + +
    + + + destroy() + +
    +
    + Destroys this ActorContainer. +The process falls down recursively for each contained Actor into this ActorContainer. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + drawScreenBoundingBox(director, time) + +
    +
    + Draws this ActorContainer and all of its children screen bounding box. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    + +
    + time + +
    +
    an integer indicating the Scene time when the bounding box is to be drawn.
    + +
    + + + + + + + + +
    + + +
    + + + emptyChildren() + +
    +
    + Removes all children from this ActorContainer. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + endAnimate(director, time) + +
    +
    + Removes Actors from this ActorContainer which are expired and flagged as Discardable. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    + +
    + time + +
    +
    an integer indicating the Scene time when the bounding box is to be drawn.
    + +
    + + + + + + + + +
    + + +
    <private> + + + findActorAtPosition(point) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    an object of the form { x: float, y: float }
    + +
    + + + + + +
    +
    Returns:
    + +
    the Actor contained inside this ActorContainer if found, or the ActorContainer itself.
    + +
    + + + + +
    + + +
    + + + findActorById(id) + +
    +
    + Find the first actor with the supplied ID. +This method is not recommended to be used since executes a linear search. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {number} + findChild(child) + +
    +
    + Private +Gets a contained Actor z-index on this ActorContainer. + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    a CAAT.Foundation.Actor object instance.
    + +
    + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + getChildAt(iPosition) + +
    +
    + Returns the Actor at the iPosition(th) position. + + +
    + + + + +
    +
    Parameters:
    + +
    + iPosition + +
    +
    an integer indicating the position array.
    + +
    + + + + + +
    +
    Returns:
    + +
    the CAAT.Foundation.Actor object at position.
    + +
    + + + + +
    + + +
    + + + getLayout() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getNumActiveChildren() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getNumChildren() + +
    +
    + Get number of Actors into this container. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    integer indicating the number of children.
    + +
    + + + + +
    + + +
    + + + invalidateLayout() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + paintActor(director, time) + +
    +
    + Private +Paints this container and every contained children. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    + +
    + time + +
    +
    an integer indicating the Scene time when the bounding box is to be drawn.
    + +
    + + + + + + + + +
    + + +
    + + + paintActorGL(director, time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + recalcSize() + +
    +
    + Recalc this container size by computing the union of every children bounding box. + + +
    + + + + + + + + + + + +
    + + +
    + + + removeChild(child) + +
    +
    + Removed an Actor form this ActorContainer. +If the Actor is not contained into this Container, nothing happends. + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    a CAAT.Foundation.Actor object instance.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + removeChildAt(pos) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pos + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + removeFirstChild() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + removeLastChild() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + setBounds(x, y, w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setLayout(layout) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + layout + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setZOrder(actor, index) + +
    +
    + Changes an actor's ZOrder. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    the actor to change ZOrder for
    + +
    + index + +
    +
    an integer indicating the new ZOrder. a value greater than children list size means to be the +last ZOrder Actor.
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:17 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DBodyActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DBodyActor.html new file mode 100644 index 00000000..a7e99275 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DBodyActor.html @@ -0,0 +1,1720 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.Box2D.B2DBodyActor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.Box2D.B2DBodyActor +

    + + +

    + +
    Extends + CAAT.Foundation.Actor.
    + + + + + +
    Defined in: B2DBodyActor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + bodyData +
    +
    BodyData object linked to the box2D body.
    +
      +
    + bodyDef +
    +
    Box2D body definition.
    +
      +
    + bodyType +
    +
    Dynamic bodies by default
    +
      +
    + density +
    +
    Body dentisy
    +
      + +
    Box2D fixture definition.
    +
      +
    + friction +
    +
    Body friction.
    +
      +
    + recycle +
    +
    Recycle this actor when the body is not needed anymore ??
    +
      + +
    Body restitution.
    +
      +
    + world +
    +
    Box2D world reference.
    +
      +
    + worldBody +
    +
    Box2D body
    +
      + +
    Box2d fixture
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    animate(director, time) +
    +
    Method override to get position and rotation angle from box2d body.
    +
      +
    check(obj, prop, def) +
    +
    Helper method to check whether this js object contains a given property and if it doesn't exist +create and set it to def value.
    +
      +
    createBody(world, bodyData) +
    +
    Create an actor as a box2D body binding, create it on the given world and with +the initialization data set in bodyData object.
    +
      +
    destroy() +
    +
    +
      + +
    Get this body's center on screen regardless of its shape.
    +
      + +
    Get a distance joint's position on pixels.
    +
      +
    setAwake(bool) +
    +
    +
      +
    setBodyType(bodyType) +
    +
    Set this body's type:
    +
      + +
    Set this body's +density.
    +
      + +
    Set this body's friction.
    +
      +
    setLocation(x, y) +
    +
    +
      + +
    +
      +
    setPositionAnchored(x, y, ax, ay) +
    +
    +
      + +
    set this actor to recycle its body, that is, do not destroy it.
    +
      + +
    Set this body's restitution coeficient.
    +
      + +
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.Actor:
    __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paint, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.Box2D.B2DBodyActor() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + bodyData + +
    +
    + BodyData object linked to the box2D body. + + +
    + + + + + + + + +
    + + +
    + + + bodyDef + +
    +
    + Box2D body definition. + + +
    + + + + + + + + +
    + + +
    + + + bodyType + +
    +
    + Dynamic bodies by default + + +
    + + + + + + + + +
    + + +
    + + + density + +
    +
    + Body dentisy + + +
    + + + + + + + + +
    + + +
    + + + fixtureDef + +
    +
    + Box2D fixture definition. + + +
    + + + + + + + + +
    + + +
    + + + friction + +
    +
    + Body friction. + + +
    + + + + + + + + +
    + + +
    + + + recycle + +
    +
    + Recycle this actor when the body is not needed anymore ?? + + +
    + + + + + + + + +
    + + +
    + + + restitution + +
    +
    + Body restitution. + + +
    + + + + + + + + +
    + + +
    + + + world + +
    +
    + Box2D world reference. + + +
    + + + + + + + + +
    + + +
    + + + worldBody + +
    +
    + Box2D body + + +
    + + + + + + + + +
    + + +
    + + + worldBodyFixture + +
    +
    + Box2d fixture + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + animate(director, time) + +
    +
    + Method override to get position and rotation angle from box2d body. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + time + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + check(obj, prop, def) + +
    +
    + Helper method to check whether this js object contains a given property and if it doesn't exist +create and set it to def value. + + +
    + + + + +
    +
    Parameters:
    + +
    + obj + +
    +
    {object}
    + +
    + prop + +
    +
    {string}
    + +
    + def + +
    +
    {object}
    + +
    + + + + + + + + +
    + + +
    + + + createBody(world, bodyData) + +
    +
    + Create an actor as a box2D body binding, create it on the given world and with +the initialization data set in bodyData object. + + +
    + + + + +
    +
    Parameters:
    + +
    + world + +
    +
    {Box2D.Dynamics.b2World} a Box2D world instance
    + +
    + bodyData + +
    +
    {object} An object with body info.
    + +
    + + + + + + + + +
    + + +
    + + + destroy() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getCenter() + +
    +
    + Get this body's center on screen regardless of its shape. +This method will return box2d body's centroid. + + +
    + + + + + + + + + + + +
    + + +
    + + + getDistanceJointLocalAnchor() + +
    +
    + Get a distance joint's position on pixels. + + +
    + + + + + + + + + + + +
    + + +
    + + + setAwake(bool) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + bool + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setBodyType(bodyType) + +
    +
    + Set this body's type: + + +
    + + + + +
    +
    Parameters:
    + +
    + bodyType + +
    +
    {Box2D.Dynamics.b2Body.b2_*}
    + +
    + + + + + + + + +
    + + +
    + + + setDensity(d) + +
    +
    + Set this body's +density. + + +
    + + + + +
    +
    Parameters:
    + +
    + d + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setFriction(f) + +
    +
    + Set this body's friction. + + +
    + + + + +
    +
    Parameters:
    + +
    + f + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setLocation(x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPositionAnchor(ax, ay) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ax + +
    +
    + +
    + ay + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPositionAnchored(x, y, ax, ay) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + ax + +
    +
    + +
    + ay + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setRecycle() + +
    +
    + set this actor to recycle its body, that is, do not destroy it. + + +
    + + + + + + + + + + + +
    + + +
    + + + setRestitution(r) + +
    +
    + Set this body's restitution coeficient. + + +
    + + + + +
    +
    Parameters:
    + +
    + r + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setSleepingAllowed(bool) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + bool + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:17 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DCircularBody.html b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DCircularBody.html new file mode 100644 index 00000000..1936c59c --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DCircularBody.html @@ -0,0 +1,731 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.Box2D.B2DCircularBody + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.Box2D.B2DCircularBody +

    + + +

    + +
    Extends + CAAT.Foundation.Box2D.B2DBodyActor.
    + + + + + +
    Defined in: B2DCircularBody.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + radius +
    +
    Default radius.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    bodyData, bodyDef, bodyType, density, fixtureDef, friction, recycle, restitution, world, worldBody, worldBodyFixture
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    createBody(world, bodyData) +
    +
    Create a box2d body and link it to this CAAT.Actor instance.
    +
    <static>   +
    CAAT.Foundation.Box2D.B2DCircularBody.createCircularBody(world, bodyData) +
    +
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    __init, animate, check, destroy, getCenter, getDistanceJointLocalAnchor, setAwake, setBodyType, setDensity, setFriction, setLocation, setPositionAnchor, setPositionAnchored, setRecycle, setRestitution, setSleepingAllowed
    Methods borrowed from class CAAT.Foundation.Actor:
    __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paint, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.Box2D.B2DCircularBody() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + radius + +
    +
    + Default radius. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + + createBody(world, bodyData) + +
    +
    + Create a box2d body and link it to this CAAT.Actor instance. + + +
    + + + + +
    +
    Parameters:
    + +
    + world + +
    +
    {Box2D.Dynamics.b2World} a Box2D world instance
    + +
    + bodyData + +
    +
    {object}
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Box2D.B2DCircularBody.createCircularBody(world, bodyData) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + world + +
    +
    + +
    + bodyData + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:17 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DPolygonBody.html b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DPolygonBody.html new file mode 100644 index 00000000..0590f04f --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.B2DPolygonBody.html @@ -0,0 +1,765 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.Box2D.B2DPolygonBody + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.Box2D.B2DPolygonBody +

    + + +

    + +
    Extends + CAAT.Foundation.Box2D.B2DBodyActor.
    + + + + + +
    Defined in: B2DPolygonBody.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    Measured body's bounding box.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    bodyData, bodyDef, bodyType, density, fixtureDef, friction, recycle, restitution, world, worldBody, worldBodyFixture
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    createBody(world, bodyData) +
    +
    Create a box2d body and link it to this CAAT.Actor.
    +
    <static>   +
    CAAT.Foundation.Box2D.B2DPolygonBody.createPolygonBody(world, bodyData) +
    +
    Helper function to aid in box2d polygon shaped bodies.
    +
      + +
    Get on-screen distance joint coordinate.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.Box2D.B2DBodyActor:
    __init, animate, check, destroy, getCenter, setAwake, setBodyType, setDensity, setFriction, setLocation, setPositionAnchor, setPositionAnchored, setRecycle, setRestitution, setSleepingAllowed
    Methods borrowed from class CAAT.Foundation.Actor:
    __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paint, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.Box2D.B2DPolygonBody() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + boundingBox + +
    +
    + Measured body's bounding box. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + + createBody(world, bodyData) + +
    +
    + Create a box2d body and link it to this CAAT.Actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + world + +
    +
    {Box2D.Dynamics.b2World}
    + +
    + bodyData + +
    +
    {object}
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Box2D.B2DPolygonBody.createPolygonBody(world, bodyData) + +
    +
    + Helper function to aid in box2d polygon shaped bodies. + + +
    + + + + +
    +
    Parameters:
    + +
    + world + +
    +
    + +
    + bodyData + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getDistanceJointLocalAnchor() + +
    +
    + Get on-screen distance joint coordinate. + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:17 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.html b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.html new file mode 100644 index 00000000..16c20545 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.Box2D.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.Box2D + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Foundation.Box2D +

    + + +

    + + + + + + +
    Defined in: B2DBodyActor.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Foundation.Box2D +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:17 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Director.html b/documentation/jsdoc/symbols/CAAT.Foundation.Director.html new file mode 100644 index 00000000..8eda44f7 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.Director.html @@ -0,0 +1,7654 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.Director + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.Director +

    + + +

    + +
    Extends + CAAT.Foundation.ActorContainer.
    + + + + + +
    Defined in: Director.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   + +
    Calculated gesture event rotation.
    +
    <private>   + +
    Calculated gesture event scale.
    +
    <private>   + +
    this director´s audio manager.
    +
      + +
    Some browser related information.
    +
    <private>   +
    + canvas +
    +
    The canvas the Director draws on.
    +
    <private>   + +
    current dirty rects.
    +
      +
    + clear +
    +
    Clear screen strategy: +CAAT.Foundation.Director.CLEAR_NONE : director won´t clear the background.
    +
    <static>   +
    + CAAT.Foundation.Director.CLEAR_ALL +
    +
    +
    <static>   +
    + CAAT.Foundation.Director.CLEAR_DIRTY_RECTS +
    +
    +
    <static>   +
    + CAAT.Foundation.Director.CLEAR_NONE +
    +
    +
    <private>   +
    + coords +
    +
    webGL vertex array
    +
    <private>   + +
    webGL vertex indices.
    +
      +
    + ctx +
    +
    This director´s canvas rendering context.
    +
    <private>   + +
    webGL current shader opacity.
    +
      + +
    The current Scene.
    +
    <private>   + +
    webGL current texture page.
    +
      +
    + debug +
    +
    flag indicating debug mode.
    +
    <private>   + +
    Dirty rects cache.
    +
    <private>   + +
    Dirty rects enabled ??
    +
    <private>   + +
    Number of currently allocated dirty rects.
    +
      +
    + dragging +
    +
    is input in drag mode ?
    +
    <private>   + +
    Dirty rects count debug info.
    +
      + +
    Rendered frames counter.
    +
    <private>   + +
    draw tris front_to_back or back_to_front ?
    +
    <private>   +
    + gl +
    +
    3d context
    +
    <private>   +
    + glEnabled +
    +
    is WebGL enabled as renderer ?
    +
    <private>   + +
    if webGL is on, CAAT will texture pack all images transparently.
    +
    <private>   + +
    The only GLSL program for webGL
    +
      + +
    An array of JSON elements of the form { id:string, image:Image }
    +
    <private>   + +
    if CAAT.NO_RAF is set (no request animation frame), this value is the setInterval returned +id.
    +
      + +
    is the left mouse button pressed ?.
    +
      + +
    director's last actor receiving input.
    +
    <private>   + +
    mouse coordinate related to canvas 0,0 coord.
    +
    <private>   + +
    Number of dirty rects.
    +
    <private>   + +
    currently unused.
    +
    <private>   + +
    This method will be called after rendering any director scene.
    +
    <private>   + +
    This method will be called before rendering any director scene.
    +
      + +
    Callback when the window is resized.
    +
    <private>   +
    + pMatrix +
    +
    webGL projection matrix
    +
    <private>   + +
    previous mouse position cache.
    +
    <static>   +
    + CAAT.Foundation.Director.RENDER_MODE_CONTINUOUS +
    +
    +
    <static>   +
    + CAAT.Foundation.Director.RENDER_MODE_DIRTY +
    +
    +
      + +
    Set CAAT render mode.
    +
    <private>   +
    + resize +
    +
    Window resize strategy.
    +
    <static>   +
    + CAAT.Foundation.Director.RESIZE_BOTH +
    +
    +
    <static>   +
    + CAAT.Foundation.Director.RESIZE_HEIGHT +
    +
    +
    <static>   +
    + CAAT.Foundation.Director.RESIZE_NONE +
    +
    +
    <static>   +
    + CAAT.Foundation.Director.RESIZE_PROPORTIONAL +
    +
    +
    <static>   +
    + CAAT.Foundation.Director.RESIZE_WIDTH +
    +
    +
      +
    + scenes +
    +
    This director scene collection.
    +
    <private>   + +
    Retina display deicePixels/backingStorePixels ratio
    +
    <private>   + +
    screen mouse coordinates.
    +
    <private>   + +
    Currently used dirty rects.
    +
      + +
    statistics object
    +
      +
    + stopped +
    +
    Is this director stopped ?
    +
    <private>   +
    + time +
    +
    director time.
    +
    <private>   +
    + timeline +
    +
    global director timeline.
    +
    <private>   + +
    Director´s timer manager.
    +
    <private>   +
    + touches +
    +
    Touches information.
    +
    <private>   + +
    if CAAT.CACHE_SCENE_ON_CHANGE is set, this scene will hold a cached copy of the exiting scene.
    +
    <private>   +
    + uv +
    +
    webGL uv texture indices
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.ActorContainer:
    activeChildren, addHint, boundingBox, childrenList, layoutInvalidated, layoutManager, pendingChildrenList, runion
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   + +
    +
    <private>   +
    __gestureChange(scale, rotation) +
    +
    +
    <private>   +
    __gestureEnd(scale, rotation) +
    +
    +
    <private>   +
    __gestureStart(scale, rotation) +
    +
    +
    <private>   +
    __init() +
    +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    +
    <private>   + +
    Same as mouseDown but not preventing event.
    +
    <private>   + +
    +
      +
    addAudio(id, url) +
    +
    Adds an audio to the cache.
    +
      +
    addChild(scene) +
    +
    Adds an scene to this Director.
    +
      +
    addDirtyRect(rectangle) +
    +
    Add a rectangle to the list of dirty screen areas which should be redrawn.
    +
      +
    addHandlers(canvas) +
    +
    +
      +
    addImage(id, image, noUpdateGL) +
    +
    Add a new image to director's image cache.
    +
      +
    addScene(scene) +
    +
    Add a new Scene to Director's Scene list.
    +
      +
    animate(director, time) +
    +
    A director is a very special kind of actor.
    +
      +
    audioLoop(id) +
    +
    Loops an audio instance identified by the id.
    +
      +
    audioPlay(id) +
    +
    Plays the audio instance identified by the id.
    +
      +
    cancelPlay(id) +
    +
    +
      +
    cancelPlayByChannel(audioObject) +
    +
    +
      + +
    +
      +
    clean() +
    +
    +
      + +
    +
      + +
    Creates an initializes a Scene object.
    +
      +
    createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel) +
    +
    +
      +
    cumulateOffset(node, parent, prop) +
    +
    Acculumate dom elements position to properly offset on-screen mouse/touch events.
    +
      +
    deleteImage(id, noUpdateGL) +
    +
    +
      +
    easeEnd(scene, b_easeIn) +
    +
    Scene easing listener.
    +
      +
    easeIn(inSceneIndex, type, time, alpha, anchor, interpolator) +
    +
    This method changes Director's current Scene to the scene index indicated by +inSceneIndex parameter.
    +
      +
    easeInOut(inSceneIndex, typein, anchorin, outSceneIndex, typeout, anchorout, time, alpha, interpolatorIn, interpolatorOut) +
    +
    This method offers full control over the process of switching between any given two Scenes.
    +
      +
    easeInOutRandom(inIndex, outIndex, time, alpha) +
    +
    This method will switch between two given Scene indexes (ie, take away scene number 2, +and bring in scene number 5).
    +
      + +
    Removes Director's scenes.
    +
      +
    enableEvents(onElement) +
    +
    +
      +
    enableResizeEvents(mode, onResizeCallback) +
    +
    Enable window resize events and set redimension policy.
    +
      +
    endLoop() +
    +
    +
      + +
    +
      + +
    +
      + +
    Get this Director's AudioManager instance.
    +
      + +
    Return the running browser name.
    +
      + +
    Return the running browser version.
    +
      +
    getCanvasCoord(point, e) +
    +
    Normalize input event coordinates to be related to (0,0) canvas position.
    +
      + +
    +
      + +
    Return the index of the current scene in the Director's scene list.
    +
      +
    getImage(sId) +
    +
    Gets the resource with the specified resource name.
    +
      + +
    Get the number of scenes contained in the Director.
    +
      +
    getOffset(node) +
    +
    +
      + +
    Return the operating system name.
    +
      + +
    +
      +
    getScene(index) +
    +
    Get a concrete director's scene.
    +
      + +
    +
      +
    getSceneIndex(scene) +
    +
    Return the index for a given Scene object contained in the Director.
    +
      + +
    +
      +
    glFlush() +
    +
    +
      +
    glRender(vertex, coordsIndex, uv) +
    +
    Render buffered elements.
    +
      +
    glReset() +
    +
    +
      + +
    +
      +
    initialize(width, height, canvas, proxy) +
    +
    This method performs Director initialization.
    +
      +
    initializeGL(width, height, canvas, proxy) +
    +
    Experimental.
    +
      + +
    +
      + +
    +
      +
    loop(fps, callback, callback2) +
    +
    +
      +
    mouseDown(mouseEvent) +
    +
    +
      +
    mouseDrag(mouseEvent) +
    +
    +
      +
    mouseEnter(mouseEvent) +
    +
    +
      +
    mouseExit(mouseEvent) +
    +
    +
      +
    mouseMove(mouseEvent) +
    +
    +
      +
    mouseUp(mouseEvent) +
    +
    +
      +
    musicPlay(id) +
    +
    +
      + +
    +
      +
    render(time) +
    +
    This is the entry point for the animation system of the Director.
    +
      + +
    Starts the director animation.If no scene is explicitly selected, the current Scene will +be the first scene added to the Director.
    +
      +
    renderToContext(ctx, scene) +
    +
    This method draws an Scene to an offscreen canvas.
    +
      + +
    +
    <private>   + +
    Reset statistics information.
    +
      + +
    If the director has renderingMode: DIRTY, the timeline must be reset to register accurate frame measurement.
    +
      +
    scheduleDirtyRect(rectangle) +
    +
    This method is used when asynchronous operations must produce some dirty rectangle painting.
    +
      + +
    +
      +
    setBounds(x, y, w, h) +
    +
    Set this director's bounds as well as its contained scenes.
    +
      +
    setClear(clear) +
    +
    This method states whether the director must clear background before rendering +each frame.
    +
      + +
    +
      + +
    +
      +
    setImagesCache(imagesCache, tpW, tpH) +
    +
    +
      +
    setMusicEnabled(enabled) +
    +
    +
      + +
    +
      +
    setScene(sceneIndex) +
    +
    Changes (or sets) the current Director scene to the index +parameter.
    +
      + +
    +
      +
    setValueForKey(key, value) +
    +
    +
      +
    setVolume(id, volume) +
    +
    +
      +
    switchToNextScene(time, alpha, transition) +
    +
    Sets the previous Scene in sequence as the current Scene.
    +
      +
    switchToPrevScene(time, alpha, transition) +
    +
    Sets the previous Scene in sequence as the current Scene.
    +
      +
    switchToScene(iNewSceneIndex, time, alpha, transition) +
    +
    This method will change the current Scene by the Scene indicated as parameter.
    +
      + +
    +
      +
    windowResized(w, h) +
    +
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.ActorContainer:
    __paintActor, __validateLayout, __validateTree, addActor, addActorImmediately, addChildAt, addChildDelayed, addChildImmediately, destroy, drawScreenBoundingBox, emptyChildren, endAnimate, findActorById, findChild, getChildAt, getLayout, getNumActiveChildren, getNumChildren, invalidateLayout, paintActor, paintActorGL, recalcSize, removeChild, removeChildAt, removeFirstChild, removeLastChild, setLayout, setZOrder
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, contains, create, disableDrag, emptyBehaviorList, enableDrag, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseOut, mouseOver, moveTo, paint, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.Director() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + __gestureRotation + +
    +
    + Calculated gesture event rotation. + + +
    + + + + + + + + +
    + + +
    <private> + + + __gestureScale + +
    +
    + Calculated gesture event scale. + + +
    + + + + + + + + +
    + + +
    <private> + + + audioManager + +
    +
    + this director´s audio manager. + + +
    + + + + + + + + +
    + + +
    + + + browserInfo + +
    +
    + Some browser related information. + + +
    + + + + + + + + +
    + + +
    <private> + + + canvas + +
    +
    + The canvas the Director draws on. + + +
    + + + + + + + + +
    + + +
    <private> + + + cDirtyRects + +
    +
    + current dirty rects. + + +
    + + + + + + + + +
    + + +
    + + + clear + +
    +
    + Clear screen strategy: +CAAT.Foundation.Director.CLEAR_NONE : director won´t clear the background. +CAAT.Foundation.Director.CLEAR_DIRTY_RECTS : clear only affected actors screen area. +CAAT.Foundation.Director.CLEAR_ALL : clear the whole canvas object. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Director.CLEAR_ALL + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Director.CLEAR_DIRTY_RECTS + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Director.CLEAR_NONE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <private> + + + coords + +
    +
    + webGL vertex array + + +
    + + + + + + + + +
    + + +
    <private> + + + coordsIndex + +
    +
    + webGL vertex indices. + + +
    + + + + + + + + +
    + + +
    + + + ctx + +
    +
    + This director´s canvas rendering context. + + +
    + + + + + + + + +
    + + +
    <private> + + + currentOpacity + +
    +
    + webGL current shader opacity. +BUGBUG: change this by vertex colors. + + +
    + + + + + + + + +
    + + +
    + + + currentScene + +
    +
    + The current Scene. This and only this will receive events. + + +
    + + + + + + + + +
    + + +
    <private> + + + currentTexturePage + +
    +
    + webGL current texture page. This minimizes webGL context changes. + + +
    + + + + + + + + +
    + + +
    + + + debug + +
    +
    + flag indicating debug mode. It will draw affedted screen areas. + + +
    + + + + + + + + +
    + + +
    <private> + + + dirtyRects + +
    +
    + Dirty rects cache. +An array of CAAT.Math.Rectangle object. + + +
    + + + + + + + + +
    + + +
    <private> + + + dirtyRectsEnabled + +
    +
    + Dirty rects enabled ?? + + +
    + + + + + + + + +
    + + +
    <private> + + + dirtyRectsIndex + +
    +
    + Number of currently allocated dirty rects. + + +
    + + + + + + + + +
    + + +
    + + + dragging + +
    +
    + is input in drag mode ? + + +
    + + + + + + + + +
    + + +
    <private> + + + drDiscarded + +
    +
    + Dirty rects count debug info. + + +
    + + + + + + + + +
    + + +
    + + + frameCounter + +
    +
    + Rendered frames counter. + + +
    + + + + + + + + +
    + + +
    <private> + + + front_to_back + +
    +
    + draw tris front_to_back or back_to_front ? + + +
    + + + + + + + + +
    + + +
    <private> + + + gl + +
    +
    + 3d context + + +
    + + + + + + + + +
    + + +
    <private> + + + glEnabled + +
    +
    + is WebGL enabled as renderer ? + + +
    + + + + + + + + +
    + + +
    <private> + + + glTextureManager + +
    +
    + if webGL is on, CAAT will texture pack all images transparently. + + +
    + + + + + + + + +
    + + +
    <private> + + + glTtextureProgram + +
    +
    + The only GLSL program for webGL + + +
    + + + + + + + + +
    + + +
    + + + imagesCache + +
    +
    + An array of JSON elements of the form { id:string, image:Image } + + +
    + + + + + + + + +
    + + +
    <private> + + + intervalId + +
    +
    + if CAAT.NO_RAF is set (no request animation frame), this value is the setInterval returned +id. + + +
    + + + + + + + + +
    + + +
    + + + isMouseDown + +
    +
    + is the left mouse button pressed ?. +Needed to handle dragging. + + +
    + + + + + + + + +
    + + +
    + + + lastSelectedActor + +
    +
    + director's last actor receiving input. +Needed to set capture for dragging events. + + +
    + + + + + + + + +
    + + +
    <private> + + + mousePoint + +
    +
    + mouse coordinate related to canvas 0,0 coord. + + +
    + + + + + + + + +
    + + +
    <private> + + + nDirtyRects + +
    +
    + Number of dirty rects. + + +
    + + + + + + + + +
    + + +
    <private> + + + needsRepaint + +
    +
    + currently unused. +Intended to run caat in evented mode. + + +
    + + + + + + + + +
    + + +
    <private> + + + onRenderEnd + +
    +
    + This method will be called after rendering any director scene. +Use this method to clean your physics forces for example. + + +
    + + + + + + + + +
    + + +
    <private> + + + onRenderStart + +
    +
    + This method will be called before rendering any director scene. +Use this method to calculate your physics for example. + + +
    + + + + + + + + +
    + + +
    + + + onResizeCallback + +
    +
    + Callback when the window is resized. + + +
    + + + + + + + + +
    + + +
    <private> + + + pMatrix + +
    +
    + webGL projection matrix + + +
    + + + + + + + + +
    + + +
    <private> + + + prevMousePoint + +
    +
    + previous mouse position cache. Needed for drag events. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Director.RENDER_MODE_CONTINUOUS + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Director.RENDER_MODE_DIRTY + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + renderMode + +
    +
    + Set CAAT render mode. Right now, this takes no effect. + + +
    + + + + + + + + +
    + + +
    <private> + + + resize + +
    +
    + Window resize strategy. +see CAAT.Foundation.Director.RESIZE_* constants. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Director.RESIZE_BOTH + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Director.RESIZE_HEIGHT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Director.RESIZE_NONE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Director.RESIZE_PROPORTIONAL + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Director.RESIZE_WIDTH + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + scenes + +
    +
    + This director scene collection. + + +
    + + + + + + + + +
    + + +
    <private> + + + SCREEN_RATIO + +
    +
    + Retina display deicePixels/backingStorePixels ratio + + +
    + + + + + + + + +
    + + +
    <private> + + + screenMousePoint + +
    +
    + screen mouse coordinates. + + +
    + + + + + + + + +
    + + +
    <private> + + + sDirtyRects + +
    +
    + Currently used dirty rects. + + +
    + + + + + + + + +
    + + +
    + + + statistics + +
    +
    + statistics object + + +
    + + + + + + + + +
    + + +
    + + + stopped + +
    +
    + Is this director stopped ? + + +
    + + + + + + + + +
    + + +
    <private> + + + time + +
    +
    + director time. + + +
    + + + + + + + + +
    + + +
    <private> + + + timeline + +
    +
    + global director timeline. + + +
    + + + + + + + + +
    + + +
    <private> + + + timerManager + +
    +
    + Director´s timer manager. +Each scene has a timerManager as well. +The difference is the scope. Director´s timers will always be checked whereas scene´ timers +will only be scheduled/checked when the scene is director´ current scene. + + +
    + + + + + + + + +
    + + +
    <private> + + + touches + +
    +
    + Touches information. Associate touch.id with an actor and original touch info. + + +
    + + + + + + + + +
    + + +
    <private> + + + transitionScene + +
    +
    + if CAAT.CACHE_SCENE_ON_CHANGE is set, this scene will hold a cached copy of the exiting scene. + + +
    + + + + + + + + +
    + + +
    <private> + + + uv + +
    +
    + webGL uv texture indices + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __findTouchFirstActor() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + __gestureChange(scale, rotation) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + scale + +
    +
    + +
    + rotation + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __gestureEnd(scale, rotation) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + scale + +
    +
    + +
    + rotation + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __gestureStart(scale, rotation) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + scale + +
    +
    + +
    + rotation + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + __mouseDBLClickHandler(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __mouseDownHandler(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __mouseMoveHandler(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __mouseOutHandler(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __mouseOverHandler(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __mouseUpHandler(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __setupRetina() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + __touchCancelHandleMT(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __touchEndHandler(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __touchEndHandlerMT(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __touchGestureChangeHandleMT(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __touchGestureEndHandleMT(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __touchGestureStartHandleMT(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __touchMoveHandler(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __touchMoveHandlerMT(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __touchStartHandler(e) + +
    +
    + Same as mouseDown but not preventing event. +Will only take care of first touch. + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __touchStartHandlerMT(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addAudio(id, url) + +
    +
    + Adds an audio to the cache. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + url + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + +
    +
    See:
    + +
    CAAT.Module.Audio.AudioManager.addAudio
    + +
    + + +
    + + +
    + + + addChild(scene) + +
    +
    + Adds an scene to this Director. + + +
    + + + + +
    +
    Parameters:
    + +
    + scene + +
    +
    {CAAT.Foundation.Scene} a scene object.
    + +
    + + + + + + + + +
    + + +
    + + + addDirtyRect(rectangle) + +
    +
    + Add a rectangle to the list of dirty screen areas which should be redrawn. +This is the opposite method to clear the whole screen and repaint everything again. +Despite i'm not very fond of dirty rectangles because it needs some extra calculations, this +procedure has shown to be speeding things up under certain situations. Nevertheless it doesn't or +even lowers performance under others, so it is a developer choice to activate them via a call to +setClear( CAAT.Director.CLEAR_DIRTY_RECTS ). + +This function, not only tracks a list of dirty rectangles, but tries to optimize the list. Overlapping +rectangles will be removed and intersecting ones will be unioned. + +Before calling this method, check if this.dirtyRectsEnabled is true. + + +
    + + + + +
    +
    Parameters:
    + +
    + rectangle + +
    +
    {CAAT.Rectangle}
    + +
    + + + + + + + + +
    + + +
    + + + addHandlers(canvas) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + canvas + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addImage(id, image, noUpdateGL) + +
    +
    + Add a new image to director's image cache. If gl is enabled and the 'noUpdateGL' is not set to true this +function will try to recreate the whole GL texture pages. +If many handcrafted images are to be added to the director, some performance can be achieved by calling +director.addImage(id,image,false) many times and a final call with +director.addImage(id,image,true) to finally command the director to create texture pages. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {string|object} an identitifier to retrieve the image with
    + +
    + image + +
    +
    {Image|HTMLCanvasElement} image to add to cache
    + +
    + noUpdateGL + +
    +
    {!boolean} unless otherwise stated, the director will + try to recreate the texture pages.
    + +
    + + + + + + + + +
    + + +
    + + + addScene(scene) + +
    +
    + Add a new Scene to Director's Scene list. By adding a Scene to the Director +does not mean it will be immediately visible, you should explicitly call either +
      +
    • easeIn +
    • easeInOut +
    • easeInOutRandom +
    • setScene +
    • or any of the scene switching methods +
    + + +
    + + + + +
    +
    Parameters:
    + +
    + scene + +
    +
    {CAAT.Foundation.Scene}
    + +
    + + + + + + + + +
    + + +
    + + + animate(director, time) + +
    +
    + A director is a very special kind of actor. +Its animation routine simple sets its modelViewMatrix in case some transformation's been +applied. +No behaviors are allowed for Director instances. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director} redundant reference to CAAT.Director itself
    + +
    + time + +
    +
    {number} director time.
    + +
    + + + + + + + + +
    + + +
    + + {HTMLElement|null} + audioLoop(id) + +
    +
    + Loops an audio instance identified by the id. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {object} the object used to store a sound in the audioCache.
    + +
    + + + + + +
    +
    Returns:
    + +
    {HTMLElement|null} the value from audioManager.loop
    + +
    + + + + +
    + + +
    + + + audioPlay(id) + +
    +
    + Plays the audio instance identified by the id. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {object} the object used to store a sound in the audioCache.
    + +
    + + + + + + + + +
    + + +
    + + + cancelPlay(id) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + cancelPlayByChannel(audioObject) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + audioObject + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + checkDebug() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + clean() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + createEventHandler() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {CAAT.Scene} + createScene() + +
    +
    + Creates an initializes a Scene object. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Scene}
    + +
    + + + + +
    + + +
    + + + createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + startTime + +
    +
    + +
    + duration + +
    +
    + +
    + callback_timeout + +
    +
    + +
    + callback_tick + +
    +
    + +
    + callback_cancel + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + cumulateOffset(node, parent, prop) + +
    +
    + Acculumate dom elements position to properly offset on-screen mouse/touch events. + + +
    + + + + +
    +
    Parameters:
    + +
    + node + +
    +
    + +
    + parent + +
    +
    + +
    + prop + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + deleteImage(id, noUpdateGL) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + noUpdateGL + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + easeEnd(scene, b_easeIn) + +
    +
    + Scene easing listener. Notifies scenes when they're about to be activated (set as current +director's scene). + + +
    + + + + +
    +
    Parameters:
    + +
    + scene + +
    +
    {CAAT.Foundation.Scene} the scene that has just been brought in or taken out of the director.
    + +
    + b_easeIn + +
    +
    {boolean} scene enters or exits ?
    + +
    + + + + + + + + +
    + + +
    + + + easeIn(inSceneIndex, type, time, alpha, anchor, interpolator) + +
    +
    + This method changes Director's current Scene to the scene index indicated by +inSceneIndex parameter. The Scene running in the director won't be eased out. + + +
    + + + + +
    +
    Parameters:
    + +
    + inSceneIndex + +
    +
    integer indicating the new Scene to set as current.
    + +
    + type + +
    +
    integer indicating the type of transition to apply to bring the new current +Scene to the Director. The values will be one of: CAAT.Scene.prototype.EASE_ROTATION, +CAAT.Scene.prototype.EASE_SCALE, CAAT.Scene.prototype.EASE_TRANSLATION.
    + +
    + time + +
    +
    integer indicating how much time in milliseconds the Scene entrance will take.
    + +
    + alpha + +
    +
    boolean indicating whether alpha transparency fading will be applied to the +entereing Scene.
    + +
    + anchor + +
    +
    integer indicating the anchor to fix for Scene transition. It will be any of +CAAT.Actor.prototype.ANCHOR_* values.
    + +
    + interpolator + +
    +
    an CAAT.Interpolator object indicating the interpolation function to +apply.
    + +
    + + + + + + + +
    +
    See:
    + +
    + +
    + +
    + +
    + + +
    + + +
    + + + easeInOut(inSceneIndex, typein, anchorin, outSceneIndex, typeout, anchorout, time, alpha, interpolatorIn, interpolatorOut) + +
    +
    + This method offers full control over the process of switching between any given two Scenes. +To apply this method, you must specify the type of transition to apply for each Scene and +the anchor to keep the Scene pinned at. +

    +The type of transition will be one of the following values defined in CAAT.Foundation.Scene.prototype: +

      +
    • EASE_ROTATION +
    • EASE_SCALE +
    • EASE_TRANSLATION +
    + +

    +The anchor will be any of these values defined in CAAT.Foundation.Actor: +

      +
    • ANCHOR_CENTER +
    • ANCHOR_TOP +
    • ANCHOR_BOTTOM +
    • ANCHOR_LEFT +
    • ANCHOR_RIGHT +
    • ANCHOR_TOP_LEFT +
    • ANCHOR_TOP_RIGHT +
    • ANCHOR_BOTTOM_LEFT +
    • ANCHOR_BOTTOM_RIGHT +
    + +

    +In example, for an entering scene performing a EASE_SCALE transition, the anchor is the +point by which the scene will scaled. + + +

    + + + + +
    +
    Parameters:
    + +
    + inSceneIndex + +
    +
    integer indicating the Scene index to bring in to the Director.
    + +
    + typein + +
    +
    integer indicating the type of transition to apply to the bringing in Scene.
    + +
    + anchorin + +
    +
    integer indicating the anchor of the bringing in Scene.
    + +
    + outSceneIndex + +
    +
    integer indicating the Scene index to take away from the Director.
    + +
    + typeout + +
    +
    integer indicating the type of transition to apply to the taking away in Scene.
    + +
    + anchorout + +
    +
    integer indicating the anchor of the taking away Scene.
    + +
    + time + +
    +
    inteter indicating the time to perform the process of switchihg between Scene object +in milliseconds.
    + +
    + alpha + +
    +
    boolean boolean indicating whether alpha transparency fading will be applied to +the scenes.
    + +
    + interpolatorIn + +
    +
    CAAT.Behavior.Interpolator object to apply to entering scene.
    + +
    + interpolatorOut + +
    +
    CAAT.Behavior.Interpolator object to apply to exiting scene.
    + +
    + + + + + + + + +
    + + +
    + + + easeInOutRandom(inIndex, outIndex, time, alpha) + +
    +
    + This method will switch between two given Scene indexes (ie, take away scene number 2, +and bring in scene number 5). +

    +It will randomly choose for each Scene the type of transition to apply and the anchor +point of each transition type. +

    +It will also set for different kind of transitions the following interpolators: +

      +
    • EASE_ROTATION -> ExponentialInOutInterpolator, exponent 4. +
    • EASE_SCALE -> ElasticOutInterpolator, 1.1 and .4 +
    • EASE_TRANSLATION -> BounceOutInterpolator +
    + +

    +These are the default values, and could not be changed by now. +This method in final instance delegates the process to easeInOutMethod. + + +

    + + + + +
    +
    Parameters:
    + +
    + inIndex + +
    +
    integer indicating the entering scene index.
    + +
    + outIndex + +
    +
    integer indicating the exiting scene index.
    + +
    + time + +
    +
    integer indicating the time to take for the process of Scene in/out in milliseconds.
    + +
    + alpha + +
    +
    boolean indicating whether alpha transparency fading should be applied to transitions.
    + +
    + + + + + + + +
    +
    See:
    + +
    easeInOutMethod.
    + +
    + + +
    + + +
    + + + emptyScenes() + +
    +
    + Removes Director's scenes. + + +
    + + + + + + + + + + + +
    + + +
    + + + enableEvents(onElement) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + onElement + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + enableResizeEvents(mode, onResizeCallback) + +
    +
    + Enable window resize events and set redimension policy. A callback functio could be supplied +to be notified on a Director redimension event. This is necessary in the case you set a redim +policy not equal to RESIZE_PROPORTIONAL. In those redimension modes, director's area and their +children scenes are resized to fit the new area. But scenes content is not resized, and have +no option of knowing so uless an onResizeCallback function is supplied. + + +
    + + + + +
    +
    Parameters:
    + +
    + mode + +
    +
    {number} RESIZE_BOTH, RESIZE_WIDTH, RESIZE_HEIGHT, RESIZE_NONE.
    + +
    + onResizeCallback + +
    +
    {function(director{CAAT.Director}, width{integer}, height{integer})} a callback +to notify on canvas resize.
    + +
    + + + + + + + + +
    + + +
    + + + endLoop() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + endSound() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + findActorAtPosition(point) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.AudioManager} + getAudioManager() + +
    +
    + Get this Director's AudioManager instance. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.AudioManager} the AudioManager instance.
    + +
    + + + + +
    + + +
    + + {string} + getBrowserName() + +
    +
    + Return the running browser name. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {string} the browser name.
    + +
    + + + + +
    + + +
    + + {string} + getBrowserVersion() + +
    +
    + Return the running browser version. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {string} the browser version.
    + +
    + + + + +
    + + +
    + + + getCanvasCoord(point, e) + +
    +
    + Normalize input event coordinates to be related to (0,0) canvas position. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Math.Point} canvas coordinate.
    + +
    + e + +
    +
    {MouseEvent} a mouse event from an input event.
    + +
    + + + + + + + + +
    + + +
    + + + getCurrentScene() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {number} + getCurrentSceneIndex() + +
    +
    + Return the index of the current scene in the Director's scene list. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number} the current scene's index.
    + +
    + + + + +
    + + +
    + + + getImage(sId) + +
    +
    + Gets the resource with the specified resource name. +The Director holds a collection called imagesCache +where you can store a JSON of the form + [ { id: imageId, image: imageObject } ]. +This structure will be used as a resources cache. +There's a CAAT.Module.ImagePreloader class to preload resources and +generate this structure on loading finalization. + + +
    + + + + +
    +
    Parameters:
    + +
    + sId + +
    +
    {object} an String identifying a resource.
    + +
    + + + + + + + + +
    + + +
    + + {number} + getNumScenes() + +
    +
    + Get the number of scenes contained in the Director. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number} the number of scenes contained in the Director.
    + +
    + + + + +
    + + +
    + + + getOffset(node) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + node + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {string} + getOSName() + +
    +
    + Return the operating system name. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {string} the os name.
    + +
    + + + + +
    + + +
    + + + getRenderType() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {CAAT.Foundation.Scene} + getScene(index) + +
    +
    + Get a concrete director's scene. + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    {number} an integer indicating the scene index.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Foundation.Scene} a CAAT.Scene object instance or null if the index is oob.
    + +
    + + + + +
    + + +
    + + + getSceneById(id) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getSceneIndex(scene) + +
    +
    + Return the index for a given Scene object contained in the Director. + + +
    + + + + +
    +
    Parameters:
    + +
    + scene + +
    +
    {CAAT.Foundation.Scene}
    + +
    + + + + + + + + +
    + + +
    + + + getValueForKey(key) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + key + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + glFlush() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + glRender(vertex, coordsIndex, uv) + +
    +
    + Render buffered elements. + + +
    + + + + +
    +
    Parameters:
    + +
    + vertex + +
    +
    + +
    + coordsIndex + +
    +
    + +
    + uv + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + glReset() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + inDirtyRect() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + initialize(width, height, canvas, proxy) + +
    +
    + This method performs Director initialization. Must be called once. +If the canvas parameter is not set, it will create a Canvas itself, +and the developer must explicitly add the canvas to the desired DOM position. +This method will also set the Canvas dimension to the specified values +by width and height parameters. + + +
    + + + + +
    +
    Parameters:
    + +
    + width + +
    +
    {number} a canvas width
    + +
    + height + +
    +
    {number} a canvas height
    + +
    + canvas + +
    +
    {HTMLCanvasElement=} An optional Canvas object.
    + +
    + proxy + +
    +
    {HTMLElement} this object can be an event proxy in case you'd like to layer different elements + and want events delivered to the correct element.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + initializeGL(width, height, canvas, proxy) + +
    +
    + Experimental. +Initialize a gl enabled director. + + +
    + + + + +
    +
    Parameters:
    + +
    + width + +
    +
    + +
    + height + +
    +
    + +
    + canvas + +
    +
    + +
    + proxy + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + isMusicEnabled() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isSoundEffectsEnabled() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + loop(fps, callback, callback2) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + fps + +
    +
    + +
    + callback + +
    +
    + +
    + callback2 + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseDown(mouseEvent) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseDrag(mouseEvent) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseEnter(mouseEvent) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseExit(mouseEvent) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseMove(mouseEvent) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseUp(mouseEvent) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + musicPlay(id) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + musicStop() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + render(time) + +
    +
    + This is the entry point for the animation system of the Director. +The director is fed with the elapsed time value to maintain a virtual timeline. +This virtual timeline will provide each Scene with its own virtual timeline, and will only +feed time when the Scene is the current Scene, or is being switched. + +If dirty rectangles are enabled and canvas is used for rendering, the dirty rectangles will be +set up as a single clip area. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} integer indicating the elapsed time between two consecutive frames of the +Director.
    + +
    + + + + + + + + +
    + + +
    + + + renderFrame() + +
    +
    + Starts the director animation.If no scene is explicitly selected, the current Scene will +be the first scene added to the Director. +

    +The fps parameter will set the animation quality. Higher values, +means CAAT will try to render more frames in the same second (at the +expense of cpu power at least until hardware accelerated canvas rendering +context are available). A value of 60 is a high frame rate and should not be exceeded. + + +

    + + + + + + + + + + + +
    + + +
    + + + renderToContext(ctx, scene) + +
    +
    + This method draws an Scene to an offscreen canvas. This offscreen canvas is also a child of +another Scene (transitionScene). So instead of drawing two scenes while transitioning from +one to another, first of all an scene is drawn to offscreen, and that image is translated. +

    +Until the creation of this method, both scenes where drawn while transitioning with +its performance penalty since drawing two scenes could be twice as expensive than drawing +only one. +

    +Though a high performance increase, we should keep an eye on memory consumption. + + +

    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    a canvas.getContext('2d') instnce.
    + +
    + scene + +
    +
    {CAAT.Foundation.Scene} the scene to draw offscreen.
    + +
    + + + + + + + + +
    + + +
    + + + requestRepaint() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + resetStats() + +
    +
    + Reset statistics information. + + +
    + + + + + + + + + + + +
    + + +
    + + + resetTimeline() + +
    +
    + If the director has renderingMode: DIRTY, the timeline must be reset to register accurate frame measurement. + + +
    + + + + + + + + + + + +
    + + +
    + + + scheduleDirtyRect(rectangle) + +
    +
    + This method is used when asynchronous operations must produce some dirty rectangle painting. +This means that every operation out of the regular CAAT loop must add dirty rect operations +by calling this method. +For example setVisible() and remove. + + +
    + + + + +
    +
    Parameters:
    + +
    + rectangle + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setAudioFormatExtensions(extensions) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + extensions + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setBounds(x, y, w, h) + +
    +
    + Set this director's bounds as well as its contained scenes. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number} ignored, will be 0.
    + +
    + y + +
    +
    {number} ignored, will be 0.
    + +
    + w + +
    +
    {number} director width.
    + +
    + h + +
    +
    {number} director height.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setClear(clear) + +
    +
    + This method states whether the director must clear background before rendering +each frame. + +The clearing method could be: + + CAAT.Director.CLEAR_ALL. previous to draw anything on screen the canvas will have clearRect called on it. + + CAAT.Director.CLEAR_DIRTY_RECTS. Actors marked as invalid, or which have been moved, rotated or scaled + will have their areas redrawn. + + CAAT.Director.CLEAR_NONE. clears nothing. + + +
    + + + + +
    +
    Parameters:
    + +
    + clear + +
    +
    {CAAT.Director.CLEAR_ALL | CAAT.Director.CLEAR_NONE | CAAT.Director.CLEAR_DIRTY_RECTS}
    + +
    + + + + + +
    +
    Returns:
    + +
    this.
    + +
    + + + + +
    + + +
    + + + setGLCurrentOpacity(opacity) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + opacity + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setGLTexturePage(tp) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + tp + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setImagesCache(imagesCache, tpW, tpH) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + imagesCache + +
    +
    + +
    + tpW + +
    +
    + +
    + tpH + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setMusicEnabled(enabled) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + enabled + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setScaleProportional(w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setScene(sceneIndex) + +
    +
    + Changes (or sets) the current Director scene to the index +parameter. There will be no transition on scene change. + + +
    + + + + +
    +
    Parameters:
    + +
    + sceneIndex + +
    +
    {number} an integer indicating the index of the target Scene +to be shown.
    + +
    + + + + + + + + +
    + + +
    + + + setSoundEffectsEnabled(enabled) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + enabled + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setValueForKey(key, value) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + key + +
    +
    + +
    + value + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setVolume(id, volume) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + volume + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + switchToNextScene(time, alpha, transition) + +
    +
    + Sets the previous Scene in sequence as the current Scene. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} integer indicating the time the Scene transition will take.
    + +
    + alpha + +
    +
    {boolean} a boolean indicating whether Scene transition should be fading.
    + +
    + transition + +
    +
    {boolean} a boolean indicating whether the scene change must smoothly animated.
    + +
    + + + + + + + +
    +
    See:
    + +
    switchToScene.
    + +
    + + +
    + + +
    + + + switchToPrevScene(time, alpha, transition) + +
    +
    + Sets the previous Scene in sequence as the current Scene. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} integer indicating the time the Scene transition will take.
    + +
    + alpha + +
    +
    {boolean} a boolean indicating whether Scene transition should be fading.
    + +
    + transition + +
    +
    {boolean} a boolean indicating whether the scene change must smoothly animated.
    + +
    + + + + + + + +
    +
    See:
    + +
    switchToScene.
    + +
    + + +
    + + +
    + + + switchToScene(iNewSceneIndex, time, alpha, transition) + +
    +
    + This method will change the current Scene by the Scene indicated as parameter. +It will apply random values for anchor and transition type. + + +
    + + + + +
    +
    Parameters:
    + +
    + iNewSceneIndex + +
    +
    {number} an integer indicating the index of the new scene to run on the Director.
    + +
    + time + +
    +
    {number} an integer indicating the time the Scene transition will take.
    + +
    + alpha + +
    +
    {boolean} a boolean indicating whether Scene transition should be fading.
    + +
    + transition + +
    +
    {boolean} a boolean indicating whether the scene change must smoothly animated.
    + +
    + + + + + + + +
    +
    See:
    + +
    easeInOutRandom
    + +
    + + +
    + + +
    + + + updateGLPages() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + windowResized(w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Scene.html b/documentation/jsdoc/symbols/CAAT.Foundation.Scene.html new file mode 100644 index 00000000..838c3591 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.Scene.html @@ -0,0 +1,2384 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.Scene + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.Scene +

    + + +

    + +
    Extends + CAAT.Foundation.ActorContainer.
    + + + + + +
    Defined in: Scene.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   +
    + CAAT.Foundation.Scene.EASE_ROTATION +
    +
    +
    <static>   +
    + CAAT.Foundation.Scene.EASE_SCALE +
    +
    +
    <static>   +
    + CAAT.Foundation.Scene.EASE_TRANSLATE +
    +
    +
    <private>   + +
    Behavior container used uniquely for Scene switching.
    +
    <private>   + +
    Array of container behaviour events observer.
    +
    <private>   +
    + easeIn +
    +
    When Scene switching, this boolean identifies whether the Scene is being brought in, or taken away.
    +
    <private>   +
    + paused +
    +
    is this scene paused ?
    +
    <private>   + +
    This scene´s timer manager.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.ActorContainer:
    activeChildren, addHint, boundingBox, childrenList, layoutInvalidated, layoutManager, pendingChildrenList, runion
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      + +
    This method should be overriden in case the developer wants to do some special actions when +the scene has just been brought in.
    +
      +
    addActorToInputList(actor, index, position) +
    +
    Add an actor to a given inputList.
    +
      +
    addBehavior(behaviour) +
    +
    Overriden method to disallow default behavior.
    +
      +
    behaviorExpired(actor) +
    +
    Private.
    +
    <private>   +
    createAlphaBehaviour(time, isIn) +
    +
    Helper method to manage alpha transparency fading on Scene switch by the Director.
    +
      +
    createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel) +
    +
    +
      +
    easeRotation(time, alpha, anchor, interpolator, isIn) +
    +
    Called from CAAT.Director to use Rotations for taking away or bringing Scenes in.
    +
      +
    easeRotationIn(time, alpha, anchor, interpolator) +
    +
    Called from CAAT.Director to use Rotations for bringing in.
    +
      +
    easeRotationOut(time, alpha, anchor, interpolator) +
    +
    Called from CAAT.Director to use Rotations for taking Scenes away.
    +
      +
    easeScale(time, alpha, anchor, interpolator, starttime, isIn) +
    +
    Called from CAAT.Foundation.Director to bring in ot take away an Scene.
    +
      +
    easeScaleIn(time, alpha, anchor, interpolator, starttime) +
    +
    Called from CAAT.Foundation.Director to bring in a Scene.
    +
      +
    easeScaleOut(time, alpha, anchor, interpolator, starttime) +
    +
    Called from CAAT.Foundation.Director to take away a Scene.
    +
      +
    easeTranslation(time, alpha, anchor, isIn, interpolator) +
    +
    This method will setup Scene behaviours to switch an Scene via a translation.
    +
      +
    easeTranslationIn(time, alpha, anchor, interpolator) +
    +
    Called from CAAT.Director to bring in an Scene.
    +
      +
    easeTranslationOut(time, alpha, anchor, interpolator) +
    +
    Called from CAAT.Director to bring in an Scene.
    +
      +
    emptyInputList(index) +
    +
    Remove all elements from an input list.
    +
      + +
    Enable a number of input lists.
    +
      + +
    Find a pointed actor at position point.
    +
      +
    getIn(out_scene) +
    +
    +
      +
    goOut(in_scene) +
    +
    +
      + +
    +
      +
    paint(director, time) +
    +
    An scene by default does not paint anything because has not fillStyle set.
    +
      +
    removeActorFromInputList(actor, index) +
    +
    remove an actor from a given input list index.
    +
      +
    setEaseListener(listener) +
    +
    Registers a listener for listen for transitions events.
    +
      +
    setExpired(bExpired) +
    +
    Scenes, do not expire the same way Actors do.
    +
      +
    setPaused(paused) +
    +
    +
      +
    setTimeout(duration, callback_timeout, callback_tick, callback_cancel) +
    +
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.ActorContainer:
    __paintActor, __validateLayout, __validateTree, addActor, addActorImmediately, addChild, addChildAt, addChildDelayed, addChildImmediately, animate, destroy, drawScreenBoundingBox, emptyChildren, endAnimate, findActorById, findChild, getChildAt, getLayout, getNumActiveChildren, getNumChildren, invalidateLayout, paintActor, paintActorGL, recalcSize, removeChild, removeChildAt, removeFirstChild, removeLastChild, setBounds, setLayout, setZOrder
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, emptyBehaviorList, enableDrag, enableEvents, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.Scene() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.Foundation.Scene.EASE_ROTATION + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Scene.EASE_SCALE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.Scene.EASE_TRANSLATE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <private> + + + easeContainerBehaviour + +
    +
    + Behavior container used uniquely for Scene switching. + + +
    + + + + + + + + +
    + + +
    <private> + + + easeContainerBehaviourListener + +
    +
    + Array of container behaviour events observer. + + +
    + + + + + + + + +
    + + +
    <private> + + + easeIn + +
    +
    + When Scene switching, this boolean identifies whether the Scene is being brought in, or taken away. + + +
    + + + + + + + + +
    + + +
    <private> + + + paused + +
    +
    + is this scene paused ? + + +
    + + + + + + + + +
    + + +
    <private> + + + timerManager + +
    +
    + This scene´s timer manager. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + activated() + +
    +
    + This method should be overriden in case the developer wants to do some special actions when +the scene has just been brought in. + + +
    + + + + + + + + + + + +
    + + +
    + + + addActorToInputList(actor, index, position) + +
    +
    + Add an actor to a given inputList. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    an actor instance
    + +
    + index + +
    +
    the inputList index to add the actor to. This value will be clamped to the number of +available lists.
    + +
    + position + +
    +
    the position on the selected inputList to add the actor at. This value will be +clamped to the number of available lists.
    + +
    + + + + + + + + +
    + + +
    + + + addBehavior(behaviour) + +
    +
    + Overriden method to disallow default behavior. +Do not use directly. + + +
    + + + + +
    +
    Parameters:
    + +
    + behaviour + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + behaviorExpired(actor) + +
    +
    + Private. +listener for the Scene's easeContainerBehaviour. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + createAlphaBehaviour(time, isIn) + +
    +
    + Helper method to manage alpha transparency fading on Scene switch by the Director. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} time in milliseconds then fading will taableIne.
    + +
    + isIn + +
    +
    {boolean} whether this Scene is being brought in.
    + +
    + + + + + + + + +
    + + +
    + + + createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + startTime + +
    +
    + +
    + duration + +
    +
    + +
    + callback_timeout + +
    +
    + +
    + callback_tick + +
    +
    + +
    + callback_cancel + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + easeRotation(time, alpha, anchor, interpolator, isIn) + +
    +
    + Called from CAAT.Director to use Rotations for taking away or bringing Scenes in. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    integer indicating time in milliseconds for the Scene to be taken away or brought in.
    + +
    + alpha + +
    +
    boolean indicating whether fading will be applied to the Scene.
    + +
    + anchor + +
    +
    integer indicating the Scene switch anchor.
    + +
    + interpolator + +
    +
    {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    + +
    + isIn + +
    +
    boolean indicating whehter the Scene is brought in.
    + +
    + + + + + + + + +
    + + +
    + + + easeRotationIn(time, alpha, anchor, interpolator) + +
    +
    + Called from CAAT.Director to use Rotations for bringing in. +This method is a Helper for the method easeRotation. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    integer indicating time in milliseconds for the Scene to be brought in.
    + +
    + alpha + +
    +
    boolean indicating whether fading will be applied to the Scene.
    + +
    + anchor + +
    +
    integer indicating the Scene switch anchor.
    + +
    + interpolator + +
    +
    {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    + +
    + + + + + + + + +
    + + +
    + + + easeRotationOut(time, alpha, anchor, interpolator) + +
    +
    + Called from CAAT.Director to use Rotations for taking Scenes away. +This method is a Helper for the method easeRotation. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    integer indicating time in milliseconds for the Scene to be taken away.
    + +
    + alpha + +
    +
    boolean indicating whether fading will be applied to the Scene.
    + +
    + anchor + +
    +
    integer indicating the Scene switch anchor.
    + +
    + interpolator + +
    +
    {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    + +
    + + + + + + + + +
    + + +
    + + + easeScale(time, alpha, anchor, interpolator, starttime, isIn) + +
    +
    + Called from CAAT.Foundation.Director to bring in ot take away an Scene. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} time in milliseconds for the Scene to be brought in.
    + +
    + alpha + +
    +
    {boolean} whether fading will be applied to the Scene.
    + +
    + anchor + +
    +
    {number} Scene switch anchor.
    + +
    + interpolator + +
    +
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    + +
    + starttime + +
    +
    {number} scene time milliseconds from which the behavior will be applied.
    + +
    + isIn + +
    +
    boolean indicating whether the Scene is being brought in.
    + +
    + + + + + + + + +
    + + +
    + + + easeScaleIn(time, alpha, anchor, interpolator, starttime) + +
    +
    + Called from CAAT.Foundation.Director to bring in a Scene. +A helper method for easeScale. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} time in milliseconds for the Scene to be brought in.
    + +
    + alpha + +
    +
    {boolean} whether fading will be applied to the Scene.
    + +
    + anchor + +
    +
    {number} Scene switch anchor.
    + +
    + interpolator + +
    +
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    + +
    + starttime + +
    +
    {number} scene time milliseconds from which the behavior will be applied.
    + +
    + + + + + + + + +
    + + +
    + + + easeScaleOut(time, alpha, anchor, interpolator, starttime) + +
    +
    + Called from CAAT.Foundation.Director to take away a Scene. +A helper method for easeScale. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} time in milliseconds for the Scene to be brought in.
    + +
    + alpha + +
    +
    {boolean} whether fading will be applied to the Scene.
    + +
    + anchor + +
    +
    {number} Scene switch anchor.
    + +
    + interpolator + +
    +
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    + +
    + starttime + +
    +
    {number} scene time milliseconds from which the behavior will be applied.
    + +
    + + + + + + + + +
    + + +
    + + + easeTranslation(time, alpha, anchor, isIn, interpolator) + +
    +
    + This method will setup Scene behaviours to switch an Scene via a translation. +The anchor value can only be +
  435. CAAT.Actor.ANCHOR_LEFT +
  436. CAAT.Actor.ANCHOR_RIGHT +
  437. CAAT.Actor.ANCHOR_TOP +
  438. CAAT.Actor.ANCHOR_BOTTOM +if any other value is specified, any of the previous ones will be applied. + + +
  439. + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} time in milliseconds for the Scene.
    + +
    + alpha + +
    +
    {boolean} whether fading will be applied to the Scene.
    + +
    + anchor + +
    +
    {numnber} Scene switch anchor.
    + +
    + isIn + +
    +
    {boolean} whether the scene will be brought in.
    + +
    + interpolator + +
    +
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    + +
    + + + + + + + + +
    + + +
    + + + easeTranslationIn(time, alpha, anchor, interpolator) + +
    +
    + Called from CAAT.Director to bring in an Scene. +A helper method for easeTranslation. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} time in milliseconds for the Scene to be brought in.
    + +
    + alpha + +
    +
    {boolean} whether fading will be applied to the Scene.
    + +
    + anchor + +
    +
    {number} Scene switch anchor.
    + +
    + interpolator + +
    +
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    + +
    + + + + + + + + +
    + + +
    + + + easeTranslationOut(time, alpha, anchor, interpolator) + +
    +
    + Called from CAAT.Director to bring in an Scene. +A helper method for easeTranslation. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} time in milliseconds for the Scene to be taken away.
    + +
    + alpha + +
    +
    {boolean} fading will be applied to the Scene.
    + +
    + anchor + +
    +
    {number} Scene switch anchor.
    + +
    + interpolator + +
    +
    {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    + +
    + + + + + + + + +
    + + +
    + + + emptyInputList(index) + +
    +
    + Remove all elements from an input list. + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    the inputList index to add the actor to. This value will be clamped to the number of +available lists so take care when emptying a non existant inputList index since you could end up emptying +an undesired input list.
    + +
    + + + + + + + + +
    + + +
    + + + enableInputList(size) + +
    +
    + Enable a number of input lists. +These lists are set in case the developer doesn't want the to traverse the scene graph to find the pointed +actor. The lists are a shortcut whete the developer can set what actors to look for input at first instance. +The system will traverse the whole lists in order trying to find a pointed actor. + +Elements are added to each list either in head or tail. + + +
    + + + + +
    +
    Parameters:
    + +
    + size + +
    +
    number of lists.
    + +
    + + + + + + + + +
    + + +
    + + + findActorAtPosition(point) + +
    +
    + Find a pointed actor at position point. +This method tries lo find the correctly pointed actor in two different ways. + + first of all, if inputList is defined, it will look for an actor in it. + + if no inputList is defined, it will traverse the scene graph trying to find a pointed actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getIn(out_scene) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + out_scene + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + goOut(in_scene) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + in_scene + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + isPaused() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + paint(director, time) + +
    +
    + An scene by default does not paint anything because has not fillStyle set. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + removeActorFromInputList(actor, index) + +
    +
    + remove an actor from a given input list index. +If no index is supplied, the actor will be removed from every input list. + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    + +
    + index + +
    +
    an optional input list index. This value will be clamped to the number of +available lists.
    + +
    + + + + + + + + +
    + + +
    + + + setEaseListener(listener) + +
    +
    + Registers a listener for listen for transitions events. +Al least, the Director registers himself as Scene easing transition listener. +When the transition is done, it restores the Scene's capability of receiving events. + + +
    + + + + +
    +
    Parameters:
    + +
    + listener + +
    +
    {function(caat_behavior,time,actor)} an object which contains a method of the form +behaviorExpired( caat_behaviour, time, actor);
    + +
    + + + + + + + + +
    + + +
    + + + setExpired(bExpired) + +
    +
    + Scenes, do not expire the same way Actors do. +It simply will be set expired=true, but the frameTime won't be modified. + + +
    + + + + +
    +
    Parameters:
    + +
    + bExpired + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPaused(paused) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + paused + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setTimeout(duration, callback_timeout, callback_tick, callback_cancel) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + duration + +
    +
    + +
    + callback_timeout + +
    +
    + +
    + callback_tick + +
    +
    + +
    + callback_cancel + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImage.html b/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImage.html new file mode 100644 index 00000000..31cf4d2f --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImage.html @@ -0,0 +1,4134 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.SpriteImage + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.SpriteImage +

    + + +

    + + + + + + +
    Defined in: SpriteImage.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    an Array defining the sprite frame sequence
    +
      + +
    This property allows to have multiple different animations defined for one actor.
    +
      +
    + callback +
    +
    When an animation sequence ends, this callback function will be called.
    +
      +
    + changeFPS +
    +
    how much Scene time to take before changing an Sprite frame.
    +
      +
    + columns +
    +
    Number of columns.
    +
      + +
    current animation name
    +
      +
    + fontScale +
    +
    pending: refactor -> font scale to a font object.
    +
      +
    + height +
    +
    This sprite image image´s width
    +
      +
    + image +
    +
    Image to get frames from.
    +
      +
    + map +
    +
    If the sprite image is defined out of a JSON object (sprite packer for example), this is +the subimages original definition map.
    +
      +
    + mapInfo +
    +
    If the sprite image is defined out of a JSON object (sprite packer for example), this is +the subimages calculated definition map.
    +
      +
    + offsetX +
    +
    Displacement offset to get the sub image from.
    +
      +
    + offsetY +
    +
    Displacement offset to get the sub image from.
    +
      + +
    The actor this sprite image belongs to.
    +
      + +
    When nesting sprite images, this value is the star X position of this sprite image in the parent.
    +
      + +
    When nesting sprite images, this value is the star Y position of this sprite image in the parent.
    +
      + +
    Previous animation frame time.
    +
      +
    + prevIndex +
    +
    current index of sprite frames array.
    +
      +
    + rows +
    +
    Number of rows
    +
      + +
    For each element in the sprite image array, its height.
    +
      + +
    For each element in the sprite image array, its size.
    +
      + +
    the current sprite frame
    +
    <static>   +
    + CAAT.Foundation.SpriteImage.TR_FIXED_TO_SIZE +
    +
    +
    <static>   +
    + CAAT.Foundation.SpriteImage.TR_FIXED_WIDTH_TO_SIZE +
    +
    +
    <static>   +
    + CAAT.Foundation.SpriteImage.TR_FLIP_ALL +
    +
    +
    <static>   +
    + CAAT.Foundation.SpriteImage.TR_FLIP_HORIZONTAL +
    +
    +
    <static>   +
    + CAAT.Foundation.SpriteImage.TR_FLIP_VERTICAL +
    +
    +
    <static>   +
    + CAAT.Foundation.SpriteImage.TR_NONE +
    +
    +
    <static>   +
    + CAAT.Foundation.SpriteImage.TR_TILE +
    +
    +
      + +
    any of the TR_* constants.
    +
      +
    + width +
    +
    This sprite image image´s width
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    addAnimation(name, array, time, callback) +
    +
    Add an animation to this sprite image.
    +
      +
    addElement(key, value) +
    +
    Add one element to the spriteImage.
    +
      + +
    Create elements as director.getImage values.
    +
      +
    copy(other) +
    +
    +
      +
    drawText(str, ctx, x, y) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    getMapInfo(index) +
    +
    +
      + +
    Get the number of subimages in this compoundImage
    +
      + +
    +
      +
    getRef() +
    +
    Get a reference to the same image information (rows, columns, image and uv cache) of this +SpriteImage.
    +
      +
    getRows() +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    initialize(image, rows, columns) +
    +
    Initialize a grid of subimages out of a given image.
    +
      +
    initializeAsFontMap(image, chars) +
    +
    +
      + +
    +
      + +
    This method creates a font sprite image based on a proportional font +It assumes the font is evenly spaced in the image +Example: +var font = new CAAT.SpriteImage().initializeAsMonoTypeFontMap( + director.getImage('numbers'), + "0123456789" +);
    +
      + +
    +
      +
    initializeFromMap(image, map) +
    +
    This method takes the output generated from the tool at http://labs.hyperandroid.com/static/texture/spriter.html +and creates a map into that image.
    +
      + +
    +
      +
    paintAtRect(director, time, x, y, w, h) +
    +
    +
      +
    paintChunk(ctx, dx, dy, x, y, w, h) +
    +
    +
      +
    paintInvertedH(director, time, x, y) +
    +
    Draws the subimage pointed by imageIndex horizontally inverted.
    +
      +
    paintInvertedHV(director, time, x, y) +
    +
    Draws the subimage pointed by imageIndex both horizontal and vertically inverted.
    +
      +
    paintInvertedV(director, time, x, y) +
    +
    Draws the subimage pointed by imageIndex vertically inverted.
    +
      +
    paintN(director, time, x, y) +
    +
    Draws the subimage pointed by imageIndex.
    +
      +
    paintScaled(director, time, x, y) +
    +
    Draws the subimage pointed by imageIndex scaled to the size of w and h.
    +
      +
    paintScaledWidth(director, time, x, y) +
    +
    Draws the subimage pointed by imageIndex.
    +
      +
    paintTile(ctx, index, x, y) +
    +
    +
      +
    paintTiled(director, time, x, y) +
    +
    Must be used to draw actor background and the actor should have setClip(true) so that the image tiles +properly.
    +
      +
    playAnimation(name) +
    +
    Start playing a SpriteImage animation.
    +
      + +
    +
      + +
    +
      +
    setAnimationImageIndex(aAnimationImageIndex) +
    +
    Set the sprite animation images index.
    +
      +
    setChangeFPS(fps) +
    +
    Set the elapsed time needed to change the image index.
    +
      +
    setOffset(x, y) +
    +
    +
      + +
    Set horizontal displacement to draw image.
    +
      + +
    Set vertical displacement to draw image.
    +
      +
    setOwner(actor) +
    +
    +
      +
    setSpriteIndex(index) +
    +
    +
      + +
    Draws the sprite image calculated and stored in spriteIndex.
    +
      +
    setSpriteTransformation(transformation) +
    +
    Set the transformation to apply to the Sprite image.
    +
      +
    setUV(uvBuffer, uvIndex) +
    +
    +
      + +
    +
      +
    stringWidth(str) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.SpriteImage() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + animationImageIndex + +
    +
    + an Array defining the sprite frame sequence + + +
    + + + + + + + + +
    + + +
    + + + animationsMap + +
    +
    + This property allows to have multiple different animations defined for one actor. +see demo31 for a sample. + + +
    + + + + + + + + +
    + + +
    + + + callback + +
    +
    + When an animation sequence ends, this callback function will be called. + + +
    + + + + + + + + +
    + + +
    + + + changeFPS + +
    +
    + how much Scene time to take before changing an Sprite frame. + + +
    + + + + + + + + +
    + + +
    + + + columns + +
    +
    + Number of columns. + + +
    + + + + + + + + +
    + + +
    + + + currentAnimation + +
    +
    + current animation name + + +
    + + + + + + + + +
    + + +
    + + + fontScale + +
    +
    + pending: refactor -> font scale to a font object. + + +
    + + + + + + + + +
    + + +
    + + + height + +
    +
    + This sprite image image´s width + + +
    + + + + + + + + +
    + + +
    + + + image + +
    +
    + Image to get frames from. + + +
    + + + + + + + + +
    + + +
    + + + map + +
    +
    + If the sprite image is defined out of a JSON object (sprite packer for example), this is +the subimages original definition map. + + +
    + + + + + + + + +
    + + +
    + + + mapInfo + +
    +
    + If the sprite image is defined out of a JSON object (sprite packer for example), this is +the subimages calculated definition map. + + +
    + + + + + + + + +
    + + +
    + + + offsetX + +
    +
    + Displacement offset to get the sub image from. Useful to make images shift. + + +
    + + + + + + + + +
    + + +
    + + + offsetY + +
    +
    + Displacement offset to get the sub image from. Useful to make images shift. + + +
    + + + + + + + + +
    + + +
    + + + ownerActor + +
    +
    + The actor this sprite image belongs to. + + +
    + + + + + + + + +
    + + +
    + + + parentOffsetX + +
    +
    + When nesting sprite images, this value is the star X position of this sprite image in the parent. + + +
    + + + + + + + + +
    + + +
    + + + parentOffsetY + +
    +
    + When nesting sprite images, this value is the star Y position of this sprite image in the parent. + + +
    + + + + + + + + +
    + + +
    + + + prevAnimationTime + +
    +
    + Previous animation frame time. + + +
    + + + + + + + + +
    + + +
    + + + prevIndex + +
    +
    + current index of sprite frames array. + + +
    + + + + + + + + +
    + + +
    + + + rows + +
    +
    + Number of rows + + +
    + + + + + + + + +
    + + +
    + + + singleHeight + +
    +
    + For each element in the sprite image array, its height. + + +
    + + + + + + + + +
    + + +
    + + + singleWidth + +
    +
    + For each element in the sprite image array, its size. + + +
    + + + + + + + + +
    + + +
    + + + spriteIndex + +
    +
    + the current sprite frame + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.SpriteImage.TR_FIXED_TO_SIZE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.SpriteImage.TR_FIXED_WIDTH_TO_SIZE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.SpriteImage.TR_FLIP_ALL + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.SpriteImage.TR_FLIP_HORIZONTAL + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.SpriteImage.TR_FLIP_VERTICAL + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.SpriteImage.TR_NONE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.SpriteImage.TR_TILE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + transformation + +
    +
    + any of the TR_* constants. + + +
    + + + + + + + + +
    + + +
    + + + width + +
    +
    + This sprite image image´s width + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + addAnimation(name, array, time, callback) + +
    +
    + Add an animation to this sprite image. +An animation is defines by an array of pretend-to-be-played sprite sequence. + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    {string} animation name.
    + +
    + array + +
    +
    {Array} the sprite animation sequence array. It can be defined + as number array for Grid-like sprite images or strings for a map-like sprite + image.
    + +
    + time + +
    +
    {number} change animation sequence every 'time' ms.
    + +
    + callback + +
    +
    {function({SpriteImage},{string}} a callback function to invoke when the sprite + animation sequence has ended.
    + +
    + + + + + + + + +
    + + +
    + + {*} + addElement(key, value) + +
    +
    + Add one element to the spriteImage. + + +
    + + + + +
    +
    Parameters:
    + +
    + key + +
    +
    {string|number} index or sprite identifier.
    + +
    + value + +
    +
    object{ + x: {number}, + y: {number}, + width: {number}, + height: {number}, + xoffset: {number=}, + yoffset: {number=}, + xadvance: {number=} + }
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + addElementsAsImages(prefix) + +
    +
    + Create elements as director.getImage values. +Create as much as elements defined in this sprite image. +The elements will be named prefix+ + + +
    + + + + +
    +
    Parameters:
    + +
    + prefix + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + copy(other) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + other + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + drawText(str, ctx, x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + str + +
    +
    + +
    + ctx + +
    +
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getColumns() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getCurrentSpriteImageCSSPosition() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getFontData() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getHeight() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getMapInfo(index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {number} + getNumImages() + +
    +
    + Get the number of subimages in this compoundImage + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + getOwnerActor() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getRef() + +
    +
    + Get a reference to the same image information (rows, columns, image and uv cache) of this +SpriteImage. This means that re-initializing this objects image info (that is, calling initialize +method) will change all reference's image information at the same time. + + +
    + + + + + + + + + + + +
    + + +
    + + + getRows() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getWidth() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getWrappedImageHeight() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getWrappedImageWidth() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + initialize(image, rows, columns) + +
    +
    + Initialize a grid of subimages out of a given image. + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    {HTMLImageElement|Image} an image object.
    + +
    + rows + +
    +
    {number} number of rows.
    + +
    + columns + +
    +
    {number} number of columns
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + initializeAsFontMap(image, chars) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    + +
    + chars + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + initializeAsGlyphDesigner(image, map) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    {Image|HTMLImageElement|Canvas}
    + +
    + map + +
    +
    object with pairs "" : { + id : {number}, + height : {number}, + xoffset : {number}, + letter : {string}, + yoffset : {number}, + width : {number}, + xadvance: {number}, + y : {number}, + x : {number} + }
    + +
    + + + + + + + + +
    + +
    +
    + + + initializeAsMonoTypeFontMap(image, chars) + +
    +
    + This method creates a font sprite image based on a proportional font +It assumes the font is evenly spaced in the image +Example: +var font = new CAAT.SpriteImage().initializeAsMonoTypeFontMap( + director.getImage('numbers'), + "0123456789" +); + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    + +
    + chars + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + initializeFromGlyphDesigner(text) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + text + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + initializeFromMap(image, map) + +
    +
    + This method takes the output generated from the tool at http://labs.hyperandroid.com/static/texture/spriter.html +and creates a map into that image. + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    {Image|HTMLImageElement|Canvas} an image
    + +
    + map + +
    +
    {object} the map into the image to define subimages.
    + +
    + + + + + + + + +
    + + +
    + + + initializeFromTexturePackerJSON(image, obj) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    + +
    + obj + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + paintAtRect(director, time, x, y, w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + time + +
    +
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + paintChunk(ctx, dx, dy, x, y, w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    + +
    + dx + +
    +
    + +
    + dy + +
    +
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + paintInvertedH(director, time, x, y) + +
    +
    + Draws the subimage pointed by imageIndex horizontally inverted. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Foundation.Director}
    + +
    + time + +
    +
    {number} scene time.
    + +
    + x + +
    +
    {number} x position in canvas to draw the image.
    + +
    + y + +
    +
    {number} y position in canvas to draw the image.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + paintInvertedHV(director, time, x, y) + +
    +
    + Draws the subimage pointed by imageIndex both horizontal and vertically inverted. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Foundation.Director}
    + +
    + time + +
    +
    {number} scene time.
    + +
    + x + +
    +
    {number} x position in canvas to draw the image.
    + +
    + y + +
    +
    {number} y position in canvas to draw the image.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + paintInvertedV(director, time, x, y) + +
    +
    + Draws the subimage pointed by imageIndex vertically inverted. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Foundation.Director}
    + +
    + time + +
    +
    {number} scene time.
    + +
    + x + +
    +
    {number} x position in canvas to draw the image.
    + +
    + y + +
    +
    {number} y position in canvas to draw the image.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + paintN(director, time, x, y) + +
    +
    + Draws the subimage pointed by imageIndex. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Foundation.Director}
    + +
    + time + +
    +
    {number} scene time.
    + +
    + x + +
    +
    {number} x position in canvas to draw the image.
    + +
    + y + +
    +
    {number} y position in canvas to draw the image.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + paintScaled(director, time, x, y) + +
    +
    + Draws the subimage pointed by imageIndex scaled to the size of w and h. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Foundation.Director}
    + +
    + time + +
    +
    {number} scene time.
    + +
    + x + +
    +
    {number} x position in canvas to draw the image.
    + +
    + y + +
    +
    {number} y position in canvas to draw the image.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + paintScaledWidth(director, time, x, y) + +
    +
    + Draws the subimage pointed by imageIndex. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Foundation.Director}
    + +
    + time + +
    +
    {number} scene time.
    + +
    + x + +
    +
    {number} x position in canvas to draw the image.
    + +
    + y + +
    +
    {number} y position in canvas to draw the image.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + paintTile(ctx, index, x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    + +
    + index + +
    +
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + paintTiled(director, time, x, y) + +
    +
    + Must be used to draw actor background and the actor should have setClip(true) so that the image tiles +properly. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + time + +
    +
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + playAnimation(name) + +
    +
    + Start playing a SpriteImage animation. +If it does not exist, nothing happens. + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + resetAnimationTime() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + setAnimationEndCallback(f) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + f + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setAnimationImageIndex(aAnimationImageIndex) + +
    +
    + Set the sprite animation images index. This method accepts an array of objects which define indexes to +subimages inside this sprite image. +If the SpriteImage is instantiated by calling the method initialize( image, rows, cols ), the value of +aAnimationImageIndex should be an array of numbers, which define the indexes into an array of subimages +with size rows*columns. +If the method InitializeFromMap( image, map ) is called, the value for aAnimationImageIndex is expected +to be an array of strings which are the names of the subobjects contained in the map object. + + +
    + + + + +
    +
    Parameters:
    + +
    + aAnimationImageIndex + +
    +
    an array indicating the Sprite's frames.
    + +
    + + + + + + + + +
    + + +
    + + + setChangeFPS(fps) + +
    +
    + Set the elapsed time needed to change the image index. + + +
    + + + + +
    +
    Parameters:
    + +
    + fps + +
    +
    an integer indicating the time in milliseconds to change.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setOffset(x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setOffsetX(x) + +
    +
    + Set horizontal displacement to draw image. Positive values means drawing the image more to the +right. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setOffsetY(y) + +
    +
    + Set vertical displacement to draw image. Positive values means drawing the image more to the +bottom. + + +
    + + + + +
    +
    Parameters:
    + +
    + y + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setOwner(actor) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setSpriteIndex(index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setSpriteIndexAtTime(time) + +
    +
    + Draws the sprite image calculated and stored in spriteIndex. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} Scene time when the bounding box is to be drawn.
    + +
    + + + + + + + + +
    + + +
    + + + setSpriteTransformation(transformation) + +
    +
    + Set the transformation to apply to the Sprite image. +Any value of +
  440. TR_NONE +
  441. TR_FLIP_HORIZONTAL +
  442. TR_FLIP_VERTICAL +
  443. TR_FLIP_ALL + + +
  444. + + + + +
    +
    Parameters:
    + +
    + transformation + +
    +
    an integer indicating one of the previous values.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setUV(uvBuffer, uvIndex) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + uvBuffer + +
    +
    + +
    + uvIndex + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + stringHeight() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + stringWidth(str) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + str + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageAnimationHelper.html b/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageAnimationHelper.html new file mode 100644 index 00000000..a5ac63b7 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageAnimationHelper.html @@ -0,0 +1,744 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.SpriteImageAnimationHelper + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.SpriteImageAnimationHelper +

    + + +

    + + + + + + +
    Defined in: SpriteImageAnimationHelper.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    Define an animation frame sequence, name it and supply with a callback which be called when the +sequence ends playing.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + animation +
    +
    A sequence of integer values defining a frame animation.
    +
      + +
    Call this callback function when the sequence ends.
    +
      +
    + time +
    +
    Time between any two animation frames.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(animation, time, onEndPlayCallback) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.SpriteImageAnimationHelper() +
    + +
    + Define an animation frame sequence, name it and supply with a callback which be called when the +sequence ends playing. + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + animation + +
    +
    + A sequence of integer values defining a frame animation. +For example [1,2,3,4,3,2,3,4,3,2] +Array. + + +
    + + + + + + + + +
    + + +
    + + + onEndPlayCallback + +
    +
    + Call this callback function when the sequence ends. + + +
    + + + + + + + + +
    + + +
    + + + time + +
    +
    + Time between any two animation frames. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(animation, time, onEndPlayCallback) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + animation + +
    +
    + +
    + time + +
    +
    + +
    + onEndPlayCallback + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageHelper.html b/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageHelper.html new file mode 100644 index 00000000..e5838e0e --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.SpriteImageHelper.html @@ -0,0 +1,702 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.SpriteImageHelper + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.SpriteImageHelper +

    + + +

    + + + + + + +
    Defined in: SpriteImageHelper.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    Define a drawable sub-image inside a bigger image as an independant drawable item.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(x, y, w, h, iw, ih) +
    +
    +
      +
    setGL(u, v, u1, v1) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.SpriteImageHelper() +
    + +
    + Define a drawable sub-image inside a bigger image as an independant drawable item. + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(x, y, w, h, iw, ih) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + iw + +
    +
    + +
    + ih + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setGL(u, v, u1, v1) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + u + +
    +
    + +
    + v + +
    +
    + +
    + u1 + +
    +
    + +
    + v1 + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerManager.html b/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerManager.html new file mode 100644 index 00000000..56babdf2 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerManager.html @@ -0,0 +1,953 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.Timer.TimerManager + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.Timer.TimerManager +

    + + +

    + + + + + + +
    Defined in: TimerManager.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   +
    + timerList +
    +
    Collection of registered timers.
    +
    <private>   + +
    Index sequence to idenfity registered timers.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    checkTimers(time) +
    +
    Check and apply timers in frame time.
    +
      +
    createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel, scene) +
    +
    Creates a timer task.
    +
      +
    ensureTimerTask(timertask) +
    +
    Make sure the timertask is contained in the timer task list by adding it to the list in case it +is not contained.
    +
      +
    hasTimer(timertask) +
    +
    Check whether the timertask is in this scene's timer task list.
    +
      + +
    Removes expired timers.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.Timer.TimerManager() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + timerList + +
    +
    + Collection of registered timers. + + +
    + + + + + + + + +
    + + +
    <private> + + + timerSequence + +
    +
    + Index sequence to idenfity registered timers. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + checkTimers(time) + +
    +
    + Check and apply timers in frame time. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} the current Scene time.
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.TimerTask} + createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel, scene) + +
    +
    + Creates a timer task. Timertask object live and are related to scene's time, so when an Scene +is taken out of the Director the timer task is paused, and resumed on Scene restoration. + + +
    + + + + +
    +
    Parameters:
    + +
    + startTime + +
    +
    {number} an integer indicating the scene time this task must start executing at.
    + +
    + duration + +
    +
    {number} an integer indicating the timerTask duration.
    + +
    + callback_timeout + +
    +
    {function} timer on timeout callback function.
    + +
    + callback_tick + +
    +
    {function} timer on tick callback function.
    + +
    + callback_cancel + +
    +
    {function} timer on cancel callback function.
    + +
    + scene + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.TimerTask} a CAAT.TimerTask class instance.
    + +
    + + + + +
    + + +
    + + + ensureTimerTask(timertask) + +
    +
    + Make sure the timertask is contained in the timer task list by adding it to the list in case it +is not contained. + + +
    + + + + +
    +
    Parameters:
    + +
    + timertask + +
    +
    {CAAT.Foundation.Timer.TimerTask}.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {boolean} + hasTimer(timertask) + +
    +
    + Check whether the timertask is in this scene's timer task list. + + +
    + + + + +
    +
    Parameters:
    + +
    + timertask + +
    +
    {CAAT.Foundation.Timer.TimerTask}.
    + +
    + + + + + +
    +
    Returns:
    + +
    {boolean} a boolean indicating whether the timertask is in this scene or not.
    + +
    + + + + +
    + + +
    + + + removeExpiredTimers() + +
    +
    + Removes expired timers. This method must not be called directly. + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerTask.html b/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerTask.html new file mode 100644 index 00000000..26095a9d --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.Timer.TimerTask.html @@ -0,0 +1,1178 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.Timer.TimerTask + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.Timer.TimerTask +

    + + +

    + + + + + + +
    Defined in: TimerTask.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    This callback will be called when the timer is cancelled.
    +
      + +
    This callback will be called whenever the timer is checked in time.
    +
      + +
    This callback will be called only once, when the timer expires.
    +
      +
    + duration +
    +
    Timer duration.
    +
      +
    + owner +
    +
    What TimerManager instance owns this task.
    +
      +
    + remove +
    +
    Remove this timer task on expiration/cancellation ?
    +
      +
    + scene +
    +
    Scene or director instance that owns this TimerTask owner.
    +
      +
    + startTime +
    +
    Timer start time.
    +
      +
    + taskId +
    +
    An arbitrry id.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    addTime(time) +
    +
    +
      +
    cancel() +
    +
    Cancels this timer by removing it on scene's next frame.
    +
      +
    checkTask(time) +
    +
    Performs TimerTask operation.
    +
      +
    create(startTime, duration, callback_timeout, callback_tick, callback_cancel) +
    +
    Create a TimerTask.
    +
      + +
    +
      +
    reset(time) +
    +
    Reschedules this TimerTask by changing its startTime to current scene's time.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.Timer.TimerTask() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + callback_cancel + +
    +
    + This callback will be called when the timer is cancelled. + + +
    + + + + + + + + +
    + + +
    + + + callback_tick + +
    +
    + This callback will be called whenever the timer is checked in time. + + +
    + + + + + + + + +
    + + +
    + + + callback_timeout + +
    +
    + This callback will be called only once, when the timer expires. + + +
    + + + + + + + + +
    + + +
    + + + duration + +
    +
    + Timer duration. + + +
    + + + + + + + + +
    + + +
    + + + owner + +
    +
    + What TimerManager instance owns this task. + + +
    + + + + + + + + +
    + + +
    + + + remove + +
    +
    + Remove this timer task on expiration/cancellation ? + + +
    + + + + + + + + +
    + + +
    + + + scene + +
    +
    + Scene or director instance that owns this TimerTask owner. + + +
    + + + + + + + + +
    + + +
    + + + startTime + +
    +
    + Timer start time. Relative to Scene or Director time, depending who owns this TimerTask. + + +
    + + + + + + + + +
    + + +
    + + + taskId + +
    +
    + An arbitrry id. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + + addTime(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + cancel() + +
    +
    + Cancels this timer by removing it on scene's next frame. The function callback_cancel will +be called. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + checkTask(time) + +
    +
    + Performs TimerTask operation. The task will check whether it is in frame time, and will +either notify callback_timeout or callback_tick. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} an integer indicating scene time.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + create(startTime, duration, callback_timeout, callback_tick, callback_cancel) + +
    +
    + Create a TimerTask. +The taskId will be set by the scene. + + +
    + + + + +
    +
    Parameters:
    + +
    + startTime + +
    +
    {number} an integer indicating TimerTask enable time.
    + +
    + duration + +
    +
    {number} an integer indicating TimerTask duration.
    + +
    + callback_timeout + +
    +
    {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on timeout callback function.
    + +
    + callback_tick + +
    +
    {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on tick callback function.
    + +
    + callback_cancel + +
    +
    {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on cancel callback function.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + remainingTime() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + reset(time) + +
    +
    + Reschedules this TimerTask by changing its startTime to current scene's time. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} an integer indicating scene time.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.Timer.html b/documentation/jsdoc/symbols/CAAT.Foundation.Timer.html new file mode 100644 index 00000000..1085319b --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.Timer.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.Timer + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Foundation.Timer +

    + + +

    + + + + + + +
    Defined in: TimerManager.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Foundation.Timer +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Dock.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Dock.html new file mode 100644 index 00000000..37ec6f26 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Dock.html @@ -0,0 +1,1490 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.Dock + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.Dock +

    + + +

    + +
    Extends + CAAT.Foundation.ActorContainer.
    + + + + + +
    Defined in: Dock.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + layoutOp +
    +
    Any value from CAAT.Foundation.Dock.UI.OP_LAYOUT_*
    +
      +
    + maxSize +
    +
    max contained actor size
    +
      +
    + minSize +
    +
    min contained actor size.
    +
    <static>   +
    + CAAT.Foundation.UI.Dock.OP_LAYOUT_BOTTOM +
    +
    +
    <static>   +
    + CAAT.Foundation.UI.Dock.OP_LAYOUT_LEFT +
    +
    +
    <static>   +
    + CAAT.Foundation.UI.Dock.OP_LAYOUT_RIGHT +
    +
    +
    <static>   +
    + CAAT.Foundation.UI.Dock.OP_LAYOUT_TOP +
    +
    +
      +
    + range +
    +
    aproximated number of elements affected.
    +
      +
    + scene +
    +
    scene the actor is in.
    +
      +
    + ttask +
    +
    resetting dimension timer task.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.ActorContainer:
    activeChildren, addHint, boundingBox, childrenList, layoutInvalidated, layoutManager, pendingChildrenList, runion
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    actorMouseEnter(mouseEvent) +
    +
    Perform the beginning of docking elements.
    +
    <private>   +
    actorMouseExit(mouseEvent) +
    +
    Perform the process of exiting the docking element, that is, animate elements to the minimum +size.
    +
    <private>   + +
    Performs operation when the mouse is not in the dock element.
    +
    <private>   +
    actorPointed(x, y, pointedActor) +
    +
    Perform the process of pointing a docking actor.
    +
      +
    addChild(actor) +
    +
    Adds an actor to Dock.
    +
      +
    initialize(scene) +
    +
    +
    <private>   +
    layout() +
    +
    Lay out the docking elements.
    +
      +
    mouseExit(mouseEvent) +
    +
    +
      +
    mouseMove(mouseEvent) +
    +
    +
      + +
    Set the number of elements that will be affected (zoomed) when the mouse is inside the component.
    +
      + +
    Set layout orientation.
    +
      +
    setSizes(min, max) +
    +
    Set maximum and minimum size of docked elements.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.ActorContainer:
    __init, __paintActor, __validateLayout, __validateTree, addActor, addActorImmediately, addChildAt, addChildDelayed, addChildImmediately, animate, destroy, drawScreenBoundingBox, emptyChildren, endAnimate, findActorAtPosition, findActorById, findChild, getChildAt, getLayout, getNumActiveChildren, getNumChildren, invalidateLayout, paintActor, paintActorGL, recalcSize, removeChild, removeChildAt, removeFirstChild, removeLastChild, setBounds, setLayout, setZOrder
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, emptyBehaviorList, enableDrag, enableEvents, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseOut, mouseOver, mouseUp, moveTo, paint, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.Dock() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + layoutOp + +
    +
    + Any value from CAAT.Foundation.Dock.UI.OP_LAYOUT_* + + +
    + + + + + + + + +
    + + +
    + + + maxSize + +
    +
    + max contained actor size + + +
    + + + + + + + + +
    + + +
    + + + minSize + +
    +
    + min contained actor size. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.UI.Dock.OP_LAYOUT_BOTTOM + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.UI.Dock.OP_LAYOUT_LEFT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.UI.Dock.OP_LAYOUT_RIGHT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.UI.Dock.OP_LAYOUT_TOP + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + range + +
    +
    + aproximated number of elements affected. + + +
    + + + + + + + + +
    + + +
    + + + scene + +
    +
    + scene the actor is in. + + +
    + + + + + + + + +
    + + +
    + + + ttask + +
    +
    + resetting dimension timer task. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + actorMouseEnter(mouseEvent) + +
    +
    + Perform the beginning of docking elements. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.MouseEvent} a CAAT.MouseEvent object.
    + +
    + + + + + + + + +
    + + +
    <private> + + + actorMouseExit(mouseEvent) + +
    +
    + Perform the process of exiting the docking element, that is, animate elements to the minimum +size. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.MouseEvent} a CAAT.MouseEvent object.
    + +
    + + + + + + + + +
    + + +
    <private> + + + actorNotPointed() + +
    +
    + Performs operation when the mouse is not in the dock element. + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + actorPointed(x, y, pointedActor) + +
    +
    + Perform the process of pointing a docking actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number}
    + +
    + y + +
    +
    {number}
    + +
    + pointedActor + +
    +
    {CAAT.Actor}
    + +
    + + + + + + + + +
    + + +
    + + + addChild(actor) + +
    +
    + Adds an actor to Dock. +

    +Be aware that actor mouse functions must be set prior to calling this method. The Dock actor +needs set his own actor input events functions for mouseEnter, mouseExit and mouseMove and +will then chain to the original methods set by the developer. + + +

    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    {CAAT.Actor} a CAAT.Actor instance.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + initialize(scene) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + scene + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + layout() + +
    +
    + Lay out the docking elements. The lay out will be a row with the orientation set by calling +the method setLayoutOp. + + +
    + + + + + + + + + + + +
    + + +
    + + + mouseExit(mouseEvent) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseMove(mouseEvent) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setApplicationRange(range) + +
    +
    + Set the number of elements that will be affected (zoomed) when the mouse is inside the component. + + +
    + + + + +
    +
    Parameters:
    + +
    + range + +
    +
    {number} a number. Defaults to 2.
    + +
    + + + + + + + + +
    + + +
    + + + setLayoutOp(lo) + +
    +
    + Set layout orientation. Choose from +
      +
    • CAAT.Dock.OP_LAYOUT_BOTTOM +
    • CAAT.Dock.OP_LAYOUT_TOP +
    • CAAT.Dock.OP_LAYOUT_BOTTOM +
    • CAAT.Dock.OP_LAYOUT_RIGHT +
    +By default, the layou operation is OP_LAYOUT_BOTTOM, that is, elements zoom bottom anchored. + + +
    + + + + +
    +
    Parameters:
    + +
    + lo + +
    +
    {number} one of CAAT.Dock.OP_LAYOUT_BOTTOM, CAAT.Dock.OP_LAYOUT_TOP, +CAAT.Dock.OP_LAYOUT_BOTTOM, CAAT.Dock.OP_LAYOUT_RIGHT.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setSizes(min, max) + +
    +
    + Set maximum and minimum size of docked elements. By default, every contained actor will be +of 'min' size, and will be scaled up to 'max' size. + + +
    + + + + +
    +
    Parameters:
    + +
    + min + +
    +
    {number}
    + +
    + max + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.IMActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.IMActor.html new file mode 100644 index 00000000..095a91de --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.IMActor.html @@ -0,0 +1,834 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.IMActor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.IMActor +

    + + +

    + +
    Extends + CAAT.Foundation.Actor.
    + + + + + +
    Defined in: IMActor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    Calculate another image processing frame every this milliseconds.
    +
      + +
    Image processing interface.
    +
      + +
    Last scene time this actor calculated a frame.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    paint(director, time) +
    +
    +
      + +
    Call image processor to update image every time milliseconds.
    +
      + +
    Set the image processor.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.Actor:
    __init, __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, animate, cacheAsBitmap, centerAt, centerOn, clean, contains, create, destroy, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.IMActor() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + changeTime + +
    +
    + Calculate another image processing frame every this milliseconds. + + +
    + + + + + + + + +
    + + +
    + + + imageProcessor + +
    +
    + Image processing interface. + + +
    + + + + + + + + +
    + + +
    + + + lastApplicationTime + +
    +
    + Last scene time this actor calculated a frame. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + + paint(director, time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setImageProcessingTime(time) + +
    +
    + Call image processor to update image every time milliseconds. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    an integer indicating milliseconds to elapse before updating the frame.
    + +
    + + + + + + + + +
    + + +
    + + + setImageProcessor(im) + +
    +
    + Set the image processor. + + +
    + + + + +
    +
    Parameters:
    + +
    + im + +
    +
    {CAAT.ImageProcessor} a CAAT.ImageProcessor instance.
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.InterpolatorActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.InterpolatorActor.html new file mode 100644 index 00000000..1caf5b4f --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.InterpolatorActor.html @@ -0,0 +1,928 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.InterpolatorActor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.InterpolatorActor +

    + + +

    + +
    Extends + CAAT.Foundation.Actor.
    + + + + + +
    Defined in: InterpolatorActor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + contour +
    +
    This interpolator´s contour.
    +
      +
    + gap +
    +
    padding when drawing the interpolator.
    +
      + +
    The interpolator instance to draw.
    +
      +
    + S +
    +
    Number of samples to calculate a contour.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      + +
    Return the represented interpolator.
    +
      +
    paint(director, time) +
    +
    Paint this actor.
    +
      +
    setGap(gap) +
    +
    Sets a padding border size.
    +
      +
    setInterpolator(interpolator, size) +
    +
    Sets the CAAT.Interpolator instance to draw.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.Actor:
    __init, __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, animate, cacheAsBitmap, centerAt, centerOn, clean, contains, create, destroy, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.InterpolatorActor() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + contour + +
    +
    + This interpolator´s contour. + + +
    + + + + + + + + +
    + + +
    + + + gap + +
    +
    + padding when drawing the interpolator. + + +
    + + + + + + + + +
    + + +
    + + + interpolator + +
    +
    + The interpolator instance to draw. + + +
    + + + + + + + + +
    + + +
    + + + S + +
    +
    + Number of samples to calculate a contour. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + {CAAT.Interpolator} + getInterpolator() + +
    +
    + Return the represented interpolator. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Interpolator}
    + +
    + + + + +
    + + +
    + + + paint(director, time) + +
    +
    + Paint this actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + time + +
    +
    {number} scene time.
    + +
    + + + + + + + + +
    + + +
    + + + setGap(gap) + +
    +
    + Sets a padding border size. By default is 5 pixels. + + +
    + + + + +
    +
    Parameters:
    + +
    + gap + +
    +
    {number} border size in pixels.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setInterpolator(interpolator, size) + +
    +
    + Sets the CAAT.Interpolator instance to draw. + + +
    + + + + +
    +
    Parameters:
    + +
    + interpolator + +
    +
    a CAAT.Interpolator instance.
    + +
    + size + +
    +
    an integer indicating the number of polyline segments so draw to show the CAAT.Interpolator +instance.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Label.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Label.html new file mode 100644 index 00000000..6d43a427 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Label.html @@ -0,0 +1,1861 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.Label + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.Label +

    + + +

    + +
    Extends + CAAT.Foundation.Actor.
    + + + + + +
    Defined in: Label.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   + +
    Registered callback to notify on anchor click event.
    +
    <private>   + +
    Calculated document Height.
    +
    <private>   + +
    Calculated document width.
    +
    <private>   +
    + documentX +
    +
    Document x position.
    +
    <private>   +
    + documentY +
    +
    Document y position.
    +
    <private>   + +
    This Label document´s horizontal alignment.
    +
    <private>   +
    + images +
    +
    Collection of image objects in this label´s document.
    +
    <private>   +
    + lines +
    +
    Collection of text lines calculated for the label.
    +
    <private>   +
    + rc +
    +
    This label document´s render context
    +
    <private>   +
    + reflow +
    +
    Does this label document flow ?
    +
    <private>   +
    + styles +
    +
    Styles object.
    +
    <private>   +
    + text +
    +
    This label text.
    +
    <private>   + +
    This Label document´s vertical alignment.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __calculateDocumentDimension(suggestedWidth) +
    +
    +
    <private>   + +
    +
    <private>   +
    __init() +
    +
    +
      +
    addImage(name, spriteImage) +
    +
    +
      + +
    +
      +
    mouseExit(e) +
    +
    +
      +
    mouseMove(e) +
    +
    +
      +
    paint(director, time) +
    +
    +
      +
    setBounds(x, y, w, h) +
    +
    +
      +
    setClickCallback(callback) +
    +
    +
      +
    setDocumentPosition(halign, valign) +
    +
    +
      + +
    +
      + +
    +
      + +
    Make the label actor the size the label document has been calculated for.
    +
      +
    setSize(w, h) +
    +
    +
      +
    setStyle(name, styleData) +
    +
    +
      +
    setText(_text, width) +
    +
    +
      + +
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.Actor:
    __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, animate, cacheAsBitmap, centerAt, centerOn, clean, contains, create, destroy, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseOut, mouseOver, mouseUp, moveTo, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.Label() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + clickCallback + +
    +
    + Registered callback to notify on anchor click event. + + +
    + + + + + + + + +
    + + +
    <private> + + + documentHeight + +
    +
    + Calculated document Height. + + +
    + + + + + + + + +
    + + +
    <private> + + + documentWidth + +
    +
    + Calculated document width. + + +
    + + + + + + + + +
    + + +
    <private> + + + documentX + +
    +
    + Document x position. + + +
    + + + + + + + + +
    + + +
    <private> + + + documentY + +
    +
    + Document y position. + + +
    + + + + + + + + +
    + + +
    <private> + + + halignment + +
    +
    + This Label document´s horizontal alignment. + + +
    + + + + + + + + +
    + + +
    <private> + + + images + +
    +
    + Collection of image objects in this label´s document. + + +
    + + + + + + + + +
    + + +
    <private> + + + lines + +
    +
    + Collection of text lines calculated for the label. + + +
    + + + + + + + + +
    + + +
    <private> + + + rc + +
    +
    + This label document´s render context + + +
    + + + + + + + + +
    + + +
    <private> + + + reflow + +
    +
    + Does this label document flow ? + + +
    + + + + + + + + +
    + + +
    <private> + + + styles + +
    +
    + Styles object. + + +
    + + + + + + + + +
    + + +
    <private> + + + text + +
    +
    + This label text. + + +
    + + + + + + + + +
    + + +
    <private> + + + valignment + +
    +
    + This Label document´s vertical alignment. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __calculateDocumentDimension(suggestedWidth) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + suggestedWidth + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __getDocumentElementAt(x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + addImage(name, spriteImage) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + spriteImage + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseClick(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseExit(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + mouseMove(e) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + e + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + paint(director, time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setBounds(x, y, w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setClickCallback(callback) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + callback + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setDocumentPosition(halign, valign) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + halign + +
    +
    + +
    + valign + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setHorizontalAlignment(align) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + align + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setLinesAlignment() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + setMatchTextSize(match) + +
    +
    + Make the label actor the size the label document has been calculated for. + + +
    + + + + +
    +
    Parameters:
    + +
    + match + +
    +
    {boolean}
    + +
    + + + + + + + + +
    + + +
    + + + setSize(w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setStyle(name, styleData) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + styleData + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setText(_text, width) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + _text + +
    +
    + +
    + width + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setVerticalAlignment(align) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + align + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BorderLayout.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BorderLayout.html new file mode 100644 index 00000000..288b3245 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BorderLayout.html @@ -0,0 +1,1067 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.Layout.BorderLayout + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.Layout.BorderLayout +

    + + +

    + +
    Extends + CAAT.Foundation.UI.Layout.LayoutManager.
    + + + + + +
    Defined in: BorderLayout.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + bottom +
    +
    An actor to position botton.
    +
      +
    + center +
    +
    An actor to position center.
    +
      +
    + left +
    +
    An actor to position left.
    +
      +
    + right +
    +
    An actor to position right.
    +
      +
    + top +
    +
    An actor to position top.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    animated, hgap, invalid, moveElementInterpolator, newChildren, newElementInterpolator, padding, vgap
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __getChild(constraint) +
    +
    +
    <private>   +
    __init() +
    +
    +
      +
    addChild(child, constraint) +
    +
    +
      +
    doLayout(container) +
    +
    +
      +
    getMinimumLayoutSize(container) +
    +
    +
      + +
    +
      +
    removeChild(child) +
    +
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    invalidateLayout, isInvalidated, isValid, setAllPadding, setAnimated, setHGap, setPadding, setVGap
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.Layout.BorderLayout() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + bottom + +
    +
    + An actor to position botton. + + +
    + + + + + + + + +
    + + +
    + + + center + +
    +
    + An actor to position center. + + +
    + + + + + + + + +
    + + +
    + + + left + +
    +
    + An actor to position left. + + +
    + + + + + + + + +
    + + +
    + + + right + +
    +
    + An actor to position right. + + +
    + + + + + + + + +
    + + +
    + + + top + +
    +
    + An actor to position top. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __getChild(constraint) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + constraint + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + addChild(child, constraint) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    + +
    + constraint + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + doLayout(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getMinimumLayoutSize(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPreferredLayoutSize(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + removeChild(child) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BoxLayout.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BoxLayout.html new file mode 100644 index 00000000..acb46951 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.BoxLayout.html @@ -0,0 +1,1110 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.Layout.BoxLayout + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.Layout.BoxLayout +

    + + +

    + +
    Extends + CAAT.Foundation.UI.Layout.LayoutManager.
    + + + + + +
    Defined in: BoxLayout.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + axis +
    +
    Stack elements in this axis.
    +
      +
    + halign +
    +
    Horizontal alignment.
    +
      +
    + valign +
    +
    Vertical alignment.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    animated, hgap, invalid, moveElementInterpolator, newChildren, newElementInterpolator, padding, vgap
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __setActorPosition(actor, xoffset, yoffset) +
    +
    +
      +
    doLayout(container) +
    +
    +
      +
    doLayoutHorizontal(container) +
    +
    +
      +
    doLayoutVertical(container) +
    +
    +
      +
    getMinimumLayoutSize(container) +
    +
    +
      + +
    +
      +
    setAxis(axis) +
    +
    +
      + +
    +
      + +
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    __init, addChild, invalidateLayout, isInvalidated, isValid, removeChild, setAllPadding, setAnimated, setHGap, setPadding, setVGap
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.Layout.BoxLayout() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + axis + +
    +
    + Stack elements in this axis. + + +
    + + + + + + + + +
    + + +
    + + + halign + +
    +
    + Horizontal alignment. + + +
    + + + + + + + + +
    + + +
    + + + valign + +
    +
    + Vertical alignment. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __setActorPosition(actor, xoffset, yoffset) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + actor + +
    +
    + +
    + xoffset + +
    +
    + +
    + yoffset + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + doLayout(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + doLayoutHorizontal(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + doLayoutVertical(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getMinimumLayoutSize(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPreferredLayoutSize(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setAxis(axis) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + axis + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setHorizontalAlignment(align) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + align + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setVerticalAlignment(align) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + align + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.GridLayout.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.GridLayout.html new file mode 100644 index 00000000..2952e828 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.GridLayout.html @@ -0,0 +1,847 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.Layout.GridLayout + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.Layout.GridLayout +

    + + +

    + +
    Extends + CAAT.Foundation.UI.Layout.LayoutManager.
    + + + + + +
    Defined in: GridLayout.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + columns +
    +
    Layout elements using this number of columns.
    +
      +
    + rows +
    +
    Layout elements using this number of rows.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    animated, hgap, invalid, moveElementInterpolator, newChildren, newElementInterpolator, padding, vgap
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(rows, columns) +
    +
    +
      +
    doLayout(container) +
    +
    +
      +
    getMinimumLayoutSize(container) +
    +
    +
      + +
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.UI.Layout.LayoutManager:
    addChild, invalidateLayout, isInvalidated, isValid, removeChild, setAllPadding, setAnimated, setHGap, setPadding, setVGap
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.Layout.GridLayout() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + columns + +
    +
    + Layout elements using this number of columns. + + +
    + + + + + + + + +
    + + +
    + + + rows + +
    +
    + Layout elements using this number of rows. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(rows, columns) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + rows + +
    +
    + +
    + columns + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + doLayout(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getMinimumLayoutSize(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPreferredLayoutSize(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.LayoutManager.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.LayoutManager.html new file mode 100644 index 00000000..8ac5ad99 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.LayoutManager.html @@ -0,0 +1,1528 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.Layout.LayoutManager + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.Layout.LayoutManager +

    + + +

    + + + + + + +
    Defined in: LayoutManager.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   +
    + CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT +
    +
    +
      +
    + animated +
    +
    Animate on adding/removing elements.
    +
    <static>   +
    + CAAT.Foundation.UI.Layout.LayoutManager.AXIS +
    +
    +
      +
    + hgap +
    +
    Horizontal gap between children.
    +
      +
    + invalid +
    +
    Needs relayout ??
    +
      + +
    If animation enabled, relayout elements interpolator.
    +
      + +
    pending to be laid-out actors.
    +
      + +
    If animation enabled, new element interpolator.
    +
      +
    + padding +
    +
    Defines insets:
    +
      +
    + vgap +
    +
    Vertical gap between children.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    addChild(child, constraints) +
    +
    +
      +
    doLayout(container) +
    +
    +
      +
    getMinimumLayoutSize(container) +
    +
    +
      + +
    +
      +
    invalidateLayout(container) +
    +
    +
      + +
    +
      +
    isValid() +
    +
    +
      +
    removeChild(child) +
    +
    +
      + +
    +
      +
    setAnimated(animate) +
    +
    +
      +
    setHGap(gap) +
    +
    +
      +
    setPadding(l, r, t, b) +
    +
    +
      +
    setVGap(gap) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.Layout.LayoutManager() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + animated + +
    +
    + Animate on adding/removing elements. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.UI.Layout.LayoutManager.AXIS + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + hgap + +
    +
    + Horizontal gap between children. + + +
    + + + + + + + + +
    + + +
    + + + invalid + +
    +
    + Needs relayout ?? + + +
    + + + + + + + + +
    + + +
    + + + moveElementInterpolator + +
    +
    + If animation enabled, relayout elements interpolator. + + +
    + + + + + + + + +
    + + +
    + + + newChildren + +
    +
    + pending to be laid-out actors. + + +
    + + + + + + + + +
    + + +
    + + + newElementInterpolator + +
    +
    + If animation enabled, new element interpolator. + + +
    + + + + + + + + +
    + + +
    + + + padding + +
    +
    + Defines insets: + + +
    + + + + + + + + +
    + + +
    + + + vgap + +
    +
    + Vertical gap between children. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + addChild(child, constraints) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    + +
    + constraints + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + doLayout(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getMinimumLayoutSize(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPreferredLayoutSize(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + invalidateLayout(container) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + container + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + isInvalidated() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isValid() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + removeChild(child) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + child + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setAllPadding(s) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + s + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setAnimated(animate) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + animate + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setHGap(gap) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + gap + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPadding(l, r, t, b) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + l + +
    +
    + +
    + r + +
    +
    + +
    + t + +
    +
    + +
    + b + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setVGap(gap) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + gap + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.html new file mode 100644 index 00000000..1022a459 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.Layout.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.Layout + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Foundation.UI.Layout +

    + + +

    + + + + + + +
    Defined in: LayoutManager.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Foundation.UI.Layout +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.PathActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.PathActor.html new file mode 100644 index 00000000..06724ee0 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.PathActor.html @@ -0,0 +1,1211 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.PathActor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.PathActor +

    + + +

    + +
    Extends + CAAT.Foundation.Actor.
    + + + + + +
    Defined in: PathActor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + bOutline +
    +
    draw the bounding rectangle too ?
    +
      + +
    Set this path as interactive.
    +
      + +
    If the path is interactive, some handlers are shown to modify the path.
    +
      + +
    Outline the path in this color.
    +
      +
    + path +
    +
    Path to draw.
    +
      + +
    Calculated path´s bounding box.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    getPath() +
    +
    Return the contained path.
    +
      +
    mouseDown(mouseEvent) +
    +
    Route mouse down functionality to the contained path.
    +
      +
    mouseDrag(mouseEvent) +
    +
    Route mouse dragging functionality to the contained path.
    +
      +
    mouseUp(mouseEvent) +
    +
    Route mouse up functionality to the contained path.
    +
      +
    paint(director, time) +
    +
    Paint this actor.
    +
      +
    setInteractive(interactive) +
    +
    Set the contained path as interactive.
    +
      + +
    +
      +
    setPath(path) +
    +
    Sets the path to manage.
    +
      +
    showBoundingBox(show, color) +
    +
    Enables/disables drawing of the contained path's bounding box.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.Actor:
    __init, __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, animate, cacheAsBitmap, centerAt, centerOn, clean, contains, create, destroy, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, moveTo, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setBounds, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.PathActor() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + bOutline + +
    +
    + draw the bounding rectangle too ? + + +
    + + + + + + + + +
    + + +
    + + + interactive + +
    +
    + Set this path as interactive. + + +
    + + + + + + + + +
    + + +
    + + + onUpdateCallback + +
    +
    + If the path is interactive, some handlers are shown to modify the path. +This callback function will be called when the path is interactively changed. + + +
    + + + + + + + + +
    + + +
    + + + outlineColor + +
    +
    + Outline the path in this color. + + +
    + + + + + + + + +
    + + +
    + + + path + +
    +
    + Path to draw. + + +
    + + + + + + + + +
    + + +
    + + + pathBoundingRectangle + +
    +
    + Calculated path´s bounding box. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + {CAAT.Path} + getPath() + +
    +
    + Return the contained path. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Path}
    + +
    + + + + +
    + + +
    + + + mouseDown(mouseEvent) + +
    +
    + Route mouse down functionality to the contained path. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.Event.MouseEvent}
    + +
    + + + + + + + + +
    + + +
    + + + mouseDrag(mouseEvent) + +
    +
    + Route mouse dragging functionality to the contained path. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.Event.MouseEvent}
    + +
    + + + + + + + + +
    + + +
    + + + mouseUp(mouseEvent) + +
    +
    + Route mouse up functionality to the contained path. + + +
    + + + + +
    +
    Parameters:
    + +
    + mouseEvent + +
    +
    {CAAT.Event.MouseEvent}
    + +
    + + + + + + + + +
    + + +
    + + + paint(director, time) + +
    +
    + Paint this actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Foundation.Director}
    + +
    + time + +
    +
    {number}. Scene time.
    + +
    + + + + + + + + +
    + + +
    + + + setInteractive(interactive) + +
    +
    + Set the contained path as interactive. This means it can be changed on the fly by manipulation +of its control points. + + +
    + + + + +
    +
    Parameters:
    + +
    + interactive + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setOnUpdateCallback(fn) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + fn + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPath(path) + +
    +
    + Sets the path to manage. + + +
    + + + + +
    +
    Parameters:
    + +
    + path + +
    +
    {CAAT.PathUtil.PathSegment}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + showBoundingBox(show, color) + +
    +
    + Enables/disables drawing of the contained path's bounding box. + + +
    + + + + +
    +
    Parameters:
    + +
    + show + +
    +
    {boolean} whether to show the bounding box
    + +
    + color + +
    +
    {=string} optional parameter defining the path's bounding box stroke style.
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.ShapeActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.ShapeActor.html new file mode 100644 index 00000000..294e9e3c --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.ShapeActor.html @@ -0,0 +1,1465 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.ShapeActor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.ShapeActor +

    + + +

    + +
    Extends + CAAT.Foundation.ActorContainer.
    + + + + + +
    Defined in: ShapeActor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    Set this shape composite operation when drawing it.
    +
      +
    + lineCap +
    +
    Stroke the shape with this line cap.
    +
      +
    + lineJoin +
    +
    Stroke the shape with this line Join.
    +
      +
    + lineWidth +
    +
    Stroke the shape with this line width.
    +
      + +
    Stroke the shape with this line mitter limit.
    +
      +
    + shape +
    +
    Define this actor shape: rectangle or circle
    +
    <static>   +
    + CAAT.Foundation.UI.ShapeActor.SHAPE_CIRCLE +
    +
    +
    <static>   +
    + CAAT.Foundation.UI.ShapeActor.SHAPE_RECTANGLE +
    +
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.ActorContainer:
    activeChildren, addHint, boundingBox, childrenList, layoutInvalidated, layoutManager, pendingChildrenList, runion
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    paint(director, time) +
    +
    Draws the shape.
    +
    <private>   +
    paintCircle(director, time) +
    +
    +
      +
    paintRectangle(director, time) +
    +
    Private +Draws a Rectangle.
    +
      +
    setCompositeOp(compositeOp) +
    +
    Sets the composite operation to apply on shape drawing.
    +
      +
    setLineCap(lc) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    setShape(iShape) +
    +
    Sets shape type.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.ActorContainer:
    __paintActor, __validateLayout, __validateTree, addActor, addActorImmediately, addChild, addChildAt, addChildDelayed, addChildImmediately, animate, destroy, drawScreenBoundingBox, emptyChildren, endAnimate, findActorAtPosition, findActorById, findChild, getChildAt, getLayout, getNumActiveChildren, getNumChildren, invalidateLayout, paintActor, paintActorGL, recalcSize, removeChild, removeChildAt, removeFirstChild, removeLastChild, setBounds, setLayout, setZOrder
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, emptyBehaviorList, enableDrag, enableEvents, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.ShapeActor() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + compositeOp + +
    +
    + Set this shape composite operation when drawing it. + + +
    + + + + + + + + +
    + + +
    + + + lineCap + +
    +
    + Stroke the shape with this line cap. + + +
    + + + + + + + + +
    + + +
    + + + lineJoin + +
    +
    + Stroke the shape with this line Join. + + +
    + + + + + + + + +
    + + +
    + + + lineWidth + +
    +
    + Stroke the shape with this line width. + + +
    + + + + + + + + +
    + + +
    + + + miterLimit + +
    +
    + Stroke the shape with this line mitter limit. + + +
    + + + + + + + + +
    + + +
    + + + shape + +
    +
    + Define this actor shape: rectangle or circle + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.UI.ShapeActor.SHAPE_CIRCLE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Foundation.UI.ShapeActor.SHAPE_RECTANGLE + +
    +
    + + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getLineCap() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getLineJoin() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getLineWidth() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getMiterLimit() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + paint(director, time) + +
    +
    + Draws the shape. +Applies the values of fillStype, strokeStyle, compositeOp, etc. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    a valid CAAT.Director instance.
    + +
    + time + +
    +
    an integer with the Scene time the Actor is being drawn.
    + +
    + + + + + + + + +
    + + +
    <private> + + + paintCircle(director, time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    a valid CAAT.Director instance.
    + +
    + time + +
    +
    an integer with the Scene time the Actor is being drawn.
    + +
    + + + + + + + + +
    + + +
    + + + paintRectangle(director, time) + +
    +
    + Private +Draws a Rectangle. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    a valid CAAT.Director instance.
    + +
    + time + +
    +
    an integer with the Scene time the Actor is being drawn.
    + +
    + + + + + + + + +
    + + +
    + + + setCompositeOp(compositeOp) + +
    +
    + Sets the composite operation to apply on shape drawing. + + +
    + + + + +
    +
    Parameters:
    + +
    + compositeOp + +
    +
    an string with a valid canvas rendering context string describing compositeOps.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setLineCap(lc) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + lc + +
    +
    {string{butt|round|square}}
    + +
    + + + + + + + + +
    + + +
    + + + setLineJoin(lj) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + lj + +
    +
    {string{bevel|round|miter}}
    + +
    + + + + + + + + +
    + + +
    + + + setLineWidth(l) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + l + +
    +
    {number>0}
    + +
    + + + + + + + + +
    + + +
    + + + setMiterLimit(ml) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ml + +
    +
    {integer>0}
    + +
    + + + + + + + + +
    + + +
    + + + setShape(iShape) + +
    +
    + Sets shape type. +No check for parameter validity is performed. +Set paint method according to the shape. + + +
    + + + + +
    +
    Parameters:
    + +
    + iShape + +
    +
    an integer with any of the SHAPE_* constants.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.StarActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.StarActor.html new file mode 100644 index 00000000..c058d218 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.StarActor.html @@ -0,0 +1,1539 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.StarActor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.StarActor +

    + + +

    + +
    Extends + CAAT.Foundation.ActorContainer.
    + + + + + +
    Defined in: StarActor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    Draw the star with this composite operation.
    +
      + +
    Staring angle in radians.
    +
      +
    + lineCap +
    +
    +
      +
    + lineJoin +
    +
    +
      +
    + lineWidth +
    +
    +
      +
    + maxRadius +
    +
    Maximum radius.
    +
      +
    + minRadius +
    +
    Minimum radius.
    +
      + +
    +
      +
    + nPeaks +
    +
    Number of star peaks.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.ActorContainer:
    activeChildren, addHint, boundingBox, childrenList, layoutInvalidated, layoutManager, pendingChildrenList, runion
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    initialize(nPeaks, maxRadius, minRadius) +
    +
    Initialize the star values.
    +
      +
    paint(director, timer) +
    +
    Paint the star.
    +
      +
    setCompositeOp(compositeOp) +
    +
    Sets the composite operation to apply on shape drawing.
    +
      +
    setFilled(filled) +
    +
    Sets whether the star will be color filled.
    +
      +
    setInitialAngle(angle) +
    +
    +
      +
    setLineCap(lc) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    setOutlined(outlined) +
    +
    Sets whether the star will be outlined.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.ActorContainer:
    __paintActor, __validateLayout, __validateTree, addActor, addActorImmediately, addChild, addChildAt, addChildDelayed, addChildImmediately, animate, destroy, drawScreenBoundingBox, emptyChildren, endAnimate, findActorAtPosition, findActorById, findChild, getChildAt, getLayout, getNumActiveChildren, getNumChildren, invalidateLayout, paintActor, paintActorGL, recalcSize, removeChild, removeChildAt, removeFirstChild, removeLastChild, setBounds, setLayout, setZOrder
    Methods borrowed from class CAAT.Foundation.Actor:
    __scale1To, addAnimation, addBehavior, addListener, cacheAsBitmap, centerAt, centerOn, clean, contains, create, disableDrag, emptyBehaviorList, enableDrag, enableEvents, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, invalidate, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setLocation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPosition, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSize, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.StarActor() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + compositeOp + +
    +
    + Draw the star with this composite operation. + + +
    + + + + + + + + +
    + + +
    + + + initialAngle + +
    +
    + Staring angle in radians. + + +
    + + + + + + + + +
    + + +
    + + + lineCap + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + lineJoin + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + lineWidth + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + maxRadius + +
    +
    + Maximum radius. + + +
    + + + + + + + + +
    + + +
    + + + minRadius + +
    +
    + Minimum radius. + + +
    + + + + + + + + +
    + + +
    + + + miterLimit + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + nPeaks + +
    +
    + Number of star peaks. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getLineCap() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getLineJoin() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getLineWidth() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getMiterLimit() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + initialize(nPeaks, maxRadius, minRadius) + +
    +
    + Initialize the star values. +

    +The star actor will be of size 2*maxRadius. + + +

    + + + + +
    +
    Parameters:
    + +
    + nPeaks + +
    +
    {number} number of star points.
    + +
    + maxRadius + +
    +
    {number} maximum star radius
    + +
    + minRadius + +
    +
    {number} minimum star radius
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + paint(director, timer) + +
    +
    + Paint the star. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + timer + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setCompositeOp(compositeOp) + +
    +
    + Sets the composite operation to apply on shape drawing. + + +
    + + + + +
    +
    Parameters:
    + +
    + compositeOp + +
    +
    an string with a valid canvas rendering context string describing compositeOps.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setFilled(filled) + +
    +
    + Sets whether the star will be color filled. + + +
    + + + + +
    +
    Parameters:
    + +
    + filled + +
    +
    {boolean}
    + +
    + + + + + + + + +
    + + +
    + + + setInitialAngle(angle) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + angle + +
    +
    {number} number in radians.
    + +
    + + + + + + + + +
    + + +
    + + + setLineCap(lc) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + lc + +
    +
    {string{butt|round|square}}
    + +
    + + + + + + + + +
    + + +
    + + + setLineJoin(lj) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + lj + +
    +
    {string{bevel|round|miter}}
    + +
    + + + + + + + + +
    + + +
    + + + setLineWidth(l) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + l + +
    +
    {number>0}
    + +
    + + + + + + + + +
    + + +
    + + + setMiterLimit(ml) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ml + +
    +
    {integer>0}
    + +
    + + + + + + + + +
    + + +
    + + + setOutlined(outlined) + +
    +
    + Sets whether the star will be outlined. + + +
    + + + + +
    +
    Parameters:
    + +
    + outlined + +
    +
    {boolean}
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.TextActor.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.TextActor.html new file mode 100644 index 00000000..0c9b3c2a --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.TextActor.html @@ -0,0 +1,2386 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI.TextActor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Foundation.UI.TextActor +

    + + +

    + +
    Extends + CAAT.Foundation.Actor.
    + + + + + +
    Defined in: TextActor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + fill +
    +
    a boolean indicating whether the text should be filled.
    +
      +
    + font +
    +
    a valid canvas rendering context font description.
    +
      +
    + fontData +
    +
    Font info.
    +
      +
    + lineWidth +
    +
    text's stroke line width.
    +
      +
    + outline +
    +
    a boolean indicating whether the text should be outlined.
    +
      + +
    a valid color description string.
    +
      +
    + path +
    +
    a CAAT.PathUtil.Path which will be traversed by the text.
    +
      + +
    time to be taken to traverse the path.
    +
      + +
    A CAAT.Behavior.Interpolator to apply to the path traversal.
    +
      +
    + sign +
    +
    traverse the path forward (1) or backwards (-1).
    +
      +
    + text +
    +
    a string with the text to draw.
    +
      +
    + textAlign +
    +
    a valid canvas rendering context textAlign string.
    +
      + +
    a valid canvas rendering context textBaseLine string.
    +
      + +
    text fill color
    +
      + +
    calculated text height in pixels.
    +
      +
    + textWidth +
    +
    calculated text width in pixels.
    +
    + + + +
    +
    Fields borrowed from class CAAT.Foundation.Actor:
    __super, AABB, alpha, backgroundImage, behaviorList, cached, clip, clipPath, dirty, discardable, duration, expired, fillStyle, frameAlpha, gestureEnabled, glEnabled, height, id, inFrame, invalid, isAA, isCachedActor, isGlobalAlpha, lifecycleListenerList, minimumSize, modelViewMatrix, modelViewMatrixI, mouseEnabled, oldX, oldY, parent, pointed, preferredSize, preventLayout, rotationAngle, rotationX, rotationY, scaleAnchor, scaleTX, scaleTY, scaleX, scaleY, size_active, size_total, start_time, strokeStyle, tAnchorX, tAnchorY, time, viewVertices, visible, wdirty, width, worldModelViewMatrix, worldModelViewMatrixI, x, y
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   + +
    +
    <private>   +
    __init() +
    +
    +
    <private>   + +
    +
      +
    calcTextSize(director) +
    +
    Calculates the text dimension in pixels and stores the values in textWidth and textHeight +attributes.
    +
      +
    centerAt(x, y) +
    +
    +
      +
    drawOnPath(director, time) +
    +
    Private.
    +
      +
    drawSpriteText(director, time) +
    +
    Private.
    +
      +
    drawSpriteTextOnPath(director, time) +
    +
    Private.
    +
      +
    paint(director, time) +
    +
    Custom paint method for TextActor instances.
    +
      +
    setAlign(align) +
    +
    Sets text alignment
    +
      +
    setBaseline(baseline) +
    +
    +
      +
    setBounds(x, y, w, h) +
    +
    +
      +
    setFill(fill) +
    +
    Set the text to be filled.
    +
      +
    setFont(font) +
    +
    Sets the font to be applied for the text.
    +
      + +
    +
      +
    setLocation(x, y) +
    +
    +
      +
    setOutline(outline) +
    +
    Sets whether the text will be outlined.
    +
      +
    setOutlineColor(color) +
    +
    Defines text's outline color.
    +
      +
    setPath(path, interpolator, duration) +
    +
    Set the path, interpolator and duration to draw the text on.
    +
      + +
    +
      +
    setPosition(x, y) +
    +
    +
      +
    setSize(w, h) +
    +
    +
      +
    setText(sText) +
    +
    Set the text to be shown by the actor.
    +
      +
    setTextAlign(align) +
    +
    +
      +
    setTextBaseline(baseline) +
    +
    Set text baseline.
    +
      + +
    +
    + + + +
    +
    Methods borrowed from class CAAT.Foundation.Actor:
    __paintActor, __scale1To, __validateLayout, addAnimation, addBehavior, addListener, animate, cacheAsBitmap, centerOn, clean, contains, create, destroy, disableDrag, drawScreenBoundingBox, emptyBehaviorList, enableDrag, enableEvents, endAnimate, findActorAtPosition, findActorById, fireEvent, gestureChange, gestureEnd, gestureStart, getAnchor, getAnchorPercent, getBehavior, getId, getMinimumSize, getPreferredSize, getTextureGLPage, glNeedsFlush, glSetShader, initialize, invalidate, invalidateLayout, isCached, isGestureEnabled, isInAnimationFrame, isVisible, modelToModel, modelToView, mouseClick, mouseDblClick, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseOut, mouseOver, mouseUp, moveTo, paintActor, paintActorGL, playAnimation, removeBehaviorById, removeBehaviour, removeListener, resetAnimationTime, resetAsButton, resetTransform, rotateTo, scaleTo, scaleXTo, scaleYTo, setAlpha, setAnimationEndCallback, setAnimationImageIndex, setAsButton, setBackgroundImage, setBackgroundImageOffset, setButtonImageIndex, setCachedActor, setChangeFPS, setClip, setDiscardable, setExpired, setFillStyle, setFrameTime, setGestureEnabled, setGLCoords, setGlobalAlpha, setGlobalAnchor, setId, setImageTransformation, setMinimumSize, setModelViewMatrix, setOutOfFrameTime, setPaint, setParent, setPositionAnchor, setPositionAnchored, setPreferredSize, setPreventLayout, setRotation, setRotationAnchor, setRotationAnchored, setScale, setScaleAnchor, setScaleAnchored, setScreenBounds, setSpriteIndex, setStrokeStyle, setUV, setVisible, stopCacheAsBitmap, touchEnd, touchMove, touchStart, viewToModel
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Foundation.UI.TextActor() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + fill + +
    +
    + a boolean indicating whether the text should be filled. + + +
    + + + + + + + + +
    + + +
    + + + font + +
    +
    + a valid canvas rendering context font description. Default font will be "10px sans-serif". + + +
    + + + + + + + + +
    + + +
    + + + fontData + +
    +
    + Font info. Calculated in CAAT. + + +
    + + + + + + + + +
    + + +
    + + + lineWidth + +
    +
    + text's stroke line width. + + +
    + + + + + + + + +
    + + +
    + + + outline + +
    +
    + a boolean indicating whether the text should be outlined. not all browsers support it. + + +
    + + + + + + + + +
    + + +
    + + + outlineColor + +
    +
    + a valid color description string. + + +
    + + + + + + + + +
    + + +
    + + + path + +
    +
    + a CAAT.PathUtil.Path which will be traversed by the text. + + +
    + + + + + + + + +
    + + +
    + + + pathDuration + +
    +
    + time to be taken to traverse the path. ms. + + +
    + + + + + + + + +
    + + +
    + + + pathInterpolator + +
    +
    + A CAAT.Behavior.Interpolator to apply to the path traversal. + + +
    + + + + + + + + +
    + + +
    + + + sign + +
    +
    + traverse the path forward (1) or backwards (-1). + + +
    + + + + + + + + +
    + + +
    + + + text + +
    +
    + a string with the text to draw. + + +
    + + + + + + + + +
    + + +
    + + + textAlign + +
    +
    + a valid canvas rendering context textAlign string. Any of: + start, end, left, right, center. +defaults to "left". + + +
    + + + + + + + + +
    + + +
    + + + textBaseline + +
    +
    + a valid canvas rendering context textBaseLine string. Any of: + top, hanging, middle, alphabetic, ideographic, bottom. +defaults to "top". + + +
    + + + + + + + + +
    + + +
    + + + textFillStyle + +
    +
    + text fill color + + +
    + + + + + + + + +
    + + +
    + + + textHeight + +
    +
    + calculated text height in pixels. + + +
    + + + + + + + + +
    + + +
    + + + textWidth + +
    +
    + calculated text width in pixels. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __calcFontData() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + __setLocation() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + calcTextSize(director) + +
    +
    + Calculates the text dimension in pixels and stores the values in textWidth and textHeight +attributes. +If Actor's width and height were not set, the Actor's dimension will be set to these values. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    a CAAT.Director instance.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + centerAt(x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + drawOnPath(director, time) + +
    +
    + Private. +Draw the text traversing a path. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    a valid CAAT.Director instance.
    + +
    + time + +
    +
    an integer with the Scene time the Actor is being drawn.
    + +
    + + + + + + + + +
    + + +
    + + + drawSpriteText(director, time) + +
    +
    + Private. +Draw the text using a sprited font instead of a canvas font. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    a valid CAAT.Director instance.
    + +
    + time + +
    +
    an integer with the Scene time the Actor is being drawn.
    + +
    + + + + + + + + +
    + + +
    + + + drawSpriteTextOnPath(director, time) + +
    +
    + Private. +Draw the text traversing a path using a sprited font. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    a valid CAAT.Director instance.
    + +
    + time + +
    +
    an integer with the Scene time the Actor is being drawn.
    + +
    + + + + + + + + +
    + + +
    + + + paint(director, time) + +
    +
    + Custom paint method for TextActor instances. +If the path attribute is set, the text will be drawn traversing the path. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    a valid CAAT.Director instance.
    + +
    + time + +
    +
    an integer with the Scene time the Actor is being drawn.
    + +
    + + + + + + + + +
    + + +
    + + + setAlign(align) + +
    +
    + Sets text alignment + + +
    + + + + +
    +
    Parameters:
    + +
    + align + +
    +
    + +
    + + +
    +
    Deprecated:
    +
    + use setTextAlign +
    +
    + + + + + + + +
    + + +
    + + + setBaseline(baseline) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + baseline + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setBounds(x, y, w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setFill(fill) + +
    +
    + Set the text to be filled. The default Filling style will be set by calling setFillStyle method. +Default value is true. + + +
    + + + + +
    +
    Parameters:
    + +
    + fill + +
    +
    {boolean} a boolean indicating whether the text will be filled.
    + +
    + + + + + +
    +
    Returns:
    + +
    this;
    + +
    + + + + +
    + + +
    + + + setFont(font) + +
    +
    + Sets the font to be applied for the text. + + +
    + + + + +
    +
    Parameters:
    + +
    + font + +
    +
    a string with a valid canvas rendering context font description.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setLineWidth(lw) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + lw + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setLocation(x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setOutline(outline) + +
    +
    + Sets whether the text will be outlined. + + +
    + + + + +
    +
    Parameters:
    + +
    + outline + +
    +
    {boolean} a boolean indicating whether the text will be outlined.
    + +
    + + + + + +
    +
    Returns:
    + +
    this;
    + +
    + + + + +
    + + +
    + + + setOutlineColor(color) + +
    +
    + Defines text's outline color. + + +
    + + + + +
    +
    Parameters:
    + +
    + color + +
    +
    {string} sets a valid canvas context color.
    + +
    + + + + + +
    +
    Returns:
    + +
    this.
    + +
    + + + + +
    + + +
    + + + setPath(path, interpolator, duration) + +
    +
    + Set the path, interpolator and duration to draw the text on. + + +
    + + + + +
    +
    Parameters:
    + +
    + path + +
    +
    a valid CAAT.Path instance.
    + +
    + interpolator + +
    +
    a CAAT.Interpolator object. If not set, a Linear Interpolator will be used.
    + +
    + duration + +
    +
    an integer indicating the time to take to traverse the path. Optional. 10000 ms +by default.
    + +
    + + + + + + + + +
    + + +
    + + + setPathTraverseDirection(direction) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + direction + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPosition(x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setSize(w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setText(sText) + +
    +
    + Set the text to be shown by the actor. + + +
    + + + + +
    +
    Parameters:
    + +
    + sText + +
    +
    a string with the text to be shwon.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setTextAlign(align) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + align + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setTextBaseline(baseline) + +
    +
    + Set text baseline. + + +
    + + + + +
    +
    Parameters:
    + +
    + baseline + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setTextFillStyle(style) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + style + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.UI.html b/documentation/jsdoc/symbols/CAAT.Foundation.UI.html new file mode 100644 index 00000000..4001629d --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.UI.html @@ -0,0 +1,546 @@ + + + + + + + JsDoc Reference - CAAT.Foundation.UI + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Foundation.UI +

    + + +

    + + + + + + +
    Defined in: Dock.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Foundation.UI +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:18 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Foundation.html b/documentation/jsdoc/symbols/CAAT.Foundation.html new file mode 100644 index 00000000..d0baba69 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Foundation.html @@ -0,0 +1,546 @@ + + + + + + + JsDoc Reference - CAAT.Foundation + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Foundation +

    + + +

    + + + + + + +
    Defined in: Actor.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    CAAT.Foundation is the base namespace for all the core animation elements.
    +
    + + + + + + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Foundation +
    + +
    + CAAT.Foundation is the base namespace for all the core animation elements. + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:16 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.KEYS.html b/documentation/jsdoc/symbols/CAAT.KEYS.html new file mode 100644 index 00000000..9d8708c8 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.KEYS.html @@ -0,0 +1,3316 @@ + + + + + + + JsDoc Reference - CAAT.KEYS + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.KEYS +

    + + +

    + + + + + + +
    Defined in: KeyEvent.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      +
    + CAAT.KEYS +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   +
    + CAAT.KEYS.a +
    +
    +
    <static>   +
    + CAAT.KEYS.ADD +
    +
    +
    <static>   +
    + CAAT.KEYS.ALT +
    +
    +
    <static>   +
    + CAAT.KEYS.b +
    +
    +
    <static>   +
    + CAAT.KEYS.BACKSLASH +
    +
    +
    <static>   +
    + CAAT.KEYS.BACKSPACE +
    +
    +
    <static>   +
    + CAAT.KEYS.c +
    +
    +
    <static>   +
    + CAAT.KEYS.CAPSLOCK +
    +
    +
    <static>   +
    + CAAT.KEYS.CLOSEBRAKET +
    +
    +
    <static>   +
    + CAAT.KEYS.COMMA +
    +
    +
    <static>   +
    + CAAT.KEYS.CTRL +
    +
    +
    <static>   +
    + CAAT.KEYS.d +
    +
    +
    <static>   +
    + CAAT.KEYS.DASH +
    +
    +
    <static>   +
    + CAAT.KEYS.DECIMALPOINT +
    +
    +
    <static>   +
    + CAAT.KEYS.DELETE +
    +
    +
    <static>   +
    + CAAT.KEYS.DIVIDE +
    +
    +
    <static>   +
    + CAAT.KEYS.DOWN +
    +
    +
    <static>   +
    + CAAT.KEYS.e +
    +
    +
    <static>   +
    + CAAT.KEYS.END +
    +
    +
    <static>   +
    + CAAT.KEYS.ENTER +
    +
    +
    <static>   +
    + CAAT.KEYS.EQUALSIGN +
    +
    +
    <static>   +
    + CAAT.KEYS.ESCAPE +
    +
    +
    <static>   +
    + CAAT.KEYS.f +
    +
    +
    <static>   +
    + CAAT.KEYS.F1 +
    +
    +
    <static>   +
    + CAAT.KEYS.F10 +
    +
    +
    <static>   +
    + CAAT.KEYS.F11 +
    +
    +
    <static>   +
    + CAAT.KEYS.F12 +
    +
    +
    <static>   +
    + CAAT.KEYS.F2 +
    +
    +
    <static>   +
    + CAAT.KEYS.F3 +
    +
    +
    <static>   +
    + CAAT.KEYS.F4 +
    +
    +
    <static>   +
    + CAAT.KEYS.F5 +
    +
    +
    <static>   +
    + CAAT.KEYS.F6 +
    +
    +
    <static>   +
    + CAAT.KEYS.F7 +
    +
    +
    <static>   +
    + CAAT.KEYS.F8 +
    +
    +
    <static>   +
    + CAAT.KEYS.F9 +
    +
    +
    <static>   +
    + CAAT.KEYS.FORWARDSLASH +
    +
    +
    <static>   +
    + CAAT.KEYS.g +
    +
    +
    <static>   +
    + CAAT.KEYS.GRAVEACCENT +
    +
    +
    <static>   +
    + CAAT.KEYS.h +
    +
    +
    <static>   +
    + CAAT.KEYS.HOME +
    +
    +
    <static>   +
    + CAAT.KEYS.i +
    +
    +
    <static>   +
    + CAAT.KEYS.INSERT +
    +
    +
    <static>   +
    + CAAT.KEYS.j +
    +
    +
    <static>   +
    + CAAT.KEYS.k +
    +
    +
    <static>   +
    + CAAT.KEYS.l +
    +
    +
    <static>   +
    + CAAT.KEYS.LEFT +
    +
    +
    <static>   +
    + CAAT.KEYS.m +
    +
    +
    <static>   +
    + CAAT.KEYS.MULTIPLY +
    +
    +
    <static>   +
    + CAAT.KEYS.n +
    +
    +
    <static>   +
    + CAAT.KEYS.NUMLOCK +
    +
    +
    <static>   +
    + CAAT.KEYS.NUMPAD0 +
    +
    +
    <static>   +
    + CAAT.KEYS.NUMPAD1 +
    +
    +
    <static>   +
    + CAAT.KEYS.NUMPAD2 +
    +
    +
    <static>   +
    + CAAT.KEYS.NUMPAD3 +
    +
    +
    <static>   +
    + CAAT.KEYS.NUMPAD4 +
    +
    +
    <static>   +
    + CAAT.KEYS.NUMPAD5 +
    +
    +
    <static>   +
    + CAAT.KEYS.NUMPAD6 +
    +
    +
    <static>   +
    + CAAT.KEYS.NUMPAD7 +
    +
    +
    <static>   +
    + CAAT.KEYS.NUMPAD8 +
    +
    +
    <static>   +
    + CAAT.KEYS.NUMPAD9 +
    +
    +
    <static>   +
    + CAAT.KEYS.o +
    +
    +
    <static>   +
    + CAAT.KEYS.OPENBRACKET +
    +
    +
    <static>   +
    + CAAT.KEYS.p +
    +
    +
    <static>   +
    + CAAT.KEYS.PAGEDOWN +
    +
    +
    <static>   +
    + CAAT.KEYS.PAGEUP +
    +
    +
    <static>   +
    + CAAT.KEYS.PAUSE +
    +
    +
    <static>   +
    + CAAT.KEYS.PERIOD +
    +
    +
    <static>   +
    + CAAT.KEYS.q +
    +
    +
    <static>   +
    + CAAT.KEYS.r +
    +
    +
    <static>   +
    + CAAT.KEYS.RIGHT +
    +
    +
    <static>   +
    + CAAT.KEYS.s +
    +
    +
    <static>   +
    + CAAT.KEYS.SCROLLLOCK +
    +
    +
    <static>   +
    + CAAT.KEYS.SELECT +
    +
    +
    <static>   +
    + CAAT.KEYS.SEMICOLON +
    +
    +
    <static>   +
    + CAAT.KEYS.SHIFT +
    +
    +
    <static>   +
    + CAAT.KEYS.SINGLEQUOTE +
    +
    +
    <static>   +
    + CAAT.KEYS.SUBTRACT +
    +
    +
    <static>   +
    + CAAT.KEYS.t +
    +
    +
    <static>   +
    + CAAT.KEYS.TAB +
    +
    +
    <static>   +
    + CAAT.KEYS.u +
    +
    +
    <static>   +
    + CAAT.KEYS.UP +
    +
    +
    <static>   +
    + CAAT.KEYS.v +
    +
    +
    <static>   +
    + CAAT.KEYS.w +
    +
    +
    <static>   +
    + CAAT.KEYS.x +
    +
    +
    <static>   +
    + CAAT.KEYS.y +
    +
    +
    <static>   +
    + CAAT.KEYS.z +
    +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.KEYS +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.KEYS.a + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.ADD + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.ALT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.b + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.BACKSLASH + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.BACKSPACE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.c + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.CAPSLOCK + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.CLOSEBRAKET + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.COMMA + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.CTRL + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.d + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.DASH + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.DECIMALPOINT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.DELETE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.DIVIDE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.DOWN + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.e + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.END + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.ENTER + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.EQUALSIGN + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.ESCAPE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.f + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F1 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F10 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F11 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F12 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F2 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F3 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F4 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F5 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F6 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F7 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F8 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.F9 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.FORWARDSLASH + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.g + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.GRAVEACCENT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.h + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.HOME + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.i + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.INSERT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.j + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.k + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.l + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.LEFT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.m + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.MULTIPLY + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.n + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.NUMLOCK + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.NUMPAD0 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.NUMPAD1 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.NUMPAD2 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.NUMPAD3 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.NUMPAD4 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.NUMPAD5 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.NUMPAD6 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.NUMPAD7 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.NUMPAD8 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.NUMPAD9 + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.o + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.OPENBRACKET + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.p + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.PAGEDOWN + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.PAGEUP + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.PAUSE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.PERIOD + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.q + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.r + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.RIGHT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.s + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.SCROLLLOCK + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.SELECT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.SEMICOLON + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.SHIFT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.SINGLEQUOTE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.SUBTRACT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.t + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.TAB + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.u + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.UP + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.v + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.w + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.x + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.y + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEYS.z + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.KEY_MODIFIERS.html b/documentation/jsdoc/symbols/CAAT.KEY_MODIFIERS.html new file mode 100644 index 00000000..bf25d2bf --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.KEY_MODIFIERS.html @@ -0,0 +1,660 @@ + + + + + + + JsDoc Reference - CAAT.KEY_MODIFIERS + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.KEY_MODIFIERS +

    + + +

    + + + + + + +
    Defined in: KeyEvent.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   +
    + CAAT.KEY_MODIFIERS.alt +
    +
    +
    <static>   +
    + CAAT.KEY_MODIFIERS.control +
    +
    +
    <static>   +
    + CAAT.KEY_MODIFIERS.shift +
    +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.KEY_MODIFIERS +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.KEY_MODIFIERS.alt + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEY_MODIFIERS.control + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.KEY_MODIFIERS.shift + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Math.Bezier.html b/documentation/jsdoc/symbols/CAAT.Math.Bezier.html new file mode 100644 index 00000000..51af9e0c --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Math.Bezier.html @@ -0,0 +1,1239 @@ + + + + + + + JsDoc Reference - CAAT.Math.Bezier + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Math.Bezier +

    + + +

    + +
    Extends + CAAT.Math.Curve.
    + + + + + +
    Defined in: Bezier.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + cubic +
    +
    This curbe is cubic or quadratic bezier ?
    +
    + + + +
    +
    Fields borrowed from class CAAT.Math.Curve:
    coordlist, drawHandles, HANDLE_SIZE, k, length
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    applyAsPath(director) +
    +
    +
      +
    isCubic() +
    +
    +
      + +
    +
      +
    paint(director) +
    +
    Paint this curve.
    +
    <private>   +
    paintCuadric(director) +
    +
    Paint this quadric Bezier curve.
    +
    <private>   +
    paintCubic(director) +
    +
    Paint this cubic Bezier curve.
    +
      +
    setCubic(cp0x, cp0y, cp1x, cp1y, cp2x, cp2y, cp3x, cp3y) +
    +
    Set this curve as a cubic bezier defined by the given four control points.
    +
      +
    setPoints(points) +
    +
    +
      +
    setQuadric(cp0x, cp0y, cp1x, cp1y, cp2x, cp2y) +
    +
    Set this curve as a quadric bezier defined by the three control points.
    +
      +
    solve(point, t) +
    +
    Solves the curve for any given parameter t.
    +
      +
    solveCubic(point, t) +
    +
    Solves a cubic Bezier.
    +
      +
    solveQuadric(point, t) +
    +
    Solves a quadric Bezier.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Math.Curve:
    calcLength, endCurvePosition, getBoundingBox, getContour, getLength, setPoint, startCurvePosition, update
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Math.Bezier() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + cubic + +
    +
    + This curbe is cubic or quadratic bezier ? + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + + applyAsPath(director) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + isCubic() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isQuadric() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + paint(director) + +
    +
    + Paint this curve. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + + + + + + + + +
    + + +
    <private> + + + paintCuadric(director) + +
    +
    + Paint this quadric Bezier curve. Each time the curve is drawn it will be solved again from 0 to 1 with +CAAT.Bezier.k increments. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + + + + + + + + +
    + + +
    <private> + + + paintCubic(director) + +
    +
    + Paint this cubic Bezier curve. Each time the curve is drawn it will be solved again from 0 to 1 with +CAAT.Bezier.k increments. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + + + + + + + + +
    + + +
    + + + setCubic(cp0x, cp0y, cp1x, cp1y, cp2x, cp2y, cp3x, cp3y) + +
    +
    + Set this curve as a cubic bezier defined by the given four control points. + + +
    + + + + +
    +
    Parameters:
    + +
    + cp0x + +
    +
    {number}
    + +
    + cp0y + +
    +
    {number}
    + +
    + cp1x + +
    +
    {number}
    + +
    + cp1y + +
    +
    {number}
    + +
    + cp2x + +
    +
    {number}
    + +
    + cp2y + +
    +
    {number}
    + +
    + cp3x + +
    +
    {number}
    + +
    + cp3y + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setPoints(points) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + points + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setQuadric(cp0x, cp0y, cp1x, cp1y, cp2x, cp2y) + +
    +
    + Set this curve as a quadric bezier defined by the three control points. + + +
    + + + + +
    +
    Parameters:
    + +
    + cp0x + +
    +
    {number}
    + +
    + cp0y + +
    +
    {number}
    + +
    + cp1x + +
    +
    {number}
    + +
    + cp1y + +
    +
    {number}
    + +
    + cp2x + +
    +
    {number}
    + +
    + cp2y + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + solve(point, t) + +
    +
    + Solves the curve for any given parameter t. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Point} the point to store the solved value on the curve.
    + +
    + t + +
    +
    {number} a number in the range 0..1
    + +
    + + + + + + + + +
    + + +
    + + + solveCubic(point, t) + +
    +
    + Solves a cubic Bezier. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Point} the point to store the solved value on the curve.
    + +
    + t + +
    +
    {number} the value to solve the curve for.
    + +
    + + + + + + + + +
    + + +
    + + + solveQuadric(point, t) + +
    +
    + Solves a quadric Bezier. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Point} the point to store the solved value on the curve.
    + +
    + t + +
    +
    {number} the value to solve the curve for.
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Math.CatmullRom.html b/documentation/jsdoc/symbols/CAAT.Math.CatmullRom.html new file mode 100644 index 00000000..ad3721df --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Math.CatmullRom.html @@ -0,0 +1,865 @@ + + + + + + + JsDoc Reference - CAAT.Math.CatmullRom + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Math.CatmullRom +

    + + +

    + +
    Extends + CAAT.Math.Curve.
    + + + + + +
    Defined in: CatmullRom.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + +
    +
    Fields borrowed from class CAAT.Math.Curve:
    coordlist, drawHandles, HANDLE_SIZE, k, length
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    applyAsPath(director) +
    +
    +
      + +
    Return the first curve control point.
    +
      +
    paint(director) +
    +
    Paint the contour by solving again the entire curve.
    +
      +
    setCurve(p0, p1, p2, p3) +
    +
    Set curve control points.
    +
      +
    solve(point, t) +
    +
    Solves the curve for any given parameter t.
    +
      + +
    Return the last curve control point.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Math.Curve:
    calcLength, getBoundingBox, getContour, getLength, setPoint, setPoints, update
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Math.CatmullRom() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    + + + applyAsPath(director) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.Point} + endCurvePosition() + +
    +
    + Return the first curve control point. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + +
    + + +
    + + + paint(director) + +
    +
    + Paint the contour by solving again the entire curve. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + + + + + + + + +
    + + +
    + + + setCurve(p0, p1, p2, p3) + +
    +
    + Set curve control points. + + +
    + + + + +
    +
    Parameters:
    + +
    + p0 + +
    +
    + +
    + p1 + +
    +
    + +
    + p2 + +
    +
    + +
    + p3 + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + solve(point, t) + +
    +
    + Solves the curve for any given parameter t. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Point} the point to store the solved value on the curve.
    + +
    + t + +
    +
    {number} a number in the range 0..1
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.Point} + startCurvePosition() + +
    +
    + Return the last curve control point. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Math.Curve.html b/documentation/jsdoc/symbols/CAAT.Math.Curve.html new file mode 100644 index 00000000..268489a4 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Math.Curve.html @@ -0,0 +1,1288 @@ + + + + + + + JsDoc Reference - CAAT.Math.Curve + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Math.Curve +

    + + +

    + + + + + + +
    Defined in: Curve.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + coordlist +
    +
    A collection of CAAT.Math.Point objects.
    +
      + +
    Draw interactive handlers ?
    +
      + +
    If this segments belongs to an interactive path, the handlers will be this size.
    +
      +
    + k +
    +
    Minimun solver step.
    +
      +
    + length +
    +
    Curve length.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    applyAsPath(director) +
    +
    +
      + +
    Calculate the curve length by incrementally solving the curve every substep=CAAT.Curve.k.
    +
      + +
    Return the first curve control point.
    +
      +
    getBoundingBox(rectangle) +
    +
    Calculates a curve bounding box.
    +
      +
    getContour(numSamples) +
    +
    Get an array of points defining the curve contour.
    +
      + +
    Return the cached curve length.
    +
      +
    paint(director) +
    +
    Paint the curve control points.
    +
      +
    setPoint(point, index) +
    +
    +
      +
    setPoints(points) +
    +
    +
      +
    solve(point, t) +
    +
    This method must be overriden by subclasses.
    +
      + +
    Return the last curve control point.
    +
      +
    update() +
    +
    Signal the curve has been modified and recalculate curve length.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Math.Curve() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + coordlist + +
    +
    + A collection of CAAT.Math.Point objects. + + +
    + + + + + + + + +
    + + +
    + + + drawHandles + +
    +
    + Draw interactive handlers ? + + +
    + + + + + + + + +
    + + +
    + + + HANDLE_SIZE + +
    +
    + If this segments belongs to an interactive path, the handlers will be this size. + + +
    + + + + + + + + +
    + + +
    + + + k + +
    +
    + Minimun solver step. + + +
    + + + + + + + + +
    + + +
    + + + length + +
    +
    + Curve length. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + + applyAsPath(director) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    <=CAAT.Director>
    + +
    + + + + + + + + +
    + + +
    + + {number} + calcLength() + +
    +
    + Calculate the curve length by incrementally solving the curve every substep=CAAT.Curve.k. This value defaults +to .05 so at least 20 iterations will be performed. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number} the approximate curve length.
    + +
    + + + + +
    + + +
    + + {CAAT.Point} + endCurvePosition() + +
    +
    + Return the first curve control point. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + +
    + + +
    + + {CAAT.Rectangle} + getBoundingBox(rectangle) + +
    +
    + Calculates a curve bounding box. + + +
    + + + + +
    +
    Parameters:
    + +
    + rectangle + +
    +
    {CAAT.Rectangle} a rectangle to hold the bounding box.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Rectangle} the rectangle parameter.
    + +
    + + + + +
    + + +
    + + + getContour(numSamples) + +
    +
    + Get an array of points defining the curve contour. + + +
    + + + + +
    +
    Parameters:
    + +
    + numSamples + +
    +
    {number} number of segments to get.
    + +
    + + + + + + + + +
    + + +
    + + {number} + getLength() + +
    +
    + Return the cached curve length. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number} the cached curve length.
    + +
    + + + + +
    + + +
    + + + paint(director) + +
    +
    + Paint the curve control points. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + + + + + + + + +
    + + +
    + + + setPoint(point, index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPoints(points) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + points + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.Point} + solve(point, t) + +
    +
    + This method must be overriden by subclasses. It is called whenever the curve must be solved for some time=t. +The t parameter must be in the range 0..1 + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Point} to store curve solution for t.
    + +
    + t + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Point} the point parameter.
    + +
    + + + + +
    + + +
    + + {CAAT.Point} + startCurvePosition() + +
    +
    + Return the last curve control point. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + +
    + + +
    + + + update() + +
    +
    + Signal the curve has been modified and recalculate curve length. + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Math.Dimension.html b/documentation/jsdoc/symbols/CAAT.Math.Dimension.html new file mode 100644 index 00000000..157422f5 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Math.Dimension.html @@ -0,0 +1,702 @@ + + + + + + + JsDoc Reference - CAAT.Math.Dimension + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Math.Dimension +

    + + +

    + + + + + + +
    Defined in: Dimension.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + height +
    +
    Height dimension.
    +
      +
    + width +
    +
    Width dimension.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(w, h) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Math.Dimension() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + height + +
    +
    + Height dimension. + + +
    + + + + + + + + +
    + + +
    + + + width + +
    +
    + Width dimension. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Math.Matrix.html b/documentation/jsdoc/symbols/CAAT.Math.Matrix.html new file mode 100644 index 00000000..2cf1057b --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Math.Matrix.html @@ -0,0 +1,1604 @@ + + + + + + + JsDoc Reference - CAAT.Math.Matrix + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Math.Matrix +

    + + +

    + + + + + + +
    Defined in: Matrix.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + matrix +
    +
    An array of 9 numbers.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    copy(matrix) +
    +
    Copy into this matrix the given matrix values.
    +
      + +
    Creates a new inverse matrix from this matrix.
    +
      + +
    Set this matrix to the identity matrix.
    +
      +
    multiply(m) +
    +
    Multiply this matrix by a given matrix.
    +
      +
    multiplyScalar(scalar) +
    +
    Multiply this matrix by a scalar.
    +
      + +
    Premultiply this matrix by a given matrix.
    +
      +
    rotate(angle) +
    +
    Create a new rotation matrix and set it up for the specified angle in radians.
    +
      +
    scale(scalex, scaley) +
    +
    Create a scale matrix.
    +
      + +
    +
      +
    setModelViewMatrix(x, y, sx, sy, r) +
    +
    +
      +
    setRotation(angle) +
    +
    +
      +
    setScale(scalex, scaley) +
    +
    +
      +
    setTranslate(x, y) +
    +
    Sets this matrix as a translation matrix.
    +
      +
    transformCoord(point) +
    +
    Transform a point by this matrix.
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    translate(x, y) +
    +
    Create a translation matrix.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Math.Matrix() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + matrix + +
    +
    + An array of 9 numbers. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + copy(matrix) + +
    +
    + Copy into this matrix the given matrix values. + + +
    + + + + +
    +
    Parameters:
    + +
    + matrix + +
    +
    {CAAT.Matrix}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {CAAT.Matrix} + getInverse() + +
    +
    + Creates a new inverse matrix from this matrix. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Matrix} an inverse matrix.
    + +
    + + + + +
    + + +
    + + + identity() + +
    +
    + Set this matrix to the identity matrix. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + multiply(m) + +
    +
    + Multiply this matrix by a given matrix. + + +
    + + + + +
    +
    Parameters:
    + +
    + m + +
    +
    {CAAT.Matrix}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + multiplyScalar(scalar) + +
    +
    + Multiply this matrix by a scalar. + + +
    + + + + +
    +
    Parameters:
    + +
    + scalar + +
    +
    {number} scalar value
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + premultiply(m) + +
    +
    + Premultiply this matrix by a given matrix. + + +
    + + + + +
    +
    Parameters:
    + +
    + m + +
    +
    {CAAT.Matrix}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {CAAT.Matrix} + rotate(angle) + +
    +
    + Create a new rotation matrix and set it up for the specified angle in radians. + + +
    + + + + +
    +
    Parameters:
    + +
    + angle + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Matrix} a matrix object.
    + +
    + + + + +
    + + +
    + + {CAAT.Matrix} + scale(scalex, scaley) + +
    +
    + Create a scale matrix. + + +
    + + + + +
    +
    Parameters:
    + +
    + scalex + +
    +
    {number} x scale magnitude.
    + +
    + scaley + +
    +
    {number} y scale magnitude.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Matrix} a matrix object.
    + +
    + + + + +
    + + +
    + + + setCoordinateClamping(clamp) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + clamp + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setModelViewMatrix(x, y, sx, sy, r) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + sx + +
    +
    + +
    + sy + +
    +
    + +
    + r + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setRotation(angle) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + angle + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setScale(scalex, scaley) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + scalex + +
    +
    + +
    + scaley + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setTranslate(x, y) + +
    +
    + Sets this matrix as a translation matrix. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.Point} + transformCoord(point) + +
    +
    + Transform a point by this matrix. The parameter point will be modified with the transformation values. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Point}.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Point} the parameter point.
    + +
    + + + + +
    + + +
    + + + transformRenderingContext_Clamp(ctx) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + transformRenderingContext_NoClamp(ctx) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + transformRenderingContextSet_Clamp(ctx) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + transformRenderingContextSet_NoClamp(ctx) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.Matrix} + translate(x, y) + +
    +
    + Create a translation matrix. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number} x translation magnitude.
    + +
    + y + +
    +
    {number} y translation magnitude.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Matrix} a matrix object.
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Math.Matrix3.html b/documentation/jsdoc/symbols/CAAT.Math.Matrix3.html new file mode 100644 index 00000000..32d65479 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Math.Matrix3.html @@ -0,0 +1,1894 @@ + + + + + + + JsDoc Reference - CAAT.Math.Matrix3 + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Math.Matrix3 +

    + + +

    + + + + + + +
    Defined in: Matrix3.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + fmatrix +
    +
    An array of 16 numbers.
    +
      +
    + matrix +
    +
    An Array of 4 Array of 4 numbers.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      + +
    Calculate this matrix's determinant.
    +
      +
    copy(m) +
    +
    Copy a given matrix values into this one's.
    +
      +
    flatten() +
    +
    +
      + +
    Creates a new matrix being a copy of this matrix.
    +
      + +
    Return a new matrix which is this matrix's inverse matrix.
    +
      + +
    Get this matri'x internal representation data.
    +
      + +
    Set this matrix to identity matrix.
    +
      +
    initialize(x0, y0, z0, x1, y1, z1, x2, y2, z2) +
    +
    +
      +
    initWithMatrix(matrixData) +
    +
    +
      +
    multiply(n) +
    +
    Multiplies this matrix by another matrix.
    +
      +
    multiplyScalar(scalar) +
    +
    Multiply this matrix by a scalar.
    +
      + +
    Pre multiplies this matrix by a given matrix.
    +
      +
    rotate(xy, xz, yz) +
    +
    Creates a matrix to represent arbitrary rotations around the given planes.
    +
      +
    rotateModelView(xy, xz, yz) +
    +
    Set this matrix as the rotation matrix around the given axes.
    +
      +
    rotateXY(xy) +
    +
    Multiply this matrix by a created rotation matrix.
    +
      +
    rotateXZ(xz) +
    +
    Multiply this matrix by a created rotation matrix.
    +
      +
    rotateYZ(yz) +
    +
    Multiply this matrix by a created rotation matrix.
    +
      +
    scale(sx, sy, sz) +
    +
    +
      +
    setRotate(xy, xz, yz) +
    +
    +
      +
    setScale(sx, sy, sz) +
    +
    +
      +
    setTranslate(x, y, z) +
    +
    Set this matrix translation values to be the given parameters.
    +
      +
    transformCoord(point) +
    +
    +
      +
    translate(x, y, z) +
    +
    Create a translation matrix.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Math.Matrix3() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + fmatrix + +
    +
    + An array of 16 numbers. + + +
    + + + + + + + + +
    + + +
    + + + matrix + +
    +
    + An Array of 4 Array of 4 numbers. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {number} + calculateDeterminant() + +
    +
    + Calculate this matrix's determinant. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number} matrix determinant.
    + +
    + + + + +
    + + +
    + + + copy(m) + +
    +
    + Copy a given matrix values into this one's. + + +
    + + + + +
    +
    Parameters:
    + +
    + m + +
    +
    {CAAT.Matrix} a matrix
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + flatten() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {CAAT.Matrix3} + getClone() + +
    +
    + Creates a new matrix being a copy of this matrix. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Matrix3} a newly allocated matrix object.
    + +
    + + + + +
    + + +
    + + {CAAT.Matrix3} + getInverse() + +
    +
    + Return a new matrix which is this matrix's inverse matrix. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Matrix3} a new matrix.
    + +
    + + + + +
    + + +
    + + + getMatrix() + +
    +
    + Get this matri'x internal representation data. The bakced structure is a 4x4 array of number. + + +
    + + + + + + + + + + + +
    + + +
    + + + identity() + +
    +
    + Set this matrix to identity matrix. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + initialize(x0, y0, z0, x1, y1, z1, x2, y2, z2) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x0 + +
    +
    + +
    + y0 + +
    +
    + +
    + z0 + +
    +
    + +
    + x1 + +
    +
    + +
    + y1 + +
    +
    + +
    + z1 + +
    +
    + +
    + x2 + +
    +
    + +
    + y2 + +
    +
    + +
    + z2 + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + initWithMatrix(matrixData) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + matrixData + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + multiply(n) + +
    +
    + Multiplies this matrix by another matrix. + + +
    + + + + +
    +
    Parameters:
    + +
    + n + +
    +
    {CAAT.Matrix3} a CAAT.Matrix3 object.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + multiplyScalar(scalar) + +
    +
    + Multiply this matrix by a scalar. + + +
    + + + + +
    +
    Parameters:
    + +
    + scalar + +
    +
    {number} scalar value
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + premultiply(m) + +
    +
    + Pre multiplies this matrix by a given matrix. + + +
    + + + + +
    +
    Parameters:
    + +
    + m + +
    +
    {CAAT.Matrix3} a CAAT.Matrix3 object.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {CAAT.Matrix3} + rotate(xy, xz, yz) + +
    +
    + Creates a matrix to represent arbitrary rotations around the given planes. + + +
    + + + + +
    +
    Parameters:
    + +
    + xy + +
    +
    {number} radians to rotate around xy plane.
    + +
    + xz + +
    +
    {number} radians to rotate around xz plane.
    + +
    + yz + +
    +
    {number} radians to rotate around yz plane.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Matrix3} a newly allocated matrix.
    + +
    + + + + +
    + + +
    + + + rotateModelView(xy, xz, yz) + +
    +
    + Set this matrix as the rotation matrix around the given axes. + + +
    + + + + +
    +
    Parameters:
    + +
    + xy + +
    +
    {number} radians of rotation around z axis.
    + +
    + xz + +
    +
    {number} radians of rotation around y axis.
    + +
    + yz + +
    +
    {number} radians of rotation around x axis.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + rotateXY(xy) + +
    +
    + Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate around +xy axis. + + +
    + + + + +
    +
    Parameters:
    + +
    + xy + +
    +
    {Number} radians to rotate.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + rotateXZ(xz) + +
    +
    + Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate around +xz axis. + + +
    + + + + +
    +
    Parameters:
    + +
    + xz + +
    +
    {Number} radians to rotate.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + rotateYZ(yz) + +
    +
    + Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate aroind +yz axis. + + +
    + + + + +
    +
    Parameters:
    + +
    + yz + +
    +
    {Number} radians to rotate.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + scale(sx, sy, sz) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + sx + +
    +
    + +
    + sy + +
    +
    + +
    + sz + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setRotate(xy, xz, yz) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + xy + +
    +
    + +
    + xz + +
    +
    + +
    + yz + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setScale(sx, sy, sz) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + sx + +
    +
    + +
    + sy + +
    +
    + +
    + sz + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setTranslate(x, y, z) + +
    +
    + Set this matrix translation values to be the given parameters. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number} x component of translation point.
    + +
    + y + +
    +
    {number} y component of translation point.
    + +
    + z + +
    +
    {number} z component of translation point.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + transformCoord(point) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.Matrix3} + translate(x, y, z) + +
    +
    + Create a translation matrix. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number}
    + +
    + y + +
    +
    {number}
    + +
    + z + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Matrix3} a new matrix.
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Math.Point.html b/documentation/jsdoc/symbols/CAAT.Math.Point.html new file mode 100644 index 00000000..9f6734ff --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Math.Point.html @@ -0,0 +1,1582 @@ + + + + + + + JsDoc Reference - CAAT.Math.Point + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Math.Point +

    + + +

    + + + + + + +
    Defined in: Point.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + x +
    +
    point x coordinate.
    +
      +
    + y +
    +
    point y coordinate.
    +
      +
    + z +
    +
    point z coordinate.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(xpos, ypos, zpos) +
    +
    +
      +
    clone() +
    +
    Create a new CAAT.Point equal to this one.
    +
      + +
    Return the angle from -Pi to Pi of this point.
    +
      +
    getDistance(point) +
    +
    Get the distance between two points.
    +
      + +
    Get the squared distance between two points.
    +
      + +
    Get this point's lenght.
    +
      + +
    Get this point's squared length.
    +
      +
    limit(max) +
    +
    Set this point coordinates proportinally to a maximum value.
    +
      +
    multiply(factor) +
    +
    Multiply this point by a scalar.
    +
      + +
    Normalize this point, that is, both set coordinates proportionally to values raning 0.
    +
      +
    rotate(angle) +
    +
    Rotate this point by an angle.
    +
      +
    set(x, y, z) +
    +
    Sets this point coordinates.
    +
      +
    setAngle(angle) +
    +
    +
      +
    setLength(length) +
    +
    +
      +
    subtract(aPoint) +
    +
    Substract a point from this one.
    +
      + +
    Get a string representation.
    +
      +
    translate(x, y, z) +
    +
    Translate this point to another position.
    +
      +
    translatePoint(aPoint) +
    +
    Translate this point to another point.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Math.Point() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + x + +
    +
    + point x coordinate. + + +
    + + + + + + + + +
    + + +
    + + + y + +
    +
    + point y coordinate. + + +
    + + + + + + + + +
    + + +
    + + + z + +
    +
    + point z coordinate. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(xpos, ypos, zpos) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + xpos + +
    +
    + +
    + ypos + +
    +
    + +
    + zpos + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.Point} + clone() + +
    +
    + Create a new CAAT.Point equal to this one. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + +
    + + +
    + + {number} + getAngle() + +
    +
    + Return the angle from -Pi to Pi of this point. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + {number} + getDistance(point) + +
    +
    + Get the distance between two points. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Point}
    + +
    + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + {number} + getDistanceSquared(point) + +
    +
    + Get the squared distance between two points. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Point}
    + +
    + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + {number} + getLength() + +
    +
    + Get this point's lenght. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + {number} + getLengthSquared() + +
    +
    + Get this point's squared length. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + limit(max) + +
    +
    + Set this point coordinates proportinally to a maximum value. + + +
    + + + + +
    +
    Parameters:
    + +
    + max + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + multiply(factor) + +
    +
    + Multiply this point by a scalar. + + +
    + + + + +
    +
    Parameters:
    + +
    + factor + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + normalize() + +
    +
    + Normalize this point, that is, both set coordinates proportionally to values raning 0..1 + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + rotate(angle) + +
    +
    + Rotate this point by an angle. The rotation is held by (0,0) coordinate as center. + + +
    + + + + +
    +
    Parameters:
    + +
    + angle + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + set(x, y, z) + +
    +
    + Sets this point coordinates. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number}
    + +
    + y + +
    +
    {number}
    + +
    + z + +
    +
    {number=}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setAngle(angle) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + angle + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setLength(length) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + length + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + subtract(aPoint) + +
    +
    + Substract a point from this one. + + +
    + + + + +
    +
    Parameters:
    + +
    + aPoint + +
    +
    {CAAT.Point}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {string} + toString() + +
    +
    + Get a string representation. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {string}
    + +
    + + + + +
    + + +
    + + + translate(x, y, z) + +
    +
    + Translate this point to another position. The final point will be (point.x+x, point.y+y) + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number}
    + +
    + y + +
    +
    {number}
    + +
    + z + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + translatePoint(aPoint) + +
    +
    + Translate this point to another point. + + +
    + + + + +
    +
    Parameters:
    + +
    + aPoint + +
    +
    {CAAT.Point}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Math.Rectangle.html b/documentation/jsdoc/symbols/CAAT.Math.Rectangle.html new file mode 100644 index 00000000..896030f4 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Math.Rectangle.html @@ -0,0 +1,1395 @@ + + + + + + + JsDoc Reference - CAAT.Math.Rectangle + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Math.Rectangle +

    + + +

    + + + + + + +
    Defined in: Rectangle.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + height +
    +
    Rectangle height.
    +
      +
    + width +
    +
    Rectangle width.
    +
      +
    + x +
    +
    Rectangle x position.
    +
      +
    + x1 +
    +
    Rectangle x1 position.
    +
      +
    + y +
    +
    Rectangle y position.
    +
      +
    + y1 +
    +
    Rectangle y1 position.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(x, y, w, h) +
    +
    +
      +
    contains(px, py) +
    +
    Return whether the coordinate is inside this rectangle.
    +
      +
    intersect(i, r) +
    +
    +
      + +
    +
      +
    intersectsRect(x, y, w, h) +
    +
    +
      +
    isEmpty() +
    +
    Return whether this rectangle is empty, that is, has zero dimension.
    +
      +
    setBounds(x, y, w, h) +
    +
    +
      +
    setDimension(w, h) +
    +
    Set this rectangle's dimension.
    +
      + +
    +
      +
    setLocation(x, y) +
    +
    Set this rectangle's location.
    +
      +
    union(px, py) +
    +
    Set this rectangle as the union of this rectangle and the given point.
    +
      +
    unionRectangle(rectangle) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Math.Rectangle() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + height + +
    +
    + Rectangle height. + + +
    + + + + + + + + +
    + + +
    + + + width + +
    +
    + Rectangle width. + + +
    + + + + + + + + +
    + + +
    + + + x + +
    +
    + Rectangle x position. + + +
    + + + + + + + + +
    + + +
    + + + x1 + +
    +
    + Rectangle x1 position. + + +
    + + + + + + + + +
    + + +
    + + + y + +
    +
    + Rectangle y position. + + +
    + + + + + + + + +
    + + +
    + + + y1 + +
    +
    + Rectangle y1 position. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(x, y, w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {boolean} + contains(px, py) + +
    +
    + Return whether the coordinate is inside this rectangle. + + +
    + + + + +
    +
    Parameters:
    + +
    + px + +
    +
    {number}
    + +
    + py + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    {boolean}
    + +
    + + + + +
    + + +
    + + + intersect(i, r) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + i + +
    +
    + +
    + r + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + intersects(r) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + r + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + intersectsRect(x, y, w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {boolean} + isEmpty() + +
    +
    + Return whether this rectangle is empty, that is, has zero dimension. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {boolean}
    + +
    + + + + +
    + + +
    + + + setBounds(x, y, w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setDimension(w, h) + +
    +
    + Set this rectangle's dimension. + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    {number}
    + +
    + h + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setEmpty() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + setLocation(x, y) + +
    +
    + Set this rectangle's location. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number}
    + +
    + y + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + union(px, py) + +
    +
    + Set this rectangle as the union of this rectangle and the given point. + + +
    + + + + +
    +
    Parameters:
    + +
    + px + +
    +
    {number}
    + +
    + py + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + unionRectangle(rectangle) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + rectangle + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Math.html b/documentation/jsdoc/symbols/CAAT.Math.html new file mode 100644 index 00000000..85e041f4 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Math.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Math + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Math +

    + + +

    + + + + + + +
    Defined in: Bezier.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      +
    + CAAT.Math +
    +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Math +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Audio.AudioManager.html b/documentation/jsdoc/symbols/CAAT.Module.Audio.AudioManager.html new file mode 100644 index 00000000..a725dc33 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Audio.AudioManager.html @@ -0,0 +1,1984 @@ + + + + + + + JsDoc Reference - CAAT.Module.Audio.AudioManager + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Audio.AudioManager +

    + + +

    + + + + + + +
    Defined in: AudioManager.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    A collection of Audio objects.
    +
      + +
    available formats for audio elements.
    +
      + +
    Audio formats.
    +
      +
    + channels +
    +
    A cache of empty Audio objects.
    +
      +
    + fxEnabled +
    +
    Are FX sounds enabled ?
    +
      + +
    Currently looping Audio objects.
    +
      + +
    The only background music audio channel.
    +
      + +
    Is music enabled ?
    +
      + +
    Currently used Audio objects.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   + +
    +
    <private>   +
    __init() +
    +
    +
    <private>   + +
    +
      +
    addAudio(id, array_of_url_or_domnodes, endplaying_callback) +
    +
    creates an Audio object and adds it to the audio cache.
    +
    <private>   +
    addAudioElement(id, element, endplaying_callback) +
    +
    Adds an elements to the audio cache.
    +
    <private>   +
    addAudioFromDomNode(id, audio, endplaying_callback) +
    +
    Tries to add an audio tag to the available list of valid audios.
    +
    <private>   +
    addAudioFromURL(id, url, endplaying_callback) +
    +
    Tries to add an audio tag to the available list of valid audios.
    +
      +
    cancelPlay(id) +
    +
    cancel all instances of a sound identified by id.
    +
      +
    cancelPlayByChannel(audioObject) +
    +
    cancel a channel sound
    +
      + +
    Cancel all playing audio channels +Get back the playing channels to available channel list.
    +
      +
    getAudio(aId) +
    +
    Returns an audio object.
    +
      +
    initialize(numChannels) +
    +
    Initializes the sound subsystem by creating a fixed number of Audio channels.
    +
      + +
    +
      + +
    +
      +
    loop(id) +
    +
    This method creates a new AudioChannel to loop the sound with.
    +
      +
    play(id) +
    +
    Plays an audio file from the cache if any sound channel is available.
    +
      +
    playMusic(id) +
    +
    +
      + +
    +
      +
    setMusicEnabled(enable) +
    +
    +
      + +
    +
      +
    setVolume(id, volume) +
    +
    Set an audio object volume.
    +
      + +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Audio.AudioManager() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + audioCache + +
    +
    + A collection of Audio objects. + + +
    + + + + + + + + +
    + + +
    + + + audioFormatExtensions + +
    +
    + available formats for audio elements. +the system will load audio files with the extensions in this preferred order. + + +
    + + + + + + + + +
    + + +
    + + + audioTypes + +
    +
    + Audio formats. + + +
    + + + + + + + + +
    + + +
    + + + channels + +
    +
    + A cache of empty Audio objects. + + +
    + + + + + + + + +
    + + +
    + + + fxEnabled + +
    +
    + Are FX sounds enabled ? + + +
    + + + + + + + + +
    + + +
    + + + loopingChannels + +
    +
    + Currently looping Audio objects. + + +
    + + + + + + + + +
    + + +
    + + + musicChannel + +
    +
    + The only background music audio channel. + + +
    + + + + + + + + +
    + + +
    + + + musicEnabled + +
    +
    + Is music enabled ? + + +
    + + + + + + + + +
    + + +
    + + + workingChannels + +
    +
    + Currently used Audio objects. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __getAudioUrl(url) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + url + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + __setCurrentAudioFormatExtension() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + addAudio(id, array_of_url_or_domnodes, endplaying_callback) + +
    +
    + creates an Audio object and adds it to the audio cache. +This function expects audio data described by two elements, an id and an object which will +describe an audio element to be associated with the id. The object will be of the form +array, dom node or a url string. + +

    +The audio element can be one of the two forms: + +

      +
    1. Either an HTMLAudioElement/Audio object or a string url. +
    2. An array of elements of the previous form. +
    + +

    +When the audio attribute is an array, this function will iterate throught the array elements +until a suitable audio element to be played is found. When this is the case, the other array +elements won't be taken into account. The valid form of using this addAudio method will be: + +

    +1.
    +addAudio( id, url } ). In this case, if the resource pointed by url is +not suitable to be played (i.e. a call to the Audio element's canPlayType method return 'no') +no resource will be added under such id, so no sound will be played when invoking the play(id) +method. +

    +2.
    +addAudio( id, dom_audio_tag ). In this case, the same logic than previous case is applied, but +this time, the parameter url is expected to be an audio tag present in the html file. +

    +3.
    +addAudio( id, [array_of_url_or_domaudiotag] ). In this case, the function tries to locate a valid +resource to be played in any of the elements contained in the array. The array element's can +be any type of case 1 and 2. As soon as a valid resource is found, it will be associated to the +id in the valid audio resources to be played list. + + +

    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + array_of_url_or_domnodes + +
    +
    + +
    + endplaying_callback + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    <private> + + {boolean} + addAudioElement(id, element, endplaying_callback) + +
    +
    + Adds an elements to the audio cache. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {object} an object to associate the audio element (if suitable to be played).
    + +
    + element + +
    +
    {URL|HTMLElement} an url or html audio tag.
    + +
    + endplaying_callback + +
    +
    {function} callback to be called upon sound end.
    + +
    + + + + + +
    +
    Returns:
    + +
    {boolean} a boolean indicating whether the browser can play this resource.
    + +
    + + + + +
    + + +
    <private> + + {boolean} + addAudioFromDomNode(id, audio, endplaying_callback) + +
    +
    + Tries to add an audio tag to the available list of valid audios. The audio element comes from +an HTMLAudioElement. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {object} an object to associate the audio element (if suitable to be played).
    + +
    + audio + +
    +
    {HTMLAudioElement} a DOM audio node.
    + +
    + endplaying_callback + +
    +
    {function} callback to be called upon sound end.
    + +
    + + + + + +
    +
    Returns:
    + +
    {boolean} a boolean indicating whether the browser can play this resource.
    + +
    + + + + +
    + + +
    <private> + + {boolean} + addAudioFromURL(id, url, endplaying_callback) + +
    +
    + Tries to add an audio tag to the available list of valid audios. The audio is described by a url. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {object} an object to associate the audio element (if suitable to be played).
    + +
    + url + +
    +
    {string} a string describing an url.
    + +
    + endplaying_callback + +
    +
    {function} callback to be called upon sound end.
    + +
    + + + + + +
    +
    Returns:
    + +
    {boolean} a boolean indicating whether the browser can play this resource.
    + +
    + + + + +
    + + +
    + + {*} + cancelPlay(id) + +
    +
    + cancel all instances of a sound identified by id. This id is the value set +to identify a sound. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + {*} + cancelPlayByChannel(audioObject) + +
    +
    + cancel a channel sound + + +
    + + + + +
    +
    Parameters:
    + +
    + audioObject + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + endSound() + +
    +
    + Cancel all playing audio channels +Get back the playing channels to available channel list. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {object} + getAudio(aId) + +
    +
    + Returns an audio object. + + +
    + + + + +
    +
    Parameters:
    + +
    + aId + +
    +
    {object} the id associated to the target Audio object.
    + +
    + + + + + +
    +
    Returns:
    + +
    {object} the HTMLAudioElement addociated to the given id.
    + +
    + + + + +
    + + +
    + + + initialize(numChannels) + +
    +
    + Initializes the sound subsystem by creating a fixed number of Audio channels. +Every channel registers a handler for sound playing finalization. If a callback is set, the +callback function will be called with the associated sound id in the cache. + + +
    + + + + +
    +
    Parameters:
    + +
    + numChannels + +
    +
    {number} number of channels to pre-create. 8 by default.
    + +
    + + + + + +
    +
    Returns:
    + +
    this.
    + +
    + + + + +
    + + +
    + + + isMusicEnabled() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isSoundEffectsEnabled() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {HTMLElement} + loop(id) + +
    +
    + This method creates a new AudioChannel to loop the sound with. +It returns an Audio object so that the developer can cancel the sound loop at will. +The user must call pause() method to stop playing a loop. +

    +Firefox does not honor the loop property, so looping is performed by attending end playing +event on audio elements. + + +

    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    {HTMLElement} an Audio instance if a valid sound id is supplied. Null otherwise
    + +
    + + + + +
    + + +
    + + {id: {Object}|audio: {(Audio|HTMLAudioElement)}} + play(id) + +
    +
    + Plays an audio file from the cache if any sound channel is available. +The playing sound will occupy a sound channel and when ends playing will leave +the channel free for any other sound to be played in. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {object} an object identifying a sound in the sound cache.
    + +
    + + + + + +
    +
    Returns:
    + +
    {id: {Object}|audio: {(Audio|HTMLAudioElement)}}
    + +
    + + + + +
    + + +
    + + + playMusic(id) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setAudioFormatExtensions(formats) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + formats + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setMusicEnabled(enable) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + enable + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setSoundEffectsEnabled(enable) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + enable + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setVolume(id, volume) + +
    +
    + Set an audio object volume. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {object} an audio Id
    + +
    + volume + +
    +
    {number} volume to set. The volume value is not checked.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + stopMusic() + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Audio.html b/documentation/jsdoc/symbols/CAAT.Module.Audio.html new file mode 100644 index 00000000..3f46bad8 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Audio.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.Audio + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Audio +

    + + +

    + + + + + + +
    Defined in: AudioManager.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Audio +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircle.html b/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircle.html new file mode 100644 index 00000000..2e7df24f --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircle.html @@ -0,0 +1,1688 @@ + + + + + + + JsDoc Reference - CAAT.Module.CircleManager.PackedCircle + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.CircleManager.PackedCircle +

    + + +

    + + + + + + +
    Defined in: PackedCircle.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   +
    + CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_CONSTRAINT +
    +
    +
    <static>   +
    + CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_DESTROY +
    +
    +
    <static>   +
    + CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_IGNORE +
    +
    +
    <static>   +
    + CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_WRAP +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    + delegate +
    +
    +
      +
    + id +
    +
    +
      +
    + isFixed +
    +
    +
      +
    + offset +
    +
    +
      +
    + position +
    +
    +
      + +
    +
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    containsPoint(aPoint) +
    +
    +
      +
    dealloc() +
    +
    +
      + +
    +
      +
    initialize(overrides) +
    +
    +
      +
    intersects(aCircle) +
    +
    +
      +
    setCollisionGroup(aCollisionGroup) +
    +
    +
      +
    setCollisionMask(aCollisionMask) +
    +
    +
      +
    setDelegate(aDelegate) +
    +
    +
      +
    setIsFixed(value) +
    +
    +
      +
    setOffset(aPosition) +
    +
    +
      +
    setPosition(aPosition) +
    +
    ACCESSORS
    +
      +
    setRadius(aRadius) +
    +
    +
      +
    setTargetChaseSpeed(aTargetChaseSpeed) +
    +
    +
      +
    setTargetPosition(aTargetPosition) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.CircleManager.PackedCircle() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_CONSTRAINT + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_DESTROY + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_IGNORE + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_WRAP + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + boundsRule + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + collisionGroup + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + collisionMask + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + delegate + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + id + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + isFixed + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + offset + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + position + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + targetChaseSpeed + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + targetPosition + +
    +
    + + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + containsPoint(aPoint) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aPoint + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + dealloc() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getDistanceSquaredFromPosition(aPosition) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aPosition + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + initialize(overrides) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + overrides + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + intersects(aCircle) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aCircle + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setCollisionGroup(aCollisionGroup) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aCollisionGroup + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setCollisionMask(aCollisionMask) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aCollisionMask + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setDelegate(aDelegate) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aDelegate + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setIsFixed(value) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + value + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setOffset(aPosition) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aPosition + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPosition(aPosition) + +
    +
    + ACCESSORS + + +
    + + + + +
    +
    Parameters:
    + +
    + aPosition + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setRadius(aRadius) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aRadius + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setTargetChaseSpeed(aTargetChaseSpeed) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aTargetChaseSpeed + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setTargetPosition(aTargetPosition) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aTargetPosition + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircleManager.html b/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircleManager.html new file mode 100644 index 00000000..15d0bcd6 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.CircleManager.PackedCircleManager.html @@ -0,0 +1,1397 @@ + + + + + + + JsDoc Reference - CAAT.Module.CircleManager.PackedCircleManager + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.CircleManager.PackedCircleManager +

    + + +

    + + + + + + +
    Defined in: PackedCircleManager.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    +
      +
    + bounds +
    +
    +
      + +
    +
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    addCircle(aCircle) +
    +
    Adds a circle to the simulation
    +
      +
    circlesCanCollide(circleA, circleB) +
    +
    +
      + +
    Forces all circles to move to where their delegate position is +Assumes all targets have a 'position' property!
    +
      +
    getCircleAt(xpos, ypos, buffer) +
    +
    Given an x,y position finds circle underneath and sets it to the currently grabbed circle
    +
      +
    handleBoundaryForCircle(aCircle, boundsRule) +
    +
    +
      + +
    Packs the circles towards the center of the bounds.
    +
      +
    initialize(overrides) +
    +
    +
      + +
    +
      +
    removeCircle(aCircle) +
    +
    Removes a circle from the simulations
    +
      + +
    Memory Management
    +
      +
    setBounds(x, y, w, h) +
    +
    Accessors
    +
      + +
    +
      + +
    +
      +
    sortOnDistanceToTarget(circleA, circleB) +
    +
    Helpers
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.CircleManager.PackedCircleManager() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + allCircles + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + bounds + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + numberOfCollisionPasses + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + numberOfTargetingPasses + +
    +
    + + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + addCircle(aCircle) + +
    +
    + Adds a circle to the simulation + + +
    + + + + +
    +
    Parameters:
    + +
    + aCircle + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + circlesCanCollide(circleA, circleB) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + circleA + +
    +
    + +
    + circleB + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + forceCirclesToMatchDelegatePositions() + +
    +
    + Forces all circles to move to where their delegate position is +Assumes all targets have a 'position' property! + + +
    + + + + + + + + + + + +
    + + +
    + + + getCircleAt(xpos, ypos, buffer) + +
    +
    + Given an x,y position finds circle underneath and sets it to the currently grabbed circle + + +
    + + + + +
    +
    Parameters:
    + +
    + {Number} xpos + +
    +
    An x position
    + +
    + {Number} ypos + +
    +
    A y position
    + +
    + {Number} buffer + +
    +
    A radiusSquared around the point in question where something is considered to match
    + +
    + + + + + + + + +
    + + +
    + + + handleBoundaryForCircle(aCircle, boundsRule) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aCircle + +
    +
    + +
    + boundsRule + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + handleCollisions() + +
    +
    + Packs the circles towards the center of the bounds. +Each circle will have it's own 'targetPosition' later on + + +
    + + + + + + + + + + + +
    + + +
    + + + initialize(overrides) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + overrides + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + pushAllCirclesTowardTarget(aTarget) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + aTarget + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + removeCircle(aCircle) + +
    +
    + Removes a circle from the simulations + + +
    + + + + +
    +
    Parameters:
    + +
    + aCircle + +
    +
    Circle to remove
    + +
    + + + + + + + + +
    + + +
    + + + removeExpiredElements() + +
    +
    + Memory Management + + +
    + + + + + + + + + + + +
    + + +
    + + + setBounds(x, y, w, h) + +
    +
    + Accessors + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setNumberOfCollisionPasses(value) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + value + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setNumberOfTargetingPasses(value) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + value + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + sortOnDistanceToTarget(circleA, circleB) + +
    +
    + Helpers + + +
    + + + + +
    +
    Parameters:
    + +
    + circleA + +
    +
    + +
    + circleB + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.CircleManager.html b/documentation/jsdoc/symbols/CAAT.Module.CircleManager.html new file mode 100644 index 00000000..6e23dc8c --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.CircleManager.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.CircleManager + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.CircleManager +

    + + +

    + + + + + + +
    Defined in: PackedCircle.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.CircleManager +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Collision.QuadTree.html b/documentation/jsdoc/symbols/CAAT.Module.Collision.QuadTree.html new file mode 100644 index 00000000..0b063614 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Collision.QuadTree.html @@ -0,0 +1,829 @@ + + + + + + + JsDoc Reference - CAAT.Module.Collision.QuadTree + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Collision.QuadTree +

    + + +

    + + + + + + +
    Defined in: Quadtree.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + bgActors +
    +
    For each quadtree level this keeps the list of overlapping elements.
    +
      +
    + quadData +
    +
    For each quadtree, this quadData keeps another 4 quadtrees up to the maximum recursion level.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   + +
    +
      +
    create(l, t, r, b, backgroundElements, minWidth, maxElements) +
    +
    +
      +
    getOverlappingActors(rectangle) +
    +
    Call this method to thet the list of colliding elements with the parameter rectangle.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Collision.QuadTree() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + bgActors + +
    +
    + For each quadtree level this keeps the list of overlapping elements. + + +
    + + + + + + + + +
    + + +
    + + + quadData + +
    +
    + For each quadtree, this quadData keeps another 4 quadtrees up to the maximum recursion level. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __getOverlappingActorList(actorList) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + actorList + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + create(l, t, r, b, backgroundElements, minWidth, maxElements) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + l + +
    +
    + +
    + t + +
    +
    + +
    + r + +
    +
    + +
    + b + +
    +
    + +
    + backgroundElements + +
    +
    + +
    + minWidth + +
    +
    + +
    + maxElements + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {Array} + getOverlappingActors(rectangle) + +
    +
    + Call this method to thet the list of colliding elements with the parameter rectangle. + + +
    + + + + +
    +
    Parameters:
    + +
    + rectangle + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    {Array}
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Collision.SpatialHash.html b/documentation/jsdoc/symbols/CAAT.Module.Collision.SpatialHash.html new file mode 100644 index 00000000..e702cfc9 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Collision.SpatialHash.html @@ -0,0 +1,1181 @@ + + + + + + + JsDoc Reference - CAAT.Module.Collision.SpatialHash + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Collision.SpatialHash +

    + + +

    + + + + + + +
    Defined in: SpatialHash.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + columns +
    +
    Columns to partition the space.
    +
      +
    + elements +
    +
    A collection ob objects to test collision among them.
    +
      +
    + height +
    +
    Space height
    +
      +
    + r0 +
    +
    Spare rectangle to hold temporary calculations.
    +
      +
    + r1 +
    +
    Spare rectangle to hold temporary calculations.
    +
      +
    + rows +
    +
    Rows to partition the space.
    +
      +
    + width +
    +
    Space width
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __getCells(x, y, width, height) +
    +
    +
    <private>   +
    _solveCollisionCell(cell, callback) +
    +
    +
      +
    addObject(obj) +
    +
    Add an element of the form { id, x,y,width,height, rectangular }
    +
      + +
    +
      +
    collide(x, y, w, h, oncollide) +
    +
    +
      +
    initialize(w, h, rows, columns) +
    +
    +
      +
    solveCollision(callback) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Collision.SpatialHash() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + columns + +
    +
    + Columns to partition the space. + + +
    + + + + + + + + +
    + + +
    + + + elements + +
    +
    + A collection ob objects to test collision among them. + + +
    + + + + + + + + +
    + + +
    + + + height + +
    +
    + Space height + + +
    + + + + + + + + +
    + + +
    + + + r0 + +
    +
    + Spare rectangle to hold temporary calculations. + + +
    + + + + + + + + +
    + + +
    + + + r1 + +
    +
    + Spare rectangle to hold temporary calculations. + + +
    + + + + + + + + +
    + + +
    + + + rows + +
    +
    + Rows to partition the space. + + +
    + + + + + + + + +
    + + +
    + + + width + +
    +
    + Space width + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __getCells(x, y, width, height) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + width + +
    +
    + +
    + height + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + _solveCollisionCell(cell, callback) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + cell + +
    +
    + +
    + callback + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addObject(obj) + +
    +
    + Add an element of the form { id, x,y,width,height, rectangular } + + +
    + + + + +
    +
    Parameters:
    + +
    + obj + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + clearObject() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + collide(x, y, w, h, oncollide) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + oncollide + +
    +
    function that returns boolean. if returns true, stop testing collision.
    + +
    + + + + + + + + +
    + + +
    + + + initialize(w, h, rows, columns) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + rows + +
    +
    + +
    + columns + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + solveCollision(callback) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + callback + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Collision.html b/documentation/jsdoc/symbols/CAAT.Module.Collision.html new file mode 100644 index 00000000..9ad203a9 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Collision.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.Collision + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Collision +

    + + +

    + + + + + + +
    Defined in: Quadtree.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Collision +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.Color.html b/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.Color.html new file mode 100644 index 00000000..a6dcabc3 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.Color.html @@ -0,0 +1,886 @@ + + + + + + + JsDoc Reference - CAAT.Module.ColorUtil.Color + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.ColorUtil.Color +

    + + +

    + + + + + + +
    Defined in: Color.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   +
    + CAAT.Module.ColorUtil.Color.RampEnumeration +
    +
    Enumeration to define types of color ramps.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <static>   +
    CAAT.Module.ColorUtil.Color.hsvToRgb(h, s, v) +
    +
    HSV to RGB color conversion +

    +H runs from 0 to 360 degrees
    +S and V run from 0 to 100 +

    +Ported from the excellent java algorithm by Eugene Vishnevsky at: +http://www.cs.rit.edu/~ncs/color/t_convert.html

    +
    <static>   +
    CAAT.Module.ColorUtil.Color.interpolate(r0, g0, b0, r1, g1, b1, nsteps, step) +
    +
    Interpolate the color between two given colors.
    +
    <static>   +
    CAAT.Module.ColorUtil.Color.makeRGBColorRamp(fromColorsArray, rampSize, returnType) +
    +
    Generate a ramp of colors from an array of given colors.
    +
    <static>   +
    CAAT.Module.ColorUtil.Color.random() +
    +
    +
    + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.ColorUtil.Color +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.Module.ColorUtil.Color.RampEnumeration + +
    +
    + Enumeration to define types of color ramps. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <static> + + + CAAT.Module.ColorUtil.Color.hsvToRgb(h, s, v) + +
    +
    + HSV to RGB color conversion +

    +H runs from 0 to 360 degrees
    +S and V run from 0 to 100 +

    +Ported from the excellent java algorithm by Eugene Vishnevsky at: +http://www.cs.rit.edu/~ncs/color/t_convert.html + + +

    + + + + +
    +
    Parameters:
    + +
    + h + +
    +
    + +
    + s + +
    +
    + +
    + v + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + {{r{number}|g{number}|b{number}}} + CAAT.Module.ColorUtil.Color.interpolate(r0, g0, b0, r1, g1, b1, nsteps, step) + +
    +
    + Interpolate the color between two given colors. The return value will be a calculated color +among the two given initial colors which corresponds to the 'step'th color of the 'nsteps' +calculated colors. + + +
    + + + + +
    +
    Parameters:
    + +
    + r0 + +
    +
    {number} initial color red component.
    + +
    + g0 + +
    +
    {number} initial color green component.
    + +
    + b0 + +
    +
    {number} initial color blue component.
    + +
    + r1 + +
    +
    {number} final color red component.
    + +
    + g1 + +
    +
    {number} final color green component.
    + +
    + b1 + +
    +
    {number} final color blue component.
    + +
    + nsteps + +
    +
    {number} number of colors to calculate including the two given colors. If 16 is passed as value, +14 colors plus the two initial ones will be calculated.
    + +
    + step + +
    +
    {number} return this color index of all the calculated colors.
    + +
    + + + + + +
    +
    Returns:
    + +
    {{r{number}|g{number}|b{number}}} return an object with the new calculated color components.
    + +
    + + + + +
    + + +
    <static> + + {[{number}|{number}|{number}|{number}]} + CAAT.Module.ColorUtil.Color.makeRGBColorRamp(fromColorsArray, rampSize, returnType) + +
    +
    + Generate a ramp of colors from an array of given colors. + + +
    + + + + +
    +
    Parameters:
    + +
    + fromColorsArray + +
    +
    {[number]} an array of colors. each color is defined by an integer number from which +color components will be extracted. Be aware of the alpha component since it will also be interpolated for +new colors.
    + +
    + rampSize + +
    +
    {number} number of colors to produce.
    + +
    + returnType + +
    +
    {CAAT.ColorUtils.RampEnumeration} a value of CAAT.ColorUtils.RampEnumeration enumeration.
    + +
    + + + + + +
    +
    Returns:
    + +
    {[{number}|{number}|{number}|{number}]} an array of integers each of which represents a color of +the calculated color ramp.
    + +
    + + + + +
    + + +
    <static> + + + CAAT.Module.ColorUtil.Color.random() + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.html b/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.html new file mode 100644 index 00000000..7dfbba61 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.ColorUtil.html @@ -0,0 +1,546 @@ + + + + + + + JsDoc Reference - CAAT.Module.ColorUtil + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.ColorUtil +

    + + +

    + + + + + + +
    Defined in: Color.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.ColorUtil +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Debug.Debug.html b/documentation/jsdoc/symbols/CAAT.Module.Debug.Debug.html new file mode 100644 index 00000000..2dc76ce0 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Debug.Debug.html @@ -0,0 +1,750 @@ + + + + + + + JsDoc Reference - CAAT.Module.Debug.Debug + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Debug.Debug +

    + + +

    + + + + + + +
    Defined in: Debug.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    debugInfo(statistics) +
    +
    +
      +
    initialize(w, h) +
    +
    +
      +
    paint(rafValue) +
    +
    +
      +
    setScale(s) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Debug.Debug() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    + + + debugInfo(statistics) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + statistics + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + initialize(w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + paint(rafValue) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + rafValue + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setScale(s) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + s + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Debug.html b/documentation/jsdoc/symbols/CAAT.Module.Debug.html new file mode 100644 index 00000000..f72f052d --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Debug.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.Debug + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Debug +

    + + +

    + + + + + + +
    Defined in: Debug.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Debug +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Font.Font.html b/documentation/jsdoc/symbols/CAAT.Module.Font.Font.html new file mode 100644 index 00000000..811d546d --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Font.Font.html @@ -0,0 +1,1486 @@ + + + + + + + JsDoc Reference - CAAT.Module.Font.Font + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Font.Font +

    + + +

    + + + + + + +
    Defined in: Font.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    create(chars, padding) +
    +
    +
      +
    createDefault(padding) +
    +
    +
      +
    drawSpriteText(director, time) +
    +
    +
      +
    drawText(str, ctx, x, y) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
    <static>   +
    CAAT.Module.Font.Font.getFontMetrics(font) +
    +
    +
    <static>   +
    CAAT.Module.Font.Font.getFontMetricsCSS(font) +
    +
    Totally ripped from: + +jQuery (offset function) +Daniel Earwicker: http://stackoverflow.com/questions/1134586/how-can-you-find-the-height-of-text-on-an-html-canvas
    +
    <static>   +
    CAAT.Module.Font.Font.getFontMetricsNoCSS(font) +
    +
    +
      +
    save() +
    +
    +
      + +
    +
      +
    setFillStyle(style) +
    +
    +
      +
    setFont(font) +
    +
    +
      +
    setFontSize(fontSize) +
    +
    +
      +
    setFontStyle(style) +
    +
    +
      +
    setPadding(padding) +
    +
    +
      +
    setStrokeSize(size) +
    +
    +
      +
    setStrokeStyle(style) +
    +
    +
      + +
    +
      +
    stringWidth(str) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Font.Font() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    + + + create(chars, padding) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + chars + +
    +
    + +
    + padding + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + createDefault(padding) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + padding + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + drawSpriteText(director, time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + drawText(str, ctx, x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + str + +
    +
    + +
    + ctx + +
    +
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getAscent() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getDescent() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getFontData() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <static> + + + CAAT.Module.Font.Font.getFontMetrics(font) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + font + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + {*} + CAAT.Module.Font.Font.getFontMetricsCSS(font) + +
    +
    + Totally ripped from: + +jQuery (offset function) +Daniel Earwicker: http://stackoverflow.com/questions/1134586/how-can-you-find-the-height-of-text-on-an-html-canvas + + +
    + + + + +
    +
    Parameters:
    + +
    + font + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    <static> + + + CAAT.Module.Font.Font.getFontMetricsNoCSS(font) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + font + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + save() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + setAsSpriteImage() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + setFillStyle(style) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + style + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setFont(font) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + font + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setFontSize(fontSize) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + fontSize + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setFontStyle(style) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + style + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPadding(padding) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + padding + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setStrokeSize(size) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + size + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setStrokeStyle(style) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + style + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + stringHeight() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + stringWidth(str) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + str + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Font.html b/documentation/jsdoc/symbols/CAAT.Module.Font.html new file mode 100644 index 00000000..b345b6a7 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Font.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.Font + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Font +

    + + +

    + + + + + + +
    Defined in: Font.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Font +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMBumpMapping.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMBumpMapping.html new file mode 100644 index 00000000..93aa4247 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMBumpMapping.html @@ -0,0 +1,975 @@ + + + + + + + JsDoc Reference - CAAT.Module.Image.ImageProcessor.IMBumpMapping + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Image.ImageProcessor.IMBumpMapping +

    + + +

    + +
    Extends + CAAT.Module.Image.ImageProcessor.ImageProcessor.
    + + + + + +
    Defined in: IMBumpMapping.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    applyIM(director, time) +
    +
    Applies the bump effect and makes it visible on the canvas surface.
    +
    <private>   + +
    Create a phong image to apply bump effect.
    +
      +
    drawColored(dstPixels) +
    +
    Generates a bump image.
    +
      +
    initialize(image, radius) +
    +
    Initialize the bump image processor.
    +
    <private>   +
    prepareBump(image, radius) +
    +
    Initializes internal bump effect data.
    +
      +
    setLightColors(colors_rgb_array) +
    +
    Sets lights color.
    +
      +
    setLightPosition(lightIndex, x, y) +
    +
    Set a light position.
    +
      +
    soften(bump) +
    +
    Soften source images extracted data on prepareBump method.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Module.Image.ImageProcessor.ImageProcessor:
    clear, createPattern, getCanvas, getImageData, grabPixels, makeArray, makeArray2D, paint
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Image.ImageProcessor.IMBumpMapping() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    + + + applyIM(director, time) + +
    +
    + Applies the bump effect and makes it visible on the canvas surface. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + time + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    <private> + + + calculatePhong() + +
    +
    + Create a phong image to apply bump effect. + + +
    + + + + + + + + + + + +
    + + +
    + + + drawColored(dstPixels) + +
    +
    + Generates a bump image. + + +
    + + + + +
    +
    Parameters:
    + +
    + dstPixels + +
    +
    {ImageData.data} destinarion pixel array to store the calculated image.
    + +
    + + + + + + + + +
    + + +
    + + + initialize(image, radius) + +
    +
    + Initialize the bump image processor. + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    {HTMLImageElement} source image to bump.
    + +
    + radius + +
    +
    {number} light radius.
    + +
    + + + + + + + + +
    + + +
    <private> + + + prepareBump(image, radius) + +
    +
    + Initializes internal bump effect data. + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    {HTMLImageElement}
    + +
    + radius + +
    +
    {number} lights radius.
    + +
    + + + + + + + + +
    + + +
    + + + setLightColors(colors_rgb_array) + +
    +
    + Sets lights color. + + +
    + + + + +
    +
    Parameters:
    + +
    + colors_rgb_array + +
    +
    an array of arrays. Each internal array has three integers defining an RGB color. +ie: + [ + [ 255,0,0 ], + [ 0,255,0 ] + ]
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setLightPosition(lightIndex, x, y) + +
    +
    + Set a light position. + + +
    + + + + +
    +
    Parameters:
    + +
    + lightIndex + +
    +
    {number} light index to position.
    + +
    + x + +
    +
    {number} light x coordinate.
    + +
    + y + +
    +
    {number} light y coordinate.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + soften(bump) + +
    +
    + Soften source images extracted data on prepareBump method. + + +
    + + + + +
    +
    Parameters:
    + +
    + bump + +
    +
    bidimensional array of black and white source image version.
    + +
    + + + + + +
    +
    Returns:
    + +
    bidimensional array with softened version of source image's b&w representation.
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMPlasma.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMPlasma.html new file mode 100644 index 00000000..e8227cc2 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMPlasma.html @@ -0,0 +1,732 @@ + + + + + + + JsDoc Reference - CAAT.Module.Image.ImageProcessor.IMPlasma + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Image.ImageProcessor.IMPlasma +

    + + +

    + +
    Extends + CAAT.Module.Image.ImageProcessor.ImageProcessor.
    + + + + + +
    Defined in: IMPlasma.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    apply(director, time) +
    +
    Apply image processing to create the plasma and call superclass's apply to make the result +visible.
    +
      +
    initialize(width, height, colors) +
    +
    Initialize the plasma image processor.
    +
      +
    setB() +
    +
    Initialize internal plasma structures.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Module.Image.ImageProcessor.ImageProcessor:
    applyIM, clear, createPattern, getCanvas, getImageData, grabPixels, makeArray, makeArray2D, paint
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Image.ImageProcessor.IMPlasma() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    + + + apply(director, time) + +
    +
    + Apply image processing to create the plasma and call superclass's apply to make the result +visible. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + time + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + initialize(width, height, colors) + +
    +
    + Initialize the plasma image processor. +

    +This image processor creates a color ramp of 256 elements from the colors of the parameter 'colors'. +Be aware of color definition since the alpha values count to create the ramp. + + +

    + + + + +
    +
    Parameters:
    + +
    + width + +
    +
    {number}
    + +
    + height + +
    +
    {number}
    + +
    + colors + +
    +
    {Array.} an array of color values.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setB() + +
    +
    + Initialize internal plasma structures. Calling repeatedly this method will make the plasma +look different. + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMRotoZoom.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMRotoZoom.html new file mode 100644 index 00000000..211e96e5 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.IMRotoZoom.html @@ -0,0 +1,778 @@ + + + + + + + JsDoc Reference - CAAT.Module.Image.ImageProcessor.IMRotoZoom + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Image.ImageProcessor.IMRotoZoom +

    + + +

    + +
    Extends + CAAT.Module.Image.ImageProcessor.ImageProcessor.
    + + + + + +
    Defined in: IMRotoZoom.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    applyIM(director, time) +
    +
    Perform and apply the rotozoom effect.
    +
      +
    initialize(width, height, patternImage) +
    +
    Initialize the rotozoom.
    +
    <private>   +
    rotoZoom(director, time) +
    +
    Performs the process of tiling rotozoom.
    +
      + +
    Change the effect's rotation anchor.
    +
    + + + +
    +
    Methods borrowed from class CAAT.Module.Image.ImageProcessor.ImageProcessor:
    clear, createPattern, getCanvas, getImageData, grabPixels, makeArray, makeArray2D, paint
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Image.ImageProcessor.IMRotoZoom() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    + + + applyIM(director, time) + +
    +
    + Perform and apply the rotozoom effect. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + time + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + initialize(width, height, patternImage) + +
    +
    + Initialize the rotozoom. + + +
    + + + + +
    +
    Parameters:
    + +
    + width + +
    +
    {number}
    + +
    + height + +
    +
    {number}
    + +
    + patternImage + +
    +
    {HTMLImageElement} image to tile with.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    <private> + + + rotoZoom(director, time) + +
    +
    + Performs the process of tiling rotozoom. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + time + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setCenter() + +
    +
    + Change the effect's rotation anchor. Call this method repeatedly to make the effect look +different. + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.ImageProcessor.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.ImageProcessor.html new file mode 100644 index 00000000..8b5a73d4 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.ImageProcessor.html @@ -0,0 +1,1113 @@ + + + + + + + JsDoc Reference - CAAT.Module.Image.ImageProcessor.ImageProcessor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Image.ImageProcessor.ImageProcessor +

    + + +

    + + + + + + +
    Defined in: ImageProcessor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    applyIM(director, time) +
    +
    Sets canvas pixels to be the applied effect.
    +
      +
    clear(r, g, b, a) +
    +
    Clear this ImageData object to the given color components.
    +
      +
    createPattern(type) +
    +
    Creates a pattern that will make this ImageProcessor object suitable as a fillStyle value.
    +
      + +
    Returns the offscreen canvas.
    +
      + +
    Get this ImageData.
    +
      +
    grabPixels(image) +
    +
    Grabs an image pixels.
    +
      +
    initialize(width, height) +
    +
    Initializes and creates an offscreen Canvas object.
    +
      +
    makeArray(size, initValue) +
    +
    Helper method to create an array.
    +
      +
    makeArray2D(size, size2, initvalue) +
    +
    Helper method to create a bidimensional array.
    +
      +
    paint(director, time) +
    +
    Paint this ImageProcessor object result.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Image.ImageProcessor.ImageProcessor() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    + + + applyIM(director, time) + +
    +
    + Sets canvas pixels to be the applied effect. After process pixels, this method must be called +to show the result of such processing. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + time + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + clear(r, g, b, a) + +
    +
    + Clear this ImageData object to the given color components. + + +
    + + + + +
    +
    Parameters:
    + +
    + r + +
    +
    {number} red color component 0..255.
    + +
    + g + +
    +
    {number} green color component 0..255.
    + +
    + b + +
    +
    {number} blue color component 0..255.
    + +
    + a + +
    +
    {number} alpha color component 0..255.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + createPattern(type) + +
    +
    + Creates a pattern that will make this ImageProcessor object suitable as a fillStyle value. +This effect can be drawn too as an image by calling: canvas_context.drawImage methods. + + +
    + + + + +
    +
    Parameters:
    + +
    + type + +
    +
    {string} the pattern type. if no value is supplied 'repeat' will be used.
    + +
    + + + + + +
    +
    Returns:
    + +
    CanvasPattern.
    + +
    + + + + +
    + + +
    + + {HTMLCanvasElement} + getCanvas() + +
    +
    + Returns the offscreen canvas. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {HTMLCanvasElement}
    + +
    + + + + +
    + + +
    + + {ImageData} + getImageData() + +
    +
    + Get this ImageData. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {ImageData}
    + +
    + + + + +
    + + +
    + + {ImageData} + grabPixels(image) + +
    +
    + Grabs an image pixels. + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    {HTMLImageElement}
    + +
    + + + + + +
    +
    Returns:
    + +
    {ImageData} returns an ImageData object with the image representation or null in +case the pixels can not be grabbed.
    + +
    + + + + +
    + + +
    + + + initialize(width, height) + +
    +
    + Initializes and creates an offscreen Canvas object. It also creates an ImageData object and +initializes the internal bufferImage attribute to imageData's data. + + +
    + + + + +
    +
    Parameters:
    + +
    + width + +
    +
    {number} canvas width.
    + +
    + height + +
    +
    {number} canvas height.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {[]} + makeArray(size, initValue) + +
    +
    + Helper method to create an array. + + +
    + + + + +
    +
    Parameters:
    + +
    + size + +
    +
    {number} integer number of elements in the array.
    + +
    + initValue + +
    +
    {number} initial array values.
    + +
    + + + + + +
    +
    Returns:
    + +
    {[]} an array of 'initialValue' elements.
    + +
    + + + + +
    + + +
    + + {[]} + makeArray2D(size, size2, initvalue) + +
    +
    + Helper method to create a bidimensional array. + + +
    + + + + +
    +
    Parameters:
    + +
    + size + +
    +
    {number} number of array rows.
    + +
    + size2 + +
    +
    {number} number of array columns.
    + +
    + initvalue + +
    +
    array initial values.
    + +
    + + + + + +
    +
    Returns:
    + +
    {[]} a bidimensional array of 'initvalue' elements.
    + +
    + + + + +
    + + +
    + + + paint(director, time) + +
    +
    + Paint this ImageProcessor object result. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}.
    + +
    + time + +
    +
    {number} scene time.
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.html new file mode 100644 index 00000000..95a269fb --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageProcessor.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.Image.ImageProcessor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Image.ImageProcessor +

    + + +

    + + + + + + +
    Defined in: ImageProcessor.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Image.ImageProcessor +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.ImageUtil.html b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageUtil.html new file mode 100644 index 00000000..ec45f7f0 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Image.ImageUtil.html @@ -0,0 +1,805 @@ + + + + + + + JsDoc Reference - CAAT.Module.Image.ImageUtil + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Image.ImageUtil +

    + + +

    + + + + + + +
    Defined in: ImageUtil.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <static>   +
    CAAT.Module.Image.ImageUtil.createAlphaSpriteSheet(maxAlpha, minAlpha, sheetSize, image, bg_fill_style) +
    +
    +
    <static>   +
    CAAT.Module.Image.ImageUtil.createThumb(image, w, h, best_fit) +
    +
    +
    <static>   +
    CAAT.Module.Image.ImageUtil.optimize(image, threshold, areas) +
    +
    Remove an image's padding transparent border.
    +
    <static>   +
    CAAT.Module.Image.ImageUtil.rotate(image, angle) +
    +
    Creates a rotated canvas image element.
    +
    + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Image.ImageUtil +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    <static> + + + CAAT.Module.Image.ImageUtil.createAlphaSpriteSheet(maxAlpha, minAlpha, sheetSize, image, bg_fill_style) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + maxAlpha + +
    +
    + +
    + minAlpha + +
    +
    + +
    + sheetSize + +
    +
    + +
    + image + +
    +
    + +
    + bg_fill_style + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Module.Image.ImageUtil.createThumb(image, w, h, best_fit) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + best_fit + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Module.Image.ImageUtil.optimize(image, threshold, areas) + +
    +
    + Remove an image's padding transparent border. +Transparent means that every scan pixel is alpha=0. + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    + +
    + threshold + +
    +
    + +
    + areas + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Module.Image.ImageUtil.rotate(image, angle) + +
    +
    + Creates a rotated canvas image element. + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    + +
    + angle + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Image.html b/documentation/jsdoc/symbols/CAAT.Module.Image.html new file mode 100644 index 00000000..10a88b59 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Image.html @@ -0,0 +1,546 @@ + + + + + + + JsDoc Reference - CAAT.Module.Image + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Image +

    + + +

    + + + + + + +
    Defined in: ImageProcessor.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Image +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Locale.ResourceBundle.html b/documentation/jsdoc/symbols/CAAT.Module.Locale.ResourceBundle.html new file mode 100644 index 00000000..a3daeddc --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Locale.ResourceBundle.html @@ -0,0 +1,1026 @@ + + + + + + + JsDoc Reference - CAAT.Module.Locale.ResourceBundle + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Locale.ResourceBundle +

    + + +

    + + + + + + +
    Defined in: ResourceBundle.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   + +
    Current set locale.
    +
    <private>   + +
    Default locale info.
    +
      + +
    Original file contents.
    +
      +
    + valid +
    +
    Is this bundle valid ?
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __formatString(string, args) +
    +
    A formated string is a regular string that has embedded holder for string values.
    +
    <private>   +
    __init(resourceFile, asynch, onSuccess, onError) +
    +

    +Load a bundle file.

    +
      +
    getString(id, defaultValue, args) +
    +
    +
      +
    loadDoc(resourceFile, asynch, onSuccess, onError) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Locale.ResourceBundle() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + __currentLocale + +
    +
    + Current set locale. + + +
    + + + + + + + + +
    + + +
    <private> + + + __defaultLocale + +
    +
    + Default locale info. + + +
    + + + + + + + + +
    + + +
    + + + localeInfo + +
    +
    + Original file contents. + + +
    + + + + + + + + +
    + + +
    + + + valid + +
    +
    + Is this bundle valid ? + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + {string} + __formatString(string, args) + +
    +
    + A formated string is a regular string that has embedded holder for string values. +for example a string like: + +"hi this is a $2 $1" + +will be after calling __formatString( str, ["string","parameterized"] ); + +"hi this is a parameterized string" + +IMPORTANT: Holder values start in 1. + + +
    + + + + +
    +
    Parameters:
    + +
    + string + +
    +
    {string} a parameterized string
    + +
    + args + +
    +
    {object} object whose keys are used to find holders and replace them in string parameter
    + +
    + + + + + +
    +
    Returns:
    + +
    {string}
    + +
    + + + + +
    + + +
    <private> + + {*} + __init(resourceFile, asynch, onSuccess, onError) + +
    +
    +

    +Load a bundle file. +The expected file format is as follows: + + +{ + "defaultLocale" : "en-US", + "en-US" : { + "key1", "value1", + "key2", "value2", + ... + }, + "en-UK" : { + "key1", "value1", + "key2", "value2", + ... + } +} + + +

    +defaultLocale is compulsory. + +

    +The function getString solves as follows: + +

  445. a ResouceBundle object will honor browser/system locale by searching for these strings in + the navigator object to define the value of currentLocale: + +
      navigator.language +
        navigator.browserLanguage +
          navigator.systemLanguage +
            navigator.userLanguage + +
          • the ResouceBundle class will also get defaultLocale value, and set the corresponding key + as default Locale. + +
          • a call to getString(id,defaultValue) will work as follows: + +
            +  1)     will get the value associated in currentLocale[id]
            +  2)     if the value is set, it is returned.
            +  2.1)       else if it is not set, will get the value from defaultLocale[id] (sort of fallback)
            +  3)     if the value of defaultLocale is set, it is returned.
            +  3.1)       else defaultValue is returned.
            +
            + + +
  446. + + + + +
    +
    Parameters:
    + +
    + resourceFile + +
    +
    + +
    + asynch + +
    +
    + +
    + onSuccess + +
    +
    + +
    + onError + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + {string} + getString(id, defaultValue, args) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {string} a key from the bundle file.
    + +
    + defaultValue + +
    +
    {string} default value in case
    + +
    + args + +
    +
    {Array.=} optional arguments array in case the returned string is a + parameterized string.
    + +
    + + + + + +
    +
    Returns:
    + +
    {string}
    + +
    + + + + +
    + + +
    + + + loadDoc(resourceFile, asynch, onSuccess, onError) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + resourceFile + +
    +
    + +
    + asynch + +
    +
    + +
    + onSuccess + +
    +
    + +
    + onError + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Locale.html b/documentation/jsdoc/symbols/CAAT.Module.Locale.html new file mode 100644 index 00000000..9e7cf55c --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Locale.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.Locale + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Locale +

    + + +

    + + + + + + +
    Defined in: ResourceBundle.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Locale +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Preloader.ImagePreloader.html b/documentation/jsdoc/symbols/CAAT.Module.Preloader.ImagePreloader.html new file mode 100644 index 00000000..355069cc --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Preloader.ImagePreloader.html @@ -0,0 +1,777 @@ + + + + + + + JsDoc Reference - CAAT.Module.Preloader.ImagePreloader + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Preloader.ImagePreloader +

    + + +

    + + + + + + +
    Defined in: ImagePreloader.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    elements counter.
    +
      +
    + images +
    +
    a list of elements to load.
    +
      + +
    notification callback invoked for each image loaded.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    loadImages(aImages, callback_loaded_one_image, callback_error) +
    +
    Start images loading asynchronous process.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Preloader.ImagePreloader() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + imageCounter + +
    +
    + elements counter. + + +
    + + + + + + + + +
    + + +
    + + + images + +
    +
    + a list of elements to load. + + +
    + + + + + + + + +
    + + +
    + + + notificationCallback + +
    +
    + notification callback invoked for each image loaded. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + loadImages(aImages, callback_loaded_one_image, callback_error) + +
    +
    + Start images loading asynchronous process. This method will notify every image loaded event +and is responsibility of the caller to count the number of loaded images to see if it fits his +needs. + + +
    + + + + +
    +
    Parameters:
    + +
    + aImages + +
    +
    {{ id:{url}, id2:{url}, ...} an object with id/url pairs.
    + +
    + callback_loaded_one_image + +
    +
    {function( imageloader {CAAT.ImagePreloader}, counter {number}, images {{ id:{string}, image: {Image}}} )} +function to call on every image load.
    + +
    + callback_error + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Preloader.Preloader.html b/documentation/jsdoc/symbols/CAAT.Module.Preloader.Preloader.html new file mode 100644 index 00000000..57c00fea --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Preloader.Preloader.html @@ -0,0 +1,1090 @@ + + + + + + + JsDoc Reference - CAAT.Module.Preloader.Preloader + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Preloader.Preloader +

    + + +

    + + + + + + +
    Defined in: Preloader.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + cerrored +
    +
    Callback error loading.
    +
      +
    + cfinished +
    +
    Callback finished loading.
    +
      +
    + cloaded +
    +
    Callback element loaded.
    +
      +
    + elements +
    +
    a list of elements to load.
    +
      + +
    elements counter.
    +
      + +
    loaded elements count.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
    <private>   +
    __onerror(d) +
    +
    +
    <private>   +
    __onload(d) +
    +
    +
      +
    addElement(id, path) +
    +
    +
      +
    clear() +
    +
    +
      +
    load(onfinished, onload_one, onerror) +
    +
    +
      +
    setBaseURL(base) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Preloader.Preloader() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + cerrored + +
    +
    + Callback error loading. + + +
    + + + + + + + + +
    + + +
    + + + cfinished + +
    +
    + Callback finished loading. + + +
    + + + + + + + + +
    + + +
    + + + cloaded + +
    +
    + Callback element loaded. + + +
    + + + + + + + + +
    + + +
    + + + elements + +
    +
    + a list of elements to load. + + +
    + + + + + + + + +
    + + +
    + + + imageCounter + +
    +
    + elements counter. + + +
    + + + + + + + + +
    + + +
    + + + loadedCount + +
    +
    + loaded elements count. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + __onerror(d) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + d + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __onload(d) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + d + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addElement(id, path) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + path + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + clear() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + load(onfinished, onload_one, onerror) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + onfinished + +
    +
    + +
    + onload_one + +
    +
    + +
    + onerror + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setBaseURL(base) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + base + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Preloader.html b/documentation/jsdoc/symbols/CAAT.Module.Preloader.html new file mode 100644 index 00000000..318f650b --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Preloader.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.Preloader + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Preloader +

    + + +

    + + + + + + +
    Defined in: ImagePreloader.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Preloader +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Runtime.BrowserInfo.html b/documentation/jsdoc/symbols/CAAT.Module.Runtime.BrowserInfo.html new file mode 100644 index 00000000..93041561 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Runtime.BrowserInfo.html @@ -0,0 +1,654 @@ + + + + + + + JsDoc Reference - CAAT.Module.Runtime.BrowserInfo + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Runtime.BrowserInfo +

    + + +

    + + + + + + +
    Defined in: BrowserInfo.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <inner>   +
    searchString(data) +
    +
    +
    <inner>   +
    searchVersion(dataString) +
    +
    +
    + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Runtime.BrowserInfo +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    <inner> + + + searchString(data) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + data + +
    +
    + +
    + + + + + + + + +
    + + +
    <inner> + + + searchVersion(dataString) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + dataString + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Runtime.html b/documentation/jsdoc/symbols/CAAT.Module.Runtime.html new file mode 100644 index 00000000..f3788e5d --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Runtime.html @@ -0,0 +1,546 @@ + + + + + + + JsDoc Reference - CAAT.Module.Runtime + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Runtime +

    + + +

    + + + + + + +
    Defined in: BrowserInfo.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Runtime +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton#SkeletonActor.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton#SkeletonActor.html new file mode 100644 index 00000000..9162c6b6 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Skeleton#SkeletonActor.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.Skeleton#SkeletonActor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Skeleton#SkeletonActor +

    + + +

    + + + + + + +
    Defined in: SkeletonActor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Skeleton#SkeletonActor() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Bone.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Bone.html new file mode 100644 index 00000000..1a9a2149 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Bone.html @@ -0,0 +1,2217 @@ + + + + + + + JsDoc Reference - CAAT.Module.Skeleton.Bone + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Skeleton.Bone +

    + + +

    + + + + + + +
    Defined in: Bone.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + children +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    + matrix +
    +
    +
      +
    + parent +
    +
    +
      + +
    Bone rotation angle
    +
      +
    + size +
    +
    Bone size.
    +
      +
    + wmatrix +
    +
    +
      +
    + x +
    +
    Bone x position relative parent
    +
      +
    + y +
    +
    Bone y position relative parent
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   + +
    +
    <private>   + +
    +
    <private>   +
    __init(id) +
    +
    +
    <private>   +
    __noValue(keyframes) +
    +
    +
    <private>   +
    __setInterpolator(behavior, curve) +
    +
    +
    <private>   + +
    +
    <private>   +
    __setParent(parent) +
    +
    +
      +
    addBone(bone) +
    +
    +
      +
    addRotationKeyframe(name, angleStart, angleEnd, timeStart, timeEnd, curve) +
    +
    +
      +
    addScaleKeyframe(name, scaleX, endScaleX, scaleY, endScaleY, timeStart, timeEnd, curve) +
    +
    +
      +
    addTranslationKeyframe(name, startX, startY, endX, endY, timeStart, timeEnd, curve) +
    +
    +
      +
    apply(time, animationTime) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    paint(actorMatrix, ctx) +
    +
    +
      +
    setAnimation(name) +
    +
    +
      + +
    +
      +
    setPosition(x, y) +
    +
    +
      +
    setRotateTransform(angle, anchorX, anchorY) +
    +
    default anchor values are for spine tool.
    +
      +
    setScaleTransform(sx, sy, anchorX, anchorY) +
    +
    +
      +
    setSize(s) +
    +
    +
      + +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Skeleton.Bone() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + {Array.} + children + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + {object} + keyframesByAnimation + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + {CAAT.Behavior.ContainerBehavior} + keyframesRotate + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + {CAAT.Behavior.ContainerBehavior} + keyframesScale + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + {CAAT.Behavior.ContainerBehavior} + keyframesTranslate + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + {CAAT.PathUtil.Path} + keyframesTranslatePath + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + {CAAT.Math.Matrix} + matrix + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + {CAAT.Skeleton.Bone} + parent + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + rotationAngle + +
    +
    + Bone rotation angle + + +
    + + + + + + + + +
    + + +
    + + {number} + size + +
    +
    + Bone size. + + +
    + + + + + + + + +
    + + +
    + + {CAAT.Math.Matrix} + wmatrix + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + {number} + x + +
    +
    + Bone x position relative parent + + +
    + + + + + + + + +
    + + +
    + + + y + +
    +
    + Bone y position relative parent + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __createAnimation(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __getAnimation(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __init(id) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __noValue(keyframes) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + keyframes + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __setInterpolator(behavior, curve) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + behavior + +
    +
    + +
    + curve + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __setModelViewMatrix() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + {*} + __setParent(parent) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + parent + +
    +
    {CAAT.Skeleton.Bone}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + addBone(bone) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + bone + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addRotationKeyframe(name, angleStart, angleEnd, timeStart, timeEnd, curve) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    {string} keyframe animation name
    + +
    + angleStart + +
    +
    {number} rotation start angle
    + +
    + angleEnd + +
    +
    {number} rotation end angle
    + +
    + timeStart + +
    +
    {number} keyframe start time
    + +
    + timeEnd + +
    +
    {number} keyframe end time
    + +
    + curve + +
    +
    {Array.=} 4 numbers definint a quadric bezier info. two first points + assumed to be 0,0.
    + +
    + + + + + + + + +
    + + +
    + + + addScaleKeyframe(name, scaleX, endScaleX, scaleY, endScaleY, timeStart, timeEnd, curve) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + scaleX + +
    +
    + +
    + endScaleX + +
    +
    + +
    + scaleY + +
    +
    + +
    + endScaleY + +
    +
    + +
    + timeStart + +
    +
    + +
    + timeEnd + +
    +
    + +
    + curve + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addTranslationKeyframe(name, startX, startY, endX, endY, timeStart, timeEnd, curve) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + startX + +
    +
    + +
    + startY + +
    +
    + +
    + endX + +
    +
    + +
    + endY + +
    +
    + +
    + timeStart + +
    +
    + +
    + timeEnd + +
    +
    + +
    + curve + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + apply(time, animationTime) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number}
    + +
    + animationTime + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + endRotationKeyframes(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + endScaleKeyframes(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + endTranslationKeyframes(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + paint(actorMatrix, ctx) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + actorMatrix + +
    +
    + +
    + ctx + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setAnimation(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setBehaviorApplicationTime(t) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + t + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPosition(x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {*} + setRotateTransform(angle, anchorX, anchorY) + +
    +
    + default anchor values are for spine tool. + + +
    + + + + +
    +
    Parameters:
    + +
    + angle + +
    +
    {number}
    + +
    + anchorX + +
    +
    {number=}
    + +
    + anchorY + +
    +
    {number=}
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + {*} + setScaleTransform(sx, sy, anchorX, anchorY) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + sx + +
    +
    {number}
    + +
    + sy + +
    +
    {number}
    + +
    + anchorX + +
    +
    {number=} anchorX: .5 by default
    + +
    + anchorY + +
    +
    {number=} anchorY. .5 by default
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + setSize(s) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + s + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + transformContext(ctx) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.BoneActor.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.BoneActor.html new file mode 100644 index 00000000..30e535e3 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.BoneActor.html @@ -0,0 +1,1286 @@ + + + + + + + JsDoc Reference - CAAT.Module.Skeleton.BoneActor + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Skeleton.BoneActor +

    + + +

    + + + + + + +
    Defined in: BoneActor.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   + +
    +
    <private>   +
    __init() +
    +
    +
    <private>   + +
    +
      +
    addAttachment(id, normalized_x, normalized_y, callback) +
    +
    +
      + +
    +
      +
    addSkinDataKeyframe(name, start, duration) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    paint(ctx, time) +
    +
    +
      +
    prepareAABB(time) +
    +
    +
      +
    setBone(bone) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Skeleton.BoneActor() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + attachments + +
    +
    + + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __getCurrentSkinInfo(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + __setupAttachments() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + addAttachment(id, normalized_x, normalized_y, callback) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + normalized_x + +
    +
    + +
    + normalized_y + +
    +
    + +
    + callback + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addAttachmentListener(al) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + al + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addSkinDataKeyframe(name, start, duration) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + start + +
    +
    + +
    + duration + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addSkinInfo(si) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + si + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + emptySkinDataKeyframe() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getAttachment(id) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + paint(ctx, time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + prepareAABB(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setBone(bone) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + bone + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setDefaultSkinInfoByName(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setModelViewMatrix() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + setupAnimation(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Skeleton.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Skeleton.html new file mode 100644 index 00000000..26ff3c74 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.Skeleton.html @@ -0,0 +1,1468 @@ + + + + + + + JsDoc Reference - CAAT.Module.Skeleton.Skeleton + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.Skeleton.Skeleton +

    + + +

    + + + + + + +
    Defined in: Skeleton.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(skeletonDataFromFile) +
    +
    +
    <private>   +
    __setSkeleton(skeletonDataFromFile) +
    +
    +
      +
    addAnimation(name, animation) +
    +
    +
      +
    addAnimationFromFile(name, url) +
    +
    +
      +
    addBone(boneInfo) +
    +
    +
      +
    addRotationKeyframe(name, keyframeInfo) +
    +
    +
      +
    addScaleKeyframe(name, keyframeInfo) +
    +
    +
      +
    addTranslationKeyframe(name, keyframeInfo) +
    +
    +
      +
    calculate(time, animationTime) +
    +
    +
      +
    endKeyframes(name, boneId) +
    +
    +
      + +
    +
      + +
    +
      +
    getBoneByIndex(index) +
    +
    +
      + +
    +
      + +
    +
      +
    getRoot() +
    +
    +
      + +
    +
      +
    paint(actorMatrix, ctx) +
    +
    +
      +
    setAnimation(name) +
    +
    +
      + +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.Skeleton.Skeleton() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(skeletonDataFromFile) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + skeletonDataFromFile + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __setSkeleton(skeletonDataFromFile) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + skeletonDataFromFile + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addAnimation(name, animation) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + animation + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addAnimationFromFile(name, url) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + url + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addBone(boneInfo) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + boneInfo + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addRotationKeyframe(name, keyframeInfo) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + keyframeInfo + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addScaleKeyframe(name, keyframeInfo) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + keyframeInfo + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addTranslationKeyframe(name, keyframeInfo) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + keyframeInfo + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + calculate(time, animationTime) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + animationTime + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + endKeyframes(name, boneId) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + boneId + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getAnimationDataByName(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getBoneById(id) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getBoneByIndex(index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getCurrentAnimationData() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getNumBones() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getRoot() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getSkeletonDataFromFile() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + paint(actorMatrix, ctx) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + actorMatrix + +
    +
    + +
    + ctx + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setAnimation(name) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + name + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setSkeletonFromFile(url) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + url + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Skeleton.html b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.html new file mode 100644 index 00000000..f5b82ee1 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Skeleton.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.Skeleton + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Skeleton +

    + + +

    + + + + + + +
    Defined in: Bone.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Skeleton +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Storage.LocalStorage.html b/documentation/jsdoc/symbols/CAAT.Module.Storage.LocalStorage.html new file mode 100644 index 00000000..80d88476 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Storage.LocalStorage.html @@ -0,0 +1,732 @@ + + + + + + + JsDoc Reference - CAAT.Module.Storage.LocalStorage + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Storage.LocalStorage +

    + + +

    + + + + + + +
    Defined in: LocalStorage.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <static>   +
    CAAT.Module.Storage.LocalStorage.load(key, defValue) +
    +
    Retrieve a value from local storage.
    +
    <static>   +
    CAAT.Module.Storage.LocalStorage.remove(key) +
    +
    Removes a value stored in local storage.
    +
    <static>   +
    CAAT.Module.Storage.LocalStorage.save(key, data) +
    +
    Stores an object in local storage.
    +
    + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Storage.LocalStorage +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    <static> + + {object} + CAAT.Module.Storage.LocalStorage.load(key, defValue) + +
    +
    + Retrieve a value from local storage. + + +
    + + + + +
    +
    Parameters:
    + +
    + key + +
    +
    {string} the key to retrieve.
    + +
    + defValue + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    {object} object stored under the key parameter.
    + +
    + + + + +
    + + +
    <static> + + + CAAT.Module.Storage.LocalStorage.remove(key) + +
    +
    + Removes a value stored in local storage. + + +
    + + + + +
    +
    Parameters:
    + +
    + key + +
    +
    {string}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    <static> + + + CAAT.Module.Storage.LocalStorage.save(key, data) + +
    +
    + Stores an object in local storage. The data will be saved as JSON.stringify. + + +
    + + + + +
    +
    Parameters:
    + +
    + key + +
    +
    {string} key to store data under.
    + +
    + data + +
    +
    {object} an object.
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.Storage.html b/documentation/jsdoc/symbols/CAAT.Module.Storage.html new file mode 100644 index 00000000..0bc6cbf1 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.Storage.html @@ -0,0 +1,546 @@ + + + + + + + JsDoc Reference - CAAT.Module.Storage + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.Storage +

    + + +

    + + + + + + +
    Defined in: LocalStorage.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.Storage +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureElement.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureElement.html new file mode 100644 index 00000000..6cd3b08b --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureElement.html @@ -0,0 +1,724 @@ + + + + + + + JsDoc Reference - CAAT.Module.TexturePacker.TextureElement + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.TexturePacker.TextureElement +

    + + +

    + + + + + + +
    Defined in: TextureElement.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + glTexture +
    +
    +
      +
    + image +
    +
    +
      +
    + inverted +
    +
    +
      +
    + u +
    +
    +
      +
    + v +
    +
    +
    + + + + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.TexturePacker.TextureElement() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + glTexture + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + image + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + inverted + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + u + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + v + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePage.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePage.html new file mode 100644 index 00000000..8b1df16f --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePage.html @@ -0,0 +1,1424 @@ + + + + + + + JsDoc Reference - CAAT.Module.TexturePacker.TexturePage + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.TexturePacker.TexturePage +

    + + +

    + + + + + + +
    Defined in: TexturePage.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    +
      +
    + criteria +
    +
    +
      +
    + gl +
    +
    +
      +
    + height +
    +
    +
      +
    + images +
    +
    +
      +
    + padding +
    +
    +
      +
    + scan +
    +
    +
      +
    + texture +
    +
    +
      +
    + width +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(w, h) +
    +
    +
      +
    addImage(image, invert, padding) +
    +
    +
      +
    changeHeuristic(criteria) +
    +
    +
      +
    clear() +
    +
    +
      +
    create(imagesCache) +
    +
    +
      +
    createFromImages(images) +
    +
    +
      + +
    +
      + +
    +
      +
    initialize(gl) +
    +
    +
      +
    packImage(img) +
    +
    +
      +
    toCanvas(canvass, outline) +
    +
    +
      +
    update(invert, padding, width, height) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.TexturePacker.TexturePage() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + allowImagesInvertion + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + criteria + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + gl + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + height + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + images + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + padding + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + scan + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + texture + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + width + +
    +
    + + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addImage(image, invert, padding) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + image + +
    +
    + +
    + invert + +
    +
    + +
    + padding + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + changeHeuristic(criteria) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + criteria + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + clear() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + create(imagesCache) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + imagesCache + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + createFromImages(images) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + images + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + deletePage() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + endCreation() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + initialize(gl) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + gl + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + packImage(img) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + img + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + toCanvas(canvass, outline) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + canvass + +
    +
    + +
    + outline + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + update(invert, padding, width, height) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + invert + +
    +
    + +
    + padding + +
    +
    + +
    + width + +
    +
    + +
    + height + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePageManager.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePageManager.html new file mode 100644 index 00000000..9a039ac4 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TexturePageManager.html @@ -0,0 +1,750 @@ + + + + + + + JsDoc Reference - CAAT.Module.TexturePacker.TexturePageManager + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.TexturePacker.TexturePageManager +

    + + +

    + + + + + + +
    Defined in: TexturePageManager.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + pages +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    createPages(gl, width, height, imagesCache) +
    +
    +
      + +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.TexturePacker.TexturePageManager() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + pages + +
    +
    + + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + createPages(gl, width, height, imagesCache) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + gl + +
    +
    + +
    + width + +
    +
    + +
    + height + +
    +
    + +
    + imagesCache + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + deletePages() + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScan.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScan.html new file mode 100644 index 00000000..65d38914 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScan.html @@ -0,0 +1,856 @@ + + + + + + + JsDoc Reference - CAAT.Module.TexturePacker.TextureScan + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.TexturePacker.TextureScan +

    + + +

    + + + + + + +
    Defined in: TextureScan.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(w) +
    +
    +
      +
    findWhereFits(width) +
    +
    return an array of values where a chunk of width size fits in this scan.
    +
      +
    fits(position, size) +
    +
    +
      +
    log(index) +
    +
    +
      +
    substract(position, size) +
    +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.TexturePacker.TextureScan() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + freeChunks + +
    +
    + + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(w) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + findWhereFits(width) + +
    +
    + return an array of values where a chunk of width size fits in this scan. + + +
    + + + + +
    +
    Parameters:
    + +
    + width + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + fits(position, size) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + position + +
    +
    + +
    + size + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + log(index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + substract(position, size) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + position + +
    +
    + +
    + size + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScanMap.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScanMap.html new file mode 100644 index 00000000..7db26062 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.TextureScanMap.html @@ -0,0 +1,882 @@ + + + + + + + JsDoc Reference - CAAT.Module.TexturePacker.TextureScanMap + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.Module.TexturePacker.TextureScanMap +

    + + +

    + + + + + + +
    Defined in: TextureScanMap.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + scanMap +
    +
    +
      + +
    +
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(w, h) +
    +
    +
      +
    log() +
    +
    +
      +
    substract(x, y, width, height) +
    +
    +
      +
    whereFitsChunk(width, height) +
    +
    Always try to fit a chunk of size width*height pixels from left-top.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.Module.TexturePacker.TextureScanMap() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + scanMap + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + scanMapHeight + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + scanMapWidth + +
    +
    + + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(w, h) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + w + +
    +
    + +
    + h + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + log() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + substract(x, y, width, height) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + width + +
    +
    + +
    + height + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + whereFitsChunk(width, height) + +
    +
    + Always try to fit a chunk of size width*height pixels from left-top. + + +
    + + + + +
    +
    Parameters:
    + +
    + width + +
    +
    + +
    + height + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.html b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.html new file mode 100644 index 00000000..3ad9a001 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.Module.TexturePacker.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.Module.TexturePacker + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.Module.TexturePacker +

    + + +

    + + + + + + +
    Defined in: TextureElement.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.Module.TexturePacker +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.ModuleManager.html b/documentation/jsdoc/symbols/CAAT.ModuleManager.html new file mode 100644 index 00000000..33abe32f --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.ModuleManager.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.ModuleManager + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.ModuleManager +

    + + +

    + + + + + + +
    Defined in: ModuleManager.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.ModuleManager +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.ArcPath.html b/documentation/jsdoc/symbols/CAAT.PathUtil.ArcPath.html new file mode 100644 index 00000000..17d504ed --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.PathUtil.ArcPath.html @@ -0,0 +1,1834 @@ + + + + + + + JsDoc Reference - CAAT.PathUtil.ArcPath + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.PathUtil.ArcPath +

    + + +

    + +
    Extends + CAAT.PathUtil.PathSegment.
    + + + + + +
    Defined in: ArcPath.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + angle +
    +
    Arc end angle.
    +
      +
    + arcTo +
    +
    is a relative or absolute arc ?
    +
      +
    + cw +
    +
    Defined clockwise or counterclockwise ?
    +
      + +
    spare point for calculations
    +
      +
    + points +
    +
    A collection of CAAT.Math.Point objects which defines the arc (center, start, end)
    +
      +
    + radius +
    +
    Arc radius.
    +
      + +
    Arc start angle.
    +
    + + + +
    +
    Fields borrowed from class CAAT.PathUtil.PathSegment:
    bbox, color, length, parent
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    applyAsPath(director) +
    +
    +
      + +
    An arc starts and ends in the same point.
    +
      + +
    Returns final path segment point's x coordinate.
    +
      +
    getContour(iSize) +
    +
    +
      +
    getControlPoint(index) +
    +
    +
      +
    getPosition(time) +
    +
    +
      + +
    +
      +
    initialize(x, y, r, angle) +
    +
    +
      + +
    Returns initial path segment point's x coordinate.
    +
      +
    isArcTo() +
    +
    +
      + +
    +
      + +
    Get the number of control points.
    +
      +
    paint(director, bDrawHandles) +
    +
    Draws this path segment on screen.
    +
      +
    setArcTo(b) +
    +
    +
      + +
    +
      +
    setFinalPosition(finalX, finalY) +
    +
    Set a rectangle from points[0] to (finalX, finalY)
    +
      + +
    Set this path segment's starting position.
    +
      +
    setPoint(point, index) +
    +
    +
      +
    setPoints(points) +
    +
    An array of {CAAT.Point} composed of two points.
    +
      +
    setRadius(r) +
    +
    +
      + +
    +
      +
    updatePath(point) +
    +
    +
    + + + +
    +
    Methods borrowed from class CAAT.PathUtil.PathSegment:
    drawHandle, endPath, getBoundingBox, getLength, setColor, setParent, transform
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.PathUtil.ArcPath() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + angle + +
    +
    + Arc end angle. + + +
    + + + + + + + + +
    + + +
    + + + arcTo + +
    +
    + is a relative or absolute arc ? + + +
    + + + + + + + + +
    + + +
    + + + cw + +
    +
    + Defined clockwise or counterclockwise ? + + +
    + + + + + + + + +
    + + +
    + + + newPosition + +
    +
    + spare point for calculations + + +
    + + + + + + + + +
    + + +
    + + + points + +
    +
    + A collection of CAAT.Math.Point objects which defines the arc (center, start, end) + + +
    + + + + + + + + +
    + + +
    + + + radius + +
    +
    + Arc radius. + + +
    + + + + + + + + +
    + + +
    + + + startAngle + +
    +
    + Arc start angle. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + applyAsPath(director) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + endCurvePosition() + +
    +
    + An arc starts and ends in the same point. + + +
    + + + + + + + + + + + +
    + + +
    + + {number} + finalPositionX() + +
    +
    + Returns final path segment point's x coordinate. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + getContour(iSize) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + iSize + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getControlPoint(index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPosition(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPositionFromLength(iLength) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + iLength + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + initialize(x, y, r, angle) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + r + +
    +
    + +
    + angle + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {number} + initialPositionX() + +
    +
    + Returns initial path segment point's x coordinate. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + isArcTo() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + isClockWise() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {number} + numControlPoints() + +
    +
    + Get the number of control points. For this type of path segment, start and +ending path segment points. Defaults to 2. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + paint(director, bDrawHandles) + +
    +
    + Draws this path segment on screen. Optionally it can draw handles for every control point, in +this case, start and ending path segment points. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + bDrawHandles + +
    +
    {boolean}
    + +
    + + + + + + + + +
    + + +
    + + + setArcTo(b) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + b + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setClockWise(cw) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + cw + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setFinalPosition(finalX, finalY) + +
    +
    + Set a rectangle from points[0] to (finalX, finalY) + + +
    + + + + +
    +
    Parameters:
    + +
    + finalX + +
    +
    {number}
    + +
    + finalY + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setInitialPosition(x, y) + +
    +
    + Set this path segment's starting position. +This method should not be called again after setFinalPosition has been called. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number}
    + +
    + y + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setPoint(point, index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPoints(points) + +
    +
    + An array of {CAAT.Point} composed of two points. + + +
    + + + + +
    +
    Parameters:
    + +
    + points + +
    +
    {Array}
    + +
    + + + + + + + + +
    + + +
    + + + setRadius(r) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + r + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + startCurvePosition() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + updatePath(point) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.CurvePath.html b/documentation/jsdoc/symbols/CAAT.PathUtil.CurvePath.html new file mode 100644 index 00000000..8f967467 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.PathUtil.CurvePath.html @@ -0,0 +1,1482 @@ + + + + + + + JsDoc Reference - CAAT.PathUtil.CurvePath + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.PathUtil.CurvePath +

    + + +

    + +
    Extends + CAAT.PathUtil.PathSegment.
    + + + + + +
    Defined in: CurvePath.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + curve +
    +
    A CAAT.Math.Curve instance.
    +
      + +
    spare holder for getPosition coordinate return.
    +
    + + + +
    +
    Fields borrowed from class CAAT.PathUtil.PathSegment:
    bbox, color, length, parent
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    applyAsPath(director) +
    +
    +
      + +
    +
      + +
    Get path segment's last point's y coordinate.
    +
      +
    getContour(iSize) +
    +
    +
      +
    getControlPoint(index) +
    +
    +
      +
    getPosition(time) +
    +
    +
      + +
    Gets the coordinate on the path relative to the path length.
    +
      + +
    Get path segment's first point's x coordinate.
    +
      + +
    +
      +
    paint(director, bDrawHandles) +
    +
    +
      +
    setCubic(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) +
    +
    Set the pathSegment as a CAAT.Bezier cubic instance.
    +
      +
    setPoint(point, index) +
    +
    +
      +
    setPoints(points) +
    +
    Set this curve segment's points.
    +
      +
    setQuadric(p0x, p0y, p1x, p1y, p2x, p2y) +
    +
    Set the pathSegment as a CAAT.Bezier quadric instance.
    +
      + +
    +
      +
    updatePath(point) +
    +
    +
    + + + +
    +
    Methods borrowed from class CAAT.PathUtil.PathSegment:
    drawHandle, endPath, getBoundingBox, getLength, setColor, setParent, transform
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.PathUtil.CurvePath() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + curve + +
    +
    + A CAAT.Math.Curve instance. + + +
    + + + + + + + + +
    + + +
    + + + newPosition + +
    +
    + spare holder for getPosition coordinate return. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + applyAsPath(director) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + endCurvePosition() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {number} + finalPositionX() + +
    +
    + Get path segment's last point's y coordinate. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + getContour(iSize) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + iSize + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getControlPoint(index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPosition(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.Point} + getPositionFromLength(iLength) + +
    +
    + Gets the coordinate on the path relative to the path length. + + +
    + + + + +
    +
    Parameters:
    + +
    + iLength + +
    +
    {number} the length at which the coordinate will be taken from.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Point} a CAAT.Point instance with the coordinate on the path corresponding to the +iLenght parameter relative to segment's length.
    + +
    + + + + +
    + + +
    + + {number} + initialPositionX() + +
    +
    + Get path segment's first point's x coordinate. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + numControlPoints() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + paint(director, bDrawHandles) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + bDrawHandles + +
    +
    {boolean}
    + +
    + + + + + + + + +
    + + +
    + + + setCubic(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) + +
    +
    + Set the pathSegment as a CAAT.Bezier cubic instance. +Parameters are cubic coordinates control points. + + +
    + + + + +
    +
    Parameters:
    + +
    + p0x + +
    +
    {number}
    + +
    + p0y + +
    +
    {number}
    + +
    + p1x + +
    +
    {number}
    + +
    + p1y + +
    +
    {number}
    + +
    + p2x + +
    +
    {number}
    + +
    + p2y + +
    +
    {number}
    + +
    + p3x + +
    +
    {number}
    + +
    + p3y + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setPoint(point, index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPoints(points) + +
    +
    + Set this curve segment's points. + + +
    + + + + +
    +
    Parameters:
    + +
    + points + +
    +
    {Array}
    + +
    + + + + + + + + +
    + + +
    + + + setQuadric(p0x, p0y, p1x, p1y, p2x, p2y) + +
    +
    + Set the pathSegment as a CAAT.Bezier quadric instance. +Parameters are quadric coordinates control points. + + +
    + + + + +
    +
    Parameters:
    + +
    + p0x + +
    +
    {number}
    + +
    + p0y + +
    +
    {number}
    + +
    + p1x + +
    +
    {number}
    + +
    + p1y + +
    +
    {number}
    + +
    + p2x + +
    +
    {number}
    + +
    + p2y + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + startCurvePosition() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + updatePath(point) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.LinearPath.html b/documentation/jsdoc/symbols/CAAT.PathUtil.LinearPath.html new file mode 100644 index 00000000..0d363d93 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.PathUtil.LinearPath.html @@ -0,0 +1,1407 @@ + + + + + + + JsDoc Reference - CAAT.PathUtil.LinearPath + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.PathUtil.LinearPath +

    + + +

    + +
    Extends + CAAT.PathUtil.PathSegment.
    + + + + + +
    Defined in: LinearPath.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    spare holder for getPosition coordinate return.
    +
      +
    + points +
    +
    A collection of points.
    +
    + + + +
    +
    Fields borrowed from class CAAT.PathUtil.PathSegment:
    bbox, color, length, parent
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    applyAsPath(director) +
    +
    +
      + +
    +
      + +
    Returns final path segment point's x coordinate.
    +
      +
    getContour(iSize) +
    +
    +
      +
    getControlPoint(index) +
    +
    +
      +
    getPosition(time) +
    +
    +
      + +
    +
      + +
    Returns initial path segment point's x coordinate.
    +
      + +
    Get the number of control points.
    +
      +
    paint(director, bDrawHandles) +
    +
    Draws this path segment on screen.
    +
      +
    setFinalPosition(finalX, finalY) +
    +
    Set this path segment's ending position.
    +
      + +
    Set this path segment's starting position.
    +
      +
    setPoint(point, index) +
    +
    +
      +
    setPoints(points) +
    +
    +
      + +
    +
      +
    updatePath(point) +
    +
    Update this segments length and bounding box info.
    +
    + + + +
    +
    Methods borrowed from class CAAT.PathUtil.PathSegment:
    drawHandle, endPath, getBoundingBox, getLength, setColor, setParent, transform
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.PathUtil.LinearPath() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + newPosition + +
    +
    + spare holder for getPosition coordinate return. + + +
    + + + + + + + + +
    + + +
    + + + points + +
    +
    + A collection of points. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + applyAsPath(director) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + endCurvePosition() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {number} + finalPositionX() + +
    +
    + Returns final path segment point's x coordinate. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + getContour(iSize) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + iSize + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getControlPoint(index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPosition(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPositionFromLength(len) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + len + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {number} + initialPositionX() + +
    +
    + Returns initial path segment point's x coordinate. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + {number} + numControlPoints() + +
    +
    + Get the number of control points. For this type of path segment, start and +ending path segment points. Defaults to 2. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + paint(director, bDrawHandles) + +
    +
    + Draws this path segment on screen. Optionally it can draw handles for every control point, in +this case, start and ending path segment points. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + bDrawHandles + +
    +
    {boolean}
    + +
    + + + + + + + + +
    + + +
    + + + setFinalPosition(finalX, finalY) + +
    +
    + Set this path segment's ending position. + + +
    + + + + +
    +
    Parameters:
    + +
    + finalX + +
    +
    {number}
    + +
    + finalY + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setInitialPosition(x, y) + +
    +
    + Set this path segment's starting position. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number}
    + +
    + y + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setPoint(point, index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPoints(points) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + points + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + startCurvePosition() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + updatePath(point) + +
    +
    + Update this segments length and bounding box info. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.Path.html b/documentation/jsdoc/symbols/CAAT.PathUtil.Path.html new file mode 100644 index 00000000..82037567 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.PathUtil.Path.html @@ -0,0 +1,4511 @@ + + + + + + + JsDoc Reference - CAAT.PathUtil.Path + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.PathUtil.Path +

    + + +

    + +
    Extends + CAAT.PathUtil.PathSegment.
    + + + + + +
    Defined in: Path.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    starting path x position
    +
      + +
    starting path y position
    +
      + +
    A list of behaviors to apply to this path.
    +
      + +
    Path bounding box X position.
    +
      + +
    Path bounding box Y position.
    +
      +
    + closed +
    +
    Is this path closed ?
    +
      +
    + height +
    +
    Path bounding box height.
    +
      + +
    Is this path interactive ?.
    +
      +
    + matrix +
    +
    Path behaviors matrix.
    +
      + +
    spare CAAT.Math.Point to return calculated values in the path.
    +
      + +
    path length (sum of every segment length)
    +
      + +
    Original Path´s path segments points.
    +
      + +
    For each path segment in this path, the normalized calculated duration.
    +
      + +
    A collection of PathSegments.
    +
      + +
    For each path segment in this path, the normalized calculated start time.
    +
      +
    + rb_angle +
    +
    Path rotation angle.
    +
      + +
    Path rotation x anchor.
    +
      + +
    Path rotation x anchor.
    +
      + +
    Path scale X anchor.
    +
      + +
    Path scale Y anchor.
    +
      +
    + sb_scaleX +
    +
    Path X scale.
    +
      +
    + sb_scaleY +
    +
    Path Y scale.
    +
      +
    + tAnchorX +
    +
    Path translation anchor X.
    +
      +
    + tAnchorY +
    +
    Path translation anchor Y.
    +
      +
    + tb_x +
    +
    Path translation X.
    +
      +
    + tb_y +
    +
    Path translation Y.
    +
      +
    + tmpMatrix +
    +
    Spare calculation matrix.
    +
      +
    + width +
    +
    Path bounding box width.
    +
    + + + +
    +
    Fields borrowed from class CAAT.PathUtil.PathSegment:
    bbox, color, length, parent
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   + +
    +
    <private>   +
    __init() +
    +
    +
      +
    addArcTo(x1, y1, x2, y2, radius, cw, color) +
    +
    +
      +
    addBehavior(behavior) +
    +
    Add a Behavior to the Actor.
    +
      +
    addCatmullTo(px1, py1, px2, py2, px3, py3, color) +
    +
    Add a Catmull-Rom segment to this path.
    +
      +
    addCubicTo(px1, py1, px2, py2, px3, py3, color) +
    +
    Add a Cubic Bezier segment to this path.
    +
      +
    addLineTo(px1, py1, color) +
    +
    Adds a line segment to this path.
    +
      +
    addQuadricTo(px1, py1, px2, py2, color) +
    +
    Add a Quadric Bezier path segment to this path.
    +
      +
    addRectangleTo(x1, y1, cw, color) +
    +
    +
      +
    addSegment(pathSegment) +
    +
    Add a CAAT.PathSegment instance to this path.
    +
      +
    applyAsPath(director) +
    +
    Apply this path as a Canvas context path.
    +
      + +
    +
      +
    beginPath(px0, py0) +
    +
    Set the path's starting point.
    +
      + +
    Close the path by adding a line path segment from the current last path +coordinate to startCurvePosition coordinate.
    +
      +
    drag(x, y, callback) +
    +
    Drags a path's control point.
    +
      + +
    Removes all behaviors from an Actor.
    +
      + +
    Return the last point of the last path segment of this compound path.
    +
      +
    endPath() +
    +
    Finishes the process of building the path.
    +
      + +
    +
      +
    flatten(npatches, closed) +
    +
    +
      +
    getContour(iSize) +
    +
    Returns a collection of CAAT.Point objects which conform a path's contour.
    +
      +
    getControlPoint(index) +
    +
    +
      + +
    Return the last path segment added to this path.
    +
      + +
    +
      + +
    +
      + +
    Returns an integer with the number of path segments that conform this path.
    +
      +
    getPosition(time, open_contour) +
    +
    This method, returns a CAAT.Foundation.Point instance indicating a coordinate in the path.
    +
      + +
    Analogously to the method getPosition, this method returns a CAAT.Point instance with +the coordinate on the path that corresponds to the given length.
    +
      +
    getSegment(index) +
    +
    Gets a CAAT.PathSegment instance.
    +
      +
    isEmpty() +
    +
    +
      + +
    +
      +
    paint(director) +
    +
    Paints the path.
    +
      +
    press(x, y) +
    +
    Sent by a CAAT.PathActor instance object to try to drag a path's control point.
    +
      +
    release() +
    +
    Method invoked when a CAAT.PathActor stops dragging a control point.
    +
      + +
    Remove a Behavior with id param as behavior identifier from this actor.
    +
      +
    removeBehaviour(behavior) +
    +
    Remove a Behavior from the Actor.
    +
      + +
    +
      +
    setCatmullRom(points, closed) +
    +
    +
      +
    setCubic(x0, y0, x1, y1, x2, y2, x3, y3) +
    +
    Sets this path to be composed by a single Cubic Bezier path segment.
    +
      +
    setInteractive(interactive) +
    +
    Set whether this path should paint handles for every control point.
    +
      +
    setLinear(x0, y0, x1, y1) +
    +
    Set the path to be composed by a single LinearPath segment.
    +
      +
    setLocation(x, y) +
    +
    +
      +
    setPoint(point, index) +
    +
    Set a point from this path.
    +
      +
    setPoints(points) +
    +
    Reposition this path points.
    +
      +
    setPosition(x, y) +
    +
    +
      + +
    +
      +
    setPositionAnchored(x, y, ax, ay) +
    +
    +
      +
    setQuadric(x0, y0, x1, y1, x2, y2) +
    +
    Set this path to be composed by a single Quadric Bezier path segment.
    +
      +
    setRectangle(x0, y0, x1, y1) +
    +
    +
      +
    setRotation(angle) +
    +
    +
      + +
    +
      +
    setRotationAnchored(angle, rx, ry) +
    +
    +
      +
    setScale(sx, sy) +
    +
    +
      +
    setScaleAnchor(ax, ay) +
    +
    +
      +
    setScaleAnchored(scaleX, scaleY, sx, sy) +
    +
    +
      + +
    Return the first point of the first path segment of this compound path.
    +
      +
    updatePath(point, callback) +
    +
    Indicates that some path control point has changed, and that the path must recalculate +its internal data, ie: length and bbox.
    +
    + + + +
    +
    Methods borrowed from class CAAT.PathUtil.PathSegment:
    drawHandle, getBoundingBox, getLength, setColor, setParent, transform
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.PathUtil.Path() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + beginPathX + +
    +
    + starting path x position + + +
    + + + + + + + + +
    + + +
    + + + beginPathY + +
    +
    + starting path y position + + +
    + + + + + + + + +
    + + +
    + + + behaviorList + +
    +
    + A list of behaviors to apply to this path. +A path can be affine transformed to create a different path. + + +
    + + + + + + + + +
    + + +
    + + + clipOffsetX + +
    +
    + Path bounding box X position. + + +
    + + + + + + + + +
    + + +
    + + + clipOffsetY + +
    +
    + Path bounding box Y position. + + +
    + + + + + + + + +
    + + +
    + + + closed + +
    +
    + Is this path closed ? + + +
    + + + + + + + + +
    + + +
    + + + height + +
    +
    + Path bounding box height. + + +
    + + + + + + + + +
    + + +
    + + + interactive + +
    +
    + Is this path interactive ?. If so, controls points can be moved with a CAAT.Foundation.UI.PathActor. + + +
    + + + + + + + + +
    + + +
    + + + matrix + +
    +
    + Path behaviors matrix. + + +
    + + + + + + + + +
    + + +
    + + + newPosition + +
    +
    + spare CAAT.Math.Point to return calculated values in the path. + + +
    + + + + + + + + +
    + + +
    + + + pathLength + +
    +
    + path length (sum of every segment length) + + +
    + + + + + + + + +
    + + +
    + + + pathPoints + +
    +
    + Original Path´s path segments points. + + +
    + + + + + + + + +
    + + +
    + + + pathSegmentDurationTime + +
    +
    + For each path segment in this path, the normalized calculated duration. +precomputed segment duration relative to segment legnth/path length + + +
    + + + + + + + + +
    + + +
    + + + pathSegments + +
    +
    + A collection of PathSegments. + + +
    + + + + + + + + +
    + + +
    + + + pathSegmentStartTime + +
    +
    + For each path segment in this path, the normalized calculated start time. +precomputed segment start time relative to segment legnth/path length and duration. + + +
    + + + + + + + + +
    + + +
    + + + rb_angle + +
    +
    + Path rotation angle. + + +
    + + + + + + + + +
    + + +
    + + + rb_rotateAnchorX + +
    +
    + Path rotation x anchor. + + +
    + + + + + + + + +
    + + +
    + + + rb_rotateAnchorY + +
    +
    + Path rotation x anchor. + + +
    + + + + + + + + +
    + + +
    + + + sb_scaleAnchorX + +
    +
    + Path scale X anchor. + + +
    + + + + + + + + +
    + + +
    + + + sb_scaleAnchorY + +
    +
    + Path scale Y anchor. + + +
    + + + + + + + + +
    + + +
    + + + sb_scaleX + +
    +
    + Path X scale. + + +
    + + + + + + + + +
    + + +
    + + + sb_scaleY + +
    +
    + Path Y scale. + + +
    + + + + + + + + +
    + + +
    + + + tAnchorX + +
    +
    + Path translation anchor X. + + +
    + + + + + + + + +
    + + +
    + + + tAnchorY + +
    +
    + Path translation anchor Y. + + +
    + + + + + + + + +
    + + +
    + + + tb_x + +
    +
    + Path translation X. + + +
    + + + + + + + + +
    + + +
    + + + tb_y + +
    +
    + Path translation Y. + + +
    + + + + + + + + +
    + + +
    + + + tmpMatrix + +
    +
    + Spare calculation matrix. + + +
    + + + + + + + + +
    + + +
    + + + width + +
    +
    + Path bounding box width. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __getPositionImpl(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + addArcTo(x1, y1, x2, y2, radius, cw, color) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x1 + +
    +
    + +
    + y1 + +
    +
    + +
    + x2 + +
    +
    + +
    + y2 + +
    +
    + +
    + radius + +
    +
    + +
    + cw + +
    +
    + +
    + color + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addBehavior(behavior) + +
    +
    + Add a Behavior to the Actor. +An Actor accepts an undefined number of Behaviors. + + +
    + + + + +
    +
    Parameters:
    + +
    + behavior + +
    +
    {CAAT.Behavior} a CAAT.Behavior instance
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + addCatmullTo(px1, py1, px2, py2, px3, py3, color) + +
    +
    + Add a Catmull-Rom segment to this path. +The segment starts in the current last path coordinate. + + +
    + + + + +
    +
    Parameters:
    + +
    + px1 + +
    +
    {number}
    + +
    + py1 + +
    +
    {number}
    + +
    + px2 + +
    +
    {number}
    + +
    + py2 + +
    +
    {number}
    + +
    + px3 + +
    +
    {number}
    + +
    + py3 + +
    +
    {number}
    + +
    + color + +
    +
    {color=}. optional parameter. determines the color to draw the segment with (if + being drawn by a CAAT.PathActor).
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + addCubicTo(px1, py1, px2, py2, px3, py3, color) + +
    +
    + Add a Cubic Bezier segment to this path. +The segment starts in the current last path coordinate. + + +
    + + + + +
    +
    Parameters:
    + +
    + px1 + +
    +
    {number}
    + +
    + py1 + +
    +
    {number}
    + +
    + px2 + +
    +
    {number}
    + +
    + py2 + +
    +
    {number}
    + +
    + px3 + +
    +
    {number}
    + +
    + py3 + +
    +
    {number}
    + +
    + color + +
    +
    {color=}. optional parameter. determines the color to draw the segment with (if + being drawn by a CAAT.PathActor).
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + addLineTo(px1, py1, color) + +
    +
    + Adds a line segment to this path. +The segment starts in the current last path coordinate. + + +
    + + + + +
    +
    Parameters:
    + +
    + px1 + +
    +
    {number}
    + +
    + py1 + +
    +
    {number}
    + +
    + color + +
    +
    {color=}. optional parameter. determines the color to draw the segment with (if + being drawn by a CAAT.PathActor).
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + addQuadricTo(px1, py1, px2, py2, color) + +
    +
    + Add a Quadric Bezier path segment to this path. +The segment starts in the current last path coordinate. + + +
    + + + + +
    +
    Parameters:
    + +
    + px1 + +
    +
    {number}
    + +
    + py1 + +
    +
    {number}
    + +
    + px2 + +
    +
    {number}
    + +
    + py2 + +
    +
    {number}
    + +
    + color + +
    +
    {color=}. optional parameter. determines the color to draw the segment with (if + being drawn by a CAAT.PathActor).
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + addRectangleTo(x1, y1, cw, color) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x1 + +
    +
    + +
    + y1 + +
    +
    + +
    + cw + +
    +
    + +
    + color + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + addSegment(pathSegment) + +
    +
    + Add a CAAT.PathSegment instance to this path. + + +
    + + + + +
    +
    Parameters:
    + +
    + pathSegment + +
    +
    {CAAT.PathSegment}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {*} + applyAsPath(director) + +
    +
    + Apply this path as a Canvas context path. +You must explicitly call context.beginPath + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + + + + + +
    +
    Returns:
    + +
    {*}
    + +
    + + + + +
    + + +
    + + + applyBehaviors(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + beginPath(px0, py0) + +
    +
    + Set the path's starting point. The method startCurvePosition will return this coordinate. +

    +If a call to any method of the form addTo is called before this calling +this method, they will assume to start at -1,-1 and probably you'll get the wrong path. + + +

    + + + + +
    +
    Parameters:
    + +
    + px0 + +
    +
    {number}
    + +
    + py0 + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + closePath() + +
    +
    + Close the path by adding a line path segment from the current last path +coordinate to startCurvePosition coordinate. +

    +This method closes a path by setting its last path segment's last control point +to be the first path segment's first control point. +

    + This method also sets the path as finished, and calculates all path's information + such as length and bounding box. + + +

    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + drag(x, y, callback) + +
    +
    + Drags a path's control point. +If the method press has not set needed internal data to drag a control point, this +method will do nothing, regardless the user is dragging on the CAAT.PathActor delegate. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number}
    + +
    + y + +
    +
    {number}
    + +
    + callback + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + emptyBehaviorList() + +
    +
    + Removes all behaviors from an Actor. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + {CAAT.Point} + endCurvePosition() + +
    +
    + Return the last point of the last path segment of this compound path. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + +
    + + +
    + + + endPath() + +
    +
    + Finishes the process of building the path. It involves calculating each path segments length +and proportional length related to a normalized path length of 1. +It also sets current paths length. +These calculi are needed to traverse the path appropriately. +

    +This method must be called explicitly, except when closing a path (that is, calling the +method closePath) which calls this method as well. + + +

    + + + + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + extractPathPoints() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + flatten(npatches, closed) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + npatches + +
    +
    + +
    + closed + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {[CAAT.Point]} + getContour(iSize) + +
    +
    + Returns a collection of CAAT.Point objects which conform a path's contour. + + +
    + + + + +
    +
    Parameters:
    + +
    + iSize + +
    +
    {number}. Number of samples for each path segment.
    + +
    + + + + + +
    +
    Returns:
    + +
    {[CAAT.Point]}
    + +
    + + + + +
    + + +
    + + + getControlPoint(index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.PathSegment} + getCurrentPathSegment() + +
    +
    + Return the last path segment added to this path. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.PathSegment}
    + +
    + + + + +
    + + +
    + + + getFirstPathSegment() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getLastPathSegment() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {number} + getNumSegments() + +
    +
    + Returns an integer with the number of path segments that conform this path. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + {CAAT.Foundation.Point} + getPosition(time, open_contour) + +
    +
    + This method, returns a CAAT.Foundation.Point instance indicating a coordinate in the path. +The returned coordinate is the corresponding to normalizing the path's length to 1, +and then finding what path segment and what coordinate in that path segment corresponds +for the input time parameter. +

    +The parameter time must be a value ranging 0..1. +If not constrained to these values, the parameter will be modulus 1, and then, if less +than 0, be normalized to 1+time, so that the value always ranges from 0 to 1. +

    +This method is needed when traversing the path throughout a CAAT.Interpolator instance. + + +

    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    {number} a value between 0 and 1 both inclusive. 0 will return path's starting coordinate. +1 will return path's end coordinate.
    + +
    + open_contour + +
    +
    {boolean=} treat this path as an open contour. It is intended for +open paths, and interpolators which give values above 1. see tutorial 7.1.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Foundation.Point}
    + +
    + + + + +
    + + +
    + + {CAAT.Point} + getPositionFromLength(iLength) + +
    +
    + Analogously to the method getPosition, this method returns a CAAT.Point instance with +the coordinate on the path that corresponds to the given length. The input length is +related to path's length. + + +
    + + + + +
    +
    Parameters:
    + +
    + iLength + +
    +
    {number} a float with the target length.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + +
    + + +
    + + + getSegment(index) + +
    +
    + Gets a CAAT.PathSegment instance. + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    {number} the index of the desired CAAT.PathSegment.
    + +
    + + + + + +
    +
    Returns:
    + +
    CAAT.PathSegment
    + +
    + + + + +
    + + +
    + + + isEmpty() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + numControlPoints() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + paint(director) + +
    +
    + Paints the path. +This method is called by CAAT.PathActor instances. +If the path is set as interactive (by default) path segment will draw curve modification +handles as well. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director} a CAAT.Director instance.
    + +
    + + + + + + + + +
    + + +
    + + + press(x, y) + +
    +
    + Sent by a CAAT.PathActor instance object to try to drag a path's control point. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number}
    + +
    + y + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + release() + +
    +
    + Method invoked when a CAAT.PathActor stops dragging a control point. + + +
    + + + + + + + + + + + +
    + + +
    + + + removeBehaviorById(id) + +
    +
    + Remove a Behavior with id param as behavior identifier from this actor. +This function will remove ALL behavior instances with the given id. + + +
    + + + + +
    +
    Parameters:
    + +
    + id + +
    +
    {number} an integer. +return this;
    + +
    + + + + + + + + +
    + + +
    + + + removeBehaviour(behavior) + +
    +
    + Remove a Behavior from the Actor. +If the Behavior is not present at the actor behavior collection nothing happends. + + +
    + + + + +
    +
    Parameters:
    + +
    + behavior + +
    +
    {CAAT.Behavior} a CAAT.Behavior instance.
    + +
    + + + + + + + + +
    + + +
    + + + setATMatrix() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + setCatmullRom(points, closed) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + points + +
    +
    + +
    + closed + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setCubic(x0, y0, x1, y1, x2, y2, x3, y3) + +
    +
    + Sets this path to be composed by a single Cubic Bezier path segment. + + +
    + + + + +
    +
    Parameters:
    + +
    + x0 + +
    +
    {number}
    + +
    + y0 + +
    +
    {number}
    + +
    + x1 + +
    +
    {number}
    + +
    + y1 + +
    +
    {number}
    + +
    + x2 + +
    +
    {number}
    + +
    + y2 + +
    +
    {number}
    + +
    + x3 + +
    +
    {number}
    + +
    + y3 + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setInteractive(interactive) + +
    +
    + Set whether this path should paint handles for every control point. + + +
    + + + + +
    +
    Parameters:
    + +
    + interactive + +
    +
    {boolean}.
    + +
    + + + + + + + + +
    + + +
    + + + setLinear(x0, y0, x1, y1) + +
    +
    + Set the path to be composed by a single LinearPath segment. + + +
    + + + + +
    +
    Parameters:
    + +
    + x0 + +
    +
    {number}
    + +
    + y0 + +
    +
    {number}
    + +
    + x1 + +
    +
    {number}
    + +
    + y1 + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setLocation(x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPoint(point, index) + +
    +
    + Set a point from this path. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Point}
    + +
    + index + +
    +
    {integer} a point index.
    + +
    + + + + + + + + +
    + + +
    + + + setPoints(points) + +
    +
    + Reposition this path points. +This operation will only take place if the supplied points array equals in size to +this path's already set points. + + +
    + + + + +
    +
    Parameters:
    + +
    + points + +
    +
    {Array}
    + +
    + + + + + + + + +
    + + +
    + + + setPosition(x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPositionAnchor(ax, ay) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ax + +
    +
    + +
    + ay + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPositionAnchored(x, y, ax, ay) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + ax + +
    +
    + +
    + ay + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setQuadric(x0, y0, x1, y1, x2, y2) + +
    +
    + Set this path to be composed by a single Quadric Bezier path segment. + + +
    + + + + +
    +
    Parameters:
    + +
    + x0 + +
    +
    {number}
    + +
    + y0 + +
    +
    {number}
    + +
    + x1 + +
    +
    {number}
    + +
    + y1 + +
    +
    {number}
    + +
    + x2 + +
    +
    {number}
    + +
    + y2 + +
    +
    {number}
    + +
    + + + + + +
    +
    Returns:
    + +
    this
    + +
    + + + + +
    + + +
    + + + setRectangle(x0, y0, x1, y1) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + x0 + +
    +
    + +
    + y0 + +
    +
    + +
    + x1 + +
    +
    + +
    + y1 + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setRotation(angle) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + angle + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setRotationAnchor(ax, ay) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ax + +
    +
    + +
    + ay + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setRotationAnchored(angle, rx, ry) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + angle + +
    +
    + +
    + rx + +
    +
    + +
    + ry + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setScale(sx, sy) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + sx + +
    +
    + +
    + sy + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setScaleAnchor(ax, ay) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ax + +
    +
    + +
    + ay + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setScaleAnchored(scaleX, scaleY, sx, sy) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + scaleX + +
    +
    + +
    + scaleY + +
    +
    + +
    + sx + +
    +
    + +
    + sy + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.Point} + startCurvePosition() + +
    +
    + Return the first point of the first path segment of this compound path. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + +
    + + +
    + + + updatePath(point, callback) + +
    +
    + Indicates that some path control point has changed, and that the path must recalculate +its internal data, ie: length and bbox. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + callback + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.PathSegment.html b/documentation/jsdoc/symbols/CAAT.PathUtil.PathSegment.html new file mode 100644 index 00000000..8a43f7a9 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.PathUtil.PathSegment.html @@ -0,0 +1,1540 @@ + + + + + + + JsDoc Reference - CAAT.PathUtil.PathSegment + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.PathUtil.PathSegment +

    + + +

    + + + + + + +
    Defined in: PathSegment.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + bbox +
    +
    Segment bounding box.
    +
      +
    + color +
    +
    Color to draw the segment.
    +
      +
    + length +
    +
    Segment length.
    +
      +
    + parent +
    +
    Path this segment belongs to.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    applyAsPath(ctx) +
    +
    Draw this path using RenderingContext2D drawing primitives.
    +
      +
    drawHandle(ctx, x, y) +
    +
    +
      + +
    Get path's last coordinate.
    +
      +
    endPath() +
    +
    Instruments the path has finished building, and that no more segments will be added to it.
    +
      +
    getBoundingBox(rectangle) +
    +
    Gets the path bounding box (or the rectangle that contains the whole path).
    +
      +
    getContour(iSize) +
    +
    Gets a polyline describing the path contour.
    +
      +
    getControlPoint(index) +
    +
    Gets CAAT.Point instance with the 2d position of a control point.
    +
      + +
    Gets Path length.
    +
      +
    getPosition(time) +
    +
    Get a coordinate on path.
    +
      + +
    Gets the number of control points needed to create the path.
    +
      +
    setColor(color) +
    +
    +
      +
    setParent(parent) +
    +
    Set a PathSegment's parent
    +
      +
    setPoint(point, index) +
    +
    Set a point from this path segment.
    +
      +
    setPoints(points) +
    +
    Set this path segment's points information.
    +
      + +
    Get path's starting coordinate.
    +
      +
    transform(matrix) +
    +
    Transform this path with the given affinetransform matrix.
    +
      +
    updatePath(point) +
    +
    Recalculate internal path structures.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.PathUtil.PathSegment() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + bbox + +
    +
    + Segment bounding box. + + +
    + + + + + + + + +
    + + +
    + + + color + +
    +
    + Color to draw the segment. + + +
    + + + + + + + + +
    + + +
    + + + length + +
    +
    + Segment length. + + +
    + + + + + + + + +
    + + +
    + + + parent + +
    +
    + Path this segment belongs to. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + applyAsPath(ctx) + +
    +
    + Draw this path using RenderingContext2D drawing primitives. +The intention is to set a path or pathsegment as a clipping region. + + +
    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    {RenderingContext2D}
    + +
    + + + + + + + + +
    + + +
    + + + drawHandle(ctx, x, y) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + ctx + +
    +
    + +
    + x + +
    +
    + +
    + y + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.Point} + endCurvePosition() + +
    +
    + Get path's last coordinate. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + +
    + + +
    + + + endPath() + +
    +
    + Instruments the path has finished building, and that no more segments will be added to it. +You could later add more PathSegments and endPath must be called again. + + +
    + + + + + + + + + + + +
    + + +
    + + {CAAT.Rectangle} + getBoundingBox(rectangle) + +
    +
    + Gets the path bounding box (or the rectangle that contains the whole path). + + +
    + + + + +
    +
    Parameters:
    + +
    + rectangle + +
    +
    a CAAT.Rectangle instance with the bounding box.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Rectangle}
    + +
    + + + + +
    + + +
    + + {[CAAT.Point]} + getContour(iSize) + +
    +
    + Gets a polyline describing the path contour. The contour will be defined by as mush as iSize segments. + + +
    + + + + +
    +
    Parameters:
    + +
    + iSize + +
    +
    an integer indicating the number of segments of the contour polyline.
    + +
    + + + + + +
    +
    Returns:
    + +
    {[CAAT.Point]}
    + +
    + + + + +
    + + +
    + + {CAAT.Point} + getControlPoint(index) + +
    +
    + Gets CAAT.Point instance with the 2d position of a control point. + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    an integer indicating the desired control point coordinate.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + +
    + + +
    + + {number} + getLength() + +
    +
    + Gets Path length. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + {CAAT.Point} + getPosition(time) + +
    +
    + Get a coordinate on path. +The parameter time is normalized, that is, its values range from zero to one. +zero will mean startCurvePosition and one will be endCurvePosition. Other values +will be a position on the path relative to the path length. if the value is greater that 1, if will be set +to modulus 1. + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    a float with a value between zero and 1 inclusive both.
    + +
    + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + +
    + + +
    + + {number} + numControlPoints() + +
    +
    + Gets the number of control points needed to create the path. +Each PathSegment type can have different control points. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number} an integer with the number of control points.
    + +
    + + + + +
    + + +
    + + + setColor(color) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + color + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setParent(parent) + +
    +
    + Set a PathSegment's parent + + +
    + + + + +
    +
    Parameters:
    + +
    + parent + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPoint(point, index) + +
    +
    + Set a point from this path segment. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    {CAAT.Point}
    + +
    + index + +
    +
    {integer} a point index.
    + +
    + + + + + + + + +
    + + +
    + + + setPoints(points) + +
    +
    + Set this path segment's points information. + + +
    + + + + +
    +
    Parameters:
    + +
    + points + +
    +
    {Array}
    + +
    + + + + + + + + +
    + + +
    + + {CAAT.Point} + startCurvePosition() + +
    +
    + Get path's starting coordinate. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Point}
    + +
    + + + + +
    + + +
    + + + transform(matrix) + +
    +
    + Transform this path with the given affinetransform matrix. + + +
    + + + + +
    +
    Parameters:
    + +
    + matrix + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + updatePath(point) + +
    +
    + Recalculate internal path structures. + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.RectPath.html b/documentation/jsdoc/symbols/CAAT.PathUtil.RectPath.html new file mode 100644 index 00000000..3b652da3 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.PathUtil.RectPath.html @@ -0,0 +1,1508 @@ + + + + + + + JsDoc Reference - CAAT.PathUtil.RectPath + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.PathUtil.RectPath +

    + + +

    + +
    Extends + CAAT.PathUtil.PathSegment.
    + + + + + +
    Defined in: RectPath.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + cw +
    +
    Traverse this path clockwise or counterclockwise (false).
    +
      + +
    spare point for calculations
    +
      +
    + points +
    +
    A collection of Points.
    +
    + + + +
    +
    Fields borrowed from class CAAT.PathUtil.PathSegment:
    bbox, color, length, parent
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init() +
    +
    +
      +
    applyAsPath(director) +
    +
    +
      + +
    +
      + +
    Returns final path segment point's x coordinate.
    +
      + +
    +
      +
    getControlPoint(index) +
    +
    +
      +
    getPosition(time) +
    +
    +
      + +
    +
      + +
    Returns initial path segment point's x coordinate.
    +
      + +
    +
      + +
    Get the number of control points.
    +
      +
    paint(director, bDrawHandles) +
    +
    Draws this path segment on screen.
    +
      + +
    +
      +
    setFinalPosition(finalX, finalY) +
    +
    Set a rectangle from points[0] to (finalX, finalY)
    +
      + +
    Set this path segment's starting position.
    +
      +
    setPoint(point, index) +
    +
    +
      +
    setPoints(points) +
    +
    An array of {CAAT.Point} composed of two points.
    +
      + +
    +
      +
    updatePath(point) +
    +
    +
    + + + +
    +
    Methods borrowed from class CAAT.PathUtil.PathSegment:
    drawHandle, endPath, getBoundingBox, getLength, setColor, setParent, transform
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.PathUtil.RectPath() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + cw + +
    +
    + Traverse this path clockwise or counterclockwise (false). + + +
    + + + + + + + + +
    + + +
    + + + newPosition + +
    +
    + spare point for calculations + + +
    + + + + + + + + +
    + + +
    + + + points + +
    +
    + A collection of Points. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + applyAsPath(director) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + endCurvePosition() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {number} + finalPositionX() + +
    +
    + Returns final path segment point's x coordinate. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + getContour() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getControlPoint(index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPosition(time) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + time + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getPositionFromLength(iLength) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + iLength + +
    +
    + +
    + + + + + + + + +
    + + +
    + + {number} + initialPositionX() + +
    +
    + Returns initial path segment point's x coordinate. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + isClockWise() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + {number} + numControlPoints() + +
    +
    + Get the number of control points. For this type of path segment, start and +ending path segment points. Defaults to 2. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number}
    + +
    + + + + +
    + + +
    + + + paint(director, bDrawHandles) + +
    +
    + Draws this path segment on screen. Optionally it can draw handles for every control point, in +this case, start and ending path segment points. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    {CAAT.Director}
    + +
    + bDrawHandles + +
    +
    {boolean}
    + +
    + + + + + + + + +
    + + +
    + + + setClockWise(cw) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + cw + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setFinalPosition(finalX, finalY) + +
    +
    + Set a rectangle from points[0] to (finalX, finalY) + + +
    + + + + +
    +
    Parameters:
    + +
    + finalX + +
    +
    {number}
    + +
    + finalY + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setInitialPosition(x, y) + +
    +
    + Set this path segment's starting position. +This method should not be called again after setFinalPosition has been called. + + +
    + + + + +
    +
    Parameters:
    + +
    + x + +
    +
    {number}
    + +
    + y + +
    +
    {number}
    + +
    + + + + + + + + +
    + + +
    + + + setPoint(point, index) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + index + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setPoints(points) + +
    +
    + An array of {CAAT.Point} composed of two points. + + +
    + + + + +
    +
    Parameters:
    + +
    + points + +
    +
    {Array}
    + +
    + + + + + + + + +
    + + +
    + + + startCurvePosition() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + updatePath(point) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + point + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.SVGPath.html b/documentation/jsdoc/symbols/CAAT.PathUtil.SVGPath.html new file mode 100644 index 00000000..c3ece987 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.PathUtil.SVGPath.html @@ -0,0 +1,1689 @@ + + + + + + + JsDoc Reference - CAAT.PathUtil.SVGPath + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.PathUtil.SVGPath +

    + + +

    + + + + + + +
    Defined in: SVGPath.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +

    +This class is a SVG Path parser.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <private>   + +
    +
    <private>   +
    + c +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    ____getNumbers(pathInfo, c, v, n, error) +
    +
    +
    <private>   +
    __findNumber(pathInfo, c) +
    +
    +
    <private>   +
    __getNumber(pathInfo, c, v, error) +
    +
    +
    <private>   +
    __init() +
    +
    +
    <private>   +
    __isDigit(c) +
    +
    +
    <private>   +
    __maybeNumber(pathInfo, c) +
    +
    +
    <private>   +
    __parseClosePath(pathInfo, c, path, error) +
    +
    +
    <private>   +
    __parseCubic(pathInfo, c, absolute, path, error) +
    +
    +
    <private>   +
    __parseCubicS(pathInfo, c, absolute, path, error) +
    +
    +
    <private>   +
    __parseLine(pathInfo, c, absolute, path, error) +
    +
    +
    <private>   +
    __parseLineH(pathInfo, c, absolute, path, error) +
    +
    +
    <private>   +
    __parseLineV(pathInfo, c, absolute, path, error) +
    +
    +
    <private>   +
    __parseMoveTo(pathInfo, c, absolute, path, error) +
    +
    +
    <private>   +
    __parseQuadric(pathInfo, c, absolute, path, error) +
    +
    +
    <private>   +
    __parseQuadricS(pathInfo, c, absolute, path, error) +
    +
    +
    <private>   +
    __skipBlank(pathInfo, c) +
    +
    +
      +
    parsePath(pathInfo) +
    +
    This method will create a CAAT.PathUtil.Path object with as many contours as needed.
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.PathUtil.SVGPath() +
    + +
    +

    +This class is a SVG Path parser. +By calling the method parsePath( svgpath ) an instance of CAAT.PathUtil.Path will be built by parsing +its contents. + +

    +See demo32 + +

    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <private> + + + bezierInfo + +
    +
    + + + +
    + + + + + + + + +
    + + +
    <private> + + + c + +
    +
    + + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + ____getNumbers(pathInfo, c, v, n, error) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + v + +
    +
    + +
    + n + +
    +
    + +
    + error + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __findNumber(pathInfo, c) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __getNumber(pathInfo, c, v, error) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + v + +
    +
    + +
    + error + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __init() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    <private> + + + __isDigit(c) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + c + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __maybeNumber(pathInfo, c) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __parseClosePath(pathInfo, c, path, error) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + path + +
    +
    + +
    + error + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __parseCubic(pathInfo, c, absolute, path, error) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + absolute + +
    +
    + +
    + path + +
    +
    + +
    + error + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __parseCubicS(pathInfo, c, absolute, path, error) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + absolute + +
    +
    + +
    + path + +
    +
    + +
    + error + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __parseLine(pathInfo, c, absolute, path, error) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + absolute + +
    +
    + +
    + path + +
    +
    + +
    + error + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __parseLineH(pathInfo, c, absolute, path, error) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + absolute + +
    +
    + +
    + path + +
    +
    + +
    + error + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __parseLineV(pathInfo, c, absolute, path, error) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + absolute + +
    +
    + +
    + path + +
    +
    + +
    + error + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __parseMoveTo(pathInfo, c, absolute, path, error) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + absolute + +
    +
    + +
    + path + +
    +
    + +
    + error + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __parseQuadric(pathInfo, c, absolute, path, error) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + absolute + +
    +
    + +
    + path + +
    +
    + +
    + error + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __parseQuadricS(pathInfo, c, absolute, path, error) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + absolute + +
    +
    + +
    + path + +
    +
    + +
    + error + +
    +
    + +
    + + + + + + + + +
    + + +
    <private> + + + __skipBlank(pathInfo, c) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    + +
    + c + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + parsePath(pathInfo) + +
    +
    + This method will create a CAAT.PathUtil.Path object with as many contours as needed. + + +
    + + + + +
    +
    Parameters:
    + +
    + pathInfo + +
    +
    {string} a SVG path
    + +
    + + + + + +
    +
    Returns:
    + +
    Array.
    + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.PathUtil.html b/documentation/jsdoc/symbols/CAAT.PathUtil.html new file mode 100644 index 00000000..044f83ab --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.PathUtil.html @@ -0,0 +1,541 @@ + + + + + + + JsDoc Reference - CAAT.PathUtil + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.PathUtil +

    + + +

    + + + + + + +
    Defined in: PathSegment.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.PathUtil +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:19 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.WebGL.ColorProgram.html b/documentation/jsdoc/symbols/CAAT.WebGL.ColorProgram.html new file mode 100644 index 00000000..0e75aad8 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.WebGL.ColorProgram.html @@ -0,0 +1,885 @@ + + + + + + + JsDoc Reference - CAAT.WebGL.ColorProgram + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.WebGL.ColorProgram +

    + + +

    + +
    Extends + CAAT.WebGL.Program.
    + + + + + +
    Defined in: ColorProgram.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    int32 Array for color Buffer
    +
      + +
    Float32 Array for vertex buffer.
    +
      + +
    GLBuffer for vertex buffer.
    +
    + + + +
    +
    Fields borrowed from class CAAT.WebGL.Program:
    gl, shaderProgram
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(gl) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    setColor(colorArray) +
    +
    +
    + + + +
    +
    Methods borrowed from class CAAT.WebGL.Program:
    create, getDomShader, getShader, setAlpha, setMatrixUniform, useProgram
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.WebGL.ColorProgram() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + colorBuffer + +
    +
    + int32 Array for color Buffer + + +
    + + + + + + + + +
    + + +
    + + + vertexPositionArray + +
    +
    + Float32 Array for vertex buffer. + + +
    + + + + + + + + +
    + + +
    + + + vertexPositionBuffer + +
    +
    + GLBuffer for vertex buffer. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(gl) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + gl + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getFragmentShader() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getVertexShader() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + initialize() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + setColor(colorArray) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + colorArray + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.WebGL.GLU.html b/documentation/jsdoc/symbols/CAAT.WebGL.GLU.html new file mode 100644 index 00000000..c5d69e63 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.WebGL.GLU.html @@ -0,0 +1,789 @@ + + + + + + + JsDoc Reference - CAAT.WebGL.GLU + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.WebGL.GLU +

    + + +

    + + + + + + +
    Defined in: GLU.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <static>   +
    CAAT.WebGL.GLU.makeFrustum(left, right, bottom, top, znear, zfar, viewportHeight) +
    +
    Create a matrix for a frustum.
    +
    <static>   +
    CAAT.WebGL.GLU.makeOrtho(left, right, bottom, top, znear, zfar) +
    +
    Create an orthogonal projection matrix.
    +
    <static>   +
    CAAT.WebGL.GLU.makePerspective(fovy, aspect, znear, zfar, viewportHeight) +
    +
    Create a perspective matrix.
    +
    + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.WebGL.GLU +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + +
    + Method Detail +
    + + +
    <static> + + + CAAT.WebGL.GLU.makeFrustum(left, right, bottom, top, znear, zfar, viewportHeight) + +
    +
    + Create a matrix for a frustum. + + +
    + + + + +
    +
    Parameters:
    + +
    + left + +
    +
    + +
    + right + +
    +
    + +
    + bottom + +
    +
    + +
    + top + +
    +
    + +
    + znear + +
    +
    + +
    + zfar + +
    +
    + +
    + viewportHeight + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.WebGL.GLU.makeOrtho(left, right, bottom, top, znear, zfar) + +
    +
    + Create an orthogonal projection matrix. + + +
    + + + + +
    +
    Parameters:
    + +
    + left + +
    +
    + +
    + right + +
    +
    + +
    + bottom + +
    +
    + +
    + top + +
    +
    + +
    + znear + +
    +
    + +
    + zfar + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.WebGL.GLU.makePerspective(fovy, aspect, znear, zfar, viewportHeight) + +
    +
    + Create a perspective matrix. + + +
    + + + + +
    +
    Parameters:
    + +
    + fovy + +
    +
    + +
    + aspect + +
    +
    + +
    + znear + +
    +
    + +
    + zfar + +
    +
    + +
    + viewportHeight + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.WebGL.Program.html b/documentation/jsdoc/symbols/CAAT.WebGL.Program.html new file mode 100644 index 00000000..2a4c8e0c --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.WebGL.Program.html @@ -0,0 +1,1064 @@ + + + + + + + JsDoc Reference - CAAT.WebGL.Program + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.WebGL.Program +

    + + +

    + + + + + + +
    Defined in: Program.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + gl +
    +
    Canvas 3D context.
    +
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(gl) +
    +
    +
      +
    create() +
    +
    +
      +
    getDomShader(gl, id) +
    +
    +
      + +
    +
      +
    getShader(gl, type, str) +
    +
    +
      + +
    +
      + +
    +
      +
    setAlpha(alpha) +
    +
    Set fragment shader's alpha composite value.
    +
      +
    setMatrixUniform(caatMatrix4) +
    +
    +
      + +
    +
    + + + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.WebGL.Program() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + gl + +
    +
    + Canvas 3D context. + + +
    + + + + + + + + +
    + + +
    + + + shaderProgram + +
    +
    + + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(gl) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + gl + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + create() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getDomShader(gl, id) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + gl + +
    +
    + +
    + id + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getFragmentShader() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getShader(gl, type, str) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + gl + +
    +
    + +
    + type + +
    +
    + +
    + str + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getVertexShader() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + initialize() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + setAlpha(alpha) + +
    +
    + Set fragment shader's alpha composite value. + + +
    + + + + +
    +
    Parameters:
    + +
    + alpha + +
    +
    {number} float value 0..1.
    + +
    + + + + + + + + +
    + + +
    + + + setMatrixUniform(caatMatrix4) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + caatMatrix4 + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + useProgram() + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.WebGL.TextureProgram.html b/documentation/jsdoc/symbols/CAAT.WebGL.TextureProgram.html new file mode 100644 index 00000000..14997f0e --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.WebGL.TextureProgram.html @@ -0,0 +1,1573 @@ + + + + + + + JsDoc Reference - CAAT.WebGL.TextureProgram + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Class CAAT.WebGL.TextureProgram +

    + + +

    + +
    Extends + CAAT.WebGL.Program.
    + + + + + +
    Defined in: TextureProgram.js. + +

    + + + + + + + + + + + + + + + + + +
    Class Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      + +
    Lines GLBuffer
    +
      +
    + prevA +
    +
    +
      +
    + prevAlpha +
    +
    +
      +
    + prevB +
    +
    +
      +
    + prevG +
    +
    +
      +
    + prevR +
    +
    +
      + +
    +
      + +
    VertexIndex GLBuffer.
    +
      + +
    VertextBuffer Float32 Array
    +
      + +
    VertextBuffer GLBuffer
    +
      + +
    VertexBuffer Float32 Array
    +
      + +
    UVBuffer GLBuffer
    +
    + + + +
    +
    Fields borrowed from class CAAT.WebGL.Program:
    gl, shaderProgram
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <private>   +
    __init(gl) +
    +
    +
      +
    drawLines(lines_data, size, r, g, b, a, lineWidth) +
    +
    +
      +
    drawPolylines(polyline_data, size, r, g, b, a, lineWidth) +
    +
    +
      + +
    +
      + +
    +
      + +
    +
      +
    setAlpha(alpha) +
    +
    +
      +
    setTexture(glTexture) +
    +
    +
      +
    setUseColor(use, r, g, b, a) +
    +
    +
      +
    updateUVBuffer(uvArray) +
    +
    +
      +
    updateVertexBuffer(vertexArray) +
    +
    +
      + +
    +
    + + + +
    +
    Methods borrowed from class CAAT.WebGL.Program:
    create, getDomShader, getShader, setMatrixUniform
    +
    + + + + + + + +
    +
    + Class Detail +
    + +
    + CAAT.WebGL.TextureProgram() +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    + + + linesBuffer + +
    +
    + Lines GLBuffer + + +
    + + + + + + + + +
    + + +
    + + + prevA + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + prevAlpha + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + prevB + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + prevG + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + prevR + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + prevTexture + +
    +
    + + + +
    + + + + + + + + +
    + + +
    + + + vertexIndexBuffer + +
    +
    + VertexIndex GLBuffer. + + +
    + + + + + + + + +
    + + +
    + + + vertexPositionArray + +
    +
    + VertextBuffer Float32 Array + + +
    + + + + + + + + +
    + + +
    + + + vertexPositionBuffer + +
    +
    + VertextBuffer GLBuffer + + +
    + + + + + + + + +
    + + +
    + + + vertexUVArray + +
    +
    + VertexBuffer Float32 Array + + +
    + + + + + + + + +
    + + +
    + + + vertexUVBuffer + +
    +
    + UVBuffer GLBuffer + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <private> + + + __init(gl) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + gl + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + drawLines(lines_data, size, r, g, b, a, lineWidth) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + lines_data + +
    +
    {Float32Array} array of number with x,y,z coords for each line point.
    + +
    + size + +
    +
    {number} number of lines to draw.
    + +
    + r + +
    +
    + +
    + g + +
    +
    + +
    + b + +
    +
    + +
    + a + +
    +
    + +
    + lineWidth + +
    +
    {number} drawing line size.
    + +
    + + + + + + + + +
    + + +
    + + + drawPolylines(polyline_data, size, r, g, b, a, lineWidth) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + polyline_data + +
    +
    + +
    + size + +
    +
    + +
    + r + +
    +
    + +
    + g + +
    +
    + +
    + b + +
    +
    + +
    + a + +
    +
    + +
    + lineWidth + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + getFragmentShader() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + getVertexShader() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + initialize() + +
    +
    + + + +
    + + + + + + + + + + + +
    + + +
    + + + setAlpha(alpha) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + alpha + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setTexture(glTexture) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + glTexture + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + setUseColor(use, r, g, b, a) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + use + +
    +
    + +
    + r + +
    +
    + +
    + g + +
    +
    + +
    + b + +
    +
    + +
    + a + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + updateUVBuffer(uvArray) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + uvArray + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + updateVertexBuffer(vertexArray) + +
    +
    + + + +
    + + + + +
    +
    Parameters:
    + +
    + vertexArray + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + useProgram() + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.WebGL.html b/documentation/jsdoc/symbols/CAAT.WebGL.html new file mode 100644 index 00000000..e4a95ca5 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.WebGL.html @@ -0,0 +1,546 @@ + + + + + + + JsDoc Reference - CAAT.WebGL + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT.WebGL +

    + + +

    + + + + + + +
    Defined in: Program.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      + +
    +
    + + + + + + + + + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT.WebGL +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/CAAT.html b/documentation/jsdoc/symbols/CAAT.html new file mode 100644 index 00000000..68a85653 --- /dev/null +++ b/documentation/jsdoc/symbols/CAAT.html @@ -0,0 +1,2561 @@ + + + + + + + JsDoc Reference - CAAT + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Namespace CAAT +

    + + +

    + + + + + + +
    Defined in: CAAT.js. + +

    + + + + + + + + + + + + + + + + + +
    Namespace Summary
    Constructor AttributesConstructor Name and Description
      +
    + CAAT +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
    <static>   + +
    Acceleration data.
    +
    <static>   +
    + CAAT.ALT_KEY +
    +
    Alt key code
    +
    <static>   + +
    When switching scenes, cache exiting scene or not.
    +
    <private> <static>   +
    + CAAT.CLAMP +
    +
    // do not clamp coordinates.
    +
    <static>   +
    + CAAT.CONTROL_KEY +
    +
    Control key code
    +
    <static>   +
    + CAAT.CSS_TEXT_METRICS +
    +
    Control how CAAT.Font and CAAT.TextActor control font ascent/descent values.
    +
    <static>   +
    + CAAT.currentDirector +
    +
    Current animated director.
    +
    <static>   +
    + CAAT.DEBUG +
    +
    set this variable before building CAAT.Director intances to enable debug panel.
    +
    <static>   +
    + CAAT.DEBUG_DIRTYRECTS +
    +
    if CAAT.Director.setClear uses CLEAR_DIRTY_RECTS, this will show them on screen.
    +
    <static>   +
    + CAAT.DEBUGAABB +
    +
    debug axis aligned bounding boxes.
    +
    <static>   +
    + CAAT.DEBUGAABBCOLOR +
    +
    Bounding boxes color.
    +
    <static>   +
    + CAAT.DEBUGBB +
    +
    show Bounding Boxes
    +
    <static>   +
    + CAAT.DEBUGBBBCOLOR +
    +
    Bounding Boxes color.
    +
    <static>   +
    + CAAT.director +
    +
    Registered director objects.
    +
    <static>   +
    + CAAT.DRAG_THRESHOLD_X +
    +
    Do not consider mouse drag gesture at least until you have dragged +DRAG_THRESHOLD_X and DRAG_THRESHOLD_Y pixels.
    +
    <static>   +
    + CAAT.ENDRAF +
    +
    if RAF, this value signals end of RAF.
    +
    <static>   +
    + CAAT.ENTER_KEY +
    +
    Enter key code
    +
    <static>   +
    + CAAT.FPS +
    +
    expected FPS when using setInterval animation.
    +
    <static>   +
    + CAAT.FPS_REFRESH +
    +
    debug panel update time.
    +
    <static>   +
    + CAAT.FRAME_TIME +
    +
    time to process one frame.
    +
    <static>   +
    + CAAT.GLRENDER +
    +
    is GLRendering enabled.
    +
    <static>   +
    + CAAT.INTERVAL_ID +
    +
    if setInterval, this value holds CAAT.setInterval return value.
    +
    <static>   +
    + CAAT.keyListeners +
    +
    Aray of Key listeners.
    +
    <static>   +
    + CAAT.Keys +
    +
    +
    <static>   +
    + CAAT.Module +
    +
    This function defines CAAT modules, and creates Constructor Class objects.
    +
    <static>   +
    + CAAT.NO_RAF +
    +
    Use RAF shim instead of setInterval.
    +
    <static>   +
    + CAAT.PMR +
    +
    Points to Meter ratio value.
    +
    <static>   +
    + CAAT.RAF +
    +
    requestAnimationFrame time reference.
    +
    <static>   +
    + CAAT.renderEnabled +
    +
    Boolean flag to determine if CAAT.loop has already been called.
    +
    <static>   + +
    time between two consecutive RAF.
    +
    <static>   +
    + CAAT.rotationRate +
    +
    Device motion angles.
    +
    <static>   +
    + CAAT.SET_INTERVAL +
    +
    time between two consecutive setInterval calls.
    +
    <static>   +
    + CAAT.SHIFT_KEY +
    +
    Shift key code
    +
    <static> <constant>   +
    + CAAT.TOUCH_AS_MOUSE +
    +
    Constant to set touch behavior as single touch, compatible with mouse.
    +
    <static>   + +
    Constant to set CAAT touch behavior as multitouch.
    +
    <static>   +
    + CAAT.TOUCH_BEHAVIOR +
    +
    Set CAAT touch behavior as single or multi touch.
    +
    <static>   + +
    Array of window resize listeners.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
    <static>   +
    CAAT.enableBox2DDebug(set, director, world, scale) +
    +
    (As Eemeli Kelokorpi suggested) + +Enable Box2D debug renderer.
    +
    <static>   + +
    Enable device motion events.
    +
    <static>   +
    CAAT.endLoop() +
    +
    Stop animation loop.
    +
    <static>   +
    CAAT.getCurrentScene() +
    +
    Return current scene.
    +
    <static>   + +
    Return current director's current scene's time.
    +
    <static>   +
    CAAT.log() +
    +
    Log function which deals with window's Console object.
    +
    <static>   +
    CAAT.loop(fps) +
    +
    Main animation loop entry point.
    +
    <static>   +
    CAAT.RegisterDirector(director) +
    +
    Register and keep track of every CAAT.Director instance in the document.
    +
    <static>   + +
    Register a function callback as key listener.
    +
    <static>   + +
    Register a function callback as window resize listener.
    +
    <static>   +
    CAAT.renderFrameRAF(now) +
    +
    +
    <static>   +
    CAAT.setCoordinateClamping(clamp) +
    +
    This function makes the system obey decimal point calculations for actor's position, size, etc.
    +
    <static>   +
    CAAT.setCursor(cursor) +
    +
    Set the cursor.
    +
    <static>   +
    CAAT.unregisterResizeListener(director) +
    +
    Remove a function callback as window resize listener.
    +
    + + + + + + + + + +
    +
    + Namespace Detail +
    + +
    + CAAT +
    + +
    + + +
    + + + + + + + + + + + + +
    + + + + +
    + Field Detail +
    + + +
    <static> + + + CAAT.accelerationIncludingGravity + +
    +
    + Acceleration data. + +
    + Defined in: Input.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.ALT_KEY + +
    +
    + Alt key code + +
    + Defined in: KeyEvent.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.CACHE_SCENE_ON_CHANGE + +
    +
    + When switching scenes, cache exiting scene or not. Set before building director instance. + +
    + Defined in: Constants.js. + + +
    + + + + + + + + +
    + + +
    <private> <static> + + + CAAT.CLAMP + +
    +
    + // do not clamp coordinates. speeds things up in older browsers. + +
    + Defined in: Constants.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.CONTROL_KEY + +
    +
    + Control key code + +
    + Defined in: KeyEvent.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.CSS_TEXT_METRICS + +
    +
    + Control how CAAT.Font and CAAT.TextActor control font ascent/descent values. +0 means it will guess values from a font height +1 means it will try to use css to get accurate ascent/descent values and fall back to the previous method + in case it couldn't. + +
    + Defined in: Constants.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.currentDirector + +
    +
    + Current animated director. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.DEBUG + +
    +
    + set this variable before building CAAT.Director intances to enable debug panel. + +
    + Defined in: Constants.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.DEBUG_DIRTYRECTS + +
    +
    + if CAAT.Director.setClear uses CLEAR_DIRTY_RECTS, this will show them on screen. + +
    + Defined in: Constants.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.DEBUGAABB + +
    +
    + debug axis aligned bounding boxes. + +
    + Defined in: Constants.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.DEBUGAABBCOLOR + +
    +
    + Bounding boxes color. + +
    + Defined in: Constants.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.DEBUGBB + +
    +
    + show Bounding Boxes + +
    + Defined in: Constants.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.DEBUGBBBCOLOR + +
    +
    + Bounding Boxes color. + +
    + Defined in: Constants.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.director + +
    +
    + Registered director objects. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.DRAG_THRESHOLD_X + +
    +
    + Do not consider mouse drag gesture at least until you have dragged +DRAG_THRESHOLD_X and DRAG_THRESHOLD_Y pixels. +This is suitable for tablets, where just by touching, drag events are delivered. + +
    + Defined in: Constants.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.ENDRAF + +
    +
    + if RAF, this value signals end of RAF. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.ENTER_KEY + +
    +
    + Enter key code + +
    + Defined in: KeyEvent.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.FPS + +
    +
    + expected FPS when using setInterval animation. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.FPS_REFRESH + +
    +
    + debug panel update time. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.FRAME_TIME + +
    +
    + time to process one frame. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.GLRENDER + +
    +
    + is GLRendering enabled. + +
    + Defined in: Constants.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.INTERVAL_ID + +
    +
    + if setInterval, this value holds CAAT.setInterval return value. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.keyListeners + +
    +
    + Aray of Key listeners. + +
    + Defined in: Input.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Keys + +
    +
    + + +
    + Defined in: KeyEvent.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.Module + +
    +
    + This function defines CAAT modules, and creates Constructor Class objects. + +obj parameter has the following structure: +{ + defines{string}, // class name + depends{Array=}, // dependencies class names + extendsClass{string}, // class to extend from + extensdWith{object}, // actual prototype to extend + aliases{Array} // other class names +} + +
    + Defined in: ModuleManager.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.NO_RAF + +
    +
    + Use RAF shim instead of setInterval. Set to != 0 to use setInterval. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.PMR + +
    +
    + Points to Meter ratio value. + +
    + Defined in: B2DBodyActor.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.RAF + +
    +
    + requestAnimationFrame time reference. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.renderEnabled + +
    +
    + Boolean flag to determine if CAAT.loop has already been called. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.REQUEST_ANIMATION_FRAME_TIME + +
    +
    + time between two consecutive RAF. usually bigger than FRAME_TIME + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.rotationRate + +
    +
    + Device motion angles. + +
    + Defined in: Input.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.SET_INTERVAL + +
    +
    + time between two consecutive setInterval calls. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.SHIFT_KEY + +
    +
    + Shift key code + +
    + Defined in: KeyEvent.js. + + +
    + + + + + + + + +
    + + +
    <static> <constant> + + + CAAT.TOUCH_AS_MOUSE + +
    +
    + Constant to set touch behavior as single touch, compatible with mouse. + +
    + Defined in: Input.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.TOUCH_AS_MULTITOUCH + +
    +
    + Constant to set CAAT touch behavior as multitouch. + +
    + Defined in: Input.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.TOUCH_BEHAVIOR + +
    +
    + Set CAAT touch behavior as single or multi touch. + +
    + Defined in: Input.js. + + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.windowResizeListeners + +
    +
    + Array of window resize listeners. + +
    + Defined in: Input.js. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    <static> + + + CAAT.enableBox2DDebug(set, director, world, scale) + +
    +
    + (As Eemeli Kelokorpi suggested) + +Enable Box2D debug renderer. + +
    + Defined in: B2DBodyActor.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + set + +
    +
    {boolean} enable or disable
    + +
    + director + +
    +
    {CAAT.Foundation.Director}
    + +
    + world + +
    +
    {object} box2d world
    + +
    + scale + +
    +
    {numner} a scale value.
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.enableDeviceMotion() + +
    +
    + Enable device motion events. +This function does not register a callback, instear it sets +CAAT.rotationRate and CAAt.accelerationIncludingGravity values. + +
    + Defined in: Input.js. + + +
    + + + + + + + + + + + +
    + + +
    <static> + + + CAAT.endLoop() + +
    +
    + Stop animation loop. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + + + + +
    + + +
    <static> + + {CAAT.Foundation.Scene} + CAAT.getCurrentScene() + +
    +
    + Return current scene. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {CAAT.Foundation.Scene}
    + +
    + + + + +
    + + +
    <static> + + {number} + CAAT.getCurrentSceneTime() + +
    +
    + Return current director's current scene's time. +The way to go should be keep local scene references, but anyway, this function is always handy. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + + + + + +
    +
    Returns:
    + +
    {number} current scene's virtual time.
    + +
    + + + + +
    + + +
    <static> + + + CAAT.log() + +
    +
    + Log function which deals with window's Console object. + +
    + Defined in: Constants.js. + + +
    + + + + + + + + + + + +
    + + +
    <static> + + + CAAT.loop(fps) + +
    +
    + Main animation loop entry point. +Must called only once, or only after endLoop. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + fps + +
    +
    {number} desired fps. fps parameter will only be used if CAAT.NO_RAF is specified, that is +switch from RequestAnimationFrame to setInterval for animation loop.
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.RegisterDirector(director) + +
    +
    + Register and keep track of every CAAT.Director instance in the document. + +
    + Defined in: AnimationLoop.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.registerKeyListener(f) + +
    +
    + Register a function callback as key listener. + +
    + Defined in: Input.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + f + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.registerResizeListener(f) + +
    +
    + Register a function callback as window resize listener. + +
    + Defined in: Input.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + f + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.renderFrameRAF(now) + +
    +
    + + +
    + Defined in: AnimationLoop.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + now + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.setCoordinateClamping(clamp) + +
    +
    + This function makes the system obey decimal point calculations for actor's position, size, etc. +This may speed things up in some browsers, but at the cost of affecting visuals (like in rotating +objects). + +Latest Chrome (20+) is not affected by this. + +Default CAAT.Matrix try to speed things up. + +
    + Defined in: Constants.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + clamp + +
    +
    {boolean}
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.setCursor(cursor) + +
    +
    + Set the cursor. + +
    + Defined in: Input.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + cursor + +
    +
    + +
    + + + + + + + + +
    + + +
    <static> + + + CAAT.unregisterResizeListener(director) + +
    +
    + Remove a function callback as window resize listener. + +
    + Defined in: Input.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + director + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:15 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/String.html b/documentation/jsdoc/symbols/String.html new file mode 100644 index 00000000..66660573 --- /dev/null +++ b/documentation/jsdoc/symbols/String.html @@ -0,0 +1,562 @@ + + + + + + + JsDoc Reference - String + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Built-In Namespace String +

    + + +

    + + + + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    endsWith(suffix) +
    +
    +
    + + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + + endsWith(suffix) + +
    +
    + + +
    + Defined in: ModuleManager.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + suffix + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:20 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/_global_.html b/documentation/jsdoc/symbols/_global_.html new file mode 100644 index 00000000..148273ea --- /dev/null +++ b/documentation/jsdoc/symbols/_global_.html @@ -0,0 +1,749 @@ + + + + + + + JsDoc Reference - _global_ + + + + + + + + + + + +
    + + +
    +

    Classes

    + +
    + +
    + +
    + +

    + + Built-In Namespace _global_ +

    + + +

    + + + + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Field Summary
    Field AttributesField Name and Description
      +
    + i +
    +
    remove already loaded modules dependencies.
    +
      +
    + nmodule +
    +
    Avoid name clash: +CAAT.Foundation and CAAT.Foundation.Timer will both be valid for +CAAT.Foundation.Timer.TimerManager module.
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Method Summary
    Method AttributesMethod Name and Description
      +
    extend(subc, superc) +
    +
    +
      +
    extendWith(base, subclass, with_object) +
    +
    Sintactic sugar to add a __super attribute on every overriden method.
    +
    + + + + + + + + + + + + +
    + Field Detail +
    + + +
    + + + i + +
    +
    + remove already loaded modules dependencies. + +
    + Defined in: ModuleManager.js. + + +
    + + + + + + + + +
    + + +
    + + + nmodule + +
    +
    + Avoid name clash: +CAAT.Foundation and CAAT.Foundation.Timer will both be valid for +CAAT.Foundation.Timer.TimerManager module. +So in the end, the module name can't have '.' after chopping the class +namespace. + +
    + Defined in: ModuleManager.js. + + +
    + + + + + + + + + + + + + + +
    + Method Detail +
    + + +
    + + + extend(subc, superc) + +
    +
    + + +
    + Defined in: Class.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + subc + +
    +
    + +
    + superc + +
    +
    + +
    + + + + + + + + +
    + + +
    + + + extendWith(base, subclass, with_object) + +
    +
    + Sintactic sugar to add a __super attribute on every overriden method. +Despite comvenient, it slows things down by 5fps. + +Uncomment at your own risk. + + // tenemos en super un metodo con igual nombre. + if ( superc.prototype[method]) { + subc.prototype[method]= (function(fn, fnsuper) { + return function() { + var prevMethod= this.__super; + + this.__super= fnsuper; + + var retValue= fn.apply( + this, + Array.prototype.slice.call(arguments) ); + + this.__super= prevMethod; + + return retValue; + }; + })(subc.prototype[method], superc.prototype[method]); + } + +
    + Defined in: Class.js. + + +
    + + + + +
    +
    Parameters:
    + +
    + base + +
    +
    + +
    + subclass + +
    +
    + +
    + with_object + +
    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Jul 01 2013 04:59:15 GMT-0700 (PDT) +
    + + diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_AlphaBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_AlphaBehavior.js.html new file mode 100644 index 00000000..4dc39814 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_AlphaBehavior.js.html @@ -0,0 +1,140 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name AlphaBehavior
    +  5      * @memberOf CAAT.Behavior
    +  6      * @extends CAAT.Behavior.BaseBehavior
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines:"CAAT.Behavior.AlphaBehavior",
    + 11     aliases:["CAAT.AlphaBehavior"],
    + 12     depends:["CAAT.Behavior.BaseBehavior"],
    + 13     extendsClass:"CAAT.Behavior.BaseBehavior",
    + 14     extendsWith:function () {
    + 15         return {
    + 16 
    + 17             /**
    + 18              * @lends CAAT.Behavior.AlphaBehavior.prototype
    + 19              */
    + 20 
    + 21             /**
    + 22              * Starting alpha transparency value. Between 0 and 1.
    + 23              * @type {number}
    + 24              * @private
    + 25              */
    + 26             startAlpha:0,
    + 27 
    + 28             /**
    + 29              * Ending alpha transparency value. Between 0 and 1.
    + 30              * @type {number}
    + 31              * @private
    + 32              */
    + 33             endAlpha:0,
    + 34 
    + 35             /**
    + 36              * @inheritsDoc
    + 37              * @param obj
    + 38              */
    + 39             parse : function( obj ) {
    + 40                 CAAT.Behavior.AlphaBehavior.superclass.parse.call(this,obj);
    + 41                 this.startAlpha= obj.start || 0;
    + 42                 this.endAlpha= obj.end || 0;
    + 43             },
    + 44 
    + 45             /**
    + 46              * @inheritDoc
    + 47              */
    + 48             getPropertyName:function () {
    + 49                 return "opacity";
    + 50             },
    + 51 
    + 52             /**
    + 53              * Applies corresponding alpha transparency value for a given time.
    + 54              *
    + 55              * @param time the time to apply the scale for.
    + 56              * @param actor the target actor to set transparency for.
    + 57              * @return {number} the alpha value set. Normalized from 0 (total transparency) to 1 (total opacity)
    + 58              */
    + 59             setForTime:function (time, actor) {
    + 60 
    + 61                 CAAT.Behavior.AlphaBehavior.superclass.setForTime.call(this, time, actor);
    + 62 
    + 63                 var alpha = (this.startAlpha + time * (this.endAlpha - this.startAlpha));
    + 64                 if (this.doValueApplication) {
    + 65                     actor.setAlpha(alpha);
    + 66                 }
    + 67                 return alpha;
    + 68             },
    + 69 
    + 70             /**
    + 71              * Set alpha transparency minimum and maximum value.
    + 72              * This value can be coerced by Actor's property isGloblAlpha.
    + 73              *
    + 74              * @param start {number} a float indicating the starting alpha value.
    + 75              * @param end {number} a float indicating the ending alpha value.
    + 76              */
    + 77             setValues:function (start, end) {
    + 78                 this.startAlpha = start;
    + 79                 this.endAlpha = end;
    + 80                 return this;
    + 81             },
    + 82 
    + 83             /**
    + 84              * @inheritDoc
    + 85              */
    + 86             calculateKeyFrameData:function (time) {
    + 87                 time = this.interpolator.getPosition(time).y;
    + 88                 return  (this.startAlpha + time * (this.endAlpha - this.startAlpha));
    + 89             },
    + 90 
    + 91             /**
    + 92              * @inheritDoc
    + 93              */
    + 94             getKeyFrameDataValues : function(time) {
    + 95                 time = this.interpolator.getPosition(time).y;
    + 96                 return {
    + 97                     alpha : this.startAlpha + time * (this.endAlpha - this.startAlpha)
    + 98                 };
    + 99             },
    +100 
    +101             /**
    +102              * @inheritDoc
    +103              * @override
    +104              */
    +105             calculateKeyFramesData:function (prefix, name, keyframessize) {
    +106 
    +107                 if (typeof keyframessize === 'undefined') {
    +108                     keyframessize = 100;
    +109                 }
    +110                 keyframessize >>= 0;
    +111 
    +112                 var i;
    +113                 var kfr;
    +114                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    +115 
    +116                 for (i = 0; i <= keyframessize; i++) {
    +117                     kfr = "" +
    +118                         (i / keyframessize * 100) + "%" + // percentage
    +119                         "{" +
    +120                         "opacity: " + this.calculateKeyFrameData(i / keyframessize) +
    +121                         "}";
    +122 
    +123                     kfd += kfr;
    +124                 }
    +125 
    +126                 kfd += "}";
    +127 
    +128                 return kfd;
    +129             }
    +130         }
    +131     }
    +132 });
    +133 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_BaseBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_BaseBehavior.js.html new file mode 100644 index 00000000..e8aadd21 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_BaseBehavior.js.html @@ -0,0 +1,667 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * Behaviors are keyframing elements.
    +  5  * By using a BehaviorContainer, you can specify different actions on any animation Actor.
    +  6  * An undefined number of Behaviors can be defined for each Actor.
    +  7  *
    +  8  * There're the following Behaviors:
    +  9  *  + AlphaBehavior:   controls container/actor global alpha.
    + 10  *  + RotateBehavior:  takes control of rotation affine transform.
    + 11  *  + ScaleBehavior:   takes control of scaling on x and y axis affine transform.
    + 12  *  + Scale1Behavior:  takes control of scaling on x or y axis affine transform.
    + 13  *  + PathBehavior:    takes control of translating an Actor/ActorContainer across a path [ie. pathSegment collection].
    + 14  *  + GenericBehavior: applies a behavior to any given target object's property, or notifies a callback.
    + 15  *
    + 16  *
    + 17  **/
    + 18 
    + 19 CAAT.Module({
    + 20 
    + 21     /**
    + 22      *
    + 23      * Namespace for all behavior-based actor properties instrumenter objects.
    + 24      *
    + 25      * @name Behavior
    + 26      * @memberOf CAAT
    + 27      * @namespace
    + 28      */
    + 29 
    + 30     /**
    + 31      *
    + 32      * The BaseBehavior is the base class of all Behavior modifiers:
    + 33      *
    + 34      * <li>AlphaBehabior
    + 35      * <li>RotateBehavior
    + 36      * <li>ScaleBehavior
    + 37      * <li>Scale1Behavior
    + 38      * <li>PathBehavior
    + 39      * <li>GenericBehavior
    + 40      * <li>ContainerBehavior
    + 41      *
    + 42      * Behavior base class.
    + 43      *
    + 44      * <p>
    + 45      * A behavior is defined by a frame time (behavior duration) and a behavior application function called interpolator.
    + 46      * In its default form, a behaviour is applied linearly, that is, the same amount of behavior is applied every same
    + 47      * time interval.
    + 48      * <p>
    + 49      * A concrete Behavior, a rotateBehavior in example, will change a concrete Actor's rotationAngle during the specified
    + 50      * period.
    + 51      * <p>
    + 52      * A behavior is guaranteed to notify (if any observer is registered) on behavior expiration.
    + 53      * <p>
    + 54      * A behavior can keep an unlimited observers. Observers are objects of the form:
    + 55      * <p>
    + 56      * <code>
    + 57      * {
    + 58      *      behaviorExpired : function( behavior, time, actor);
    + 59      *      behaviorApplied : function( behavior, time, normalizedTime, actor, value);
    + 60      * }
    + 61      * </code>
    + 62      * <p>
    + 63      * <strong>behaviorExpired</strong>: function( behavior, time, actor). This method will be called for any registered observer when
    + 64      * the scene time is greater than behavior's startTime+duration. This method will be called regardless of the time
    + 65      * granurality.
    + 66      * <p>
    + 67      * <strong>behaviorApplied</strong> : function( behavior, time, normalizedTime, actor, value). This method will be called once per
    + 68      * frame while the behavior is not expired and is in frame time (behavior startTime>=scene time). This method can be
    + 69      * called multiple times.
    + 70      * <p>
    + 71      * Every behavior is applied to a concrete Actor.
    + 72      * Every actor must at least define an start and end value. The behavior will set start-value at behaviorStartTime and
    + 73      * is guaranteed to apply end-value when scene time= behaviorStartTime+behaviorDuration.
    + 74      * <p>
    + 75      * You can set behaviors to apply forever that is cyclically. When a behavior is cycle=true, won't notify
    + 76      * behaviorExpired to its registered observers.
    + 77      * <p>
    + 78      * Other Behaviors simply must supply with the method <code>setForTime(time, actor)</code> overriden.
    + 79      *
    + 80      * @name BaseBehavior
    + 81      * @memberOf CAAT.Behavior
    + 82      * @constructor
    + 83      *
    + 84      */
    + 85 
    + 86     /**
    + 87      *
    + 88      * Internal behavior status values. Do not assign directly.
    + 89      *
    + 90      * @name Status
    + 91      * @memberOf CAAT.Behavior.BaseBehavior
    + 92      * @namespace
    + 93      * @enum {number}
    + 94      */
    + 95 
    + 96 
    + 97     defines:        "CAAT.Behavior.BaseBehavior",
    + 98     constants:      {
    + 99 
    +100         Status: {
    +101             /**
    +102              * @lends CAAT.Behavior.BaseBehavior.Status
    +103              */
    +104 
    +105             /** @const @type {number}*/ NOT_STARTED: 0,
    +106             /** @const @type {number} */ STARTED:    1,
    +107             /** @const  @type {number}*/ EXPIRED:    2
    +108         },
    +109 
    +110         /**
    +111          * @lends CAAT.Behavior.BaseBehavior
    +112          * @function
    +113          * @param obj a JSON object with a behavior definition.
    +114          */
    +115         parse : function( obj ) {
    +116 
    +117             function findClass( qualifiedClassName ) {
    +118                 var ns= qualifiedClassName.split(".");
    +119                 var _global= window;
    +120                 for( var i=0; i<ns.length; i++ ) {
    +121                     if ( !_global[ns[i]] ) {
    +122                         return null;
    +123                     }
    +124 
    +125                     _global= _global[ns[i]];
    +126                 }
    +127 
    +128                 return _global;
    +129             }
    +130 
    +131             try {
    +132 
    +133                 var type= obj.type.toLowerCase();
    +134                 type= "CAAT.Behavior."+type.substr(0,1).toUpperCase() + type.substr(1) + "Behavior";
    +135                 var cl= new findClass(type);
    +136 
    +137                 var behavior= new cl();
    +138                 behavior.parse(obj);
    +139                 return behavior;
    +140 
    +141             } catch(e) {
    +142                 console.log("Error parsing behavior: "+e);
    +143             }
    +144 
    +145             return null;
    +146         }
    +147     },
    +148     depends:        ["CAAT.Behavior.Interpolator"],
    +149     extendsWith:   function() {
    +150 
    +151         var DefaultInterpolator=    new CAAT.Behavior.Interpolator().createLinearInterpolator(false);
    +152         var DefaultInterpolatorPP=  new CAAT.Behavior.Interpolator().createLinearInterpolator(true);
    +153 
    +154         /** @lends CAAT.Behavior.BaseBehavior.prototype */
    +155         return {
    +156 
    +157             /**
    +158              * @lends CAAT.Behavior.BaseBehavior.prototype
    +159              */
    +160 
    +161             /**
    +162              * Constructor delegate function.
    +163              * @return {this}
    +164              * @private
    +165              */
    +166             __init:function () {
    +167                 this.lifecycleListenerList = [];
    +168                 this.setDefaultInterpolator();
    +169                 return this;
    +170             },
    +171 
    +172             /**
    +173              * Behavior lifecycle observer list.
    +174              * @private
    +175              */
    +176             lifecycleListenerList:null,
    +177 
    +178             /**
    +179              * Behavior application start time related to scene time.
    +180              * @private
    +181              */
    +182             behaviorStartTime:-1,
    +183 
    +184             /**
    +185              * Behavior application duration time related to scene time.
    +186              * @private
    +187              */
    +188             behaviorDuration:-1,
    +189 
    +190             /**
    +191              * Will this behavior apply for ever in a loop ?
    +192              * @private
    +193              */
    +194             cycleBehavior:false,
    +195 
    +196             /**
    +197              * behavior status.
    +198              * @private
    +199              */
    +200             status: CAAT.Behavior.BaseBehavior.Status.NOT_STARTED, // Status.NOT_STARTED
    +201 
    +202             /**
    +203              * An interpolator object to apply behaviors using easing functions, etc.
    +204              * Unless otherwise specified, it will be linearly applied.
    +205              * @type {CAAT.Behavior.Interpolator}
    +206              * @private
    +207              */
    +208             interpolator:null,
    +209 
    +210             /**
    +211              * The actor this behavior will be applied to.
    +212              * @type {CAAT.Foundation.Actor}
    +213              * @private
    +214              */
    +215             actor:null, // actor the Behavior acts on.
    +216 
    +217             /**
    +218              * An id to identify this behavior.
    +219              */
    +220             id:0, // an integer id suitable to identify this behavior by number.
    +221 
    +222             /**
    +223              * Initial offset to apply this behavior the first time.
    +224              * @type {number}
    +225              * @private
    +226              */
    +227             timeOffset:0,
    +228 
    +229             /**
    +230              * Apply the behavior, or just calculate the values ?
    +231              * @type {boolean}
    +232              */
    +233             doValueApplication:true,
    +234 
    +235             /**
    +236              * Is this behavior solved ? When called setDelayTime, this flag identifies whether the behavior
    +237              * is in time relative to the scene.
    +238              * @type {boolean}
    +239              * @private
    +240              */
    +241             solved:true,
    +242 
    +243             /**
    +244              * if true, this behavior will be removed from the this.actor instance when it expires.
    +245              * @type {boolean}
    +246              * @private
    +247              */
    +248             discardable:false,
    +249 
    +250             /**
    +251              * does this behavior apply relative values ??
    +252              */
    +253             isRelative : false,
    +254 
    +255             /**
    +256              * Set this behavior as relative value application to some other measures.
    +257              * Each Behavior will define its own.
    +258              * @param bool
    +259              * @returns {*}
    +260              */
    +261             setRelative : function( bool ) {
    +262                 this.isRelative= bool;
    +263                 return this;
    +264             },
    +265 
    +266             setRelativeValues : function() {
    +267                 this.isRelative= true;
    +268                 return this;
    +269             },
    +270 
    +271             /**
    +272              * Parse a behavior of this type.
    +273              * @param obj {object} an object with a behavior definition.
    +274              */
    +275             parse : function( obj ) {
    +276                 if ( obj.pingpong ) {
    +277                     this.setPingPong();
    +278                 }
    +279                 if ( obj.cycle ) {
    +280                     this.setCycle(true);
    +281                 }
    +282                 var delay= obj.delay || 0;
    +283                 var duration= obj.duration || 1000;
    +284 
    +285                 this.setDelayTime( delay, duration );
    +286 
    +287                 if ( obj.interpolator ) {
    +288                     this.setInterpolator( CAAT.Behavior.Interpolator.parse(obj.interpolator) );
    +289                 }
    +290             },
    +291 
    +292             /**
    +293              * Set whether this behavior will apply behavior values to a reference Actor instance.
    +294              * @param apply {boolean}
    +295              * @return {*}
    +296              */
    +297             setValueApplication:function (apply) {
    +298                 this.doValueApplication = apply;
    +299                 return this;
    +300             },
    +301 
    +302             /**
    +303              * Set this behavior offset time.
    +304              * This method is intended to make a behavior start applying (the first) time from a different
    +305              * start time.
    +306              * @param offset {number} between 0 and 1
    +307              * @return {*}
    +308              */
    +309             setTimeOffset:function (offset) {
    +310                 this.timeOffset = offset;
    +311                 return this;
    +312             },
    +313 
    +314             /**
    +315              * Set this behavior status
    +316              * @param st {CAAT.Behavior.BaseBehavior.Status}
    +317              * @return {*}
    +318              * @private
    +319              */
    +320             setStatus : function(st) {
    +321                 this.status= st;
    +322                 return this;
    +323             },
    +324 
    +325             /**
    +326              * Sets this behavior id.
    +327              * @param id {object}
    +328              *
    +329              */
    +330             setId:function (id) {
    +331                 this.id = id;
    +332                 return this;
    +333             },
    +334 
    +335             /**
    +336              * Sets the default interpolator to a linear ramp, that is, behavior will be applied linearly.
    +337              * @return this
    +338              */
    +339             setDefaultInterpolator:function () {
    +340                 this.interpolator = DefaultInterpolator;
    +341                 return this;
    +342             },
    +343 
    +344             /**
    +345              * Sets default interpolator to be linear from 0..1 and from 1..0.
    +346              * @return this
    +347              */
    +348             setPingPong:function () {
    +349                 this.interpolator = DefaultInterpolatorPP;
    +350                 return this;
    +351             },
    +352 
    +353             /**
    +354              * Sets behavior start time and duration. Start time is set absolutely relative to scene time.
    +355              * @param startTime {number} an integer indicating behavior start time in scene time in ms..
    +356              * @param duration {number} an integer indicating behavior duration in ms.
    +357              */
    +358             setFrameTime:function (startTime, duration) {
    +359                 this.behaviorStartTime = startTime;
    +360                 this.behaviorDuration = duration;
    +361                 this.status =CAAT.Behavior.BaseBehavior.Status.NOT_STARTED;
    +362 
    +363                 return this;
    +364             },
    +365 
    +366             /**
    +367              * Sets behavior start time and duration. Start time is relative to scene time.
    +368              *
    +369              * a call to
    +370              *   setFrameTime( scene.time, duration ) is equivalent to
    +371              *   setDelayTime( 0, duration )
    +372              * @param delay {number}
    +373              * @param duration {number}
    +374              */
    +375             setDelayTime:function (delay, duration) {
    +376                 this.behaviorStartTime = delay;
    +377                 this.behaviorDuration = duration;
    +378                 this.status =CAAT.Behavior.BaseBehavior.Status.NOT_STARTED;
    +379                 this.solved = false;
    +380                 this.expired = false;
    +381 
    +382                 return this;
    +383 
    +384             },
    +385 
    +386             /**
    +387              * Make this behavior not applicable.
    +388              * @return {*}
    +389              */
    +390             setOutOfFrameTime:function () {
    +391                 this.status =CAAT.Behavior.BaseBehavior.Status.EXPIRED;
    +392                 this.behaviorStartTime = Number.MAX_VALUE;
    +393                 this.behaviorDuration = 0;
    +394                 return this;
    +395             },
    +396 
    +397             /**
    +398              * Changes behavior default interpolator to another instance of CAAT.Interpolator.
    +399              * If the behavior is not defined by CAAT.Interpolator factory methods, the interpolation function must return
    +400              * its values in the range 0..1. The behavior will only apply for such value range.
    +401              * @param interpolator a CAAT.Interpolator instance.
    +402              */
    +403             setInterpolator:function (interpolator) {
    +404                 this.interpolator = interpolator;
    +405                 return this;
    +406             },
    +407 
    +408             /**
    +409              * This method must no be called directly.
    +410              * The director loop will call this method in orther to apply actor behaviors.
    +411              * @param time the scene time the behaviro is being applied at.
    +412              * @param actor a CAAT.Actor instance the behavior is being applied to.
    +413              */
    +414             apply:function (time, actor) {
    +415 
    +416                 if (!this.solved) {
    +417                     this.behaviorStartTime += time;
    +418                     this.solved = true;
    +419                 }
    +420 
    +421                 time += this.timeOffset * this.behaviorDuration;
    +422 
    +423                 var orgTime = time;
    +424                 if (this.isBehaviorInTime(time, actor)) {
    +425                     time = this.normalizeTime(time);
    +426                     this.fireBehaviorAppliedEvent(
    +427                         actor,
    +428                         orgTime,
    +429                         time,
    +430                         this.setForTime(time, actor));
    +431                 }
    +432             },
    +433 
    +434             /**
    +435              * Sets the behavior to cycle, ie apply forever.
    +436              * @param bool a boolean indicating whether the behavior is cycle.
    +437              */
    +438             setCycle:function (bool) {
    +439                 this.cycleBehavior = bool;
    +440                 return this;
    +441             },
    +442 
    +443             isCycle : function() {
    +444                 return this.cycleBehavior;
    +445             },
    +446 
    +447             /**
    +448              * Adds an observer to this behavior.
    +449              * @param behaviorListener an observer instance.
    +450              */
    +451             addListener:function (behaviorListener) {
    +452                 this.lifecycleListenerList.push(behaviorListener);
    +453                 return this;
    +454             },
    +455 
    +456             /**
    +457              * Remove all registered listeners to the behavior.
    +458              */
    +459             emptyListenerList:function () {
    +460                 this.lifecycleListenerList = [];
    +461                 return this;
    +462             },
    +463 
    +464             /**
    +465              * @return an integer indicating the behavior start time in ms..
    +466              */
    +467             getStartTime:function () {
    +468                 return this.behaviorStartTime;
    +469             },
    +470 
    +471             /**
    +472              * @return an integer indicating the behavior duration time in ms.
    +473              */
    +474             getDuration:function () {
    +475                 return this.behaviorDuration;
    +476 
    +477             },
    +478 
    +479             /**
    +480              * Chekcs whether the behaviour is in scene time.
    +481              * In case it gets out of scene time, and has not been tagged as expired, the behavior is expired and observers
    +482              * are notified about that fact.
    +483              * @param time the scene time to check the behavior against.
    +484              * @param actor the actor the behavior is being applied to.
    +485              * @return a boolean indicating whether the behavior is in scene time.
    +486              */
    +487             isBehaviorInTime:function (time, actor) {
    +488 
    +489                 var st= CAAT.Behavior.BaseBehavior.Status;
    +490 
    +491                 if (this.status === st.EXPIRED || this.behaviorStartTime < 0) {
    +492                     return false;
    +493                 }
    +494 
    +495                 if (this.cycleBehavior) {
    +496                     if (time >= this.behaviorStartTime) {
    +497                         time = (time - this.behaviorStartTime) % this.behaviorDuration + this.behaviorStartTime;
    +498                     }
    +499                 }
    +500 
    +501                 if (time > this.behaviorStartTime + this.behaviorDuration) {
    +502                     if (this.status !== st.EXPIRED) {
    +503                         this.setExpired(actor, time);
    +504                     }
    +505 
    +506                     return false;
    +507                 }
    +508 
    +509                 if (this.status === st.NOT_STARTED) {
    +510                     this.status = st.STARTED;
    +511                     this.fireBehaviorStartedEvent(actor, time);
    +512                 }
    +513 
    +514                 return this.behaviorStartTime <= time; // && time<this.behaviorStartTime+this.behaviorDuration;
    +515             },
    +516 
    +517             /**
    +518              * Notify observers the first time the behavior is applied.
    +519              * @param actor
    +520              * @param time
    +521              * @private
    +522              */
    +523             fireBehaviorStartedEvent:function (actor, time) {
    +524                 for (var i = 0, l = this.lifecycleListenerList.length; i < l; i++) {
    +525                     var b = this.lifecycleListenerList[i];
    +526                     if (b.behaviorStarted) {
    +527                         b.behaviorStarted(this, time, actor);
    +528                     }
    +529                 }
    +530             },
    +531 
    +532             /**
    +533              * Notify observers about expiration event.
    +534              * @param actor a CAAT.Actor instance
    +535              * @param time an integer with the scene time the behavior was expired at.
    +536              * @private
    +537              */
    +538             fireBehaviorExpiredEvent:function (actor, time) {
    +539                 for (var i = 0, l = this.lifecycleListenerList.length; i < l; i++) {
    +540                     var b = this.lifecycleListenerList[i];
    +541                     if (b.behaviorExpired) {
    +542                         b.behaviorExpired(this, time, actor);
    +543                     }
    +544                 }
    +545             },
    +546 
    +547             /**
    +548              * Notify observers about behavior being applied.
    +549              * @param actor a CAAT.Actor instance the behavior is being applied to.
    +550              * @param time the scene time of behavior application.
    +551              * @param normalizedTime the normalized time (0..1) considering 0 behavior start time and 1
    +552              * behaviorStartTime+behaviorDuration.
    +553              * @param value the value being set for actor properties. each behavior will supply with its own value version.
    +554              * @private
    +555              */
    +556             fireBehaviorAppliedEvent:function (actor, time, normalizedTime, value) {
    +557                 for (var i = 0, l = this.lifecycleListenerList.length; i < l; i++) {
    +558                     var b = this.lifecycleListenerList[i];
    +559                     if (b.behaviorApplied) {
    +560                         b.behaviorApplied(this, time, normalizedTime, actor, value);
    +561                     }
    +562                 }
    +563             },
    +564 
    +565             /**
    +566              * Convert scene time into something more manageable for the behavior.
    +567              * behaviorStartTime will be 0 and behaviorStartTime+behaviorDuration will be 1.
    +568              * the time parameter will be proportional to those values.
    +569              * @param time the scene time to be normalized. an integer.
    +570              * @private
    +571              */
    +572             normalizeTime:function (time) {
    +573                 time = time - this.behaviorStartTime;
    +574                 if (this.cycleBehavior) {
    +575                     time %= this.behaviorDuration;
    +576                 }
    +577 
    +578                 return this.interpolator.getPosition(time / this.behaviorDuration).y;
    +579             },
    +580 
    +581             /**
    +582              * Sets the behavior as expired.
    +583              * This method must not be called directly. It is an auxiliary method to isBehaviorInTime method.
    +584              * @param actor {CAAT.Actor}
    +585              * @param time {integer} the scene time.
    +586              * @private
    +587              */
    +588             setExpired:function (actor, time) {
    +589                 // set for final interpolator value.
    +590                 this.status = CAAT.Behavior.BaseBehavior.Status.EXPIRED;
    +591                 this.setForTime(this.interpolator.getPosition(1).y, actor);
    +592                 this.fireBehaviorExpiredEvent(actor, time);
    +593 
    +594                 if (this.discardable) {
    +595                     this.actor.removeBehavior(this);
    +596                 }
    +597             },
    +598 
    +599             /**
    +600              * This method must be overriden for every Behavior breed.
    +601              * Must not be called directly.
    +602              * @param actor {CAAT.Actor} a CAAT.Actor instance.
    +603              * @param time {number} an integer with the scene time.
    +604              * @private
    +605              */
    +606             setForTime:function (time, actor) {
    +607 
    +608             },
    +609 
    +610             /**
    +611              * @param overrides
    +612              */
    +613             initialize:function (overrides) {
    +614                 if (overrides) {
    +615                     for (var i in overrides) {
    +616                         this[i] = overrides[i];
    +617                     }
    +618                 }
    +619 
    +620                 return this;
    +621             },
    +622 
    +623             /**
    +624              * Get this behaviors CSS property name application.
    +625              * @return {String}
    +626              */
    +627             getPropertyName:function () {
    +628                 return "";
    +629             },
    +630 
    +631             /**
    +632              * Calculate a CSS3 @key-frame for this behavior at the given time.
    +633              * @param time {number}
    +634              */
    +635             calculateKeyFrameData:function (time) {
    +636             },
    +637 
    +638             /**
    +639              * Calculate a CSS3 @key-frame data values instead of building a CSS3 @key-frame value.
    +640              * @param time {number}
    +641              */
    +642             getKeyFrameDataValues : function(time) {
    +643             },
    +644 
    +645             /**
    +646              * Calculate a complete CSS3 @key-frame set for this behavior.
    +647              * @param prefix {string} browser vendor prefix
    +648              * @param name {string} keyframes animation name
    +649              * @param keyframessize {number} number of keyframes to generate
    +650              */
    +651             calculateKeyFramesData:function (prefix, name, keyframessize) {
    +652             }
    +653 
    +654         }
    +655     }
    +656 });
    +657 
    +658 
    +659 
    +660 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ContainerBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ContainerBehavior.js.html new file mode 100644 index 00000000..c04f6a46 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ContainerBehavior.js.html @@ -0,0 +1,456 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name ContainerBehavior
    +  5      * @memberOf CAAT.Behavior
    +  6      * @extends CAAT.Behavior.BaseBehavior
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines:"CAAT.Behavior.ContainerBehavior",
    + 11     depends:["CAAT.Behavior.BaseBehavior", "CAAT.Behavior.GenericBehavior"],
    + 12     aliases: ["CAAT.ContainerBehavior"],
    + 13     extendsClass : "CAAT.Behavior.BaseBehavior",
    + 14     extendsWith:function () {
    + 15 
    + 16         return {
    + 17 
    + 18             /**
    + 19              * @lends CAAT.Behavior.ContainerBehavior.prototype
    + 20              */
    + 21 
    + 22             /**
    + 23              * @inheritDoc
    + 24              */
    + 25             parse : function( obj ) {
    + 26                 if ( obj.behaviors && obj.behaviors.length ) {
    + 27                     for( var i=0; i<obj.behaviors.length; i+=1 ) {
    + 28                         this.addBehavior( CAAT.Behavior.BaseBehavior.parse( obj.behaviors[i] ) );
    + 29                     }
    + 30                 }
    + 31                 CAAT.Behavior.ContainerBehavior.superclass.parse.call(this,obj);
    + 32             },
    + 33 
    + 34             /**
    + 35              * A collection of behaviors.
    + 36              * @type {Array.<CAAT.Behavior.BaseBehavior>}
    + 37              */
    + 38             behaviors:null, // contained behaviors array
    + 39             recursiveCycleBehavior : false,
    + 40             conforming : false,
    + 41 
    + 42             /**
    + 43              * @param conforming {bool=} conform this behavior duration to that of its children.
    + 44              * @inheritDoc
    + 45              * @private
    + 46              */
    + 47             __init:function ( conforming ) {
    + 48                 this.__super();
    + 49                 this.behaviors = [];
    + 50                 if ( conforming ) {
    + 51                     this.conforming= true;
    + 52                 }
    + 53                 return this;
    + 54             },
    + 55 
    + 56             /**
    + 57              * Proportionally change this container duration to its children.
    + 58              * @param duration {number} new duration in ms.
    + 59              * @return this;
    + 60              */
    + 61             conformToDuration:function (duration) {
    + 62                 this.duration = duration;
    + 63 
    + 64                 var f = duration / this.duration;
    + 65                 var bh;
    + 66                 for (var i = 0; i < this.behaviors.length; i++) {
    + 67                     bh = this.behaviors[i];
    + 68                     bh.setFrameTime(bh.getStartTime() * f, bh.getDuration() * f);
    + 69                 }
    + 70 
    + 71                 return this;
    + 72             },
    + 73 
    + 74             /**
    + 75              * Get a behavior by mathing its id.
    + 76              * @param id {object}
    + 77              */
    + 78             getBehaviorById : function(id) {
    + 79                 for( var i=0; i<this.behaviors.length; i++ ) {
    + 80                     if ( this.behaviors[i].id===id ) {
    + 81                         return this.behaviors[i];
    + 82                     }
    + 83                 }
    + 84 
    + 85                 return null;
    + 86             },
    + 87 
    + 88             setCycle : function( cycle, recurse ) {
    + 89                 CAAT.Behavior.ContainerBehavior.superclass.setCycle.call(this,cycle);
    + 90 
    + 91                 if ( recurse ) {
    + 92                     for( var i=0; i<this.behaviors.length; i++ ) {
    + 93                         this.behaviors[i].setCycle(cycle);
    + 94                     }
    + 95                 }
    + 96 
    + 97                 this.recursiveCycleBehavior= recurse;
    + 98 
    + 99                 return this;
    +100             },
    +101 
    +102             /**
    +103              * Add a new behavior to the container.
    +104              * @param behavior {CAAT.Behavior.BaseBehavior}
    +105              */
    +106             addBehavior:function (behavior) {
    +107                 this.behaviors.push(behavior);
    +108                 behavior.addListener(this);
    +109 
    +110                 if ( this.conforming ) {
    +111                     var len= behavior.behaviorDuration + behavior.behaviorStartTime;
    +112                     if ( this.behaviorDuration < len ) {
    +113                         this.behaviorDuration= len;
    +114                         this.behaviorStartTime= 0;
    +115                     }
    +116                 }
    +117 
    +118                 if ( this.recursiveCycleBehavior ) {
    +119                     behavior.setCycle( this.isCycle() );
    +120                 }
    +121 
    +122                 return this;
    +123             },
    +124 
    +125             /**
    +126              * Applies every contained Behaviors.
    +127              * The application time the contained behaviors will receive will be ContainerBehavior related and not the
    +128              * received time.
    +129              * @param time an integer indicating the time to apply the contained behaviors at.
    +130              * @param actor a CAAT.Foundation.Actor instance indicating the actor to apply the behaviors for.
    +131              */
    +132             apply:function (time, actor) {
    +133 
    +134                 if (!this.solved) {
    +135                     this.behaviorStartTime += time;
    +136                     this.solved = true;
    +137                 }
    +138 
    +139                 time += this.timeOffset * this.behaviorDuration;
    +140 
    +141                 if (this.isBehaviorInTime(time, actor)) {
    +142                     time -= this.behaviorStartTime;
    +143                     if (this.cycleBehavior) {
    +144                         time %= this.behaviorDuration;
    +145                     }
    +146 
    +147                     var bh = this.behaviors;
    +148                     for (var i = 0; i < bh.length; i++) {
    +149                         bh[i].apply(time, actor);
    +150                     }
    +151                 }
    +152             },
    +153 
    +154             /**
    +155              * This method is the observer implementation for every contained behavior.
    +156              * If a container is Cycle=true, won't allow its contained behaviors to be expired.
    +157              * @param behavior a CAAT.Behavior.BaseBehavior instance which has been expired.
    +158              * @param time an integer indicating the time at which has become expired.
    +159              * @param actor a CAAT.Foundation.Actor the expired behavior is being applied to.
    +160              */
    +161             behaviorExpired:function (behavior, time, actor) {
    +162                 if (this.cycleBehavior) {
    +163                     behavior.setStatus(CAAT.Behavior.BaseBehavior.Status.STARTED);
    +164                 }
    +165             },
    +166 
    +167             behaviorApplied : function(behavior, scenetime, time, actor, value ) {
    +168                 this.fireBehaviorAppliedEvent(actor, scenetime, time, value);
    +169             },
    +170 
    +171             /**
    +172              * Implementation method of the behavior.
    +173              * Just call implementation method for its contained behaviors.
    +174              * @param time{number} an integer indicating the time the behavior is being applied at.
    +175              * @param actor{CAAT.Foundation.Actor} an actor the behavior is being applied to.
    +176              */
    +177             setForTime:function (time, actor) {
    +178                 var retValue= null;
    +179                 var bh = this.behaviors;
    +180                 for (var i = 0; i < bh.length; i++) {
    +181                     retValue= bh[i].setForTime(time, actor);
    +182                 }
    +183 
    +184                 return retValue;
    +185             },
    +186 
    +187             /**
    +188              * Expire this behavior and the children applied at the parameter time.
    +189              * @param actor {CAAT.Foundation.Actor}
    +190              * @param time {number}
    +191              * @return {*}
    +192              */
    +193             setExpired:function (actor, time) {
    +194 
    +195                 var bh = this.behaviors;
    +196                 // set for final interpolator value.
    +197                 for (var i = 0; i < bh.length; i++) {
    +198                     var bb = bh[i];
    +199                     if ( bb.status !== CAAT.Behavior.BaseBehavior.Status.EXPIRED) {
    +200                         bb.setExpired(actor, time - this.behaviorStartTime);
    +201                     }
    +202                 }
    +203 
    +204                 /**
    +205                  * moved here from the beggining of the method.
    +206                  * allow for expiration observers to reset container behavior and its sub-behaviors
    +207                  * to redeem.
    +208                  */
    +209                 CAAT.Behavior.ContainerBehavior.superclass.setExpired.call(this, actor, time);
    +210 
    +211                 return this;
    +212             },
    +213 
    +214             /**
    +215              * @inheritDoc
    +216              */
    +217             setFrameTime:function (start, duration) {
    +218                 CAAT.Behavior.ContainerBehavior.superclass.setFrameTime.call(this, start, duration);
    +219 
    +220                 var bh = this.behaviors;
    +221                 for (var i = 0; i < bh.length; i++) {
    +222                     bh[i].setStatus(CAAT.Behavior.BaseBehavior.Status.NOT_STARTED);
    +223                 }
    +224                 return this;
    +225             },
    +226 
    +227             /**
    +228              * @inheritDoc
    +229              */
    +230             setDelayTime:function (start, duration) {
    +231                 CAAT.Behavior.ContainerBehavior.superclass.setDelayTime.call(this, start, duration);
    +232 
    +233                 var bh = this.behaviors;
    +234                 for (var i = 0; i < bh.length; i++) {
    +235                     bh[i].setStatus(CAAT.Behavior.BaseBehavior.Status.NOT_STARTED);
    +236                 }
    +237                 return this;
    +238             },
    +239 
    +240             /**
    +241              * @inheritDoc
    +242              */
    +243             getKeyFrameDataValues : function(referenceTime) {
    +244 
    +245                 var i, bh, time;
    +246                 var keyFrameData= {
    +247                     angle : 0,
    +248                     scaleX : 1,
    +249                     scaleY : 1,
    +250                     x : 0,
    +251                     y : 0
    +252                 };
    +253 
    +254                 for (i = 0; i < this.behaviors.length; i++) {
    +255                     bh = this.behaviors[i];
    +256                     if (bh.status !== CAAT.Behavior.BaseBehavior.Status.EXPIRED && !(bh instanceof CAAT.Behavior.GenericBehavior)) {
    +257 
    +258                         // ajustar tiempos:
    +259                         //  time es tiempo normalizado a duracion de comportamiento contenedor.
    +260                         //      1.- desnormalizar
    +261                         time = referenceTime * this.behaviorDuration;
    +262 
    +263                         //      2.- calcular tiempo relativo de comportamiento respecto a contenedor
    +264                         if (bh.behaviorStartTime <= time && bh.behaviorStartTime + bh.behaviorDuration >= time) {
    +265                             //      3.- renormalizar tiempo reltivo a comportamiento.
    +266                             time = (time - bh.behaviorStartTime) / bh.behaviorDuration;
    +267 
    +268                             //      4.- obtener valor de comportamiento para tiempo normalizado relativo a contenedor
    +269                             var obj= bh.getKeyFrameDataValues(time);
    +270                             for( var pr in obj ) {
    +271                                 keyFrameData[pr]= obj[pr];
    +272                             }
    +273                         }
    +274                     }
    +275                 }
    +276 
    +277                 return keyFrameData;
    +278             },
    +279 
    +280             /**
    +281              * @inheritDoc
    +282              */
    +283             calculateKeyFrameData:function (referenceTime, prefix) {
    +284 
    +285                 var i;
    +286                 var bh;
    +287 
    +288                 var retValue = {};
    +289                 var time;
    +290                 var cssRuleValue;
    +291                 var cssProperty;
    +292                 var property;
    +293 
    +294                 for (i = 0; i < this.behaviors.length; i++) {
    +295                     bh = this.behaviors[i];
    +296                     if (bh.status !== CAAT.Behavior.BaseBehavior.Status.EXPIRED && !(bh instanceof CAAT.Behavior.GenericBehavior)) {
    +297 
    +298                         // ajustar tiempos:
    +299                         //  time es tiempo normalizado a duracion de comportamiento contenedor.
    +300                         //      1.- desnormalizar
    +301                         time = referenceTime * this.behaviorDuration;
    +302 
    +303                         //      2.- calcular tiempo relativo de comportamiento respecto a contenedor
    +304                         if (bh.behaviorStartTime <= time && bh.behaviorStartTime + bh.behaviorDuration >= time) {
    +305                             //      3.- renormalizar tiempo reltivo a comportamiento.
    +306                             time = (time - bh.behaviorStartTime) / bh.behaviorDuration;
    +307 
    +308                             //      4.- obtener valor de comportamiento para tiempo normalizado relativo a contenedor
    +309                             cssRuleValue = bh.calculateKeyFrameData(time);
    +310                             cssProperty = bh.getPropertyName(prefix);
    +311 
    +312                             if (typeof retValue[cssProperty] === 'undefined') {
    +313                                 retValue[cssProperty] = "";
    +314                             }
    +315 
    +316                             //      5.- asignar a objeto, par de propiedad/valor css
    +317                             retValue[cssProperty] += cssRuleValue + " ";
    +318                         }
    +319 
    +320                     }
    +321                 }
    +322 
    +323 
    +324                 var tr = "";
    +325                 var pv;
    +326 
    +327                 function xx(pr) {
    +328                     if (retValue[pr]) {
    +329                         tr += retValue[pr];
    +330                     } else {
    +331                         if (prevValues) {
    +332                             pv = prevValues[pr];
    +333                             if (pv) {
    +334                                 tr += pv;
    +335                                 retValue[pr] = pv;
    +336                             }
    +337                         }
    +338                     }
    +339                 }
    +340 
    +341                 xx('translate');
    +342                 xx('rotate');
    +343                 xx('scale');
    +344 
    +345                 var keyFrameRule = "";
    +346 
    +347                 if (tr) {
    +348                     keyFrameRule = '-' + prefix + '-transform: ' + tr + ';';
    +349                 }
    +350 
    +351                 tr = "";
    +352                 xx('opacity');
    +353                 if (tr) {
    +354                     keyFrameRule += ' opacity: ' + tr + ';';
    +355                 }
    +356 
    +357                 keyFrameRule+=" -webkit-transform-origin: 0% 0%";
    +358 
    +359                 return {
    +360                     rules:keyFrameRule,
    +361                     ret:retValue
    +362                 };
    +363 
    +364             },
    +365 
    +366             /**
    +367              * @inheritDoc
    +368              */
    +369             calculateKeyFramesData:function (prefix, name, keyframessize, anchorX, anchorY) {
    +370 
    +371                 function toKeyFrame(obj, prevKF) {
    +372 
    +373                     for( var i in prevKF ) {
    +374                         if ( !obj[i] ) {
    +375                             obj[i]= prevKF[i];
    +376                         }
    +377                     }
    +378 
    +379                     var ret= "-" + prefix + "-transform:";
    +380 
    +381                     if ( obj.x || obj.y ) {
    +382                         var x= obj.x || 0;
    +383                         var y= obj.y || 0;
    +384                         ret+= "translate("+x+"px,"+y+"px)";
    +385                     }
    +386 
    +387                     if ( obj.angle ) {
    +388                         ret+= " rotate("+obj.angle+"rad)";
    +389                     }
    +390 
    +391                     if ( obj.scaleX!==1 || obj.scaleY!==1 ) {
    +392                         ret+= " scale("+(obj.scaleX)+","+(obj.scaleY)+")";
    +393                     }
    +394 
    +395                     ret+=";";
    +396 
    +397                     if ( obj.alpha ) {
    +398                         ret+= " opacity: "+obj.alpha+";";
    +399                     }
    +400 
    +401                     if ( anchorX!==.5 || anchorY!==.5) {
    +402                         ret+= " -" + prefix + "-transform-origin:"+ (anchorX*100) + "% " + (anchorY*100) + "%;";
    +403                     }
    +404 
    +405                     return ret;
    +406                 }
    +407 
    +408                 if (this.duration === Number.MAX_VALUE) {
    +409                     return "";
    +410                 }
    +411 
    +412                 if (typeof anchorX==="undefined") {
    +413                     anchorX= .5;
    +414                 }
    +415 
    +416                 if (typeof anchorY==="undefined") {
    +417                     anchorY= .5;
    +418                 }
    +419 
    +420                 if (typeof keyframessize === 'undefined') {
    +421                     keyframessize = 100;
    +422                 }
    +423 
    +424                 var i;
    +425                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    +426                 var time;
    +427                 var prevKF= {};
    +428 
    +429                 for (i = 0; i <= keyframessize; i++) {
    +430                     time = this.interpolator.getPosition(i / keyframessize).y;
    +431 
    +432                     var obj = this.getKeyFrameDataValues(time);
    +433 
    +434                     kfd += "" +
    +435                         (i / keyframessize * 100) + "%" + // percentage
    +436                         "{" + toKeyFrame(obj, prevKF) + "}\n";
    +437 
    +438                     prevKF= obj;
    +439 
    +440                 }
    +441 
    +442                 kfd += "}\n";
    +443 
    +444                 return kfd;
    +445             }
    +446         }
    +447     }
    +448 });
    +449 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_GenericBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_GenericBehavior.js.html new file mode 100644 index 00000000..2b46f494 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_GenericBehavior.js.html @@ -0,0 +1,87 @@ +
      1 CAAT.Module({
    +  2     /**
    +  3      * @name GenericBehavior
    +  4      * @memberOf CAAT.Behavior
    +  5      * @extends CAAT.Behavior.BaseBehavior
    +  6      * @constructor
    +  7      */
    +  8     defines:"CAAT.Behavior.GenericBehavior",
    +  9     depends:["CAAT.Behavior.BaseBehavior"],
    + 10     aliases:["CAAT.GenericBehavior"],
    + 11     extendsClass:"CAAT.Behavior.BaseBehavior",
    + 12     extendsWith:function () {
    + 13 
    + 14         return {
    + 15 
    + 16             /**
    + 17              *  @lends CAAT.Behavior.GenericBehavior.prototype
    + 18              */
    + 19 
    + 20 
    + 21             /**
    + 22              * starting value.
    + 23              */
    + 24             start:0,
    + 25 
    + 26             /**
    + 27              * ending value.
    + 28              */
    + 29             end:0,
    + 30 
    + 31             /**
    + 32              * target to apply this generic behvior.
    + 33              */
    + 34             target:null,
    + 35 
    + 36             /**
    + 37              * property to apply values to.
    + 38              */
    + 39             property:null,
    + 40 
    + 41             /**
    + 42              * this callback will be invoked for every behavior application.
    + 43              */
    + 44             callback:null,
    + 45 
    + 46             /**
    + 47              * @inheritDoc
    + 48              */
    + 49             setForTime:function (time, actor) {
    + 50                 var value = this.start + time * (this.end - this.start);
    + 51                 if (this.callback) {
    + 52                     this.callback(value, this.target, actor);
    + 53                 }
    + 54 
    + 55                 if (this.property) {
    + 56                     this.target[this.property] = value;
    + 57                 }
    + 58             },
    + 59 
    + 60             /**
    + 61              * Defines the values to apply this behavior.
    + 62              *
    + 63              * @param start {number} initial behavior value.
    + 64              * @param end {number} final behavior value.
    + 65              * @param target {object} an object. Usually a CAAT.Actor.
    + 66              * @param property {string} target object's property to set value to.
    + 67              * @param callback {function} a function of the form <code>function( target, value )</code>.
    + 68              */
    + 69             setValues:function (start, end, target, property, callback) {
    + 70                 this.start = start;
    + 71                 this.end = end;
    + 72                 this.target = target;
    + 73                 this.property = property;
    + 74                 this.callback = callback;
    + 75                 return this;
    + 76             }
    + 77         };
    + 78     }
    + 79 });
    + 80 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Interpolator.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Interpolator.js.html new file mode 100644 index 00000000..f39c05c2 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Interpolator.js.html @@ -0,0 +1,493 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * Partially based on Robert Penner easing equations.
    +  5  * http://www.robertpenner.com/easing/
    +  6  *
    +  7  *
    +  8  **/
    +  9 
    + 10 CAAT.Module({
    + 11 
    + 12     /**
    + 13      * @name Interpolator
    + 14      * @memberOf CAAT.Behavior
    + 15      * @constructor
    + 16      */
    + 17 
    + 18     defines:"CAAT.Behavior.Interpolator",
    + 19     depends:["CAAT.Math.Point"],
    + 20     aliases:["CAAT.Interpolator"],
    + 21     constants : {
    + 22         /**
    + 23          * @lends CAAT.Behavior.Interpolator
    + 24          */
    + 25 
    + 26         enumerateInterpolators: function () {
    + 27             return [
    + 28                 new CAAT.Behavior.Interpolator().createLinearInterpolator(false, false), 'Linear pingpong=false, inverse=false',
    + 29                 new CAAT.Behavior.Interpolator().createLinearInterpolator(true, false), 'Linear pingpong=true, inverse=false',
    + 30 
    + 31                 new CAAT.Behavior.Interpolator().createBackOutInterpolator(false), 'BackOut pingpong=true, inverse=false',
    + 32                 new CAAT.Behavior.Interpolator().createBackOutInterpolator(true), 'BackOut pingpong=true, inverse=true',
    + 33 
    + 34                 new CAAT.Behavior.Interpolator().createLinearInterpolator(false, true), 'Linear pingpong=false, inverse=true',
    + 35                 new CAAT.Behavior.Interpolator().createLinearInterpolator(true, true), 'Linear pingpong=true, inverse=true',
    + 36 
    + 37                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(2, false), 'ExponentialIn pingpong=false, exponent=2',
    + 38                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(2, false), 'ExponentialOut pingpong=false, exponent=2',
    + 39                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(2, false), 'ExponentialInOut pingpong=false, exponent=2',
    + 40                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(2, true), 'ExponentialIn pingpong=true, exponent=2',
    + 41                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(2, true), 'ExponentialOut pingpong=true, exponent=2',
    + 42                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(2, true), 'ExponentialInOut pingpong=true, exponent=2',
    + 43 
    + 44                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(4, false), 'ExponentialIn pingpong=false, exponent=4',
    + 45                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(4, false), 'ExponentialOut pingpong=false, exponent=4',
    + 46                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(4, false), 'ExponentialInOut pingpong=false, exponent=4',
    + 47                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(4, true), 'ExponentialIn pingpong=true, exponent=4',
    + 48                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(4, true), 'ExponentialOut pingpong=true, exponent=4',
    + 49                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(4, true), 'ExponentialInOut pingpong=true, exponent=4',
    + 50 
    + 51                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(6, false), 'ExponentialIn pingpong=false, exponent=6',
    + 52                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(6, false), 'ExponentialOut pingpong=false, exponent=6',
    + 53                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(6, false), 'ExponentialInOut pingpong=false, exponent=6',
    + 54                 new CAAT.Behavior.Interpolator().createExponentialInInterpolator(6, true), 'ExponentialIn pingpong=true, exponent=6',
    + 55                 new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(6, true), 'ExponentialOut pingpong=true, exponent=6',
    + 56                 new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(6, true), 'ExponentialInOut pingpong=true, exponent=6',
    + 57 
    + 58                 new CAAT.Behavior.Interpolator().createBounceInInterpolator(false), 'BounceIn pingpong=false',
    + 59                 new CAAT.Behavior.Interpolator().createBounceOutInterpolator(false), 'BounceOut pingpong=false',
    + 60                 new CAAT.Behavior.Interpolator().createBounceInOutInterpolator(false), 'BounceInOut pingpong=false',
    + 61                 new CAAT.Behavior.Interpolator().createBounceInInterpolator(true), 'BounceIn pingpong=true',
    + 62                 new CAAT.Behavior.Interpolator().createBounceOutInterpolator(true), 'BounceOut pingpong=true',
    + 63                 new CAAT.Behavior.Interpolator().createBounceInOutInterpolator(true), 'BounceInOut pingpong=true',
    + 64 
    + 65                 new CAAT.Behavior.Interpolator().createElasticInInterpolator(1.1, 0.4, false), 'ElasticIn pingpong=false, amp=1.1, d=.4',
    + 66                 new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.1, 0.4, false), 'ElasticOut pingpong=false, amp=1.1, d=.4',
    + 67                 new CAAT.Behavior.Interpolator().createElasticInOutInterpolator(1.1, 0.4, false), 'ElasticInOut pingpong=false, amp=1.1, d=.4',
    + 68                 new CAAT.Behavior.Interpolator().createElasticInInterpolator(1.1, 0.4, true), 'ElasticIn pingpong=true, amp=1.1, d=.4',
    + 69                 new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.1, 0.4, true), 'ElasticOut pingpong=true, amp=1.1, d=.4',
    + 70                 new CAAT.Behavior.Interpolator().createElasticInOutInterpolator(1.1, 0.4, true), 'ElasticInOut pingpong=true, amp=1.1, d=.4',
    + 71 
    + 72                 new CAAT.Behavior.Interpolator().createElasticInInterpolator(1.0, 0.2, false), 'ElasticIn pingpong=false, amp=1.0, d=.2',
    + 73                 new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.0, 0.2, false), 'ElasticOut pingpong=false, amp=1.0, d=.2',
    + 74                 new CAAT.Behavior.Interpolator().createElasticInOutInterpolator(1.0, 0.2, false), 'ElasticInOut pingpong=false, amp=1.0, d=.2',
    + 75                 new CAAT.Behavior.Interpolator().createElasticInInterpolator(1.0, 0.2, true), 'ElasticIn pingpong=true, amp=1.0, d=.2',
    + 76                 new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.0, 0.2, true), 'ElasticOut pingpong=true, amp=1.0, d=.2',
    + 77                 new CAAT.Behavior.Interpolator().createElasticInOutInterpolator(1.0, 0.2, true), 'ElasticInOut pingpong=true, amp=1.0, d=.2'
    + 78             ];
    + 79         },
    + 80 
    + 81         parse : function( obj ) {
    + 82             var name= "create"+obj.type+"Interpolator";
    + 83             var interpolator= new CAAT.Behavior.Interpolator();
    + 84             try {
    + 85                 interpolator[name].apply( interpolator, obj.params||[] );
    + 86             } catch(e) {
    + 87                 interpolator.createLinearInterpolator(false, false);
    + 88             }
    + 89 
    + 90             return interpolator;
    + 91         }
    + 92 
    + 93     },
    + 94     extendsWith:function () {
    + 95 
    + 96         return {
    + 97 
    + 98             /**
    + 99              * @lends CAAT.Behavior.Interpolator.prototype
    +100              */
    +101 
    +102             interpolated:null, // a coordinate holder for not building a new CAAT.Point for each interpolation call.
    +103             paintScale:90, // the size of the interpolation draw on screen in pixels.
    +104 
    +105             __init:function () {
    +106                 this.interpolated = new CAAT.Math.Point(0, 0, 0);
    +107                 return this;
    +108             },
    +109 
    +110             /**
    +111              * Set a linear interpolation function.
    +112              *
    +113              * @param bPingPong {boolean}
    +114              * @param bInverse {boolean} will values will be from 1 to 0 instead of 0 to 1 ?.
    +115              */
    +116             createLinearInterpolator:function (bPingPong, bInverse) {
    +117                 /**
    +118                  * Linear and inverse linear interpolation function.
    +119                  * @param time {number}
    +120                  */
    +121                 this.getPosition = function getPosition(time) {
    +122 
    +123                     var orgTime = time;
    +124 
    +125                     if (bPingPong) {
    +126                         if (time < 0.5) {
    +127                             time *= 2;
    +128                         } else {
    +129                             time = 1 - (time - 0.5) * 2;
    +130                         }
    +131                     }
    +132 
    +133                     if (bInverse !== null && bInverse) {
    +134                         time = 1 - time;
    +135                     }
    +136 
    +137                     return this.interpolated.set(orgTime, time);
    +138                 };
    +139 
    +140                 return this;
    +141             },
    +142 
    +143             createBackOutInterpolator:function (bPingPong) {
    +144                 this.getPosition = function getPosition(time) {
    +145                     var orgTime = time;
    +146 
    +147                     if (bPingPong) {
    +148                         if (time < 0.5) {
    +149                             time *= 2;
    +150                         } else {
    +151                             time = 1 - (time - 0.5) * 2;
    +152                         }
    +153                     }
    +154 
    +155                     time = time - 1;
    +156                     var overshoot = 1.70158;
    +157 
    +158                     return this.interpolated.set(
    +159                         orgTime,
    +160                         time * time * ((overshoot + 1) * time + overshoot) + 1);
    +161                 };
    +162 
    +163                 return this;
    +164             },
    +165             /**
    +166              * Set an exponential interpolator function. The function to apply will be Math.pow(time,exponent).
    +167              * This function starts with 0 and ends in values of 1.
    +168              *
    +169              * @param exponent {number} exponent of the function.
    +170              * @param bPingPong {boolean}
    +171              */
    +172             createExponentialInInterpolator:function (exponent, bPingPong) {
    +173                 this.getPosition = function getPosition(time) {
    +174                     var orgTime = time;
    +175 
    +176                     if (bPingPong) {
    +177                         if (time < 0.5) {
    +178                             time *= 2;
    +179                         } else {
    +180                             time = 1 - (time - 0.5) * 2;
    +181                         }
    +182                     }
    +183                     return this.interpolated.set(orgTime, Math.pow(time, exponent));
    +184                 };
    +185 
    +186                 return this;
    +187             },
    +188             /**
    +189              * Set an exponential interpolator function. The function to apply will be 1-Math.pow(time,exponent).
    +190              * This function starts with 1 and ends in values of 0.
    +191              *
    +192              * @param exponent {number} exponent of the function.
    +193              * @param bPingPong {boolean}
    +194              */
    +195             createExponentialOutInterpolator:function (exponent, bPingPong) {
    +196                 this.getPosition = function getPosition(time) {
    +197                     var orgTime = time;
    +198 
    +199                     if (bPingPong) {
    +200                         if (time < 0.5) {
    +201                             time *= 2;
    +202                         } else {
    +203                             time = 1 - (time - 0.5) * 2;
    +204                         }
    +205                     }
    +206                     return this.interpolated.set(orgTime, 1 - Math.pow(1 - time, exponent));
    +207                 };
    +208 
    +209                 return this;
    +210             },
    +211             /**
    +212              * Set an exponential interpolator function. Two functions will apply:
    +213              * Math.pow(time*2,exponent)/2 for the first half of the function (t<0.5) and
    +214              * 1-Math.abs(Math.pow(time*2-2,exponent))/2 for the second half (t>=.5)
    +215              * This function starts with 0 and goes to values of 1 and ends with values of 0.
    +216              *
    +217              * @param exponent {number} exponent of the function.
    +218              * @param bPingPong {boolean}
    +219              */
    +220             createExponentialInOutInterpolator:function (exponent, bPingPong) {
    +221                 this.getPosition = function getPosition(time) {
    +222                     var orgTime = time;
    +223 
    +224                     if (bPingPong) {
    +225                         if (time < 0.5) {
    +226                             time *= 2;
    +227                         } else {
    +228                             time = 1 - (time - 0.5) * 2;
    +229                         }
    +230                     }
    +231                     if (time * 2 < 1) {
    +232                         return this.interpolated.set(orgTime, Math.pow(time * 2, exponent) / 2);
    +233                     }
    +234 
    +235                     return this.interpolated.set(orgTime, 1 - Math.abs(Math.pow(time * 2 - 2, exponent)) / 2);
    +236                 };
    +237 
    +238                 return this;
    +239             },
    +240             /**
    +241              * Creates a Quadric bezier curbe as interpolator.
    +242              *
    +243              * @param p0 {CAAT.Math.Point}
    +244              * @param p1 {CAAT.Math.Point}
    +245              * @param p2 {CAAT.Math.Point}
    +246              * @param bPingPong {boolean} a boolean indicating if the interpolator must ping-pong.
    +247              */
    +248             createQuadricBezierInterpolator:function (p0, p1, p2, bPingPong) {
    +249                 this.getPosition = function getPosition(time) {
    +250                     var orgTime = time;
    +251 
    +252                     if (bPingPong) {
    +253                         if (time < 0.5) {
    +254                             time *= 2;
    +255                         } else {
    +256                             time = 1 - (time - 0.5) * 2;
    +257                         }
    +258                     }
    +259 
    +260                     time = (1 - time) * (1 - time) * p0.y + 2 * (1 - time) * time * p1.y + time * time * p2.y;
    +261 
    +262                     return this.interpolated.set(orgTime, time);
    +263                 };
    +264 
    +265                 return this;
    +266             },
    +267             /**
    +268              * Creates a Cubic bezier curbe as interpolator.
    +269              *
    +270              * @param p0 {CAAT.Math.Point}
    +271              * @param p1 {CAAT.Math.Point}
    +272              * @param p2 {CAAT.Math.Point}
    +273              * @param p3 {CAAT.Math.Point}
    +274              * @param bPingPong {boolean} a boolean indicating if the interpolator must ping-pong.
    +275              */
    +276             createCubicBezierInterpolator:function (p0, p1, p2, p3, bPingPong) {
    +277                 this.getPosition = function getPosition(time) {
    +278                     var orgTime = time;
    +279 
    +280                     if (bPingPong) {
    +281                         if (time < 0.5) {
    +282                             time *= 2;
    +283                         } else {
    +284                             time = 1 - (time - 0.5) * 2;
    +285                         }
    +286                     }
    +287 
    +288                     var t2 = time * time;
    +289                     var t3 = time * t2;
    +290 
    +291                     time = (p0.y + time * (-p0.y * 3 + time * (3 * p0.y -
    +292                         p0.y * time))) + time * (3 * p1.y + time * (-6 * p1.y +
    +293                         p1.y * 3 * time)) + t2 * (p2.y * 3 - p2.y * 3 * time) +
    +294                         p3.y * t3;
    +295 
    +296                     return this.interpolated.set(orgTime, time);
    +297                 };
    +298 
    +299                 return this;
    +300             },
    +301             createElasticOutInterpolator:function (amplitude, p, bPingPong) {
    +302                 this.getPosition = function getPosition(time) {
    +303 
    +304                     if (bPingPong) {
    +305                         if (time < 0.5) {
    +306                             time *= 2;
    +307                         } else {
    +308                             time = 1 - (time - 0.5) * 2;
    +309                         }
    +310                     }
    +311 
    +312                     if (time === 0) {
    +313                         return {x:0, y:0};
    +314                     }
    +315                     if (time === 1) {
    +316                         return {x:1, y:1};
    +317                     }
    +318 
    +319                     var s = p / (2 * Math.PI) * Math.asin(1 / amplitude);
    +320                     return this.interpolated.set(
    +321                         time,
    +322                         (amplitude * Math.pow(2, -10 * time) * Math.sin((time - s) * (2 * Math.PI) / p) + 1 ));
    +323                 };
    +324                 return this;
    +325             },
    +326             createElasticInInterpolator:function (amplitude, p, bPingPong) {
    +327                 this.getPosition = function getPosition(time) {
    +328 
    +329                     if (bPingPong) {
    +330                         if (time < 0.5) {
    +331                             time *= 2;
    +332                         } else {
    +333                             time = 1 - (time - 0.5) * 2;
    +334                         }
    +335                     }
    +336 
    +337                     if (time === 0) {
    +338                         return {x:0, y:0};
    +339                     }
    +340                     if (time === 1) {
    +341                         return {x:1, y:1};
    +342                     }
    +343 
    +344                     var s = p / (2 * Math.PI) * Math.asin(1 / amplitude);
    +345                     return this.interpolated.set(
    +346                         time,
    +347                         -(amplitude * Math.pow(2, 10 * (time -= 1)) * Math.sin((time - s) * (2 * Math.PI) / p) ));
    +348                 };
    +349 
    +350                 return this;
    +351             },
    +352             createElasticInOutInterpolator:function (amplitude, p, bPingPong) {
    +353                 this.getPosition = function getPosition(time) {
    +354 
    +355                     if (bPingPong) {
    +356                         if (time < 0.5) {
    +357                             time *= 2;
    +358                         } else {
    +359                             time = 1 - (time - 0.5) * 2;
    +360                         }
    +361                     }
    +362 
    +363                     var s = p / (2 * Math.PI) * Math.asin(1 / amplitude);
    +364                     time *= 2;
    +365                     if (time <= 1) {
    +366                         return this.interpolated.set(
    +367                             time,
    +368                             -0.5 * (amplitude * Math.pow(2, 10 * (time -= 1)) * Math.sin((time - s) * (2 * Math.PI) / p)));
    +369                     }
    +370 
    +371                     return this.interpolated.set(
    +372                         time,
    +373                         1 + 0.5 * (amplitude * Math.pow(2, -10 * (time -= 1)) * Math.sin((time - s) * (2 * Math.PI) / p)));
    +374                 };
    +375 
    +376                 return this;
    +377             },
    +378             /**
    +379              * @param time {number}
    +380              * @private
    +381              */
    +382             bounce:function (time) {
    +383                 if ((time /= 1) < (1 / 2.75)) {
    +384                     return {x:time, y:7.5625 * time * time};
    +385                 } else if (time < (2 / 2.75)) {
    +386                     return {x:time, y:7.5625 * (time -= (1.5 / 2.75)) * time + 0.75};
    +387                 } else if (time < (2.5 / 2.75)) {
    +388                     return {x:time, y:7.5625 * (time -= (2.25 / 2.75)) * time + 0.9375};
    +389                 } else {
    +390                     return {x:time, y:7.5625 * (time -= (2.625 / 2.75)) * time + 0.984375};
    +391                 }
    +392             },
    +393             createBounceOutInterpolator:function (bPingPong) {
    +394                 this.getPosition = function getPosition(time) {
    +395                     if (bPingPong) {
    +396                         if (time < 0.5) {
    +397                             time *= 2;
    +398                         } else {
    +399                             time = 1 - (time - 0.5) * 2;
    +400                         }
    +401                     }
    +402                     return this.bounce(time);
    +403                 };
    +404 
    +405                 return this;
    +406             },
    +407             createBounceInInterpolator:function (bPingPong) {
    +408 
    +409                 this.getPosition = function getPosition(time) {
    +410                     if (bPingPong) {
    +411                         if (time < 0.5) {
    +412                             time *= 2;
    +413                         } else {
    +414                             time = 1 - (time - 0.5) * 2;
    +415                         }
    +416                     }
    +417                     var r = this.bounce(1 - time);
    +418                     r.y = 1 - r.y;
    +419                     return r;
    +420                 };
    +421 
    +422                 return this;
    +423             },
    +424             createBounceInOutInterpolator:function (bPingPong) {
    +425 
    +426                 this.getPosition = function getPosition(time) {
    +427                     if (bPingPong) {
    +428                         if (time < 0.5) {
    +429                             time *= 2;
    +430                         } else {
    +431                             time = 1 - (time - 0.5) * 2;
    +432                         }
    +433                     }
    +434 
    +435                     var r;
    +436                     if (time < 0.5) {
    +437                         r = this.bounce(1 - time * 2);
    +438                         r.y = (1 - r.y) * 0.5;
    +439                         return r;
    +440                     }
    +441                     r = this.bounce(time * 2 - 1, bPingPong);
    +442                     r.y = r.y * 0.5 + 0.5;
    +443                     return r;
    +444                 };
    +445 
    +446                 return this;
    +447             },
    +448 
    +449             /**
    +450              * Paints an interpolator on screen.
    +451              * @param ctx {CanvasRenderingContext}
    +452              */
    +453             paint:function (ctx) {
    +454 
    +455                 ctx.save();
    +456                 ctx.beginPath();
    +457 
    +458                 ctx.moveTo(0, this.getPosition(0).y * this.paintScale);
    +459 
    +460                 for (var i = 0; i <= this.paintScale; i++) {
    +461                     ctx.lineTo(i, this.getPosition(i / this.paintScale).y * this.paintScale);
    +462                 }
    +463 
    +464                 ctx.strokeStyle = 'black';
    +465                 ctx.stroke();
    +466                 ctx.restore();
    +467             },
    +468 
    +469             /**
    +470              * Gets an array of coordinates which define the polyline of the intepolator's curve contour.
    +471              * Values for both coordinates range from 0 to 1.
    +472              * @param iSize {number} an integer indicating the number of contour segments.
    +473              * @return Array.<CAAT.Math.Point> of object of the form {x:float, y:float}.
    +474              */
    +475             getContour:function (iSize) {
    +476                 var contour = [];
    +477                 for (var i = 0; i <= iSize; i++) {
    +478                     contour.push({x:i / iSize, y:this.getPosition(i / iSize).y});
    +479                 }
    +480 
    +481                 return contour;
    +482             }
    +483         }
    +484     }
    +485 });
    +486 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_PathBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_PathBehavior.js.html new file mode 100644 index 00000000..8439fe23 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_PathBehavior.js.html @@ -0,0 +1,352 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name PathBehavior
    +  5      * @memberOf CAAT.Behavior
    +  6      * @extends CAAT.Behavior.BaseBehavior
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     /**
    + 11      *
    + 12      * Internal PathBehavior rotation constants.
    + 13      *
    + 14      * @name AUTOROTATE
    + 15      * @memberOf CAAT.Behavior.PathBehavior
    + 16      * @namespace
    + 17      * @enum {number}
    + 18      */
    + 19 
    + 20     /**
    + 21      *
    + 22      * Internal PathBehavior rotation constants.
    + 23      *
    + 24      * @name autorotate
    + 25      * @memberOf CAAT.Behavior.PathBehavior
    + 26      * @namespace
    + 27      * @enum {number}
    + 28      * @deprecated
    + 29      */
    + 30 
    + 31     defines:"CAAT.Behavior.PathBehavior",
    + 32     aliases: ["CAAT.PathBehavior"],
    + 33     depends:[
    + 34         "CAAT.Behavior.BaseBehavior",
    + 35         "CAAT.Foundation.SpriteImage"
    + 36     ],
    + 37     constants : {
    + 38 
    + 39         AUTOROTATE : {
    + 40 
    + 41             /**
    + 42              * @lends CAAT.Behavior.PathBehavior.AUTOROTATE
    + 43              */
    + 44 
    + 45             /** @const */ LEFT_TO_RIGHT:  0,
    + 46             /** @const */ RIGHT_TO_LEFT:  1,
    + 47             /** @const */ FREE:           2
    + 48         },
    + 49 
    + 50         autorotate: {
    + 51             /**
    + 52              * @lends CAAT.Behavior.PathBehavior.autorotate
    + 53              */
    + 54 
    + 55             /** @const */ LEFT_TO_RIGHT:  0,
    + 56             /** @const */ RIGHT_TO_LEFT:  1,
    + 57             /** @const */ FREE:           2
    + 58         }
    + 59     },
    + 60     extendsClass : "CAAT.Behavior.BaseBehavior",
    + 61     extendsWith:function () {
    + 62 
    + 63         return {
    + 64 
    + 65             /**
    + 66              * @lends CAAT.Behavior.PathBehavior.prototype
    + 67              * @param obj
    + 68              */
    + 69 
    + 70             /**
    + 71              * @inheritDoc
    + 72              */
    + 73             parse : function( obj ) {
    + 74                 CAAT.Behavior.PathBehavior.superclass.parse.call(this,obj);
    + 75 
    + 76                 if ( obj.SVG ) {
    + 77                     var parser= new CAAT.PathUtil.SVGPath();
    + 78                     var path=parser.parsePath( obj.SVG );
    + 79                     this.setValues(path);
    + 80                 }
    + 81 
    + 82                 if ( obj.autoRotate ) {
    + 83                     this.autoRotate= obj.autoRotate;
    + 84                 }
    + 85             },
    + 86 
    + 87             /**
    + 88              * A path to traverse.
    + 89              * @type {CAAT.PathUtil.Path}
    + 90              * @private
    + 91              */
    + 92             path:null,
    + 93 
    + 94             /**
    + 95              * Whether to set rotation angle while traversing the path.
    + 96              * @private
    + 97              */
    + 98             autoRotate:false,
    + 99 
    +100             prevX:-1, // private, do not use.
    +101             prevY:-1, // private, do not use.
    +102 
    +103             /**
    +104              * Autorotation hint.
    +105              * @type {CAAT.Behavior.PathBehavior.autorotate}
    +106              * @private
    +107              */
    +108             autoRotateOp: CAAT.Behavior.PathBehavior.autorotate.FREE,
    +109 
    +110             isOpenContour : false,
    +111 
    +112             relativeX : 0,
    +113             relativeY : 0,
    +114 
    +115             setOpenContour : function(b) {
    +116                 this.isOpenContour= b;
    +117                 return this;
    +118             },
    +119 
    +120             /**
    +121              * @inheritDoc
    +122              */
    +123             getPropertyName:function () {
    +124                 return "translate";
    +125             },
    +126 
    +127             setRelativeValues : function( x, y ) {
    +128                 this.relativeX= x;
    +129                 this.relativeY= y;
    +130                 this.isRelative= true;
    +131                 return this;
    +132             },
    +133 
    +134 
    +135             /**
    +136              * Sets an actor rotation to be heading from past to current path's point.
    +137              * Take into account that this will be incompatible with rotation Behaviors
    +138              * since they will set their own rotation configuration.
    +139              * @param autorotate {boolean}
    +140              * @param autorotateOp {CAAT.PathBehavior.autorotate} whether the sprite is drawn heading to the right.
    +141              * @return this.
    +142              */
    +143             setAutoRotate:function (autorotate, autorotateOp) {
    +144                 this.autoRotate = autorotate;
    +145                 if (autorotateOp !== undefined) {
    +146                     this.autoRotateOp = autorotateOp;
    +147                 }
    +148                 return this;
    +149             },
    +150 
    +151             /**
    +152              * Set the behavior path.
    +153              * The path can be any length, and will take behaviorDuration time to be traversed.
    +154              * @param {CAAT.Path}
    +155                 *
    +156              * @deprecated
    +157              */
    +158             setPath:function (path) {
    +159                 this.path = path;
    +160                 return this;
    +161             },
    +162 
    +163             /**
    +164              * Set the behavior path.
    +165              * The path can be any length, and will take behaviorDuration time to be traversed.
    +166              * @param {CAAT.Path}
    +167                 * @return this
    +168              */
    +169             setValues:function (path) {
    +170                 return this.setPath(path);
    +171             },
    +172 
    +173             /**
    +174              * @see Actor.setPositionAnchor
    +175              * @deprecated
    +176              * @param tx a float with xoffset.
    +177              * @param ty a float with yoffset.
    +178              */
    +179             setTranslation:function (tx, ty) {
    +180                 return this;
    +181             },
    +182 
    +183             /**
    +184              * @inheritDoc
    +185              */
    +186             calculateKeyFrameData:function (time) {
    +187                 time = this.interpolator.getPosition(time).y;
    +188                 var point = this.path.getPosition(time);
    +189                 return "translateX(" + point.x + "px) translateY(" + point.y + "px)";
    +190             },
    +191 
    +192             /**
    +193              * @inheritDoc
    +194              */
    +195             getKeyFrameDataValues : function(time) {
    +196                 time = this.interpolator.getPosition(time).y;
    +197                 var point = this.path.getPosition(time);
    +198                 var obj= {
    +199                     x : point.x,
    +200                     y : point.y
    +201                 };
    +202 
    +203                 if ( this.autoRotate ) {
    +204 
    +205                     var point2= time===0 ? point : this.path.getPosition(time -.001);
    +206                     var ax = point.x - point2.x;
    +207                     var ay = point.y - point2.y;
    +208                     var angle = Math.atan2(ay, ax);
    +209 
    +210                     obj.angle= angle;
    +211                 }
    +212 
    +213                 return obj;
    +214             },
    +215 
    +216             /**
    +217              * @inheritDoc
    +218              */
    +219             calculateKeyFramesData:function (prefix, name, keyframessize) {
    +220 
    +221                 if (typeof keyframessize === 'undefined') {
    +222                     keyframessize = 100;
    +223                 }
    +224                 keyframessize >>= 0;
    +225 
    +226                 var i;
    +227                 var kfr;
    +228                 var time;
    +229                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    +230 
    +231                 for (i = 0; i <= keyframessize; i++) {
    +232                     kfr = "" +
    +233                         (i / keyframessize * 100) + "%" + // percentage
    +234                         "{" +
    +235                         "-" + prefix + "-transform:" + this.calculateKeyFrameData(i / keyframessize) +
    +236                         "}";
    +237 
    +238                     kfd += kfr;
    +239                 }
    +240 
    +241                 kfd += "}";
    +242 
    +243                 return kfd;
    +244             },
    +245 
    +246             /**
    +247              * @inheritDoc
    +248              */
    +249             setForTime:function (time, actor) {
    +250 
    +251                 if (!this.path) {
    +252                     return {
    +253                         x:actor.x,
    +254                         y:actor.y
    +255                     };
    +256                 }
    +257 
    +258                 var point = this.path.getPosition(time, this.isOpenContour,.001);
    +259                 if (this.isRelative ) {
    +260                     point.x+= this.relativeX;
    +261                     point.y+= this.relativeY;
    +262                 }
    +263 
    +264                 if (this.autoRotate) {
    +265 
    +266                     if (-1 === this.prevX && -1 === this.prevY) {
    +267                         this.prevX = point.x;
    +268                         this.prevY = point.y;
    +269                     }
    +270 
    +271                     var ax = point.x - this.prevX;
    +272                     var ay = point.y - this.prevY;
    +273 
    +274                     if (ax === 0 && ay === 0) {
    +275                         actor.setLocation(point.x, point.y);
    +276                         return { x:actor.x, y:actor.y };
    +277                     }
    +278 
    +279                     var angle = Math.atan2(ay, ax);
    +280                     var si = CAAT.Foundation.SpriteImage;
    +281                     var pba = CAAT.Behavior.PathBehavior.AUTOROTATE;
    +282 
    +283                     // actor is heading left to right
    +284                     if (this.autoRotateOp === pba.LEFT_TO_RIGHT) {
    +285                         if (this.prevX <= point.x) {
    +286                             actor.setImageTransformation(si.TR_NONE);
    +287                         }
    +288                         else {
    +289                             actor.setImageTransformation(si.TR_FLIP_HORIZONTAL);
    +290                             angle += Math.PI;
    +291                         }
    +292                     } else if (this.autoRotateOp === pba.RIGHT_TO_LEFT) {
    +293                         if (this.prevX <= point.x) {
    +294                             actor.setImageTransformation(si.TR_FLIP_HORIZONTAL);
    +295                         }
    +296                         else {
    +297                             actor.setImageTransformation(si.TR_NONE);
    +298                             angle -= Math.PI;
    +299                         }
    +300                     }
    +301 
    +302                     actor.setRotation(angle);
    +303 
    +304                     this.prevX = point.x;
    +305                     this.prevY = point.y;
    +306 
    +307                     var modulo = Math.sqrt(ax * ax + ay * ay);
    +308                     ax /= modulo;
    +309                     ay /= modulo;
    +310                 }
    +311 
    +312                 if (this.doValueApplication) {
    +313                     actor.setLocation(point.x, point.y);
    +314                     return { x:actor.x, y:actor.y };
    +315                 } else {
    +316                     return {
    +317                         x:point.x,
    +318                         y:point.y
    +319                     };
    +320                 }
    +321 
    +322 
    +323             },
    +324 
    +325             /**
    +326              * Get a point on the path.
    +327              * If the time to get the point at is in behaviors frame time, a point on the path will be returned, otherwise
    +328              * a default {x:-1, y:-1} point will be returned.
    +329              *
    +330              * @param time {number} the time at which the point will be taken from the path.
    +331              * @return {object} an object of the form {x:float y:float}
    +332              */
    +333             positionOnTime:function (time) {
    +334                 if (this.isBehaviorInTime(time, null)) {
    +335                     time = this.normalizeTime(time);
    +336                     return this.path.getPosition(time);
    +337                 }
    +338 
    +339                 return {x:-1, y:-1};
    +340 
    +341             }
    +342         };
    +343     }
    +344 });
    +345 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_RotateBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_RotateBehavior.js.html new file mode 100644 index 00000000..ebce7154 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_RotateBehavior.js.html @@ -0,0 +1,220 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name RotateBehavior
    +  5      * @memberOf CAAT.Behavior
    +  6      * @extends CAAT.Behavior.BaseBehavior
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines:"CAAT.Behavior.RotateBehavior",
    + 11     extendsClass: "CAAT.Behavior.BaseBehavior",
    + 12     depends:[
    + 13         "CAAT.Behavior.BaseBehavior",
    + 14         "CAAT.Foundation.Actor"
    + 15     ],
    + 16     aliases: ["CAAT.RotateBehavior"],
    + 17     extendsWith:function () {
    + 18 
    + 19         return {
    + 20 
    + 21             /**
    + 22              * @lends CAAT.Behavior.RotateBehavior.prototype
    + 23              */
    + 24 
    + 25 
    + 26             __init:function () {
    + 27                 this.__super();
    + 28                 this.anchor = CAAT.Foundation.Actor.ANCHOR_CENTER;
    + 29                 return this;
    + 30             },
    + 31 
    + 32             /**
    + 33              * @inheritDoc
    + 34              */
    + 35             parse : function( obj ) {
    + 36                 CAAT.Behavior.RotateBehavior.superclass.parse.call(this,obj);
    + 37                 this.startAngle= obj.start || 0;
    + 38                 this.endAngle= obj.end || 0;
    + 39                 this.anchorX= (typeof obj.anchorX!=="undefined" ? parseInt(obj.anchorX) : 0.5);
    + 40                 this.anchorY= (typeof obj.anchorY!=="undefined" ? parseInt(obj.anchorY) : 0.5);
    + 41             },
    + 42 
    + 43             /**
    + 44              * Start rotation angle.
    + 45              * @type {number}
    + 46              * @private
    + 47              */
    + 48             startAngle:0,
    + 49 
    + 50             /**
    + 51              * End rotation angle.
    + 52              * @type {number}
    + 53              * @private
    + 54              */
    + 55             endAngle:0,
    + 56 
    + 57             /**
    + 58              * Rotation X anchor.
    + 59              * @type {number}
    + 60              * @private
    + 61              */
    + 62             anchorX:.50,
    + 63 
    + 64             /**
    + 65              * Rotation Y anchor.
    + 66              * @type {number}
    + 67              * @private
    + 68              */
    + 69             anchorY:.50,
    + 70 
    + 71             rotationRelative: 0,
    + 72 
    + 73             setRelativeValues : function(r) {
    + 74                 this.rotationRelative= r;
    + 75                 this.isRelative= true;
    + 76                 return this;
    + 77             },
    + 78 
    + 79             /**
    + 80              * @inheritDoc
    + 81              */
    + 82             getPropertyName:function () {
    + 83                 return "rotate";
    + 84             },
    + 85 
    + 86             /**
    + 87              * @inheritDoc
    + 88              */
    + 89             setForTime:function (time, actor) {
    + 90                 var angle = this.startAngle + time * (this.endAngle - this.startAngle);
    + 91 
    + 92                 if ( this.isRelative ) {
    + 93                     angle+= this.rotationRelative;
    + 94                     if (angle>=Math.PI) {
    + 95                         angle= (angle-2*Math.PI)
    + 96                     }
    + 97                     if ( angle<-2*Math.PI) {
    + 98                         angle= (angle+2*Math.PI);
    + 99                     }
    +100                 }
    +101 
    +102                 if (this.doValueApplication) {
    +103                     actor.setRotationAnchored(angle, this.anchorX, this.anchorY);
    +104                 }
    +105 
    +106                 return angle;
    +107 
    +108             },
    +109 
    +110             /**
    +111              * Set behavior bound values.
    +112              * if no anchorx,anchory values are supplied, the behavior will assume
    +113              * 50% for both values, that is, the actor's center.
    +114              *
    +115              * Be aware the anchor values are supplied in <b>RELATIVE PERCENT</b> to
    +116              * actor's size.
    +117              *
    +118              * @param startAngle {float} indicating the starting angle.
    +119              * @param endAngle {float} indicating the ending angle.
    +120              * @param anchorx {float} the percent position for anchorX
    +121              * @param anchory {float} the percent position for anchorY
    +122              */
    +123             setValues:function (startAngle, endAngle, anchorx, anchory) {
    +124                 this.startAngle = startAngle;
    +125                 this.endAngle = endAngle;
    +126                 if (typeof anchorx !== 'undefined' && typeof anchory !== 'undefined') {
    +127                     this.anchorX = anchorx;
    +128                     this.anchorY = anchory;
    +129                 }
    +130                 return this;
    +131             },
    +132 
    +133             /**
    +134              * @deprecated
    +135              * Use setValues instead
    +136              * @param start
    +137              * @param end
    +138              */
    +139             setAngles:function (start, end) {
    +140                 return this.setValues(start, end);
    +141             },
    +142 
    +143             /**
    +144              * Set the behavior rotation anchor. Use this method when setting an exact percent
    +145              * by calling setValues is complicated.
    +146              * @see CAAT.Actor
    +147              *
    +148              * These parameters are to set a custom rotation anchor point. if <code>anchor==CAAT.Actor.ANCHOR_CUSTOM
    +149              * </code> the custom rotation point is set.
    +150              * @param actor
    +151              * @param rx
    +152              * @param ry
    +153              *
    +154              */
    +155             setAnchor:function (actor, rx, ry) {
    +156                 this.anchorX = rx / actor.width;
    +157                 this.anchorY = ry / actor.height;
    +158                 return this;
    +159             },
    +160 
    +161             /**
    +162              * @inheritDoc
    +163              */
    +164             calculateKeyFrameData:function (time) {
    +165                 time = this.interpolator.getPosition(time).y;
    +166                 return "rotate(" + (this.startAngle + time * (this.endAngle - this.startAngle)) + "rad)";
    +167             },
    +168 
    +169             /**
    +170              * @inheritDoc
    +171              */
    +172             getKeyFrameDataValues : function(time) {
    +173                 time = this.interpolator.getPosition(time).y;
    +174                 return {
    +175                     angle : this.startAngle + time * (this.endAngle - this.startAngle)
    +176                 };
    +177             },
    +178 
    +179             /**
    +180              * @inheritDoc
    +181              */
    +182             calculateKeyFramesData:function (prefix, name, keyframessize) {
    +183 
    +184                 if (typeof keyframessize === 'undefined') {
    +185                     keyframessize = 100;
    +186                 }
    +187                 keyframessize >>= 0;
    +188 
    +189                 var i;
    +190                 var kfr;
    +191                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    +192 
    +193                 for (i = 0; i <= keyframessize; i++) {
    +194                     kfr = "" +
    +195                         (i / keyframessize * 100) + "%" + // percentage
    +196                         "{" +
    +197                         "-" + prefix + "-transform:" + this.calculateKeyFrameData(i / keyframessize) +
    +198                         "; -" + prefix + "-transform-origin:" + (this.anchorX*100) + "% " + (this.anchorY*100) + "% " +
    +199                         "}\n";
    +200 
    +201                     kfd += kfr;
    +202                 }
    +203 
    +204                 kfd += "}\n";
    +205 
    +206                 return kfd;
    +207             }
    +208 
    +209         };
    +210 
    +211     }
    +212 });
    +213 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Scale1Behavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Scale1Behavior.js.html new file mode 100644 index 00000000..5b511a71 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_Scale1Behavior.js.html @@ -0,0 +1,248 @@ +
      1 CAAT.Module({
    +  2     /**
    +  3      * @name Scale1Behavior
    +  4      * @memberOf CAAT.Behavior
    +  5      * @extends CAAT.Behavior.BaseBehavior
    +  6      * @constructor
    +  7      */
    +  8 
    +  9     /**
    + 10      * @name AXIS
    + 11      * @memberOf CAAT.Behavior.Scale1Behavior
    + 12      * @enum {number}
    + 13      * @namespace
    + 14      */
    + 15 
    + 16     /**
    + 17      * @name Axis
    + 18      * @memberOf CAAT.Behavior.Scale1Behavior
    + 19      * @enum {number}
    + 20      * @namespace
    + 21      * @deprecated
    + 22      */
    + 23 
    + 24 
    + 25     defines:"CAAT.Behavior.Scale1Behavior",
    + 26     depends:[
    + 27         "CAAT.Behavior.BaseBehavior",
    + 28         "CAAT.Foundation.Actor"
    + 29     ],
    + 30     aliases: ["CAAT.Scale1Behavior"],
    + 31     constants : {
    + 32 
    + 33         AXIS : {
    + 34             /**
    + 35              * @lends CAAT.Behavior.Scale1Behavior.AXIS
    + 36              */
    + 37 
    + 38             /** @const */ X:  0,
    + 39             /** @const */ Y:  1
    + 40         },
    + 41 
    + 42         Axis : {
    + 43             /**
    + 44              * @lends CAAT.Behavior.Scale1Behavior.Axis
    + 45              */
    + 46 
    + 47             /** @const */ X:  0,
    + 48             /** @const */ Y:  1
    + 49         }
    + 50     },
    + 51     extendsClass:"CAAT.Behavior.BaseBehavior",
    + 52     extendsWith:function () {
    + 53 
    + 54         return {
    + 55 
    + 56             /**
    + 57              * @lends CAAT.Behavior.Scale1Behavior.prototype
    + 58              */
    + 59 
    + 60             __init:function () {
    + 61                 this.__super();
    + 62                 this.anchor = CAAT.Foundation.Actor.ANCHOR_CENTER;
    + 63                 return this;
    + 64             },
    + 65 
    + 66             /**
    + 67              * Start scale value.
    + 68              * @private
    + 69              */
    + 70             startScale:1,
    + 71 
    + 72             /**
    + 73              * End scale value.
    + 74              * @private
    + 75              */
    + 76             endScale:1,
    + 77 
    + 78             /**
    + 79              * Scale X anchor.
    + 80              * @private
    + 81              */
    + 82             anchorX:.50,
    + 83 
    + 84             /**
    + 85              * Scale Y anchor.
    + 86              * @private
    + 87              */
    + 88             anchorY:.50,
    + 89 
    + 90             /**
    + 91              * Apply on Axis X or Y ?
    + 92              */
    + 93             applyOnX:true,
    + 94 
    + 95             parse : function( obj ) {
    + 96                 CAAT.Behavior.Scale1Behavior.superclass.parse.call(this,obj);
    + 97                 this.startScale= obj.start || 0;
    + 98                 this.endScale= obj.end || 0;
    + 99                 this.anchorX= (typeof obj.anchorX!=="undefined" ? parseInt(obj.anchorX) : 0.5);
    +100                 this.anchorY= (typeof obj.anchorY!=="undefined" ? parseInt(obj.anchorY) : 0.5);
    +101                 this.applyOnX= obj.axis ? obj.axis.toLowerCase()==="x" : true;
    +102             },
    +103 
    +104             /**
    +105              * @param axis {CAAT.Behavior.Scale1Behavior.AXIS}
    +106              */
    +107             applyOnAxis:function (axis) {
    +108                 if (axis === CAAT.Behavior.Scale1Behavior.AXIS.X) {
    +109                     this.applyOnX = false;
    +110                 } else {
    +111                     this.applyOnX = true;
    +112                 }
    +113             },
    +114 
    +115             /**
    +116              * @inheritDoc
    +117              */
    +118             getPropertyName:function () {
    +119                 return "scale";
    +120             },
    +121 
    +122             /**
    +123              * @inheritDoc
    +124              */
    +125             setForTime:function (time, actor) {
    +126 
    +127                 var scale = this.startScale + time * (this.endScale - this.startScale);
    +128 
    +129                 // Firefox 3.x & 4, will crash animation if either scaleX or scaleY equals 0.
    +130                 if (0 === scale) {
    +131                     scale = 0.01;
    +132                 }
    +133 
    +134                 if (this.doValueApplication) {
    +135                     if (this.applyOnX) {
    +136                         actor.setScaleAnchored(scale, actor.scaleY, this.anchorX, this.anchorY);
    +137                     } else {
    +138                         actor.setScaleAnchored(actor.scaleX, scale, this.anchorX, this.anchorY);
    +139                     }
    +140                 }
    +141 
    +142                 return scale;
    +143             },
    +144 
    +145             /**
    +146              * Define this scale behaviors values.
    +147              *
    +148              * Be aware the anchor values are supplied in <b>RELATIVE PERCENT</b> to
    +149              * actor's size.
    +150              *
    +151              * @param start {number} initial X axis scale value.
    +152              * @param end {number} final X axis scale value.
    +153              * @param anchorx {float} the percent position for anchorX
    +154              * @param anchory {float} the percent position for anchorY
    +155              *
    +156              * @return this.
    +157              */
    +158             setValues:function (start, end, applyOnX, anchorx, anchory) {
    +159                 this.startScale = start;
    +160                 this.endScale = end;
    +161                 this.applyOnX = !!applyOnX;
    +162 
    +163                 if (typeof anchorx !== 'undefined' && typeof anchory !== 'undefined') {
    +164                     this.anchorX = anchorx;
    +165                     this.anchorY = anchory;
    +166                 }
    +167 
    +168                 return this;
    +169             },
    +170 
    +171             /**
    +172              * Set an exact position scale anchor. Use this method when it is hard to
    +173              * set a thorough anchor position expressed in percentage.
    +174              * @param actor
    +175              * @param x
    +176              * @param y
    +177              */
    +178             setAnchor:function (actor, x, y) {
    +179                 this.anchorX = x / actor.width;
    +180                 this.anchorY = y / actor.height;
    +181 
    +182                 return this;
    +183             },
    +184 
    +185             /**
    +186              * @inheritDoc
    +187              */
    +188             calculateKeyFrameData:function (time) {
    +189                 var scale;
    +190 
    +191                 time = this.interpolator.getPosition(time).y;
    +192                 scale = this.startScale + time * (this.endScale - this.startScale);
    +193 
    +194                 return this.applyOnX ? "scaleX(" + scale + ")" : "scaleY(" + scale + ")";
    +195             },
    +196 
    +197             /**
    +198              * @inheritDoc
    +199              */
    +200             getKeyFrameDataValues : function(time) {
    +201                 time = this.interpolator.getPosition(time).y;
    +202                 var obj= {};
    +203                 obj[ this.applyOnX ? "scaleX" : "scaleY" ]= this.startScale + time * (this.endScale - this.startScale);
    +204 
    +205                 return obj;
    +206             },
    +207 
    +208             /**
    +209              * @inheritDoc
    +210              */
    +211             calculateKeyFramesData:function (prefix, name, keyframessize) {
    +212 
    +213                 if (typeof keyframessize === 'undefined') {
    +214                     keyframessize = 100;
    +215                 }
    +216                 keyframessize >>= 0;
    +217 
    +218                 var i;
    +219                 var kfr;
    +220                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    +221 
    +222                 for (i = 0; i <= keyframessize; i++) {
    +223                     kfr = "" +
    +224                         (i / keyframessize * 100) + "%" + // percentage
    +225                         "{" +
    +226                         "-" + prefix + "-transform:" + this.calculateKeyFrameData(i / keyframessize) +
    +227                         "; -" + prefix + "-transform-origin:" + (this.anchorX*100) + "% " + (this.anchorY*100) + "% " +
    +228                         "}\n";
    +229 
    +230                     kfd += kfr;
    +231                 }
    +232 
    +233                 kfd += "}\n";
    +234 
    +235                 return kfd;
    +236             }
    +237         }
    +238 
    +239     }
    +240 });
    +241 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ScaleBehavior.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ScaleBehavior.js.html new file mode 100644 index 00000000..e5ea8b22 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Behavior_ScaleBehavior.js.html @@ -0,0 +1,227 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name ScaleBehavior
    +  5      * @memberOf CAAT.Behavior
    +  6      * @extends CAAT.Behavior.BaseBehavior
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines:"CAAT.Behavior.ScaleBehavior",
    + 11     depends:[
    + 12         "CAAT.Behavior.BaseBehavior",
    + 13         "CAAT.Foundation.Actor"
    + 14     ],
    + 15     extendsClass:"CAAT.Behavior.BaseBehavior",
    + 16     aliases : ["CAAT.ScaleBehavior"],
    + 17     extendsWith:function () {
    + 18 
    + 19         return  {
    + 20 
    + 21             /**
    + 22              * @lends CAAT.Behavior.ScaleBehavior
    + 23              */
    + 24 
    + 25             __init:function () {
    + 26                 this.__super();
    + 27                 this.anchor = CAAT.Foundation.Actor.ANCHOR_CENTER;
    + 28                 return this;
    + 29             },
    + 30 
    + 31             /**
    + 32              * Start X scale value.
    + 33              * @private
    + 34              * @type {number}
    + 35              */
    + 36             startScaleX:1,
    + 37 
    + 38             /**
    + 39              * End X scale value.
    + 40              * @private
    + 41              * @type {number}
    + 42              */
    + 43             endScaleX:1,
    + 44 
    + 45             /**
    + 46              * Start Y scale value.
    + 47              * @private
    + 48              * @type {number}
    + 49              */
    + 50             startScaleY:1,
    + 51 
    + 52             /**
    + 53              * End Y scale value.
    + 54              * @private
    + 55              * @type {number}
    + 56              */
    + 57             endScaleY:1,
    + 58 
    + 59             /**
    + 60              * Scale X anchor value.
    + 61              * @private
    + 62              * @type {number}
    + 63              */
    + 64             anchorX:.50,
    + 65 
    + 66             /**
    + 67              * Scale Y anchor value.
    + 68              * @private
    + 69              * @type {number}
    + 70              */
    + 71             anchorY:.50,
    + 72 
    + 73             /**
    + 74              * @inheritDoc
    + 75              */
    + 76             parse : function( obj ) {
    + 77                 CAAT.Behavior.ScaleBehavior.superclass.parse.call(this,obj);
    + 78                 this.startScaleX= (obj.scaleX && obj.scaleX.start) || 0;
    + 79                 this.endScaleX= (obj.scaleX && obj.scaleX.end) || 0;
    + 80                 this.startScaleY= (obj.scaleY && obj.scaleY.start) || 0;
    + 81                 this.endScaleY= (obj.scaleY && obj.scaleY.end) || 0;
    + 82                 this.anchorX= (typeof obj.anchorX!=="undefined" ? parseInt(obj.anchorX) : 0.5);
    + 83                 this.anchorY= (typeof obj.anchorY!=="undefined" ? parseInt(obj.anchorY) : 0.5);
    + 84             },
    + 85 
    + 86             /**
    + 87              * @inheritDoc
    + 88              */
    + 89             getPropertyName:function () {
    + 90                 return "scale";
    + 91             },
    + 92 
    + 93             /**
    + 94              * Applies corresponding scale values for a given time.
    + 95              *
    + 96              * @param time the time to apply the scale for.
    + 97              * @param actor the target actor to Scale.
    + 98              * @return {object} an object of the form <code>{ scaleX: {float}, scaleY: {float}�}</code>
    + 99              */
    +100             setForTime:function (time, actor) {
    +101 
    +102                 var scaleX = this.startScaleX + time * (this.endScaleX - this.startScaleX);
    +103                 var scaleY = this.startScaleY + time * (this.endScaleY - this.startScaleY);
    +104 
    +105                 // Firefox 3.x & 4, will crash animation if either scaleX or scaleY equals 0.
    +106                 if (0 === scaleX) {
    +107                     scaleX = 0.01;
    +108                 }
    +109                 if (0 === scaleY) {
    +110                     scaleY = 0.01;
    +111                 }
    +112 
    +113                 if (this.doValueApplication) {
    +114                     actor.setScaleAnchored(scaleX, scaleY, this.anchorX, this.anchorY);
    +115                 }
    +116 
    +117                 return { scaleX:scaleX, scaleY:scaleY };
    +118             },
    +119             /**
    +120              * Define this scale behaviors values.
    +121              *
    +122              * Be aware the anchor values are supplied in <b>RELATIVE PERCENT</b> to
    +123              * actor's size.
    +124              *
    +125              * @param startX {number} initial X axis scale value.
    +126              * @param endX {number} final X axis scale value.
    +127              * @param startY {number} initial Y axis scale value.
    +128              * @param endY {number} final Y axis scale value.
    +129              * @param anchorx {float} the percent position for anchorX
    +130              * @param anchory {float} the percent position for anchorY
    +131              *
    +132              * @return this.
    +133              */
    +134             setValues:function (startX, endX, startY, endY, anchorx, anchory) {
    +135                 this.startScaleX = startX;
    +136                 this.endScaleX = endX;
    +137                 this.startScaleY = startY;
    +138                 this.endScaleY = endY;
    +139 
    +140                 if (typeof anchorx !== 'undefined' && typeof anchory !== 'undefined') {
    +141                     this.anchorX = anchorx;
    +142                     this.anchorY = anchory;
    +143                 }
    +144 
    +145                 return this;
    +146             },
    +147             /**
    +148              * Set an exact position scale anchor. Use this method when it is hard to
    +149              * set a thorough anchor position expressed in percentage.
    +150              * @param actor
    +151              * @param x
    +152              * @param y
    +153              */
    +154             setAnchor:function (actor, x, y) {
    +155                 this.anchorX = x / actor.width;
    +156                 this.anchorY = y / actor.height;
    +157 
    +158                 return this;
    +159             },
    +160 
    +161             /**
    +162              * @inheritDoc
    +163              */
    +164             calculateKeyFrameData:function (time) {
    +165                 var scaleX;
    +166                 var scaleY;
    +167 
    +168                 time = this.interpolator.getPosition(time).y;
    +169                 scaleX = this.startScaleX + time * (this.endScaleX - this.startScaleX);
    +170                 scaleY = this.startScaleY + time * (this.endScaleY - this.startScaleY);
    +171 
    +172                 return "scale(" + scaleX +"," + scaleY + ")";
    +173             },
    +174 
    +175             /**
    +176              * @inheritDoc
    +177              */
    +178             getKeyFrameDataValues : function(time) {
    +179                 time = this.interpolator.getPosition(time).y;
    +180                 return {
    +181                     scaleX : this.startScaleX + time * (this.endScaleX - this.startScaleX),
    +182                     scaleY : this.startScaleY + time * (this.endScaleY - this.startScaleY)
    +183                 };
    +184             },
    +185 
    +186 
    +187             /**
    +188              * @inheritDoc
    +189              */
    +190             calculateKeyFramesData:function (prefix, name, keyframessize) {
    +191 
    +192                 if (typeof keyframessize === 'undefined') {
    +193                     keyframessize = 100;
    +194                 }
    +195                 keyframessize >>= 0;
    +196 
    +197                 var i;
    +198                 var kfr;
    +199                 var kfd = "@-" + prefix + "-keyframes " + name + " {";
    +200 
    +201                 for (i = 0; i <= keyframessize; i++) {
    +202                     kfr = "" +
    +203                         (i / keyframessize * 100) + "%" + // percentage
    +204                         "{" +
    +205                         "-" + prefix + "-transform:" + this.calculateKeyFrameData(i / keyframessize) +
    +206                         "; -" + prefix + "-transform-origin:" + (this.anchorX*100) + "% " + (this.anchorY*100) + "% " +
    +207                         "}\n";
    +208 
    +209                     kfd += kfr;
    +210                 }
    +211 
    +212                 kfd += "}\n";
    +213 
    +214                 return kfd;
    +215             }
    +216         }
    +217 
    +218     }
    +219 });
    +220 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_CAAT.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_CAAT.js.html new file mode 100644 index 00000000..b3187fa9 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_CAAT.js.html @@ -0,0 +1,20 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * Library namespace.
    +  5  * CAAT stands for: Canvas Advanced Animation Tookit.
    +  6  */
    +  7 
    +  8 
    +  9     /**
    + 10      * @namespace
    + 11      */
    + 12 var CAAT= CAAT || {};
    + 13 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_Class.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_Class.js.html new file mode 100644 index 00000000..9ec7d6e8 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_Class.js.html @@ -0,0 +1,228 @@ +
      1 
    +  2 extend = function (subc, superc) {
    +  3     var subcp = subc.prototype;
    +  4 
    +  5     // Class pattern.
    +  6     var CAATObject = function () {
    +  7     };
    +  8     CAATObject.prototype = superc.prototype;
    +  9 
    + 10     subc.prototype = new CAATObject();       // chain prototypes.
    + 11     subc.superclass = superc.prototype;
    + 12     subc.prototype.constructor = subc;
    + 13 
    + 14     // Reset constructor. See Object Oriented Javascript for an in-depth explanation of this.
    + 15     if (superc.prototype.constructor === Object.prototype.constructor) {
    + 16         superc.prototype.constructor = superc;
    + 17     }
    + 18 
    + 19     // los metodos de superc, que no esten en esta clase, crear un metodo que
    + 20     // llama al metodo de superc.
    + 21     for (var method in subcp) {
    + 22         if (subcp.hasOwnProperty(method)) {
    + 23             subc.prototype[method] = subcp[method];
    + 24 
    + 25             /**
    + 26              * Sintactic sugar to add a __super attribute on every overriden method.
    + 27              * Despite comvenient, it slows things down by 5fps.
    + 28              *
    + 29              * Uncomment at your own risk.
    + 30              *
    + 31              // tenemos en super un metodo con igual nombre.
    + 32              if ( superc.prototype[method]) {
    + 33             subc.prototype[method]= (function(fn, fnsuper) {
    + 34                 return function() {
    + 35                     var prevMethod= this.__super;
    + 36 
    + 37                     this.__super= fnsuper;
    + 38 
    + 39                     var retValue= fn.apply(
    + 40                             this,
    + 41                             Array.prototype.slice.call(arguments) );
    + 42 
    + 43                     this.__super= prevMethod;
    + 44 
    + 45                     return retValue;
    + 46                 };
    + 47             })(subc.prototype[method], superc.prototype[method]);
    + 48         }
    + 49              */
    + 50 
    + 51         }
    + 52     }
    + 53 };
    + 54 
    + 55 
    + 56 extendWith = function (base, subclass, with_object) {
    + 57     var CAATObject = function () {
    + 58     };
    + 59 
    + 60     CAATObject.prototype = base.prototype;
    + 61 
    + 62     subclass.prototype = new CAATObject();
    + 63     subclass.superclass = base.prototype;
    + 64     subclass.prototype.constructor = subclass;
    + 65 
    + 66     if (base.prototype.constructor === Object.prototype.constructor) {
    + 67         base.prototype.constructor = base;
    + 68     }
    + 69 
    + 70     if (with_object) {
    + 71         for (var method in with_object) {
    + 72             if (with_object.hasOwnProperty(method)) {
    + 73                 subclass.prototype[ method ] = with_object[method];
    + 74                 /*
    + 75                  if ( base.prototype[method]) {
    + 76                  subclass.prototype[method]= (function(fn, fnsuper) {
    + 77                  return function() {
    + 78                  var prevMethod= this.__super;
    + 79                  this.__super= fnsuper;
    + 80                  var retValue= fn.apply(this, arguments );
    + 81                  this.__super= prevMethod;
    + 82 
    + 83                  return retValue;
    + 84                  };
    + 85                  })(subclass.prototype[method], base.prototype[method]);
    + 86                  }
    + 87                  /**/
    + 88             }
    + 89         }
    + 90     }
    + 91 };
    + 92 
    + 93 
    + 94 
    + 95 function proxyFunction(object, method, preMethod, postMethod, errorMethod) {
    + 96 
    + 97     return function () {
    + 98 
    + 99         var args = Array.prototype.slice.call(arguments);
    +100 
    +101         // call pre-method hook if present.
    +102         if (preMethod) {
    +103             preMethod({
    +104                 object: object,
    +105                 method: method,
    +106                 arguments: args });
    +107         }
    +108 
    +109         var retValue = null;
    +110 
    +111         try {
    +112             // apply original object call with proxied object as
    +113             // function context.
    +114             retValue = object[method].apply(object, args);
    +115 
    +116             // everything went right on function call, the call
    +117             // post-method hook if present
    +118             if (postMethod) {
    +119                 /*var rr= */
    +120                 var ret2 = postMethod({
    +121                     object: object,
    +122                     method: method,
    +123                     arguments: args });
    +124 
    +125                 if (ret2) {
    +126                     retValue = ret2;
    +127                 }
    +128             }
    +129         } catch (e) {
    +130             // an exeception was thrown, call exception-method hook if
    +131             // present and return its result as execution result.
    +132             if (errorMethod) {
    +133                 retValue = errorMethod({
    +134                     object: object,
    +135                     method: method,
    +136                     arguments: args,
    +137                     exception: e});
    +138             } else {
    +139                 // since there's no error hook, just throw the exception
    +140                 throw e;
    +141             }
    +142         }
    +143 
    +144         // return original returned value to the caller.
    +145         return retValue;
    +146     };
    +147 
    +148 }
    +149 
    +150 function proxyAttribute( proxy, object, attribute, getter, setter) {
    +151 
    +152     proxy.__defineGetter__(attribute, function () {
    +153         if (getter) {
    +154             getter(object, attribute);
    +155         }
    +156         return object[attribute];
    +157     });
    +158     proxy.__defineSetter__(attribute, function (value) {
    +159         object[attribute] = value;
    +160         if (setter) {
    +161             setter(object, attribute, value);
    +162         }
    +163     });
    +164 }
    +165 
    +166 function proxyObject(object, preMethod, postMethod, errorMethod, getter, setter) {
    +167 
    +168     /**
    +169      * If not a function then only non privitive objects can be proxied.
    +170      * If it is a previously created proxy, return the proxy itself.
    +171      */
    +172     if (typeof object !== 'object' || isArray(object) || isString(object) || object.$proxy) {
    +173         return object;
    +174     }
    +175 
    +176     var proxy = {};
    +177 
    +178     // hold the proxied object as member. Needed to assign proper
    +179     // context on proxy method call.
    +180     proxy.$proxy = true;
    +181     proxy.$proxy_delegate = object;
    +182 
    +183     // For every element in the object to be proxied
    +184     for (var method in object) {
    +185 
    +186         if (method === "constructor") {
    +187             continue;
    +188         }
    +189 
    +190         // only function members
    +191         if (typeof object[method] === 'function') {
    +192             proxy[method] = proxyFunction(object, method, preMethod, postMethod, errorMethod );
    +193         } else {
    +194             proxyAttribute(proxy, object, method, getter, setter);
    +195         }
    +196     }
    +197 
    +198     // return our newly created and populated with functions proxied object.
    +199     return proxy;
    +200 }
    +201 
    +202 
    +203 CAAT.Module({
    +204     defines : "CAAT.Core.Class",
    +205     extendsWith : function() {
    +206 
    +207         /**
    +208          * See LICENSE file.
    +209          *
    +210          * Extend a prototype with another to form a classical OOP inheritance procedure.
    +211          *
    +212          * @param subc {object} Prototype to define the base class
    +213          * @param superc {object} Prototype to be extended (derived class).
    +214          */
    +215 
    +216 
    +217         return {
    +218 
    +219         };
    +220     }
    +221 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_Constants.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_Constants.js.html new file mode 100644 index 00000000..160df33d --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_Constants.js.html @@ -0,0 +1,127 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  **/
    +  5 
    +  6 CAAT.Module( {
    +  7 
    +  8     defines: "CAAT.Core.Constants",
    +  9     depends : [
    + 10         "CAAT.Math.Matrix"
    + 11     ],
    + 12 
    + 13     extendsWith: function() {
    + 14 
    + 15         /**
    + 16          * @lends CAAT
    + 17          */
    + 18 
    + 19         /**
    + 20          * // do not clamp coordinates. speeds things up in older browsers.
    + 21          * @type {Boolean}
    + 22          * @private
    + 23          */
    + 24         CAAT.CLAMP= false;
    + 25 
    + 26         /**
    + 27          * This function makes the system obey decimal point calculations for actor's position, size, etc.
    + 28          * This may speed things up in some browsers, but at the cost of affecting visuals (like in rotating
    + 29          * objects).
    + 30          *
    + 31          * Latest Chrome (20+) is not affected by this.
    + 32          *
    + 33          * Default CAAT.Matrix try to speed things up.
    + 34          *
    + 35          * @param clamp {boolean}
    + 36          */
    + 37         CAAT.setCoordinateClamping= function( clamp ) {
    + 38             CAAT.CLAMP= clamp;
    + 39             CAAT.Math.Matrix.setCoordinateClamping(clamp);
    + 40         };
    + 41 
    + 42         /**
    + 43          * Log function which deals with window's Console object.
    + 44          */
    + 45         CAAT.log= function() {
    + 46             if(window.console){
    + 47                 window.console.log( Array.prototype.slice.call(arguments) );
    + 48             }
    + 49         };
    + 50 
    + 51         /**
    + 52          * Control how CAAT.Font and CAAT.TextActor control font ascent/descent values.
    + 53          * 0 means it will guess values from a font height
    + 54          * 1 means it will try to use css to get accurate ascent/descent values and fall back to the previous method
    + 55          *   in case it couldn't.
    + 56          *
    + 57          * @type {Number}
    + 58          */
    + 59         CAAT.CSS_TEXT_METRICS=      0;
    + 60 
    + 61         /**
    + 62          * is GLRendering enabled.
    + 63          * @type {Boolean}
    + 64          */
    + 65         CAAT.GLRENDER= false;
    + 66 
    + 67         /**
    + 68          * set this variable before building CAAT.Director intances to enable debug panel.
    + 69          */
    + 70         CAAT.DEBUG= false;
    + 71 
    + 72         /**
    + 73          * show Bounding Boxes
    + 74          * @type {Boolean}
    + 75          */
    + 76         CAAT.DEBUGBB= false;
    + 77 
    + 78         /**
    + 79          * Bounding Boxes color.
    + 80          * @type {String}
    + 81          */
    + 82         CAAT.DEBUGBBBCOLOR = '#00f';
    + 83 
    + 84         /**
    + 85          * debug axis aligned bounding boxes.
    + 86          * @type {Boolean}
    + 87          */
    + 88         CAAT.DEBUGAABB = false;
    + 89 
    + 90         /**
    + 91          * Bounding boxes color.
    + 92          * @type {String}
    + 93          */
    + 94         CAAT.DEBUGAABBCOLOR = '#f00';
    + 95 
    + 96         /**
    + 97          * if CAAT.Director.setClear uses CLEAR_DIRTY_RECTS, this will show them on screen.
    + 98          * @type {Boolean}
    + 99          */
    +100         CAAT.DEBUG_DIRTYRECTS= false;
    +101 
    +102         /**
    +103          * Do not consider mouse drag gesture at least until you have dragged
    +104          * DRAG_THRESHOLD_X and DRAG_THRESHOLD_Y pixels.
    +105          * This is suitable for tablets, where just by touching, drag events are delivered.
    +106          */
    +107         CAAT.DRAG_THRESHOLD_X=      5;
    +108         CAAT.DRAG_THRESHOLD_Y=      5;
    +109 
    +110         /**
    +111          * When switching scenes, cache exiting scene or not. Set before building director instance.
    +112          * @type {Boolean}
    +113          */
    +114         CAAT.CACHE_SCENE_ON_CHANGE= true;
    +115 
    +116         return {
    +117         }
    +118     }
    +119 } );
    +120 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_ModuleManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_ModuleManager.js.html new file mode 100644 index 00000000..4e87cbe7 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Core_ModuleManager.js.html @@ -0,0 +1,925 @@ +
      1 (function(global, __obj_namespace) {
    +  2 
    +  3     String.prototype.endsWith= function(suffix) {
    +  4         return this.indexOf(suffix, this.length - suffix.length) !== -1;
    +  5     };
    +  6 
    +  7     Function.prototype.bind = Function.prototype.bind || function () {
    +  8                 var fn = this;                                   // the function
    +  9                 var args = Array.prototype.slice.call(arguments);  // copy the arguments.
    + 10                 var obj = args.shift();                           // first parameter will be context 'this'
    + 11                 return function () {
    + 12                     return fn.apply(
    + 13                         obj,
    + 14                         args.concat(Array.prototype.slice.call(arguments)));
    + 15                 }
    + 16             };
    + 17 
    + 18     global.isArray = function (input) {
    + 19         return typeof(input) == 'object' && (input instanceof Array);
    + 20     };
    + 21     global.isString = function (input) {
    + 22         return typeof(input) == 'string';
    + 23     };
    + 24     global.isFunction = function( input ) {
    + 25         return typeof input == "function"
    + 26     }
    + 27 
    + 28     var initializing = false;
    + 29 
    + 30     // The base Class implementation (does nothing)
    + 31     var Class = function () {
    + 32     };
    + 33 
    + 34     Class['__CLASS']='Class';
    + 35 
    + 36     // Create a new Class that inherits from this class
    + 37     Class.extend = function (extendingProt, constants, name, aliases, flags) {
    + 38 
    + 39         var _super = this.prototype;
    + 40 
    + 41         // Instantiate a base class (but only create the instance,
    + 42         // don't run the init constructor)
    + 43         initializing = true;
    + 44         var prototype = new this();
    + 45         initializing = false;
    + 46 
    + 47         // The dummy class constructor
    + 48         function CAATClass() {
    + 49             // All construction is actually done in the init method
    + 50             if (!initializing && this.__init) {
    + 51                 this.__init.apply(this, arguments);
    + 52             }
    + 53         }
    + 54 
    + 55         // Populate our constructed prototype object
    + 56         CAATClass.prototype = prototype;
    + 57         // Enforce the constructor to be what we expect
    + 58         CAATClass.prototype.constructor = CAATClass;
    + 59         CAATClass.superclass = _super;
    + 60         // And make this class extendable
    + 61         CAATClass.extend = Class.extend;
    + 62 
    + 63         assignNamespace( name, CAATClass );
    + 64         if ( constants ) {
    + 65             constants= (isFunction(constants) ? constants() : constants);
    + 66             for( var constant in constants ) {
    + 67                 if ( constants.hasOwnProperty(constant) ) {
    + 68                     CAATClass[ constant ]= constants[constant];
    + 69                 }
    + 70             }
    + 71         }
    + 72 
    + 73         CAATClass["__CLASS"]= name;
    + 74 
    + 75         if ( aliases ) {
    + 76             if ( !isArray(aliases) ) {
    + 77                 aliases= [aliases];
    + 78             }
    + 79             for( var i=0; i<aliases.length; i++ ) {
    + 80                 ensureNamespace( aliases[i] );
    + 81                 var ns= assignNamespace( aliases[i], CAATClass );
    + 82 
    + 83                 // assign constants to alias classes.
    + 84                 if ( constants ) {
    + 85                     for( var constant in constants ) {
    + 86                         if ( constants.hasOwnProperty(constant) ) {
    + 87                             ns[ constant ]= constants[constant];
    + 88                         }
    + 89                     }
    + 90                 }
    + 91             }
    + 92         }
    + 93 
    + 94         extendingProt= (isFunction(extendingProt) ? extendingProt() : extendingProt);
    + 95 
    + 96         // Copy the properties over onto the new prototype
    + 97         for (var fname in extendingProt) {
    + 98             // Check if we're overwriting an existing function
    + 99             prototype[fname] = ( (fname === "__init" || (flags && flags.decorated) ) && isFunction(extendingProt[fname]) && isFunction(_super[fname]) ) ?
    +100                 (function (name, fn) {
    +101                     return function () {
    +102                         var tmp = this.__super;
    +103                         this.__super = _super[name];
    +104                         var ret = fn.apply(this, arguments);
    +105                         this.__super = tmp;
    +106                         return ret;
    +107                     };
    +108                 })(fname, extendingProt[fname]) :
    +109 
    +110                 extendingProt[fname];
    +111         }
    +112 
    +113         return CAATClass;
    +114     }
    +115 
    +116     var Node= function( obj ) { //name, dependencies, callback ) {
    +117         this.name= obj.defines;
    +118         this.extendWith= obj.extendsWith;
    +119         this.callback= obj.onCreate;
    +120         this.callbackPreCreation= obj.onPreCreate;
    +121         this.dependencies= obj.depends;
    +122         this.baseClass= obj.extendsClass;
    +123         this.aliases= obj.aliases;
    +124         this.constants= obj.constants;
    +125         this.decorated= obj.decorated;
    +126 
    +127         this.children= [];
    +128 
    +129         return this;
    +130     };
    +131 
    +132     Node.prototype= {
    +133         children:       null,
    +134         name:           null,
    +135         extendWith:     null,
    +136         callback:       null,
    +137         dependencies:   null,
    +138         baseClass:      null,
    +139         aliases:        null,
    +140         constants:      null,
    +141 
    +142         decorated:      false,
    +143 
    +144         solved:         false,
    +145         visited:        false,
    +146 
    +147         status : function() {
    +148             console.log("  Module: "+this.name+
    +149                 (this.dependencies.length ?
    +150                     (" unsolved_deps:["+this.dependencies+"]") :
    +151                     " no dependencies.")+
    +152                 ( this.solved ? " solved" : " ------> NOT solved.")
    +153             );
    +154         },
    +155 
    +156         removeDependency : function( modulename ) {
    +157             for( var i=0; i<this.dependencies.length; i++ ) {
    +158                 if ( this.dependencies[i]===modulename ) {
    +159                     this.dependencies.splice(i,1);
    +160                     break;
    +161                 }
    +162             }
    +163 
    +164 
    +165         },
    +166 
    +167         assignDependency : function( node ) {
    +168 
    +169             var i;
    +170             for( i=0; i<this.dependencies.length; i++ ) {
    +171                 if ( this.dependencies[i] === node.name ) {
    +172                     this.children.push( node );
    +173                     this.dependencies.splice(i,1);
    +174 //                    console.log("Added dependency: "+node.name+" on "+this.name);
    +175                     break;
    +176                 }
    +177             }
    +178         },
    +179 
    +180         isSolved : function() {
    +181             return this.solved;
    +182         },
    +183 
    +184         solveDeep : function() {
    +185 
    +186             if ( this.visited ) {
    +187                 return true;
    +188             }
    +189 
    +190             this.visited= true;
    +191 
    +192             if ( this.solved ) {
    +193                 return true;
    +194             }
    +195 
    +196             if ( this.dependencies.length!==0 ) {
    +197                 return false;
    +198             }
    +199 
    +200             var b= true;
    +201             for( var i=0; i<this.children.length; i++ ) {
    +202                 if (! this.children[i].solveDeep() ) {
    +203                     return false;
    +204                 }
    +205             }
    +206 
    +207             //////
    +208             this.__initModule();
    +209 
    +210             this.solved= true;
    +211             mm.solved( this );
    +212 
    +213             return true;
    +214         },
    +215 
    +216         __initModule : function() {
    +217 
    +218             var c= null;
    +219             if ( this.baseClass ) {
    +220                 c= findClass( this.baseClass );
    +221 
    +222                 if ( !c ) {
    +223                     console.log("  "+this.name+" -> Can't extend non-existant class: "+this.baseClass );
    +224                     return;
    +225                 }
    +226 
    +227             } else {
    +228                 c= Class;
    +229             }
    +230 
    +231             c= c.extend( this.extendWith, this.constants, this.name, this.aliases, { decorated : this.decorated } );
    +232 
    +233             console.log("Created module: "+this.name);
    +234 
    +235             if ( this.callback ) {
    +236                 this.callback();
    +237             }
    +238 
    +239         }
    +240     };
    +241 
    +242     var ScriptFile= function(path, module) {
    +243         this.path= path;
    +244         this.module= module;
    +245         return this;
    +246     }
    +247 
    +248     ScriptFile.prototype= {
    +249         path : null,
    +250         processed: false,
    +251         module: null,
    +252 
    +253         setProcessed : function() {
    +254             this.processed= true;
    +255         },
    +256 
    +257         isProcessed : function() {
    +258             return this.processed;
    +259         }
    +260     };
    +261 
    +262     var ModuleManager= function() {
    +263         this.nodes= [];
    +264         this.loadedFiles= [];
    +265         this.path= {};
    +266         this.solveListener= [];
    +267         this.orderedSolvedModules= [];
    +268         this.readyListener= [];
    +269 
    +270         return this;
    +271     };
    +272 
    +273     ModuleManager.baseURL= "";
    +274     ModuleManager.modulePath= {};
    +275     ModuleManager.sortedModulePath= [];
    +276     ModuleManager.symbol= {};
    +277 
    +278     ModuleManager.prototype= {
    +279 
    +280         nodes:      null,           // built nodes.
    +281         loadedFiles:null,           // list of loaded files. avoid loading each file more than once
    +282         solveListener: null,        // listener for a module solved
    +283         readyListener: null,        // listener for all modules solved
    +284         orderedSolvedModules: null, // order in which modules where solved.
    +285 
    +286         addSolvedListener : function( modulename, callback ) {
    +287             this.solveListener.push( {
    +288                 name : modulename,
    +289                 callback : callback
    +290             });
    +291         },
    +292 
    +293         solved : function( module ) {
    +294             var i;
    +295 
    +296             for( i=0; i<this.solveListener.length; i++ ) {
    +297                 if ( this.solveListener[i].name===module.name) {
    +298                     this.solveListener[i].callback();
    +299                 }
    +300             }
    +301 
    +302             this.orderedSolvedModules.push( module );
    +303 
    +304             this.notifyReady();
    +305         },
    +306 
    +307         notifyReady : function() {
    +308             var i;
    +309 
    +310             for( i=0; i<this.nodes.length; i++ ) {
    +311                 if ( !this.nodes[i].isSolved() ) {
    +312                     return;
    +313                 }
    +314             }
    +315 
    +316             // if there's any pending files to be processed, still not notify about being solved.
    +317             for( i=0; i<this.loadedFiles.length; i++ ) {
    +318                 if ( !this.loadedFiles[i].isProcessed() ) {
    +319                     // aun hay ficheros sin procesar, no notificar.
    +320                     return;
    +321                 }
    +322             }
    +323 
    +324             /**
    +325              * Make ModuleManager.bring reentrant.
    +326              */
    +327             var me= this;
    +328             var arr= Array.prototype.slice.call(this.readyListener);
    +329             setTimeout( function() {
    +330                 for( var i=0; i<arr.length; i++ ) {
    +331                     arr[i]();
    +332                 }
    +333             }, 0 );
    +334 
    +335             this.readyListener= [];
    +336         },
    +337 
    +338         status : function() {
    +339             for( var i=0; i<this.nodes.length; i++ ) {
    +340                 this.nodes[i].status();
    +341             }
    +342         },
    +343 
    +344         module : function( obj ) {//name, dependencies, callback ) {
    +345 
    +346             var node, nnode, i;
    +347 
    +348             if ( this.isModuleScheduledToSolve( obj.defines ) ) {
    +349 //                console.log("Discarded module: "+obj.class+" (already loaded)");
    +350                 return this;
    +351             }
    +352 
    +353             if ( obj.onPreCreate ) {
    +354 //                console.log("  --> "+obj.defines+" onPrecreation");
    +355                 try {
    +356                     obj.onPreCreate();
    +357                 } catch(e) {
    +358                     console.log("  -> catched "+e+" on module "+obj.defines+" preCreation.");
    +359                 }
    +360             }
    +361 
    +362             if (!obj.depends ) {
    +363                 obj.depends= [];
    +364             }
    +365 
    +366             var dependencies= obj.depends;
    +367 
    +368             if ( dependencies ) {
    +369                 if ( !isArray(dependencies) ) {
    +370                     dependencies= [ dependencies ];
    +371                     obj.depends= dependencies;
    +372                 }
    +373             }
    +374 
    +375             // elimina dependencias ya resueltas en otras cargas.
    +376             i=0;
    +377             while( i<dependencies.length ) {
    +378                 if ( this.alreadySolved( dependencies[i] ) ) {
    +379                      dependencies.splice(i,1);
    +380                 } else {
    +381                     i++;
    +382                 }
    +383             }
    +384 
    +385             nnode= new Node( obj );
    +386 
    +387             // asignar nuevo nodo a quien lo tenga como dependencia.
    +388             for( var i=0; i<this.nodes.length; i++ ) {
    +389                 this.nodes[i].assignDependency(nnode);
    +390             }
    +391             this.nodes.push( nnode );
    +392 
    +393             /**
    +394              * Making dependency resolution a two step process will allow us to pack all modules into one
    +395              * single file so that the module manager does not have to load external files.
    +396              * Useful when CAAt has been packed into one single bundle.
    +397              */
    +398 
    +399             /**
    +400              * remove already loaded modules dependencies.
    +401              */
    +402             for( i=0; i<obj.depends.length;  ) {
    +403 
    +404                 if ( this.isModuleScheduledToSolve( obj.depends[i] ) ) {
    +405                     var dep= this.findNode( obj.depends[i] );
    +406                     if ( null!==dep ) {
    +407                         nnode.assignDependency( dep );
    +408                     } else {
    +409                         //// ERRR
    +410                         alert("Module loaded and does not exist in loaded modules nodes. "+obj.depends[i]);
    +411                         i++;
    +412                     }
    +413                 } else {
    +414                     i+=1;
    +415                 }
    +416             }
    +417 
    +418             /**
    +419              * now, for the rest of non solved dependencies, load their files.
    +420              */
    +421             (function(mm, obj) {
    +422                 setTimeout( function() {
    +423                     for( i=0; i<obj.depends.length; i++ ) {
    +424                         mm.loadFile( obj.depends[i] );
    +425                     }
    +426                 }, 0 );
    +427             })(this, obj);
    +428 
    +429             return this;
    +430 
    +431         },
    +432 
    +433         findNode : function( name ) {
    +434             for( var i=0; i<this.nodes.length; i++ ) {
    +435                 if ( this.nodes[i].name===name ) {
    +436                     return this.nodes[i];
    +437                 }
    +438             }
    +439 
    +440             return null;
    +441         } ,
    +442 
    +443         alreadySolved : function( name ) {
    +444             for( var i= 0; i<this.nodes.length; i++ ) {
    +445                 if ( this.nodes[i].name===name && this.nodes[i].isSolved() ) {
    +446                     return true;
    +447                 }
    +448             }
    +449 
    +450             return false;
    +451         },
    +452 
    +453         exists : function(path) {
    +454             var path= path.split(".");
    +455             var root= global;
    +456 
    +457             for( var i=0; i<path.length; i++ ) {
    +458                 if (!root[path[i]]) {
    +459                     return false;
    +460                 }
    +461 
    +462                 root= root[path[i]];
    +463             }
    +464 
    +465             return true;
    +466         },
    +467 
    +468         loadFile : function( module ) {
    +469 
    +470 
    +471             if (this.exists(module)) {
    +472                 return;
    +473             }
    +474 
    +475             var path= this.getPath( module );
    +476 
    +477             // avoid loading any js file more than once.
    +478             for( var i=0; i<this.loadedFiles.length; i++ ) {
    +479                 if ( this.loadedFiles[i].path===path ) {
    +480                     return;
    +481                 }
    +482             }
    +483 
    +484             var sf= new ScriptFile( path, module );
    +485             this.loadedFiles.push( sf );
    +486 
    +487             var node= document.createElement("script");
    +488             node.type = 'text/javascript';
    +489             node.charset = 'utf-8';
    +490             node.async = true;
    +491             node.addEventListener('load', this.moduleLoaded.bind(this), false);
    +492             node.addEventListener('error', this.moduleErrored.bind(this), false);
    +493             node.setAttribute('module-name', module);
    +494             node.src = path+(!DEBUG ? "?"+(new Date().getTime()) : "");
    +495 
    +496             document.getElementsByTagName('head')[0].appendChild( node );
    +497 
    +498         },
    +499 
    +500         /**
    +501          * Resolve a module name.
    +502          *
    +503          *  + if the module ends with .js
    +504          *    if starts with /, return as is.
    +505          *    else reppend baseURL and return.
    +506          *
    +507          * @param module
    +508          */
    +509         getPath : function( module ) {
    +510 
    +511             // endsWith
    +512             if ( module.endsWith(".js") ) {
    +513                 if ( module.charAt(0)!=="/" ) {
    +514                     module= ModuleManager.baseURL+module;
    +515                 } else {
    +516                     module= module.substring(1);
    +517                 }
    +518                 return module;
    +519             }
    +520 
    +521             var i, symbol;
    +522 
    +523             for( symbol in ModuleManager.symbol ) {
    +524                 if ( module===symbol ) {
    +525                     return  ModuleManager.baseURL + ModuleManager.symbol[symbol];
    +526                 }
    +527             }
    +528 
    +529             //for( var modulename in ModuleManager.modulePath ) {
    +530             for( i=0; i<ModuleManager.sortedModulePath.length; i++ ) {
    +531                 var modulename= ModuleManager.sortedModulePath[i];
    +532 
    +533                 if ( ModuleManager.modulePath.hasOwnProperty(modulename) ) {
    +534                     var path= ModuleManager.modulePath[modulename];
    +535 
    +536                     // startsWith
    +537                     if ( module.indexOf(modulename)===0 ) {
    +538                         // +1 to skip '.' class separator.
    +539                         var nmodule= module.substring(modulename.length + 1);
    +540 
    +541                         /**
    +542                          * Avoid name clash:
    +543                          * CAAT.Foundation and CAAT.Foundation.Timer will both be valid for
    +544                          * CAAT.Foundation.Timer.TimerManager module.
    +545                          * So in the end, the module name can't have '.' after chopping the class
    +546                          * namespace.
    +547                          */
    +548 
    +549                         nmodule= nmodule.replace(/\./g,"/");
    +550 
    +551                         //if ( nmodule.indexOf(".")===-1 ) {
    +552                             nmodule= path+nmodule+".js";
    +553                             return ModuleManager.baseURL + nmodule;
    +554                         //}
    +555                     }
    +556                 }
    +557             }
    +558 
    +559             // what's that ??!?!?!?
    +560             return ModuleManager.baseURL + module.replace(/\./g,"/") + ".js";
    +561         },
    +562 
    +563         isModuleScheduledToSolve : function( name ) {
    +564             for( var i=0; i<this.nodes.length; i++ ) {
    +565                 if ( this.nodes[i].name===name ) {
    +566                     return true;
    +567                 }
    +568             }
    +569             return false;
    +570         },
    +571 
    +572         moduleLoaded : function(e) {
    +573             if (e.type==="load") {
    +574 
    +575                 var node = e.currentTarget || e.srcElement || e.target;
    +576                 var mod= node.getAttribute("module-name");
    +577 
    +578                 // marcar fichero de modulo como procesado.
    +579                 for( var i=0; i<this.loadedFiles.length; i++ ) {
    +580                     if ( this.loadedFiles[i].module===mod ) {
    +581                         this.loadedFiles[i].setProcessed();
    +582                         break;
    +583                     }
    +584                 }
    +585 
    +586                 for( var i=0; i<this.nodes.length; i++ ) {
    +587                     this.nodes[i].removeDependency( mod );
    +588                 }
    +589 
    +590                 for( var i=0; i<this.nodes.length; i++ ) {
    +591                     for( var j=0; j<this.nodes.length; j++ ) {
    +592                         this.nodes[j].visited= false;
    +593                     }
    +594                     this.nodes[i].solveDeep();
    +595                 }
    +596 
    +597                 /**
    +598                  * Despues de cargar un fichero, este puede contener un modulo o no.
    +599                  * Si todos los ficheros que se cargan fueran bibliotecas, nunca se pasaria de aqui porque
    +600                  * no se hace una llamada a solveDeep, y notificacion a solved, y de ahí a notifyReady.
    +601                  * Por eso se hace aqui una llamada a notifyReady, aunque pueda ser redundante.
    +602                  */
    +603                 var me= this;
    +604                 setTimeout(function() {
    +605                     me.notifyReady();
    +606                 }, 0 );
    +607             }
    +608         },
    +609 
    +610         moduleErrored : function(e) {
    +611             var node = e.currentTarget || e.srcElement;
    +612             console.log("Error loading module: "+ node.getAttribute("module-name") );
    +613         },
    +614 
    +615         solvedInOrder : function() {
    +616             for( var i=0; i<this.orderedSolvedModules.length; i++ ) {
    +617                 console.log(this.orderedSolvedModules[i].name);
    +618             }
    +619         },
    +620 
    +621         solveAll : function() {
    +622             for( var i=0; i<this.nodes.length; i++ ) {
    +623                 this.nodes[i].solveDeep();
    +624             }
    +625         },
    +626 
    +627         onReady : function( f ) {
    +628             this.readyListener.push(f);
    +629         }
    +630 
    +631     };
    +632 
    +633     function ensureNamespace( qualifiedClassName ) {
    +634         var ns= qualifiedClassName.split(".");
    +635         var _global= global;
    +636         var ret= null;
    +637         for( var i=0; i<ns.length-1; i++ ) {
    +638             if ( !_global[ns[i]] ) {
    +639                 _global[ns[i]]= {};
    +640             }
    +641             _global= _global[ns[i]];
    +642             ret= _global;
    +643         }
    +644 
    +645         return ret;
    +646     }
    +647 
    +648     /**
    +649      *
    +650      * Create a namespace object from a string.
    +651      *
    +652      * @param namespace {string}
    +653      * @param obj {object}
    +654      * @return {object} the namespace object
    +655      */
    +656     function assignNamespace( namespace, obj ) {
    +657         var ns= namespace.split(".");
    +658         var _global= global;
    +659         for( var i=0; i<ns.length-1; i++ ) {
    +660             if ( !_global[ns[i]] ) {
    +661                 console.log("    Error assigning value to namespace :"+namespace+". '"+ns[i]+"' does not exist.");
    +662                 return null;
    +663             }
    +664 
    +665             _global= _global[ns[i]];
    +666         }
    +667 
    +668         _global[ ns[ns.length-1] ]= obj;
    +669 
    +670         return _global[ ns[ns.length-1] ];
    +671     }
    +672 
    +673     function findClass( qualifiedClassName ) {
    +674         var ns= qualifiedClassName.split(".");
    +675         var _global= global;
    +676         for( var i=0; i<ns.length; i++ ) {
    +677             if ( !_global[ns[i]] ) {
    +678                 return null;
    +679             }
    +680 
    +681             _global= _global[ns[i]];
    +682         }
    +683 
    +684         return _global;
    +685     }
    +686 
    +687     var mm= new ModuleManager();
    +688     var DEBUG= false;
    +689 
    +690 
    +691     /**
    +692      * CAAT is the namespace for all CAAT gaming engine object classes.
    +693      *
    +694      * @name CAAT
    +695      * @namespace
    +696      */
    +697 
    +698     if ( typeof(__obj_namespace)==="undefined" ) {
    +699         __obj_namespace= (window.CAAT = window.CAAT || {} );
    +700     }
    +701 
    +702     NS= __obj_namespace;
    +703 
    +704 //    global.CAAT= global.CAAT || {};
    +705 
    +706     /**
    +707      *
    +708      * This function defines CAAT modules, and creates Constructor Class objects.
    +709      *
    +710      * obj parameter has the following structure:
    +711      * {
    +712      *   defines{string},           // class name
    +713      *   depends{Array<string>=},   // dependencies class names
    +714      *   extendsClass{string},      // class to extend from
    +715      *   extensdWith{object},       // actual prototype to extend
    +716      *   aliases{Array<string>}     // other class names
    +717      * }
    +718      *
    +719      * @name Module
    +720      * @memberof CAAT
    +721      * @static
    +722      *
    +723      * @param obj {object}
    +724      */
    +725     NS.Module= function loadModule(obj) {
    +726 
    +727         if (!obj.defines) {
    +728             console.error("Bad module definition: "+obj);
    +729             return;
    +730         }
    +731 
    +732         ensureNamespace(obj.defines);
    +733 
    +734         mm.module( obj );
    +735 
    +736     };
    +737 
    +738     /**
    +739      * @name ModuleManager
    +740      * @memberOf CAAT
    +741      * @namespace
    +742      */
    +743     NS.ModuleManager= {};
    +744 
    +745     /**
    +746      * Define global base position for modules structure.
    +747      * @param baseURL {string}
    +748      * @return {*}
    +749      */
    +750     NS.ModuleManager.baseURL= function(baseURL) {
    +751 
    +752         if ( !baseURL ) {
    +753             return NS.Module;
    +754         }
    +755 
    +756         if (!baseURL.endsWith("/") ) {
    +757             baseURL= baseURL + "/";
    +758         }
    +759 
    +760         ModuleManager.baseURL= baseURL;
    +761         return NS.ModuleManager;
    +762     };
    +763 
    +764     /**
    +765      * Define a module path. Multiple module paths can be specified.
    +766      * @param module {string}
    +767      * @param path {string}
    +768      */
    +769     NS.ModuleManager.setModulePath= function( module, path ) {
    +770 
    +771         if ( !path.endsWith("/") ) {
    +772             path= path + "/";
    +773         }
    +774 
    +775         if ( !ModuleManager.modulePath[module] ) {
    +776             ModuleManager.modulePath[ module ]= path;
    +777 
    +778             ModuleManager.sortedModulePath.push( module );
    +779 
    +780             /**
    +781              * Sort function so that CAAT.AB is below CAAT.AB.CD
    +782              */
    +783             ModuleManager.sortedModulePath.sort( function(a,b) {
    +784                 if (a==b) {
    +785                     return 0;
    +786                 }
    +787                 return a<b ? 1 : -1;
    +788             } );
    +789         }
    +790         return NS.ModuleManager;
    +791     };
    +792 
    +793     /**
    +794      * Define a symbol, or file to be loaded and checked dependencies against.
    +795      * @param symbol {string}
    +796      * @param path {string}
    +797      * @return {*}
    +798      */
    +799     NS.ModuleManager.symbol= function( symbol, path ) {
    +800 
    +801         if ( !ModuleManager.symbol[symbol] ) {
    +802             ModuleManager.symbol[symbol]= path;
    +803         }
    +804 
    +805         return NS.ModuleManager;
    +806     };
    +807 
    +808     /**
    +809      * Bring the given object, and if no present, start solving and loading dependencies.
    +810      * @param file {string}
    +811      * @return {*}
    +812      */
    +813     NS.ModuleManager.bring= function( file ) {
    +814 
    +815         if ( !isArray(file) ) {
    +816             file= [file];
    +817         }
    +818 
    +819         for( var i=0; i<file.length; i++ ) {
    +820             mm.loadFile( file[i] );
    +821         }
    +822 
    +823         return NS.ModuleManager;
    +824     };
    +825 
    +826     /**
    +827      * Get CAAT´s module manager status.
    +828      */
    +829     NS.ModuleManager.status= function() {
    +830         mm.status();
    +831     }
    +832 
    +833     /**
    +834      * Add an observer for a given module load event.
    +835      * @param modulename {string}
    +836      * @param callback {function()}
    +837      * @return {*}
    +838      */
    +839     NS.ModuleManager.addModuleSolvedListener= function(modulename,callback) {
    +840         mm.addSolveListener( modulename, callback );
    +841         return NS.ModuleManager;
    +842     }
    +843 
    +844     /**
    +845      * Load a javascript file.
    +846      * @param file {string}
    +847      * @param onload {function()}
    +848      * @param onerror {function()}
    +849      */
    +850     NS.ModuleManager.load= function(file, onload, onerror) {
    +851         var node= document.createElement("script");
    +852         node.type = 'text/javascript';
    +853         node.charset = 'utf-8';
    +854         node.async = true;
    +855         if ( onload ) {
    +856             node.addEventListener('load', onload, false);
    +857         }
    +858         if ( onerror ) {
    +859             node.addEventListener('error', onerror, false);
    +860         }
    +861 
    +862         node.addEventListener("load", function( ) {
    +863             mm.solveAll();
    +864         }, false);
    +865 
    +866         node.src = file+(!DEBUG ? "?"+(new Date().getTime()) : "");
    +867 
    +868         document.getElementsByTagName('head')[0].appendChild( node );
    +869 
    +870         // maybe this file has all the modules needed so no more file loading/module resolution must be performed.
    +871 
    +872     }
    +873 
    +874     /**
    +875      * Dump solved modules and get them sorted in the order they were resolved.
    +876      */
    +877     NS.ModuleManager.solvedInOrder= function() {
    +878         mm.solvedInOrder();
    +879     }
    +880 
    +881     /**
    +882      * This method will be called everytime all the specified to-be-brought dependencies have been solved.
    +883      * @param f
    +884      * @return {*}
    +885      */
    +886     NS.ModuleManager.onReady= function(f) {
    +887         mm.onReady(f);
    +888         return NS.ModuleManager;
    +889     }
    +890 
    +891     /**
    +892      * Solve all elements specified in the module loaded.
    +893      * It is useful when minimizing a file.
    +894      */
    +895     NS.ModuleManager.solveAll= function() {
    +896         mm.solveAll();
    +897     }
    +898 
    +899     /**
    +900      * Enable debug capabilities for the loaded modules.
    +901      * Otherwise, the modules will have cache invalidation features.
    +902      * @param d {boolean}
    +903      * @return {*}
    +904      */
    +905     NS.ModuleManager.debug= function(d) {
    +906         DEBUG= d;
    +907         return NS.ModuleManager;
    +908     }
    +909 
    +910     /**
    +911      * @name Class
    +912      * @memberOf CAAT
    +913      * @constructor
    +914      */
    +915     NS.Class= Class;
    +916 
    +917 })(this, undefined);
    +918 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_AnimationLoop.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_AnimationLoop.js.html new file mode 100644 index 00000000..04b3cc8f --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_AnimationLoop.js.html @@ -0,0 +1,219 @@ +
      1 CAAT.Module({
    +  2     defines:"CAAT.Event.AnimationLoop",
    +  3     onCreate : function() {
    +  4 
    +  5         /**
    +  6          * @lends CAAT
    +  7          */
    +  8 
    +  9         /**
    + 10          * if RAF, this value signals end of RAF.
    + 11          * @type {Boolean}
    + 12          */
    + 13         CAAT.ENDRAF=false;
    + 14 
    + 15         /**
    + 16          * if setInterval, this value holds CAAT.setInterval return value.
    + 17          * @type {null}
    + 18          */
    + 19         CAAT.INTERVAL_ID=null;
    + 20 
    + 21         /**
    + 22          * Boolean flag to determine if CAAT.loop has already been called.
    + 23          * @type {Boolean}
    + 24          */
    + 25         CAAT.renderEnabled=false;
    + 26 
    + 27         /**
    + 28          * expected FPS when using setInterval animation.
    + 29          * @type {Number}
    + 30          */
    + 31         CAAT.FPS=60;
    + 32 
    + 33         /**
    + 34          * Use RAF shim instead of setInterval. Set to != 0 to use setInterval.
    + 35          * @type {Number}
    + 36          */
    + 37         CAAT.NO_RAF=0;
    + 38 
    + 39         /**
    + 40          * debug panel update time.
    + 41          * @type {Number}
    + 42          */
    + 43         CAAT.FPS_REFRESH=500;
    + 44 
    + 45         /**
    + 46          * requestAnimationFrame time reference.
    + 47          * @type {Number}
    + 48          */
    + 49         CAAT.RAF=0;
    + 50 
    + 51         /**
    + 52          * time between two consecutive RAF. usually bigger than FRAME_TIME
    + 53          * @type {Number}
    + 54          */
    + 55         CAAT.REQUEST_ANIMATION_FRAME_TIME=0;
    + 56 
    + 57         /**
    + 58          * time between two consecutive setInterval calls.
    + 59          * @type {Number}
    + 60          */
    + 61         CAAT.SET_INTERVAL=0;
    + 62 
    + 63         /**
    + 64          * time to process one frame.
    + 65          * @type {Number}
    + 66          */
    + 67         CAAT.FRAME_TIME=0;
    + 68 
    + 69         /**
    + 70          * Current animated director.
    + 71          * @type {CAAT.Foundation.Director}
    + 72          */
    + 73         CAAT.currentDirector=null;
    + 74 
    + 75         /**
    + 76          * Registered director objects.
    + 77          * @type {Array}
    + 78          */
    + 79         CAAT.director=[];
    + 80 
    + 81         /**
    + 82          * Register and keep track of every CAAT.Director instance in the document.
    + 83          */
    + 84         CAAT.RegisterDirector=function (director) {
    + 85             if (!CAAT.currentDirector) {
    + 86                 CAAT.currentDirector = director;
    + 87             }
    + 88             CAAT.director.push(director);
    + 89         };
    + 90 
    + 91         /**
    + 92          * Return current scene.
    + 93          * @return {CAAT.Foundation.Scene}
    + 94          */
    + 95         CAAT.getCurrentScene=function () {
    + 96             return CAAT.currentDirector.getCurrentScene();
    + 97         };
    + 98 
    + 99         /**
    +100          * Return current director's current scene's time.
    +101          * The way to go should be keep local scene references, but anyway, this function is always handy.
    +102          * @return {number} current scene's virtual time.
    +103          */
    +104         CAAT.getCurrentSceneTime=function () {
    +105             return CAAT.currentDirector.getCurrentScene().time;
    +106         };
    +107 
    +108         /**
    +109          * Stop animation loop.
    +110          */
    +111         CAAT.endLoop=function () {
    +112             if (CAAT.NO_RAF) {
    +113                 if (CAAT.INTERVAL_ID !== null) {
    +114                     clearInterval(CAAT.INTERVAL_ID);
    +115                 }
    +116             } else {
    +117                 CAAT.ENDRAF = true;
    +118             }
    +119 
    +120             CAAT.renderEnabled = false;
    +121         };
    +122 
    +123         /**
    +124          * Main animation loop entry point.
    +125          * Must called only once, or only after endLoop.
    +126          *
    +127          * @param fps {number} desired fps. fps parameter will only be used if CAAT.NO_RAF is specified, that is
    +128          * switch from RequestAnimationFrame to setInterval for animation loop.
    +129          */
    +130         CAAT.loop=function (fps) {
    +131             if (CAAT.renderEnabled) {
    +132                 return;
    +133             }
    +134 
    +135             for (var i = 0, l = CAAT.director.length; i < l; i++) {
    +136                 CAAT.director[i].timeline = new Date().getTime();
    +137             }
    +138 
    +139             CAAT.FPS = fps || 60;
    +140             CAAT.renderEnabled = true;
    +141             if (CAAT.NO_RAF) {
    +142                 CAAT.INTERVAL_ID = setInterval(
    +143                     function () {
    +144                         var t = new Date().getTime();
    +145 
    +146                         for (var i = 0, l = CAAT.director.length; i < l; i++) {
    +147                             var dr = CAAT.director[i];
    +148                             if (dr.renderMode === CAAT.Foundation.Director.RENDER_MODE_CONTINUOUS || dr.needsRepaint) {
    +149                                 dr.renderFrame();
    +150                             }
    +151                         }
    +152 
    +153                         CAAT.FRAME_TIME = t - CAAT.SET_INTERVAL;
    +154 
    +155                         if (CAAT.RAF) {
    +156                             CAAT.REQUEST_ANIMATION_FRAME_TIME = new Date().getTime() - CAAT.RAF;
    +157                         }
    +158                         CAAT.RAF = new Date().getTime();
    +159 
    +160                         CAAT.SET_INTERVAL = t;
    +161 
    +162                     },
    +163                     1000 / CAAT.FPS
    +164                 );
    +165             } else {
    +166                 CAAT.renderFrameRAF();
    +167             }
    +168         };
    +169         
    +170         CAAT.renderFrameRAF= function (now) {
    +171             var c= CAAT;
    +172 
    +173             if (c.ENDRAF) {
    +174                 c.ENDRAF = false;
    +175                 return;
    +176             }
    +177 
    +178             if (!now) now = new Date().getTime();
    +179 
    +180             var t= new Date().getTime();
    +181             c.REQUEST_ANIMATION_FRAME_TIME = c.RAF ? now - c.RAF : 16;
    +182             for (var i = 0, l = c.director.length; i < l; i++) {
    +183                 c.director[i].renderFrame();
    +184             }
    +185             c.RAF = now;
    +186             c.FRAME_TIME = new Date().getTime() - t;
    +187 
    +188 
    +189             window.requestAnimFrame(c.renderFrameRAF, 0);
    +190         };
    +191         
    +192         /**
    +193          * Polyfill for requestAnimationFrame.
    +194          */
    +195         window.requestAnimFrame = (function () {
    +196             return  window.requestAnimationFrame ||
    +197                 window.webkitRequestAnimationFrame ||
    +198                 window.mozRequestAnimationFrame ||
    +199                 window.oRequestAnimationFrame ||
    +200                 window.msRequestAnimationFrame ||
    +201                 function raf(/* function */ callback, /* DOMElement */ element) {
    +202                     window.setTimeout(callback, 1000 / CAAT.FPS);
    +203                 };
    +204         })();        
    +205     },
    +206 
    +207     extendsWith:function () {
    +208         return {
    +209         };
    +210     }
    +211 });
    +212 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_Input.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_Input.js.html new file mode 100644 index 00000000..ea36b441 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_Input.js.html @@ -0,0 +1,216 @@ +
      1 CAAT.Module( {
    +  2     defines : "CAAT.Event.Input",
    +  3     depends : [
    +  4         "CAAT.Event.KeyEvent",
    +  5         "CAAT.Event.MouseEvent",
    +  6         "CAAT.Event.TouchEvent"
    +  7     ],
    +  8     onCreate : function() {
    +  9 
    + 10         /**
    + 11          * @lends CAAT
    + 12          */
    + 13 
    + 14         /**
    + 15          * Set the cursor.
    + 16          * @param cursor
    + 17          */
    + 18         CAAT.setCursor= function(cursor) {
    + 19             if ( navigator.browser!=='iOS' ) {
    + 20                 document.body.style.cursor= cursor;
    + 21             }
    + 22         };
    + 23 
    + 24 
    + 25         /**
    + 26          * Constant to set touch behavior as single touch, compatible with mouse.
    + 27          * @type {Number}
    + 28          * @constant
    + 29          */
    + 30         CAAT.TOUCH_AS_MOUSE=        1;
    + 31 
    + 32         /**
    + 33          * Constant to set CAAT touch behavior as multitouch.
    + 34          * @type {Number}
    + 35          * @contant
    + 36          */
    + 37         CAAT.TOUCH_AS_MULTITOUCH=   2;
    + 38 
    + 39         /**
    + 40          * Set CAAT touch behavior as single or multi touch.
    + 41          * @type {Number}
    + 42          */
    + 43         CAAT.TOUCH_BEHAVIOR= CAAT.TOUCH_AS_MOUSE;
    + 44 
    + 45         /**
    + 46          * Array of window resize listeners.
    + 47          * @type {Array}
    + 48          */
    + 49         CAAT.windowResizeListeners= [];
    + 50 
    + 51         /**
    + 52          * Register a function callback as window resize listener.
    + 53          * @param f
    + 54          */
    + 55         CAAT.registerResizeListener= function(f) {
    + 56             CAAT.windowResizeListeners.push(f);
    + 57         };
    + 58 
    + 59         /**
    + 60          * Remove a function callback as window resize listener.
    + 61          * @param director
    + 62          */
    + 63         CAAT.unregisterResizeListener= function(director) {
    + 64             for( var i=0; i<CAAT.windowResizeListeners.length; i++ ) {
    + 65                 if ( director===CAAT.windowResizeListeners[i] ) {
    + 66                     CAAT.windowResizeListeners.splice(i,1);
    + 67                     return;
    + 68                 }
    + 69             }
    + 70         };
    + 71 
    + 72         /**
    + 73          * Aray of Key listeners.
    + 74          */
    + 75         CAAT.keyListeners= [];
    + 76 
    + 77         /**
    + 78          * Register a function callback as key listener.
    + 79          * @param f
    + 80          */
    + 81         CAAT.registerKeyListener= function(f) {
    + 82             CAAT.keyListeners.push(f);
    + 83         };
    + 84 
    + 85         /**
    + 86          * Acceleration data.
    + 87          * @type {Object}
    + 88          */
    + 89         CAAT.accelerationIncludingGravity= {
    + 90             x:0,
    + 91             y:0,
    + 92             z:0
    + 93         };
    + 94 
    + 95         /**
    + 96          * Device motion angles.
    + 97          * @type {Object}
    + 98          */
    + 99         CAAT.rotationRate= {
    +100             alpha: 0,
    +101             beta:0,
    +102             gamma: 0 };
    +103 
    +104         /**
    +105          * Enable device motion events.
    +106          * This function does not register a callback, instear it sets
    +107          * CAAT.rotationRate and CAAt.accelerationIncludingGravity values.
    +108          */
    +109         CAAT.enableDeviceMotion= function() {
    +110 
    +111             CAAT.prevOnDeviceMotion=    null;   // previous accelerometer callback function.
    +112             CAAT.onDeviceMotion=        null;   // current accelerometer callback set for CAAT.
    +113 
    +114             function tilt(data) {
    +115                 CAAT.rotationRate= {
    +116                         alpha : 0,
    +117                         beta  : data[0],
    +118                         gamma : data[1]
    +119                     };
    +120             }
    +121 
    +122             if (window.DeviceOrientationEvent) {
    +123                 window.addEventListener("deviceorientation", function (event) {
    +124                     tilt([event.beta, event.gamma]);
    +125                 }, true);
    +126             } else if (window.DeviceMotionEvent) {
    +127                 window.addEventListener('devicemotion', function (event) {
    +128                     tilt([event.acceleration.x * 2, event.acceleration.y * 2]);
    +129                 }, true);
    +130             } else {
    +131                 window.addEventListener("MozOrientation", function (event) {
    +132                     tilt([-event.y * 45, event.x * 45]);
    +133                 }, true);
    +134             }
    +135 
    +136         };
    +137 
    +138 
    +139         /**
    +140          * Enable window level input events, keys and redimension.
    +141          */
    +142         window.addEventListener('keydown',
    +143             function(evt) {
    +144                 var key = (evt.which) ? evt.which : evt.keyCode;
    +145 
    +146                 if ( key===CAAT.SHIFT_KEY ) {
    +147                     CAAT.KEY_MODIFIERS.shift= true;
    +148                 } else if ( key===CAAT.CONTROL_KEY ) {
    +149                     CAAT.KEY_MODIFIERS.control= true;
    +150                 } else if ( key===CAAT.ALT_KEY ) {
    +151                     CAAT.KEY_MODIFIERS.alt= true;
    +152                 } else {
    +153                     for( var i=0; i<CAAT.keyListeners.length; i++ ) {
    +154                         CAAT.keyListeners[i]( new CAAT.KeyEvent(
    +155                             key,
    +156                             'down',
    +157                             {
    +158                                 alt:        CAAT.KEY_MODIFIERS.alt,
    +159                                 control:    CAAT.KEY_MODIFIERS.control,
    +160                                 shift:      CAAT.KEY_MODIFIERS.shift
    +161                             },
    +162                             evt)) ;
    +163                     }
    +164                 }
    +165             },
    +166             false);
    +167 
    +168         window.addEventListener('keyup',
    +169             function(evt) {
    +170 
    +171                 var key = (evt.which) ? evt.which : evt.keyCode;
    +172                 if ( key===CAAT.SHIFT_KEY ) {
    +173                     CAAT.KEY_MODIFIERS.shift= false;
    +174                 } else if ( key===CAAT.CONTROL_KEY ) {
    +175                     CAAT.KEY_MODIFIERS.control= false;
    +176                 } else if ( key===CAAT.ALT_KEY ) {
    +177                     CAAT.KEY_MODIFIERS.alt= false;
    +178                 } else {
    +179 
    +180                     for( var i=0; i<CAAT.keyListeners.length; i++ ) {
    +181                         CAAT.keyListeners[i]( new CAAT.KeyEvent(
    +182                             key,
    +183                             'up',
    +184                             {
    +185                                 alt:        CAAT.KEY_MODIFIERS.alt,
    +186                                 control:    CAAT.KEY_MODIFIERS.control,
    +187                                 shift:      CAAT.KEY_MODIFIERS.shift
    +188                             },
    +189                             evt));
    +190                     }
    +191                 }
    +192             },
    +193             false );
    +194 
    +195         window.addEventListener('resize',
    +196             function(evt) {
    +197                 for( var i=0; i<CAAT.windowResizeListeners.length; i++ ) {
    +198                     CAAT.windowResizeListeners[i].windowResized(
    +199                             window.innerWidth,
    +200                             window.innerHeight);
    +201                 }
    +202             },
    +203             false);
    +204 
    +205     },
    +206     extendsWith : {
    +207     }
    +208 });
    +209 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_KeyEvent.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_KeyEvent.js.html new file mode 100644 index 00000000..c4751384 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_KeyEvent.js.html @@ -0,0 +1,241 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name Event
    +  5      * @memberOf CAAT
    +  6      * @namespace
    +  7      */
    +  8 
    +  9     /**
    + 10      * @name KeyEvent
    + 11      * @memberOf CAAT.Event
    + 12      * @constructor
    + 13      */
    + 14 
    + 15     /**
    + 16      * @name KEYS
    + 17      * @memberOf CAAT
    + 18      * @namespace
    + 19      */
    + 20 
    + 21     /**
    + 22      * @name KEY_MODIFIERS
    + 23      * @memberOf CAAT
    + 24      * @namespace
    + 25      */
    + 26 
    + 27     defines : "CAAT.Event.KeyEvent",
    + 28     aliases : "CAAT.KeyEvent",
    + 29     extendsWith : {
    + 30 
    + 31         /**
    + 32          * @lends CAAT.Event.KeyEvent.prototype
    + 33          */
    + 34 
    + 35         /**
    + 36          * Define a key event.
    + 37          * @param keyCode
    + 38          * @param up_or_down
    + 39          * @param modifiers
    + 40          * @param originalEvent
    + 41          */
    + 42         __init : function( keyCode, up_or_down, modifiers, originalEvent ) {
    + 43             this.keyCode= keyCode;
    + 44             this.action=  up_or_down;
    + 45             this.modifiers= modifiers;
    + 46             this.sourceEvent= originalEvent;
    + 47 
    + 48             this.preventDefault= function() {
    + 49                 this.sourceEvent.preventDefault();
    + 50             }
    + 51 
    + 52             this.getKeyCode= function() {
    + 53                 return this.keyCode;
    + 54             };
    + 55 
    + 56             this.getAction= function() {
    + 57                 return this.action;
    + 58             };
    + 59 
    + 60             this.modifiers= function() {
    + 61                 return this.modifiers;
    + 62             };
    + 63 
    + 64             this.isShiftPressed= function() {
    + 65                 return this.modifiers.shift;
    + 66             };
    + 67 
    + 68             this.isControlPressed= function() {
    + 69                 return this.modifiers.control;
    + 70             };
    + 71 
    + 72             this.isAltPressed= function() {
    + 73                 return this.modifiers.alt;
    + 74             };
    + 75 
    + 76             this.getSourceEvent= function() {
    + 77                 return this.sourceEvent;
    + 78             };
    + 79         }
    + 80     },
    + 81     onCreate : function() {
    + 82 
    + 83         /**
    + 84          * @lends CAAT
    + 85          */
    + 86 
    + 87         /**
    + 88          * Key codes
    + 89          * @type {enum}
    + 90          */
    + 91         CAAT.KEYS = {
    + 92 
    + 93             /** @const */ ENTER:13,
    + 94             /** @const */ BACKSPACE:8,
    + 95             /** @const */ TAB:9,
    + 96             /** @const */ SHIFT:16,
    + 97             /** @const */ CTRL:17,
    + 98             /** @const */ ALT:18,
    + 99             /** @const */ PAUSE:19,
    +100             /** @const */ CAPSLOCK:20,
    +101             /** @const */ ESCAPE:27,
    +102             /** @const */ PAGEUP:33,
    +103             /** @const */ PAGEDOWN:34,
    +104             /** @const */ END:35,
    +105             /** @const */ HOME:36,
    +106             /** @const */ LEFT:37,
    +107             /** @const */ UP:38,
    +108             /** @const */ RIGHT:39,
    +109             /** @const */ DOWN:40,
    +110             /** @const */ INSERT:45,
    +111             /** @const */ DELETE:46,
    +112             /** @const */ 0:48,
    +113             /** @const */ 1:49,
    +114             /** @const */ 2:50,
    +115             /** @const */ 3:51,
    +116             /** @const */ 4:52,
    +117             /** @const */ 5:53,
    +118             /** @const */ 6:54,
    +119             /** @const */ 7:55,
    +120             /** @const */ 8:56,
    +121             /** @const */ 9:57,
    +122             /** @const */ a:65,
    +123             /** @const */ b:66,
    +124             /** @const */ c:67,
    +125             /** @const */ d:68,
    +126             /** @const */ e:69,
    +127             /** @const */ f:70,
    +128             /** @const */ g:71,
    +129             /** @const */ h:72,
    +130             /** @const */ i:73,
    +131             /** @const */ j:74,
    +132             /** @const */ k:75,
    +133             /** @const */ l:76,
    +134             /** @const */ m:77,
    +135             /** @const */ n:78,
    +136             /** @const */ o:79,
    +137             /** @const */ p:80,
    +138             /** @const */ q:81,
    +139             /** @const */ r:82,
    +140             /** @const */ s:83,
    +141             /** @const */ t:84,
    +142             /** @const */ u:85,
    +143             /** @const */ v:86,
    +144             /** @const */ w:87,
    +145             /** @const */ x:88,
    +146             /** @const */ y:89,
    +147             /** @const */ z:90,
    +148             /** @const */ SELECT:93,
    +149             /** @const */ NUMPAD0:96,
    +150             /** @const */ NUMPAD1:97,
    +151             /** @const */ NUMPAD2:98,
    +152             /** @const */ NUMPAD3:99,
    +153             /** @const */ NUMPAD4:100,
    +154             /** @const */ NUMPAD5:101,
    +155             /** @const */ NUMPAD6:102,
    +156             /** @const */ NUMPAD7:103,
    +157             /** @const */ NUMPAD8:104,
    +158             /** @const */ NUMPAD9:105,
    +159             /** @const */ MULTIPLY:106,
    +160             /** @const */ ADD:107,
    +161             /** @const */ SUBTRACT:109,
    +162             /** @const */ DECIMALPOINT:110,
    +163             /** @const */ DIVIDE:111,
    +164             /** @const */ F1:112,
    +165             /** @const */ F2:113,
    +166             /** @const */ F3:114,
    +167             /** @const */ F4:115,
    +168             /** @const */ F5:116,
    +169             /** @const */ F6:117,
    +170             /** @const */ F7:118,
    +171             /** @const */ F8:119,
    +172             /** @const */ F9:120,
    +173             /** @const */ F10:121,
    +174             /** @const */ F11:122,
    +175             /** @const */ F12:123,
    +176             /** @const */ NUMLOCK:144,
    +177             /** @const */ SCROLLLOCK:145,
    +178             /** @const */ SEMICOLON:186,
    +179             /** @const */ EQUALSIGN:187,
    +180             /** @const */ COMMA:188,
    +181             /** @const */ DASH:189,
    +182             /** @const */ PERIOD:190,
    +183             /** @const */ FORWARDSLASH:191,
    +184             /** @const */ GRAVEACCENT:192,
    +185             /** @const */ OPENBRACKET:219,
    +186             /** @const */ BACKSLASH:220,
    +187             /** @const */ CLOSEBRAKET:221,
    +188             /** @const */ SINGLEQUOTE:222
    +189         };
    +190 
    +191         /**
    +192          * @deprecated
    +193          * @type {Object}
    +194          */
    +195         CAAT.Keys= CAAT.KEYS;
    +196 
    +197         /**
    +198          * Shift key code
    +199          * @type {Number}
    +200          */
    +201         CAAT.SHIFT_KEY=    16;
    +202 
    +203         /**
    +204          * Control key code
    +205          * @type {Number}
    +206          */
    +207         CAAT.CONTROL_KEY=  17;
    +208 
    +209         /**
    +210          * Alt key code
    +211          * @type {Number}
    +212          */
    +213         CAAT.ALT_KEY=      18;
    +214 
    +215         /**
    +216          * Enter key code
    +217          * @type {Number}
    +218          */
    +219         CAAT.ENTER_KEY=    13;
    +220 
    +221         /**
    +222          * Event modifiers.
    +223          * @type enum
    +224          */
    +225         CAAT.KEY_MODIFIERS= {
    +226 
    +227             /** @const */ alt:        false,
    +228             /** @const */ control:    false,
    +229             /** @const */ shift:      false
    +230         };
    +231     }
    +232 
    +233 });
    +234 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_MouseEvent.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_MouseEvent.js.html new file mode 100644 index 00000000..cac92d53 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_MouseEvent.js.html @@ -0,0 +1,116 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name MouseEvent
    +  5      * @memberOf CAAT.Event
    +  6      * @constructor
    +  7      */
    +  8 
    +  9     defines : "CAAT.Event.MouseEvent",
    + 10     aliases : ["CAAT.MouseEvent"],
    + 11     depends : [
    + 12         "CAAT.Math.Point"
    + 13     ],
    + 14     extendsWith : {
    + 15 
    + 16         /**
    + 17          * @lends CAAT.Event.MouseEvent.prototype
    + 18          */
    + 19 
    + 20         /**
    + 21          * Constructor delegate
    + 22          * @private
    + 23          */
    + 24         __init : function() {
    + 25             this.point= new CAAT.Math.Point(0,0,0);
    + 26             this.screenPoint= new CAAT.Math.Point(0,0,0);
    + 27             this.touches= [];
    + 28             return this;
    + 29         },
    + 30 
    + 31         /**
    + 32          * Original mouse/touch screen coord
    + 33          */
    + 34 		screenPoint:	null,
    + 35 
    + 36         /**
    + 37          * Transformed in-actor coordinate
    + 38          */
    + 39 		point:			null,
    + 40 
    + 41         /**
    + 42          * scene time when the event was triggered.
    + 43          */
    + 44 		time:			0,
    + 45 
    + 46         /**
    + 47          * Actor the event was produced in.
    + 48          */
    + 49 		source:			null,
    + 50 
    + 51         /**
    + 52          * Was shift pressed ?
    + 53          */
    + 54         shift:          false,
    + 55 
    + 56         /**
    + 57          * Was control pressed ?
    + 58          */
    + 59         control:        false,
    + 60 
    + 61         /**
    + 62          * was alt pressed ?
    + 63          */
    + 64         alt:            false,
    + 65 
    + 66         /**
    + 67          * was Meta key pressed ?
    + 68          */
    + 69         meta:           false,
    + 70 
    + 71         /**
    + 72          * Original mouse/touch event
    + 73          */
    + 74         sourceEvent:    null,
    + 75 
    + 76         touches     :   null,
    + 77 
    + 78 		init : function( x,y,sourceEvent,source,screenPoint,time ) {
    + 79 			this.point.set(x,y);
    + 80 			this.source=        source;
    + 81 			this.screenPoint=   screenPoint;
    + 82             this.alt =          sourceEvent.altKey;
    + 83             this.control =      sourceEvent.ctrlKey;
    + 84             this.shift =        sourceEvent.shiftKey;
    + 85             this.meta =         sourceEvent.metaKey;
    + 86             this.sourceEvent=   sourceEvent;
    + 87             this.x=             x;
    + 88             this.y=             y;
    + 89             this.time=          time;
    + 90 			return this;
    + 91 		},
    + 92 		isAltDown : function() {
    + 93 			return this.alt;
    + 94 		},
    + 95 		isControlDown : function() {
    + 96 			return this.control;
    + 97 		},
    + 98 		isShiftDown : function() {
    + 99 			return this.shift;
    +100 		},
    +101         isMetaDown: function() {
    +102             return this.meta;
    +103         },
    +104         getSourceEvent : function() {
    +105             return this.sourceEvent;
    +106         }
    +107 	}
    +108 });
    +109 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchEvent.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchEvent.js.html new file mode 100644 index 00000000..1e0ab931 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchEvent.js.html @@ -0,0 +1,135 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name TouchEvent
    +  5      * @memberOf CAAT.Event
    +  6      * @constructor
    +  7      */
    +  8 
    +  9 
    + 10     defines : "CAAT.Event.TouchEvent",
    + 11     aliases : ["CAAT.TouchEvent"],
    + 12     depends : [
    + 13         "CAAT.Event.TouchInfo"
    + 14     ],
    + 15     extendsWith : {
    + 16 
    + 17         /**
    + 18          * @lends CAAT.Event.TouchEvent.prototype
    + 19          */
    + 20 
    + 21         /**
    + 22          * Constructor delegate
    + 23          * @private
    + 24          */
    + 25         __init : function() {
    + 26             this.touches= [];
    + 27             this.changedTouches= [];
    + 28             return this;
    + 29         },
    + 30 
    + 31         /**
    + 32          * Time the touch event was triggered at.
    + 33          */
    + 34 		time:			0,
    + 35 
    + 36         /**
    + 37          * Source Actor the event happened in.
    + 38          */
    + 39 		source:			null,
    + 40 
    + 41         /**
    + 42          * Original touch event.
    + 43          */
    + 44         sourceEvent:    null,
    + 45 
    + 46         /**
    + 47          * Was shift pressed ?
    + 48          */
    + 49         shift:          false,
    + 50 
    + 51         /**
    + 52          * Was control pressed ?
    + 53          */
    + 54         control:        false,
    + 55 
    + 56         /**
    + 57          * Was alt pressed ?
    + 58          */
    + 59         alt:            false,
    + 60 
    + 61         /**
    + 62          * Was meta pressed ?
    + 63          */
    + 64         meta:           false,
    + 65 
    + 66         /**
    + 67          * touches collection
    + 68          */
    + 69         touches         : null,
    + 70 
    + 71         /**
    + 72          * changed touches collection
    + 73          */
    + 74         changedTouches  : null,
    + 75 
    + 76 		init : function( sourceEvent,source,time ) {
    + 77 
    + 78 			this.source=        source;
    + 79             this.alt =          sourceEvent.altKey;
    + 80             this.control =      sourceEvent.ctrlKey;
    + 81             this.shift =        sourceEvent.shiftKey;
    + 82             this.meta =         sourceEvent.metaKey;
    + 83             this.sourceEvent=   sourceEvent;
    + 84             this.time=          time;
    + 85 
    + 86 			return this;
    + 87 		},
    + 88         /**
    + 89          *
    + 90          * @param touchInfo
    + 91          *  <{
    + 92          *      id : <number>,
    + 93          *      point : {
    + 94          *          x: <number>,
    + 95          *          y: <number> }�
    + 96          *  }>
    + 97          * @return {*}
    + 98          */
    + 99         addTouch : function( touchInfo ) {
    +100             if ( -1===this.touches.indexOf( touchInfo ) ) {
    +101                 this.touches.push( touchInfo );
    +102             }
    +103             return this;
    +104         },
    +105         addChangedTouch : function( touchInfo ) {
    +106             if ( -1===this.changedTouches.indexOf( touchInfo ) ) {
    +107                 this.changedTouches.push( touchInfo );
    +108             }
    +109             return this;
    +110         },
    +111 		isAltDown : function() {
    +112 			return this.alt;
    +113 		},
    +114 		isControlDown : function() {
    +115 			return this.control;
    +116 		},
    +117 		isShiftDown : function() {
    +118 			return this.shift;
    +119 		},
    +120         isMetaDown: function() {
    +121             return this.meta;
    +122         },
    +123         getSourceEvent : function() {
    +124             return this.sourceEvent;
    +125         }
    +126 	}
    +127 });
    +128 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchInfo.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchInfo.js.html new file mode 100644 index 00000000..29524ee7 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Event_TouchInfo.js.html @@ -0,0 +1,46 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name TouchInfo
    +  5      * @memberOf CAAT.Event
    +  6      * @constructor
    +  7      */
    +  8 
    +  9     defines : "CAAT.Event.TouchInfo",
    + 10     aliases : ["CAAT.TouchInfo"],
    + 11     extendsWith : {
    + 12 
    + 13         /**
    + 14          * @lends CAAT.Event.TouchInfo.prototype
    + 15          */
    + 16 
    + 17         /**
    + 18          * Constructor delegate.
    + 19          * @param id {number}
    + 20          * @param x {number}
    + 21          * @param y {number}
    + 22          * @param target {DOMElement}
    + 23          * @private
    + 24          */
    + 25         __init : function( id, x, y, target ) {
    + 26 
    + 27             this.identifier= id;
    + 28             this.clientX= x;
    + 29             this.pageX= x;
    + 30             this.clientY= y;
    + 31             this.pageY= y;
    + 32             this.target= target;
    + 33             this.time= new Date().getTime();
    + 34 
    + 35             return this;
    + 36         }
    + 37     }
    + 38 });
    + 39 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Actor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Actor.js.html new file mode 100644 index 00000000..87a810bd --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Actor.js.html @@ -0,0 +1,2597 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  **/
    +  5 
    +  6 CAAT.Module({
    +  7 
    +  8 
    +  9 
    + 10 
    + 11     /**
    + 12      *
    + 13      * CAAT.Foundation is the base namespace for all the core animation elements.
    + 14      *
    + 15      * @name Foundation
    + 16      * @namespace
    + 17      * @memberOf CAAT
    + 18      *
    + 19      */
    + 20 
    + 21     /**
    + 22      *
    + 23      * CAAT.Foundation.Actor is the base animable element. It is the base object for Director, Scene and
    + 24      * Container.
    + 25      *    <p>CAAT.Actor is the simplest object instance CAAT manages. Every on-screen element is an Actor instance.
    + 26      *        An Actor has entity, it has a size, position and can have input sent to it. Everything that has a
    + 27      *        visual representation is an Actor, including Director and Scene objects.</p>
    + 28      *    <p>This object has functionality for:</p>
    + 29      *    <ol>
    + 30      *        <li>Set location and size on screen. Actors are always rectangular shapes, but not needed to be AABB.</li>
    + 31      *        <li>Set affine transforms (rotation, scale and translation).</li>
    + 32      *        <li>Define life cycle.</li>
    + 33      *        <li>Manage alpha transparency.</li>
    + 34      *        <li>Manage and keep track of applied Behaviors. Behaviors apply transformations via key-framing.</li>
    + 35      *        <li>Compose transformations. A container Actor will transform its children before they apply their own transformation.</li>
    + 36      *        <li>Clipping capabilities. Either rectangular or arbitrary shapes.</li>
    + 37      *        <li>The API is developed to allow method chaining when possible.</li>
    + 38      *        <li>Handle input (either mouse events, touch, multitouch, keys and accelerometer).</li>
    + 39      *        <li>Show an image.</li>
    + 40      *        <li>Show some image animations.</li>
    + 41      *        <li>etc.</li>
    + 42      *    </ol>
    + 43      *
    + 44      * @name Actor
    + 45      * @memberOf CAAT.Foundation
    + 46      * @constructor
    + 47      *
    + 48      */
    + 49 
    + 50     defines:"CAAT.Foundation.Actor",
    + 51     aliases: [ "CAAT.Actor" ],
    + 52     depends: [
    + 53         "CAAT.Math.Dimension",
    + 54         "CAAT.Event.AnimationLoop",
    + 55         "CAAT.Foundation.SpriteImage",
    + 56         "CAAT.Core.Constants",
    + 57         "CAAT.Behavior.PathBehavior",
    + 58         "CAAT.Behavior.RotateBehavior",
    + 59         "CAAT.Behavior.ScaleBehavior",
    + 60         "CAAT.Behavior.Scale1Behavior",
    + 61         "CAAT.PathUtil.LinearPath",
    + 62         "CAAT.Event.AnimationLoop"
    + 63     ],
    + 64     constants :  {
    + 65         /**
    + 66          * @lends  CAAT.Foundation.Actor
    + 67          */
    + 68 
    + 69         /** @const @type {number} */ ANCHOR_CENTER:0, // constant values to determine different affine transform
    + 70         /** @const @type {number} */ ANCHOR_TOP:1, // anchors.
    + 71         /** @const @type {number} */ ANCHOR_BOTTOM:2,
    + 72         /** @const @type {number} */ ANCHOR_LEFT:3,
    + 73         /** @const @type {number} */ ANCHOR_RIGHT:4,
    + 74         /** @const @type {number} */ ANCHOR_TOP_LEFT:5,
    + 75         /** @const @type {number} */ ANCHOR_TOP_RIGHT:6,
    + 76         /** @const @type {number} */ ANCHOR_BOTTOM_LEFT:7,
    + 77         /** @const @type {number} */ ANCHOR_BOTTOM_RIGHT:8,
    + 78         /** @const @type {number} */ ANCHOR_CUSTOM:9,
    + 79 
    + 80         /** @const @type {number} */ CACHE_NONE:0,
    + 81         /** @const @type {number} */ CACHE_SIMPLE:1,
    + 82         /** @const @type {number} */ CACHE_DEEP:2
    + 83     },
    + 84 
    + 85     extendsWith : function () {
    + 86 
    + 87         var __index = 0;
    + 88 
    + 89         return  {
    + 90 
    + 91             /**
    + 92              * @lends CAAT.Foundation.Actor.prototype
    + 93              */
    + 94 
    + 95             __init:function () {
    + 96                 this.behaviorList = [];
    + 97                 this.lifecycleListenerList = [];
    + 98                 this.AABB = new CAAT.Math.Rectangle();
    + 99                 this.viewVertices = [
    +100                     new CAAT.Math.Point(0, 0, 0),
    +101                     new CAAT.Math.Point(0, 0, 0),
    +102                     new CAAT.Math.Point(0, 0, 0),
    +103                     new CAAT.Math.Point(0, 0, 0)
    +104                 ];
    +105 
    +106                 this.scaleAnchor = CAAT.Foundation.Actor.ANCHOR_CENTER;
    +107 
    +108                 this.modelViewMatrix = new CAAT.Math.Matrix();
    +109                 this.worldModelViewMatrix = new CAAT.Math.Matrix();
    +110 
    +111                 this.resetTransform();
    +112                 this.setScale(1, 1);
    +113                 this.setRotation(0);
    +114 
    +115                 this.id = __index++;
    +116 
    +117                 return this;
    +118             },
    +119 
    +120             /**
    +121              * @type {object}
    +122              */
    +123             __super : null,
    +124 
    +125             /**
    +126              * A collection of this Actors lifecycle observers.
    +127              * @type { Array.<{actorLifeCycleEvent : function( CAAT.Foundation.Actor, string, number ) }> }
    +128              */
    +129             lifecycleListenerList:null,
    +130 
    +131             /**
    +132              * A collection of behaviors to modify this actor´s properties.
    +133              * @type { Array.<CAAT.Behavior.Behavior> }
    +134              */
    +135             behaviorList:null,
    +136 
    +137             /**
    +138              * This actor's parent container.
    +139              * @type { CAAT.Foundation.ActorContainer }
    +140              */
    +141             parent:null, // Parent of this Actor. May be Scene.
    +142 
    +143             /**
    +144              * x position on parent. In parent's local coord. system.
    +145              * @type {number}
    +146              */
    +147             x:0,
    +148             /**
    +149              * y position on parent. In parent's local coord. system.
    +150              * @type {number}
    +151              */
    +152             y:0,
    +153 
    +154             /**
    +155              * Actor's width. In parent's local coord. system.
    +156              * @type {number}
    +157              */
    +158             width:0,
    +159 
    +160             /**
    +161              * Actor's height. In parent's local coord. system.
    +162              * @type {number}
    +163              */
    +164             height:0,
    +165 
    +166             /**
    +167              * actor´s layout preferred size.
    +168              * @type {CAAT.Math.Dimension}
    +169              */
    +170             preferredSize:null,
    +171 
    +172             /**
    +173              * actor's layout minimum size.
    +174              * @type {CAAT.Math.Dimension}
    +175              */
    +176             minimumSize:null,
    +177 
    +178             /**
    +179              * Marks since when this actor, relative to scene time, is going to be animated/drawn.
    +180              * @type {number}
    +181              */
    +182             start_time:0,
    +183 
    +184             /**
    +185              * Marks from the time this actor is going to be animated, during how much time.
    +186              * Forever by default.
    +187              * @type {number}
    +188              */
    +189             duration:Number.MAX_VALUE,
    +190 
    +191             /**
    +192              * Will this actor be clipped before being drawn on screen ?
    +193              * @type {boolean}
    +194              */
    +195             clip:false,
    +196 
    +197             /**
    +198              * If this.clip and this.clipPath===null, a rectangle will be used as clip area. Otherwise,
    +199              * clipPath contains a reference to a CAAT.PathUtil.Path object.
    +200              * @type {CAAT.PathUtil.Path}
    +201              */
    +202             clipPath:null,
    +203 
    +204             /**
    +205              * Translation x anchor. 0..1
    +206              * @type {number}
    +207              */
    +208             tAnchorX:0,
    +209 
    +210             /**
    +211              * Translation y anchor. 0..1
    +212              * @type {number}
    +213              */
    +214             tAnchorY:0,
    +215 
    +216             /**
    +217              * ScaleX value.
    +218              * @type {number}
    +219              */
    +220             scaleX:1, // transformation. width scale parameter
    +221 
    +222             /**
    +223              * ScaleY value.
    +224              * @type {number}
    +225              */
    +226             scaleY:1, // transformation. height scale parameter
    +227 
    +228             /**
    +229              * Scale Anchor X. Value 0-1
    +230              * @type {number}
    +231              */
    +232             scaleTX:.50, // transformation. scale anchor x position
    +233 
    +234             /**
    +235              * Scale Anchor Y. Value 0-1
    +236              * @type {number}
    +237              */
    +238             scaleTY:.50, // transformation. scale anchor y position
    +239 
    +240             /**
    +241              * A value that corresponds to any CAAT.Foundation.Actor.ANCHOR_* value.
    +242              * @type {CAAT.Foundation.Actor.ANCHOR_*}
    +243              */
    +244             scaleAnchor:0, // transformation. scale anchor
    +245 
    +246             /**
    +247              * This actor´s rotation angle in radians.
    +248              * @type {number}
    +249              */
    +250             rotationAngle:0, // transformation. rotation angle in radians
    +251 
    +252             /**
    +253              * Rotation Anchor X. CAAT uses different Anchors for position, rotation and scale. Value 0-1.
    +254              * @type {number}
    +255              */
    +256             rotationY:.50, // transformation. rotation center y
    +257 
    +258             /**
    +259              * Rotation Anchor Y. CAAT uses different Anchors for position, rotation and scale. Value 0-1.
    +260              * @type {number}
    +261              */
    +262             rotationX:.50, // transformation. rotation center x
    +263 
    +264             /**
    +265              * Transparency value. 0 is totally transparent, 1 is totally opaque.
    +266              * @type {number}
    +267              */
    +268             alpha:1, // alpha transparency value
    +269 
    +270             /**
    +271              * true to make all children transparent, false, only this actor/container will be transparent.
    +272              * @type {boolean}
    +273              */
    +274             isGlobalAlpha:false, // is this a global alpha
    +275 
    +276             /**
    +277              * @type {number}
    +278              * @private
    +279              */
    +280             frameAlpha:1, // hierarchically calculated alpha for this Actor.
    +281 
    +282             /**
    +283              * Mark this actor as expired, or out of the scene time.
    +284              * @type {boolean}
    +285              */
    +286             expired:false,
    +287 
    +288             /**
    +289              * Mark this actor as discardable. If an actor is expired and mark as discardable, if will be
    +290              * removed from its parent.
    +291              * @type {boolean}
    +292              */
    +293             discardable:false, // set when you want this actor to be removed if expired
    +294 
    +295             /**
    +296              * @type {boolean}
    +297              */
    +298             pointed:false, // is the mouse pointer inside this actor
    +299 
    +300             /**
    +301              * Enable or disable input on this actor. By default, all actors receive input.
    +302              * See also priority lists.
    +303              * see demo4 for an example of input and priority lists.
    +304              * @type {boolean}
    +305              */
    +306             mouseEnabled:true, // events enabled ?
    +307 
    +308             /**
    +309              * Make this actor visible or not.
    +310              * An invisible actor avoids making any calculation, applying any behavior on it.
    +311              * @type {boolean}
    +312              */
    +313             visible:true,
    +314 
    +315             /**
    +316              * any canvas rendering valid fill style.
    +317              * @type {string}
    +318              */
    +319             fillStyle:null,
    +320 
    +321             /**
    +322              * any canvas rendering valid stroke style.
    +323              * @type {string}
    +324              */
    +325             strokeStyle:null,
    +326 
    +327             /**
    +328              * This actor´s scene time.
    +329              * @type {number}
    +330              */
    +331             time:0, // Cache Scene time.
    +332 
    +333             /**
    +334              * This rectangle keeps the axis aligned bounding box in screen coords of this actor.
    +335              * In can be used, among other uses, to realize whether two given actors collide regardless
    +336              * the affine transformation is being applied on them.
    +337              * @type {CAAT.Math.Rectangle}
    +338              */
    +339             AABB:null,
    +340 
    +341             /**
    +342              * These 4 CAAT.Math.Point objects are the vertices of this actor´s non axis aligned bounding
    +343              * box. If the actor is not rotated, viewVertices and AABB define the same bounding box.
    +344              * @type {Array.<CAAT.Math.Point>}
    +345              */
    +346             viewVertices:null, // model to view transformed vertices.
    +347 
    +348             /**
    +349              * Is this actor processed in the last frame ?
    +350              * @type {boolean}
    +351              */
    +352             inFrame:false, // boolean indicating whether this Actor was present on last frame.
    +353 
    +354             /**
    +355              * Local matrix dirtyness flag.
    +356              * @type {boolean}
    +357              * @private
    +358              */
    +359             dirty:true, // model view is dirty ?
    +360 
    +361             /**
    +362              * Global matrix dirtyness flag.
    +363              * @type {boolean}
    +364              * @private
    +365              */
    +366             wdirty:true, // world model view is dirty ?
    +367 
    +368             /**
    +369              * @type {number}
    +370              * @private
    +371              */
    +372             oldX:-1,
    +373 
    +374             /**
    +375              * @type {number}
    +376              * @private
    +377              */
    +378             oldY:-1,
    +379 
    +380             /**
    +381              * This actor´s affine transformation matrix.
    +382              * @type {CAAT.Math.Matrix}
    +383              */
    +384             modelViewMatrix:null, // model view matrix.
    +385 
    +386             /**
    +387              * This actor´s world affine transformation matrix.
    +388              * @type {CAAT.Math.Matrix}
    +389              */
    +390             worldModelViewMatrix:null, // world model view matrix.
    +391 
    +392             /**
    +393              * @type {CAAT.Math.Matrix}
    +394              */
    +395             modelViewMatrixI:null, // model view matrix.
    +396 
    +397             /**
    +398              * @type {CAAT.Math.Matrix}
    +399              */
    +400             worldModelViewMatrixI:null, // world model view matrix.
    +401 
    +402             /**
    +403              * Is this actor enabled on WebGL ?
    +404              * @type {boolean}
    +405              */
    +406             glEnabled:false,
    +407 
    +408             /**
    +409              * Define this actor´s background image.
    +410              * See SpriteImage object.
    +411              * @type {CAAT.Foundation.SpriteImage}
    +412              */
    +413             backgroundImage:null,
    +414 
    +415             /**
    +416              * Set this actor´ id so that it can be later identified easily.
    +417              * @type {object}
    +418              */
    +419             id:null,
    +420 
    +421             /**
    +422              * debug info.
    +423              * @type {number}
    +424              */
    +425             size_active:1, // number of animated children
    +426 
    +427             /**
    +428              * debug info.
    +429              * @type {number}
    +430              */
    +431             size_total:1,
    +432 
    +433             __d_ax:-1, // for drag-enabled actors.
    +434             __d_ay:-1,
    +435 
    +436             /**
    +437              * Is gesture recognition enabled on this actor ??
    +438              * @type {boolean}
    +439              */
    +440             gestureEnabled:false,
    +441 
    +442             /**
    +443              * If dirty rects are enabled, this flag indicates the rendering engine to invalidate this
    +444              * actor´s screen area.
    +445              * @type {boolean}
    +446              */
    +447             invalid:true,
    +448 
    +449             /**
    +450              * Caching as bitmap strategy. Suitable to cache very complex actors.
    +451              *
    +452              * 0 : no cache.
    +453              * CACHE_SIMPLE : if a container, only cache the container.
    +454              * CACHE_DEEP : if a container, cache the container and recursively all of its children.
    +455              *
    +456              * @type {number}
    +457              */
    +458             cached:0, // 0 no, CACHE_SIMPLE | CACHE_DEEP
    +459 
    +460             /**
    +461              * Exclude this actor from automatic layout on its parent.
    +462              * @type {boolean}
    +463              */
    +464             preventLayout : false,
    +465 
    +466             /**
    +467              * is this actor/container Axis aligned ? if so, much faster inverse matrices can be calculated.
    +468              * @type {boolean}
    +469              * @private
    +470              */
    +471             isAA:true,
    +472 
    +473             /**
    +474              * if this actor is cached, when destroy is called, it does not call 'clean' method, which clears some
    +475              * internal properties.
    +476              */
    +477             isCachedActor : false,
    +478 
    +479             setCachedActor : function(cached) {
    +480                 this.isCachedActor= cached;
    +481                 return this;
    +482             },
    +483 
    +484             /**
    +485              * Make this actor not be laid out.
    +486              */
    +487             setPreventLayout : function(b) {
    +488                 this.preventLayout= b;
    +489                 return this;
    +490             },
    +491 
    +492             invalidateLayout:function () {
    +493                 if (this.parent && !this.parent.layoutInvalidated) {
    +494                     this.parent.invalidateLayout();
    +495                 }
    +496 
    +497                 return this;
    +498             },
    +499 
    +500             __validateLayout:function () {
    +501 
    +502             },
    +503 
    +504             /**
    +505              * Set this actors preferred layout size.
    +506              *
    +507              * @param pw {number}
    +508              * @param ph {number}
    +509              * @return {*}
    +510              */
    +511             setPreferredSize:function (pw, ph) {
    +512                 if (!this.preferredSize) {
    +513                     this.preferredSize = new CAAT.Math.Dimension();
    +514                 }
    +515                 this.preferredSize.width = pw;
    +516                 this.preferredSize.height = ph;
    +517                 return this;
    +518             },
    +519 
    +520             getPreferredSize:function () {
    +521                 return this.preferredSize ? this.preferredSize :
    +522                     this.getMinimumSize();
    +523             },
    +524 
    +525             /**
    +526              * Set this actors minimum layout size.
    +527              *
    +528              * @param pw {number}
    +529              * @param ph {number}
    +530              * @return {*}
    +531              */
    +532             setMinimumSize:function (pw, ph) {
    +533                 if (!this.minimumSize) {
    +534                     this.minimumSize = new CAAT.Math.Dimension();
    +535                 }
    +536 
    +537                 this.minimumSize.width = pw;
    +538                 this.minimumSize.height = ph;
    +539                 return this;
    +540             },
    +541 
    +542             getMinimumSize:function () {
    +543                 return this.minimumSize ? this.minimumSize :
    +544                     new CAAT.Math.Dimension(this.width, this.height);
    +545             },
    +546 
    +547             /**
    +548              * @deprecated
    +549              * @return {*}
    +550              */
    +551             create:function () {
    +552                 return this;
    +553             },
    +554             /**
    +555              * Move this actor to a position.
    +556              * It creates and adds a new PathBehavior.
    +557              * @param x {number} new x position
    +558              * @param y {number} new y position
    +559              * @param duration {number} time to take to get to new position
    +560              * @param delay {=number} time to wait before start moving
    +561              * @param interpolator {=CAAT.Behavior.Interpolator} a CAAT.Behavior.Interpolator instance
    +562              */
    +563             moveTo:function (x, y, duration, delay, interpolator, callback) {
    +564 
    +565                 if (x === this.x && y === this.y) {
    +566                     return;
    +567                 }
    +568 
    +569                 var id = '__moveTo';
    +570                 var b = this.getBehavior(id);
    +571                 if (!b) {
    +572                     b = new CAAT.Behavior.PathBehavior().
    +573                         setId(id).
    +574                         setValues(new CAAT.PathUtil.LinearPath());
    +575                     this.addBehavior(b);
    +576                 }
    +577 
    +578                 b.path.setInitialPosition(this.x, this.y).setFinalPosition(x, y);
    +579                 b.setDelayTime(delay ? delay : 0, duration);
    +580                 if (interpolator) {
    +581                     b.setInterpolator(interpolator);
    +582                 }
    +583 
    +584                 if (callback) {
    +585                     b.lifecycleListenerList = [];
    +586                     b.addListener({
    +587                         behaviorExpired:function (behavior, time, actor) {
    +588                             callback(behavior, time, actor);
    +589                         }
    +590                     });
    +591                 }
    +592 
    +593                 return this;
    +594             },
    +595 
    +596             /**
    +597              *
    +598              * @param angle {number} new rotation angle
    +599              * @param duration {number} time to rotate
    +600              * @param delay {number=} millis to start rotation
    +601              * @param anchorX {number=} rotation anchor x
    +602              * @param anchorY {number=} rotation anchor y
    +603              * @param interpolator {CAAT.Behavior.Interpolator=}
    +604              * @return {*}
    +605              */
    +606             rotateTo:function (angle, duration, delay, anchorX, anchorY, interpolator) {
    +607 
    +608                 if (angle === this.rotationAngle) {
    +609                     return;
    +610                 }
    +611 
    +612                 var id = '__rotateTo';
    +613                 var b = this.getBehavior(id);
    +614                 if (!b) {
    +615                     b = new CAAT.Behavior.RotateBehavior().
    +616                         setId(id).
    +617                         setValues(0, 0, .5, .5);
    +618                     this.addBehavior(b);
    +619                 }
    +620 
    +621                 b.setValues(this.rotationAngle, angle, anchorX, anchorY).
    +622                     setDelayTime(delay ? delay : 0, duration);
    +623 
    +624                 if (interpolator) {
    +625                     b.setInterpolator(interpolator);
    +626                 }
    +627 
    +628                 return this;
    +629             },
    +630 
    +631             /**
    +632              *
    +633              * @param scaleX {number} new X scale
    +634              * @param scaleY {number} new Y scale
    +635              * @param duration {number} time to rotate
    +636              * @param delay {=number} millis to start rotation
    +637              * @param anchorX {=number} rotation anchor x
    +638              * @param anchorY {=number} rotation anchor y
    +639              * @param interpolator {=CAAT.Behavior.Interpolator}
    +640              * @return {*}
    +641              */
    +642             scaleTo:function (scaleX, scaleY, duration, delay, anchorX, anchorY, interpolator) {
    +643 
    +644                 if (this.scaleX === scaleX && this.scaleY === scaleY) {
    +645                     return;
    +646                 }
    +647 
    +648                 var id = '__scaleTo';
    +649                 var b = this.getBehavior(id);
    +650                 if (!b) {
    +651                     b = new CAAT.Behavior.ScaleBehavior().
    +652                         setId(id).
    +653                         setValues(1, 1, 1, 1, .5, .5);
    +654                     this.addBehavior(b);
    +655                 }
    +656 
    +657                 b.setValues(this.scaleX, scaleX, this.scaleY, scaleY, anchorX, anchorY).
    +658                     setDelayTime(delay ? delay : 0, duration);
    +659 
    +660                 if (interpolator) {
    +661                     b.setInterpolator(interpolator);
    +662                 }
    +663 
    +664                 return this;
    +665             },
    +666 
    +667             /**
    +668              *
    +669              * @param scaleX {number} new X scale
    +670              * @param duration {number} time to rotate
    +671              * @param delay {=number} millis to start rotation
    +672              * @param anchorX {=number} rotation anchor x
    +673              * @param anchorY {=number} rotation anchor y
    +674              * @param interpolator {=CAAT.Behavior.Interpolator}
    +675              * @return {*}
    +676              */
    +677             scaleXTo:function (scaleX, duration, delay, anchorX, anchorY, interpolator) {
    +678                 return this.__scale1To(
    +679                     CAAT.Behavior.Scale1Behavior.AXIS_X,
    +680                     scaleX,
    +681                     duration,
    +682                     delay,
    +683                     anchorX,
    +684                     anchorY,
    +685                     interpolator
    +686                 );
    +687             },
    +688 
    +689             /**
    +690              *
    +691              * @param scaleY {number} new Y scale
    +692              * @param duration {number} time to rotate
    +693              * @param delay {=number} millis to start rotation
    +694              * @param anchorX {=number} rotation anchor x
    +695              * @param anchorY {=number} rotation anchor y
    +696              * @param interpolator {=CAAT.Behavior.Interpolator}
    +697              * @return {*}
    +698              */
    +699             scaleYTo:function (scaleY, duration, delay, anchorX, anchorY, interpolator) {
    +700                 return this.__scale1To(
    +701                     CAAT.Behavior.Scale1Behavior.AXIS_Y,
    +702                     scaleY,
    +703                     duration,
    +704                     delay,
    +705                     anchorX,
    +706                     anchorY,
    +707                     interpolator
    +708                 );
    +709             },
    +710 
    +711             /**
    +712              * @param axis {CAAT.Scale1Behavior.AXIS_X|CAAT.Scale1Behavior.AXIS_Y} scale application axis
    +713              * @param scale {number} new Y scale
    +714              * @param duration {number} time to rotate
    +715              * @param delay {=number} millis to start rotation
    +716              * @param anchorX {=number} rotation anchor x
    +717              * @param anchorY {=number} rotation anchor y
    +718              * @param interpolator {=CAAT.Bahavior.Interpolator}
    +719              * @return {*}
    +720              */
    +721             __scale1To:function (axis, scale, duration, delay, anchorX, anchorY, interpolator) {
    +722 
    +723                 if (( axis === CAAT.Behavior.Scale1Behavior.AXIS_X && scale === this.scaleX) ||
    +724                     ( axis === CAAT.Behavior.Scale1Behavior.AXIS_Y && scale === this.scaleY)) {
    +725 
    +726                     return;
    +727                 }
    +728 
    +729                 var id = '__scaleXTo';
    +730                 var b = this.getBehavior(id);
    +731                 if (!b) {
    +732                     b = new CAAT.Behavior.Scale1Behavior().
    +733                         setId(id).
    +734                         setValues(1, 1, axis === CAAT.Behavior.Scale1Behavior.AXIS_X, .5, .5);
    +735                     this.addBehavior(b);
    +736                 }
    +737 
    +738                 b.setValues(
    +739                     axis ? this.scaleX : this.scaleY,
    +740                     scale,
    +741                     anchorX,
    +742                     anchorY).
    +743                     setDelayTime(delay ? delay : 0, duration);
    +744 
    +745                 if (interpolator) {
    +746                     b.setInterpolator(interpolator);
    +747                 }
    +748 
    +749                 return this;
    +750             },
    +751 
    +752             /**
    +753              * Touch Start only received when CAAT.TOUCH_BEHAVIOR= CAAT.TOUCH_AS_MULTITOUCH
    +754              * @param e <CAAT.TouchEvent>
    +755              */
    +756             touchStart:function (e) {
    +757             },
    +758             touchMove:function (e) {
    +759             },
    +760             touchEnd:function (e) {
    +761             },
    +762             gestureStart:function (rotation, scaleX, scaleY) {
    +763             },
    +764             gestureChange:function (rotation, scaleX, scaleY) {
    +765                 if (this.gestureEnabled) {
    +766                     this.setRotation(rotation);
    +767                     this.setScale(scaleX, scaleY);
    +768                 }
    +769                 return this;
    +770             },
    +771             gestureEnd:function (rotation, scaleX, scaleY) {
    +772             },
    +773 
    +774             isVisible:function () {
    +775                 return this.visible;
    +776             },
    +777 
    +778             invalidate:function () {
    +779                 this.invalid = true;
    +780                 return this;
    +781             },
    +782             setGestureEnabled:function (enable) {
    +783                 this.gestureEnabled = !!enable;
    +784                 return this;
    +785             },
    +786             isGestureEnabled:function () {
    +787                 return this.gestureEnabled;
    +788             },
    +789             getId:function () {
    +790                 return this.id;
    +791             },
    +792             setId:function (id) {
    +793                 this.id = id;
    +794                 return this;
    +795             },
    +796             /**
    +797              * Set this actor's parent.
    +798              * @param parent {CAAT.Foundation.ActorContainer}
    +799              * @return this
    +800              */
    +801             setParent:function (parent) {
    +802                 this.parent = parent;
    +803                 return this;
    +804             },
    +805             /**
    +806              * Set this actor's background image.
    +807              * The need of a background image is to kept compatibility with the new CSSDirector class.
    +808              * The image parameter can be either an Image/Canvas or a CAAT.Foundation.SpriteImage instance. If an image
    +809              * is supplied, it will be wrapped into a CAAT.Foundation.SriteImage instance of 1 row by 1 column.
    +810              * If the actor has set an image in the background, the paint method will draw the image, otherwise
    +811              * and if set, will fill its background with a solid color.
    +812              * If adjust_size_to_image is true, the host actor will be redimensioned to the size of one
    +813              * single image from the SpriteImage (either supplied or generated because of passing an Image or
    +814              * Canvas to the function). That means the size will be set to [width:SpriteImage.singleWidth,
    +815              * height:singleHeight].
    +816              *
    +817              * WARN: if using a CSS renderer, the image supplied MUST be a HTMLImageElement instance.
    +818              *
    +819              * @see CAAT.Foundation.SpriteImage
    +820              *
    +821              * @param image {Image|HTMLCanvasElement|CAAT.Foundation.SpriteImage}
    +822              * @param adjust_size_to_image {boolean} whether to set this actor's size based on image parameter.
    +823              *
    +824              * @return this
    +825              */
    +826             setBackgroundImage:function (image, adjust_size_to_image) {
    +827                 if (image) {
    +828                     if (!(image instanceof CAAT.Foundation.SpriteImage)) {
    +829                         if ( isString(image) ) {
    +830                             image = new CAAT.Foundation.SpriteImage().initialize(CAAT.currentDirector.getImage(image), 1, 1);
    +831                         } else {
    +832                             image = new CAAT.Foundation.SpriteImage().initialize(image, 1, 1);
    +833                         }
    +834                     } else {
    +835                         image= image.getRef();
    +836                     }
    +837 
    +838                     image.setOwner(this);
    +839                     this.backgroundImage = image;
    +840                     if (typeof adjust_size_to_image === 'undefined' || adjust_size_to_image) {
    +841                         this.width = image.getWidth();
    +842                         this.height = image.getHeight();
    +843                     }
    +844 
    +845                     this.glEnabled = true;
    +846 
    +847                     this.invalidate();
    +848 
    +849                 } else {
    +850                     this.backgroundImage = null;
    +851                 }
    +852 
    +853                 return this;
    +854             },
    +855             /**
    +856              * Set the actor's SpriteImage index from animation sheet.
    +857              * @see CAAT.Foundation.SpriteImage
    +858              * @param index {number}
    +859              *
    +860              * @return this
    +861              */
    +862             setSpriteIndex:function (index) {
    +863                 if (this.backgroundImage) {
    +864                     this.backgroundImage.setSpriteIndex(index);
    +865                     this.invalidate();
    +866                 }
    +867 
    +868                 return this;
    +869 
    +870             },
    +871             /**
    +872              * Set this actor's background SpriteImage offset displacement.
    +873              * The values can be either positive or negative meaning the texture space of this background
    +874              * image does not start at (0,0) but at the desired position.
    +875              * @see CAAT.Foundation.SpriteImage
    +876              * @param ox {number} horizontal offset
    +877              * @param oy {number} vertical offset
    +878              *
    +879              * @return this
    +880              */
    +881             setBackgroundImageOffset:function (ox, oy) {
    +882                 if (this.backgroundImage) {
    +883                     this.backgroundImage.setOffset(ox, oy);
    +884                 }
    +885 
    +886                 return this;
    +887             },
    +888             /**
    +889              * Set this actor's background SpriteImage its animation sequence.
    +890              * In its simplet's form a SpriteImage treats a given image as an array of rows by columns
    +891              * subimages. If you define d Sprite Image of 2x2, you'll be able to draw any of the 4 subimages.
    +892              * This method defines the animation sequence so that it could be set [0,2,1,3,2,1] as the
    +893              * animation sequence
    +894              * @param ii {Array<number>} an array of integers.
    +895              */
    +896             setAnimationImageIndex:function (ii) {
    +897                 if (this.backgroundImage) {
    +898                     this.backgroundImage.resetAnimationTime();
    +899                     this.backgroundImage.setAnimationImageIndex(ii);
    +900                     this.invalidate();
    +901                 }
    +902                 return this;
    +903             },
    +904 
    +905             addAnimation : function( name, array, time, callback ) {
    +906                 if (this.backgroundImage) {
    +907                     this.backgroundImage.addAnimation(name, array, time, callback);
    +908                 }
    +909                 return this;
    +910             },
    +911 
    +912             playAnimation : function(name) {
    +913                 if (this.backgroundImage) {
    +914                     this.backgroundImage.playAnimation(name);
    +915                 }
    +916                 return this;
    +917             },
    +918 
    +919             setAnimationEndCallback : function(f) {
    +920                 if (this.backgroundImage) {
    +921                     this.backgroundImage.setAnimationEndCallback(f);
    +922                 }
    +923                 return this;
    +924             },
    +925 
    +926             resetAnimationTime:function () {
    +927                 if (this.backgroundImage) {
    +928                     this.backgroundImage.resetAnimationTime();
    +929                     this.invalidate();
    +930                 }
    +931                 return this;
    +932             },
    +933 
    +934             setChangeFPS:function (time) {
    +935                 if (this.backgroundImage) {
    +936                     this.backgroundImage.setChangeFPS(time);
    +937                 }
    +938                 return this;
    +939 
    +940             },
    +941             /**
    +942              * Set this background image transformation.
    +943              * If GL is enabled, this parameter has no effect.
    +944              * @param it any value from CAAT.Foundation.SpriteImage.TR_*
    +945              * @return this
    +946              */
    +947             setImageTransformation:function (it) {
    +948                 if (this.backgroundImage) {
    +949                     this.backgroundImage.setSpriteTransformation(it);
    +950                 }
    +951                 return this;
    +952             },
    +953             /**
    +954              * Center this actor at position (x,y).
    +955              * @param x {number} x position
    +956              * @param y {number} y position
    +957              *
    +958              * @return this
    +959              * @deprecated
    +960              */
    +961             centerOn:function (x, y) {
    +962                 this.setPosition(x - this.width / 2, y - this.height / 2);
    +963                 return this;
    +964             },
    +965             /**
    +966              * Center this actor at position (x,y).
    +967              * @param x {number} x position
    +968              * @param y {number} y position
    +969              *
    +970              * @return this
    +971              */
    +972             centerAt:function (x, y) {
    +973                 this.setPosition(
    +974                     x - this.width * (.5 - this.tAnchorX ),
    +975                     y - this.height * (.5 - this.tAnchorY ) );
    +976                 return this;
    +977             },
    +978             /**
    +979              * If GL is enables, get this background image's texture page, otherwise it will fail.
    +980              * @return {CAAT.GLTexturePage}
    +981              */
    +982             getTextureGLPage:function () {
    +983                 return this.backgroundImage.image.__texturePage;
    +984             },
    +985             /**
    +986              * Set this actor invisible.
    +987              * The actor is animated but not visible.
    +988              * A container won't show any of its children if set visible to false.
    +989              *
    +990              * @param visible {boolean} set this actor visible or not.
    +991              * @return this
    +992              */
    +993             setVisible:function (visible) {
    +994                 this.invalidate();
    +995                 // si estoy visible y quiero hacerme no visible
    +996                 if (CAAT.currentDirector && CAAT.currentDirector.dirtyRectsEnabled && !visible && this.visible) {
    +997                     // if dirty rects, add this actor
    +998                     CAAT.currentDirector.scheduleDirtyRect(this.AABB);
    +999                 }
    +1000 
    +1001                 if ( visible && !this.visible) {
    +1002                     this.dirty= true;
    +1003                 }
    +1004 
    +1005                 this.visible = visible;
    +1006                 return this;
    +1007             },
    +1008             /**
    +1009              * Puts an Actor out of time line, that is, won't be transformed nor rendered.
    +1010              * @return this
    +1011              */
    +1012             setOutOfFrameTime:function () {
    +1013                 this.setFrameTime(-1, 0);
    +1014                 return this;
    +1015             },
    +1016             /**
    +1017              * Adds an Actor's life cycle listener.
    +1018              * The developer must ensure the actorListener is not already a listener, otherwise
    +1019              * it will notified more than once.
    +1020              * @param actorListener {object} an object with at least a method of the form:
    +1021              * <code>actorLyfeCycleEvent( actor, string_event_type, long_time )</code>
    +1022              */
    +1023             addListener:function (actorListener) {
    +1024                 this.lifecycleListenerList.push(actorListener);
    +1025                 return this;
    +1026             },
    +1027             /**
    +1028              * Removes an Actor's life cycle listener.
    +1029              * It will only remove the first occurrence of the given actorListener.
    +1030              * @param actorListener {object} an Actor's life cycle listener.
    +1031              */
    +1032             removeListener:function (actorListener) {
    +1033                 var n = this.lifecycleListenerList.length;
    +1034                 while (n--) {
    +1035                     if (this.lifecycleListenerList[n] === actorListener) {
    +1036                         // remove the nth element.
    +1037                         this.lifecycleListenerList.splice(n, 1);
    +1038                         return;
    +1039                     }
    +1040                 }
    +1041             },
    +1042             /**
    +1043              * Set alpha composition scope. global will mean this alpha value will be its children maximum.
    +1044              * If set to false, only this actor will have this alpha value.
    +1045              * @param global {boolean} whether the alpha value should be propagated to children.
    +1046              */
    +1047             setGlobalAlpha:function (global) {
    +1048                 this.isGlobalAlpha = global;
    +1049                 return this;
    +1050             },
    +1051             /**
    +1052              * Notifies the registered Actor's life cycle listener about some event.
    +1053              * @param sEventType an string indicating the type of event being notified.
    +1054              * @param time an integer indicating the time related to Scene's timeline when the event
    +1055              * is being notified.
    +1056              */
    +1057             fireEvent:function (sEventType, time) {
    +1058                 for (var i = 0; i < this.lifecycleListenerList.length; i++) {
    +1059                     this.lifecycleListenerList[i].actorLifeCycleEvent(this, sEventType, time);
    +1060                 }
    +1061             },
    +1062             /**
    +1063              * Sets this Actor as Expired.
    +1064              * If this is a Container, all the contained Actors won't be nor drawn nor will receive
    +1065              * any event. That is, expiring an Actor means totally taking it out the Scene's timeline.
    +1066              * @param time {number} an integer indicating the time the Actor was expired at.
    +1067              * @return this.
    +1068              */
    +1069             setExpired:function (time) {
    +1070                 this.expired = true;
    +1071                 this.fireEvent('expired', time);
    +1072                 return this;
    +1073             },
    +1074             /**
    +1075              * Enable or disable the event bubbling for this Actor.
    +1076              * @param enable {boolean} a boolean indicating whether the event bubbling is enabled.
    +1077              * @return this
    +1078              */
    +1079             enableEvents:function (enable) {
    +1080                 this.mouseEnabled = enable;
    +1081                 return this;
    +1082             },
    +1083             /**
    +1084              * Removes all behaviors from an Actor.
    +1085              * @return this
    +1086              */
    +1087             emptyBehaviorList:function () {
    +1088                 this.behaviorList = [];
    +1089                 return this;
    +1090             },
    +1091             /**
    +1092              * Caches a fillStyle in the Actor.
    +1093              * @param style a valid Canvas rendering context fillStyle.
    +1094              * @return this
    +1095              */
    +1096             setFillStyle:function (style) {
    +1097                 this.fillStyle = style;
    +1098                 this.invalidate();
    +1099                 return this;
    +1100             },
    +1101             /**
    +1102              * Caches a stroke style in the Actor.
    +1103              * @param style a valid canvas rendering context stroke style.
    +1104              * @return this
    +1105              */
    +1106             setStrokeStyle:function (style) {
    +1107                 this.strokeStyle = style;
    +1108                 this.invalidate();
    +1109                 return this;
    +1110             },
    +1111             /**
    +1112              * @deprecated
    +1113              * @param paint
    +1114              */
    +1115             setPaint:function (paint) {
    +1116                 return this.setFillStyle(paint);
    +1117             },
    +1118             /**
    +1119              * Stablishes the Alpha transparency for the Actor.
    +1120              * If it globalAlpha enabled, this alpha will the maximum alpha for every contained actors.
    +1121              * The alpha must be between 0 and 1.
    +1122              * @param alpha a float indicating the alpha value.
    +1123              * @return this
    +1124              */
    +1125             setAlpha:function (alpha) {
    +1126                 this.alpha = alpha;
    +1127                 this.invalidate();
    +1128                 return this;
    +1129             },
    +1130             /**
    +1131              * Remove all transformation values for the Actor.
    +1132              * @return this
    +1133              */
    +1134             resetTransform:function () {
    +1135                 this.rotationAngle = 0;
    +1136                 this.rotationX = .5;
    +1137                 this.rotationY = .5;
    +1138                 this.scaleX = 1;
    +1139                 this.scaleY = 1;
    +1140                 this.scaleTX = .5;
    +1141                 this.scaleTY = .5;
    +1142                 this.scaleAnchor = 0;
    +1143                 this.oldX = -1;
    +1144                 this.oldY = -1;
    +1145                 this.dirty = true;
    +1146 
    +1147                 return this;
    +1148             },
    +1149             /**
    +1150              * Sets the time life cycle for an Actor.
    +1151              * These values are related to Scene time.
    +1152              * @param startTime an integer indicating the time until which the Actor won't be visible on the Scene.
    +1153              * @param duration an integer indicating how much the Actor will last once visible.
    +1154              * @return this
    +1155              */
    +1156             setFrameTime:function (startTime, duration) {
    +1157                 this.start_time = startTime;
    +1158                 this.duration = duration;
    +1159                 this.expired = false;
    +1160                 this.dirty = true;
    +1161 
    +1162                 return this;
    +1163             },
    +1164             /**
    +1165              * This method should me overriden by every custom Actor.
    +1166              * It will be the drawing routine called by the Director to show every Actor.
    +1167              * @param director {CAAT.Foundation.Director} instance that contains the Scene the Actor is in.
    +1168              * @param time {number} indicating the Scene time in which the drawing is performed.
    +1169              */
    +1170             paint:function (director, time) {
    +1171                 if (this.backgroundImage) {
    +1172                     this.backgroundImage.paint(director, time, 0, 0);
    +1173                 } else if (this.fillStyle) {
    +1174                     var ctx = director.ctx;
    +1175                     ctx.fillStyle = this.fillStyle;
    +1176                     ctx.fillRect(0, 0, this.width, this.height);
    +1177                 }
    +1178 
    +1179             },
    +1180             /**
    +1181              * A helper method to setScaleAnchored with an anchor of ANCHOR_CENTER
    +1182              *
    +1183              * @see setScaleAnchored
    +1184              *
    +1185              * @param sx a float indicating a width size multiplier.
    +1186              * @param sy a float indicating a height size multiplier.
    +1187              * @return this
    +1188              */
    +1189             setScale:function (sx, sy) {
    +1190                 this.scaleX = sx;
    +1191                 this.scaleY = sy;
    +1192                 this.dirty = true;
    +1193                 return this;
    +1194             },
    +1195             getAnchorPercent:function (anchor) {
    +1196 
    +1197                 var anchors = [
    +1198                     .50, .50, .50, 0, .50, 1.00,
    +1199                     0, .50, 1.00, .50, 0, 0,
    +1200                     1.00, 0, 0, 1.00, 1.00, 1.00
    +1201                 ];
    +1202 
    +1203                 return { x:anchors[anchor * 2], y:anchors[anchor * 2 + 1] };
    +1204             },
    +1205             /**
    +1206              * Private.
    +1207              * Gets a given anchor position referred to the Actor.
    +1208              * @param anchor
    +1209              * @return an object of the form { x: float, y: float }
    +1210              */
    +1211             getAnchor:function (anchor) {
    +1212                 var tx = 0, ty = 0;
    +1213 
    +1214                 var A= CAAT.Foundation.Actor;
    +1215 
    +1216                 switch (anchor) {
    +1217                     case A.ANCHOR_CENTER:
    +1218                         tx = .5;
    +1219                         ty = .5;
    +1220                         break;
    +1221                     case A.ANCHOR_TOP:
    +1222                         tx = .5;
    +1223                         ty = 0;
    +1224                         break;
    +1225                     case A.ANCHOR_BOTTOM:
    +1226                         tx = .5;
    +1227                         ty = 1;
    +1228                         break;
    +1229                     case A.ANCHOR_LEFT:
    +1230                         tx = 0;
    +1231                         ty = .5;
    +1232                         break;
    +1233                     case A.ANCHOR_RIGHT:
    +1234                         tx = 1;
    +1235                         ty = .5;
    +1236                         break;
    +1237                     case A.ANCHOR_TOP_RIGHT:
    +1238                         tx = 1;
    +1239                         ty = 0;
    +1240                         break;
    +1241                     case A.ANCHOR_BOTTOM_LEFT:
    +1242                         tx = 0;
    +1243                         ty = 1;
    +1244                         break;
    +1245                     case A.ANCHOR_BOTTOM_RIGHT:
    +1246                         tx = 1;
    +1247                         ty = 1;
    +1248                         break;
    +1249                     case A.ANCHOR_TOP_LEFT:
    +1250                         tx = 0;
    +1251                         ty = 0;
    +1252                         break;
    +1253                 }
    +1254 
    +1255                 return {x:tx, y:ty};
    +1256             },
    +1257 
    +1258             setGlobalAnchor:function (ax, ay) {
    +1259                 this.tAnchorX = ax;
    +1260                 this.rotationX = ax;
    +1261                 this.scaleTX = ax;
    +1262 
    +1263                 this.tAnchorY = ay;
    +1264                 this.rotationY = ay;
    +1265                 this.scaleTY = ay;
    +1266 
    +1267                 this.dirty = true;
    +1268                 return this;
    +1269             },
    +1270 
    +1271             setScaleAnchor:function (sax, say) {
    +1272                 this.scaleTX = sax;
    +1273                 this.scaleTY = say;
    +1274                 this.dirty = true;
    +1275                 return this;
    +1276             },
    +1277             /**
    +1278              * Modify the dimensions on an Actor.
    +1279              * The dimension will not affect the local coordinates system in opposition
    +1280              * to setSize or setBounds.
    +1281              *
    +1282              * @param sx {number} width scale.
    +1283              * @param sy {number} height scale.
    +1284              * @param anchorx {number} x anchor to perform the Scale operation.
    +1285              * @param anchory {number} y anchor to perform the Scale operation.
    +1286              *
    +1287              * @return this;
    +1288              */
    +1289             setScaleAnchored:function (sx, sy, anchorx, anchory) {
    +1290                 this.scaleTX = anchorx;
    +1291                 this.scaleTY = anchory;
    +1292 
    +1293                 this.scaleX = sx;
    +1294                 this.scaleY = sy;
    +1295 
    +1296                 this.dirty = true;
    +1297 
    +1298                 return this;
    +1299             },
    +1300 
    +1301             setRotationAnchor:function (rax, ray) {
    +1302                 this.rotationX = ray;
    +1303                 this.rotationY = rax;
    +1304                 this.dirty = true;
    +1305                 return this;
    +1306             },
    +1307             /**
    +1308              * A helper method for setRotationAnchored. This methods stablishes the center
    +1309              * of rotation to be the center of the Actor.
    +1310              *
    +1311              * @param angle a float indicating the angle in radians to rotate the Actor.
    +1312              * @return this
    +1313              */
    +1314             setRotation:function (angle) {
    +1315                 this.rotationAngle = angle;
    +1316                 this.dirty = true;
    +1317                 return this;
    +1318             },
    +1319             /**
    +1320              * This method sets Actor rotation around a given position.
    +1321              * @param angle {number} indicating the angle in radians to rotate the Actor.
    +1322              * @param rx {number} value in the range 0..1
    +1323              * @param ry {number} value in the range 0..1
    +1324              * @return this;
    +1325              */
    +1326             setRotationAnchored:function (angle, rx, ry) {
    +1327                 this.rotationAngle = angle;
    +1328                 this.rotationX = rx;
    +1329                 this.rotationY = ry;
    +1330                 this.dirty = true;
    +1331                 return this;
    +1332             },
    +1333             /**
    +1334              * Sets an Actor's dimension
    +1335              * @param w a float indicating Actor's width.
    +1336              * @param h a float indicating Actor's height.
    +1337              * @return this
    +1338              */
    +1339             setSize:function (w, h) {
    +1340 
    +1341                 this.width = w;
    +1342                 this.height = h;
    +1343 
    +1344                 this.dirty = true;
    +1345 
    +1346                 return this;
    +1347             },
    +1348             /**
    +1349              * Set location and dimension of an Actor at once.
    +1350              *
    +1351              * @param x{number} a float indicating Actor's x position.
    +1352              * @param y{number} a float indicating Actor's y position
    +1353              * @param w{number} a float indicating Actor's width
    +1354              * @param h{number} a float indicating Actor's height
    +1355              * @return this
    +1356              */
    +1357             setBounds:function (x, y, w, h) {
    +1358 
    +1359                 this.x = x;
    +1360                 this.y = y;
    +1361                 this.width = w;
    +1362                 this.height = h;
    +1363 
    +1364                 this.dirty = true;
    +1365 
    +1366                 return this;
    +1367             },
    +1368             /**
    +1369              * This method sets the position of an Actor inside its parent.
    +1370              *
    +1371              * @param x{number} a float indicating Actor's x position
    +1372              * @param y{number} a float indicating Actor's y position
    +1373              * @return this
    +1374              *
    +1375              * @deprecated
    +1376              */
    +1377             setLocation:function (x, y) {
    +1378                 this.x = x;
    +1379                 this.y = y;
    +1380                 this.oldX = x;
    +1381                 this.oldY = y;
    +1382 
    +1383                 this.dirty = true;
    +1384 
    +1385                 return this;
    +1386             },
    +1387 
    +1388             setPosition:function (x, y) {
    +1389                 return this.setLocation(x, y);
    +1390             },
    +1391 
    +1392             setPositionAnchor:function (pax, pay) {
    +1393                 this.tAnchorX = pax;
    +1394                 this.tAnchorY = pay;
    +1395                 return this;
    +1396             },
    +1397 
    +1398             setPositionAnchored:function (x, y, pax, pay) {
    +1399                 this.setLocation(x, y);
    +1400                 this.tAnchorX = pax;
    +1401                 this.tAnchorY = pay;
    +1402                 return this;
    +1403             },
    +1404 
    +1405 
    +1406             /**
    +1407              * This method is called by the Director to know whether the actor is on Scene time.
    +1408              * In case it was necessary, this method will notify any life cycle behaviors about
    +1409              * an Actor expiration.
    +1410              * @param time {number} time indicating the Scene time.
    +1411              *
    +1412              * @private
    +1413              *
    +1414              */
    +1415             isInAnimationFrame:function (time) {
    +1416                 if (this.expired) {
    +1417                     return false;
    +1418                 }
    +1419 
    +1420                 if (this.duration === Number.MAX_VALUE) {
    +1421                     return this.start_time <= time;
    +1422                 }
    +1423 
    +1424                 if (time >= this.start_time + this.duration) {
    +1425                     if (!this.expired) {
    +1426                         this.setExpired(time);
    +1427                     }
    +1428 
    +1429                     return false;
    +1430                 }
    +1431 
    +1432                 return this.start_time <= time && time < this.start_time + this.duration;
    +1433             },
    +1434             /**
    +1435              * Checks whether a coordinate is inside the Actor's bounding box.
    +1436              * @param x {number} a float
    +1437              * @param y {number} a float
    +1438              *
    +1439              * @return boolean indicating whether it is inside.
    +1440              */
    +1441             contains:function (x, y) {
    +1442                 return x >= 0 && y >= 0 && x < this.width && y < this.height;
    +1443             },
    +1444 
    +1445             /**
    +1446              * Add a Behavior to the Actor.
    +1447              * An Actor accepts an undefined number of Behaviors.
    +1448              *
    +1449              * @param behavior {CAAT.Behavior.BaseBehavior}
    +1450              * @return this
    +1451              */
    +1452             addBehavior:function (behavior) {
    +1453                 this.behaviorList.push(behavior);
    +1454                 return this;
    +1455             },
    +1456 
    +1457             /**
    +1458              * Remove a Behavior from the Actor.
    +1459              * If the Behavior is not present at the actor behavior collection nothing happends.
    +1460              *
    +1461              * @param behavior {CAAT.Behavior.BaseBehavior}
    +1462              */
    +1463             removeBehaviour:function (behavior) {
    +1464                 var c = this.behaviorList;
    +1465                 var n = c.length - 1;
    +1466                 while (n) {
    +1467                     if (c[n] === behavior) {
    +1468                         c.splice(n, 1);
    +1469                         return this;
    +1470                     }
    +1471                 }
    +1472                 return this;
    +1473             },
    +1474             /**
    +1475              * Remove a Behavior with id param as behavior identifier from this actor.
    +1476              * This function will remove ALL behavior instances with the given id.
    +1477              *
    +1478              * @param id {number} an integer.
    +1479              * return this;
    +1480              */
    +1481             removeBehaviorById:function (id) {
    +1482                 var c = this.behaviorList;
    +1483                 for (var n = 0; n < c.length; n++) {
    +1484                     if (c[n].id === id) {
    +1485                         c.splice(n, 1);
    +1486                     }
    +1487                 }
    +1488 
    +1489                 return this;
    +1490 
    +1491             },
    +1492             getBehavior:function (id) {
    +1493                 var c = this.behaviorList;
    +1494                 for (var n = 0; n < c.length; n++) {
    +1495                     var cc = c[n];
    +1496                     if (cc.id === id) {
    +1497                         return cc;
    +1498                     }
    +1499                 }
    +1500                 return null;
    +1501             },
    +1502             /**
    +1503              * Set discardable property. If an actor is discardable, upon expiration will be removed from
    +1504              * scene graph and hence deleted.
    +1505              * @param discardable {boolean} a boolean indicating whether the Actor is discardable.
    +1506              * @return this
    +1507              */
    +1508             setDiscardable:function (discardable) {
    +1509                 this.discardable = discardable;
    +1510                 return this;
    +1511             },
    +1512             /**
    +1513              * This method will be called internally by CAAT when an Actor is expired, and at the
    +1514              * same time, is flagged as discardable.
    +1515              * It notifies the Actor life cycle listeners about the destruction event.
    +1516              *
    +1517              * @param time an integer indicating the time at wich the Actor has been destroyed.
    +1518              *
    +1519              * @private
    +1520              *
    +1521              */
    +1522             destroy:function (time) {
    +1523                 if (this.parent) {
    +1524                     this.parent.removeChild(this);
    +1525                 }
    +1526 
    +1527                 this.fireEvent('destroyed', time);
    +1528                 if ( !this.isCachedActor ) {
    +1529                     this.clean();
    +1530                 }
    +1531 
    +1532             },
    +1533 
    +1534             clean : function() {
    +1535                 this.backgroundImage= null;
    +1536                 this.emptyBehaviorList();
    +1537                 this.lifecycleListenerList= [];
    +1538             },
    +1539 
    +1540             /**
    +1541              * Transform a point or array of points in model space to view space.
    +1542              *
    +1543              * @param point {CAAT.Math.Point|Array} an object of the form {x : float, y: float}
    +1544              *
    +1545              * @return the source transformed elements.
    +1546              *
    +1547              * @private
    +1548              *
    +1549              */
    +1550             modelToView:function (point) {
    +1551                 var x, y, pt, tm;
    +1552 
    +1553                 if (this.dirty) {
    +1554                     this.setModelViewMatrix();
    +1555                 }
    +1556 
    +1557                 tm = this.worldModelViewMatrix.matrix;
    +1558 
    +1559                 if (point instanceof Array) {
    +1560                     for (var i = 0; i < point.length; i++) {
    +1561                         //this.worldModelViewMatrix.transformCoord(point[i]);
    +1562                         pt = point[i];
    +1563                         x = pt.x;
    +1564                         y = pt.y;
    +1565                         pt.x = x * tm[0] + y * tm[1] + tm[2];
    +1566                         pt.y = x * tm[3] + y * tm[4] + tm[5];
    +1567                     }
    +1568                 }
    +1569                 else {
    +1570 //                this.worldModelViewMatrix.transformCoord(point);
    +1571                     x = point.x;
    +1572                     y = point.y;
    +1573                     point.x = x * tm[0] + y * tm[1] + tm[2];
    +1574                     point.y = x * tm[3] + y * tm[4] + tm[5];
    +1575                 }
    +1576 
    +1577                 return point;
    +1578             },
    +1579             /**
    +1580              * Transform a local coordinate point on this Actor's coordinate system into
    +1581              * another point in otherActor's coordinate system.
    +1582              * @param point {CAAT.Math.Point}
    +1583              * @param otherActor {CAAT.Math.Actor}
    +1584              */
    +1585             modelToModel:function (point, otherActor) {
    +1586                 if (this.dirty) {
    +1587                     this.setModelViewMatrix();
    +1588                 }
    +1589 
    +1590                 return otherActor.viewToModel(this.modelToView(point));
    +1591             },
    +1592             /**
    +1593              * Transform a point from model to view space.
    +1594              * <p>
    +1595              * WARNING: every call to this method calculates
    +1596              * actor's world model view matrix.
    +1597              *
    +1598              * @param point {CAAT.Math.Point} a point in screen space to be transformed to model space.
    +1599              *
    +1600              * @return the source point object
    +1601              *
    +1602              *
    +1603              */
    +1604             viewToModel:function (point) {
    +1605                 if (this.dirty) {
    +1606                     this.setModelViewMatrix();
    +1607                 }
    +1608                 this.worldModelViewMatrixI = this.worldModelViewMatrix.getInverse();
    +1609                 this.worldModelViewMatrixI.transformCoord(point);
    +1610                 return point;
    +1611             },
    +1612             /**
    +1613              * Private
    +1614              * This method does the needed point transformations across an Actor hierarchy to devise
    +1615              * whether the parameter point coordinate lies inside the Actor.
    +1616              * @param point {CAAT.Math.Point}
    +1617              *
    +1618              * @return null if the point is not inside the Actor. The Actor otherwise.
    +1619              */
    +1620             findActorAtPosition:function (point) {
    +1621                 if (this.scaleX===0 || this.scaleY===0) {
    +1622                     return null;
    +1623                 }
    +1624                 if (!this.visible || !this.mouseEnabled || !this.isInAnimationFrame(this.time)) {
    +1625                     return null;
    +1626                 }
    +1627 
    +1628                 this.modelViewMatrixI = this.modelViewMatrix.getInverse();
    +1629                 this.modelViewMatrixI.transformCoord(point);
    +1630                 return this.contains(point.x, point.y) ? this : null;
    +1631             },
    +1632             /**
    +1633              * Enables a default dragging routine for the Actor.
    +1634              * This default dragging routine allows to:
    +1635              *  <li>scale the Actor by pressing shift+drag
    +1636              *  <li>rotate the Actor by pressing control+drag
    +1637              *  <li>scale non uniformly by pressing alt+shift+drag
    +1638              *
    +1639              * @return this
    +1640              */
    +1641             enableDrag:function () {
    +1642 
    +1643                 this.ax = 0;
    +1644                 this.ay = 0;
    +1645                 this.asx = 1;
    +1646                 this.asy = 1;
    +1647                 this.ara = 0;
    +1648                 this.screenx = 0;
    +1649                 this.screeny = 0;
    +1650 
    +1651                 /**
    +1652                  * Mouse enter handler for default drag behavior.
    +1653                  * @param mouseEvent {CAAT.Event.MouseEvent}
    +1654                  *
    +1655                  * @ignore
    +1656                  */
    +1657                 this.mouseEnter = function (mouseEvent) {
    +1658                     this.__d_ax = -1;
    +1659                     this.__d_ay = -1;
    +1660                     this.pointed = true;
    +1661                     CAAT.setCursor('move');
    +1662                 };
    +1663 
    +1664                 /**
    +1665                  * Mouse exit handler for default drag behavior.
    +1666                  * @param mouseEvent {CAAT.Event.MouseEvent}
    +1667                  *
    +1668                  * @ignore
    +1669                  */
    +1670                 this.mouseExit = function (mouseEvent) {
    +1671                     this.__d_ax = -1;
    +1672                     this.__d_ay = -1;
    +1673                     this.pointed = false;
    +1674                     CAAT.setCursor('default');
    +1675                 };
    +1676 
    +1677                 /**
    +1678                  * Mouse move handler for default drag behavior.
    +1679                  * @param mouseEvent {CAAT.Event.MouseEvent}
    +1680                  *
    +1681                  * @ignore
    +1682                  */
    +1683                 this.mouseMove = function (mouseEvent) {
    +1684                 };
    +1685 
    +1686                 /**
    +1687                  * Mouse up handler for default drag behavior.
    +1688                  * @param mouseEvent {CAAT.Event.MouseEvent}
    +1689                  *
    +1690                  * @ignore
    +1691                  */
    +1692                 this.mouseUp = function (mouseEvent) {
    +1693                     this.__d_ax = -1;
    +1694                     this.__d_ay = -1;
    +1695                 };
    +1696 
    +1697                 /**
    +1698                  * Mouse drag handler for default drag behavior.
    +1699                  * @param mouseEvent {CAAT.Event.MouseEvent}
    +1700                  *
    +1701                  * @ignore
    +1702                  */
    +1703                 this.mouseDrag = function (mouseEvent) {
    +1704 
    +1705                     var pt;
    +1706 
    +1707                     pt = this.modelToView(new CAAT.Math.Point(mouseEvent.x, mouseEvent.y));
    +1708                     this.parent.viewToModel(pt);
    +1709 
    +1710                     if (this.__d_ax === -1 || this.__d_ay === -1) {
    +1711                         this.__d_ax = pt.x;
    +1712                         this.__d_ay = pt.y;
    +1713                         this.__d_asx = this.scaleX;
    +1714                         this.__d_asy = this.scaleY;
    +1715                         this.__d_ara = this.rotationAngle;
    +1716                         this.__d_screenx = mouseEvent.screenPoint.x;
    +1717                         this.__d_screeny = mouseEvent.screenPoint.y;
    +1718                     }
    +1719 
    +1720                     if (mouseEvent.isShiftDown()) {
    +1721                         var scx = (mouseEvent.screenPoint.x - this.__d_screenx) / 100;
    +1722                         var scy = (mouseEvent.screenPoint.y - this.__d_screeny) / 100;
    +1723                         if (!mouseEvent.isAltDown()) {
    +1724                             var sc = Math.max(scx, scy);
    +1725                             scx = sc;
    +1726                             scy = sc;
    +1727                         }
    +1728                         this.setScale(scx + this.__d_asx, scy + this.__d_asy);
    +1729 
    +1730                     } else if (mouseEvent.isControlDown()) {
    +1731                         var vx = mouseEvent.screenPoint.x - this.__d_screenx;
    +1732                         var vy = mouseEvent.screenPoint.y - this.__d_screeny;
    +1733                         this.setRotation(-Math.atan2(vx, vy) + this.__d_ara);
    +1734                     } else {
    +1735                         this.x += pt.x - this.__d_ax;
    +1736                         this.y += pt.y - this.__d_ay;
    +1737                     }
    +1738 
    +1739                     this.__d_ax = pt.x;
    +1740                     this.__d_ay = pt.y;
    +1741                 };
    +1742 
    +1743                 return this;
    +1744             },
    +1745             disableDrag:function () {
    +1746 
    +1747                 this.mouseEnter = function (mouseEvent) {
    +1748                 };
    +1749                 this.mouseExit = function (mouseEvent) {
    +1750                 };
    +1751                 this.mouseMove = function (mouseEvent) {
    +1752                 };
    +1753                 this.mouseUp = function (mouseEvent) {
    +1754                 };
    +1755                 this.mouseDrag = function (mouseEvent) {
    +1756                 };
    +1757 
    +1758                 return this;
    +1759             },
    +1760             /**
    +1761              * Default mouseClick handler.
    +1762              * Mouse click events are received after a call to mouseUp method if no dragging was in progress.
    +1763              *
    +1764              * @param mouseEvent {CAAT.Event.MouseEvent}
    +1765              */
    +1766             mouseClick:function (mouseEvent) {
    +1767             },
    +1768             /**
    +1769              * Default double click handler
    +1770              *
    +1771              * @param mouseEvent {CAAT.Event.MouseEvent}
    +1772              */
    +1773             mouseDblClick:function (mouseEvent) {
    +1774             },
    +1775             /**
    +1776              * Default mouse enter on Actor handler.
    +1777              * @param mouseEvent {CAAT.Event.MouseEvent}
    +1778              */
    +1779             mouseEnter:function (mouseEvent) {
    +1780                 this.pointed = true;
    +1781             },
    +1782             /**
    +1783              * Default mouse exit on Actor handler.
    +1784              *
    +1785              * @param mouseEvent {CAAT.Event.MouseEvent}
    +1786              */
    +1787             mouseExit:function (mouseEvent) {
    +1788                 this.pointed = false;
    +1789             },
    +1790             /**
    +1791              * Default mouse move inside Actor handler.
    +1792              *
    +1793              * @param mouseEvent {CAAT.Event.MouseEvent}
    +1794              */
    +1795             mouseMove:function (mouseEvent) {
    +1796             },
    +1797             /**
    +1798              * default mouse press in Actor handler.
    +1799              *
    +1800              * @param mouseEvent {CAAT.Event.MouseEvent}
    +1801              */
    +1802             mouseDown:function (mouseEvent) {
    +1803             },
    +1804             /**
    +1805              * default mouse release in Actor handler.
    +1806              *
    +1807              * @param mouseEvent {CAAT.Event.MouseEvent}
    +1808              */
    +1809             mouseUp:function (mouseEvent) {
    +1810             },
    +1811             mouseOut:function (mouseEvent) {
    +1812             },
    +1813             mouseOver:function (mouseEvent) {
    +1814             },
    +1815             /**
    +1816              * default Actor mouse drag handler.
    +1817              *
    +1818              * @param mouseEvent {CAAT.Event.MouseEvent}
    +1819              */
    +1820             mouseDrag:function (mouseEvent) {
    +1821             },
    +1822             /**
    +1823              * Draw a bounding box with on-screen coordinates regardless of the transformations
    +1824              * applied to the Actor.
    +1825              *
    +1826              * @param director {CAAT.Foundations.Director} object instance that contains the Scene the Actor is in.
    +1827              * @param time {number} integer indicating the Scene time when the bounding box is to be drawn.
    +1828              */
    +1829             drawScreenBoundingBox:function (director, time) {
    +1830                 if (null !== this.AABB && this.inFrame) {
    +1831                     var s = this.AABB;
    +1832                     var ctx = director.ctx;
    +1833                     ctx.strokeStyle = CAAT.DEBUGAABBCOLOR;
    +1834                     ctx.strokeRect(.5 + (s.x | 0), .5 + (s.y | 0), s.width | 0, s.height | 0);
    +1835                     if (CAAT.DEBUGBB) {
    +1836                         var vv = this.viewVertices;
    +1837                         ctx.beginPath();
    +1838                         ctx.lineTo(vv[0].x, vv[0].y);
    +1839                         ctx.lineTo(vv[1].x, vv[1].y);
    +1840                         ctx.lineTo(vv[2].x, vv[2].y);
    +1841                         ctx.lineTo(vv[3].x, vv[3].y);
    +1842                         ctx.closePath();
    +1843                         ctx.strokeStyle = CAAT.DEBUGBBCOLOR;
    +1844                         ctx.stroke();
    +1845                     }
    +1846                 }
    +1847             },
    +1848             /**
    +1849              * Private
    +1850              * This method is called by the Director instance.
    +1851              * It applies the list of behaviors the Actor has registered.
    +1852              *
    +1853              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    +1854              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    +1855              */
    +1856             animate:function (director, time) {
    +1857 
    +1858                 if (!this.visible) {
    +1859                     return false;
    +1860                 }
    +1861 
    +1862                 var i;
    +1863 
    +1864                 if (!this.isInAnimationFrame(time)) {
    +1865                     this.inFrame = false;
    +1866                     this.dirty = true;
    +1867                     return false;
    +1868                 }
    +1869 
    +1870                 if (this.x !== this.oldX || this.y !== this.oldY) {
    +1871                     this.dirty = true;
    +1872                     this.oldX = this.x;
    +1873                     this.oldY = this.y;
    +1874                 }
    +1875 
    +1876                 for (i = 0; i < this.behaviorList.length; i++) {
    +1877                     this.behaviorList[i].apply(time, this);
    +1878                 }
    +1879 
    +1880                 if (this.clipPath) {
    +1881                     this.clipPath.applyBehaviors(time);
    +1882                 }
    +1883 
    +1884                 // transformation stuff.
    +1885                 this.setModelViewMatrix();
    +1886 
    +1887                 if (this.dirty || this.wdirty || this.invalid) {
    +1888                     if (director.dirtyRectsEnabled) {
    +1889                         director.addDirtyRect(this.AABB);
    +1890                     }
    +1891                     this.setScreenBounds();
    +1892                     if (director.dirtyRectsEnabled) {
    +1893                         director.addDirtyRect(this.AABB);
    +1894                     }
    +1895                 }
    +1896                 this.dirty = false;
    +1897                 this.invalid = false;
    +1898 
    +1899                 this.inFrame = true;
    +1900 
    +1901                 if ( this.backgroundImage ) {
    +1902                     this.backgroundImage.setSpriteIndexAtTime(time);
    +1903                 }
    +1904 
    +1905                 return this.AABB.intersects(director.AABB);
    +1906                 //return true;
    +1907             },
    +1908             /**
    +1909              * Set this model view matrix if the actor is Dirty.
    +1910              *
    +1911              mm[2]+= this.x;
    +1912              mm[5]+= this.y;
    +1913              if ( this.rotationAngle ) {
    +1914                  this.modelViewMatrix.multiply( m.setTranslate( this.rotationX, this.rotationY) );
    +1915                  this.modelViewMatrix.multiply( m.setRotation( this.rotationAngle ) );
    +1916                  this.modelViewMatrix.multiply( m.setTranslate( -this.rotationX, -this.rotationY) );                    c= Math.cos( this.rotationAngle );
    +1917              }
    +1918              if ( this.scaleX!=1 || this.scaleY!=1 && (this.scaleTX || this.scaleTY )) {
    +1919                  this.modelViewMatrix.multiply( m.setTranslate( this.scaleTX , this.scaleTY ) );
    +1920                  this.modelViewMatrix.multiply( m.setScale( this.scaleX, this.scaleY ) );
    +1921                  this.modelViewMatrix.multiply( m.setTranslate( -this.scaleTX , -this.scaleTY ) );
    +1922              }
    +1923              *
    +1924              * @return this
    +1925              */
    +1926             setModelViewMatrix:function () {
    +1927                 var c, s, _m00, _m01, _m10, _m11;
    +1928                 var mm0, mm1, mm2, mm3, mm4, mm5;
    +1929                 var mm;
    +1930 
    +1931                 this.wdirty = false;
    +1932                 mm = this.modelViewMatrix.matrix;
    +1933 
    +1934                 if (this.dirty) {
    +1935 
    +1936                     mm0 = 1;
    +1937                     mm1 = 0;
    +1938                     //mm2= mm[2];
    +1939                     mm3 = 0;
    +1940                     mm4 = 1;
    +1941                     //mm5= mm[5];
    +1942 
    +1943                     mm2 = this.x - this.tAnchorX * this.width;
    +1944                     mm5 = this.y - this.tAnchorY * this.height;
    +1945 
    +1946                     if (this.rotationAngle) {
    +1947 
    +1948                         var rx = this.rotationX * this.width;
    +1949                         var ry = this.rotationY * this.height;
    +1950 
    +1951                         mm2 += mm0 * rx + mm1 * ry;
    +1952                         mm5 += mm3 * rx + mm4 * ry;
    +1953 
    +1954                         c = Math.cos(this.rotationAngle);
    +1955                         s = Math.sin(this.rotationAngle);
    +1956                         _m00 = mm0;
    +1957                         _m01 = mm1;
    +1958                         _m10 = mm3;
    +1959                         _m11 = mm4;
    +1960                         mm0 = _m00 * c + _m01 * s;
    +1961                         mm1 = -_m00 * s + _m01 * c;
    +1962                         mm3 = _m10 * c + _m11 * s;
    +1963                         mm4 = -_m10 * s + _m11 * c;
    +1964 
    +1965                         mm2 += -mm0 * rx - mm1 * ry;
    +1966                         mm5 += -mm3 * rx - mm4 * ry;
    +1967                     }
    +1968                     if (this.scaleX != 1 || this.scaleY != 1) {
    +1969 
    +1970                         var sx = this.scaleTX * this.width;
    +1971                         var sy = this.scaleTY * this.height;
    +1972 
    +1973                         mm2 += mm0 * sx + mm1 * sy;
    +1974                         mm5 += mm3 * sx + mm4 * sy;
    +1975 
    +1976                         mm0 = mm0 * this.scaleX;
    +1977                         mm1 = mm1 * this.scaleY;
    +1978                         mm3 = mm3 * this.scaleX;
    +1979                         mm4 = mm4 * this.scaleY;
    +1980 
    +1981                         mm2 += -mm0 * sx - mm1 * sy;
    +1982                         mm5 += -mm3 * sx - mm4 * sy;
    +1983                     }
    +1984 
    +1985                     mm[0] = mm0;
    +1986                     mm[1] = mm1;
    +1987                     mm[2] = mm2;
    +1988                     mm[3] = mm3;
    +1989                     mm[4] = mm4;
    +1990                     mm[5] = mm5;
    +1991                 }
    +1992 
    +1993                 if (this.parent) {
    +1994 
    +1995 
    +1996                     this.isAA = this.rotationAngle === 0 && this.scaleX === 1 && this.scaleY === 1 && this.parent.isAA;
    +1997 
    +1998                     if (this.dirty || this.parent.wdirty) {
    +1999                         this.worldModelViewMatrix.copy(this.parent.worldModelViewMatrix);
    +2000                         if (this.isAA) {
    +2001                             var mmm = this.worldModelViewMatrix.matrix;
    +2002                             mmm[2] += mm[2];
    +2003                             mmm[5] += mm[5];
    +2004                         } else {
    +2005                             this.worldModelViewMatrix.multiply(this.modelViewMatrix);
    +2006                         }
    +2007                         this.wdirty = true;
    +2008                     }
    +2009 
    +2010                 } else {
    +2011                     if (this.dirty) {
    +2012                         this.wdirty = true;
    +2013                     }
    +2014 
    +2015                     this.worldModelViewMatrix.identity();
    +2016                     this.isAA = this.rotationAngle === 0 && this.scaleX === 1 && this.scaleY === 1;
    +2017                 }
    +2018 
    +2019 
    +2020 //if ( (CAAT.DEBUGAABB || glEnabled) && (this.dirty || this.wdirty ) ) {
    +2021                 // screen bounding boxes will always be calculated.
    +2022                 /*
    +2023                  if ( this.dirty || this.wdirty || this.invalid ) {
    +2024                  if ( director.dirtyRectsEnabled ) {
    +2025                  director.addDirtyRect( this.AABB );
    +2026                  }
    +2027                  this.setScreenBounds();
    +2028                  if ( director.dirtyRectsEnabled ) {
    +2029                  director.addDirtyRect( this.AABB );
    +2030                  }
    +2031                  }
    +2032                  this.dirty= false;
    +2033                  this.invalid= false;
    +2034                  */
    +2035             },
    +2036             /**
    +2037              * Calculates the 2D bounding box in canvas coordinates of the Actor.
    +2038              * This bounding box takes into account the transformations applied hierarchically for
    +2039              * each Scene Actor.
    +2040              *
    +2041              * @private
    +2042              *
    +2043              */
    +2044             setScreenBounds:function () {
    +2045 
    +2046                 var AABB = this.AABB;
    +2047                 var vv = this.viewVertices;
    +2048                 var vvv, m, x, y, w, h;
    +2049 
    +2050                 if (this.isAA) {
    +2051                     m = this.worldModelViewMatrix.matrix;
    +2052                     x = m[2];
    +2053                     y = m[5];
    +2054                     w = this.width;
    +2055                     h = this.height;
    +2056                     AABB.x = x;
    +2057                     AABB.y = y;
    +2058                     AABB.x1 = x + w;
    +2059                     AABB.y1 = y + h;
    +2060                     AABB.width = w;
    +2061                     AABB.height = h;
    +2062 
    +2063                     if (CAAT.GLRENDER) {
    +2064                         vvv = vv[0];
    +2065                         vvv.x = x;
    +2066                         vvv.y = y;
    +2067                         vvv = vv[1];
    +2068                         vvv.x = x + w;
    +2069                         vvv.y = y;
    +2070                         vvv = vv[2];
    +2071                         vvv.x = x + w;
    +2072                         vvv.y = y + h;
    +2073                         vvv = vv[3];
    +2074                         vvv.x = x;
    +2075                         vvv.y = y + h;
    +2076                     }
    +2077 
    +2078                     return this;
    +2079                 }
    +2080 
    +2081                 vvv = vv[0];
    +2082                 vvv.x = 0;
    +2083                 vvv.y = 0;
    +2084                 vvv = vv[1];
    +2085                 vvv.x = this.width;
    +2086                 vvv.y = 0;
    +2087                 vvv = vv[2];
    +2088                 vvv.x = this.width;
    +2089                 vvv.y = this.height;
    +2090                 vvv = vv[3];
    +2091                 vvv.x = 0;
    +2092                 vvv.y = this.height;
    +2093 
    +2094                 this.modelToView(this.viewVertices);
    +2095 
    +2096                 var xmin = Number.MAX_VALUE, xmax = -Number.MAX_VALUE;
    +2097                 var ymin = Number.MAX_VALUE, ymax = -Number.MAX_VALUE;
    +2098 
    +2099                 vvv = vv[0];
    +2100                 if (vvv.x < xmin) {
    +2101                     xmin = vvv.x;
    +2102                 }
    +2103                 if (vvv.x > xmax) {
    +2104                     xmax = vvv.x;
    +2105                 }
    +2106                 if (vvv.y < ymin) {
    +2107                     ymin = vvv.y;
    +2108                 }
    +2109                 if (vvv.y > ymax) {
    +2110                     ymax = vvv.y;
    +2111                 }
    +2112                 vvv = vv[1];
    +2113                 if (vvv.x < xmin) {
    +2114                     xmin = vvv.x;
    +2115                 }
    +2116                 if (vvv.x > xmax) {
    +2117                     xmax = vvv.x;
    +2118                 }
    +2119                 if (vvv.y < ymin) {
    +2120                     ymin = vvv.y;
    +2121                 }
    +2122                 if (vvv.y > ymax) {
    +2123                     ymax = vvv.y;
    +2124                 }
    +2125                 vvv = vv[2];
    +2126                 if (vvv.x < xmin) {
    +2127                     xmin = vvv.x;
    +2128                 }
    +2129                 if (vvv.x > xmax) {
    +2130                     xmax = vvv.x;
    +2131                 }
    +2132                 if (vvv.y < ymin) {
    +2133                     ymin = vvv.y;
    +2134                 }
    +2135                 if (vvv.y > ymax) {
    +2136                     ymax = vvv.y;
    +2137                 }
    +2138                 vvv = vv[3];
    +2139                 if (vvv.x < xmin) {
    +2140                     xmin = vvv.x;
    +2141                 }
    +2142                 if (vvv.x > xmax) {
    +2143                     xmax = vvv.x;
    +2144                 }
    +2145                 if (vvv.y < ymin) {
    +2146                     ymin = vvv.y;
    +2147                 }
    +2148                 if (vvv.y > ymax) {
    +2149                     ymax = vvv.y;
    +2150                 }
    +2151 
    +2152                 AABB.x = xmin;
    +2153                 AABB.y = ymin;
    +2154                 AABB.x1 = xmax;
    +2155                 AABB.y1 = ymax;
    +2156                 AABB.width = (xmax - xmin);
    +2157                 AABB.height = (ymax - ymin);
    +2158 
    +2159                 return this;
    +2160             },
    +2161             /**
    +2162              * @private.
    +2163              * This method will be called by the Director to set the whole Actor pre-render process.
    +2164              *
    +2165              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    +2166              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    +2167              *
    +2168              * @return boolean indicating whether the Actor isInFrameTime
    +2169              */
    +2170             paintActor:function (director, time) {
    +2171 
    +2172                 if (!this.visible || !director.inDirtyRect(this)) {
    +2173                     return true;
    +2174                 }
    +2175 
    +2176                 var ctx = director.ctx;
    +2177 
    +2178                 this.frameAlpha = this.parent ? this.parent.frameAlpha * this.alpha : 1;
    +2179                 ctx.globalAlpha = this.frameAlpha;
    +2180 
    +2181                 director.modelViewMatrix.transformRenderingContextSet(ctx);
    +2182                 this.worldModelViewMatrix.transformRenderingContext(ctx);
    +2183 
    +2184                 if (this.clip) {
    +2185                     ctx.beginPath();
    +2186                     if (!this.clipPath) {
    +2187                         ctx.rect(0, 0, this.width, this.height);
    +2188                     } else {
    +2189                         this.clipPath.applyAsPath(director);
    +2190                     }
    +2191                     ctx.clip();
    +2192                 }
    +2193 
    +2194                 this.paint(director, time);
    +2195 
    +2196                 return true;
    +2197             },
    +2198             /**
    +2199              * for js2native
    +2200              * @param director
    +2201              * @param time
    +2202              */
    +2203             __paintActor:function (director, time) {
    +2204                 if (!this.visible) {
    +2205                     return true;
    +2206                 }
    +2207                 var ctx = director.ctx;
    +2208 
    +2209                 // global opt: set alpha as owns alpha, not take globalAlpha procedure.
    +2210                 this.frameAlpha = this.alpha;
    +2211 
    +2212                 var m = this.worldModelViewMatrix.matrix;
    +2213                 ctx.setTransform(m[0], m[3], m[1], m[4], m[2], m[5], this.frameAlpha);
    +2214                 this.paint(director, time);
    +2215                 return true;
    +2216             },
    +2217 
    +2218             /**
    +2219              * Set coordinates and uv values for this actor.
    +2220              * This function uses Director's coords and indexCoords values.
    +2221              * @param director
    +2222              * @param time
    +2223              */
    +2224             paintActorGL:function (director, time) {
    +2225 
    +2226                 this.frameAlpha = this.parent.frameAlpha * this.alpha;
    +2227 
    +2228                 if (!this.glEnabled || !this.visible) {
    +2229                     return;
    +2230                 }
    +2231 
    +2232                 if (this.glNeedsFlush(director)) {
    +2233                     director.glFlush();
    +2234                     this.glSetShader(director);
    +2235 
    +2236                     if (!this.__uv) {
    +2237                         this.__uv = new Float32Array(8);
    +2238                     }
    +2239                     if (!this.__vv) {
    +2240                         this.__vv = new Float32Array(12);
    +2241                     }
    +2242 
    +2243                     this.setGLCoords(this.__vv, 0);
    +2244                     this.setUV(this.__uv, 0);
    +2245                     director.glRender(this.__vv, 12, this.__uv);
    +2246 
    +2247                     return;
    +2248                 }
    +2249 
    +2250                 var glCoords = director.coords;
    +2251                 var glCoordsIndex = director.coordsIndex;
    +2252 
    +2253                 ////////////////// XYZ
    +2254                 this.setGLCoords(glCoords, glCoordsIndex);
    +2255                 director.coordsIndex = glCoordsIndex + 12;
    +2256 
    +2257                 ////////////////// UV
    +2258                 this.setUV(director.uv, director.uvIndex);
    +2259                 director.uvIndex += 8;
    +2260             },
    +2261             /**
    +2262              * TODO: set GLcoords for different image transformations.
    +2263              *
    +2264              * @param glCoords
    +2265              * @param glCoordsIndex
    +2266              */
    +2267             setGLCoords:function (glCoords, glCoordsIndex) {
    +2268 
    +2269                 var vv = this.viewVertices;
    +2270                 glCoords[glCoordsIndex++] = vv[0].x;
    +2271                 glCoords[glCoordsIndex++] = vv[0].y;
    +2272                 glCoords[glCoordsIndex++] = 0;
    +2273 
    +2274                 glCoords[glCoordsIndex++] = vv[1].x;
    +2275                 glCoords[glCoordsIndex++] = vv[1].y;
    +2276                 glCoords[glCoordsIndex++] = 0;
    +2277 
    +2278                 glCoords[glCoordsIndex++] = vv[2].x;
    +2279                 glCoords[glCoordsIndex++] = vv[2].y;
    +2280                 glCoords[glCoordsIndex++] = 0;
    +2281 
    +2282                 glCoords[glCoordsIndex++] = vv[3].x;
    +2283                 glCoords[glCoordsIndex++] = vv[3].y;
    +2284                 glCoords[glCoordsIndex  ] = 0;
    +2285 
    +2286             },
    +2287             /**
    +2288              * Set UV for this actor's quad.
    +2289              *
    +2290              * @param uvBuffer {Float32Array}
    +2291              * @param uvIndex {number}
    +2292              */
    +2293             setUV:function (uvBuffer, uvIndex) {
    +2294                 this.backgroundImage.setUV(uvBuffer, uvIndex);
    +2295             },
    +2296             /**
    +2297              * Test for compulsory gl flushing:
    +2298              *  1.- opacity has changed.
    +2299              *  2.- texture page has changed.
    +2300              *
    +2301              */
    +2302             glNeedsFlush:function (director) {
    +2303                 if (this.getTextureGLPage() !== director.currentTexturePage) {
    +2304                     return true;
    +2305                 }
    +2306                 if (this.frameAlpha !== director.currentOpacity) {
    +2307                     return true;
    +2308                 }
    +2309                 return false;
    +2310             },
    +2311             /**
    +2312              * Change texture shader program parameters.
    +2313              * @param director
    +2314              */
    +2315             glSetShader:function (director) {
    +2316 
    +2317                 var tp = this.getTextureGLPage();
    +2318                 if (tp !== director.currentTexturePage) {
    +2319                     director.setGLTexturePage(tp);
    +2320                 }
    +2321 
    +2322                 if (this.frameAlpha !== director.currentOpacity) {
    +2323                     director.setGLCurrentOpacity(this.frameAlpha);
    +2324                 }
    +2325             },
    +2326             /**
    +2327              * @private.
    +2328              * This method is called after the Director has transformed and drawn a whole frame.
    +2329              *
    +2330              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    +2331              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    +2332              * @return this
    +2333              *
    +2334              * @deprecated
    +2335              */
    +2336             endAnimate:function (director, time) {
    +2337                 return this;
    +2338             },
    +2339             initialize:function (overrides) {
    +2340                 if (overrides) {
    +2341                     for (var i in overrides) {
    +2342                         this[i] = overrides[i];
    +2343                     }
    +2344                 }
    +2345 
    +2346                 return this;
    +2347             },
    +2348             /**
    +2349              * Set this Actor's clipping area.
    +2350              * @param enable {boolean} enable clip area.
    +2351              * @param clipPath {CAAT.Path.Path=} An optional path to apply clip with. If enabled and clipPath is not set,
    +2352              *  a rectangle will be used.
    +2353              */
    +2354             setClip:function (enable, clipPath) {
    +2355                 this.clip = enable;
    +2356                 this.clipPath = clipPath;
    +2357                 return this;
    +2358             },
    +2359 
    +2360             isCached : function() {
    +2361                 return this.cached;
    +2362             },
    +2363 
    +2364             stopCacheAsBitmap:function () {
    +2365                 if (this.cached) {
    +2366                     this.backgroundImage = null;
    +2367                     this.cached = CAAT.Foundation.Actor.CACHE_NONE;
    +2368                 }
    +2369             },
    +2370 
    +2371             /**
    +2372              *
    +2373              * @param time {Number=}
    +2374              * @param stragegy {CAAT.Foundation.Actor.CACHE_SIMPLE | CAAT.Foundation.Actor.CACHE_DEEP}
    +2375              * @return this
    +2376              */
    +2377             cacheAsBitmap:function (time, strategy) {
    +2378 
    +2379                 if (this.width<=0 || this.height<=0 ) {
    +2380                     return this;
    +2381                 }
    +2382 
    +2383                 time = time || 0;
    +2384                 var canvas = document.createElement('canvas');
    +2385                 canvas.width = this.width;
    +2386                 canvas.height = this.height;
    +2387                 var ctx = canvas.getContext('2d');
    +2388 
    +2389                 CAAT.Foundation.Actor.prototype.animate.call(this,CAAT.currentDirector,time);
    +2390 
    +2391                 var director = {
    +2392                     ctx:ctx,
    +2393                     modelViewMatrix: new CAAT.Math.Matrix(),
    +2394                     worldModelViewMatrix: new CAAT.Math.Matrix(),
    +2395                     dirtyRectsEnabled:false,
    +2396                     inDirtyRect:function () {
    +2397                         return true;
    +2398                     },
    +2399                     AABB : new CAAT.Math.Rectangle(0,0,this.width,this.height)
    +2400                 };
    +2401 
    +2402                 var pmv = this.modelViewMatrix;
    +2403                 var pwmv = this.worldModelViewMatrix;
    +2404 
    +2405                 this.modelViewMatrix = new CAAT.Math.Matrix();
    +2406                 this.worldModelViewMatrix = new CAAT.Math.Matrix();
    +2407 
    +2408                 this.cached = CAAT.Foundation.Actor.CACHE_NONE;
    +2409 
    +2410                 if ( typeof strategy==="undefined" ) {
    +2411                     strategy= CAAT.Foundation.Actor.CACHE_SIMPLE;
    +2412                 }
    +2413                 if ( strategy===CAAT.Foundation.Actor.CACHE_DEEP ) {
    +2414                     this.animate(director, time );
    +2415                     this.paintActor(director, time);
    +2416                 } else {
    +2417                     if ( this instanceof CAAT.Foundation.ActorContainer || this instanceof CAAT.ActorContainer ) {
    +2418                         CAAT.Foundation.ActorContainer.superclass.paintActor.call(this, director, time);
    +2419                     } else {
    +2420                         this.animate(director, time );
    +2421                         this.paintActor(director, time);
    +2422                     }
    +2423                 }
    +2424                 this.setBackgroundImage(canvas);
    +2425 
    +2426                 this.cached = strategy;
    +2427 
    +2428                 this.modelViewMatrix = pmv;
    +2429                 this.worldModelViewMatrix = pwmv;
    +2430 
    +2431                 return this;
    +2432             },
    +2433             resetAsButton : function() {
    +2434                 this.actionPerformed= null;
    +2435                 this.mouseEnter=    function() {};
    +2436                 this.mouseExit=     function() {};
    +2437                 this.mouseDown=     function() {};
    +2438                 this.mouseUp=       function() {};
    +2439                 this.mouseClick=    function() {};
    +2440                 this.mouseDrag=     function() {};
    +2441                 return this;
    +2442             },
    +2443             /**
    +2444              * Set this actor behavior as if it were a Button. The actor size will be set as SpriteImage's
    +2445              * single size.
    +2446              *
    +2447              * @param buttonImage {CAAT.Foundation.SpriteImage} sprite image with button's state images.
    +2448              * @param iNormal {number} button's normal state image index
    +2449              * @param iOver {number} button's mouse over state image index
    +2450              * @param iPress {number} button's pressed state image index
    +2451              * @param iDisabled {number} button's disabled state image index
    +2452              * @param fn {function(button{CAAT.Foundation.Actor})} callback function
    +2453              */
    +2454             setAsButton:function (buttonImage, iNormal, iOver, iPress, iDisabled, fn) {
    +2455 
    +2456                 var me = this;
    +2457 
    +2458                 this.setBackgroundImage(buttonImage, true);
    +2459 
    +2460                 this.iNormal = iNormal || 0;
    +2461                 this.iOver = iOver || this.iNormal;
    +2462                 this.iPress = iPress || this.iNormal;
    +2463                 this.iDisabled = iDisabled || this.iNormal;
    +2464                 this.fnOnClick = fn;
    +2465                 this.enabled = true;
    +2466 
    +2467                 this.setSpriteIndex(iNormal);
    +2468 
    +2469                 /**
    +2470                  * Enable or disable the button.
    +2471                  * @param enabled {boolean}
    +2472                  * @ignore
    +2473                  */
    +2474                 this.setEnabled = function (enabled) {
    +2475                     this.enabled = enabled;
    +2476                     this.setSpriteIndex(this.enabled ? this.iNormal : this.iDisabled);
    +2477                     return this;
    +2478                 };
    +2479 
    +2480                 /**
    +2481                  * This method will be called by CAAT *before* the mouseUp event is fired.
    +2482                  * @param event {CAAT.Event.MouseEvent}
    +2483                  * @ignore
    +2484                  */
    +2485                 this.actionPerformed = function (event) {
    +2486                     if (this.enabled && this.fnOnClick) {
    +2487                         this.fnOnClick(this);
    +2488                     }
    +2489                 };
    +2490 
    +2491                 /**
    +2492                  * Button's mouse enter handler. It makes the button provide visual feedback
    +2493                  * @param mouseEvent {CAAT.Event.MouseEvent}
    +2494                  * @ignore
    +2495                  */
    +2496                 this.mouseEnter = function (mouseEvent) {
    +2497                     if (!this.enabled) {
    +2498                         return;
    +2499                     }
    +2500 
    +2501                     if (this.dragging) {
    +2502                         this.setSpriteIndex(this.iPress);
    +2503                     } else {
    +2504                         this.setSpriteIndex(this.iOver);
    +2505                     }
    +2506                     CAAT.setCursor('pointer');
    +2507                 };
    +2508 
    +2509                 /**
    +2510                  * Button's mouse exit handler. Release visual apperance.
    +2511                  * @param mouseEvent {CAAT.MouseEvent}
    +2512                  * @ignore
    +2513                  */
    +2514                 this.mouseExit = function (mouseEvent) {
    +2515                     if (!this.enabled) {
    +2516                         return;
    +2517                     }
    +2518 
    +2519                     this.setSpriteIndex(this.iNormal);
    +2520                     CAAT.setCursor('default');
    +2521                 };
    +2522 
    +2523                 /**
    +2524                  * Button's mouse down handler.
    +2525                  * @param mouseEvent {CAAT.MouseEvent}
    +2526                  * @ignore
    +2527                  */
    +2528                 this.mouseDown = function (mouseEvent) {
    +2529                     if (!this.enabled) {
    +2530                         return;
    +2531                     }
    +2532 
    +2533                     this.setSpriteIndex(this.iPress);
    +2534                 };
    +2535 
    +2536                 /**
    +2537                  * Button's mouse up handler.
    +2538                  * @param mouseEvent {CAAT.MouseEvent}
    +2539                  * @ignore
    +2540                  */
    +2541                 this.mouseUp = function (mouseEvent) {
    +2542                     if (!this.enabled) {
    +2543                         return;
    +2544                     }
    +2545 
    +2546                     this.setSpriteIndex(this.iNormal);
    +2547                     this.dragging = false;
    +2548                 };
    +2549 
    +2550                 /**
    +2551                  * Button's mouse click handler. Do nothing by default. This event handler will be
    +2552                  * called ONLY if it has not been drag on the button.
    +2553                  * @param mouseEvent {CAAT.MouseEvent}
    +2554                  * @ignore
    +2555                  */
    +2556                 this.mouseClick = function (mouseEvent) {
    +2557                 };
    +2558 
    +2559                 /**
    +2560                  * Button's mouse drag handler.
    +2561                  * @param mouseEvent {CAAT.MouseEvent}
    +2562                  * @ignore
    +2563                  */
    +2564                 this.mouseDrag = function (mouseEvent) {
    +2565                     if (!this.enabled) {
    +2566                         return;
    +2567                     }
    +2568 
    +2569                     this.dragging = true;
    +2570                 };
    +2571 
    +2572                 this.setButtonImageIndex = function (_normal, _over, _press, _disabled) {
    +2573                     this.iNormal = _normal || 0;
    +2574                     this.iOver = _over || this.iNormal;
    +2575                     this.iPress = _press || this.iNormal;
    +2576                     this.iDisabled = _disabled || this.iNormal;
    +2577                     this.setSpriteIndex(this.iNormal);
    +2578                     return this;
    +2579                 };
    +2580 
    +2581                 return this;
    +2582             },
    +2583 
    +2584             findActorById : function(id) {
    +2585                 return this.id===id ? this : null;
    +2586             }
    +2587         }
    +2588     }
    +2589 });
    +2590 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_ActorContainer.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_ActorContainer.js.html new file mode 100644 index 00000000..a315e517 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_ActorContainer.js.html @@ -0,0 +1,722 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name ActorContainer
    +  5      * @memberOf CAAT.Foundation
    +  6      * @extends CAAT.Foundation.Actor
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     /**
    + 11      * @name ADDHINT
    + 12      * @memberOf CAAT.Foundation.ActorContainer
    + 13      * @namespace
    + 14      */
    + 15 
    + 16     /**
    + 17      * @name AddHint
    + 18      * @memberOf CAAT.Foundation.ActorContainer
    + 19      * @namespace
    + 20      * @deprecated
    + 21      */
    + 22 
    + 23     defines:"CAAT.Foundation.ActorContainer",
    + 24     aliases:["CAAT.ActorContainer"],
    + 25     depends:[
    + 26         "CAAT.Foundation.Actor",
    + 27         "CAAT.Math.Point",
    + 28         "CAAT.Math.Rectangle"
    + 29     ],
    + 30     constants :  {
    + 31 
    + 32         /**
    + 33          * @lends CAAT.Foundation.ActorContainer
    + 34          * */
    + 35 
    + 36         ADDHINT:{
    + 37 
    + 38             /**
    + 39              * @lends CAAT.Foundation.ActorContainer.ADDHINT
    + 40              */
    + 41 
    + 42             /** @const */ CONFORM:1
    + 43         },
    + 44 
    + 45         AddHint : {
    + 46 
    + 47             /**
    + 48              * @lends CAAT.Foundation.ActorContainer.AddHint
    + 49              */
    + 50             /** @const */ CONFORM:1
    + 51         }
    + 52     },
    + 53     extendsClass : "CAAT.Foundation.Actor",
    + 54     extendsWith : function () {
    + 55 
    + 56 
    + 57 
    + 58         var __CD =                      CAAT.Foundation.Actor.CACHE_DEEP;
    + 59 
    + 60         var sc=                         CAAT.Foundation.ActorContainer.superclass;
    + 61         var sc_drawScreenBoundingBox=   sc.drawScreenBoundingBox;
    + 62         var sc_paintActor=              sc.paintActor;
    + 63         var sc_paintActorGL=            sc.paintActorGL;
    + 64         var sc_animate=                 sc.animate;
    + 65         var sc_findActorAtPosition =    sc.findActorAtPosition;
    + 66         var sc_destroy =                sc.destroy;
    + 67 
    + 68         return {
    + 69 
    + 70             /**
    + 71              *
    + 72              * @lends CAAT.Foundation.ActorContainer.prototype
    + 73              */
    + 74 
    + 75             /**
    + 76              * Constructor delegate
    + 77              * @param hint {CAAT.Foundation.ActorContainer.AddHint}
    + 78              * @return {*}
    + 79              * @private
    + 80              */
    + 81             __init:function (hint) {
    + 82 
    + 83                 this.__super();
    + 84 
    + 85                 this.childrenList = [];
    + 86                 this.activeChildren = [];
    + 87                 this.pendingChildrenList = [];
    + 88                 if (typeof hint !== 'undefined') {
    + 89                     this.addHint = hint;
    + 90                     this.boundingBox = new CAAT.Math.Rectangle();
    + 91                 }
    + 92                 return this;
    + 93             },
    + 94 
    + 95             /**
    + 96              * This container children.
    + 97              * @type {Array.<CAAT.Foundation.Actor>}
    + 98              */
    + 99             childrenList:null,
    +100 
    +101             /**
    +102              * This container active children.
    +103              * @type {Array.<CAAT.Foundation.Actor>}
    +104              * @private
    +105              */
    +106             activeChildren:null,
    +107 
    +108             /**
    +109              * This container pending to be added children.
    +110              * @type {Array.<CAAT.Foundation.Actor>}
    +111              * @private
    +112              */
    +113             pendingChildrenList:null,
    +114 
    +115             /**
    +116              * Container redimension policy when adding children:
    +117              *  0 : no resize.
    +118              *  CAAT.Foundation.ActorContainer.AddHint.CONFORM : resize container to a bounding box.
    +119              *
    +120              * @type {number}
    +121              * @private
    +122              */
    +123             addHint:0,
    +124 
    +125             /**
    +126              * If container redimension on children add, use this rectangle as bounding box store.
    +127              * @type {CAAT.Math.Rectangle}
    +128              * @private
    +129              */
    +130             boundingBox:null,
    +131 
    +132             /**
    +133              * Spare rectangle to avoid new allocations when adding children to this container.
    +134              * @type {CAAT.Math.Rectangle}
    +135              * @private
    +136              */
    +137             runion:new CAAT.Math.Rectangle(), // Watch out. one for every container.
    +138 
    +139             /**
    +140              * Define a layout manager for this container that enforces children position and/or sizes.
    +141              * @see demo26 for an example of layouts.
    +142              * @type {CAAT.Foundation.UI.Layout.LayoutManager}
    +143              */
    +144             layoutManager:null, // a layout manager instance.
    +145 
    +146             /**
    +147              * @type {boolean}
    +148              */
    +149             layoutInvalidated:true,
    +150 
    +151             setLayout:function (layout) {
    +152                 this.layoutManager = layout;
    +153                 return this;
    +154             },
    +155 
    +156             setBounds:function (x, y, w, h) {
    +157                 CAAT.Foundation.ActorContainer.superclass.setBounds.call(this, x, y, w, h);
    +158                 if (CAAT.currentDirector && !CAAT.currentDirector.inValidation) {
    +159                     this.invalidateLayout();
    +160                 }
    +161                 return this;
    +162             },
    +163 
    +164             __validateLayout:function () {
    +165 
    +166                 this.__validateTree();
    +167                 this.layoutInvalidated = false;
    +168             },
    +169 
    +170             __validateTree:function () {
    +171                 if (this.layoutManager && this.layoutManager.isInvalidated()) {
    +172 
    +173                     CAAT.currentDirector.inValidation = true;
    +174 
    +175                     this.layoutManager.doLayout(this);
    +176 
    +177                     for (var i = 0; i < this.getNumChildren(); i += 1) {
    +178                         this.getChildAt(i).__validateLayout();
    +179                     }
    +180                 }
    +181             },
    +182 
    +183             invalidateLayout:function () {
    +184                 this.layoutInvalidated = true;
    +185 
    +186                 if (this.layoutManager) {
    +187                     this.layoutManager.invalidateLayout(this);
    +188 
    +189                     for (var i = 0; i < this.getNumChildren(); i += 1) {
    +190                         this.getChildAt(i).invalidateLayout();
    +191                     }
    +192                 }
    +193             },
    +194 
    +195             getLayout:function () {
    +196                 return this.layoutManager;
    +197             },
    +198 
    +199             /**
    +200              * Draws this ActorContainer and all of its children screen bounding box.
    +201              *
    +202              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    +203              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    +204              */
    +205             drawScreenBoundingBox:function (director, time) {
    +206 
    +207                 if (!this.inFrame) {
    +208                     return;
    +209                 }
    +210 
    +211                 var cl = this.activeChildren;
    +212                 for (var i = 0; i < cl.length; i++) {
    +213                     cl[i].drawScreenBoundingBox(director, time);
    +214                 }
    +215                 sc_drawScreenBoundingBox.call(this, director, time);
    +216             },
    +217             /**
    +218              * Removes all children from this ActorContainer.
    +219              *
    +220              * @return this
    +221              */
    +222             emptyChildren:function () {
    +223                 this.childrenList = [];
    +224 
    +225                 return this;
    +226             },
    +227             /**
    +228              * Private
    +229              * Paints this container and every contained children.
    +230              *
    +231              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    +232              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    +233              */
    +234             paintActor:function (director, time) {
    +235 
    +236                 if (!this.visible) {
    +237                     return false;
    +238                 }
    +239 
    +240                 var ctx = director.ctx;
    +241 
    +242                 ctx.save();
    +243 
    +244                 if (!sc_paintActor.call(this, director, time)) {
    +245                     return false;
    +246                 }
    +247 
    +248                 if (this.cached === __CD) {
    +249                     return false;
    +250                 }
    +251 
    +252                 if (!this.isGlobalAlpha) {
    +253                     this.frameAlpha = this.parent ? this.parent.frameAlpha : 1;
    +254                 }
    +255 
    +256                 for (var i = 0, l = this.activeChildren.length; i < l; ++i) {
    +257                     var actor = this.activeChildren[i];
    +258 
    +259                     if (actor.visible) {
    +260                         ctx.save();
    +261                         actor.paintActor(director, time);
    +262                         ctx.restore();
    +263                     }
    +264                 }
    +265 
    +266                 if (this.postPaint) {
    +267                     this.postPaint( director, time );
    +268                 }
    +269 
    +270                 ctx.restore();
    +271 
    +272                 return true;
    +273             },
    +274             __paintActor:function (director, time) {
    +275                 if (!this.visible) {
    +276                     return true;
    +277                 }
    +278 
    +279                 var ctx = director.ctx;
    +280 
    +281                 this.frameAlpha = this.parent ? this.parent.frameAlpha * this.alpha : 1;
    +282                 var m = this.worldModelViewMatrix.matrix;
    +283                 ctx.setTransform(m[0], m[3], m[1], m[4], m[2], m[5], this.frameAlpha);
    +284                 this.paint(director, time);
    +285 
    +286                 if (!this.isGlobalAlpha) {
    +287                     this.frameAlpha = this.parent ? this.parent.frameAlpha : 1;
    +288                 }
    +289 
    +290                 for (var i = 0, l = this.activeChildren.length; i < l; ++i) {
    +291                     var actor = this.activeChildren[i];
    +292                     actor.paintActor(director, time);
    +293                 }
    +294                 return true;
    +295             },
    +296             paintActorGL:function (director, time) {
    +297 
    +298                 var i, l, c;
    +299 
    +300                 if (!this.visible) {
    +301                     return true;
    +302                 }
    +303 
    +304                 sc_paintActorGL.call(this, director, time);
    +305 
    +306                 if (!this.isGlobalAlpha) {
    +307                     this.frameAlpha = this.parent.frameAlpha;
    +308                 }
    +309 
    +310                 for (i = 0, l = this.activeChildren.length; i < l; ++i) {
    +311                     c = this.activeChildren[i];
    +312                     c.paintActorGL(director, time);
    +313                 }
    +314 
    +315             },
    +316             /**
    +317              * Private.
    +318              * Performs the animate method for this ActorContainer and every contained Actor.
    +319              *
    +320              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    +321              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    +322              *
    +323              * @return {boolean} is this actor in active children list ??
    +324              */
    +325             animate:function (director, time) {
    +326 
    +327                 if (!this.visible) {
    +328                     return false;
    +329                 }
    +330 
    +331                 this.activeChildren = [];
    +332                 var last = null;
    +333 
    +334                 if (false === sc_animate.call(this, director, time)) {
    +335                     return false;
    +336                 }
    +337 
    +338                 if (this.cached === __CD) {
    +339                     return true;
    +340                 }
    +341 
    +342                 this.__validateLayout();
    +343                 CAAT.currentDirector.inValidation = false;
    +344 
    +345                 var i, l;
    +346 
    +347                 /**
    +348                  * Incluir los actores pendientes.
    +349                  * El momento es ahora, antes de procesar ninguno del contenedor.
    +350                  */
    +351                 var pcl = this.pendingChildrenList;
    +352                 for (i = 0; i < pcl.length; i++) {
    +353                     var child = pcl[i];
    +354                     this.addChildImmediately(child.child, child.constraint);
    +355                 }
    +356 
    +357                 this.pendingChildrenList = [];
    +358                 var markDelete = [];
    +359 
    +360                 var cl = this.childrenList;
    +361                 this.size_active = 1;
    +362                 this.size_total = 1;
    +363                 for (i = 0; i < cl.length; i++) {
    +364                     var actor = cl[i];
    +365                     actor.time = time;
    +366                     this.size_total += actor.size_total;
    +367                     if (actor.animate(director, time)) {
    +368                         this.activeChildren.push(actor);
    +369                         this.size_active += actor.size_active;
    +370                     } else {
    +371                         if (actor.expired && actor.discardable) {
    +372                             markDelete.push(actor);
    +373                         }
    +374                     }
    +375                 }
    +376 
    +377                 for (i = 0, l = markDelete.length; i < l; i++) {
    +378                     var md = markDelete[i];
    +379                     md.destroy(time);
    +380                     if (director.dirtyRectsEnabled) {
    +381                         director.addDirtyRect(md.AABB);
    +382                     }
    +383                 }
    +384 
    +385                 return true;
    +386             },
    +387             /**
    +388              * Removes Actors from this ActorContainer which are expired and flagged as Discardable.
    +389              *
    +390              * @param director the CAAT.Foundation.Director object instance that contains the Scene the Actor is in.
    +391              * @param time an integer indicating the Scene time when the bounding box is to be drawn.
    +392              *
    +393              * @deprecated
    +394              */
    +395             endAnimate:function (director, time) {
    +396             },
    +397             /**
    +398              * Adds an Actor to this Container.
    +399              * The Actor will be added ON METHOD CALL, despite the rendering pipeline stage being executed at
    +400              * the time of method call.
    +401              *
    +402              * This method is only used by director's transitionScene.
    +403              *
    +404              * @param child {CAAT.Foundation.Actor}
    +405              * @param constraint {object}
    +406              * @return this.
    +407              */
    +408             addChildImmediately:function (child, constraint) {
    +409                 return this.addChild(child, constraint);
    +410             },
    +411 
    +412             addActorImmediately: function(child,constraint) {
    +413                 return this.addChildImmediately(child,constraint);
    +414             },
    +415 
    +416             addActor : function( child, constraint ) {
    +417                 return this.addChild(child,constraint);
    +418             },
    +419 
    +420             /**
    +421              * Adds an Actor to this ActorContainer.
    +422              * The Actor will be added to the container AFTER frame animation, and not on method call time.
    +423              * Except the Director and in orther to avoid visual artifacts, the developer SHOULD NOT call this
    +424              * method directly.
    +425              *
    +426              * If the container has addingHint as CAAT.Foundation.ActorContainer.AddHint.CONFORM, new continer size will be
    +427              * calculated by summing up the union of every client actor bounding box.
    +428              * This method will not take into acount actor's affine transformations, so the bounding box will be
    +429              * AABB.
    +430              *
    +431              * @param child {CAAT.Foundation.Actor} object instance.
    +432              * @param constraint {object}
    +433              * @return this
    +434              */
    +435             addChild:function (child, constraint) {
    +436 
    +437                 if (child.parent != null) {
    +438                     throw('adding to a container an element with parent.');
    +439                 }
    +440 
    +441                 child.parent = this;
    +442                 this.childrenList.push(child);
    +443                 child.dirty = true;
    +444 
    +445                 if (this.layoutManager) {
    +446                     this.layoutManager.addChild(child, constraint);
    +447                     this.invalidateLayout();
    +448                 } else {
    +449                     /**
    +450                      * if Conforming size, recalc new bountainer size.
    +451                      */
    +452                     if (this.addHint === CAAT.Foundation.ActorContainer.AddHint.CONFORM) {
    +453                         this.recalcSize();
    +454                     }
    +455                 }
    +456 
    +457                 return this;
    +458             },
    +459 
    +460             /**
    +461              * Recalc this container size by computing the union of every children bounding box.
    +462              */
    +463             recalcSize:function () {
    +464                 var bb = this.boundingBox;
    +465                 bb.setEmpty();
    +466                 var cl = this.childrenList;
    +467                 var ac;
    +468                 for (var i = 0; i < cl.length; i++) {
    +469                     ac = cl[i];
    +470                     this.runion.setBounds(
    +471                         ac.x < 0 ? 0 : ac.x,
    +472                         ac.y < 0 ? 0 : ac.y,
    +473                         ac.width,
    +474                         ac.height);
    +475                     bb.unionRectangle(this.runion);
    +476                 }
    +477                 this.setSize(bb.x1, bb.y1);
    +478 
    +479                 return this;
    +480             },
    +481 
    +482             /**
    +483              * Add a child element and make it active in the next frame.
    +484              * @param child {CAAT.Foundation.Actor}
    +485              */
    +486             addChildDelayed:function (child, constraint) {
    +487                 this.pendingChildrenList.push({ child:child, constraint: constraint });
    +488                 return this;
    +489             },
    +490             /**
    +491              * Adds an Actor to this ActorContainer.
    +492              *
    +493              * @param child {CAAT.Foundation.Actor}.
    +494              * @param index {number}
    +495              *
    +496              * @return this
    +497              */
    +498             addChildAt:function (child, index) {
    +499 
    +500                 if (index <= 0) {
    +501                     child.parent = this;
    +502                     child.dirty = true;
    +503                     this.childrenList.splice(0, 0, child);
    +504                     this.invalidateLayout();
    +505                     return this;
    +506                 } else {
    +507                     if (index >= this.childrenList.length) {
    +508                         index = this.childrenList.length;
    +509                     }
    +510                 }
    +511 
    +512                 child.parent = this;
    +513                 child.dirty = true;
    +514                 this.childrenList.splice(index, 0, child);
    +515                 this.invalidateLayout();
    +516 
    +517                 return this;
    +518             },
    +519             /**
    +520              * Find the first actor with the supplied ID.
    +521              * This method is not recommended to be used since executes a linear search.
    +522              * @param id
    +523              */
    +524             findActorById:function (id) {
    +525 
    +526                 if ( CAAT.Foundation.ActorContainer.superclass.findActorById.call(this,id) ) {
    +527                     return this;
    +528                 }
    +529 
    +530                 var cl = this.childrenList;
    +531                 for (var i = 0, l = cl.length; i < l; i++) {
    +532                     var ret= cl[i].findActorById(id);
    +533                     if (null!=ret) {
    +534                         return ret;
    +535                     }
    +536                 }
    +537 
    +538                 return null;
    +539             },
    +540             /**
    +541              * Private
    +542              * Gets a contained Actor z-index on this ActorContainer.
    +543              *
    +544              * @param child a CAAT.Foundation.Actor object instance.
    +545              *
    +546              * @return {number}
    +547              */
    +548             findChild:function (child) {
    +549                 var cl = this.childrenList;
    +550                 var i;
    +551                 var len = cl.length;
    +552 
    +553                 for (i = 0; i < len; i++) {
    +554                     if (cl[i] === child) {
    +555                         return i;
    +556                     }
    +557                 }
    +558                 return -1;
    +559             },
    +560             removeChildAt:function (pos) {
    +561                 var cl = this.childrenList;
    +562                 var rm;
    +563                 if (-1 !== pos && pos>=0 && pos<this.childrenList.length) {
    +564                     cl[pos].setParent(null);
    +565                     rm = cl.splice(pos, 1);
    +566                     if (rm[0].isVisible() && CAAT.currentDirector.dirtyRectsEnabled) {
    +567                         CAAT.currentDirector.scheduleDirtyRect(rm[0].AABB);
    +568                     }
    +569 
    +570                     this.invalidateLayout();
    +571                     return rm[0];
    +572                 }
    +573 
    +574                 return null;
    +575             },
    +576             /**
    +577              * Removed an Actor form this ActorContainer.
    +578              * If the Actor is not contained into this Container, nothing happends.
    +579              *
    +580              * @param child a CAAT.Foundation.Actor object instance.
    +581              *
    +582              * @return this
    +583              */
    +584             removeChild:function (child) {
    +585                 var pos = this.findChild(child);
    +586                 var ret = this.removeChildAt(pos);
    +587 
    +588                 return ret;
    +589             },
    +590             removeFirstChild:function () {
    +591                 var first = this.childrenList.shift();
    +592                 first.parent = null;
    +593                 if (first.isVisible() && CAAT.currentDirector.dirtyRectsEnabled) {
    +594                     CAAT.currentDirector.scheduleDirtyRect(first.AABB);
    +595                 }
    +596 
    +597                 this.invalidateLayout();
    +598 
    +599                 return first;
    +600             },
    +601             removeLastChild:function () {
    +602                 if (this.childrenList.length) {
    +603                     var last = this.childrenList.pop();
    +604                     last.parent = null;
    +605                     if (last.isVisible() && CAAT.currentDirector.dirtyRectsEnabled) {
    +606                         CAAT.currentDirector.scheduleDirtyRect(last.AABB);
    +607                     }
    +608 
    +609                     this.invalidateLayout();
    +610 
    +611                     return last;
    +612                 }
    +613 
    +614                 return null;
    +615             },
    +616             /**
    +617              * @private
    +618              *
    +619              * Gets the Actor inside this ActorContainer at a given Screen coordinate.
    +620              *
    +621              * @param point an object of the form { x: float, y: float }
    +622              *
    +623              * @return the Actor contained inside this ActorContainer if found, or the ActorContainer itself.
    +624              */
    +625             findActorAtPosition:function (point) {
    +626 
    +627                 if (null === sc_findActorAtPosition.call(this, point)) {
    +628                     return null;
    +629                 }
    +630 
    +631                 // z-order
    +632                 var cl = this.childrenList;
    +633                 for (var i = cl.length - 1; i >= 0; i--) {
    +634                     var child = this.childrenList[i];
    +635 
    +636                     var np = new CAAT.Math.Point(point.x, point.y, 0);
    +637                     var contained = child.findActorAtPosition(np);
    +638                     if (null !== contained) {
    +639                         return contained;
    +640                     }
    +641                 }
    +642 
    +643                 return this;
    +644             },
    +645             /**
    +646              * Destroys this ActorContainer.
    +647              * The process falls down recursively for each contained Actor into this ActorContainer.
    +648              *
    +649              * @return this
    +650              */
    +651             destroy:function () {
    +652                 var cl = this.childrenList;
    +653                 for (var i = cl.length - 1; i >= 0; i--) {
    +654                     cl[i].destroy();
    +655                 }
    +656                 sc_destroy.call(this);
    +657 
    +658                 return this;
    +659             },
    +660             /**
    +661              * Get number of Actors into this container.
    +662              * @return integer indicating the number of children.
    +663              */
    +664             getNumChildren:function () {
    +665                 return this.childrenList.length;
    +666             },
    +667             getNumActiveChildren:function () {
    +668                 return this.activeChildren.length;
    +669             },
    +670             /**
    +671              * Returns the Actor at the iPosition(th) position.
    +672              * @param iPosition an integer indicating the position array.
    +673              * @return the CAAT.Foundation.Actor object at position.
    +674              */
    +675             getChildAt:function (iPosition) {
    +676                 return this.childrenList[ iPosition ];
    +677             },
    +678             /**
    +679              * Changes an actor's ZOrder.
    +680              * @param actor the actor to change ZOrder for
    +681              * @param index an integer indicating the new ZOrder. a value greater than children list size means to be the
    +682              * last ZOrder Actor.
    +683              */
    +684             setZOrder:function (actor, index) {
    +685                 var actorPos = this.findChild(actor);
    +686                 // the actor is present
    +687                 if (-1 !== actorPos) {
    +688                     var cl = this.childrenList;
    +689                     // trivial reject.
    +690                     if (index === actorPos) {
    +691                         return;
    +692                     }
    +693 
    +694                     if (index >= cl.length) {
    +695                         cl.splice(actorPos, 1);
    +696                         cl.push(actor);
    +697                     } else {
    +698                         var nActor = cl.splice(actorPos, 1);
    +699                         if (index < 0) {
    +700                             index = 0;
    +701                         } else if (index > cl.length) {
    +702                             index = cl.length;
    +703                         }
    +704 
    +705                         cl.splice(index, 0, nActor[0]);
    +706                     }
    +707 
    +708                     this.invalidateLayout();
    +709                 }
    +710             }
    +711         }
    +712 
    +713     }
    +714 });
    +715 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DBodyActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DBodyActor.js.html new file mode 100644 index 00000000..596e9e6b --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DBodyActor.js.html @@ -0,0 +1,305 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name Box2D
    +  5      * @memberOf CAAT.Foundation
    +  6      * @namespace
    +  7      */
    +  8 
    +  9     /**
    + 10      * @name B2DBodyActor
    + 11      * @memberOf CAAT.Foundation.Box2D
    + 12      * @extends CAAT.Foundation.Actor
    + 13      * @constructor
    + 14      */
    + 15 
    + 16     defines:"CAAT.Foundation.Box2D.B2DBodyActor",
    + 17     depends:[
    + 18         "CAAT.Foundation.Actor"
    + 19     ],
    + 20     aliases : ["CAAT.B2DBodyActor"],
    + 21     extendsClass:"CAAT.Foundation.Actor",
    + 22     extendsWith:function () {
    + 23 
    + 24         /**
    + 25          * @lends CAAT
    + 26          */
    + 27 
    + 28         /**
    + 29          * Points to Meter ratio value.
    + 30          * @type {Number}
    + 31          */
    + 32         CAAT.PMR = 64;
    + 33 
    + 34         /**
    + 35          * (As Eemeli Kelokorpi suggested)
    + 36          *
    + 37          * Enable Box2D debug renderer.
    + 38          *
    + 39          * @param set {boolean} enable or disable
    + 40          * @param director {CAAT.Foundation.Director}
    + 41          * @param world {object} box2d world
    + 42          * @param scale {numner} a scale value.
    + 43          */
    + 44         CAAT.enableBox2DDebug = function (set, director, world, scale) {
    + 45 
    + 46             if (set) {
    + 47                 var debugDraw = new Box2D.Dynamics.b2DebugDraw();
    + 48                 try {
    + 49                     debugDraw.m_sprite.graphics.clear = function () {
    + 50                     };
    + 51                 } catch (e) {
    + 52                 }
    + 53 
    + 54                 world.SetDebugDraw(debugDraw);
    + 55 
    + 56                 debugDraw.SetSprite(director.ctx);
    + 57                 debugDraw.SetDrawScale(scale || CAAT.PMR);
    + 58                 debugDraw.SetFillAlpha(.5);
    + 59                 debugDraw.SetLineThickness(1.0);
    + 60                 debugDraw.SetFlags(0x0001 | 0x0002);
    + 61 
    + 62             } else {
    + 63                 world.SetDebugDraw(null);
    + 64             }
    + 65         };
    + 66 
    + 67         return {
    + 68 
    + 69             /**
    + 70              * @lends CAAT.Foundation.Box2D.B2DBodyActor.prototype
    + 71              */
    + 72 
    + 73             /**
    + 74              * Body restitution.
    + 75              */
    + 76             restitution:.5,
    + 77 
    + 78             /**
    + 79              * Body friction.
    + 80              */
    + 81             friction:.5,
    + 82 
    + 83             /**
    + 84              * Body dentisy
    + 85              */
    + 86             density:1,
    + 87 
    + 88             /**
    + 89              * Dynamic bodies by default
    + 90              */
    + 91             bodyType:Box2D.Dynamics.b2Body.b2_dynamicBody,
    + 92 
    + 93             /**
    + 94              * Box2D body
    + 95              */
    + 96             worldBody:null,
    + 97 
    + 98             /**
    + 99              * Box2D world reference.
    +100              */
    +101             world:null,
    +102 
    +103             /**
    +104              * Box2d fixture
    +105              */
    +106             worldBodyFixture:null,
    +107 
    +108             /**
    +109              * Box2D body definition.
    +110              */
    +111             bodyDef:null,
    +112 
    +113             /**
    +114              * Box2D fixture definition.
    +115              */
    +116             fixtureDef:null,
    +117 
    +118             /**
    +119              * BodyData object linked to the box2D body.
    +120              */
    +121             bodyData:null,
    +122 
    +123             /**
    +124              * Recycle this actor when the body is not needed anymore ??
    +125              */
    +126             recycle:false,
    +127 
    +128             __init : function() {
    +129                 this.__super();
    +130                 this.setPositionAnchor(.5,.5);
    +131 
    +132                 return this;
    +133             },
    +134 
    +135             setPositionAnchor : function( ax, ay ) {
    +136                 this.tAnchorX= .5;
    +137                 this.tAnchorY= .5;
    +138             },
    +139 
    +140             setPositionAnchored : function(x,y,ax,ay) {
    +141                 this.x= x;
    +142                 this.y= y;
    +143                 this.tAnchorX= .5;
    +144                 this.tAnchorY= .5;
    +145             },
    +146 
    +147             /**
    +148              * set this actor to recycle its body, that is, do not destroy it.
    +149              */
    +150             setRecycle:function () {
    +151                 this.recycle = true;
    +152                 return this;
    +153             },
    +154             destroy:function () {
    +155 
    +156                 CAAT.Foundation.Box2D.B2DBodyActor.superclass.destroy.call(this);
    +157                 if (this.recycle) {
    +158                     this.setLocation(-Number.MAX_VALUE, -Number.MAX_VALUE);
    +159                     this.setAwake(false);
    +160                 } else {
    +161                     var body = this.worldBody;
    +162                     body.DestroyFixture(this.worldBodyFixture);
    +163                     this.world.DestroyBody(body);
    +164                 }
    +165 
    +166                 return this;
    +167             },
    +168             setAwake:function (bool) {
    +169                 this.worldBody.SetAwake(bool);
    +170                 return this;
    +171             },
    +172             setSleepingAllowed:function (bool) {
    +173                 this.worldBody.SetSleepingAllowed(bool);
    +174                 return this;
    +175             },
    +176             setLocation:function (x, y) {
    +177                 this.worldBody.SetPosition(
    +178                     new Box2D.Common.Math.b2Vec2(
    +179                         x / CAAT.PMR,
    +180                         y / CAAT.PMR));
    +181                 return this;
    +182             },
    +183             /**
    +184              * Set this body's
    +185              * density.
    +186              * @param d {number}
    +187              */
    +188             setDensity:function (d) {
    +189                 this.density = d;
    +190                 return this;
    +191             },
    +192 
    +193             /**
    +194              * Set this body's friction.
    +195              * @param f {number}
    +196              */
    +197             setFriction:function (f) {
    +198                 this.friction = f;
    +199                 return this;
    +200             },
    +201 
    +202             /**
    +203              * Set this body's restitution coeficient.
    +204              * @param r {number}
    +205              */
    +206             setRestitution:function (r) {
    +207                 this.restitution = r;
    +208                 return this;
    +209             },
    +210 
    +211             /**
    +212              * Set this body's type:
    +213              * @param bodyType {Box2D.Dynamics.b2Body.b2_*}
    +214              */
    +215             setBodyType:function (bodyType) {
    +216                 this.bodyType = bodyType;
    +217                 return this;
    +218             },
    +219 
    +220             /**
    +221              * Helper method to check whether this js object contains a given property and if it doesn't exist
    +222              * create and set it to def value.
    +223              * @param obj {object}
    +224              * @param prop {string}
    +225              * @param def {object}
    +226              */
    +227             check:function (obj, prop, def) {
    +228                 if (!obj[prop]) {
    +229                     obj[prop] = def;
    +230                 }
    +231             },
    +232 
    +233             /**
    +234              * Create an actor as a box2D body binding, create it on the given world and with
    +235              * the initialization data set in bodyData object.
    +236              * @param world {Box2D.Dynamics.b2World} a Box2D world instance
    +237              * @param bodyData {object} An object with body info.
    +238              */
    +239             createBody:function (world, bodyData) {
    +240 
    +241                 if (bodyData) {
    +242                     this.check(bodyData, 'density', 1);
    +243                     this.check(bodyData, 'friction', .5);
    +244                     this.check(bodyData, 'restitution', .2);
    +245                     this.check(bodyData, 'bodyType', Box2D.Dynamics.b2Body.b2_staticBody);
    +246                     this.check(bodyData, 'userData', {});
    +247                     this.check(bodyData, 'image', null);
    +248 
    +249                     this.density = bodyData.density;
    +250                     this.friction = bodyData.friction;
    +251                     this.restitution = bodyData.restitution;
    +252                     this.bodyType = bodyData.bodyType;
    +253                     this.image = bodyData.image;
    +254 
    +255                 }
    +256 
    +257                 this.world = world;
    +258 
    +259                 return this;
    +260             },
    +261 
    +262             /**
    +263              * Get this body's center on screen regardless of its shape.
    +264              * This method will return box2d body's centroid.
    +265              */
    +266             getCenter:function () {
    +267                 return this.worldBody.GetPosition();
    +268             },
    +269 
    +270             /**
    +271              * Get a distance joint's position on pixels.
    +272              */
    +273             getDistanceJointLocalAnchor:function () {
    +274                 return new Box2D.Common.Math.b2Vec2(0,0);
    +275             },
    +276 
    +277             /**
    +278              * Method override to get position and rotation angle from box2d body.
    +279              * @param director {CAAT.Director}
    +280              * @param time {number}
    +281              */
    +282             animate: function(director, time) {
    +283 
    +284                 var pos= this.worldBody.GetPosition();
    +285 
    +286                 CAAT.Foundation.Actor.prototype.setLocation.call(
    +287                         this,
    +288                         CAAT.PMR*pos.x,
    +289                         CAAT.PMR*pos.y);
    +290 
    +291                 this.setRotation( this.worldBody.GetAngle() );
    +292 
    +293                 return CAAT.Foundation.Box2D.B2DBodyActor.superclass.animate.call(this,director,time);
    +294             }
    +295         }
    +296     }
    +297 });
    +298 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DCircularBody.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DCircularBody.js.html new file mode 100644 index 00000000..25b4958c --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DCircularBody.js.html @@ -0,0 +1,106 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name B2DCircularBody
    +  5      * @memberOf CAAT.Foundation.Box2D
    +  6      * @extends CAAT.Foundation.Box2D.B2DBodyActor
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Foundation.Box2D.B2DCircularBody",
    + 11     depends : [
    + 12         "CAAT.Foundation.Box2D.B2DBodyActor"
    + 13     ],
    + 14     aliases : ["CAAT.B2DCircularBody"],
    + 15     extendsClass : "CAAT.Foundation.Box2D.B2DBodyActor",
    + 16     constants : {
    + 17 
    + 18         /**
    + 19          * @lends CAAT.Foundation.Box2D.B2DCircularBody
    + 20          */
    + 21 
    + 22         createCircularBody : function(world, bodyData) {
    + 23             if ( bodyData.radius )  this.radius= bodyData.radius;
    + 24 
    + 25             var fixDef=             new Box2D.Dynamics.b2FixtureDef();
    + 26             fixDef.density=         bodyData.density;
    + 27             fixDef.friction=        bodyData.friction;
    + 28             fixDef.restitution=     bodyData.restitution;
    + 29             fixDef.shape =          new Box2D.Collision.Shapes.b2CircleShape(bodyData.radius/CAAT.PMR);
    + 30 
    + 31             var bodyDef =           new Box2D.Dynamics.b2BodyDef();
    + 32             bodyDef.type =          bodyData.bodyType;
    + 33             bodyDef.position.Set( bodyData.x/CAAT.PMR, bodyData.y/CAAT.PMR );
    + 34 
    + 35             // link entre cuerpo fisico box2d y caat.
    + 36             fixDef.userData=        bodyData.userData;
    + 37             bodyDef.userData=       bodyData.userData;
    + 38 
    + 39             var worldBody=          world.CreateBody(bodyDef);
    + 40             var worldBodyFixture=   worldBody.CreateFixture(fixDef);
    + 41 
    + 42             if ( bodyData.isSensor ) {
    + 43                 worldBodyFixture.SetSensor(true);
    + 44             }
    + 45 
    + 46             return {
    + 47                 worldBody:          worldBody,
    + 48                 worldBodyFixture:   worldBodyFixture,
    + 49                 fixDef:             fixDef,
    + 50                 bodyDef:            bodyDef
    + 51             };
    + 52         }
    + 53     },
    + 54     extendsWith : {
    + 55 
    + 56         /**
    + 57          * @lends CAAT.Foundation.Box2D.B2DCircularBody.prototype
    + 58          */
    + 59 
    + 60 
    + 61         /**
    + 62          * Default radius.
    + 63          */
    + 64         radius: 1,
    + 65 
    + 66         /**
    + 67          * Create a box2d body and link it to this CAAT.Actor instance.
    + 68          * @param world {Box2D.Dynamics.b2World} a Box2D world instance
    + 69          * @param bodyData {object}
    + 70          */
    + 71         createBody : function(world, bodyData) {
    + 72 
    + 73             var scale= (bodyData.radius || 1);
    + 74             scale= scale+ (bodyData.bodyDefScaleTolerance || 0)*Math.random();
    + 75             bodyData.radius= scale;
    + 76 
    + 77             CAAT.Foundation.Box2D.B2DCircularBody.superclass.createBody.call(this,world,bodyData);
    + 78             var box2D_data= CAAT.Foundation.Box2D.B2DCircularBody.createCircularBody(world,bodyData);
    + 79 
    + 80             bodyData.userData.actor=         this;
    + 81 
    + 82             this.worldBody=         box2D_data.worldBody;
    + 83             this.worldBodyFixture=  box2D_data.worldBodyFixture;
    + 84             this.fixtureDef=        box2D_data.fixDef;
    + 85             this.bodyDef=           box2D_data.bodyDef;
    + 86             this.bodyData=          bodyData;
    + 87 
    + 88             this.setFillStyle(this.worldBodyFixture.IsSensor() ? 'red' : 'green').
    + 89                     setBackgroundImage(this.image).
    + 90                     setSize(2*bodyData.radius,2*bodyData.radius).
    + 91                     setImageTransformation(CAAT.Foundation.SpriteImage.TR_FIXED_TO_SIZE);
    + 92 
    + 93 
    + 94             return this;
    + 95         }
    + 96     }
    + 97 
    + 98 });
    + 99 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DPolygonBody.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DPolygonBody.js.html new file mode 100644 index 00000000..155f4b29 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Box2D_B2DPolygonBody.js.html @@ -0,0 +1,186 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name B2DPolygonBody
    +  5      * @memberOf CAAT.Foundation.Box2D
    +  6      * @extends CAAT.Foundation.Box2D.B2DBodyActor
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Foundation.Box2D.B2DPolygonBody",
    + 11     depends : [
    + 12         "CAAT.Foundation.Box2D.B2DBodyActor",
    + 13         "CAAT.Foundation.SpriteImage"
    + 14     ],
    + 15     aliases : ["CAAT.B2DPolygonBody"],
    + 16     constants: {
    + 17 
    + 18         /**
    + 19          * @lends CAAT.Foundation.Box2D.B2DPolygonBody
    + 20          */
    + 21 
    + 22         TYPE: {
    + 23             EDGE:   'edge',
    + 24             BOX:    'box',
    + 25             POLYGON:'polygon'
    + 26         },
    + 27 
    + 28         /**
    + 29          * Helper function to aid in box2d polygon shaped bodies.
    + 30          * @param world
    + 31          * @param bodyData
    + 32          */
    + 33         createPolygonBody : function(world, bodyData) {
    + 34             var fixDef = new Box2D.Dynamics.b2FixtureDef();
    + 35             fixDef.density = bodyData.density;
    + 36             fixDef.friction = bodyData.friction;
    + 37             fixDef.restitution = bodyData.restitution;
    + 38             fixDef.shape = new Box2D.Collision.Shapes.b2PolygonShape();
    + 39 
    + 40             var minx = Number.MAX_VALUE;
    + 41             var maxx = -Number.MAX_VALUE;
    + 42             var miny = Number.MAX_VALUE;
    + 43             var maxy = -Number.MAX_VALUE;
    + 44 
    + 45             var vec = [];
    + 46 
    + 47             var scale = (bodyData.bodyDefScale || 1);
    + 48             scale = scale + (bodyData.bodyDefScaleTolerance || 0) * Math.random();
    + 49 
    + 50             for (var i = 0; i < bodyData.bodyDef.length; i++) {
    + 51                 var x = bodyData.bodyDef[i].x * scale;
    + 52                 var y = bodyData.bodyDef[i].y * scale;
    + 53                 if (x < minx) {
    + 54                     minx = x;
    + 55                 }
    + 56                 if (x > maxx) {
    + 57                     maxx = x;
    + 58                 }
    + 59                 if (y < miny) {
    + 60                     miny = y;
    + 61                 }
    + 62                 if (y > maxy) {
    + 63                     maxy = y;
    + 64                 }
    + 65 /*
    + 66                 x += bodyData.x || 0;
    + 67                 y += bodyData.y || 0;
    + 68                 */
    + 69                 vec.push(new Box2D.Common.Math.b2Vec2(x / CAAT.PMR, y / CAAT.PMR));
    + 70             }
    + 71 
    + 72             var boundingBox = [
    + 73                 {x:minx, y:miny},
    + 74                 {x:maxx, y:maxy}
    + 75             ];
    + 76 
    + 77             var bodyDef = new Box2D.Dynamics.b2BodyDef();
    + 78             bodyDef.type = bodyData.bodyType;
    + 79             bodyDef.position.Set(
    + 80                 ((maxx - minx) / 2 + (bodyData.x || 0)) / CAAT.PMR,
    + 81                 ((maxy - miny) / 2 + (bodyData.y || 0)) / CAAT.PMR );
    + 82 
    + 83             if (bodyData.polygonType === CAAT.Foundation.Box2D.B2DPolygonBody.TYPE.EDGE) {
    + 84 
    + 85                 var v0= new Box2D.Common.Math.b2Vec2(vec[0].x, vec[0].y );
    + 86                 var v1= new Box2D.Common.Math.b2Vec2(vec[1].x-vec[0].x, vec[1].y-vec[0].y );
    + 87 
    + 88                 bodyDef.position.Set(v0.x, v0.y);
    + 89                 fixDef.shape.SetAsEdge(new Box2D.Common.Math.b2Vec2(0,0), v1);
    + 90 
    + 91 
    + 92             } else if (bodyData.polygonType === CAAT.Foundation.Box2D.B2DPolygonBody.TYPE.BOX) {
    + 93 
    + 94                 fixDef.shape.SetAsBox(
    + 95                     (maxx - minx) / 2 / CAAT.PMR,
    + 96                     (maxy - miny) / 2 / CAAT.PMR);
    + 97 
    + 98             } else if (bodyData.polygonType === CAAT.Foundation.Box2D.B2DPolygonBody.TYPE.POLYGON ) {
    + 99 
    +100                 fixDef.shape.SetAsArray(vec, vec.length);
    +101 
    +102             } else {
    +103                 throw 'Unkown bodyData polygonType: '+bodyData.polygonType;
    +104             }
    +105 
    +106             // link entre cuerpo fisico box2d y caat.
    +107             fixDef.userData = bodyData.userData;
    +108             bodyDef.userData = bodyData.userData;
    +109 
    +110             var worldBody = world.CreateBody(bodyDef);
    +111             var worldBodyFixture = worldBody.CreateFixture(fixDef);
    +112 
    +113 
    +114             if (bodyData.isSensor) {
    +115                 worldBodyFixture.SetSensor(true);
    +116             }
    +117 
    +118             return {
    +119                 worldBody:          worldBody,
    +120                 worldBodyFixture:   worldBodyFixture,
    +121                 fixDef:             fixDef,
    +122                 bodyDef:            bodyDef,
    +123                 boundingBox:        boundingBox
    +124             };
    +125         }
    +126     },
    +127     extendsClass : "CAAT.Foundation.Box2D.B2DBodyActor",
    +128     extendsWith : {
    +129 
    +130         /**
    +131          * @lends CAAT.Foundation.Box2D.B2DPolygonBody.prototype
    +132          */
    +133 
    +134         /**
    +135          * Measured body's bounding box.
    +136          */
    +137         boundingBox: null,
    +138 
    +139         /**
    +140          * Get on-screen distance joint coordinate.
    +141          */
    +142         getDistanceJointLocalAnchor : function() {
    +143             var b= this.worldBody;
    +144             var poly= b.GetFixtureList().GetShape().GetLocalCenter();
    +145             return poly;
    +146         },
    +147 
    +148         /**
    +149          * Create a box2d body and link it to this CAAT.Actor.
    +150          * @param world {Box2D.Dynamics.b2World}
    +151          * @param bodyData {object}
    +152          */
    +153         createBody : function(world, bodyData) {
    +154             CAAT.Foundation.Box2D.B2DPolygonBody.superclass.createBody.call(this,world,bodyData);
    +155 
    +156             var box2D_data= CAAT.Foundation.Box2D.B2DPolygonBody.createPolygonBody(world,bodyData);
    +157 
    +158             bodyData.userData.actor = this;
    +159 
    +160             this.worldBody=         box2D_data.worldBody;
    +161             this.worldBodyFixture=  box2D_data.worldBodyFixture;
    +162             this.fixtureDef=        box2D_data.fixDef;
    +163             this.bodyDef=           box2D_data.bodyDef;
    +164             this.bodyData=          bodyData;
    +165             this.boundingBox=       box2D_data.boundingBox;
    +166 
    +167             this.setBackgroundImage( bodyData.image ).
    +168                 setSize(
    +169                     box2D_data.boundingBox[1].x-box2D_data.boundingBox[0].x+1,
    +170                     box2D_data.boundingBox[1].y-box2D_data.boundingBox[0].y+1 ).
    +171                 setFillStyle( box2D_data.worldBodyFixture.IsSensor() ? '#0f0' : '#f00').
    +172                 setImageTransformation(CAAT.Foundation.SpriteImage.TR_FIXED_TO_SIZE);
    +173 
    +174             return this;
    +175         }
    +176     }
    +177 
    +178 });
    +179 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Director.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Director.js.html new file mode 100644 index 00000000..1929ae1e --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Director.js.html @@ -0,0 +1,3020 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  **/
    +  5 
    +  6 CAAT.Module({
    +  7 
    +  8     /**
    +  9      * @name Director
    + 10      * @memberOf CAAT.Foundation
    + 11      * @extends CAAT.Foundation.ActorContainer
    + 12      *
    + 13      * @constructor
    + 14      */
    + 15 
    + 16     defines:"CAAT.Foundation.Director",
    + 17     aliases:["CAAT.Director"],
    + 18     extendsClass:"CAAT.Foundation.ActorContainer",
    + 19     depends:[
    + 20         "CAAT.Core.Class",
    + 21         "CAAT.Core.Constants",
    + 22 
    + 23         "CAAT.Foundation.ActorContainer",
    + 24         "CAAT.Module.Audio.AudioManager",
    + 25         "CAAT.Module.Runtime.BrowserInfo",
    + 26         "CAAT.Module.Debug.Debug",
    + 27         "CAAT.Math.Point",
    + 28         "CAAT.Math.Rectangle",
    + 29         "CAAT.Math.Matrix",
    + 30         "CAAT.Foundation.Timer.TimerManager",
    + 31         "CAAT.Foundation.Actor",
    + 32         "CAAT.Foundation.Scene",
    + 33         "CAAT.Event.AnimationLoop",
    + 34         "CAAT.Event.Input",
    + 35         "CAAT.Event.KeyEvent",
    + 36         "CAAT.Event.MouseEvent",
    + 37         "CAAT.Event.TouchEvent",
    + 38 
    + 39         "CAAT.WebGL.Program",
    + 40         "CAAT.WebGL.ColorProgram",
    + 41         "CAAT.WebGL.TextureProgram",
    + 42         "CAAT.WebGL.GLU",
    + 43 
    + 44         "CAAT.Module.TexturePacker.TexturePageManager"
    + 45     ],
    + 46     constants:{
    + 47         /**
    + 48          * @lends  CAAT.Foundation.Director
    + 49          */
    + 50 
    + 51         /** @const @type {number} */ RENDER_MODE_CONTINUOUS:1, // redraw every frame
    + 52         /** @const @type {number} */ RENDER_MODE_DIRTY:2, // suitable for evented CAAT.
    + 53 
    + 54         /** @const @type {number} */ CLEAR_DIRTY_RECTS:1,
    + 55         /** @const @type {number} */ CLEAR_ALL:true,
    + 56         /** @const @type {number} */ CLEAR_NONE:false,
    + 57 
    + 58         /** @const @type {number} */ RESIZE_NONE:1,
    + 59         /** @const @type {number} */ RESIZE_WIDTH:2,
    + 60         /** @const @type {number} */ RESIZE_HEIGHT:4,
    + 61         /** @const @type {number} */ RESIZE_BOTH:8,
    + 62         /** @const @type {number} */ RESIZE_PROPORTIONAL:16
    + 63     },
    + 64     extendsWith:function () {
    + 65         return {
    + 66 
    + 67             /**
    + 68              * @lends  CAAT.Foundation.Director.prototype
    + 69              */
    + 70 
    + 71             __init:function () {
    + 72                 this.__super();
    + 73 
    + 74                 this.browserInfo = CAAT.Module.Runtime.BrowserInfo;
    + 75                 this.audioManager = new CAAT.Module.Audio.AudioManager().initialize(8);
    + 76                 this.scenes = [];
    + 77                 this.imagesCache= [];
    + 78 
    + 79                 // input related variables initialization
    + 80                 this.mousePoint = new CAAT.Math.Point(0, 0, 0);
    + 81                 this.prevMousePoint = new CAAT.Math.Point(0, 0, 0);
    + 82                 this.screenMousePoint = new CAAT.Math.Point(0, 0, 0);
    + 83                 this.isMouseDown = false;
    + 84                 this.lastSelectedActor = null;
    + 85                 this.dragging = false;
    + 86 
    + 87                 this.cDirtyRects = [];
    + 88                 this.sDirtyRects = [];
    + 89                 this.dirtyRects = [];
    + 90                 for (var i = 0; i < 64; i++) {
    + 91                     this.dirtyRects.push(new CAAT.Math.Rectangle());
    + 92                 }
    + 93                 this.dirtyRectsIndex = 0;
    + 94                 this.touches = {};
    + 95 
    + 96                 this.timerManager = new CAAT.Foundation.Timer.TimerManager();
    + 97                 this.__map= {};
    + 98 
    + 99                 return this;
    +100             },
    +101 
    +102             /**
    +103              * flag indicating debug mode. It will draw affedted screen areas.
    +104              * @type {boolean}
    +105              */
    +106             debug:false,
    +107 
    +108             /**
    +109              * Set CAAT render mode. Right now, this takes no effect.
    +110              */
    +111             renderMode:CAAT.Foundation.Director.RENDER_MODE_CONTINUOUS,
    +112 
    +113             /**
    +114              * This method will be called before rendering any director scene.
    +115              * Use this method to calculate your physics for example.
    +116              * @private
    +117              */
    +118             onRenderStart:null,
    +119 
    +120             /**
    +121              * This method will be called after rendering any director scene.
    +122              * Use this method to clean your physics forces for example.
    +123              * @private
    +124              */
    +125             onRenderEnd:null,
    +126 
    +127             // input related attributes
    +128             /**
    +129              * mouse coordinate related to canvas 0,0 coord.
    +130              * @private
    +131              */
    +132             mousePoint:null,
    +133 
    +134             /**
    +135              * previous mouse position cache. Needed for drag events.
    +136              * @private
    +137              */
    +138             prevMousePoint:null,
    +139 
    +140             /**
    +141              * screen mouse coordinates.
    +142              * @private
    +143              */
    +144             screenMousePoint:null,
    +145 
    +146             /**
    +147              * is the left mouse button pressed ?.
    +148              * Needed to handle dragging.
    +149              */
    +150             isMouseDown:false,
    +151 
    +152             /**
    +153              * director's last actor receiving input.
    +154              * Needed to set capture for dragging events.
    +155              */
    +156             lastSelectedActor:null,
    +157 
    +158             /**
    +159              * is input in drag mode ?
    +160              */
    +161             dragging:false,
    +162 
    +163             // other attributes
    +164 
    +165             /**
    +166              * This director scene collection.
    +167              * @type {Array.<CAAT.Foundation.Scene>}
    +168              */
    +169             scenes:null,
    +170 
    +171             /**
    +172              * The current Scene. This and only this will receive events.
    +173              */
    +174             currentScene:null,
    +175 
    +176             /**
    +177              * The canvas the Director draws on.
    +178              * @private
    +179              */
    +180             canvas:null,
    +181 
    +182             /**
    +183              * This director´s canvas rendering context.
    +184              */
    +185             ctx:null,
    +186 
    +187             /**
    +188              * director time.
    +189              * @private
    +190              */
    +191             time:0,
    +192 
    +193             /**
    +194              * global director timeline.
    +195              * @private
    +196              */
    +197             timeline:0,
    +198 
    +199             /**
    +200              * An array of JSON elements of the form { id:string, image:Image }
    +201              */
    +202             imagesCache:null,
    +203 
    +204             /**
    +205              * this director´s audio manager.
    +206              * @private
    +207              */
    +208             audioManager:null,
    +209 
    +210             /**
    +211              * Clear screen strategy:
    +212              * CAAT.Foundation.Director.CLEAR_NONE : director won´t clear the background.
    +213              * CAAT.Foundation.Director.CLEAR_DIRTY_RECTS : clear only affected actors screen area.
    +214              * CAAT.Foundation.Director.CLEAR_ALL : clear the whole canvas object.
    +215              */
    +216             clear: CAAT.Foundation.Director.CLEAR_ALL,
    +217 
    +218             /**
    +219              * if CAAT.CACHE_SCENE_ON_CHANGE is set, this scene will hold a cached copy of the exiting scene.
    +220              * @private
    +221              */
    +222             transitionScene:null,
    +223 
    +224             /**
    +225              * Some browser related information.
    +226              */
    +227             browserInfo:null,
    +228 
    +229             /**
    +230              * 3d context
    +231              * @private
    +232              */
    +233             gl:null,
    +234 
    +235             /**
    +236              * is WebGL enabled as renderer ?
    +237              * @private
    +238              */
    +239             glEnabled:false,
    +240 
    +241             /**
    +242              * if webGL is on, CAAT will texture pack all images transparently.
    +243              * @private
    +244              */
    +245             glTextureManager:null,
    +246 
    +247             /**
    +248              * The only GLSL program for webGL
    +249              * @private
    +250              */
    +251             glTtextureProgram:null,
    +252             glColorProgram:null,
    +253 
    +254             /**
    +255              * webGL projection matrix
    +256              * @private
    +257              */
    +258             pMatrix:null, // projection matrix
    +259 
    +260             /**
    +261              * webGL vertex array
    +262              * @private
    +263              */
    +264             coords:null, // Float32Array
    +265 
    +266             /**
    +267              * webGL vertex indices.
    +268              * @private
    +269              */
    +270             coordsIndex:0,
    +271 
    +272             /**
    +273              * webGL uv texture indices
    +274              * @private
    +275              */
    +276             uv:null,
    +277             uvIndex:0,
    +278 
    +279             /**
    +280              * draw tris front_to_back or back_to_front ?
    +281              * @private
    +282              */
    +283             front_to_back:false,
    +284 
    +285             /**
    +286              * statistics object
    +287              */
    +288             statistics:{
    +289                 size_total:0,
    +290                 size_active:0,
    +291                 size_dirtyRects:0,
    +292                 draws:0,
    +293                 size_discarded_by_dirty_rects:0
    +294             },
    +295 
    +296             /**
    +297              * webGL current texture page. This minimizes webGL context changes.
    +298              * @private
    +299              */
    +300             currentTexturePage:0,
    +301 
    +302             /**
    +303              * webGL current shader opacity.
    +304              * BUGBUG: change this by vertex colors.
    +305              * @private
    +306              */
    +307             currentOpacity:1,
    +308 
    +309             /**
    +310              * if CAAT.NO_RAF is set (no request animation frame), this value is the setInterval returned
    +311              * id.
    +312              * @private
    +313              */
    +314             intervalId:null,
    +315 
    +316             /**
    +317              * Rendered frames counter.
    +318              */
    +319             frameCounter:0,
    +320 
    +321             /**
    +322              * Window resize strategy.
    +323              * see CAAT.Foundation.Director.RESIZE_* constants.
    +324              * @private
    +325              */
    +326             resize:1,
    +327 
    +328             /**
    +329              * Callback when the window is resized.
    +330              */
    +331             onResizeCallback:null,
    +332 
    +333             /**
    +334              * Calculated gesture event scale.
    +335              * @private
    +336              */
    +337             __gestureScale:0,
    +338 
    +339             /**
    +340              * Calculated gesture event rotation.
    +341              * @private
    +342              */
    +343             __gestureRotation:0,
    +344 
    +345             /**
    +346              * Dirty rects cache.
    +347              * An array of CAAT.Math.Rectangle object.
    +348              * @private
    +349              */
    +350             dirtyRects:null, // dirty rects cache.
    +351 
    +352             /**
    +353              * current dirty rects.
    +354              * @private
    +355              */
    +356             cDirtyRects:null, // dirty rects cache.
    +357 
    +358             /**
    +359              * Currently used dirty rects.
    +360              * @private
    +361              */
    +362             sDirtyRects:null, // scheduled dirty rects.
    +363 
    +364             /**
    +365              * Number of currently allocated dirty rects.
    +366              * @private
    +367              */
    +368             dirtyRectsIndex:0,
    +369 
    +370             /**
    +371              * Dirty rects enabled ??
    +372              * @private
    +373              */
    +374             dirtyRectsEnabled:false,
    +375 
    +376             /**
    +377              * Number of dirty rects.
    +378              * @private
    +379              */
    +380             nDirtyRects:0,
    +381 
    +382             /**
    +383              * Dirty rects count debug info.
    +384              * @private
    +385              */
    +386             drDiscarded:0, // discarded by dirty rects.
    +387 
    +388             /**
    +389              * Is this director stopped ?
    +390              */
    +391             stopped:false, // is stopped, this director will do nothing.
    +392 
    +393             /**
    +394              * currently unused.
    +395              * Intended to run caat in evented mode.
    +396              * @private
    +397              */
    +398             needsRepaint:false,
    +399 
    +400             /**
    +401              * Touches information. Associate touch.id with an actor and original touch info.
    +402              * @private
    +403              */
    +404             touches:null,
    +405 
    +406             /**
    +407              * Director´s timer manager.
    +408              * Each scene has a timerManager as well.
    +409              * The difference is the scope. Director´s timers will always be checked whereas scene´ timers
    +410              * will only be scheduled/checked when the scene is director´ current scene.
    +411              * @private
    +412              */
    +413             timerManager:null,
    +414 
    +415             /**
    +416              * Retina display deicePixels/backingStorePixels ratio
    +417              * @private
    +418              */
    +419             SCREEN_RATIO : 1,
    +420 
    +421             __map : null,
    +422 
    +423             clean:function () {
    +424                 this.scenes = null;
    +425                 this.currentScene = null;
    +426                 this.imagesCache = null;
    +427                 this.audioManager = null;
    +428                 this.isMouseDown = false;
    +429                 this.lastSelectedActor = null;
    +430                 this.dragging = false;
    +431                 this.__gestureScale = 0;
    +432                 this.__gestureRotation = 0;
    +433                 this.dirty = true;
    +434                 this.dirtyRects = null;
    +435                 this.cDirtyRects = null;
    +436                 this.dirtyRectsIndex = 0;
    +437                 this.dirtyRectsEnabled = false;
    +438                 this.nDirtyRects = 0;
    +439                 this.onResizeCallback = null;
    +440                 this.__map= {};
    +441                 return this;
    +442             },
    +443 
    +444             cancelPlay : function(id) {
    +445                 return this.audioManager.cancelPlay(id);
    +446             },
    +447 
    +448             cancelPlayByChannel : function(audioObject) {
    +449                 return this.audioManager.cancelPlayByChannel(audioObject);
    +450             },
    +451 
    +452             setAudioFormatExtensions : function( extensions ) {
    +453                 this.audioManager.setAudioFormatExtensions(extensions);
    +454                 return this;
    +455             },
    +456 
    +457             setValueForKey : function( key, value ) {
    +458                 this.__map[key]= value;
    +459                 return this;
    +460             },
    +461 
    +462             getValueForKey : function( key ) {
    +463                 return this.__map[key];
    +464                 return this;
    +465             },
    +466 
    +467             createTimer:function (startTime, duration, callback_timeout, callback_tick, callback_cancel) {
    +468                 return this.timerManager.createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel, this);
    +469             },
    +470 
    +471             requestRepaint:function () {
    +472                 this.needsRepaint = true;
    +473             },
    +474 
    +475             getCurrentScene:function () {
    +476                 return this.currentScene;
    +477             },
    +478 
    +479             checkDebug:function () {
    +480                 if (!navigator.isCocoonJS && CAAT.DEBUG) {
    +481                     var dd = new CAAT.Module.Debug.Debug().initialize(this.width, 60);
    +482                     this.debugInfo = dd.debugInfo.bind(dd);
    +483                 }
    +484             },
    +485             getRenderType:function () {
    +486                 return this.glEnabled ? 'WEBGL' : 'CANVAS';
    +487             },
    +488             windowResized:function (w, h) {
    +489                 var c = CAAT.Foundation.Director;
    +490                 switch (this.resize) {
    +491                     case c.RESIZE_WIDTH:
    +492                         this.setBounds(0, 0, w, this.height);
    +493                         break;
    +494                     case c.RESIZE_HEIGHT:
    +495                         this.setBounds(0, 0, this.width, h);
    +496                         break;
    +497                     case c.RESIZE_BOTH:
    +498                         this.setBounds(0, 0, w, h);
    +499                         break;
    +500                     case c.RESIZE_PROPORTIONAL:
    +501                         this.setScaleProportional(w, h);
    +502                         break;
    +503                 }
    +504 
    +505                 if (this.glEnabled) {
    +506                     this.glReset();
    +507                 }
    +508 
    +509                 if (this.onResizeCallback) {
    +510                     this.onResizeCallback(this, w, h);
    +511                 }
    +512 
    +513             },
    +514             setScaleProportional:function (w, h) {
    +515 
    +516                 var factor = Math.min(w / this.referenceWidth, h / this.referenceHeight);
    +517 
    +518                 this.canvas.width = this.referenceWidth * factor;
    +519                 this.canvas.height = this.referenceHeight * factor;
    +520                 this.ctx = this.canvas.getContext(this.glEnabled ? 'experimental-webgl' : '2d');
    +521 
    +522                 this.__setupRetina();
    +523 
    +524                 this.setScaleAnchored(factor * this.scaleX, factor * this.scaleY, 0, 0);
    +525 //                this.setScaleAnchored(factor, factor, 0, 0);
    +526 
    +527                 if (this.glEnabled) {
    +528                     this.glReset();
    +529                 }
    +530             },
    +531             /**
    +532              * Enable window resize events and set redimension policy. A callback functio could be supplied
    +533              * to be notified on a Director redimension event. This is necessary in the case you set a redim
    +534              * policy not equal to RESIZE_PROPORTIONAL. In those redimension modes, director's area and their
    +535              * children scenes are resized to fit the new area. But scenes content is not resized, and have
    +536              * no option of knowing so uless an onResizeCallback function is supplied.
    +537              *
    +538              * @param mode {number}  RESIZE_BOTH, RESIZE_WIDTH, RESIZE_HEIGHT, RESIZE_NONE.
    +539              * @param onResizeCallback {function(director{CAAT.Director}, width{integer}, height{integer})} a callback
    +540              * to notify on canvas resize.
    +541              */
    +542             enableResizeEvents:function (mode, onResizeCallback) {
    +543                 var dd= CAAT.Foundation.Director;
    +544                 if (mode === dd.RESIZE_BOTH || mode === dd.RESIZE_WIDTH || mode === dd.RESIZE_HEIGHT || mode === dd.RESIZE_PROPORTIONAL) {
    +545                     this.referenceWidth = this.width;
    +546                     this.referenceHeight = this.height;
    +547                     this.resize = mode;
    +548                     CAAT.registerResizeListener(this);
    +549                     this.onResizeCallback = onResizeCallback;
    +550                     this.windowResized(window.innerWidth, window.innerHeight);
    +551                 } else {
    +552                     CAAT.unregisterResizeListener(this);
    +553                     this.onResizeCallback = null;
    +554                 }
    +555 
    +556                 return this;
    +557             },
    +558 
    +559             __setupRetina : function() {
    +560 
    +561                 if ( CAAT.RETINA_DISPLAY_ENABLED ) {
    +562 
    +563                     // The world is full of opensource awesomeness.
    +564                     //
    +565                     // Source: http://www.html5rocks.com/en/tutorials/canvas/hidpi/
    +566                     //
    +567                     var devicePixelRatio= CAAT.Module.Runtime.BrowserInfo.DevicePixelRatio;
    +568                     var backingStoreRatio = this.ctx.webkitBackingStorePixelRatio ||
    +569                                             this.ctx.mozBackingStorePixelRatio ||
    +570                                             this.ctx.msBackingStorePixelRatio ||
    +571                                             this.ctx.oBackingStorePixelRatio ||
    +572                                             this.ctx.backingStorePixelRatio ||
    +573                                             1;
    +574 
    +575                     var ratio = devicePixelRatio / backingStoreRatio;
    +576 
    +577                     if (devicePixelRatio !== backingStoreRatio) {
    +578 
    +579                         var oldWidth = this.canvas.width;
    +580                         var oldHeight = this.canvas.height;
    +581 
    +582                         this.canvas.width = oldWidth * ratio;
    +583                         this.canvas.height = oldHeight * ratio;
    +584 
    +585                         this.canvas.style.width = oldWidth + 'px';
    +586                         this.canvas.style.height = oldHeight + 'px';
    +587 
    +588                         this.setScaleAnchored( ratio, ratio, 0, 0 );
    +589                     } else {
    +590                         this.setScaleAnchored( 1, 1, 0, 0 );
    +591                     }
    +592 
    +593                     this.SCREEN_RATIO= ratio;
    +594                 } else {
    +595                     this.setScaleAnchored( 1, 1, 0, 0 );
    +596                 }
    +597 
    +598                 for (var i = 0; i < this.scenes.length; i++) {
    +599                     this.scenes[i].setBounds(0, 0, this.width, this.height);
    +600                 }
    +601             },
    +602 
    +603             /**
    +604              * Set this director's bounds as well as its contained scenes.
    +605              * @param x {number} ignored, will be 0.
    +606              * @param y {number} ignored, will be 0.
    +607              * @param w {number} director width.
    +608              * @param h {number} director height.
    +609              *
    +610              * @return this
    +611              */
    +612             setBounds:function (x, y, w, h) {
    +613 
    +614                 CAAT.Foundation.Director.superclass.setBounds.call(this, x, y, w, h);
    +615 
    +616                 if ( this.canvas.width!==w ) {
    +617                     this.canvas.width = w;
    +618                 }
    +619 
    +620                 if ( this.canvas.height!==h ) {
    +621                     this.canvas.height = h;
    +622                 }
    +623 
    +624                 this.ctx = this.canvas.getContext(this.glEnabled ? 'experimental-webgl' : '2d');
    +625 
    +626                 this.__setupRetina();
    +627 
    +628                 if (this.glEnabled) {
    +629                     this.glReset();
    +630                 }
    +631 
    +632                 return this;
    +633             },
    +634             /**
    +635              * This method performs Director initialization. Must be called once.
    +636              * If the canvas parameter is not set, it will create a Canvas itself,
    +637              * and the developer must explicitly add the canvas to the desired DOM position.
    +638              * This method will also set the Canvas dimension to the specified values
    +639              * by width and height parameters.
    +640              *
    +641              * @param width {number} a canvas width
    +642              * @param height {number} a canvas height
    +643              * @param canvas {HTMLCanvasElement=} An optional Canvas object.
    +644              * @param proxy {HTMLElement} this object can be an event proxy in case you'd like to layer different elements
    +645              *              and want events delivered to the correct element.
    +646              *
    +647              * @return this
    +648              */
    +649             initialize:function (width, height, canvas, proxy) {
    +650                 if ( typeof canvas!=="undefined" ) {
    +651                     if ( isString(canvas) ) {
    +652                         canvas= document.getElementById(canvas);
    +653                     } else if ( !(canvas instanceof HTMLCanvasElement ) ) {
    +654                         console.log("Canvas is a: "+canvas+" ???");
    +655                     }
    +656                 }
    +657 
    +658                 if (!canvas) {
    +659                     canvas = document.createElement('canvas');
    +660                     document.body.appendChild(canvas);
    +661                 }
    +662 
    +663                 this.canvas = canvas;
    +664 
    +665                 if (typeof proxy === 'undefined') {
    +666                     proxy = canvas;
    +667                 }
    +668 
    +669                 this.setBounds(0, 0, width, height);
    +670                 this.enableEvents(proxy);
    +671 
    +672                 this.timeline = new Date().getTime();
    +673 
    +674                 // transition scene
    +675                 if (CAAT.CACHE_SCENE_ON_CHANGE) {
    +676                     this.transitionScene = new CAAT.Foundation.Scene().setBounds(0, 0, width, height);
    +677                     var transitionCanvas = document.createElement('canvas');
    +678                     transitionCanvas.width = width;
    +679                     transitionCanvas.height = height;
    +680                     var transitionImageActor = new CAAT.Foundation.Actor().setBackgroundImage(transitionCanvas);
    +681                     this.transitionScene.ctx = transitionCanvas.getContext('2d');
    +682                     this.transitionScene.addChildImmediately(transitionImageActor);
    +683                     this.transitionScene.setEaseListener(this);
    +684                 }
    +685 
    +686                 this.checkDebug();
    +687 
    +688                 return this;
    +689             },
    +690             glReset:function () {
    +691                 this.pMatrix = CAAT.WebGL.GLU.makeOrtho(0, this.referenceWidth, this.referenceHeight, 0, -1, 1);
    +692                 this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);
    +693                 this.glColorProgram.setMatrixUniform(this.pMatrix);
    +694                 this.glTextureProgram.setMatrixUniform(this.pMatrix);
    +695                 this.gl.viewportWidth = this.canvas.width;
    +696                 this.gl.viewportHeight = this.canvas.height;
    +697             },
    +698             /**
    +699              * Experimental.
    +700              * Initialize a gl enabled director.
    +701              */
    +702             initializeGL:function (width, height, canvas, proxy) {
    +703 
    +704                 if (!canvas) {
    +705                     canvas = document.createElement('canvas');
    +706                     document.body.appendChild(canvas);
    +707                 }
    +708 
    +709                 canvas.width = width;
    +710                 canvas.height = height;
    +711 
    +712                 if (typeof proxy === 'undefined') {
    +713                     proxy = canvas;
    +714                 }
    +715 
    +716                 this.referenceWidth = width;
    +717                 this.referenceHeight = height;
    +718 
    +719                 var i;
    +720 
    +721                 try {
    +722                     this.gl = canvas.getContext("experimental-webgl"/*, {antialias: false}*/);
    +723                     this.gl.viewportWidth = width;
    +724                     this.gl.viewportHeight = height;
    +725                     CAAT.GLRENDER = true;
    +726                 } catch (e) {
    +727                 }
    +728 
    +729                 if (this.gl) {
    +730                     this.canvas = canvas;
    +731                     this.setBounds(0, 0, width, height);
    +732 
    +733                     this.enableEvents(canvas);
    +734                     this.timeline = new Date().getTime();
    +735 
    +736                     this.glColorProgram = new CAAT.WebGL.ColorProgram(this.gl).create().initialize();
    +737                     this.glTextureProgram = new CAAT.WebGL.TextureProgram(this.gl).create().initialize();
    +738                     this.glTextureProgram.useProgram();
    +739                     this.glReset();
    +740 
    +741                     var maxTris = 512;
    +742                     this.coords = new Float32Array(maxTris * 12);
    +743                     this.uv = new Float32Array(maxTris * 8);
    +744 
    +745                     this.gl.clearColor(0.0, 0.0, 0.0, 255);
    +746 
    +747                     if (this.front_to_back) {
    +748                         this.gl.clearDepth(1.0);
    +749                         this.gl.enable(this.gl.DEPTH_TEST);
    +750                         this.gl.depthFunc(this.gl.LESS);
    +751                     } else {
    +752                         this.gl.disable(this.gl.DEPTH_TEST);
    +753                     }
    +754 
    +755                     this.gl.enable(this.gl.BLEND);
    +756 // Fix FF                this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);
    +757                     this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA);
    +758                     this.glEnabled = true;
    +759 
    +760                     this.checkDebug();
    +761                 } else {
    +762                     // fallback to non gl enabled canvas.
    +763                     return this.initialize(width, height, canvas);
    +764                 }
    +765 
    +766                 return this;
    +767             },
    +768             /**
    +769              * Creates an initializes a Scene object.
    +770              * @return {CAAT.Scene}
    +771              */
    +772             createScene:function () {
    +773                 var scene = new CAAT.Scene();
    +774                 this.addScene(scene);
    +775                 return scene;
    +776             },
    +777             setImagesCache:function (imagesCache, tpW, tpH) {
    +778 
    +779                 if (!imagesCache || !imagesCache.length ) {
    +780                     return this;
    +781                 }
    +782 
    +783                 var i;
    +784 
    +785                 if (null !== this.glTextureManager) {
    +786                     this.glTextureManager.deletePages();
    +787                     this.glTextureManager = null;
    +788                 }
    +789 
    +790                 // delete previous image identifiers
    +791                 if (this.imagesCache) {
    +792                     var ids = [];
    +793                     for (i = 0; i < this.imagesCache.length; i++) {
    +794                         ids.push(this.imagesCache[i].id);
    +795                     }
    +796 
    +797                     for (i = 0; i < ids.length; i++) {
    +798                         delete this.imagesCache[ ids[i] ];
    +799                     }
    +800                 }
    +801 
    +802                 this.imagesCache = imagesCache;
    +803 
    +804                 if (imagesCache) {
    +805                     for (i = 0; i < imagesCache.length; i++) {
    +806                         this.imagesCache[ imagesCache[i].id ] = imagesCache[i].image;
    +807                     }
    +808                 }
    +809 
    +810                 this.tpW = tpW || 2048;
    +811                 this.tpH = tpH || 2048;
    +812 
    +813                 this.updateGLPages();
    +814 
    +815                 return this;
    +816             },
    +817             updateGLPages:function () {
    +818                 if (this.glEnabled) {
    +819 
    +820                     this.glTextureManager = new CAAT.Module.TexturePacker.TexturePageManager();
    +821                     this.glTextureManager.createPages(this.gl, this.tpW, this.tpH, this.imagesCache);
    +822 
    +823                     this.currentTexturePage = this.glTextureManager.pages[0];
    +824                     this.glTextureProgram.setTexture(this.currentTexturePage.texture);
    +825                 }
    +826             },
    +827             setGLTexturePage:function (tp) {
    +828                 this.currentTexturePage = tp;
    +829                 this.glTextureProgram.setTexture(tp.texture);
    +830                 return this;
    +831             },
    +832             /**
    +833              * Add a new image to director's image cache. If gl is enabled and the 'noUpdateGL' is not set to true this
    +834              * function will try to recreate the whole GL texture pages.
    +835              * If many handcrafted images are to be added to the director, some performance can be achieved by calling
    +836              * <code>director.addImage(id,image,false)</code> many times and a final call with
    +837              * <code>director.addImage(id,image,true)</code> to finally command the director to create texture pages.
    +838              *
    +839              * @param id {string|object} an identitifier to retrieve the image with
    +840              * @param image {Image|HTMLCanvasElement} image to add to cache
    +841              * @param noUpdateGL {!boolean} unless otherwise stated, the director will
    +842              *  try to recreate the texture pages.
    +843              */
    +844             addImage:function (id, image, noUpdateGL) {
    +845                 if (this.getImage(id)) {
    +846 //                    for (var i = 0; i < this.imagesCache.length; i++) {
    +847                     for( var i in this.imagesCache ) {
    +848                         if (this.imagesCache[i].id === id) {
    +849                             this.imagesCache[i].image = image;
    +850                             break;
    +851                         }
    +852                     }
    +853                     this.imagesCache[ id ] = image;
    +854                 } else {
    +855                     this.imagesCache.push({ id:id, image:image });
    +856                     this.imagesCache[id] = image;
    +857                 }
    +858 
    +859                 if (!!!noUpdateGL) {
    +860                     this.updateGLPages();
    +861                 }
    +862             },
    +863             deleteImage:function (id, noUpdateGL) {
    +864                 for (var i = 0; i < this.imagesCache.length; i++) {
    +865                     if (this.imagesCache[i].id === id) {
    +866                         delete this.imagesCache[id];
    +867                         this.imagesCache.splice(i, 1);
    +868                         break;
    +869                     }
    +870                 }
    +871                 if (!!!noUpdateGL) {
    +872                     this.updateGLPages();
    +873                 }
    +874             },
    +875             setGLCurrentOpacity:function (opacity) {
    +876                 this.currentOpacity = opacity;
    +877                 this.glTextureProgram.setAlpha(opacity);
    +878             },
    +879             /**
    +880              * Render buffered elements.
    +881              * @param vertex
    +882              * @param coordsIndex
    +883              * @param uv
    +884              */
    +885             glRender:function (vertex, coordsIndex, uv) {
    +886 
    +887                 vertex = vertex || this.coords;
    +888                 uv = uv || this.uv;
    +889                 coordsIndex = coordsIndex || this.coordsIndex;
    +890 
    +891                 var gl = this.gl;
    +892 
    +893                 var numTris = coordsIndex / 12 * 2;
    +894                 var numVertices = coordsIndex / 3;
    +895 
    +896                 this.glTextureProgram.updateVertexBuffer(vertex);
    +897                 this.glTextureProgram.updateUVBuffer(uv);
    +898 
    +899                 gl.drawElements(gl.TRIANGLES, 3 * numTris, gl.UNSIGNED_SHORT, 0);
    +900 
    +901             },
    +902             glFlush:function () {
    +903                 if (this.coordsIndex !== 0) {
    +904                     this.glRender(this.coords, this.coordsIndex, this.uv);
    +905                 }
    +906                 this.coordsIndex = 0;
    +907                 this.uvIndex = 0;
    +908 
    +909                 this.statistics.draws++;
    +910             },
    +911 
    +912             findActorAtPosition:function (point) {
    +913 
    +914                 // z-order
    +915                 var cl = this.childrenList;
    +916                 for (var i = cl.length - 1; i >= 0; i--) {
    +917                     var child = this.childrenList[i];
    +918 
    +919                     var np = new CAAT.Math.Point(point.x, point.y, 0);
    +920                     var contained = child.findActorAtPosition(np);
    +921                     if (null !== contained) {
    +922                         return contained;
    +923                     }
    +924                 }
    +925 
    +926                 return this;
    +927             },
    +928 
    +929             /**
    +930              *
    +931              * Reset statistics information.
    +932              *
    +933              * @private
    +934              */
    +935             resetStats:function () {
    +936                 this.statistics.size_total = 0;
    +937                 this.statistics.size_active = 0;
    +938                 this.statistics.draws = 0;
    +939                 this.statistics.size_discarded_by_dirty_rects = 0;
    +940             },
    +941 
    +942             /**
    +943              * This is the entry point for the animation system of the Director.
    +944              * The director is fed with the elapsed time value to maintain a virtual timeline.
    +945              * This virtual timeline will provide each Scene with its own virtual timeline, and will only
    +946              * feed time when the Scene is the current Scene, or is being switched.
    +947              *
    +948              * If dirty rectangles are enabled and canvas is used for rendering, the dirty rectangles will be
    +949              * set up as a single clip area.
    +950              *
    +951              * @param time {number} integer indicating the elapsed time between two consecutive frames of the
    +952              * Director.
    +953              */
    +954             render:function (time) {
    +955 
    +956                 if (this.currentScene && this.currentScene.isPaused()) {
    +957                     return;
    +958                 }
    +959 
    +960                 this.time += time;
    +961 
    +962                 for (i = 0, l = this.childrenList.length; i < l; i++) {
    +963                     var c = this.childrenList[i];
    +964                     if (c.isInAnimationFrame(this.time) && !c.isPaused()) {
    +965                         var tt = c.time - c.start_time;
    +966                         c.timerManager.checkTimers(tt);
    +967                         c.timerManager.removeExpiredTimers();
    +968                     }
    +969                 }
    +970 
    +971 
    +972                 this.animate(this, this.time);
    +973 
    +974                 if (!navigator.isCocoonJS && CAAT.DEBUG) {
    +975                     this.resetStats();
    +976                 }
    +977 
    +978                 /**
    +979                  * draw director active scenes.
    +980                  */
    +981                 var ne = this.childrenList.length;
    +982                 var i, tt, c;
    +983                 var ctx = this.ctx;
    +984 
    +985                 if (this.glEnabled) {
    +986 
    +987                     this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
    +988                     this.coordsIndex = 0;
    +989                     this.uvIndex = 0;
    +990 
    +991                     for (i = 0; i < ne; i++) {
    +992                         c = this.childrenList[i];
    +993                         if (c.isInAnimationFrame(this.time)) {
    +994                             tt = c.time - c.start_time;
    +995                             if (c.onRenderStart) {
    +996                                 c.onRenderStart(tt);
    +997                             }
    +998                             c.paintActorGL(this, tt);
    +999                             if (c.onRenderEnd) {
    +1000                                 c.onRenderEnd(tt);
    +1001                             }
    +1002 
    +1003                             if (!c.isPaused()) {
    +1004                                 c.time += time;
    +1005                             }
    +1006 
    +1007                             if (!navigator.isCocoonJS && CAAT.DEBUG) {
    +1008                                 this.statistics.size_total += c.size_total;
    +1009                                 this.statistics.size_active += c.size_active;
    +1010                             }
    +1011 
    +1012                         }
    +1013                     }
    +1014 
    +1015                     this.glFlush();
    +1016 
    +1017                 } else {
    +1018                     ctx.globalAlpha = 1;
    +1019                     ctx.globalCompositeOperation = 'source-over';
    +1020 
    +1021                     ctx.save();
    +1022                     if (this.dirtyRectsEnabled) {
    +1023                         this.modelViewMatrix.transformRenderingContext(ctx);
    +1024 
    +1025                         if (!CAAT.DEBUG_DIRTYRECTS) {
    +1026                             ctx.beginPath();
    +1027                             this.nDirtyRects = 0;
    +1028                             var dr = this.cDirtyRects;
    +1029                             for (i = 0; i < dr.length; i++) {
    +1030                                 var drr = dr[i];
    +1031                                 if (!drr.isEmpty()) {
    +1032                                     ctx.rect(drr.x | 0, drr.y | 0, 1 + (drr.width | 0), 1 + (drr.height | 0));
    +1033                                     this.nDirtyRects++;
    +1034                                 }
    +1035                             }
    +1036                             ctx.clip();
    +1037                         } else {
    +1038                             ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
    +1039                         }
    +1040 
    +1041                     } else if (this.clear === CAAT.Foundation.Director.CLEAR_ALL) {
    +1042                         ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
    +1043                     }
    +1044 
    +1045                     for (i = 0; i < ne; i++) {
    +1046                         c = this.childrenList[i];
    +1047 
    +1048                         if (c.isInAnimationFrame(this.time)) {
    +1049                             tt = c.time - c.start_time;
    +1050                             ctx.save();
    +1051 
    +1052                             if (c.onRenderStart) {
    +1053                                 c.onRenderStart(tt);
    +1054                             }
    +1055 
    +1056                             if (!CAAT.DEBUG_DIRTYRECTS && this.dirtyRectsEnabled) {
    +1057                                 if (this.nDirtyRects) {
    +1058                                     c.paintActor(this, tt);
    +1059                                 }
    +1060                             } else {
    +1061                                 c.paintActor(this, tt);
    +1062                             }
    +1063 
    +1064                             if (c.onRenderEnd) {
    +1065                                 c.onRenderEnd(tt);
    +1066                             }
    +1067                             ctx.restore();
    +1068 
    +1069                             if (CAAT.DEBUGAABB) {
    +1070                                 ctx.globalAlpha = 1;
    +1071                                 ctx.globalCompositeOperation = 'source-over';
    +1072                                 this.modelViewMatrix.transformRenderingContextSet(ctx);
    +1073                                 c.drawScreenBoundingBox(this, tt);
    +1074                             }
    +1075 
    +1076                             if (!c.isPaused()) {
    +1077                                 c.time += time;
    +1078                             }
    +1079 
    +1080                             if (!navigator.isCocoonJS && CAAT.DEBUG) {
    +1081                                 this.statistics.size_total += c.size_total;
    +1082                                 this.statistics.size_active += c.size_active;
    +1083                                 this.statistics.size_dirtyRects = this.nDirtyRects;
    +1084                             }
    +1085 
    +1086                         }
    +1087                     }
    +1088 
    +1089                     if (this.nDirtyRects > 0 && (!navigator.isCocoonJS && CAAT.DEBUG) && CAAT.DEBUG_DIRTYRECTS) {
    +1090                         ctx.beginPath();
    +1091                         this.nDirtyRects = 0;
    +1092                         var dr = this.cDirtyRects;
    +1093                         for (i = 0; i < dr.length; i++) {
    +1094                             var drr = dr[i];
    +1095                             if (!drr.isEmpty()) {
    +1096                                 ctx.rect(drr.x | 0, drr.y | 0, 1 + (drr.width | 0), 1 + (drr.height | 0));
    +1097                                 this.nDirtyRects++;
    +1098                             }
    +1099                         }
    +1100 
    +1101                         ctx.clip();
    +1102                         ctx.fillStyle = 'rgba(160,255,150,.4)';
    +1103                         ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
    +1104                     }
    +1105 
    +1106                     ctx.restore();
    +1107                 }
    +1108 
    +1109                 this.frameCounter++;
    +1110             },
    +1111 
    +1112             inDirtyRect:function (actor) {
    +1113 
    +1114                 if (!this.dirtyRectsEnabled || CAAT.DEBUG_DIRTYRECTS) {
    +1115                     return true;
    +1116                 }
    +1117 
    +1118                 var dr = this.cDirtyRects;
    +1119                 var i;
    +1120                 var aabb = actor.AABB;
    +1121 
    +1122                 for (i = 0; i < dr.length; i++) {
    +1123                     if (dr[i].intersects(aabb)) {
    +1124                         return true;
    +1125                     }
    +1126                 }
    +1127 
    +1128                 this.statistics.size_discarded_by_dirty_rects += actor.size_total;
    +1129                 return false;
    +1130             },
    +1131 
    +1132             /**
    +1133              * A director is a very special kind of actor.
    +1134              * Its animation routine simple sets its modelViewMatrix in case some transformation's been
    +1135              * applied.
    +1136              * No behaviors are allowed for Director instances.
    +1137              * @param director {CAAT.Director} redundant reference to CAAT.Director itself
    +1138              * @param time {number} director time.
    +1139              */
    +1140             animate:function (director, time) {
    +1141 
    +1142                 this.timerManager.checkTimers(time);
    +1143 
    +1144                 this.setModelViewMatrix(this);
    +1145                 this.modelViewMatrixI = this.modelViewMatrix.getInverse();
    +1146                 this.setScreenBounds();
    +1147 
    +1148                 this.dirty = false;
    +1149                 this.invalid = false;
    +1150                 this.dirtyRectsIndex = -1;
    +1151                 this.cDirtyRects= [];
    +1152 
    +1153                 var cl = this.childrenList;
    +1154                 var cli;
    +1155                 var i, l;
    +1156 
    +1157 
    +1158                 if (this.dirtyRectsEnabled) {
    +1159                     var sdr = this.sDirtyRects;
    +1160                     if (sdr.length) {
    +1161                         for (i = 0, l = sdr.length; i < l; i++) {
    +1162                             this.addDirtyRect(sdr[i]);
    +1163                         }
    +1164                         this.sDirtyRects = [];
    +1165                     }
    +1166                 }
    +1167 
    +1168                 for (i = 0; i < cl.length; i++) {
    +1169                     cli = cl[i];
    +1170                     var tt = cli.time - cli.start_time;
    +1171                     cli.animate(this, tt);
    +1172                 }
    +1173 
    +1174                 this.timerManager.removeExpiredTimers();
    +1175 
    +1176                 return this;
    +1177             },
    +1178 
    +1179             /**
    +1180              * This method is used when asynchronous operations must produce some dirty rectangle painting.
    +1181              * This means that every operation out of the regular CAAT loop must add dirty rect operations
    +1182              * by calling this method.
    +1183              * For example setVisible() and remove.
    +1184              * @param rectangle
    +1185              */
    +1186             scheduleDirtyRect:function (rectangle) {
    +1187                 this.sDirtyRects.push(rectangle);
    +1188             },
    +1189             /**
    +1190              * Add a rectangle to the list of dirty screen areas which should be redrawn.
    +1191              * This is the opposite method to clear the whole screen and repaint everything again.
    +1192              * Despite i'm not very fond of dirty rectangles because it needs some extra calculations, this
    +1193              * procedure has shown to be speeding things up under certain situations. Nevertheless it doesn't or
    +1194              * even lowers performance under others, so it is a developer choice to activate them via a call to
    +1195              * setClear( CAAT.Director.CLEAR_DIRTY_RECTS ).
    +1196              *
    +1197              * This function, not only tracks a list of dirty rectangles, but tries to optimize the list. Overlapping
    +1198              * rectangles will be removed and intersecting ones will be unioned.
    +1199              *
    +1200              * Before calling this method, check if this.dirtyRectsEnabled is true.
    +1201              *
    +1202              * @param rectangle {CAAT.Rectangle}
    +1203              */
    +1204             addDirtyRect:function (rectangle) {
    +1205 
    +1206                 if (rectangle.isEmpty()) {
    +1207                     return;
    +1208                 }
    +1209 
    +1210                 var i, dr, j, drj;
    +1211                 var cdr = this.cDirtyRects;
    +1212 
    +1213                 for (i = 0; i < cdr.length; i++) {
    +1214                     dr = cdr[i];
    +1215                     if (!dr.isEmpty() && dr.intersects(rectangle)) {
    +1216                         var intersected = true;
    +1217                         while (intersected) {
    +1218                             dr.unionRectangle(rectangle);
    +1219 
    +1220                             for (j = 0; j < cdr.length; j++) {
    +1221                                 if (j !== i) {
    +1222                                     drj = cdr[j];
    +1223                                     if (!drj.isEmpty() && drj.intersects(dr)) {
    +1224                                         dr.unionRectangle(drj);
    +1225                                         drj.setEmpty();
    +1226                                         break;
    +1227                                     }
    +1228                                 }
    +1229                             }
    +1230 
    +1231                             if (j == cdr.length) {
    +1232                                 intersected = false;
    +1233                             }
    +1234                         }
    +1235 
    +1236                         for (j = 0; j < cdr.length; j++) {
    +1237                             if (cdr[j].isEmpty()) {
    +1238                                 cdr.splice(j, 1);
    +1239                             }
    +1240                         }
    +1241 
    +1242                         return;
    +1243                     }
    +1244                 }
    +1245 
    +1246                 this.dirtyRectsIndex++;
    +1247 
    +1248                 if (this.dirtyRectsIndex >= this.dirtyRects.length) {
    +1249                     for (i = 0; i < 32; i++) {
    +1250                         this.dirtyRects.push(new CAAT.Math.Rectangle());
    +1251                     }
    +1252                 }
    +1253 
    +1254                 var r = this.dirtyRects[ this.dirtyRectsIndex ];
    +1255 
    +1256                 r.x = rectangle.x;
    +1257                 r.y = rectangle.y;
    +1258                 r.x1 = rectangle.x1;
    +1259                 r.y1 = rectangle.y1;
    +1260                 r.width = rectangle.width;
    +1261                 r.height = rectangle.height;
    +1262 
    +1263                 this.cDirtyRects.push(r);
    +1264 
    +1265             },
    +1266             /**
    +1267              * This method draws an Scene to an offscreen canvas. This offscreen canvas is also a child of
    +1268              * another Scene (transitionScene). So instead of drawing two scenes while transitioning from
    +1269              * one to another, first of all an scene is drawn to offscreen, and that image is translated.
    +1270              * <p>
    +1271              * Until the creation of this method, both scenes where drawn while transitioning with
    +1272              * its performance penalty since drawing two scenes could be twice as expensive than drawing
    +1273              * only one.
    +1274              * <p>
    +1275              * Though a high performance increase, we should keep an eye on memory consumption.
    +1276              *
    +1277              * @param ctx a <code>canvas.getContext('2d')</code> instnce.
    +1278              * @param scene {CAAT.Foundation.Scene} the scene to draw offscreen.
    +1279              */
    +1280             renderToContext:function (ctx, scene) {
    +1281                 /**
    +1282                  * draw actors on scene.
    +1283                  */
    +1284                 if (scene.isInAnimationFrame(this.time)) {
    +1285                     ctx.setTransform(1, 0, 0, 1, 0, 0);
    +1286 
    +1287                     ctx.globalAlpha = 1;
    +1288                     ctx.globalCompositeOperation = 'source-over';
    +1289                     ctx.clearRect(0, 0, this.width, this.height);
    +1290 
    +1291                     var octx = this.ctx;
    +1292 
    +1293                     this.ctx = ctx;
    +1294                     ctx.save();
    +1295 
    +1296                     /**
    +1297                      * to draw an scene to an offscreen canvas, we have to:
    +1298                      *   1.- save diector's world model view matrix
    +1299                      *   2.- set no transformation on director since we want the offscreen to
    +1300                      *       be drawn 1:1.
    +1301                      *   3.- set world dirty flag, so that the scene will recalculate its matrices
    +1302                      *   4.- animate the scene
    +1303                      *   5.- paint the scene
    +1304                      *   6.- restore world model view matrix.
    +1305                      */
    +1306                     var matmv = this.modelViewMatrix;
    +1307                     var matwmv = this.worldModelViewMatrix;
    +1308                     this.worldModelViewMatrix = new CAAT.Math.Matrix();
    +1309                     this.modelViewMatrix = this.worldModelViewMatrix;
    +1310                     this.wdirty = true;
    +1311                     scene.animate(this, scene.time);
    +1312                     if (scene.onRenderStart) {
    +1313                         scene.onRenderStart(scene.time);
    +1314                     }
    +1315                     scene.paintActor(this, scene.time);
    +1316                     if (scene.onRenderEnd) {
    +1317                         scene.onRenderEnd(scene.time);
    +1318                     }
    +1319                     this.worldModelViewMatrix = matwmv;
    +1320                     this.modelViewMatrix = matmv;
    +1321 
    +1322                     ctx.restore();
    +1323 
    +1324                     this.ctx = octx;
    +1325                 }
    +1326             },
    +1327             /**
    +1328              * Add a new Scene to Director's Scene list. By adding a Scene to the Director
    +1329              * does not mean it will be immediately visible, you should explicitly call either
    +1330              * <ul>
    +1331              *  <li>easeIn
    +1332              *  <li>easeInOut
    +1333              *  <li>easeInOutRandom
    +1334              *  <li>setScene
    +1335              *  <li>or any of the scene switching methods
    +1336              * </ul>
    +1337              *
    +1338              * @param scene {CAAT.Foundation.Scene}
    +1339              */
    +1340             addScene:function (scene) {
    +1341                 scene.setBounds(0, 0, this.width, this.height);
    +1342                 this.scenes.push(scene);
    +1343                 scene.setEaseListener(this);
    +1344                 if (null === this.currentScene) {
    +1345                     this.setScene(0);
    +1346                 }
    +1347             },
    +1348             /**
    +1349              * Get the number of scenes contained in the Director.
    +1350              * @return {number} the number of scenes contained in the Director.
    +1351              */
    +1352             getNumScenes:function () {
    +1353                 return this.scenes.length;
    +1354             },
    +1355             /**
    +1356              * This method offers full control over the process of switching between any given two Scenes.
    +1357              * To apply this method, you must specify the type of transition to apply for each Scene and
    +1358              * the anchor to keep the Scene pinned at.
    +1359              * <p>
    +1360              * The type of transition will be one of the following values defined in CAAT.Foundation.Scene.prototype:
    +1361              * <ul>
    +1362              *  <li>EASE_ROTATION
    +1363              *  <li>EASE_SCALE
    +1364              *  <li>EASE_TRANSLATION
    +1365              * </ul>
    +1366              *
    +1367              * <p>
    +1368              * The anchor will be any of these values defined in CAAT.Foundation.Actor:
    +1369              * <ul>
    +1370              *  <li>ANCHOR_CENTER
    +1371              *  <li>ANCHOR_TOP
    +1372              *  <li>ANCHOR_BOTTOM
    +1373              *  <li>ANCHOR_LEFT
    +1374              *  <li>ANCHOR_RIGHT
    +1375              *  <li>ANCHOR_TOP_LEFT
    +1376              *  <li>ANCHOR_TOP_RIGHT
    +1377              *  <li>ANCHOR_BOTTOM_LEFT
    +1378              *  <li>ANCHOR_BOTTOM_RIGHT
    +1379              * </ul>
    +1380              *
    +1381              * <p>
    +1382              * In example, for an entering scene performing a EASE_SCALE transition, the anchor is the
    +1383              * point by which the scene will scaled.
    +1384              *
    +1385              * @param inSceneIndex integer indicating the Scene index to bring in to the Director.
    +1386              * @param typein integer indicating the type of transition to apply to the bringing in Scene.
    +1387              * @param anchorin integer indicating the anchor of the bringing in Scene.
    +1388              * @param outSceneIndex integer indicating the Scene index to take away from the Director.
    +1389              * @param typeout integer indicating the type of transition to apply to the taking away in Scene.
    +1390              * @param anchorout integer indicating the anchor of the taking away Scene.
    +1391              * @param time inteter indicating the time to perform the process of switchihg between Scene object
    +1392              * in milliseconds.
    +1393              * @param alpha boolean boolean indicating whether alpha transparency fading will be applied to
    +1394              * the scenes.
    +1395              * @param interpolatorIn CAAT.Behavior.Interpolator object to apply to entering scene.
    +1396              * @param interpolatorOut CAAT.Behavior.Interpolator object to apply to exiting scene.
    +1397              */
    +1398             easeInOut:function (inSceneIndex, typein, anchorin, outSceneIndex, typeout, anchorout, time, alpha, interpolatorIn, interpolatorOut) {
    +1399 
    +1400                 if (inSceneIndex === this.getCurrentSceneIndex()) {
    +1401                     return;
    +1402                 }
    +1403 
    +1404                 var ssin = this.scenes[ inSceneIndex ];
    +1405                 var sout = this.scenes[ outSceneIndex ];
    +1406 
    +1407                 if (!CAAT.__CSS__ && CAAT.CACHE_SCENE_ON_CHANGE) {
    +1408                     this.renderToContext(this.transitionScene.ctx, sout);
    +1409                     sout = this.transitionScene;
    +1410                 }
    +1411 
    +1412                 ssin.setExpired(false);
    +1413                 sout.setExpired(false);
    +1414 
    +1415                 ssin.mouseEnabled = false;
    +1416                 sout.mouseEnabled = false;
    +1417 
    +1418                 ssin.resetTransform();
    +1419                 sout.resetTransform();
    +1420 
    +1421                 ssin.setLocation(0, 0);
    +1422                 sout.setLocation(0, 0);
    +1423 
    +1424                 ssin.alpha = 1;
    +1425                 sout.alpha = 1;
    +1426 
    +1427                 if (typein === CAAT.Foundation.Scene.EASE_ROTATION) {
    +1428                     ssin.easeRotationIn(time, alpha, anchorin, interpolatorIn);
    +1429                 } else if (typein === CAAT.Foundation.Scene.EASE_SCALE) {
    +1430                     ssin.easeScaleIn(0, time, alpha, anchorin, interpolatorIn);
    +1431                 } else {
    +1432                     ssin.easeTranslationIn(time, alpha, anchorin, interpolatorIn);
    +1433                 }
    +1434 
    +1435                 if (typeout === CAAT.Foundation.Scene.EASE_ROTATION) {
    +1436                     sout.easeRotationOut(time, alpha, anchorout, interpolatorOut);
    +1437                 } else if (typeout === CAAT.Foundation.Scene.EASE_SCALE) {
    +1438                     sout.easeScaleOut(0, time, alpha, anchorout, interpolatorOut);
    +1439                 } else {
    +1440                     sout.easeTranslationOut(time, alpha, anchorout, interpolatorOut);
    +1441                 }
    +1442 
    +1443                 this.childrenList = [];
    +1444 
    +1445                 sout.goOut(ssin);
    +1446                 ssin.getIn(sout);
    +1447 
    +1448                 this.addChild(sout);
    +1449                 this.addChild(ssin);
    +1450             },
    +1451             /**
    +1452              * This method will switch between two given Scene indexes (ie, take away scene number 2,
    +1453              * and bring in scene number 5).
    +1454              * <p>
    +1455              * It will randomly choose for each Scene the type of transition to apply and the anchor
    +1456              * point of each transition type.
    +1457              * <p>
    +1458              * It will also set for different kind of transitions the following interpolators:
    +1459              * <ul>
    +1460              * <li>EASE_ROTATION    -> ExponentialInOutInterpolator, exponent 4.
    +1461              * <li>EASE_SCALE       -> ElasticOutInterpolator, 1.1 and .4
    +1462              * <li>EASE_TRANSLATION -> BounceOutInterpolator
    +1463              * </ul>
    +1464              *
    +1465              * <p>
    +1466              * These are the default values, and could not be changed by now.
    +1467              * This method in final instance delegates the process to easeInOutMethod.
    +1468              *
    +1469              * @see easeInOutMethod.
    +1470              *
    +1471              * @param inIndex integer indicating the entering scene index.
    +1472              * @param outIndex integer indicating the exiting scene index.
    +1473              * @param time integer indicating the time to take for the process of Scene in/out in milliseconds.
    +1474              * @param alpha boolean indicating whether alpha transparency fading should be applied to transitions.
    +1475              */
    +1476             easeInOutRandom:function (inIndex, outIndex, time, alpha) {
    +1477 
    +1478                 var pin = Math.random();
    +1479                 var pout = Math.random();
    +1480 
    +1481                 var typeIn;
    +1482                 var interpolatorIn;
    +1483 
    +1484                 if (pin < 0.33) {
    +1485                     typeIn = CAAT.Foundation.Scene.EASE_ROTATION;
    +1486                     interpolatorIn = new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(4);
    +1487                 } else if (pin < 0.66) {
    +1488                     typeIn = CAAT.Foundation.Scene.EASE_SCALE;
    +1489                     interpolatorIn = new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.1, 0.4);
    +1490                 } else {
    +1491                     typeIn = CAAT.Foundation.Scene.EASE_TRANSLATE;
    +1492                     interpolatorIn = new CAAT.Behavior.Interpolator().createBounceOutInterpolator();
    +1493                 }
    +1494 
    +1495                 var typeOut;
    +1496                 var interpolatorOut;
    +1497 
    +1498                 if (pout < 0.33) {
    +1499                     typeOut = CAAT.Foundation.Scene.EASE_ROTATION;
    +1500                     interpolatorOut = new CAAT.Behavior.Interpolator().createExponentialInOutInterpolator(4);
    +1501                 } else if (pout < 0.66) {
    +1502                     typeOut = CAAT.Foundation.Scene.EASE_SCALE;
    +1503                     interpolatorOut = new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(4);
    +1504                 } else {
    +1505                     typeOut = CAAT.Foundation.Scene.EASE_TRANSLATE;
    +1506                     interpolatorOut = new CAAT.Behavior.Interpolator().createBounceOutInterpolator();
    +1507                 }
    +1508 
    +1509                 this.easeInOut(
    +1510                     inIndex,
    +1511                     typeIn,
    +1512                     (Math.random() * 8.99) >> 0,
    +1513 
    +1514                     outIndex,
    +1515                     typeOut,
    +1516                     (Math.random() * 8.99) >> 0,
    +1517 
    +1518                     time,
    +1519                     alpha,
    +1520 
    +1521                     interpolatorIn,
    +1522                     interpolatorOut);
    +1523 
    +1524             },
    +1525             /**
    +1526              * This method changes Director's current Scene to the scene index indicated by
    +1527              * inSceneIndex parameter. The Scene running in the director won't be eased out.
    +1528              *
    +1529              * @see {CAAT.Interpolator}
    +1530              * @see {CAAT.Actor}
    +1531              * @see {CAAT.Scene}
    +1532              *
    +1533              * @param inSceneIndex integer indicating the new Scene to set as current.
    +1534              * @param type integer indicating the type of transition to apply to bring the new current
    +1535              * Scene to the Director. The values will be one of: CAAT.Scene.prototype.EASE_ROTATION,
    +1536              * CAAT.Scene.prototype.EASE_SCALE, CAAT.Scene.prototype.EASE_TRANSLATION.
    +1537              * @param time integer indicating how much time in milliseconds the Scene entrance will take.
    +1538              * @param alpha boolean indicating whether alpha transparency fading will be applied to the
    +1539              * entereing Scene.
    +1540              * @param anchor integer indicating the anchor to fix for Scene transition. It will be any of
    +1541              * CAAT.Actor.prototype.ANCHOR_* values.
    +1542              * @param interpolator an CAAT.Interpolator object indicating the interpolation function to
    +1543              * apply.
    +1544              */
    +1545             easeIn:function (inSceneIndex, type, time, alpha, anchor, interpolator) {
    +1546                 var sin = this.scenes[ inSceneIndex ];
    +1547                 if (type === CAAT.Foundation.Scene.EASE_ROTATION) {
    +1548                     sin.easeRotationIn(time, alpha, anchor, interpolator);
    +1549                 } else if (type === CAAT.Foundation.Scene.EASE_SCALE) {
    +1550                     sin.easeScaleIn(0, time, alpha, anchor, interpolator);
    +1551                 } else {
    +1552                     sin.easeTranslationIn(time, alpha, anchor, interpolator);
    +1553                 }
    +1554                 this.childrenList = [];
    +1555                 this.addChild(sin);
    +1556 
    +1557                 sin.resetTransform();
    +1558                 sin.setLocation(0, 0);
    +1559                 sin.alpha = 1;
    +1560                 sin.mouseEnabled = false;
    +1561                 sin.setExpired(false);
    +1562             },
    +1563             /**
    +1564              * Changes (or sets) the current Director scene to the index
    +1565              * parameter. There will be no transition on scene change.
    +1566              * @param sceneIndex {number} an integer indicating the index of the target Scene
    +1567              * to be shown.
    +1568              */
    +1569             setScene:function (sceneIndex) {
    +1570                 var sin = this.scenes[ sceneIndex ];
    +1571                 this.childrenList = [];
    +1572                 this.addChild(sin);
    +1573                 this.currentScene = sin;
    +1574 
    +1575                 sin.setExpired(false);
    +1576                 sin.mouseEnabled = true;
    +1577                 sin.resetTransform();
    +1578                 sin.setLocation(0, 0);
    +1579                 sin.alpha = 1;
    +1580 
    +1581                 sin.getIn();
    +1582                 sin.activated();
    +1583             },
    +1584             /**
    +1585              * This method will change the current Scene by the Scene indicated as parameter.
    +1586              * It will apply random values for anchor and transition type.
    +1587              * @see easeInOutRandom
    +1588              *
    +1589              * @param iNewSceneIndex {number} an integer indicating the index of the new scene to run on the Director.
    +1590              * @param time {number} an integer indicating the time the Scene transition will take.
    +1591              * @param alpha {boolean} a boolean indicating whether Scene transition should be fading.
    +1592              * @param transition {boolean} a boolean indicating whether the scene change must smoothly animated.
    +1593              */
    +1594             switchToScene:function (iNewSceneIndex, time, alpha, transition) {
    +1595                 var currentSceneIndex = this.getSceneIndex(this.currentScene);
    +1596 
    +1597                 if (!transition) {
    +1598                     this.setScene(iNewSceneIndex);
    +1599                 }
    +1600                 else {
    +1601                     this.easeInOutRandom(iNewSceneIndex, currentSceneIndex, time, alpha);
    +1602                 }
    +1603             },
    +1604             /**
    +1605              * Sets the previous Scene in sequence as the current Scene.
    +1606              * @see switchToScene.
    +1607              *
    +1608              * @param time {number} integer indicating the time the Scene transition will take.
    +1609              * @param alpha {boolean} a boolean indicating whether Scene transition should be fading.
    +1610              * @param transition {boolean} a boolean indicating whether the scene change must smoothly animated.
    +1611              */
    +1612             switchToPrevScene:function (time, alpha, transition) {
    +1613 
    +1614                 var currentSceneIndex = this.getSceneIndex(this.currentScene);
    +1615 
    +1616                 if (this.getNumScenes() <= 1 || currentSceneIndex === 0) {
    +1617                     return;
    +1618                 }
    +1619 
    +1620                 if (!transition) {
    +1621                     this.setScene(currentSceneIndex - 1);
    +1622                 }
    +1623                 else {
    +1624                     this.easeInOutRandom(currentSceneIndex - 1, currentSceneIndex, time, alpha);
    +1625                 }
    +1626             },
    +1627             /**
    +1628              * Sets the previous Scene in sequence as the current Scene.
    +1629              * @see switchToScene.
    +1630              *
    +1631              * @param time {number} integer indicating the time the Scene transition will take.
    +1632              * @param alpha {boolean} a boolean indicating whether Scene transition should be fading.
    +1633              * @param transition {boolean} a boolean indicating whether the scene change must smoothly animated.
    +1634              */
    +1635             switchToNextScene:function (time, alpha, transition) {
    +1636 
    +1637                 var currentSceneIndex = this.getSceneIndex(this.currentScene);
    +1638 
    +1639                 if (this.getNumScenes() <= 1 || currentSceneIndex === this.getNumScenes() - 1) {
    +1640                     return;
    +1641                 }
    +1642 
    +1643                 if (!transition) {
    +1644                     this.setScene(currentSceneIndex + 1);
    +1645                 }
    +1646                 else {
    +1647                     this.easeInOutRandom(currentSceneIndex + 1, currentSceneIndex, time, alpha);
    +1648                 }
    +1649             },
    +1650             mouseEnter:function (mouseEvent) {
    +1651             },
    +1652             mouseExit:function (mouseEvent) {
    +1653             },
    +1654             mouseMove:function (mouseEvent) {
    +1655             },
    +1656             mouseDown:function (mouseEvent) {
    +1657             },
    +1658             mouseUp:function (mouseEvent) {
    +1659             },
    +1660             mouseDrag:function (mouseEvent) {
    +1661             },
    +1662             /**
    +1663              * Scene easing listener. Notifies scenes when they're about to be activated (set as current
    +1664              * director's scene).
    +1665              *
    +1666              * @param scene {CAAT.Foundation.Scene} the scene that has just been brought in or taken out of the director.
    +1667              * @param b_easeIn {boolean} scene enters or exits ?
    +1668              */
    +1669             easeEnd:function (scene, b_easeIn) {
    +1670                 // scene is going out
    +1671                 if (!b_easeIn) {
    +1672 
    +1673                     scene.setExpired(true);
    +1674                 } else {
    +1675                     this.currentScene = scene;
    +1676                     this.currentScene.activated();
    +1677                 }
    +1678 
    +1679                 scene.mouseEnabled = true;
    +1680                 scene.emptyBehaviorList();
    +1681             },
    +1682             /**
    +1683              * Return the index for a given Scene object contained in the Director.
    +1684              * @param scene {CAAT.Foundation.Scene}
    +1685              */
    +1686             getSceneIndex:function (scene) {
    +1687                 for (var i = 0; i < this.scenes.length; i++) {
    +1688                     if (this.scenes[i] === scene) {
    +1689                         return i;
    +1690                     }
    +1691                 }
    +1692                 return -1;
    +1693             },
    +1694             /**
    +1695              * Get a concrete director's scene.
    +1696              * @param index {number} an integer indicating the scene index.
    +1697              * @return {CAAT.Foundation.Scene} a CAAT.Scene object instance or null if the index is oob.
    +1698              */
    +1699             getScene:function (index) {
    +1700                 return this.scenes[index];
    +1701             },
    +1702             getSceneById : function(id) {
    +1703                 for( var i=0; i<this.scenes.length; i++ ) {
    +1704                     if (this.scenes[i].id===id) {
    +1705                         return this.scenes[i];
    +1706                     }
    +1707                 }
    +1708                 return null;
    +1709             },
    +1710             /**
    +1711              * Return the index of the current scene in the Director's scene list.
    +1712              * @return {number} the current scene's index.
    +1713              */
    +1714             getCurrentSceneIndex:function () {
    +1715                 return this.getSceneIndex(this.currentScene);
    +1716             },
    +1717             /**
    +1718              * Return the running browser name.
    +1719              * @return {string} the browser name.
    +1720              */
    +1721             getBrowserName:function () {
    +1722                 return this.browserInfo.browser;
    +1723             },
    +1724             /**
    +1725              * Return the running browser version.
    +1726              * @return {string} the browser version.
    +1727              */
    +1728             getBrowserVersion:function () {
    +1729                 return this.browserInfo.version;
    +1730             },
    +1731             /**
    +1732              * Return the operating system name.
    +1733              * @return {string} the os name.
    +1734              */
    +1735             getOSName:function () {
    +1736                 return this.browserInfo.OS;
    +1737             },
    +1738             /**
    +1739              * Gets the resource with the specified resource name.
    +1740              * The Director holds a collection called <code>imagesCache</code>
    +1741              * where you can store a JSON of the form
    +1742              *  <code>[ { id: imageId, image: imageObject } ]</code>.
    +1743              * This structure will be used as a resources cache.
    +1744              * There's a CAAT.Module.ImagePreloader class to preload resources and
    +1745              * generate this structure on loading finalization.
    +1746              *
    +1747              * @param sId {object} an String identifying a resource.
    +1748              */
    +1749             getImage:function (sId) {
    +1750                 var ret = this.imagesCache[sId];
    +1751                 if (ret) {
    +1752                     return ret;
    +1753                 }
    +1754 
    +1755                 //for (var i = 0; i < this.imagesCache.length; i++) {
    +1756                 for( var i in this.imagesCache ) {
    +1757                     if (this.imagesCache[i].id === sId) {
    +1758                         return this.imagesCache[i].image;
    +1759                     }
    +1760                 }
    +1761 
    +1762                 return null;
    +1763             },
    +1764             musicPlay: function(id) {
    +1765                 return this.audioManager.playMusic(id);
    +1766             },
    +1767             musicStop : function() {
    +1768                 this.audioManager.stopMusic();
    +1769             },
    +1770             /**
    +1771              * Adds an audio to the cache.
    +1772              *
    +1773              * @see CAAT.Module.Audio.AudioManager.addAudio
    +1774              * @return this
    +1775              */
    +1776             addAudio:function (id, url) {
    +1777                 this.audioManager.addAudio(id, url);
    +1778                 return this;
    +1779             },
    +1780             /**
    +1781              * Plays the audio instance identified by the id.
    +1782              * @param id {object} the object used to store a sound in the audioCache.
    +1783              */
    +1784             audioPlay:function (id) {
    +1785                 return this.audioManager.play(id);
    +1786             },
    +1787             /**
    +1788              * Loops an audio instance identified by the id.
    +1789              * @param id {object} the object used to store a sound in the audioCache.
    +1790              *
    +1791              * @return {HTMLElement|null} the value from audioManager.loop
    +1792              */
    +1793             audioLoop:function (id) {
    +1794                 return this.audioManager.loop(id);
    +1795             },
    +1796             endSound:function () {
    +1797                 return this.audioManager.endSound();
    +1798             },
    +1799             setSoundEffectsEnabled:function (enabled) {
    +1800                 return this.audioManager.setSoundEffectsEnabled(enabled);
    +1801             },
    +1802             setMusicEnabled:function (enabled) {
    +1803                 return this.audioManager.setMusicEnabled(enabled);
    +1804             },
    +1805             isMusicEnabled:function () {
    +1806                 return this.audioManager.isMusicEnabled();
    +1807             },
    +1808             isSoundEffectsEnabled:function () {
    +1809                 return this.audioManager.isSoundEffectsEnabled();
    +1810             },
    +1811             setVolume:function (id, volume) {
    +1812                 return this.audioManager.setVolume(id, volume);
    +1813             },
    +1814             /**
    +1815              * Removes Director's scenes.
    +1816              */
    +1817             emptyScenes:function () {
    +1818                 this.scenes = [];
    +1819             },
    +1820             /**
    +1821              * Adds an scene to this Director.
    +1822              * @param scene {CAAT.Foundation.Scene} a scene object.
    +1823              */
    +1824             addChild:function (scene) {
    +1825                 scene.parent = this;
    +1826                 this.childrenList.push(scene);
    +1827             },
    +1828             /**
    +1829              * @Deprecated use CAAT.loop instead.
    +1830              * @param fps
    +1831              * @param callback
    +1832              * @param callback2
    +1833              */
    +1834             loop:function (fps, callback, callback2) {
    +1835                 if (callback2) {
    +1836                     this.onRenderStart = callback;
    +1837                     this.onRenderEnd = callback2;
    +1838                 } else if (callback) {
    +1839                     this.onRenderEnd = callback;
    +1840                 }
    +1841                 CAAT.loop();
    +1842             },
    +1843             /**
    +1844              * Starts the director animation.If no scene is explicitly selected, the current Scene will
    +1845              * be the first scene added to the Director.
    +1846              * <p>
    +1847              * The fps parameter will set the animation quality. Higher values,
    +1848              * means CAAT will try to render more frames in the same second (at the
    +1849              * expense of cpu power at least until hardware accelerated canvas rendering
    +1850              * context are available). A value of 60 is a high frame rate and should not be exceeded.
    +1851              *
    +1852              */
    +1853             renderFrame:function () {
    +1854 
    +1855                 CAAT.currentDirector = this;
    +1856 
    +1857                 if (this.stopped) {
    +1858                     return;
    +1859                 }
    +1860 
    +1861                 var t = new Date().getTime(),
    +1862                     delta = t - this.timeline;
    +1863 
    +1864                 /*
    +1865                  check for massive frame time. if for example the current browser tab is minified or taken out of
    +1866                  foreground, the system will account for a bit time interval. minify that impact by lowering down
    +1867                  the elapsed time (virtual timelines FTW)
    +1868                  */
    +1869                 if (delta > 500) {
    +1870                     delta = 500;
    +1871                 }
    +1872 
    +1873                 if (this.onRenderStart) {
    +1874                     this.onRenderStart(delta);
    +1875                 }
    +1876 
    +1877                 this.render(delta);
    +1878 
    +1879                 if (this.debugInfo) {
    +1880                     this.debugInfo(this.statistics);
    +1881                 }
    +1882 
    +1883                 this.timeline = t;
    +1884 
    +1885                 if (this.onRenderEnd) {
    +1886                     this.onRenderEnd(delta);
    +1887                 }
    +1888 
    +1889                 this.needsRepaint = false;
    +1890             },
    +1891 
    +1892             /**
    +1893              * If the director has renderingMode: DIRTY, the timeline must be reset to register accurate frame measurement.
    +1894              */
    +1895             resetTimeline:function () {
    +1896                 this.timeline = new Date().getTime();
    +1897             },
    +1898 
    +1899             endLoop:function () {
    +1900             },
    +1901             /**
    +1902              * This method states whether the director must clear background before rendering
    +1903              * each frame.
    +1904              *
    +1905              * The clearing method could be:
    +1906              *  + CAAT.Director.CLEAR_ALL. previous to draw anything on screen the canvas will have clearRect called on it.
    +1907              *  + CAAT.Director.CLEAR_DIRTY_RECTS. Actors marked as invalid, or which have been moved, rotated or scaled
    +1908              *    will have their areas redrawn.
    +1909              *  + CAAT.Director.CLEAR_NONE. clears nothing.
    +1910              *
    +1911              * @param clear {CAAT.Director.CLEAR_ALL | CAAT.Director.CLEAR_NONE | CAAT.Director.CLEAR_DIRTY_RECTS}
    +1912              * @return this.
    +1913              */
    +1914             setClear:function (clear) {
    +1915                 this.clear = clear;
    +1916                 if (this.clear === CAAT.Foundation.Director.CLEAR_DIRTY_RECTS) {
    +1917                     this.dirtyRectsEnabled = true;
    +1918                 } else {
    +1919                     this.dirtyRectsEnabled= false;
    +1920                 }
    +1921                 return this;
    +1922             },
    +1923             /**
    +1924              * Get this Director's AudioManager instance.
    +1925              * @return {CAAT.AudioManager} the AudioManager instance.
    +1926              */
    +1927             getAudioManager:function () {
    +1928                 return this.audioManager;
    +1929             },
    +1930             /**
    +1931              * Acculumate dom elements position to properly offset on-screen mouse/touch events.
    +1932              * @param node
    +1933              */
    +1934             cumulateOffset:function (node, parent, prop) {
    +1935                 var left = prop + 'Left';
    +1936                 var top = prop + 'Top';
    +1937                 var x = 0, y = 0, style;
    +1938 
    +1939                 while (navigator.browser !== 'iOS' && node && node.style) {
    +1940                     if (node.currentStyle) {
    +1941                         style = node.currentStyle['position'];
    +1942                     } else {
    +1943                         style = (node.ownerDocument.defaultView || node.ownerDocument.parentWindow).getComputedStyle(node, null);
    +1944                         style = style ? style.getPropertyValue('position') : null;
    +1945                     }
    +1946 
    +1947 //                if (!/^(relative|absolute|fixed)$/.test(style)) {
    +1948                     if (!/^(fixed)$/.test(style)) {
    +1949                         x += node[left];
    +1950                         y += node[top];
    +1951                         node = node[parent];
    +1952                     } else {
    +1953                         break;
    +1954                     }
    +1955                 }
    +1956 
    +1957                 return {
    +1958                     x:x,
    +1959                     y:y,
    +1960                     style:style
    +1961                 };
    +1962             },
    +1963             getOffset:function (node) {
    +1964                 var res = this.cumulateOffset(node, 'offsetParent', 'offset');
    +1965                 if (res.style === 'fixed') {
    +1966                     var res2 = this.cumulateOffset(node, node.parentNode ? 'parentNode' : 'parentElement', 'scroll');
    +1967                     return {
    +1968                         x:res.x + res2.x,
    +1969                         y:res.y + res2.y
    +1970                     };
    +1971                 }
    +1972 
    +1973                 return {
    +1974                     x:res.x,
    +1975                     y:res.y
    +1976                 };
    +1977             },
    +1978             /**
    +1979              * Normalize input event coordinates to be related to (0,0) canvas position.
    +1980              * @param point {CAAT.Math.Point} canvas coordinate.
    +1981              * @param e {MouseEvent} a mouse event from an input event.
    +1982              */
    +1983             getCanvasCoord:function (point, e) {
    +1984 
    +1985                 var pt = new CAAT.Math.Point();
    +1986                 var posx = 0;
    +1987                 var posy = 0;
    +1988                 if (!e) e = window.event;
    +1989 
    +1990                 if (e.pageX || e.pageY) {
    +1991                     posx = e.pageX;
    +1992                     posy = e.pageY;
    +1993                 }
    +1994                 else if (e.clientX || e.clientY) {
    +1995                     posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
    +1996                     posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
    +1997                 }
    +1998 
    +1999                 var offset = this.getOffset(this.canvas);
    +2000 
    +2001                 posx -= offset.x;
    +2002                 posy -= offset.y;
    +2003 
    +2004                 posx*= this.SCREEN_RATIO;
    +2005                 posy*= this.SCREEN_RATIO;
    +2006 
    +2007                 //////////////
    +2008                 // transformar coordenada inversamente con affine transform de director.
    +2009 
    +2010                 pt.x = posx;
    +2011                 pt.y = posy;
    +2012                 if (!this.modelViewMatrixI) {
    +2013                     this.modelViewMatrixI = this.modelViewMatrix.getInverse();
    +2014                 }
    +2015                 this.modelViewMatrixI.transformCoord(pt);
    +2016                 posx = pt.x;
    +2017                 posy = pt.y
    +2018 
    +2019                 point.set(posx, posy);
    +2020                 this.screenMousePoint.set(posx, posy);
    +2021 
    +2022             },
    +2023 
    +2024             __mouseDownHandler:function (e) {
    +2025 
    +2026                 /*
    +2027                  was dragging and mousedown detected, can only mean a mouseOut's been performed and on mouseOver, no
    +2028                  button was presses. Then, send a mouseUp for the previos actor, and return;
    +2029                  */
    +2030                 if (this.dragging && this.lastSelectedActor) {
    +2031                     this.__mouseUpHandler(e);
    +2032                     return;
    +2033                 }
    +2034 
    +2035                 this.getCanvasCoord(this.mousePoint, e);
    +2036                 this.isMouseDown = true;
    +2037                 var lactor = this.findActorAtPosition(this.mousePoint);
    +2038 
    +2039                 if (null !== lactor) {
    +2040 
    +2041                     var pos = lactor.viewToModel(
    +2042                         new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    +2043 
    +2044                     lactor.mouseDown(
    +2045                         new CAAT.Event.MouseEvent().init(
    +2046                             pos.x,
    +2047                             pos.y,
    +2048                             e,
    +2049                             lactor,
    +2050                             new CAAT.Math.Point(
    +2051                                 this.screenMousePoint.x,
    +2052                                 this.screenMousePoint.y)));
    +2053                 }
    +2054 
    +2055                 this.lastSelectedActor = lactor;
    +2056             },
    +2057 
    +2058             __mouseUpHandler:function (e) {
    +2059 
    +2060                 this.isMouseDown = false;
    +2061                 this.getCanvasCoord(this.mousePoint, e);
    +2062 
    +2063                 var pos = null;
    +2064                 var lactor = this.lastSelectedActor;
    +2065 
    +2066                 if (null !== lactor) {
    +2067                     pos = lactor.viewToModel(
    +2068                         new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    +2069                     if (lactor.actionPerformed && lactor.contains(pos.x, pos.y)) {
    +2070                         lactor.actionPerformed(e)
    +2071                     }
    +2072 
    +2073                     lactor.mouseUp(
    +2074                         new CAAT.Event.MouseEvent().init(
    +2075                             pos.x,
    +2076                             pos.y,
    +2077                             e,
    +2078                             lactor,
    +2079                             this.screenMousePoint,
    +2080                             this.currentScene.time));
    +2081                 }
    +2082 
    +2083                 if (!this.dragging && null !== lactor) {
    +2084                     if (lactor.contains(pos.x, pos.y)) {
    +2085                         lactor.mouseClick(
    +2086                             new CAAT.Event.MouseEvent().init(
    +2087                                 pos.x,
    +2088                                 pos.y,
    +2089                                 e,
    +2090                                 lactor,
    +2091                                 this.screenMousePoint,
    +2092                                 this.currentScene.time));
    +2093                     }
    +2094                 }
    +2095 
    +2096                 this.dragging = false;
    +2097                 this.in_ = false;
    +2098 //            CAAT.setCursor('default');
    +2099             },
    +2100 
    +2101             __mouseMoveHandler:function (e) {
    +2102                 //this.getCanvasCoord(this.mousePoint, e);
    +2103 
    +2104                 var lactor;
    +2105                 var pos;
    +2106 
    +2107                 var ct = this.currentScene ? this.currentScene.time : 0;
    +2108 
    +2109                 // drag
    +2110 
    +2111                 if (this.isMouseDown && null!==this.lastSelectedActor) {
    +2112 
    +2113                     lactor = this.lastSelectedActor;
    +2114                     pos = lactor.viewToModel(
    +2115                         new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    +2116 
    +2117                     // check for mouse move threshold.
    +2118                     if (!this.dragging) {
    +2119                         if (Math.abs(this.prevMousePoint.x - pos.x) < CAAT.DRAG_THRESHOLD_X &&
    +2120                             Math.abs(this.prevMousePoint.y - pos.y) < CAAT.DRAG_THRESHOLD_Y) {
    +2121                             return;
    +2122                         }
    +2123                     }
    +2124 
    +2125                     this.dragging = true;
    +2126 
    +2127                     var px = lactor.x;
    +2128                     var py = lactor.y;
    +2129                     lactor.mouseDrag(
    +2130                         new CAAT.Event.MouseEvent().init(
    +2131                             pos.x,
    +2132                             pos.y,
    +2133                             e,
    +2134                             lactor,
    +2135                             new CAAT.Math.Point(
    +2136                                 this.screenMousePoint.x,
    +2137                                 this.screenMousePoint.y),
    +2138                             ct));
    +2139 
    +2140                     this.prevMousePoint.x = pos.x;
    +2141                     this.prevMousePoint.y = pos.y;
    +2142 
    +2143                     /**
    +2144                      * Element has not moved after drag, so treat it as a button.
    +2145                      */
    +2146                     if (px === lactor.x && py === lactor.y) {
    +2147 
    +2148                         var contains = lactor.contains(pos.x, pos.y);
    +2149 
    +2150                         if (this.in_ && !contains) {
    +2151                             lactor.mouseExit(
    +2152                                 new CAAT.Event.MouseEvent().init(
    +2153                                     pos.x,
    +2154                                     pos.y,
    +2155                                     e,
    +2156                                     lactor,
    +2157                                     this.screenMousePoint,
    +2158                                     ct));
    +2159                             this.in_ = false;
    +2160                         }
    +2161 
    +2162                         if (!this.in_ && contains) {
    +2163                             lactor.mouseEnter(
    +2164                                 new CAAT.Event.MouseEvent().init(
    +2165                                     pos.x,
    +2166                                     pos.y,
    +2167                                     e,
    +2168                                     lactor,
    +2169                                     this.screenMousePoint,
    +2170                                     ct));
    +2171                             this.in_ = true;
    +2172                         }
    +2173                     }
    +2174 
    +2175                     return;
    +2176                 }
    +2177 
    +2178                 // mouse move.
    +2179                 this.in_ = true;
    +2180 
    +2181                 lactor = this.findActorAtPosition(this.mousePoint);
    +2182 
    +2183                 // cambiamos de actor.
    +2184                 if (lactor !== this.lastSelectedActor) {
    +2185                     if (null !== this.lastSelectedActor) {
    +2186 
    +2187                         pos = this.lastSelectedActor.viewToModel(
    +2188                             new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    +2189 
    +2190                         this.lastSelectedActor.mouseExit(
    +2191                             new CAAT.Event.MouseEvent().init(
    +2192                                 pos.x,
    +2193                                 pos.y,
    +2194                                 e,
    +2195                                 this.lastSelectedActor,
    +2196                                 this.screenMousePoint,
    +2197                                 ct));
    +2198                     }
    +2199 
    +2200                     if (null !== lactor) {
    +2201                         pos = lactor.viewToModel(
    +2202                             new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    +2203 
    +2204                         lactor.mouseEnter(
    +2205                             new CAAT.Event.MouseEvent().init(
    +2206                                 pos.x,
    +2207                                 pos.y,
    +2208                                 e,
    +2209                                 lactor,
    +2210                                 this.screenMousePoint,
    +2211                                 ct));
    +2212                     }
    +2213                 }
    +2214 
    +2215                 pos = lactor.viewToModel(
    +2216                     new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    +2217 
    +2218                 if (null !== lactor) {
    +2219 
    +2220                     lactor.mouseMove(
    +2221                         new CAAT.Event.MouseEvent().init(
    +2222                             pos.x,
    +2223                             pos.y,
    +2224                             e,
    +2225                             lactor,
    +2226                             this.screenMousePoint,
    +2227                             ct));
    +2228                 }
    +2229 
    +2230                 this.prevMousePoint.x = pos.x;
    +2231                 this.prevMousePoint.y = pos.y;
    +2232 
    +2233                 this.lastSelectedActor = lactor;
    +2234             },
    +2235 
    +2236             __mouseOutHandler:function (e) {
    +2237 
    +2238                 if (this.dragging) {
    +2239                     return;
    +2240                 }
    +2241 
    +2242                 if (null !== this.lastSelectedActor) {
    +2243 
    +2244                     this.getCanvasCoord(this.mousePoint, e);
    +2245                     var pos = new CAAT.Math.Point(this.mousePoint.x, this.mousePoint.y, 0);
    +2246                     this.lastSelectedActor.viewToModel(pos);
    +2247 
    +2248                     var ev = new CAAT.Event.MouseEvent().init(
    +2249                         pos.x,
    +2250                         pos.y,
    +2251                         e,
    +2252                         this.lastSelectedActor,
    +2253                         this.screenMousePoint,
    +2254                         this.currentScene.time);
    +2255 
    +2256                     this.lastSelectedActor.mouseExit(ev);
    +2257                     this.lastSelectedActor.mouseOut(ev);
    +2258                     if (!this.dragging) {
    +2259                         this.lastSelectedActor = null;
    +2260                     }
    +2261                 } else {
    +2262                     this.isMouseDown = false;
    +2263                     this.in_ = false;
    +2264 
    +2265                 }
    +2266 
    +2267             },
    +2268 
    +2269             __mouseOverHandler:function (e) {
    +2270 
    +2271                 if (this.dragging) {
    +2272                     return;
    +2273                 }
    +2274 
    +2275                 var lactor;
    +2276                 var pos, ev;
    +2277 
    +2278                 if (null == this.lastSelectedActor) {
    +2279                     lactor = this.findActorAtPosition(this.mousePoint);
    +2280 
    +2281                     if (null !== lactor) {
    +2282 
    +2283                         pos = lactor.viewToModel(
    +2284                             new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    +2285 
    +2286                         ev = new CAAT.Event.MouseEvent().init(
    +2287                             pos.x,
    +2288                             pos.y,
    +2289                             e,
    +2290                             lactor,
    +2291                             this.screenMousePoint,
    +2292                             this.currentScene ? this.currentScene.time : 0);
    +2293 
    +2294                         lactor.mouseOver(ev);
    +2295                         lactor.mouseEnter(ev);
    +2296                     }
    +2297 
    +2298                     this.lastSelectedActor = lactor;
    +2299                 } else {
    +2300                     lactor = this.lastSelectedActor;
    +2301                     pos = lactor.viewToModel(
    +2302                         new CAAT.Math.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    +2303 
    +2304                     ev = new CAAT.Event.MouseEvent().init(
    +2305                         pos.x,
    +2306                         pos.y,
    +2307                         e,
    +2308                         lactor,
    +2309                         this.screenMousePoint,
    +2310                         this.currentScene.time);
    +2311 
    +2312                     lactor.mouseOver(ev);
    +2313                     lactor.mouseEnter(ev);
    +2314 
    +2315                 }
    +2316             },
    +2317 
    +2318             __mouseDBLClickHandler:function (e) {
    +2319 
    +2320                 this.getCanvasCoord(this.mousePoint, e);
    +2321                 if (null !== this.lastSelectedActor) {
    +2322                     /*
    +2323                      var pos = this.lastSelectedActor.viewToModel(
    +2324                      new CAAT.Point(this.screenMousePoint.x, this.screenMousePoint.y, 0));
    +2325                      */
    +2326                     this.lastSelectedActor.mouseDblClick(
    +2327                         new CAAT.Event.MouseEvent().init(
    +2328                             this.mousePoint.x,
    +2329                             this.mousePoint.y,
    +2330                             e,
    +2331                             this.lastSelectedActor,
    +2332                             this.screenMousePoint,
    +2333                             this.currentScene.time));
    +2334                 }
    +2335             },
    +2336 
    +2337             /**
    +2338              * Same as mouseDown but not preventing event.
    +2339              * Will only take care of first touch.
    +2340              * @param e
    +2341              */
    +2342             __touchStartHandler:function (e) {
    +2343 
    +2344                 if (e.target === this.canvas) {
    +2345                     e.preventDefault();
    +2346                     e.returnValue = false;
    +2347 
    +2348                     e = e.targetTouches[0];
    +2349 
    +2350                     var mp = this.mousePoint;
    +2351                     this.getCanvasCoord(mp, e);
    +2352                     if (mp.x < 0 || mp.y < 0 || mp.x >= this.width || mp.y >= this.height) {
    +2353                         return;
    +2354                     }
    +2355 
    +2356                     this.touching = true;
    +2357 
    +2358                     this.__mouseDownHandler(e);
    +2359                 }
    +2360             },
    +2361 
    +2362             __touchEndHandler:function (e) {
    +2363 
    +2364                 if (this.touching) {
    +2365                     e.preventDefault();
    +2366                     e.returnValue = false;
    +2367 
    +2368                     e = e.changedTouches[0];
    +2369                     var mp = this.mousePoint;
    +2370                     this.getCanvasCoord(mp, e);
    +2371 
    +2372                     this.touching = false;
    +2373 
    +2374                     this.__mouseUpHandler(e);
    +2375                 }
    +2376             },
    +2377 
    +2378             __touchMoveHandler:function (e) {
    +2379 
    +2380                 if (this.touching) {
    +2381                     e.preventDefault();
    +2382                     e.returnValue = false;
    +2383 
    +2384                     if (this.gesturing) {
    +2385                         return;
    +2386                     }
    +2387 
    +2388                     for (var i = 0; i < e.targetTouches.length; i++) {
    +2389                         var ee = e.targetTouches[i];
    +2390                         var mp = this.mousePoint;
    +2391                         this.getCanvasCoord(mp, ee);
    +2392                         this.__mouseMoveHandler(ee);
    +2393                     }
    +2394                 }
    +2395             },
    +2396 
    +2397             __gestureStart:function (scale, rotation) {
    +2398                 this.gesturing = true;
    +2399                 this.__gestureRotation = this.lastSelectedActor.rotationAngle;
    +2400                 this.__gestureSX = this.lastSelectedActor.scaleX - 1;
    +2401                 this.__gestureSY = this.lastSelectedActor.scaleY - 1;
    +2402             },
    +2403 
    +2404             __gestureChange:function (scale, rotation) {
    +2405                 if (typeof scale === 'undefined' || typeof rotation === 'undefined') {
    +2406                     return;
    +2407                 }
    +2408 
    +2409                 if (this.lastSelectedActor !== null && this.lastSelectedActor.isGestureEnabled()) {
    +2410                     this.lastSelectedActor.setRotation(rotation * Math.PI / 180 + this.__gestureRotation);
    +2411 
    +2412                     this.lastSelectedActor.setScale(
    +2413                         this.__gestureSX + scale,
    +2414                         this.__gestureSY + scale);
    +2415                 }
    +2416 
    +2417             },
    +2418 
    +2419             __gestureEnd:function (scale, rotation) {
    +2420                 this.gesturing = false;
    +2421                 this.__gestureRotation = 0;
    +2422                 this.__gestureScale = 0;
    +2423             },
    +2424 
    +2425             __touchEndHandlerMT:function (e) {
    +2426 
    +2427                 e.preventDefault();
    +2428                 e.returnValue = false;
    +2429 
    +2430                 var i, j;
    +2431                 var recent = [];
    +2432 
    +2433                 /**
    +2434                  * extrae actores afectados, y coordenadas relativas para ellos.
    +2435                  * crear una coleccion touch-id : { actor, touch-event }
    +2436                  */
    +2437                 for (i = 0; i < e.changedTouches.length; i++) {
    +2438                     var _touch = e.changedTouches[i];
    +2439                     var id = _touch.identifier;
    +2440                     recent.push(id);
    +2441                 }
    +2442 
    +2443 
    +2444                 /**
    +2445                  * para los touch identificados, extraer que actores se han afectado.
    +2446                  * crear eventos con la info de touch para cada uno.
    +2447                  */
    +2448 
    +2449                 var actors = {};
    +2450                 for (i = 0; i < recent.length; i++) {
    +2451                     var touchId = recent[ i ];
    +2452                     if (this.touches[ touchId ]) {
    +2453                         var actor = this.touches[ touchId ].actor;
    +2454 
    +2455                         if (!actors[actor.id]) {
    +2456                             actors[actor.id] = {
    +2457                                 actor:actor,
    +2458                                 touch:new CAAT.Event.TouchEvent().init(e, actor, this.currentScene.time)
    +2459                             };
    +2460                         }
    +2461 
    +2462                         var ev = actors[ actor.id ].touch;
    +2463                         ev.addChangedTouch(this.touches[ touchId ].touch);
    +2464                     }
    +2465                 }
    +2466 
    +2467                 /**
    +2468                  * remove ended touch info.
    +2469                  */
    +2470                 for (i = 0; i < e.changedTouches.length; i++) {
    +2471                     var touch = e.changedTouches[i];
    +2472                     var id = touch.identifier;
    +2473                     delete this.touches[id];
    +2474                 }
    +2475 
    +2476                 /**
    +2477                  * notificar a todos los actores.
    +2478                  */
    +2479                 for (var pr in actors) {
    +2480                     var data = actors[pr];
    +2481                     var actor = data.actor;
    +2482                     var touch = data.touch;
    +2483 
    +2484                     for (var actorId in this.touches) {
    +2485                         var tt = this.touches[actorId]
    +2486                         if (tt.actor.id === actor.id) {
    +2487                             touch.addTouch(tt.touch);
    +2488                         }
    +2489                     }
    +2490 
    +2491                     actor.touchEnd(touch);
    +2492                 }
    +2493             },
    +2494 
    +2495             __touchMoveHandlerMT:function (e) {
    +2496 
    +2497                 e.preventDefault();
    +2498                 e.returnValue = false;
    +2499 
    +2500                 var i;
    +2501                 var recent = [];
    +2502 
    +2503                 /**
    +2504                  * extrae actores afectados, y coordenadas relativas para ellos.
    +2505                  * crear una coleccion touch-id : { actor, touch-event }
    +2506                  */
    +2507                 for (i = 0; i < e.changedTouches.length; i++) {
    +2508                     var touch = e.changedTouches[i];
    +2509                     var id = touch.identifier;
    +2510 
    +2511                     if (this.touches[ id ]) {
    +2512                         var mp = this.mousePoint;
    +2513                         this.getCanvasCoord(mp, touch);
    +2514 
    +2515                         var actor = this.touches[ id ].actor;
    +2516                         mp = actor.viewToModel(mp);
    +2517 
    +2518                         this.touches[ id ] = {
    +2519                             actor:actor,
    +2520                             touch:new CAAT.Event.TouchInfo(id, mp.x, mp.y, actor)
    +2521                         };
    +2522 
    +2523                         recent.push(id);
    +2524                     }
    +2525                 }
    +2526 
    +2527                 /**
    +2528                  * para los touch identificados, extraer que actores se han afectado.
    +2529                  * crear eventos con la info de touch para cada uno.
    +2530                  */
    +2531 
    +2532                 var actors = {};
    +2533                 for (i = 0; i < recent.length; i++) {
    +2534                     var touchId = recent[ i ];
    +2535                     var actor = this.touches[ touchId ].actor;
    +2536 
    +2537                     if (!actors[actor.id]) {
    +2538                         actors[actor.id] = {
    +2539                             actor:actor,
    +2540                             touch:new CAAT.Event.TouchEvent().init(e, actor, this.currentScene.time)
    +2541                         };
    +2542                     }
    +2543 
    +2544                     var ev = actors[ actor.id ].touch;
    +2545                     ev.addTouch(this.touches[ touchId ].touch);
    +2546                     ev.addChangedTouch(this.touches[ touchId ].touch);
    +2547                 }
    +2548 
    +2549                 /**
    +2550                  * notificar a todos los actores.
    +2551                  */
    +2552                 for (var pr in actors) {
    +2553                     var data = actors[pr];
    +2554                     var actor = data.actor;
    +2555                     var touch = data.touch;
    +2556 
    +2557                     for (var actorId in this.touches) {
    +2558                         var tt = this.touches[actorId]
    +2559                         if (tt.actor.id === actor.id) {
    +2560                             touch.addTouch(tt.touch);
    +2561                         }
    +2562                     }
    +2563 
    +2564                     actor.touchMove(touch);
    +2565                 }
    +2566             },
    +2567 
    +2568             __touchCancelHandleMT:function (e) {
    +2569                 this.__touchEndHandlerMT(e);
    +2570             },
    +2571 
    +2572             __touchStartHandlerMT:function (e) {
    +2573                 e.preventDefault();
    +2574                 e.returnValue = false;
    +2575 
    +2576                 var i;
    +2577                 var recent = [];
    +2578                 var allInCanvas = true;
    +2579 
    +2580                 /**
    +2581                  * extrae actores afectados, y coordenadas relativas para ellos.
    +2582                  * crear una coleccion touch-id : { actor, touch-event }
    +2583                  */
    +2584                 for (i = 0; i < e.changedTouches.length; i++) {
    +2585                     var touch = e.changedTouches[i];
    +2586                     var id = touch.identifier;
    +2587                     var mp = this.mousePoint;
    +2588                     this.getCanvasCoord(mp, touch);
    +2589                     if (mp.x < 0 || mp.y < 0 || mp.x >= this.width || mp.y >= this.height) {
    +2590                         allInCanvas = false;
    +2591                         continue;
    +2592                     }
    +2593 
    +2594                     var actor = this.findActorAtPosition(mp);
    +2595                     if (actor !== null) {
    +2596                         mp = actor.viewToModel(mp);
    +2597 
    +2598                         if (!this.touches[ id ]) {
    +2599 
    +2600                             this.touches[ id ] = {
    +2601                                 actor:actor,
    +2602                                 touch:new CAAT.Event.TouchInfo(id, mp.x, mp.y, actor)
    +2603                             };
    +2604 
    +2605                             recent.push(id);
    +2606                         }
    +2607 
    +2608                     }
    +2609                 }
    +2610 
    +2611                 /**
    +2612                  * para los touch identificados, extraer que actores se han afectado.
    +2613                  * crear eventos con la info de touch para cada uno.
    +2614                  */
    +2615 
    +2616                 var actors = {};
    +2617                 for (i = 0; i < recent.length; i++) {
    +2618                     var touchId = recent[ i ];
    +2619                     var actor = this.touches[ touchId ].actor;
    +2620 
    +2621                     if (!actors[actor.id]) {
    +2622                         actors[actor.id] = {
    +2623                             actor:actor,
    +2624                             touch:new CAAT.Event.TouchEvent().init(e, actor, this.currentScene.time)
    +2625                         };
    +2626                     }
    +2627 
    +2628                     var ev = actors[ actor.id ].touch;
    +2629                     ev.addTouch(this.touches[ touchId ].touch);
    +2630                     ev.addChangedTouch(this.touches[ touchId ].touch);
    +2631                 }
    +2632 
    +2633                 /**
    +2634                  * notificar a todos los actores.
    +2635                  */
    +2636                 for (var pr in actors) {
    +2637                     var data = actors[pr];
    +2638                     var actor = data.actor;
    +2639                     var touch = data.touch;
    +2640 
    +2641                     for (var actorId in this.touches) {
    +2642                         var tt = this.touches[actorId]
    +2643                         if (tt.actor.id === actor.id) {
    +2644                             touch.addTouch(tt.touch);
    +2645                         }
    +2646                     }
    +2647 
    +2648                     actor.touchStart(touch);
    +2649                 }
    +2650 
    +2651             },
    +2652 
    +2653             __findTouchFirstActor:function () {
    +2654 
    +2655                 var t = Number.MAX_VALUE;
    +2656                 var actor = null;
    +2657                 for (var pr in this.touches) {
    +2658 
    +2659                     var touch = this.touches[pr];
    +2660 
    +2661                     if (touch.touch.time && touch.touch.time < t && touch.actor.isGestureEnabled()) {
    +2662                         actor = touch.actor;
    +2663                         t = touch.touch.time;
    +2664                     }
    +2665                 }
    +2666                 return actor;
    +2667             },
    +2668 
    +2669             __gesturedActor:null,
    +2670             __touchGestureStartHandleMT:function (e) {
    +2671                 var actor = this.__findTouchFirstActor();
    +2672 
    +2673                 if (actor !== null && actor.isGestureEnabled()) {
    +2674                     this.__gesturedActor = actor;
    +2675                     this.__gestureRotation = actor.rotationAngle;
    +2676                     this.__gestureSX = actor.scaleX - 1;
    +2677                     this.__gestureSY = actor.scaleY - 1;
    +2678 
    +2679 
    +2680                     actor.gestureStart(
    +2681                         e.rotation * Math.PI / 180,
    +2682                         e.scale + this.__gestureSX,
    +2683                         e.scale + this.__gestureSY);
    +2684                 }
    +2685             },
    +2686 
    +2687             __touchGestureEndHandleMT:function (e) {
    +2688 
    +2689                 if (null !== this.__gesturedActor && this.__gesturedActor.isGestureEnabled()) {
    +2690                     this.__gesturedActor.gestureEnd(
    +2691                         e.rotation * Math.PI / 180,
    +2692                         e.scale + this.__gestureSX,
    +2693                         e.scale + this.__gestureSY);
    +2694                 }
    +2695 
    +2696                 this.__gestureRotation = 0;
    +2697                 this.__gestureScale = 0;
    +2698 
    +2699 
    +2700             },
    +2701 
    +2702             __touchGestureChangeHandleMT:function (e) {
    +2703 
    +2704                 if (this.__gesturedActor !== null && this.__gesturedActor.isGestureEnabled()) {
    +2705                     this.__gesturedActor.gestureChange(
    +2706                         e.rotation * Math.PI / 180,
    +2707                         this.__gestureSX + e.scale,
    +2708                         this.__gestureSY + e.scale);
    +2709                 }
    +2710             },
    +2711 
    +2712 
    +2713             addHandlers:function (canvas) {
    +2714 
    +2715                 var me = this;
    +2716 
    +2717                 window.addEventListener('mouseup', function (e) {
    +2718                     if (me.touching) {
    +2719                         e.preventDefault();
    +2720                         e.cancelBubble = true;
    +2721                         if (e.stopPropagation) e.stopPropagation();
    +2722 
    +2723                         var mp = me.mousePoint;
    +2724                         me.getCanvasCoord(mp, e);
    +2725                         me.__mouseUpHandler(e);
    +2726 
    +2727                         me.touching = false;
    +2728                     }
    +2729                 }, false);
    +2730 
    +2731                 window.addEventListener('mousedown', function (e) {
    +2732                     if (e.target === canvas) {
    +2733                         e.preventDefault();
    +2734                         e.cancelBubble = true;
    +2735                         if (e.stopPropagation) e.stopPropagation();
    +2736 
    +2737                         var mp = me.mousePoint;
    +2738                         me.getCanvasCoord(mp, e);
    +2739                         if (mp.x < 0 || mp.y < 0 || mp.x >= me.width || mp.y >= me.height) {
    +2740                             return;
    +2741                         }
    +2742                         me.touching = true;
    +2743 
    +2744                         me.__mouseDownHandler(e);
    +2745                     }
    +2746                 }, false);
    +2747 
    +2748                 window.addEventListener('mouseover', function (e) {
    +2749                     if (e.target === canvas && !me.dragging) {
    +2750                         e.preventDefault();
    +2751                         e.cancelBubble = true;
    +2752                         if (e.stopPropagation) e.stopPropagation();
    +2753 
    +2754                         var mp = me.mousePoint;
    +2755                         me.getCanvasCoord(mp, e);
    +2756                         if (mp.x < 0 || mp.y < 0 || mp.x >= me.width || mp.y >= me.height) {
    +2757                             return;
    +2758                         }
    +2759 
    +2760                         me.__mouseOverHandler(e);
    +2761                     }
    +2762                 }, false);
    +2763 
    +2764                 window.addEventListener('mouseout', function (e) {
    +2765                     if (e.target === canvas && !me.dragging) {
    +2766                         e.preventDefault();
    +2767                         e.cancelBubble = true;
    +2768                         if (e.stopPropagation) e.stopPropagation();
    +2769 
    +2770                         var mp = me.mousePoint;
    +2771                         me.getCanvasCoord(mp, e);
    +2772                         me.__mouseOutHandler(e);
    +2773                     }
    +2774                 }, false);
    +2775 
    +2776                 window.addEventListener('mousemove', function (e) {
    +2777                     e.preventDefault();
    +2778                     e.cancelBubble = true;
    +2779                     if (e.stopPropagation) e.stopPropagation();
    +2780 
    +2781                     var mp = me.mousePoint;
    +2782                     me.getCanvasCoord(mp, e);
    +2783                     if (!me.dragging && ( mp.x < 0 || mp.y < 0 || mp.x >= me.width || mp.y >= me.height )) {
    +2784                         return;
    +2785                     }
    +2786                     me.__mouseMoveHandler(e);
    +2787                 }, false);
    +2788 
    +2789                 window.addEventListener("dblclick", function (e) {
    +2790                     if (e.target === canvas) {
    +2791                         e.preventDefault();
    +2792                         e.cancelBubble = true;
    +2793                         if (e.stopPropagation) e.stopPropagation();
    +2794                         var mp = me.mousePoint;
    +2795                         me.getCanvasCoord(mp, e);
    +2796                         if (mp.x < 0 || mp.y < 0 || mp.x >= me.width || mp.y >= me.height) {
    +2797                             return;
    +2798                         }
    +2799 
    +2800                         me.__mouseDBLClickHandler(e);
    +2801                     }
    +2802                 }, false);
    +2803 
    +2804                 if (CAAT.TOUCH_BEHAVIOR === CAAT.TOUCH_AS_MOUSE) {
    +2805                     canvas.addEventListener("touchstart", this.__touchStartHandler.bind(this), false);
    +2806                     canvas.addEventListener("touchmove", this.__touchMoveHandler.bind(this), false);
    +2807                     canvas.addEventListener("touchend", this.__touchEndHandler.bind(this), false);
    +2808                     canvas.addEventListener("gesturestart", function (e) {
    +2809                         if (e.target === canvas) {
    +2810                             e.preventDefault();
    +2811                             e.returnValue = false;
    +2812                             me.__gestureStart(e.scale, e.rotation);
    +2813                         }
    +2814                     }, false);
    +2815                     canvas.addEventListener("gestureend", function (e) {
    +2816                         if (e.target === canvas) {
    +2817                             e.preventDefault();
    +2818                             e.returnValue = false;
    +2819                             me.__gestureEnd(e.scale, e.rotation);
    +2820                         }
    +2821                     }, false);
    +2822                     canvas.addEventListener("gesturechange", function (e) {
    +2823                         if (e.target === canvas) {
    +2824                             e.preventDefault();
    +2825                             e.returnValue = false;
    +2826                             me.__gestureChange(e.scale, e.rotation);
    +2827                         }
    +2828                     }, false);
    +2829                 } else if (CAAT.TOUCH_BEHAVIOR === CAAT.TOUCH_AS_MULTITOUCH) {
    +2830                     canvas.addEventListener("touchstart", this.__touchStartHandlerMT.bind(this), false);
    +2831                     canvas.addEventListener("touchmove", this.__touchMoveHandlerMT.bind(this), false);
    +2832                     canvas.addEventListener("touchend", this.__touchEndHandlerMT.bind(this), false);
    +2833                     canvas.addEventListener("touchcancel", this.__touchCancelHandleMT.bind(this), false);
    +2834 
    +2835                     canvas.addEventListener("gesturestart", this.__touchGestureStartHandleMT.bind(this), false);
    +2836                     canvas.addEventListener("gestureend", this.__touchGestureEndHandleMT.bind(this), false);
    +2837                     canvas.addEventListener("gesturechange", this.__touchGestureChangeHandleMT.bind(this), false);
    +2838                 }
    +2839 
    +2840             },
    +2841 
    +2842             enableEvents:function (onElement) {
    +2843                 CAAT.RegisterDirector(this);
    +2844                 this.in_ = false;
    +2845                 this.createEventHandler(onElement);
    +2846             },
    +2847 
    +2848             createEventHandler:function (onElement) {
    +2849                 //var canvas= this.canvas;
    +2850                 this.in_ = false;
    +2851                 //this.addHandlers(canvas);
    +2852                 this.addHandlers(onElement);
    +2853             }
    +2854         }
    +2855     },
    +2856 
    +2857     onCreate:function () {
    +2858 
    +2859         if (typeof CAAT.__CSS__!=="undefined") {
    +2860 
    +2861             CAAT.Foundation.Director.prototype.clip = true;
    +2862             CAAT.Foundation.Director.prototype.glEnabled = false;
    +2863 
    +2864             CAAT.Foundation.Director.prototype.getRenderType = function () {
    +2865                 return 'CSS';
    +2866             };
    +2867 
    +2868             CAAT.Foundation.Director.prototype.setScaleProportional = function (w, h) {
    +2869 
    +2870                 var factor = Math.min(w / this.referenceWidth, h / this.referenceHeight);
    +2871                 this.setScaleAnchored(factor, factor, 0, 0);
    +2872 
    +2873                 this.eventHandler.style.width = '' + this.referenceWidth + 'px';
    +2874                 this.eventHandler.style.height = '' + this.referenceHeight + 'px';
    +2875             };
    +2876 
    +2877             CAAT.Foundation.Director.prototype.setBounds = function (x, y, w, h) {
    +2878                 CAAT.Foundation.Director.superclass.setBounds.call(this, x, y, w, h);
    +2879                 for (var i = 0; i < this.scenes.length; i++) {
    +2880                     this.scenes[i].setBounds(0, 0, w, h);
    +2881                 }
    +2882                 this.eventHandler.style.width = w + 'px';
    +2883                 this.eventHandler.style.height = h + 'px';
    +2884 
    +2885                 return this;
    +2886             };
    +2887 
    +2888             /**
    +2889              * In this DOM/CSS implementation, proxy is not taken into account since the event router is a top most
    +2890              * div in the document hierarchy (z-index 999999).
    +2891              * @param width
    +2892              * @param height
    +2893              * @param domElement
    +2894              * @param proxy
    +2895              */
    +2896             CAAT.Foundation.Director.prototype.initialize = function (width, height, domElement, proxy) {
    +2897 
    +2898                 this.timeline = new Date().getTime();
    +2899                 this.domElement = domElement;
    +2900                 this.style('position', 'absolute');
    +2901                 this.style('width', '' + width + 'px');
    +2902                 this.style('height', '' + height + 'px');
    +2903                 this.style('overflow', 'hidden');
    +2904 
    +2905                 this.enableEvents(domElement);
    +2906 
    +2907                 this.setBounds(0, 0, width, height);
    +2908 
    +2909                 this.checkDebug();
    +2910                 return this;
    +2911             };
    +2912 
    +2913             CAAT.Foundation.Director.prototype.render = function (time) {
    +2914 
    +2915                 this.time += time;
    +2916                 this.animate(this, time);
    +2917 
    +2918                 /**
    +2919                  * draw director active scenes.
    +2920                  */
    +2921                 var i, l, tt;
    +2922 
    +2923                 if (!navigator.isCocoonJS && CAAT.DEBUG) {
    +2924                     this.resetStats();
    +2925                 }
    +2926 
    +2927                 for (i = 0, l = this.childrenList.length; i < l; i++) {
    +2928                     var c = this.childrenList[i];
    +2929                     if (c.isInAnimationFrame(this.time) && !c.isPaused()) {
    +2930                         tt = c.time - c.start_time;
    +2931                         c.timerManager.checkTimers(tt);
    +2932                         c.timerManager.removeExpiredTimers();
    +2933                     }
    +2934                 }
    +2935 
    +2936                 for (i = 0, l = this.childrenList.length; i < l; i++) {
    +2937                     var c = this.childrenList[i];
    +2938                     if (c.isInAnimationFrame(this.time)) {
    +2939                         tt = c.time - c.start_time;
    +2940                         if (c.onRenderStart) {
    +2941                             c.onRenderStart(tt);
    +2942                         }
    +2943 
    +2944                         c.paintActor(this, tt);
    +2945 
    +2946                         if (c.onRenderEnd) {
    +2947                             c.onRenderEnd(tt);
    +2948                         }
    +2949 
    +2950                         if (!c.isPaused()) {
    +2951                             c.time += time;
    +2952                         }
    +2953 
    +2954                         if (!navigator.isCocoonJS && CAAT.DEBUG) {
    +2955                             this.statistics.size_discarded_by_dirtyRects += this.drDiscarded;
    +2956                             this.statistics.size_total += c.size_total;
    +2957                             this.statistics.size_active += c.size_active;
    +2958                             this.statistics.size_dirtyRects = this.nDirtyRects;
    +2959 
    +2960                         }
    +2961 
    +2962                     }
    +2963                 }
    +2964 
    +2965                 this.frameCounter++;
    +2966             };
    +2967 
    +2968             CAAT.Foundation.Director.prototype.addScene = function (scene) {
    +2969                 scene.setVisible(true);
    +2970                 scene.setBounds(0, 0, this.width, this.height);
    +2971                 this.scenes.push(scene);
    +2972                 scene.setEaseListener(this);
    +2973                 if (null === this.currentScene) {
    +2974                     this.setScene(0);
    +2975                 }
    +2976 
    +2977                 this.domElement.appendChild(scene.domElement);
    +2978             };
    +2979 
    +2980             CAAT.Foundation.Director.prototype.emptyScenes = function () {
    +2981                 this.scenes = [];
    +2982                 this.domElement.innerHTML = '';
    +2983                 this.createEventHandler();
    +2984             };
    +2985 
    +2986             CAAT.Foundation.Director.prototype.setClear = function (clear) {
    +2987                 return this;
    +2988             };
    +2989 
    +2990             CAAT.Foundation.Director.prototype.createEventHandler = function () {
    +2991                 this.eventHandler = document.createElement('div');
    +2992                 this.domElement.appendChild(this.eventHandler);
    +2993 
    +2994                 this.eventHandler.style.position = 'absolute';
    +2995                 this.eventHandler.style.left = '0';
    +2996                 this.eventHandler.style.top = '0';
    +2997                 this.eventHandler.style.zIndex = 999999;
    +2998                 this.eventHandler.style.width = '' + this.width + 'px';
    +2999                 this.eventHandler.style.height = '' + this.height + 'px';
    +3000 
    +3001                 this.canvas = this.eventHandler;
    +3002                 this.in_ = false;
    +3003 
    +3004                 this.addHandlers(this.canvas);
    +3005             };
    +3006 
    +3007             CAAT.Foundation.Director.prototype.inDirtyRect = function () {
    +3008                 return true;
    +3009             }
    +3010         }
    +3011     }
    +3012 });
    +3013 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Scene.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Scene.js.html new file mode 100644 index 00000000..8dceaf8c --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Scene.js.html @@ -0,0 +1,606 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  */
    +  5 
    +  6 CAAT.Module({
    +  7 
    +  8     /**
    +  9      * @name Scene
    + 10      * @memberOf CAAT.Foundation
    + 11      * @extends CAAT.Foundation.ActorContainer
    + 12      *
    + 13      * @constructor
    + 14      *
    + 15      */
    + 16 
    + 17     defines:"CAAT.Foundation.Scene",
    + 18     depends: [
    + 19         "CAAT.Math.Point",
    + 20         "CAAT.Math.Matrix",
    + 21         "CAAT.PathUtil.Path",
    + 22         "CAAT.Behavior.GenericBehavior",
    + 23         "CAAT.Behavior.ContainerBehavior",
    + 24         "CAAT.Behavior.ScaleBehavior",
    + 25         "CAAT.Behavior.AlphaBehavior",
    + 26         "CAAT.Behavior.RotateBehavior",
    + 27         "CAAT.Behavior.PathBehavior",
    + 28         "CAAT.Foundation.ActorContainer",
    + 29         "CAAT.Foundation.Timer.TimerManager"
    + 30     ],
    + 31     aliases:["CAAT.Scene"],
    + 32     extendsClass:"CAAT.Foundation.ActorContainer",
    + 33     constants:{
    + 34         /**
    + 35          * @lends  CAAT.Foundation.Scene
    + 36          */
    + 37 
    + 38         /** @const @type {number} */ EASE_ROTATION:1, // Constant values to identify the type of Scene transition
    + 39         /** @const @type {number} */ EASE_SCALE:2, // to perform on Scene switching by the Director.
    + 40         /** @const @type {number} */ EASE_TRANSLATE:3
    + 41     },
    + 42     extendsWith:function () {
    + 43         return {
    + 44 
    + 45             /**
    + 46              * @lends  CAAT.Foundation.Scene.prototype
    + 47              */
    + 48 
    + 49             __init:function () {
    + 50                 this.__super();
    + 51                 this.timerManager = new CAAT.TimerManager();
    + 52                 this.fillStyle = null;
    + 53                 this.isGlobalAlpha = true;
    + 54                 return this;
    + 55             },
    + 56 
    + 57             /**
    + 58              * Behavior container used uniquely for Scene switching.
    + 59              * @type {CAAT.Behavior.ContainerBehavior}
    + 60              * @private
    + 61              */
    + 62             easeContainerBehaviour:null,
    + 63 
    + 64             /**
    + 65              * Array of container behaviour events observer.
    + 66              * @private
    + 67              */
    + 68             easeContainerBehaviourListener:null,
    + 69 
    + 70             /**
    + 71              * When Scene switching, this boolean identifies whether the Scene is being brought in, or taken away.
    + 72              * @type {boolean}
    + 73              * @private
    + 74              */
    + 75             easeIn:false,
    + 76 
    + 77 
    + 78             /**
    + 79              * is this scene paused ?
    + 80              * @type {boolean}
    + 81              * @private
    + 82              */
    + 83             paused:false,
    + 84 
    + 85             /**
    + 86              * This scene´s timer manager.
    + 87              * @type {CAAT.Foundation.Timer.TimerManager}
    + 88              * @private
    + 89              */
    + 90             timerManager:null,
    + 91 
    + 92             isPaused:function () {
    + 93                 return this.paused;
    + 94             },
    + 95 
    + 96             setPaused:function (paused) {
    + 97                 this.paused = paused;
    + 98             },
    + 99 
    +100             createTimer:function (startTime, duration, callback_timeout, callback_tick, callback_cancel) {
    +101                 return this.timerManager.createTimer(startTime, duration, callback_timeout, callback_tick, callback_cancel, this);
    +102             },
    +103 
    +104             setTimeout:function (duration, callback_timeout, callback_tick, callback_cancel) {
    +105                 return this.timerManager.createTimer(this.time, duration, callback_timeout, callback_tick, callback_cancel, this);
    +106             },
    +107 
    +108             /**
    +109              * Helper method to manage alpha transparency fading on Scene switch by the Director.
    +110              * @param time {number} time in milliseconds then fading will taableIne.
    +111              * @param isIn {boolean} whether this Scene is being brought in.
    +112              *
    +113              * @private
    +114              */
    +115             createAlphaBehaviour:function (time, isIn) {
    +116                 var ab = new CAAT.Behavior.AlphaBehavior();
    +117                 ab.setFrameTime(0, time);
    +118                 ab.startAlpha = isIn ? 0 : 1;
    +119                 ab.endAlpha = isIn ? 1 : 0;
    +120                 this.easeContainerBehaviour.addBehavior(ab);
    +121             },
    +122             /**
    +123              * Called from CAAT.Director to bring in an Scene.
    +124              * A helper method for easeTranslation.
    +125              * @param time {number} time in milliseconds for the Scene to be brought in.
    +126              * @param alpha {boolean} whether fading will be applied to the Scene.
    +127              * @param anchor {number} Scene switch anchor.
    +128              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    +129              */
    +130             easeTranslationIn:function (time, alpha, anchor, interpolator) {
    +131                 this.easeTranslation(time, alpha, anchor, true, interpolator);
    +132             },
    +133             /**
    +134              * Called from CAAT.Director to bring in an Scene.
    +135              * A helper method for easeTranslation.
    +136              * @param time {number} time in milliseconds for the Scene to be taken away.
    +137              * @param alpha {boolean} fading will be applied to the Scene.
    +138              * @param anchor {number} Scene switch anchor.
    +139              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    +140              */
    +141             easeTranslationOut:function (time, alpha, anchor, interpolator) {
    +142                 this.easeTranslation(time, alpha, anchor, false, interpolator);
    +143             },
    +144             /**
    +145              * This method will setup Scene behaviours to switch an Scene via a translation.
    +146              * The anchor value can only be
    +147              *  <li>CAAT.Actor.ANCHOR_LEFT
    +148              *  <li>CAAT.Actor.ANCHOR_RIGHT
    +149              *  <li>CAAT.Actor.ANCHOR_TOP
    +150              *  <li>CAAT.Actor.ANCHOR_BOTTOM
    +151              * if any other value is specified, any of the previous ones will be applied.
    +152              *
    +153              * @param time {number} time in milliseconds for the Scene.
    +154              * @param alpha {boolean} whether fading will be applied to the Scene.
    +155              * @param anchor {numnber} Scene switch anchor.
    +156              * @param isIn {boolean} whether the scene will be brought in.
    +157              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    +158              */
    +159             easeTranslation:function (time, alpha, anchor, isIn, interpolator) {
    +160 
    +161                 this.easeContainerBehaviour = new CAAT.Behavior.ContainerBehavior();
    +162                 this.easeIn = isIn;
    +163 
    +164                 var pb = new CAAT.Behavior.PathBehavior();
    +165                 if (interpolator) {
    +166                     pb.setInterpolator(interpolator);
    +167                 }
    +168 
    +169                 pb.setFrameTime(0, time);
    +170 
    +171                 // BUGBUG anchors: 1..4
    +172                 if (anchor < 1) {
    +173                     anchor = 1;
    +174                 } else if (anchor > 4) {
    +175                     anchor = 4;
    +176                 }
    +177 
    +178 
    +179                 switch (anchor) {
    +180                     case CAAT.Foundation.Actor.ANCHOR_TOP:
    +181                         if (isIn) {
    +182                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, -this.height + 1, 0, 0));
    +183                             this.setPosition(0,-this.height+1);
    +184                         } else {
    +185                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, 0, 0, -this.height + 1));
    +186                             this.setPosition(0,0);
    +187                         }
    +188                         break;
    +189                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM:
    +190                         if (isIn) {
    +191                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, this.height - 1, 0, 0));
    +192                             this.setPosition(0,this.height-1);
    +193                         } else {
    +194                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, 0, 0, this.height - 1));
    +195                             this.setPosition(0,0);
    +196                         }
    +197                         break;
    +198                     case CAAT.Foundation.Actor.ANCHOR_LEFT:
    +199                         if (isIn) {
    +200                             pb.setPath(new CAAT.PathUtil.Path().setLinear(-this.width + 1, 0, 0, 0));
    +201                             this.setPosition(-this.width+1,0);
    +202                         } else {
    +203                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, 0, -this.width + 1, 0));
    +204                             this.setPosition(0,0);
    +205                         }
    +206                         break;
    +207                     case CAAT.Foundation.Actor.ANCHOR_RIGHT:
    +208                         if (isIn) {
    +209                             pb.setPath(new CAAT.PathUtil.Path().setLinear(this.width - 1, 0, 0, 0));
    +210                             this.setPosition(this.width-1,0);
    +211                         } else {
    +212                             pb.setPath(new CAAT.PathUtil.Path().setLinear(0, 0, this.width - 1, 0));
    +213                             this.setPosition(0,0);
    +214                         }
    +215                         break;
    +216                 }
    +217 
    +218                 if (alpha) {
    +219                     this.createAlphaBehaviour(time, isIn);
    +220                 }
    +221 
    +222                 this.easeContainerBehaviour.addBehavior(pb);
    +223 
    +224                 this.easeContainerBehaviour.setFrameTime(this.time, time);
    +225                 this.easeContainerBehaviour.addListener(this);
    +226 
    +227                 this.emptyBehaviorList();
    +228                 CAAT.Foundation.Scene.superclass.addBehavior.call(this, this.easeContainerBehaviour);
    +229             },
    +230             /**
    +231              * Called from CAAT.Foundation.Director to bring in a Scene.
    +232              * A helper method for easeScale.
    +233              * @param time {number} time in milliseconds for the Scene to be brought in.
    +234              * @param alpha {boolean} whether fading will be applied to the Scene.
    +235              * @param anchor {number} Scene switch anchor.
    +236              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    +237              * @param starttime {number} scene time milliseconds from which the behavior will be applied.
    +238              */
    +239             easeScaleIn:function (starttime, time, alpha, anchor, interpolator) {
    +240                 this.easeScale(starttime, time, alpha, anchor, true, interpolator);
    +241                 this.easeIn = true;
    +242             },
    +243             /**
    +244              * Called from CAAT.Foundation.Director to take away a Scene.
    +245              * A helper method for easeScale.
    +246              * @param time {number} time in milliseconds for the Scene to be brought in.
    +247              * @param alpha {boolean} whether fading will be applied to the Scene.
    +248              * @param anchor {number} Scene switch anchor.
    +249              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    +250              * @param starttime {number} scene time milliseconds from which the behavior will be applied.
    +251              **/
    +252             easeScaleOut:function (starttime, time, alpha, anchor, interpolator) {
    +253                 this.easeScale(starttime, time, alpha, anchor, false, interpolator);
    +254                 this.easeIn = false;
    +255             },
    +256             /**
    +257              * Called from CAAT.Foundation.Director to bring in ot take away an Scene.
    +258              * @param time {number} time in milliseconds for the Scene to be brought in.
    +259              * @param alpha {boolean} whether fading will be applied to the Scene.
    +260              * @param anchor {number} Scene switch anchor.
    +261              * @param interpolator {CAAT.Behavior.Interpolator} how to apply to the Scene transition.
    +262              * @param starttime {number} scene time milliseconds from which the behavior will be applied.
    +263              * @param isIn boolean indicating whether the Scene is being brought in.
    +264              */
    +265             easeScale:function (starttime, time, alpha, anchor, isIn, interpolator) {
    +266                 this.easeContainerBehaviour = new CAAT.Behavior.ContainerBehavior();
    +267 
    +268                 var x = 0;
    +269                 var y = 0;
    +270                 var x2 = 0;
    +271                 var y2 = 0;
    +272 
    +273                 switch (anchor) {
    +274                     case CAAT.Foundation.Actor.ANCHOR_TOP_LEFT:
    +275                     case CAAT.Foundation.Actor.ANCHOR_TOP_RIGHT:
    +276                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM_LEFT:
    +277                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM_RIGHT:
    +278                     case CAAT.Foundation.Actor.ANCHOR_CENTER:
    +279                         x2 = 1;
    +280                         y2 = 1;
    +281                         break;
    +282                     case CAAT.Foundation.Actor.ANCHOR_TOP:
    +283                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM:
    +284                         x = 1;
    +285                         x2 = 1;
    +286                         y = 0;
    +287                         y2 = 1;
    +288                         break;
    +289                     case CAAT.Foundation.Actor.ANCHOR_LEFT:
    +290                     case CAAT.Foundation.Actor.ANCHOR_RIGHT:
    +291                         y = 1;
    +292                         y2 = 1;
    +293                         x = 0;
    +294                         x2 = 1;
    +295                         break;
    +296                     default:
    +297                         alert('scale anchor ?? ' + anchor);
    +298                 }
    +299 
    +300                 if (!isIn) {
    +301                     var tmp;
    +302                     tmp = x;
    +303                     x = x2;
    +304                     x2 = tmp;
    +305 
    +306                     tmp = y;
    +307                     y = y2;
    +308                     y2 = tmp;
    +309                 }
    +310 
    +311                 if (alpha) {
    +312                     this.createAlphaBehaviour(time, isIn);
    +313                 }
    +314 
    +315                 var anchorPercent = this.getAnchorPercent(anchor);
    +316                 var sb = new CAAT.Behavior.ScaleBehavior().
    +317                     setFrameTime(starttime, time).
    +318                     setValues(x, x2, y, y2, anchorPercent.x, anchorPercent.y);
    +319 
    +320                 if (interpolator) {
    +321                     sb.setInterpolator(interpolator);
    +322                 }
    +323 
    +324                 this.easeContainerBehaviour.addBehavior(sb);
    +325 
    +326                 this.easeContainerBehaviour.setFrameTime(this.time, time);
    +327                 this.easeContainerBehaviour.addListener(this);
    +328 
    +329                 this.emptyBehaviorList();
    +330                 CAAT.Foundation.Scene.superclass.addBehavior.call(this, this.easeContainerBehaviour);
    +331             },
    +332             /**
    +333              * Overriden method to disallow default behavior.
    +334              * Do not use directly.
    +335              */
    +336             addBehavior:function (behaviour) {
    +337                 return this;
    +338             },
    +339             /**
    +340              * Called from CAAT.Director to use Rotations for bringing in.
    +341              * This method is a Helper for the method easeRotation.
    +342              * @param time integer indicating time in milliseconds for the Scene to be brought in.
    +343              * @param alpha boolean indicating whether fading will be applied to the Scene.
    +344              * @param anchor integer indicating the Scene switch anchor.
    +345              * @param interpolator {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    +346              */
    +347             easeRotationIn:function (time, alpha, anchor, interpolator) {
    +348                 this.easeRotation(time, alpha, anchor, true, interpolator);
    +349                 this.easeIn = true;
    +350             },
    +351             /**
    +352              * Called from CAAT.Director to use Rotations for taking Scenes away.
    +353              * This method is a Helper for the method easeRotation.
    +354              * @param time integer indicating time in milliseconds for the Scene to be taken away.
    +355              * @param alpha boolean indicating whether fading will be applied to the Scene.
    +356              * @param anchor integer indicating the Scene switch anchor.
    +357              * @param interpolator {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    +358              */
    +359             easeRotationOut:function (time, alpha, anchor, interpolator) {
    +360                 this.easeRotation(time, alpha, anchor, false, interpolator);
    +361                 this.easeIn = false;
    +362             },
    +363             /**
    +364              * Called from CAAT.Director to use Rotations for taking away or bringing Scenes in.
    +365              * @param time integer indicating time in milliseconds for the Scene to be taken away or brought in.
    +366              * @param alpha boolean indicating whether fading will be applied to the Scene.
    +367              * @param anchor integer indicating the Scene switch anchor.
    +368              * @param interpolator {CAAT.Interpolator} a CAAT.Interpolator to apply to the Scene transition.
    +369              * @param isIn boolean indicating whehter the Scene is brought in.
    +370              */
    +371             easeRotation:function (time, alpha, anchor, isIn, interpolator) {
    +372                 this.easeContainerBehaviour = new CAAT.Behavior.ContainerBehavior();
    +373 
    +374                 var start = 0;
    +375                 var end = 0;
    +376 
    +377                 if (anchor == CAAT.Foundation.Actor.ANCHOR_CENTER) {
    +378                     anchor = CAAT.Foundation.Actor.ANCHOR_TOP;
    +379                 }
    +380 
    +381                 switch (anchor) {
    +382                     case CAAT.Foundation.Actor.ANCHOR_TOP:
    +383                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM:
    +384                     case CAAT.Foundation.Actor.ANCHOR_LEFT:
    +385                     case CAAT.Foundation.Actor.ANCHOR_RIGHT:
    +386                         start = Math.PI * (Math.random() < 0.5 ? 1 : -1);
    +387                         break;
    +388                     case CAAT.Foundation.Actor.ANCHOR_TOP_LEFT:
    +389                     case CAAT.Foundation.Actor.ANCHOR_TOP_RIGHT:
    +390                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM_LEFT:
    +391                     case CAAT.Foundation.Actor.ANCHOR_BOTTOM_RIGHT:
    +392                         start = Math.PI / 2 * (Math.random() < 0.5 ? 1 : -1);
    +393                         break;
    +394                     default:
    +395                         alert('rot anchor ?? ' + anchor);
    +396                 }
    +397 
    +398                 if (false === isIn) {
    +399                     var tmp = start;
    +400                     start = end;
    +401                     end = tmp;
    +402                 }
    +403 
    +404                 if (alpha) {
    +405                     this.createAlphaBehaviour(time, isIn);
    +406                 }
    +407 
    +408                 var anchorPercent = this.getAnchorPercent(anchor);
    +409                 var rb = new CAAT.Behavior.RotateBehavior().
    +410                     setFrameTime(0, time).
    +411                     setValues(start, end, anchorPercent.x, anchorPercent.y);
    +412 
    +413                 if (interpolator) {
    +414                     rb.setInterpolator(interpolator);
    +415                 }
    +416                 this.easeContainerBehaviour.addBehavior(rb);
    +417                 this.easeContainerBehaviour.setFrameTime(this.time, time);
    +418                 this.easeContainerBehaviour.addListener(this);
    +419 
    +420                 this.emptyBehaviorList();
    +421                 CAAT.Foundation.Scene.superclass.addBehavior.call(this, this.easeContainerBehaviour);
    +422             },
    +423             /**
    +424              * Registers a listener for listen for transitions events.
    +425              * Al least, the Director registers himself as Scene easing transition listener.
    +426              * When the transition is done, it restores the Scene's capability of receiving events.
    +427              * @param listener {function(caat_behavior,time,actor)} an object which contains a method of the form <code>
    +428              * behaviorExpired( caat_behaviour, time, actor);
    +429              */
    +430             setEaseListener:function (listener) {
    +431                 this.easeContainerBehaviourListener = listener;
    +432             },
    +433             /**
    +434              * Private.
    +435              * listener for the Scene's easeContainerBehaviour.
    +436              * @param actor
    +437              */
    +438             behaviorExpired:function (actor) {
    +439                 this.easeContainerBehaviourListener.easeEnd(this, this.easeIn);
    +440             },
    +441             /**
    +442              * This method should be overriden in case the developer wants to do some special actions when
    +443              * the scene has just been brought in.
    +444              */
    +445             activated:function () {
    +446             },
    +447             /**
    +448              * Scenes, do not expire the same way Actors do.
    +449              * It simply will be set expired=true, but the frameTime won't be modified.
    +450              */
    +451             setExpired:function (bExpired) {
    +452                 this.expired = bExpired;
    +453             },
    +454             /**
    +455              * An scene by default does not paint anything because has not fillStyle set.
    +456              * @param director
    +457              * @param time
    +458              */
    +459             paint:function (director, time) {
    +460 
    +461                 if (this.fillStyle) {
    +462                     var ctx = director.ctx;
    +463                     ctx.fillStyle = this.fillStyle;
    +464                     ctx.fillRect(0, 0, this.width, this.height);
    +465                 }
    +466             },
    +467             /**
    +468              * Find a pointed actor at position point.
    +469              * This method tries lo find the correctly pointed actor in two different ways.
    +470              *  + first of all, if inputList is defined, it will look for an actor in it.
    +471              *  + if no inputList is defined, it will traverse the scene graph trying to find a pointed actor.
    +472              * @param point <CAAT.Point>
    +473              */
    +474             findActorAtPosition:function (point) {
    +475                 var i, j;
    +476 
    +477                 var p = new CAAT.Math.Point();
    +478 
    +479                 if (this.inputList) {
    +480                     var il = this.inputList;
    +481                     for (i = 0; i < il.length; i++) {
    +482                         var ill = il[i];
    +483                         for (j = 0; j < ill.length; j++) {
    +484                             if ( ill[j].visible ) {
    +485                                 p.set(point.x, point.y);
    +486                                 var modelViewMatrixI = ill[j].worldModelViewMatrix.getInverse();
    +487                                 modelViewMatrixI.transformCoord(p);
    +488                                 if (ill[j].contains(p.x, p.y)) {
    +489                                     return ill[j];
    +490                                 }
    +491                             }
    +492                         }
    +493                     }
    +494                 }
    +495 
    +496                 p.set(point.x, point.y);
    +497                 return CAAT.Foundation.Scene.superclass.findActorAtPosition.call(this, p);
    +498             },
    +499 
    +500             /**
    +501              * Enable a number of input lists.
    +502              * These lists are set in case the developer doesn't want the to traverse the scene graph to find the pointed
    +503              * actor. The lists are a shortcut whete the developer can set what actors to look for input at first instance.
    +504              * The system will traverse the whole lists in order trying to find a pointed actor.
    +505              *
    +506              * Elements are added to each list either in head or tail.
    +507              *
    +508              * @param size <number> number of lists.
    +509              */
    +510             enableInputList:function (size) {
    +511                 this.inputList = [];
    +512                 for (var i = 0; i < size; i++) {
    +513                     this.inputList.push([]);
    +514                 }
    +515 
    +516                 return this;
    +517             },
    +518 
    +519             /**
    +520              * Add an actor to a given inputList.
    +521              * @param actor <CAAT.Actor> an actor instance
    +522              * @param index <number> the inputList index to add the actor to. This value will be clamped to the number of
    +523              * available lists.
    +524              * @param position <number> the position on the selected inputList to add the actor at. This value will be
    +525              * clamped to the number of available lists.
    +526              */
    +527             addActorToInputList:function (actor, index, position) {
    +528                 if (index < 0) index = 0; else if (index >= this.inputList.length) index = this.inputList.length - 1;
    +529                 var il = this.inputList[index];
    +530 
    +531                 if (typeof position === "undefined" || position >= il.length) {
    +532                     il.push(actor);
    +533                 } else if (position <= 0) {
    +534                     il.unshift(actor);
    +535                 } else {
    +536                     il.splice(position, 0, actor);
    +537                 }
    +538 
    +539                 return this;
    +540             },
    +541 
    +542             /**
    +543              * Remove all elements from an input list.
    +544              * @param index <number> the inputList index to add the actor to. This value will be clamped to the number of
    +545              * available lists so take care when emptying a non existant inputList index since you could end up emptying
    +546              * an undesired input list.
    +547              */
    +548             emptyInputList:function (index) {
    +549                 if (index < 0) index = 0; else if (index >= this.inputList.length) index = this.inputList.length - 1;
    +550                 this.inputList[index] = [];
    +551                 return this;
    +552             },
    +553 
    +554             /**
    +555              * remove an actor from a given input list index.
    +556              * If no index is supplied, the actor will be removed from every input list.
    +557              * @param actor <CAAT.Actor>
    +558              * @param index <!number> an optional input list index. This value will be clamped to the number of
    +559              * available lists.
    +560              */
    +561             removeActorFromInputList:function (actor, index) {
    +562                 if (typeof index === "undefined") {
    +563                     var i, j;
    +564                     for (i = 0; i < this.inputList.length; i++) {
    +565                         var il = this.inputList[i];
    +566                         for (j = 0; j < il.length; j++) {
    +567                             if (il[j] == actor) {
    +568                                 il.splice(j, 1);
    +569                             }
    +570                         }
    +571                     }
    +572                     return this;
    +573                 }
    +574 
    +575                 if (index < 0) index = 0; else if (index >= this.inputList.length) index = this.inputList.length - 1;
    +576                 var il = this.inputList[index];
    +577                 for (j = 0; j < il.length; j++) {
    +578                     if (il[j] == actor) {
    +579                         il.splice(j, 1);
    +580                     }
    +581                 }
    +582 
    +583                 return this;
    +584             },
    +585 
    +586             getIn : function( out_scene ) {
    +587 
    +588             },
    +589 
    +590             goOut : function( in_scene ) {
    +591 
    +592             }
    +593 
    +594         }
    +595     }
    +596 
    +597 
    +598 });
    +599 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImage.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImage.js.html new file mode 100644 index 00000000..4bdd1f11 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImage.js.html @@ -0,0 +1,1173 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * TODO: allow set of margins, spacing, etc. to define subimages.
    +  5  *
    +  6  **/
    +  7 
    +  8 CAAT.Module({
    +  9 
    + 10     /**
    + 11      * @name SpriteImage
    + 12      * @memberOf CAAT.Foundation
    + 13      * @constructor
    + 14      */
    + 15 
    + 16 
    + 17     defines : "CAAT.Foundation.SpriteImage",
    + 18     aliases : ["CAAT.SpriteImage"],
    + 19     depends : [
    + 20         "CAAT.Foundation.SpriteImageHelper",
    + 21         "CAAT.Foundation.SpriteImageAnimationHelper",
    + 22         "CAAT.Math.Rectangle"
    + 23     ],
    + 24     constants:{
    + 25         /**
    + 26          * @lends  CAAT.Foundation.SpriteImage
    + 27          */
    + 28 
    + 29         /** @const @type {number} */ TR_NONE:0, // constants used to determine how to draw the sprite image,
    + 30         /** @const @type {number} */ TR_FLIP_HORIZONTAL:1,
    + 31         /** @const @type {number} */ TR_FLIP_VERTICAL:2,
    + 32         /** @const @type {number} */ TR_FLIP_ALL:3,
    + 33         /** @const @type {number} */ TR_FIXED_TO_SIZE:4,
    + 34         /** @const @type {number} */ TR_FIXED_WIDTH_TO_SIZE:6,
    + 35         /** @const @type {number} */ TR_TILE:5
    + 36     },
    + 37     extendsWith:function () {
    + 38 
    + 39         return {
    + 40 
    + 41             /**
    + 42              * @lends  CAAT.Foundation.SpriteImage.prototype
    + 43              */
    + 44 
    + 45             __init:function () {
    + 46                 this.paint = this.paintN;
    + 47                 this.setAnimationImageIndex([0]);
    + 48                 this.mapInfo = {};
    + 49                 this.animationsMap= {};
    + 50 
    + 51                 if ( arguments.length===1 ) {
    + 52                     this.initialize.call(this, arguments[0], 1, 1);
    + 53                 } else if ( arguments.length===3 ) {
    + 54                     this.initialize.apply(this, arguments);
    + 55                 }
    + 56                 return this;
    + 57             },
    + 58 
    + 59             /**
    + 60              * an Array defining the sprite frame sequence
    + 61              */
    + 62             animationImageIndex:null,
    + 63 
    + 64             /**
    + 65              * Previous animation frame time.
    + 66              */
    + 67             prevAnimationTime:-1,
    + 68 
    + 69             /**
    + 70              * how much Scene time to take before changing an Sprite frame.
    + 71              */
    + 72             changeFPS:1000,
    + 73 
    + 74             /**
    + 75              * any of the TR_* constants.
    + 76              */
    + 77             transformation:0,
    + 78 
    + 79             /**
    + 80              * the current sprite frame
    + 81              */
    + 82             spriteIndex:0,
    + 83 
    + 84             /**
    + 85              * current index of sprite frames array.
    + 86              */
    + 87             prevIndex:0,    //
    + 88 
    + 89             /**
    + 90              * current animation name
    + 91              */
    + 92             currentAnimation: null,
    + 93 
    + 94             /**
    + 95              * Image to get frames from.
    + 96              */
    + 97             image:null,
    + 98 
    + 99             /**
    +100              * Number of rows
    +101              */
    +102             rows:1,
    +103 
    +104             /**
    +105              * Number of columns.
    +106              */
    +107             columns:1,
    +108 
    +109             /**
    +110              * This sprite image image´s width
    +111              */
    +112             width:0,
    +113 
    +114             /**
    +115              * This sprite image image´s width
    +116              */
    +117             height:0,
    +118 
    +119             /**
    +120              * For each element in the sprite image array, its size.
    +121              */
    +122             singleWidth:0,
    +123 
    +124             /**
    +125              * For each element in the sprite image array, its height.
    +126              */
    +127             singleHeight:0,
    +128 
    +129             scaleX:1,
    +130             scaleY:1,
    +131 
    +132             /**
    +133              * Displacement offset to get the sub image from. Useful to make images shift.
    +134              */
    +135             offsetX:0,
    +136 
    +137             /**
    +138              * Displacement offset to get the sub image from. Useful to make images shift.
    +139              */
    +140             offsetY:0,
    +141 
    +142             /**
    +143              * When nesting sprite images, this value is the star X position of this sprite image in the parent.
    +144              */
    +145             parentOffsetX:0,    // para especificar una subimagen dentro un textmap.
    +146 
    +147             /**
    +148              * When nesting sprite images, this value is the star Y position of this sprite image in the parent.
    +149              */
    +150             parentOffsetY:0,
    +151 
    +152             /**
    +153              * The actor this sprite image belongs to.
    +154              */
    +155             ownerActor:null,
    +156 
    +157             /**
    +158              * If the sprite image is defined out of a JSON object (sprite packer for example), this is
    +159              * the subimages calculated definition map.
    +160              */
    +161             mapInfo:null,
    +162 
    +163             /**
    +164              * If the sprite image is defined out of a JSON object (sprite packer for example), this is
    +165              * the subimages original definition map.
    +166              */
    +167             map:null,
    +168 
    +169             /**
    +170              * This property allows to have multiple different animations defined for one actor.
    +171              * see demo31 for a sample.
    +172              */
    +173             animationsMap : null,
    +174 
    +175             /**
    +176              * When an animation sequence ends, this callback function will be called.
    +177              */
    +178             callback : null,        // on end animation callback
    +179 
    +180             /**
    +181              * pending: refactor -> font scale to a font object.
    +182              */
    +183             fontScale : 1,
    +184 
    +185             getOwnerActor : function() {
    +186                 return this.ownerActor;
    +187             },
    +188 
    +189             /**
    +190              * Add an animation to this sprite image.
    +191              * An animation is defines by an array of pretend-to-be-played sprite sequence.
    +192              *
    +193              * @param name {string} animation name.
    +194              * @param array {Array<number|string>} the sprite animation sequence array. It can be defined
    +195              *              as number array for Grid-like sprite images or strings for a map-like sprite
    +196              *              image.
    +197              * @param time {number} change animation sequence every 'time' ms.
    +198              * @param callback {function({SpriteImage},{string}} a callback function to invoke when the sprite
    +199              *              animation sequence has ended.
    +200              */
    +201             addAnimation : function( name, array, time, callback ) {
    +202                 this.animationsMap[name]= new CAAT.Foundation.SpriteImageAnimationHelper(array,time,callback);
    +203                 return this;
    +204             },
    +205 
    +206             setAnimationEndCallback : function(f) {
    +207                 this.callback= f;
    +208             },
    +209 
    +210             /**
    +211              * Start playing a SpriteImage animation.
    +212              * If it does not exist, nothing happens.
    +213              * @param name
    +214              */
    +215             playAnimation : function(name) {
    +216                 if (name===this.currentAnimation) {
    +217                     return this;
    +218                 }
    +219 
    +220                 var animation= this.animationsMap[name];
    +221                 if ( !animation ) {
    +222                     return this;
    +223                 }
    +224 
    +225                 this.currentAnimation= name;
    +226 
    +227                 this.setAnimationImageIndex( animation.animation );
    +228                 this.changeFPS= animation.time;
    +229                 this.callback= animation.onEndPlayCallback;
    +230 
    +231                 return this;
    +232             },
    +233 
    +234             setOwner:function (actor) {
    +235                 this.ownerActor = actor;
    +236                 return this;
    +237             },
    +238             getRows:function () {
    +239                 return this.rows;
    +240             },
    +241             getColumns:function () {
    +242                 return this.columns;
    +243             },
    +244 
    +245             getWidth:function () {
    +246                 var el = this.mapInfo[this.spriteIndex];
    +247                 return el.width;
    +248             },
    +249 
    +250             getHeight:function () {
    +251                 var el = this.mapInfo[this.spriteIndex];
    +252                 return el.height;
    +253             },
    +254 
    +255             getWrappedImageWidth:function () {
    +256                 return this.image.width;
    +257             },
    +258 
    +259             getWrappedImageHeight:function () {
    +260                 return this.image.height;
    +261             },
    +262 
    +263             /**
    +264              * Get a reference to the same image information (rows, columns, image and uv cache) of this
    +265              * SpriteImage. This means that re-initializing this objects image info (that is, calling initialize
    +266              * method) will change all reference's image information at the same time.
    +267              */
    +268             getRef:function () {
    +269                 var ret = new CAAT.Foundation.SpriteImage();
    +270                 ret.image = this.image;
    +271                 ret.rows = this.rows;
    +272                 ret.columns = this.columns;
    +273                 ret.width = this.width;
    +274                 ret.height = this.height;
    +275                 ret.singleWidth = this.singleWidth;
    +276                 ret.singleHeight = this.singleHeight;
    +277                 ret.mapInfo = this.mapInfo;
    +278                 ret.offsetX = this.offsetX;
    +279                 ret.offsetY = this.offsetY;
    +280                 ret.scaleX = this.scaleX;
    +281                 ret.scaleY = this.scaleY;
    +282                 ret.animationsMap= this.animationsMap;
    +283                 ret.parentOffsetX= this.parentOffsetX;
    +284                 ret.parentOffsetY= this.parentOffsetY;
    +285 
    +286                 ret.scaleFont= this.scaleFont;
    +287 
    +288                 return ret;
    +289             },
    +290             /**
    +291              * Set horizontal displacement to draw image. Positive values means drawing the image more to the
    +292              * right.
    +293              * @param x {number}
    +294              * @return this
    +295              */
    +296             setOffsetX:function (x) {
    +297                 this.offsetX = x;
    +298                 return this;
    +299             },
    +300             /**
    +301              * Set vertical displacement to draw image. Positive values means drawing the image more to the
    +302              * bottom.
    +303              * @param y {number}
    +304              * @return this
    +305              */
    +306             setOffsetY:function (y) {
    +307                 this.offsetY = y;
    +308                 return this;
    +309             },
    +310             setOffset:function (x, y) {
    +311                 this.offsetX = x;
    +312                 this.offsetY = y;
    +313                 return this;
    +314             },
    +315             /**
    +316              * Initialize a grid of subimages out of a given image.
    +317              * @param image {HTMLImageElement|Image} an image object.
    +318              * @param rows {number} number of rows.
    +319              * @param columns {number} number of columns
    +320              *
    +321              * @return this
    +322              */
    +323             initialize:function (image, rows, columns) {
    +324 
    +325                 if (!image) {
    +326                     console.log("Null image for SpriteImage.");
    +327                 }
    +328 
    +329                 if ( isString(image) ) {
    +330                     image= CAAT.currentDirector.getImage(image);
    +331                 }
    +332 
    +333                 this.parentOffsetX= 0;
    +334                 this.parentOffsetY= 0;
    +335 
    +336                 this.rows = rows;
    +337                 this.columns = columns;
    +338 
    +339                 if ( image instanceof CAAT.Foundation.SpriteImage || image instanceof CAAT.SpriteImage ) {
    +340                     this.image =        image.image;
    +341                     var sihelper= image.mapInfo[0];
    +342                     this.width= sihelper.width;
    +343                     this.height= sihelper.height;
    +344 
    +345                     this.parentOffsetX= sihelper.x;
    +346                     this.parentOffsetY= sihelper.y;
    +347 
    +348                     this.width= image.mapInfo[0].width;
    +349                     this.height= image.mapInfo[0].height;
    +350 
    +351                 } else {
    +352                     this.image = image;
    +353                     this.width = image.width;
    +354                     this.height = image.height;
    +355                     this.mapInfo = {};
    +356 
    +357                 }
    +358 
    +359                 this.singleWidth = Math.floor(this.width / columns);
    +360                 this.singleHeight = Math.floor(this.height / rows);
    +361 
    +362                 var i, sx0, sy0;
    +363                 var helper;
    +364 
    +365                 if (image.__texturePage) {
    +366                     image.__du = this.singleWidth / image.__texturePage.width;
    +367                     image.__dv = this.singleHeight / image.__texturePage.height;
    +368 
    +369 
    +370                     var w = this.singleWidth;
    +371                     var h = this.singleHeight;
    +372                     var mod = this.columns;
    +373                     if (image.inverted) {
    +374                         var t = w;
    +375                         w = h;
    +376                         h = t;
    +377                         mod = this.rows;
    +378                     }
    +379 
    +380                     var xt = this.image.__tx;
    +381                     var yt = this.image.__ty;
    +382 
    +383                     var tp = this.image.__texturePage;
    +384 
    +385                     for (i = 0; i < rows * columns; i++) {
    +386 
    +387 
    +388                         var c = ((i % mod) >> 0);
    +389                         var r = ((i / mod) >> 0);
    +390 
    +391                         var u = xt + c * w;  // esquina izq x
    +392                         var v = yt + r * h;
    +393 
    +394                         var u1 = u + w;
    +395                         var v1 = v + h;
    +396 
    +397                         helper = new CAAT.Foundation.SpriteImageHelper(u, v, (u1 - u), (v1 - v), tp.width, tp.height).setGL(
    +398                             u / tp.width,
    +399                             v / tp.height,
    +400                             u1 / tp.width,
    +401                             v1 / tp.height);
    +402 
    +403                         this.mapInfo[i] = helper;
    +404                     }
    +405 
    +406                 } else {
    +407                     for (i = 0; i < rows * columns; i++) {
    +408                         sx0 = ((i % this.columns) | 0) * this.singleWidth + this.parentOffsetX;
    +409                         sy0 = ((i / this.columns) | 0) * this.singleHeight + this.parentOffsetY;
    +410 
    +411                         helper = new CAAT.Foundation.SpriteImageHelper(sx0, sy0, this.singleWidth, this.singleHeight, image.width, image.height);
    +412                         this.mapInfo[i] = helper;
    +413                     }
    +414                 }
    +415 
    +416                 return this;
    +417             },
    +418 
    +419             /**
    +420              * Create elements as director.getImage values.
    +421              * Create as much as elements defined in this sprite image.
    +422              * The elements will be named prefix+<the map info element name>
    +423              * @param prefix
    +424              */
    +425             addElementsAsImages : function( prefix ) {
    +426                 for( var i in this.mapInfo ) {
    +427                     var si= new CAAT.Foundation.SpriteImage().initialize( this.image, 1, 1 );
    +428                     si.addElement(0, this.mapInfo[i]);
    +429                     si.setSpriteIndex(0);
    +430                     CAAT.currentDirector.addImage( prefix+i, si );
    +431                 }
    +432             },
    +433 
    +434             copy : function( other ) {
    +435                 this.initialize(other,1,1);
    +436                 this.mapInfo= other.mapInfo;
    +437                 return this;
    +438             },
    +439 
    +440             /**
    +441              * Must be used to draw actor background and the actor should have setClip(true) so that the image tiles
    +442              * properly.
    +443              * @param director
    +444              * @param time
    +445              * @param x
    +446              * @param y
    +447              */
    +448             paintTiled:function (director, time, x, y) {
    +449 
    +450                 // PENDING: study using a pattern
    +451 
    +452                 var el = this.mapInfo[this.spriteIndex];
    +453 
    +454                 var r = new CAAT.Math.Rectangle();
    +455                 this.ownerActor.AABB.intersect(director.AABB, r);
    +456 
    +457                 var w = this.getWidth();
    +458                 var h = this.getHeight();
    +459                 var xoff = (this.offsetX - this.ownerActor.x) % w;
    +460                 if (xoff > 0) {
    +461                     xoff = xoff - w;
    +462                 }
    +463                 var yoff = (this.offsetY - this.ownerActor.y) % h;
    +464                 if (yoff > 0) {
    +465                     yoff = yoff - h;
    +466                 }
    +467 
    +468                 var nw = (((r.width - xoff) / w) >> 0) + 1;
    +469                 var nh = (((r.height - yoff) / h) >> 0) + 1;
    +470                 var i, j;
    +471                 var ctx = director.ctx;
    +472 
    +473                 for (i = 0; i < nh; i++) {
    +474                     for (j = 0; j < nw; j++) {
    +475                         ctx.drawImage(
    +476                             this.image,
    +477                             el.x, el.y,
    +478                             el.width, el.height,
    +479                             (r.x - this.ownerActor.x + xoff + j * el.width) >> 0, (r.y - this.ownerActor.y + yoff + i * el.height) >> 0,
    +480                             el.width, el.height);
    +481                     }
    +482                 }
    +483             },
    +484 
    +485             /**
    +486              * Draws the subimage pointed by imageIndex horizontally inverted.
    +487              * @param director {CAAT.Foundation.Director}
    +488              * @param time {number} scene time.
    +489              * @param x {number} x position in canvas to draw the image.
    +490              * @param y {number} y position in canvas to draw the image.
    +491              *
    +492              * @return this
    +493              */
    +494             paintInvertedH:function (director, time, x, y) {
    +495 
    +496                 var el = this.mapInfo[this.spriteIndex];
    +497 
    +498                 var ctx = director.ctx;
    +499                 ctx.save();
    +500                 //ctx.translate(((0.5 + x) | 0) + el.width, (0.5 + y) | 0);
    +501                 ctx.translate((x | 0) + el.width, y | 0);
    +502                 ctx.scale(-1, 1);
    +503 
    +504 
    +505                 ctx.drawImage(
    +506                     this.image,
    +507                     el.x, el.y,
    +508                     el.width, el.height,
    +509                     this.offsetX >> 0, this.offsetY >> 0,
    +510                     el.width, el.height);
    +511 
    +512                 ctx.restore();
    +513 
    +514                 return this;
    +515             },
    +516             /**
    +517              * Draws the subimage pointed by imageIndex vertically inverted.
    +518              * @param director {CAAT.Foundation.Director}
    +519              * @param time {number} scene time.
    +520              * @param x {number} x position in canvas to draw the image.
    +521              * @param y {number} y position in canvas to draw the image.
    +522              *
    +523              * @return this
    +524              */
    +525             paintInvertedV:function (director, time, x, y) {
    +526 
    +527                 var el = this.mapInfo[this.spriteIndex];
    +528 
    +529                 var ctx = director.ctx;
    +530                 ctx.save();
    +531                 //ctx.translate((x + 0.5) | 0, (0.5 + y + el.height) | 0);
    +532                 ctx.translate(x | 0, (y + el.height) | 0);
    +533                 ctx.scale(1, -1);
    +534 
    +535                 ctx.drawImage(
    +536                     this.image,
    +537                     el.x, el.y,
    +538                     el.width, el.height,
    +539                     this.offsetX >> 0, this.offsetY >> 0,
    +540                     el.width, el.height);
    +541 
    +542                 ctx.restore();
    +543 
    +544                 return this;
    +545             },
    +546             /**
    +547              * Draws the subimage pointed by imageIndex both horizontal and vertically inverted.
    +548              * @param director {CAAT.Foundation.Director}
    +549              * @param time {number} scene time.
    +550              * @param x {number} x position in canvas to draw the image.
    +551              * @param y {number} y position in canvas to draw the image.
    +552              *
    +553              * @return this
    +554              */
    +555             paintInvertedHV:function (director, time, x, y) {
    +556 
    +557                 var el = this.mapInfo[this.spriteIndex];
    +558 
    +559                 var ctx = director.ctx;
    +560                 ctx.save();
    +561                 //ctx.translate((x + 0.5) | 0, (0.5 + y + el.height) | 0);
    +562                 ctx.translate(x | 0, (y + el.height) | 0);
    +563                 ctx.scale(1, -1);
    +564                 ctx.translate(el.width, 0);
    +565                 ctx.scale(-1, 1);
    +566 
    +567                 ctx.drawImage(
    +568                     this.image,
    +569                     el.x, el.y,
    +570                     el.width, el.height,
    +571                     this.offsetX >> 0, this.offsetY >> 0,
    +572                     el.width, el.height);
    +573 
    +574                 ctx.restore();
    +575 
    +576                 return this;
    +577             },
    +578             /**
    +579              * Draws the subimage pointed by imageIndex.
    +580              * @param director {CAAT.Foundation.Director}
    +581              * @param time {number} scene time.
    +582              * @param x {number} x position in canvas to draw the image.
    +583              * @param y {number} y position in canvas to draw the image.
    +584              *
    +585              * @return this
    +586              */
    +587             paintN:function (director, time, x, y) {
    +588 
    +589                 var el = this.mapInfo[this.spriteIndex];
    +590 
    +591                 director.ctx.drawImage(
    +592                     this.image,
    +593                     el.x, el.y,
    +594                     el.width, el.height,
    +595                     (this.offsetX + x) >> 0, (this.offsetY + y) >> 0,
    +596                     el.width, el.height);
    +597 
    +598                 return this;
    +599             },
    +600             paintAtRect:function (director, time, x, y, w, h) {
    +601 
    +602                 var el = this.mapInfo[this.spriteIndex];
    +603 
    +604                 director.ctx.drawImage(
    +605                     this.image,
    +606                     el.x, el.y,
    +607                     el.width, el.height,
    +608                     (this.offsetX + x) >> 0, (this.offsetY + y) >> 0,
    +609                     w, h);
    +610 
    +611                 return this;
    +612             },
    +613             /**
    +614              * Draws the subimage pointed by imageIndex.
    +615              * @param director {CAAT.Foundation.Director}
    +616              * @param time {number} scene time.
    +617              * @param x {number} x position in canvas to draw the image.
    +618              * @param y {number} y position in canvas to draw the image.
    +619              *
    +620              * @return this
    +621              */
    +622             paintScaledWidth:function (director, time, x, y) {
    +623 
    +624                 var el = this.mapInfo[this.spriteIndex];
    +625 
    +626                 director.ctx.drawImage(
    +627                     this.image,
    +628                     el.x, el.y,
    +629                     el.width, el.height,
    +630                     (this.offsetX + x) >> 0, (this.offsetY + y) >> 0,
    +631                     this.ownerActor.width, el.height);
    +632 
    +633                 return this;
    +634             },
    +635             paintChunk:function (ctx, dx, dy, x, y, w, h) {
    +636                 ctx.drawImage(this.image, x, y, w, h, dx, dy, w, h);
    +637             },
    +638             paintTile:function (ctx, index, x, y) {
    +639                 var el = this.mapInfo[index];
    +640                 ctx.drawImage(
    +641                     this.image,
    +642                     el.x, el.y,
    +643                     el.width, el.height,
    +644                     (this.offsetX + x) >> 0, (this.offsetY + y) >> 0,
    +645                     el.width, el.height);
    +646 
    +647                 return this;
    +648             },
    +649             /**
    +650              * Draws the subimage pointed by imageIndex scaled to the size of w and h.
    +651              * @param director {CAAT.Foundation.Director}
    +652              * @param time {number} scene time.
    +653              * @param x {number} x position in canvas to draw the image.
    +654              * @param y {number} y position in canvas to draw the image.
    +655              *
    +656              * @return this
    +657              */
    +658             paintScaled:function (director, time, x, y) {
    +659 
    +660                 var el = this.mapInfo[this.spriteIndex];
    +661 
    +662                 director.ctx.drawImage(
    +663                     this.image,
    +664                     el.x, el.y,
    +665                     el.width, el.height,
    +666                     (this.offsetX + x) >> 0, (this.offsetY + y) >> 0,
    +667                     this.ownerActor.width, this.ownerActor.height);
    +668 
    +669                 return this;
    +670             },
    +671             getCurrentSpriteImageCSSPosition:function () {
    +672                 var el = this.mapInfo[this.spriteIndex];
    +673 
    +674                 var x = -(el.x + this.parentOffsetX - this.offsetX);
    +675                 var y = -(el.y + this.parentOffsetY - this.offsetY);
    +676 
    +677                 return '' + x + 'px ' +
    +678                     y + 'px ' +
    +679                     (this.ownerActor.transformation === CAAT.Foundation.SpriteImage.TR_TILE ? 'repeat' : 'no-repeat');
    +680             },
    +681             /**
    +682              * Get the number of subimages in this compoundImage
    +683              * @return {number}
    +684              */
    +685             getNumImages:function () {
    +686                 return this.rows * this.columns;
    +687             },
    +688 
    +689             setUV:function (uvBuffer, uvIndex) {
    +690                 var im = this.image;
    +691 
    +692                 if (!im.__texturePage) {
    +693                     return;
    +694                 }
    +695 
    +696                 var index = uvIndex;
    +697                 var sIndex = this.spriteIndex;
    +698                 var el = this.mapInfo[this.spriteIndex];
    +699 
    +700                 var u = el.u;
    +701                 var v = el.v;
    +702                 var u1 = el.u1;
    +703                 var v1 = el.v1;
    +704                 if (this.offsetX || this.offsetY) {
    +705                     var w = this.ownerActor.width;
    +706                     var h = this.ownerActor.height;
    +707 
    +708                     var tp = im.__texturePage;
    +709 
    +710                     var _u = -this.offsetX / tp.width;
    +711                     var _v = -this.offsetY / tp.height;
    +712                     var _u1 = (w - this.offsetX) / tp.width;
    +713                     var _v1 = (h - this.offsetY) / tp.height;
    +714 
    +715                     u = _u + im.__u;
    +716                     v = _v + im.__v;
    +717                     u1 = _u1 + im.__u;
    +718                     v1 = _v1 + im.__v;
    +719                 }
    +720 
    +721                 if (im.inverted) {
    +722                     uvBuffer[index++] = u1;
    +723                     uvBuffer[index++] = v;
    +724 
    +725                     uvBuffer[index++] = u1;
    +726                     uvBuffer[index++] = v1;
    +727 
    +728                     uvBuffer[index++] = u;
    +729                     uvBuffer[index++] = v1;
    +730 
    +731                     uvBuffer[index++] = u;
    +732                     uvBuffer[index++] = v;
    +733                 } else {
    +734                     uvBuffer[index++] = u;
    +735                     uvBuffer[index++] = v;
    +736 
    +737                     uvBuffer[index++] = u1;
    +738                     uvBuffer[index++] = v;
    +739 
    +740                     uvBuffer[index++] = u1;
    +741                     uvBuffer[index++] = v1;
    +742 
    +743                     uvBuffer[index++] = u;
    +744                     uvBuffer[index++] = v1;
    +745                 }
    +746             },
    +747             /**
    +748              * Set the elapsed time needed to change the image index.
    +749              * @param fps an integer indicating the time in milliseconds to change.
    +750              * @return this
    +751              */
    +752             setChangeFPS:function (fps) {
    +753                 this.changeFPS = fps;
    +754                 return this;
    +755             },
    +756             /**
    +757              * Set the transformation to apply to the Sprite image.
    +758              * Any value of
    +759              *  <li>TR_NONE
    +760              *  <li>TR_FLIP_HORIZONTAL
    +761              *  <li>TR_FLIP_VERTICAL
    +762              *  <li>TR_FLIP_ALL
    +763              *
    +764              * @param transformation an integer indicating one of the previous values.
    +765              * @return this
    +766              */
    +767             setSpriteTransformation:function (transformation) {
    +768                 this.transformation = transformation;
    +769                 var v = CAAT.Foundation.SpriteImage;
    +770                 switch (transformation) {
    +771                     case v.TR_FLIP_HORIZONTAL:
    +772                         this.paint = this.paintInvertedH;
    +773                         break;
    +774                     case v.TR_FLIP_VERTICAL:
    +775                         this.paint = this.paintInvertedV;
    +776                         break;
    +777                     case v.TR_FLIP_ALL:
    +778                         this.paint = this.paintInvertedHV;
    +779                         break;
    +780                     case v.TR_FIXED_TO_SIZE:
    +781                         this.paint = this.paintScaled;
    +782                         break;
    +783                     case v.TR_FIXED_WIDTH_TO_SIZE:
    +784                         this.paint = this.paintScaledWidth;
    +785                         break;
    +786                     case v.TR_TILE:
    +787                         this.paint = this.paintTiled;
    +788                         break;
    +789                     default:
    +790                         this.paint = this.paintN;
    +791                 }
    +792                 this.ownerActor.invalidate();
    +793                 return this;
    +794             },
    +795 
    +796             resetAnimationTime:function () {
    +797                 this.prevAnimationTime = -1;
    +798                 return this;
    +799             },
    +800 
    +801             /**
    +802              * Set the sprite animation images index. This method accepts an array of objects which define indexes to
    +803              * subimages inside this sprite image.
    +804              * If the SpriteImage is instantiated by calling the method initialize( image, rows, cols ), the value of
    +805              * aAnimationImageIndex should be an array of numbers, which define the indexes into an array of subimages
    +806              * with size rows*columns.
    +807              * If the method InitializeFromMap( image, map ) is called, the value for aAnimationImageIndex is expected
    +808              * to be an array of strings which are the names of the subobjects contained in the map object.
    +809              *
    +810              * @param aAnimationImageIndex an array indicating the Sprite's frames.
    +811              */
    +812             setAnimationImageIndex:function (aAnimationImageIndex) {
    +813                 this.animationImageIndex = aAnimationImageIndex;
    +814                 this.spriteIndex = aAnimationImageIndex[0];
    +815                 this.prevAnimationTime = -1;
    +816 
    +817                 return this;
    +818             },
    +819             setSpriteIndex:function (index) {
    +820                 this.spriteIndex = index;
    +821                 return this;
    +822             },
    +823 
    +824             /**
    +825              * Draws the sprite image calculated and stored in spriteIndex.
    +826              *
    +827              * @param time {number} Scene time when the bounding box is to be drawn.
    +828              */
    +829             setSpriteIndexAtTime:function (time) {
    +830 
    +831                 if (this.animationImageIndex.length > 1) {
    +832                     if (this.prevAnimationTime === -1) {
    +833                         this.prevAnimationTime = time;
    +834 
    +835                         //thanks Phloog and ghthor, well spotted.
    +836                         this.spriteIndex = this.animationImageIndex[0];
    +837                         this.prevIndex= 0;
    +838                         this.ownerActor.invalidate();
    +839                     }
    +840                     else {
    +841                         var ttime = time;
    +842                         ttime -= this.prevAnimationTime;
    +843                         ttime /= this.changeFPS;
    +844                         ttime %= this.animationImageIndex.length;
    +845                         var idx = Math.floor(ttime);
    +846 //                    if ( this.spriteIndex!==idx ) {
    +847 
    +848                         if ( idx<this.prevIndex ) {   // we are getting back in time, or ended playing the animation
    +849                             if ( this.callback ) {
    +850                                 this.callback( this, time );
    +851                             }
    +852                         }
    +853 
    +854                         this.prevIndex= idx;
    +855                         this.spriteIndex = this.animationImageIndex[idx];
    +856                         this.ownerActor.invalidate();
    +857 //                    }
    +858                     }
    +859                 }
    +860             },
    +861 
    +862             getMapInfo:function (index) {
    +863                 return this.mapInfo[ index ];
    +864             },
    +865 
    +866             initializeFromGlyphDesigner : function( text ) {
    +867                 for (var i = 0; i < text.length; i++) {
    +868                     if (0 === text[i].indexOf("char ")) {
    +869                         var str = text[i].substring(5);
    +870                         var pairs = str.split(' ');
    +871                         var obj = {
    +872                             x: 0,
    +873                             y: 0,
    +874                             width: 0,
    +875                             height: 0,
    +876                             xadvance: 0,
    +877                             xoffset: 0,
    +878                             yoffset: 0
    +879                         };
    +880 
    +881                         for (var j = 0; j < pairs.length; j++) {
    +882                             var pair = pairs[j];
    +883                             var pairData = pair.split("=");
    +884                             var key = pairData[0];
    +885                             var value = pairData[1];
    +886                             if (value.charAt(0) === '"' && value.charAt(value.length - 1) === '"') {
    +887                                 value.substring(1, value.length - 1);
    +888                             }
    +889                             obj[ key ] = value;
    +890                         }
    +891 
    +892                         this.addElement(String.fromCharCode(obj.id), obj);
    +893                     }
    +894                 }
    +895 
    +896                 return this;
    +897             },
    +898 
    +899             /**
    +900              * This method takes the output generated from the tool at http://labs.hyperandroid.com/static/texture/spriter.html
    +901              * and creates a map into that image.
    +902              * @param image {Image|HTMLImageElement|Canvas} an image
    +903              * @param map {object} the map into the image to define subimages.
    +904              */
    +905             initializeFromMap:function (image, map) {
    +906                 this.initialize(image, 1, 1);
    +907 
    +908                 var key;
    +909                 var helper;
    +910                 var count = 0;
    +911 
    +912                 for (key in map) {
    +913                     var value = map[key];
    +914 
    +915                     helper = new CAAT.Foundation.SpriteImageHelper(
    +916                         parseFloat(value.x) + this.parentOffsetX,
    +917                         parseFloat(value.y) + this.parentOffsetY,
    +918                         parseFloat(value.width),
    +919                         parseFloat(value.height),
    +920                         image.width,
    +921                         image.height
    +922                     );
    +923 
    +924                     this.mapInfo[key] = helper;
    +925 
    +926                     // set a default spriteIndex
    +927                     if (!count) {
    +928                         this.setAnimationImageIndex([key]);
    +929                     }
    +930 
    +931                     count++;
    +932                 }
    +933 
    +934                 return this;
    +935             },
    +936 
    +937             initializeFromTexturePackerJSON : function( image, obj ) {
    +938 
    +939                 for( var img in obj.frames ) {
    +940                     var imgData= obj.frames[img];
    +941 
    +942                     var si_obj= {
    +943                         x: imgData.frame.x,
    +944                         y: imgData.frame.y,
    +945                         width: imgData.spriteSourceSize.w,
    +946                         height: imgData.spriteSourceSize.h,
    +947                         id: '0'
    +948                     };
    +949 
    +950                     var si= new CAAT.Foundation.SpriteImage().initialize( image, 1, 1 );
    +951                     si.addElement(0,si_obj);
    +952                     CAAT.currentDirector.addImage( img.substring(0,img.indexOf('.')), si );
    +953                 }
    +954             },
    +955 
    +956             /**
    +957              * Add one element to the spriteImage.
    +958              * @param key {string|number} index or sprite identifier.
    +959              * @param value object{
    +960              *      x: {number},
    +961              *      y: {number},
    +962              *      width: {number},
    +963              *      height: {number},
    +964              *      xoffset: {number=},
    +965              *      yoffset: {number=},
    +966              *      xadvance: {number=}
    +967              *      }
    +968              * @return {*}
    +969              */
    +970             addElement : function( key, value ) {
    +971                 var helper = new CAAT.Foundation.SpriteImageHelper(
    +972                     parseFloat(value.x) + this.parentOffsetX,
    +973                     parseFloat(value.y) + this.parentOffsetY,
    +974                     parseFloat(value.width),
    +975                     parseFloat(value.height),
    +976                     this.image.width,
    +977                     this.image.height );
    +978 
    +979                 helper.xoffset = typeof value.xoffset === 'undefined' ? 0 : parseFloat(value.xoffset);
    +980                 helper.yoffset = typeof value.yoffset === 'undefined' ? 0 : parseFloat(value.yoffset);
    +981                 helper.xadvance = typeof value.xadvance === 'undefined' ? value.width : parseFloat(value.xadvance);
    +982 
    +983                 this.mapInfo[key] = helper;
    +984 
    +985                 return this;
    +986             },
    +987 
    +988             /**
    +989              *
    +990              * @param image {Image|HTMLImageElement|Canvas}
    +991              * @param map object with pairs "<a char>" : {
    +992              *              id      : {number},
    +993              *              height  : {number},
    +994              *              xoffset : {number},
    +995              *              letter  : {string},
    +996              *              yoffset : {number},
    +997              *              width   : {number},
    +998              *              xadvance: {number},
    +999              *              y       : {number},
    +1000              *              x       : {number}
    +1001              *          }
    +1002              */
    +1003             initializeAsGlyphDesigner:function (image, map) {
    +1004                 this.initialize(image, 1, 1);
    +1005 
    +1006                 var key;
    +1007                 var helper;
    +1008                 var count = 0;
    +1009 
    +1010                 for (key in map) {
    +1011                     var value = map[key];
    +1012 
    +1013                     helper = new CAAT.Foundation.SpriteImageHelper(
    +1014                         parseFloat(value.x) + this.parentOffsetX,
    +1015                         parseFloat(value.y) + this.parentOffsetX,
    +1016                         parseFloat(value.width),
    +1017                         parseFloat(value.height),
    +1018                         image.width,
    +1019                         image.height
    +1020                     );
    +1021 
    +1022                     helper.xoffset = typeof value.xoffset === 'undefined' ? 0 : value.xoffset;
    +1023                     helper.yoffset = typeof value.yoffset === 'undefined' ? 0 : value.yoffset;
    +1024                     helper.xadvance = typeof value.xadvance === 'undefined' ? value.width : value.xadvance;
    +1025 
    +1026                     this.mapInfo[key] = helper;
    +1027 
    +1028                     // set a default spriteIndex
    +1029                     if (!count) {
    +1030                         this.setAnimationImageIndex([key]);
    +1031                     }
    +1032 
    +1033                     count++;
    +1034                 }
    +1035 
    +1036                 return this;
    +1037 
    +1038             },
    +1039 
    +1040 
    +1041             initializeAsFontMap:function (image, chars) {
    +1042                 this.initialize(image, 1, 1);
    +1043 
    +1044                 var helper;
    +1045                 var x = 0;
    +1046 
    +1047                 for (var i = 0; i < chars.length; i++) {
    +1048                     var value = chars[i];
    +1049 
    +1050                     helper = new CAAT.Foundation.SpriteImageHelper(
    +1051                         parseFloat(x) + this.parentOffsetX,
    +1052                         0 + this.parentOffsetY,
    +1053                         parseFloat(value.width),
    +1054                         image.height,
    +1055                         image.width,
    +1056                         image.height
    +1057                     );
    +1058 
    +1059                     helper.xoffset = 0;
    +1060                     helper.yoffset = 0;
    +1061                     helper.xadvance = value.width;
    +1062 
    +1063 
    +1064                     x += value.width;
    +1065 
    +1066                     this.mapInfo[chars[i].c] = helper;
    +1067 
    +1068                     // set a default spriteIndex
    +1069                     if (!i) {
    +1070                         this.setAnimationImageIndex([chars[i].c]);
    +1071                     }
    +1072                 }
    +1073 
    +1074                 return this;
    +1075             },
    +1076 
    +1077             /**
    +1078              * This method creates a font sprite image based on a proportional font
    +1079              * It assumes the font is evenly spaced in the image
    +1080              * Example:
    +1081              * var font =   new CAAT.SpriteImage().initializeAsMonoTypeFontMap(
    +1082              *  director.getImage('numbers'),
    +1083              *  "0123456789"
    +1084              * );
    +1085              */
    +1086 
    +1087             initializeAsMonoTypeFontMap:function (image, chars) {
    +1088                 var map = [];
    +1089                 var charArr = chars.split("");
    +1090 
    +1091                 var w = image.width / charArr.length >> 0;
    +1092 
    +1093                 for (var i = 0; i < charArr.length; i++) {
    +1094                     map.push({c:charArr[i], width:w });
    +1095                 }
    +1096 
    +1097                 return this.initializeAsFontMap(image, map);
    +1098             },
    +1099 
    +1100             stringWidth:function (str) {
    +1101                 var i, l, w = 0, charInfo;
    +1102 
    +1103                 for (i = 0, l = str.length; i < l; i++) {
    +1104                     charInfo = this.mapInfo[ str.charAt(i) ];
    +1105                     if (charInfo) {
    +1106                         w += charInfo.xadvance * this.fontScale;
    +1107                     }
    +1108                 }
    +1109 
    +1110                 return w;
    +1111             },
    +1112 
    +1113             stringHeight:function () {
    +1114                 if (this.fontHeight) {
    +1115                     return this.fontHeight * this.fontScale;
    +1116                 }
    +1117 
    +1118                 var y = 0;
    +1119                 for (var i in this.mapInfo) {
    +1120                     var mi = this.mapInfo[i];
    +1121 
    +1122                     var h = mi.height + mi.yoffset;
    +1123                     if (h > y) {
    +1124                         y = h;
    +1125                     }
    +1126                 }
    +1127 
    +1128                 this.fontHeight = y;
    +1129                 return this.fontHeight * this.fontScale;
    +1130             },
    +1131 
    +1132             drawText:function (str, ctx, x, y) {
    +1133                 var i, l, charInfo, w;
    +1134 
    +1135                 for (i = 0; i < str.length; i++) {
    +1136                     charInfo = this.mapInfo[ str.charAt(i) ];
    +1137                     if (charInfo) {
    +1138                         w = charInfo.width;
    +1139                         if ( w>0 && charInfo.height>0 ) {
    +1140                             ctx.drawImage(
    +1141                                 this.image,
    +1142                                 charInfo.x, charInfo.y,
    +1143                                 w, charInfo.height,
    +1144 
    +1145                                 x + charInfo.xoffset* this.fontScale, y + charInfo.yoffset* this.fontScale,
    +1146                                 w* this.fontScale, charInfo.height* this.fontScale);
    +1147                         }
    +1148                         x += charInfo.xadvance* this.fontScale;
    +1149                     }
    +1150                 }
    +1151             },
    +1152 
    +1153             getFontData : function() {
    +1154                 var as= (this.stringHeight() *.8)>>0;
    +1155                 return {
    +1156                     height : this.stringHeight(),
    +1157                     ascent : as,
    +1158                     descent: this.stringHeight() - as
    +1159                 };
    +1160 
    +1161             }
    +1162 
    +1163         }
    +1164     }
    +1165 });
    +1166 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageAnimationHelper.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageAnimationHelper.js.html new file mode 100644 index 00000000..acb13762 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageAnimationHelper.js.html @@ -0,0 +1,54 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      *
    +  5      * Define an animation frame sequence, name it and supply with a callback which be called when the
    +  6      * sequence ends playing.
    +  7      *
    +  8      * @name SpriteImageAnimationHelper
    +  9      * @memberOf CAAT.Foundation
    + 10      * @constructor
    + 11      */
    + 12 
    + 13     defines : "CAAT.Foundation.SpriteImageAnimationHelper",
    + 14     extendsWith : function() {
    + 15         return {
    + 16 
    + 17             /**
    + 18              * @lends  CAAT.Foundation.SpriteImageAnimationHelper.prototype
    + 19              */
    + 20 
    + 21             __init : function( animation, time, onEndPlayCallback ) {
    + 22                 this.animation= animation;
    + 23                 this.time= time;
    + 24                 this.onEndPlayCallback= onEndPlayCallback;
    + 25                 return this;
    + 26             },
    + 27 
    + 28             /**
    + 29              * A sequence of integer values defining a frame animation.
    + 30              * For example [1,2,3,4,3,2,3,4,3,2]
    + 31              * Array.<number>
    + 32              */
    + 33             animation :         null,
    + 34 
    + 35             /**
    + 36              * Time between any two animation frames.
    + 37              */
    + 38             time :              0,
    + 39 
    + 40             /**
    + 41              * Call this callback function when the sequence ends.
    + 42              */
    + 43             onEndPlayCallback : null
    + 44 
    + 45         }
    + 46     }
    + 47 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageHelper.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageHelper.js.html new file mode 100644 index 00000000..f63eacc7 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_SpriteImageHelper.js.html @@ -0,0 +1,58 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * Define a drawable sub-image inside a bigger image as an independant drawable item.
    +  5      *
    +  6      * @name SpriteImageHelper
    +  7      * @memberOf CAAT.Foundation
    +  8      * @constructor
    +  9      *
    + 10      *
    + 11      *
    + 12      */
    + 13 
    + 14 
    + 15     defines : "CAAT.Foundation.SpriteImageHelper",
    + 16 
    + 17     extendsWith : {
    + 18 
    + 19         /**
    + 20          * @lends  CAAT.Foundation.SpriteImageHelper.prototype
    + 21          */
    + 22 
    + 23         __init : function (x, y, w, h, iw, ih) {
    + 24             this.x = parseFloat(x);
    + 25             this.y = parseFloat(y);
    + 26             this.width = parseFloat(w);
    + 27             this.height = parseFloat(h);
    + 28 
    + 29             this.setGL(x / iw, y / ih, (x + w - 1) / iw, (y + h - 1) / ih);
    + 30             return this;
    + 31         },
    + 32 
    + 33         x:0,
    + 34         y:0,
    + 35         width:0,
    + 36         height:0,
    + 37         u:0,
    + 38         v:0,
    + 39         u1:0,
    + 40         v1:0,
    + 41 
    + 42         setGL:function (u, v, u1, v1) {
    + 43             this.u = u;
    + 44             this.v = v;
    + 45             this.u1 = u1;
    + 46             this.v1 = v1;
    + 47             return this;
    + 48         }
    + 49     }
    + 50 });
    + 51 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerManager.js.html new file mode 100644 index 00000000..e1a58f47 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerManager.js.html @@ -0,0 +1,141 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  */
    +  4 CAAT.Module({
    +  5 
    +  6     /**
    +  7      * @name Timer
    +  8      * @memberOf CAAT.Foundation
    +  9      * @namespace
    + 10      */
    + 11 
    + 12     /**
    + 13      * @name TimerManager
    + 14      * @memberOf CAAT.Foundation.Timer
    + 15      * @constructor
    + 16      */
    + 17 
    + 18     defines : "CAAT.Foundation.Timer.TimerManager",
    + 19     aliases : ["CAAT.TimerManager"],
    + 20     depends : [
    + 21         "CAAT.Foundation.Timer.TimerTask"
    + 22     ],
    + 23     extendsWith :   {
    + 24 
    + 25         /**
    + 26          * @lends CAAT.Foundation.Timer.TimerManager.prototype
    + 27          */
    + 28 
    + 29         __init:function () {
    + 30             this.timerList = [];
    + 31             return this;
    + 32         },
    + 33 
    + 34         /**
    + 35          * Collection of registered timers.
    + 36          * @type {CAAT.Foundation.Timer.TimerManager}
    + 37          * @private
    + 38          */
    + 39         timerList:null,
    + 40 
    + 41         /**
    + 42          * Index sequence to idenfity registered timers.
    + 43          * @private
    + 44          */
    + 45         timerSequence:0,
    + 46 
    + 47         /**
    + 48          * Check and apply timers in frame time.
    + 49          * @param time {number} the current Scene time.
    + 50          */
    + 51         checkTimers:function (time) {
    + 52             var tl = this.timerList;
    + 53             var i = tl.length - 1;
    + 54             while (i >= 0) {
    + 55                 if (!tl[i].remove) {
    + 56                     tl[i].checkTask(time);
    + 57                 }
    + 58                 i--;
    + 59             }
    + 60         },
    + 61         /**
    + 62          * Make sure the timertask is contained in the timer task list by adding it to the list in case it
    + 63          * is not contained.
    + 64          * @param timertask {CAAT.Foundation.Timer.TimerTask}.
    + 65          * @return this
    + 66          */
    + 67         ensureTimerTask:function (timertask) {
    + 68             if (!this.hasTimer(timertask)) {
    + 69                 this.timerList.push(timertask);
    + 70             }
    + 71             return this;
    + 72         },
    + 73         /**
    + 74          * Check whether the timertask is in this scene's timer task list.
    + 75          * @param timertask {CAAT.Foundation.Timer.TimerTask}.
    + 76          * @return {boolean} a boolean indicating whether the timertask is in this scene or not.
    + 77          */
    + 78         hasTimer:function (timertask) {
    + 79             var tl = this.timerList;
    + 80             var i = tl.length - 1;
    + 81             while (i >= 0) {
    + 82                 if (tl[i] === timertask) {
    + 83                     return true;
    + 84                 }
    + 85                 i--;
    + 86             }
    + 87 
    + 88             return false;
    + 89         },
    + 90         /**
    + 91          * Creates a timer task. Timertask object live and are related to scene's time, so when an Scene
    + 92          * is taken out of the Director the timer task is paused, and resumed on Scene restoration.
    + 93          *
    + 94          * @param startTime {number} an integer indicating the scene time this task must start executing at.
    + 95          * @param duration {number} an integer indicating the timerTask duration.
    + 96          * @param callback_timeout {function} timer on timeout callback function.
    + 97          * @param callback_tick {function} timer on tick callback function.
    + 98          * @param callback_cancel {function} timer on cancel callback function.
    + 99          *
    +100          * @return {CAAT.TimerTask} a CAAT.TimerTask class instance.
    +101          */
    +102         createTimer:function (startTime, duration, callback_timeout, callback_tick, callback_cancel, scene) {
    +103 
    +104             var tt = new CAAT.Foundation.Timer.TimerTask().create(
    +105                 startTime,
    +106                 duration,
    +107                 callback_timeout,
    +108                 callback_tick,
    +109                 callback_cancel);
    +110 
    +111             tt.taskId = this.timerSequence++;
    +112             tt.sceneTime = scene.time;
    +113             tt.owner = this;
    +114             tt.scene = scene;
    +115 
    +116             this.timerList.push(tt);
    +117 
    +118             return tt;
    +119         },
    +120         /**
    +121          * Removes expired timers. This method must not be called directly.
    +122          */
    +123         removeExpiredTimers:function () {
    +124             var i;
    +125             var tl = this.timerList;
    +126             for (i = 0; i < tl.length; i++) {
    +127                 if (tl[i].remove) {
    +128                     tl.splice(i, 1);
    +129                 }
    +130             }
    +131         }
    +132     }
    +133 });
    +134 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerTask.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerTask.js.html new file mode 100644 index 00000000..f49bc1c9 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_Timer_TimerTask.js.html @@ -0,0 +1,145 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name TimerTask
    +  5      * @memberOf CAAT.Foundation.Timer
    +  6      * @constructor
    +  7      */
    +  8 
    +  9     defines : "CAAT.Foundation.Timer.TimerTask",
    + 10     aliases : ["CAAT.TimerTask"],
    + 11     extendsWith : {
    + 12 
    + 13         /**
    + 14          * @lends CAAT.Foundation.Timer.TimerTask.prototype
    + 15          */
    + 16 
    + 17         /**
    + 18          * Timer start time. Relative to Scene or Director time, depending who owns this TimerTask.
    + 19          */
    + 20         startTime:          0,
    + 21 
    + 22         /**
    + 23          * Timer duration.
    + 24          */
    + 25         duration:           0,
    + 26 
    + 27         /**
    + 28          * This callback will be called only once, when the timer expires.
    + 29          */
    + 30         callback_timeout:   null,
    + 31 
    + 32         /**
    + 33          * This callback will be called whenever the timer is checked in time.
    + 34          */
    + 35         callback_tick:      null,
    + 36 
    + 37         /**
    + 38          * This callback will be called when the timer is cancelled.
    + 39          */
    + 40         callback_cancel:    null,
    + 41 
    + 42         /**
    + 43          * What TimerManager instance owns this task.
    + 44          */
    + 45         owner:              null,
    + 46 
    + 47         /**
    + 48          * Scene or director instance that owns this TimerTask owner.
    + 49          */
    + 50         scene:              null,   // scene or director instance
    + 51 
    + 52         /**
    + 53          * An arbitrry id.
    + 54          */
    + 55         taskId:             0,
    + 56 
    + 57         /**
    + 58          * Remove this timer task on expiration/cancellation ?
    + 59          */
    + 60         remove:             false,
    + 61 
    + 62         /**
    + 63          * Create a TimerTask.
    + 64          * The taskId will be set by the scene.
    + 65          * @param startTime {number} an integer indicating TimerTask enable time.
    + 66          * @param duration {number} an integer indicating TimerTask duration.
    + 67          * @param callback_timeout {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on timeout callback function.
    + 68          * @param callback_tick {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on tick callback function.
    + 69          * @param callback_cancel {function( sceneTime {number}, timertaskTime{number}, timertask {CAAT.TimerTask} )} on cancel callback function.
    + 70          *
    + 71          * @return this
    + 72          */
    + 73         create: function( startTime, duration, callback_timeout, callback_tick, callback_cancel ) {
    + 74             this.startTime=         startTime;
    + 75             this.duration=          duration;
    + 76             this.callback_timeout=  callback_timeout;
    + 77             this.callback_tick=     callback_tick;
    + 78             this.callback_cancel=   callback_cancel;
    + 79             return this;
    + 80         },
    + 81         /**
    + 82          * Performs TimerTask operation. The task will check whether it is in frame time, and will
    + 83          * either notify callback_timeout or callback_tick.
    + 84          *
    + 85          * @param time {number} an integer indicating scene time.
    + 86          * @return this
    + 87          *
    + 88          * @protected
    + 89          *
    + 90          */
    + 91         checkTask : function(time) {
    + 92             var ttime= time;
    + 93             ttime-= this.startTime;
    + 94             if ( ttime>=this.duration ) {
    + 95                 this.remove= true;
    + 96                 if( this.callback_timeout ) {
    + 97                     this.callback_timeout( time, ttime, this );
    + 98                 }
    + 99             } else {
    +100                 if ( this.callback_tick ) {
    +101                     this.callback_tick( time, ttime, this );
    +102                 }
    +103             }
    +104             return this;
    +105         },
    +106         remainingTime : function() {
    +107             return this.duration - (this.scene.time-this.startTime);
    +108         },
    +109         /**
    +110          * Reschedules this TimerTask by changing its startTime to current scene's time.
    +111          * @param time {number} an integer indicating scene time.
    +112          * @return this
    +113          */
    +114         reset : function( time ) {
    +115             this.remove= false;
    +116             this.startTime=  time;
    +117             this.owner.ensureTimerTask(this);
    +118             return this;
    +119         },
    +120         /**
    +121          * Cancels this timer by removing it on scene's next frame. The function callback_cancel will
    +122          * be called.
    +123          * @return this
    +124          */
    +125         cancel : function() {
    +126             this.remove= true;
    +127             if ( null!=this.callback_cancel ) {
    +128                 this.callback_cancel( this.scene.time, this.scene.time-this.startTime, this );
    +129             }
    +130             return this;
    +131         },
    +132         addTime : function( time ) {
    +133             this.duration+= time;
    +134             return this;
    +135         }
    +136     }
    +137 });
    +138 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Dock.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Dock.js.html new file mode 100644 index 00000000..352a9a29 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Dock.js.html @@ -0,0 +1,390 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * In this file we'll be adding every useful Actor that is specific for certain purpose.
    +  5  *
    +  6  * + CAAT.Dock: a docking container that zooms in/out its actors.
    +  7  *
    +  8  */
    +  9 
    + 10 CAAT.Module( {
    + 11 
    + 12     /**
    + 13      * @name UI
    + 14      * @memberOf CAAT.Foundation
    + 15      * @namespace
    + 16      */
    + 17 
    + 18     /**
    + 19      * @name Dock
    + 20      * @memberOf CAAT.Foundation.UI
    + 21      * @extends CAAT.Foundation.ActorContainer
    + 22      * @constructor
    + 23      */
    + 24 
    + 25     defines : "CAAT.Foundation.UI.Dock",
    + 26     aliases : ["CAAT.Dock"],
    + 27     extendsClass : "CAAT.Foundation.ActorContainer",
    + 28     depends : [
    + 29         "CAAT.Foundation.ActorContainer",
    + 30         "CAAT.Behavior.GenericBehavior"
    + 31     ],
    + 32     constants : {
    + 33 
    + 34         /**
    + 35          * @lends CAAT.Foundation.UI.Dock
    + 36          */
    + 37 
    + 38         /**
    + 39          * @const
    + 40          */
    + 41         OP_LAYOUT_BOTTOM:   0,
    + 42         /**
    + 43          * @const
    + 44          */
    + 45         OP_LAYOUT_TOP:      1,
    + 46         /**
    + 47          * @const
    + 48          */
    + 49         OP_LAYOUT_LEFT:     2,
    + 50         /**
    + 51          * @const
    + 52          */
    + 53         OP_LAYOUT_RIGHT:    3
    + 54     },
    + 55     extendsWith : {
    + 56 
    + 57         /**
    + 58          * @lends CAAT.Foundation.UI.Dock.prototype
    + 59          */
    + 60 
    + 61         /**
    + 62          * scene the actor is in.
    + 63          */
    + 64         scene:              null,
    + 65 
    + 66         /**
    + 67          * resetting dimension timer task.
    + 68          */
    + 69         ttask:              null,
    + 70 
    + 71         /**
    + 72          * min contained actor size.
    + 73          */
    + 74         minSize:            0,
    + 75 
    + 76         /**
    + 77          * max contained actor size
    + 78          */
    + 79         maxSize:            0,
    + 80 
    + 81         /**
    + 82          * aproximated number of elements affected.
    + 83          */
    + 84         range:              2,
    + 85 
    + 86         /**
    + 87          * Any value from CAAT.Foundation.Dock.UI.OP_LAYOUT_*
    + 88          */
    + 89         layoutOp:           0,
    + 90 
    + 91         initialize : function(scene) {
    + 92             this.scene= scene;
    + 93             return this;
    + 94         },
    + 95         /**
    + 96          * Set the number of elements that will be affected (zoomed) when the mouse is inside the component.
    + 97          * @param range {number} a number. Defaults to 2.
    + 98          */
    + 99         setApplicationRange : function( range ) {
    +100             this.range= range;
    +101             return this;
    +102         },
    +103         /**
    +104          * Set layout orientation. Choose from
    +105          * <ul>
    +106          *  <li>CAAT.Dock.OP_LAYOUT_BOTTOM
    +107          *  <li>CAAT.Dock.OP_LAYOUT_TOP
    +108          *  <li>CAAT.Dock.OP_LAYOUT_BOTTOM
    +109          *  <li>CAAT.Dock.OP_LAYOUT_RIGHT
    +110          * </ul>
    +111          * By default, the layou operation is OP_LAYOUT_BOTTOM, that is, elements zoom bottom anchored.
    +112          *
    +113          * @param lo {number} one of CAAT.Dock.OP_LAYOUT_BOTTOM, CAAT.Dock.OP_LAYOUT_TOP,
    +114          * CAAT.Dock.OP_LAYOUT_BOTTOM, CAAT.Dock.OP_LAYOUT_RIGHT.
    +115          *
    +116          * @return this
    +117          */
    +118         setLayoutOp : function( lo ) {
    +119             this.layoutOp= lo;
    +120             return this;
    +121         },
    +122         /**
    +123          *
    +124          * Set maximum and minimum size of docked elements. By default, every contained actor will be
    +125          * of 'min' size, and will be scaled up to 'max' size.
    +126          *
    +127          * @param min {number}
    +128          * @param max {number}
    +129          * @return this
    +130          */
    +131         setSizes : function( min, max ) {
    +132             this.minSize= min;
    +133             this.maxSize= max;
    +134 
    +135             for( var i=0; i<this.childrenList.length; i++ ) {
    +136                 this.childrenList[i].width= min;
    +137                 this.childrenList[i].height= min;
    +138             }
    +139 
    +140             return this;
    +141         },
    +142         /**
    +143          * Lay out the docking elements. The lay out will be a row with the orientation set by calling
    +144          * the method <code>setLayoutOp</code>.
    +145          *
    +146          * @private
    +147          */
    +148         layout : function() {
    +149             var i,actor;
    +150 
    +151             var c= CAAT.Foundation.UI.Dock;
    +152 
    +153             if ( this.layoutOp===c.OP_LAYOUT_BOTTOM || this.layoutOp===c.OP_LAYOUT_TOP ) {
    +154 
    +155                 var currentWidth=0, currentX=0;
    +156 
    +157                 for( i=0; i<this.getNumChildren(); i++ ) {
    +158                     currentWidth+= this.getChildAt(i).width;
    +159                 }
    +160 
    +161                 currentX= (this.width-currentWidth)/2;
    +162 
    +163                 for( i=0; i<this.getNumChildren(); i++ ) {
    +164                     actor= this.getChildAt(i);
    +165                     actor.x= currentX;
    +166                     currentX+= actor.width;
    +167 
    +168                     if ( this.layoutOp===c.OP_LAYOUT_BOTTOM ) {
    +169                         actor.y= this.maxSize- actor.height;
    +170                     } else {
    +171                         actor.y= 0;
    +172                     }
    +173                 }
    +174             } else {
    +175 
    +176                 var currentHeight=0, currentY=0;
    +177 
    +178                 for( i=0; i<this.getNumChildren(); i++ ) {
    +179                     currentHeight+= this.getChildAt(i).height;
    +180                 }
    +181 
    +182                 currentY= (this.height-currentHeight)/2;
    +183 
    +184                 for( i=0; i<this.getNumChildren(); i++ ) {
    +185                     actor= this.getChildAt(i);
    +186                     actor.y= currentY;
    +187                     currentY+= actor.height;
    +188 
    +189                     if ( this.layoutOp===c.OP_LAYOUT_LEFT ) {
    +190                         actor.x= 0;
    +191                     } else {
    +192                         actor.x= this.width - actor.width;
    +193                     }
    +194                 }
    +195 
    +196             }
    +197 
    +198         },
    +199         mouseMove : function(mouseEvent) {
    +200             this.actorNotPointed();
    +201         },
    +202         mouseExit : function(mouseEvent) {
    +203             this.actorNotPointed();
    +204         },
    +205         /**
    +206          * Performs operation when the mouse is not in the dock element.
    +207          *
    +208          * @private
    +209          */
    +210         actorNotPointed : function() {
    +211 
    +212             var i;
    +213             var me= this;
    +214 
    +215             for( i=0; i<this.getNumChildren(); i++ ) {
    +216                 var actor= this.getChildAt(i);
    +217                 actor.emptyBehaviorList();
    +218                 actor.addBehavior(
    +219                         new CAAT.Behavior.GenericBehavior().
    +220                             setValues( actor.width, this.minSize, actor, 'width' ).
    +221                             setFrameTime( this.scene.time, 250 ) ).
    +222                     addBehavior(
    +223                         new CAAT.Behavior.GenericBehavior().
    +224                             setValues( actor.height, this.minSize, actor, 'height' ).
    +225                             setFrameTime( this.scene.time, 250 ) );
    +226 
    +227                 if ( i===this.getNumChildren()-1 ) {
    +228                     actor.behaviorList[0].addListener(
    +229                     {
    +230                         behaviorApplied : function(behavior,time,normalizedTime,targetActor,value) {
    +231                             targetActor.parent.layout();
    +232                         },
    +233                         behaviorExpired : function(behavior,time,targetActor) {
    +234                             for( i=0; i<me.getNumChildren(); i++ ) {
    +235                                 actor= me.getChildAt(i);
    +236                                 actor.width  = me.minSize;
    +237                                 actor.height = me.minSize;
    +238                             }
    +239                             targetActor.parent.layout();
    +240                         }
    +241                     });
    +242                 }
    +243             }
    +244         },
    +245         /**
    +246          *
    +247          * Perform the process of pointing a docking actor.
    +248          *
    +249          * @param x {number}
    +250          * @param y {number}
    +251          * @param pointedActor {CAAT.Actor}
    +252          *
    +253          * @private
    +254          */
    +255         actorPointed : function(x, y, pointedActor) {
    +256 
    +257             var index= this.findChild(pointedActor);
    +258             var c= CAAT.Foundation.UI.Dock;
    +259 
    +260             var across= 0;
    +261             if ( this.layoutOp===c.OP_LAYOUT_BOTTOM || this.layoutOp===c.OP_LAYOUT_TOP ) {
    +262                 across= x / pointedActor.width;
    +263             } else {
    +264                 across= y / pointedActor.height;
    +265             }
    +266             var i;
    +267 
    +268             for( i=0; i<this.childrenList.length; i++ ) {
    +269                 var actor= this.childrenList[i];
    +270                 actor.emptyBehaviorList();
    +271 
    +272                 var wwidth=0;
    +273                 if (i < index - this.range || i > index + this.range) {
    +274                     wwidth = this.minSize;
    +275                 } else if (i === index) {
    +276                     wwidth = this.maxSize;
    +277                 } else if (i < index) {
    +278                     wwidth=
    +279                         this.minSize +
    +280                         (this.maxSize-this.minSize) *
    +281                         (Math.cos((i - index - across + 1) / this.range * Math.PI) + 1) /
    +282                         2;
    +283                 } else {
    +284                     wwidth=
    +285                         this.minSize +
    +286                         (this.maxSize-this.minSize)*
    +287                         (Math.cos( (i - index - across) / this.range * Math.PI) + 1) /
    +288                         2;
    +289                 }
    +290 
    +291                 actor.height= wwidth;
    +292                 actor.width= wwidth;
    +293             }
    +294 
    +295             this.layout();
    +296         },
    +297         /**
    +298          * Perform the process of exiting the docking element, that is, animate elements to the minimum
    +299          * size.
    +300          *
    +301          * @param mouseEvent {CAAT.MouseEvent} a CAAT.MouseEvent object.
    +302          *
    +303          * @private
    +304          */
    +305         actorMouseExit : function(mouseEvent) {
    +306             if ( null!==this.ttask ) {
    +307                 this.ttask.cancel();
    +308             }
    +309 
    +310             var me= this;
    +311             this.ttask= this.scene.createTimer(
    +312                     this.scene.time,
    +313                     100,
    +314                     function timeout(sceneTime, time, timerTask) {
    +315                         me.actorNotPointed();
    +316                     },
    +317                     null,
    +318                     null);
    +319         },
    +320         /**
    +321          * Perform the beginning of docking elements.
    +322          * @param mouseEvent {CAAT.MouseEvent} a CAAT.MouseEvent object.
    +323          *
    +324          * @private
    +325          */
    +326         actorMouseEnter : function(mouseEvent) {
    +327             if ( null!==this.ttask ) {
    +328                 this.ttask.cancel();
    +329                 this.ttask= null;
    +330             }
    +331         },
    +332         /**
    +333          * Adds an actor to Dock.
    +334          * <p>
    +335          * Be aware that actor mouse functions must be set prior to calling this method. The Dock actor
    +336          * needs set his own actor input events functions for mouseEnter, mouseExit and mouseMove and
    +337          * will then chain to the original methods set by the developer.
    +338          *
    +339          * @param actor {CAAT.Actor} a CAAT.Actor instance.
    +340          *
    +341          * @return this
    +342          */
    +343         addChild : function(actor) {
    +344             var me= this;
    +345 
    +346             actor.__Dock_mouseEnter= actor.mouseEnter;
    +347             actor.__Dock_mouseExit=  actor.mouseExit;
    +348             actor.__Dock_mouseMove=  actor.mouseMove;
    +349 
    +350             /**
    +351              * @ignore
    +352              * @param mouseEvent
    +353              */
    +354             actor.mouseEnter= function(mouseEvent) {
    +355                 me.actorMouseEnter(mouseEvent);
    +356                 this.__Dock_mouseEnter(mouseEvent);
    +357             };
    +358             /**
    +359              * @ignore
    +360              * @param mouseEvent
    +361              */
    +362             actor.mouseExit= function(mouseEvent) {
    +363                 me.actorMouseExit(mouseEvent);
    +364                 this.__Dock_mouseExit(mouseEvent);
    +365             };
    +366             /**
    +367              * @ignore
    +368              * @param mouseEvent
    +369              */
    +370             actor.mouseMove= function(mouseEvent) {
    +371                 me.actorPointed( mouseEvent.point.x, mouseEvent.point.y, mouseEvent.source );
    +372                 this.__Dock_mouseMove(mouseEvent);
    +373             };
    +374 
    +375             actor.width= this.minSize;
    +376             actor.height= this.minSize;
    +377 
    +378             return CAAT.Foundation.UI.Dock.superclass.addChild.call(this,actor);
    +379         }
    +380     }
    +381 
    +382 });
    +383 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_IMActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_IMActor.js.html new file mode 100644 index 00000000..76813a36 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_IMActor.js.html @@ -0,0 +1,74 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name IMActor
    +  5      * @memberOf CAAT.Foundation.UI
    +  6      * @extends CAAT.Foundation.Actor
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Foundation.UI.IMActor",
    + 11     depends : [
    + 12         "CAAT.Foundation.Actor",
    + 13         "CAAT.Module.ImageProcessor.ImageProcessor"
    + 14     ],
    + 15     extendsClass : "CAAT.Foundation.Actor",
    + 16     extendsWith : {
    + 17 
    + 18         /**
    + 19          * @lends CAAT.Foundation.UI.IMActor.prototype
    + 20          */
    + 21 
    + 22         /**
    + 23          * Image processing interface.
    + 24          * @type { }
    + 25          */
    + 26         imageProcessor:         null,
    + 27 
    + 28         /**
    + 29          * Calculate another image processing frame every this milliseconds.
    + 30          */
    + 31         changeTime:             100,
    + 32 
    + 33         /**
    + 34          * Last scene time this actor calculated a frame.
    + 35          */
    + 36         lastApplicationTime:    -1,
    + 37 
    + 38         /**
    + 39          * Set the image processor.
    + 40          *
    + 41          * @param im {CAAT.ImageProcessor} a CAAT.ImageProcessor instance.
    + 42          */
    + 43         setImageProcessor : function(im) {
    + 44             this.imageProcessor= im;
    + 45             return this;
    + 46         },
    + 47         /**
    + 48          * Call image processor to update image every time milliseconds.
    + 49          * @param time an integer indicating milliseconds to elapse before updating the frame.
    + 50          */
    + 51         setImageProcessingTime : function( time ) {
    + 52             this.changeTime= time;
    + 53             return this;
    + 54         },
    + 55         paint : function( director, time ) {
    + 56             if ( time-this.lastApplicationTime>this.changeTime ) {
    + 57                 this.imageProcessor.apply( director, time );
    + 58                 this.lastApplicationTime= time;
    + 59             }
    + 60 
    + 61             var ctx= director.ctx;
    + 62             this.imageProcessor.paint( director, time );
    + 63         }
    + 64     }
    + 65 
    + 66 });
    + 67 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_InterpolatorActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_InterpolatorActor.js.html new file mode 100644 index 00000000..3b8c74f4 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_InterpolatorActor.js.html @@ -0,0 +1,126 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  **/
    +  5 
    +  6 CAAT.Module( {
    +  7 
    +  8     /**
    +  9      * @name InterpolatorActor
    + 10      * @memberOf CAAT.Foundation.UI
    + 11      * @extends CAAT.Foundation.Actor
    + 12      * @constructor
    + 13      */
    + 14 
    + 15     defines : "CAAT.Foundation.UI.InterpolatorActor",
    + 16     aliases : ["CAAT.InterpolatorActor"],
    + 17     depends : [
    + 18         "CAAT.Foundation.Actor"
    + 19     ],
    + 20     extendsClass : "CAAT.Foundation.Actor",
    + 21     extendsWith : {
    + 22 
    + 23         /**
    + 24          * @lends CAAT.Foundation.UI.InterpolatorActor.prototype
    + 25          */
    + 26 
    + 27         /**
    + 28          * The interpolator instance to draw.
    + 29          * @type {CAAT.Behavior.Interpolator}
    + 30          */
    + 31         interpolator:   null,
    + 32 
    + 33         /**
    + 34          * This interpolator´s contour.
    + 35          * @type {Array.<CAAT.Math.Point>}
    + 36          */
    + 37         contour:        null,   // interpolator contour cache
    + 38 
    + 39         /**
    + 40          * Number of samples to calculate a contour.
    + 41          */
    + 42         S:              50,     // contour samples.
    + 43 
    + 44         /**
    + 45          * padding when drawing the interpolator.
    + 46          */
    + 47         gap:            5,      // border size in pixels.
    + 48 
    + 49         /**
    + 50          * Sets a padding border size. By default is 5 pixels.
    + 51          * @param gap {number} border size in pixels.
    + 52          * @return this
    + 53          */
    + 54         setGap : function( gap ) {
    + 55             this.gap= gap;
    + 56             return this;
    + 57         },
    + 58         /**
    + 59          * Sets the CAAT.Interpolator instance to draw.
    + 60          *
    + 61          * @param interpolator a CAAT.Interpolator instance.
    + 62          * @param size an integer indicating the number of polyline segments so draw to show the CAAT.Interpolator
    + 63          * instance.
    + 64          *
    + 65          * @return this
    + 66          */
    + 67         setInterpolator : function( interpolator, size ) {
    + 68             this.interpolator= interpolator;
    + 69             this.contour= interpolator.getContour(size || this.S);
    + 70 
    + 71             return this;
    + 72         },
    + 73         /**
    + 74          * Paint this actor.
    + 75          * @param director {CAAT.Director}
    + 76          * @param time {number} scene time.
    + 77          */
    + 78         paint : function( director, time ) {
    + 79 
    + 80             CAAT.InterpolatorActor.superclass.paint.call(this,director,time);
    + 81 
    + 82             if ( this.backgroundImage ) {
    + 83                 return this;
    + 84             }
    + 85 
    + 86             if ( this.interpolator ) {
    + 87 
    + 88                 var canvas= director.ctx;
    + 89 
    + 90                 var xs= (this.width-2*this.gap);
    + 91                 var ys= (this.height-2*this.gap);
    + 92 
    + 93                 canvas.beginPath();
    + 94                 canvas.moveTo(
    + 95                         this.gap +  xs*this.contour[0].x,
    + 96                         -this.gap + this.height - ys*this.contour[0].y);
    + 97 
    + 98                 for( var i=1; i<this.contour.length; i++ ) {
    + 99                     canvas.lineTo(
    +100                              this.gap + xs*this.contour[i].x,
    +101                             -this.gap + this.height - ys*this.contour[i].y);
    +102                 }
    +103 
    +104                 canvas.strokeStyle= this.strokeStyle;
    +105                 canvas.stroke();
    +106             }
    +107         },
    +108         /**
    +109          * Return the represented interpolator.
    +110          * @return {CAAT.Interpolator}
    +111          */
    +112         getInterpolator : function() {
    +113             return this.interpolator;
    +114         }
    +115     }
    +116 
    +117 
    +118 });
    +119 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Label.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Label.js.html new file mode 100644 index 00000000..3d2e6482 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Label.js.html @@ -0,0 +1,1225 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name Label
    +  5      * @memberOf CAAT.Foundation.UI
    +  6      * @extends CAAT.Foundation.Actor
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Foundation.UI.Label",
    + 11     depends : [
    + 12         "CAAT.Foundation.Actor",
    + 13         "CAAT.Foundation.SpriteImage",
    + 14         "CAAT.Module.Font.Font",
    + 15         "CAAT.Foundation.UI.Layout.LayoutManager"
    + 16     ],
    + 17     aliases : ["CAAT.UI.Label"],
    + 18     extendsClass : "CAAT.Foundation.Actor",
    + 19     extendsWith : function() {
    + 20 
    + 21         var DEBUG=0;
    + 22         var JUSTIFY_RATIO= .6;
    + 23 
    + 24         /**
    + 25          *
    + 26          * Current applied rendering context information.
    + 27          */
    + 28         var renderContextStyle= function(ctx) {
    + 29             this.ctx= ctx;
    + 30             return this;
    + 31         };
    + 32 
    + 33         renderContextStyle.prototype= {
    + 34 
    + 35             ctx         : null,
    + 36 
    + 37             defaultFS   : null,
    + 38             font        : null,
    + 39             fontSize    : null,
    + 40             fill        : null,
    + 41             stroke      : null,
    + 42             filled      : null,
    + 43             stroked     : null,
    + 44             strokeSize  : null,
    + 45             italic      : null,
    + 46             bold        : null,
    + 47             alignment   : null,
    + 48             tabSize     : null,
    + 49             shadow      : null,
    + 50             shadowBlur  : null,
    + 51             shadowColor : null,
    + 52 
    + 53             sfont       : null,
    + 54 
    + 55             chain       : null,
    + 56 
    + 57             setDefault : function( defaultStyles ) {
    + 58                 this.defaultFS  =   24;
    + 59                 this.font       =   "Arial";
    + 60                 this.fontSize   =   this.defaultFS;
    + 61                 this.fill       =   '#000';
    + 62                 this.stroke     =   '#f00';
    + 63                 this.filled     =   true;
    + 64                 this.stroked    =   false;
    + 65                 this.strokeSize =   1;
    + 66                 this.italic     =   false;
    + 67                 this.bold       =   false;
    + 68                 this.alignment  =   "left";
    + 69                 this.tabSize    =   75;
    + 70                 this.shadow     =   false;
    + 71                 this.shadowBlur =   0;
    + 72                 this.shadowColor=   "#000";
    + 73 
    + 74                 for( var style in defaultStyles ) {
    + 75                     if ( defaultStyles.hasOwnProperty(style) ) {
    + 76                         this[style]= defaultStyles[style];
    + 77                     }
    + 78                 }
    + 79 
    + 80                 this.__setFont();
    + 81 
    + 82                 return this;
    + 83             },
    + 84 
    + 85             setStyle : function( styles ) {
    + 86                 if ( typeof styles!=="undefined" ) {
    + 87                     for( var style in styles ) {
    + 88                         this[style]= styles[style];
    + 89                     }
    + 90                 }
    + 91                 return this;
    + 92             },
    + 93 
    + 94             applyStyle : function() {
    + 95                 this.__setFont();
    + 96 
    + 97                 return this;
    + 98             },
    + 99 
    +100             clone : function( ) {
    +101                 var c= new renderContextStyle( this.ctx );
    +102                 var pr;
    +103                 for( pr in this ) {
    +104                     if ( this.hasOwnProperty(pr) ) {
    +105                         c[pr]= this[pr];
    +106                     }
    +107                 }
    +108                 /*
    +109                 c.defaultFS  =   this.defaultFS;
    +110                 c.font       =   this.font;
    +111                 c.fontSize   =   this.fontSize;
    +112                 c.fill       =   this.fill;
    +113                 c.stroke     =   this.stroke;
    +114                 c.filled     =   this.filled;
    +115                 c.stroked    =   this.stroked;
    +116                 c.strokeSize =   this.strokeSize;
    +117                 c.italic     =   this.italic;
    +118                 c.bold       =   this.bold;
    +119                 c.alignment  =   this.alignment;
    +120                 c.tabSize    =   this.tabSize;
    +121                 */
    +122 
    +123                 var me= this;
    +124                 while( me.chain ) {
    +125                     me= me.chain;
    +126                     for( pr in me ) {
    +127                         if ( c[pr]===null  && me.hasOwnProperty(pr) ) {
    +128                             c[pr]= me[pr];
    +129                         }
    +130                     }
    +131                 }
    +132 
    +133                 c.__setFont();
    +134 
    +135                 return c;
    +136             },
    +137 
    +138             __getProperty : function( prop ) {
    +139                 var me= this;
    +140                 var res;
    +141                 do {
    +142                     res= me[prop];
    +143                     if ( res!==null ) {
    +144                         return res;
    +145                     }
    +146                     me= me.chain;
    +147                 } while( me );
    +148 
    +149                 return null;
    +150             },
    +151 
    +152             image : function( ctx ) {
    +153                 this.__setShadow( ctx );
    +154             },
    +155 
    +156             text : function( ctx, text, x, y ) {
    +157 
    +158                 this.__setShadow( ctx );
    +159 
    +160                 ctx.font= this.__getProperty("sfont");
    +161 
    +162                 if ( this.filled ) {
    +163                     this.__fillText( ctx,text,x,y );
    +164                 }
    +165                 if ( this.stroked ) {
    +166                     this.__strokeText( ctx,text,x,y );
    +167                 }
    +168             },
    +169 
    +170             __setShadow : function( ctx ) {
    +171                 if ( this.__getProperty("shadow" ) ) {
    +172                     ctx.shadowBlur= this.__getProperty("shadowBlur");
    +173                     ctx.shadowColor= this.__getProperty("shadowColor");
    +174                 }
    +175             },
    +176 
    +177             __fillText : function( ctx, text, x, y ) {
    +178                 ctx.fillStyle= this.__getProperty("fill");
    +179                 ctx.fillText( text, x, y );
    +180             },
    +181 
    +182             __strokeText : function( ctx, text, x, y ) {
    +183                 ctx.strokeStyle= this.__getProperty("stroke");
    +184                 ctx.lineWidth= this.__getProperty("strokeSize");
    +185                 ctx.beginPath();
    +186                 ctx.strokeText( text, x, y );
    +187             },
    +188 
    +189             __setFont : function() {
    +190                 var italic= this.__getProperty("italic");
    +191                 var bold= this.__getProperty("bold");
    +192                 var fontSize= this.__getProperty("fontSize");
    +193                 var font= this.__getProperty("font");
    +194 
    +195                 this.sfont= (italic ? "italic " : "") +
    +196                     (bold ? "bold " : "") +
    +197                     fontSize + "px " +
    +198                     font;
    +199 
    +200                 this.ctx.font= this.__getProperty("sfont");
    +201             },
    +202 
    +203             setBold : function( bool ) {
    +204                 if ( bool!=this.bold ) {
    +205                     this.bold= bool;
    +206                     this.__setFont();
    +207                 }
    +208             },
    +209 
    +210             setItalic : function( bool ) {
    +211                 if ( bool!=this.italic ) {
    +212                     this.italic= bool;
    +213                     this.__setFont();
    +214                 }
    +215             },
    +216 
    +217             setStroked : function( bool ) {
    +218                 this.stroked= bool;
    +219             },
    +220 
    +221             setFilled : function( bool ) {
    +222                 this.filled= bool;
    +223             },
    +224 
    +225             getTabPos : function( x ) {
    +226                 var ts= this.__getProperty("tabSize");
    +227                 return (((x/ts)>>0)+1)*ts;
    +228             },
    +229 
    +230             setFillStyle : function( style ) {
    +231                 this.fill= style;
    +232             },
    +233 
    +234             setStrokeStyle : function( style ) {
    +235                 this.stroke= style;
    +236             },
    +237 
    +238             setStrokeSize : function( size ) {
    +239                 this.strokeSize= size;
    +240             },
    +241 
    +242             setAlignment : function( alignment ) {
    +243                 this.alignment= alignment;
    +244             },
    +245 
    +246             setFontSize : function( size ) {
    +247                 if ( size!==this.fontSize ) {
    +248                     this.fontSize= size;
    +249                     this.__setFont();
    +250                 }
    +251             }
    +252         };
    +253 
    +254         /**
    +255          * This class keeps track of styles, images, and the current applied style.
    +256          */
    +257         var renderContext= function() {
    +258             this.text= "";
    +259             return this;
    +260         };
    +261 
    +262         renderContext.prototype= {
    +263 
    +264             x           :   0,
    +265             y           :   0,
    +266             width       :   0,
    +267             text        :   null,
    +268 
    +269             crcs        :   null,   // current rendering context style
    +270             rcs         :   null,   // rendering content styles stack
    +271 
    +272             styles      :   null,
    +273             images      :   null,
    +274 
    +275             lines       :   null,
    +276 
    +277             documentHeight  : 0,
    +278 
    +279             anchorStack     : null,
    +280 
    +281             __nextLine : function() {
    +282                 this.x= 0;
    +283                 this.currentLine= new DocumentLine(
    +284                     CAAT.Module.Font.Font.getFontMetrics( this.crcs.sfont)  );
    +285                 this.lines.push( this.currentLine );
    +286             },
    +287 
    +288             /**
    +289              *
    +290              * @param image {CAAT.SpriteImage}
    +291              * @param r {number=}
    +292              * @param c {number=}
    +293              * @private
    +294              */
    +295             __image : function( image, r, c ) {
    +296 
    +297 
    +298                 var image_width;
    +299 
    +300                 if ( typeof r!=="undefined" && typeof c!=="undefined" ) {
    +301                     image_width= image.getWidth();
    +302                 } else {
    +303                     image_width= ( image instanceof CAAT.Foundation.SpriteImage ) ? image.getWidth() : image.getWrappedImageWidth();
    +304                 }
    +305 
    +306                 // la imagen cabe en este sitio.
    +307                 if ( this.width ) {
    +308                     if ( image_width + this.x > this.width && this.x>0 ) {
    +309                         this.__nextLine();
    +310                     }
    +311                 }
    +312 
    +313                 this.currentLine.addElementImage( new DocumentElementImage(
    +314                     this.x,
    +315                     image,
    +316                     r,
    +317                     c,
    +318                     this.crcs.clone(),
    +319                     this.__getCurrentAnchor() ) );
    +320 
    +321                 this.x+= image_width;
    +322             },
    +323 
    +324             __text : function() {
    +325 
    +326                 if ( this.text.length===0 ) {
    +327                     return;
    +328                 }
    +329 
    +330                 var text_width= this.ctx.measureText(this.text).width;
    +331 
    +332                 // la palabra cabe en este sitio.
    +333                 if ( this.width ) {
    +334                     if ( text_width + this.x > this.width && this.x>0 ) {
    +335                         this.__nextLine();
    +336                     }
    +337                 }
    +338 
    +339                 //this.crcs.text( this.text, this.x, this.y );
    +340                 this.currentLine.addElement( new DocumentElementText(
    +341                     this.text,
    +342                     this.x,
    +343                     text_width,
    +344                     0, //this.crcs.__getProperty("fontSize"), calculated later
    +345                     this.crcs.clone(),
    +346                     this.__getCurrentAnchor() ) ) ;
    +347 
    +348                 this.x+= text_width;
    +349 
    +350                 this.text="";
    +351             },
    +352 
    +353             fchar : function( _char ) {
    +354 
    +355                 if ( _char===' ' ) {
    +356 
    +357                     this.__text();
    +358 
    +359                     this.x+= this.ctx.measureText(_char).width;
    +360                     if ( this.width ) {
    +361                         if ( this.x > this.width ) {
    +362                             this.__nextLine();
    +363                         }
    +364                     }
    +365                 } else {
    +366                     this.text+= _char;
    +367                 }
    +368             },
    +369 
    +370             end : function() {
    +371                 if ( this.text.length>0 ) {
    +372                     this.__text();
    +373                 }
    +374 
    +375                 var y=0;
    +376                 var lastLineEstimatedDescent= 0;
    +377                 for( var i=0; i<this.lines.length; i++ ) {
    +378                     var inc= this.lines[i].getHeight();
    +379 
    +380                     if ( inc===0 ) {
    +381                         // lineas vacias al menos tienen tamaño del estilo por defecto
    +382                         inc= this.styles["default"].fontSize;
    +383                     }
    +384                     y+= inc;
    +385 
    +386                     /**
    +387                      * add the estimated descent of the last text line to document height's.
    +388                      * the descent is estimated to be a 20% of font's height.
    +389                      */
    +390                     if ( i===this.lines.length-1 ) {
    +391                         lastLineEstimatedDescent= (inc*.25)>>0;
    +392                     }
    +393 
    +394                     this.lines[i].setY(y);
    +395                 }
    +396 
    +397                 this.documentHeight= y + lastLineEstimatedDescent;
    +398             },
    +399 
    +400             getDocumentHeight : function() {
    +401                 return this.documentHeight;
    +402             },
    +403 
    +404             __getCurrentAnchor : function() {
    +405                 if ( this.anchorStack.length ) {
    +406                     return this.anchorStack[ this.anchorStack.length-1 ];
    +407                 }
    +408 
    +409                 return null;
    +410             },
    +411 
    +412             __resetAppliedStyles : function() {
    +413                 this.rcs= [];
    +414                 this.__pushDefaultStyles();
    +415             },
    +416 
    +417             __pushDefaultStyles : function() {
    +418                 this.crcs= new renderContextStyle(this.ctx).setDefault( this.styles["default"] );
    +419                 this.rcs.push( this.crcs );
    +420             },
    +421 
    +422             __pushStyle : function( style ) {
    +423                 var pcrcs= this.crcs;
    +424                 this.crcs= new renderContextStyle(this.ctx);
    +425                 this.crcs.chain= pcrcs;
    +426                 this.crcs.setStyle( style );
    +427                 this.crcs.applyStyle( );
    +428 
    +429                 this.rcs.push( this.crcs );
    +430             },
    +431 
    +432             __popStyle : function() {
    +433                 // make sure you don't remove default style.
    +434                 if ( this.rcs.length>1 ) {
    +435                     this.rcs.pop();
    +436                     this.crcs= this.rcs[ this.rcs.length-1 ];
    +437                     this.crcs.applyStyle();
    +438                 }
    +439             },
    +440 
    +441             __popAnchor : function() {
    +442                 if ( this.anchorStack.length> 0 ) {
    +443                     this.anchorStack.pop();
    +444                 }
    +445             },
    +446 
    +447             __pushAnchor : function( anchor ) {
    +448                 this.anchorStack.push( anchor );
    +449             },
    +450 
    +451             start : function( ctx, styles, images, width ) {
    +452                 this.x=0;
    +453                 this.y=0;
    +454                 this.width= typeof width!=="undefined" ? width : 0;
    +455                 this.ctx= ctx;
    +456                 this.lines= [];
    +457                 this.styles= styles;
    +458                 this.images= images;
    +459                 this.anchorStack= [];
    +460 
    +461                 this.__resetAppliedStyles();
    +462                 this.__nextLine();
    +463 
    +464             },
    +465 
    +466             setTag  : function( tag ) {
    +467 
    +468                 var pairs, style;
    +469 
    +470                 this.__text();
    +471 
    +472                 tag= tag.toLowerCase();
    +473                 if ( tag==='b' ) {
    +474                     this.crcs.setBold( true );
    +475                 } else if ( tag==='/b' ) {
    +476                     this.crcs.setBold( false );
    +477                 } else if ( tag==='i' ) {
    +478                     this.crcs.setItalic( true );
    +479                 } else if ( tag==='/i' ) {
    +480                     this.crcs.setItalic( false );
    +481                 } else if ( tag==='stroked' ) {
    +482                     this.crcs.setStroked( true );
    +483                 } else if ( tag==='/stroked' ) {
    +484                     this.crcs.setStroked( false );
    +485                 } else if ( tag==='filled' ) {
    +486                     this.crcs.setFilled( true );
    +487                 } else if ( tag==='/filled' ) {
    +488                     this.crcs.setFilled( false );
    +489                 } else if ( tag==='tab' ) {
    +490                     this.x= this.crcs.getTabPos( this.x );
    +491                 } else if ( tag==='br' ) {
    +492                     this.__nextLine();
    +493                 } else if ( tag==='/a' ) {
    +494                     this.__popAnchor();
    +495                 } else if ( tag==='/style' ) {
    +496                     if ( this.rcs.length>1 ) {
    +497                         this.__popStyle();
    +498                     } else {
    +499                         /**
    +500                          * underflow pop de estilos. eres un cachondo.
    +501                          */
    +502                     }
    +503                 } else {
    +504                     if ( tag.indexOf("fillcolor")===0 ) {
    +505                         pairs= tag.split("=");
    +506                         this.crcs.setFillStyle( pairs[1] );
    +507                     } else if ( tag.indexOf("strokecolor")===0 ) {
    +508                         pairs= tag.split("=");
    +509                         this.crcs.setStrokeStyle( pairs[1] );
    +510                     } else if ( tag.indexOf("strokesize")===0 ) {
    +511                         pairs= tag.split("=");
    +512                         this.crcs.setStrokeSize( pairs[1]|0 );
    +513                     } else if ( tag.indexOf("fontsize")===0 ) {
    +514                         pairs= tag.split("=");
    +515                         this.crcs.setFontSize( pairs[1]|0 );
    +516                     } else if ( tag.indexOf("style")===0 ) {
    +517                         pairs= tag.split("=");
    +518                         style= this.styles[ pairs[1] ];
    +519                         if ( style ) {
    +520                             this.__pushStyle( style );
    +521                         }
    +522                     } else if ( tag.indexOf("image")===0) {
    +523                         pairs= tag.split("=")[1].split(",");
    +524                         var image= pairs[0];
    +525                         if ( this.images[image] ) {
    +526                             var r= 0, c=0;
    +527                             if ( pairs.length>=3 ) {
    +528                                 r= pairs[1]|0;
    +529                                 c= pairs[2]|0;
    +530                             }
    +531                             this.__image( this.images[image], r, c );
    +532                         } else if (CAAT.currentDirector.getImage(image) ) {
    +533                             this.__image( CAAT.currentDirector.getImage(image) );
    +534                         }
    +535                     } else if ( tag.indexOf("a=")===0 ) {
    +536                         pairs= tag.split("=");
    +537                         this.__pushAnchor( pairs[1] );
    +538                     }
    +539                 }
    +540             }
    +541         };
    +542 
    +543         /**
    +544          * Abstract document element.
    +545          * The document contains a collection of DocumentElementText and DocumentElementImage.
    +546          * @param anchor
    +547          * @param style
    +548          */
    +549         var DocumentElement= function( anchor, style ) {
    +550             this.link= anchor;
    +551             this.style= style;
    +552             return this;
    +553         };
    +554 
    +555         DocumentElement.prototype= {
    +556             x       : null,
    +557             y       : null,
    +558             width   : null,
    +559             height  : null,
    +560 
    +561             style   : null,
    +562 
    +563             link    : null,
    +564 
    +565             isLink : function() {
    +566                 return this.link;
    +567             },
    +568 
    +569             setLink : function( link ) {
    +570                 this.link= link;
    +571                 return this;
    +572             },
    +573 
    +574             getLink : function() {
    +575                 return this.link;
    +576             },
    +577 
    +578             contains : function(x,y) {
    +579                 return false;
    +580             }
    +581 
    +582         };
    +583 
    +584         /**
    +585          * This class represents an image in the document.
    +586          * @param x
    +587          * @param image
    +588          * @param r
    +589          * @param c
    +590          * @param style
    +591          * @param anchor
    +592          */
    +593         var DocumentElementImage= function( x, image, r, c, style, anchor ) {
    +594 
    +595             DocumentElementImage.superclass.constructor.call(this, anchor, style);
    +596 
    +597             this.x= x;
    +598             this.image= image;
    +599             this.row= r;
    +600             this.column= c;
    +601             this.width= image.getWidth();
    +602             this.height= image.getHeight();
    +603 
    +604             if ( this.image instanceof CAAT.SpriteImage || this.image instanceof CAAT.Foundation.SpriteImage ) {
    +605 
    +606                 if ( typeof r==="undefined" || typeof c==="undefined" ) {
    +607                     this.spriteIndex= 0;
    +608                 } else {
    +609                     this.spriteIndex= r*image.columns+c;
    +610                 }
    +611                 this.paint= this.paintSI;
    +612             }
    +613 
    +614             return this;
    +615         };
    +616 
    +617         DocumentElementImage.prototype= {
    +618             image   : null,
    +619             row     : null,
    +620             column  : null,
    +621             spriteIndex : null,
    +622 
    +623             paint : function( ctx ) {
    +624                 this.style.image( ctx );
    +625                 ctx.drawImage( this.image, this.x, -this.height+1);
    +626                 if ( DEBUG ) {
    +627                     ctx.strokeRect( this.x, -this.height+1, this.width, this.height );
    +628                 }
    +629             },
    +630 
    +631             paintSI : function( ctx ) {
    +632                 this.style.image( ctx );
    +633                 this.image.setSpriteIndex( this.spriteIndex );
    +634                 this.image.paint( { ctx: ctx }, 0, this.x,  -this.height+1 );
    +635                 if ( DEBUG ) {
    +636                     ctx.strokeRect( this.x, -this.height+1, this.width, this.height );
    +637                 }
    +638             },
    +639 
    +640             getHeight : function() {
    +641                 return this.image instanceof CAAT.Foundation.SpriteImage ? this.image.getHeight() : this.image.height;
    +642             },
    +643 
    +644             getFontMetrics : function() {
    +645                 return null;
    +646             },
    +647 
    +648             contains : function(x,y) {
    +649                 return x>=this.x && x<=this.x+this.width && y>=this.y && y<this.y + this.height;
    +650             },
    +651 
    +652             setYPosition : function( baseline ) {
    +653                 this.y= baseline - this.height + 1;
    +654             }
    +655 
    +656         };
    +657 
    +658         /**
    +659          * This class represents a text in the document. The text will have applied the styles selected
    +660          * when it was defined.
    +661          * @param text
    +662          * @param x
    +663          * @param width
    +664          * @param height
    +665          * @param style
    +666          * @param anchor
    +667          */
    +668         var DocumentElementText= function( text,x,width,height,style, anchor) {
    +669 
    +670             DocumentElementText.superclass.constructor.call(this, anchor, style);
    +671 
    +672             this.x=         x;
    +673             this.y=         0;
    +674             this.width=     width;
    +675             this.text=      text;
    +676             this.style=     style;
    +677             this.fm=        CAAT.Module.Font.Font.getFontMetrics( style.sfont );
    +678             this.height=    this.fm.height;
    +679 
    +680             return this;
    +681         };
    +682 
    +683         DocumentElementText.prototype= {
    +684 
    +685             text    : null,
    +686             style   : null,
    +687             fm      : null,
    +688 
    +689             bl      : null,     // where baseline was set. current 0 in ctx.
    +690 
    +691             paint : function( ctx ) {
    +692                 this.style.text( ctx, this.text, this.x, 0 );
    +693                 if ( DEBUG ) {
    +694                     ctx.strokeRect( this.x, -this.fm.ascent, this.width, this.height);
    +695                 }
    +696             },
    +697 
    +698             getHeight : function() {
    +699                 return this.fm.height;
    +700             },
    +701 
    +702             getFontMetrics : function() {
    +703                 return this.fm; //CAAT.Font.getFontMetrics( this.style.sfont);
    +704             },
    +705 
    +706             contains : function( x, y ) {
    +707                 return x>= this.x && x<=this.x+this.width &&
    +708                     y>= this.y && y<= this.y+this.height;
    +709             },
    +710 
    +711             setYPosition : function( baseline ) {
    +712                 this.bl= baseline;
    +713                 this.y= baseline - this.fm.ascent;
    +714             }
    +715         };
    +716 
    +717         extend( DocumentElementImage, DocumentElement );
    +718         extend( DocumentElementText, DocumentElement );
    +719 
    +720         /**
    +721          * This class represents a document line.
    +722          * It contains a collection of DocumentElement objects.
    +723          */
    +724         var DocumentLine= function( defaultFontMetrics ) {
    +725             this.elements= [];
    +726             this.defaultFontMetrics= defaultFontMetrics;
    +727             return this;
    +728         };
    +729 
    +730         DocumentLine.prototype= {
    +731             elements    : null,
    +732             width       : 0,
    +733             height      : 0,
    +734             defaultHeight : 0,  // default line height in case it is empty.
    +735             y           : 0,
    +736             x           : 0,
    +737             alignment   : null,
    +738 
    +739             baselinePos : 0,
    +740 
    +741             addElement : function( element ) {
    +742                 this.width= Math.max( this.width, element.x + element.width );
    +743                 this.height= Math.max( this.height, element.height );
    +744                 this.elements.push( element );
    +745                 this.alignment= element.style.__getProperty("alignment");
    +746             },
    +747 
    +748             addElementImage : function( element ) {
    +749                 this.width= Math.max( this.width, element.x + element.width );
    +750                 this.height= Math.max( this.height, element.height );
    +751                 this.elements.push( element );
    +752             },
    +753 
    +754             getHeight : function() {
    +755                 return this.height;
    +756             },
    +757 
    +758             setY : function( y ) {
    +759                 this.y= y;
    +760             },
    +761 
    +762             getY : function() {
    +763                 return this.y;
    +764             },
    +765 
    +766             paint : function( ctx ) {
    +767                 ctx.save();
    +768                 ctx.translate(this.x,this.y + this.baselinePos );
    +769 
    +770                 for( var i=0; i<this.elements.length; i++ ) {
    +771                     this.elements[i].paint(ctx);
    +772                 }
    +773 
    +774                 ctx.restore();
    +775 
    +776             },
    +777 
    +778             setAlignment : function( width ) {
    +779                 var j;
    +780 
    +781                 if ( this.alignment==="center" ) {
    +782                     this.x= (width - this.width)/2;
    +783                 } else if ( this.alignment==="right" ) {
    +784                     this.x= width - this.width;
    +785                 } else if ( this.alignment==="justify" ) {
    +786 
    +787                     // justify: only when text overflows further than document's 80% width
    +788                     if ( this.width / width >= JUSTIFY_RATIO && this.elements.length>1 ) {
    +789                         var remaining= width - this.width;
    +790 
    +791                         var forEachElement= (remaining/(this.elements.length-1))|0;
    +792                         for( j=1; j<this.elements.length ; j++ ) {
    +793                             this.elements[j].x+= j*forEachElement;
    +794                         }
    +795 
    +796                         remaining= width - this.width - forEachElement*(this.elements.length-1);
    +797                         for( j=0; j<remaining; j++ ) {
    +798                             this.elements[this.elements.length-1-j].x+= remaining-j;
    +799                         }
    +800                     }
    +801                 }
    +802             },
    +803 
    +804             adjustHeight : function() {
    +805                 var biggestFont=null;
    +806                 var biggestImage=null;
    +807                 var i;
    +808 
    +809                 for( i=0; i<this.elements.length; i+=1 ) {
    +810                     var elem= this.elements[i];
    +811 
    +812                     var fm= elem.getFontMetrics();
    +813                     if ( null!=fm ) {           // gest a fontMetrics, is a DocumentElementText (text)
    +814                         if ( !biggestFont ) {
    +815                             biggestFont= fm;
    +816                         } else {
    +817                             if ( fm.ascent > biggestFont.ascent ) {
    +818                                 biggestFont= fm;
    +819                             }
    +820                         }
    +821                     } else {                    // no FontMetrics, it is an image.
    +822                         if (!biggestImage) {
    +823                             biggestImage= elem;
    +824                         } else {
    +825                             if ( elem.getHeight() > elem.getHeight() ) {
    +826                                 biggestImage= elem;
    +827                             }
    +828                         }
    +829                     }
    +830                 }
    +831 
    +832                 this.baselinePos= Math.max(
    +833                     biggestFont ? biggestFont.ascent : this.defaultFontMetrics.ascent,
    +834                     biggestImage ? biggestImage.getHeight() : this.defaultFontMetrics.ascent );
    +835                 this.height= this.baselinePos + (biggestFont!=null ? biggestFont.descent : this.defaultFontMetrics.descent );
    +836 
    +837                 for( i=0; i<this.elements.length; i++ ) {
    +838                     this.elements[i].setYPosition( this.baselinePos );
    +839                 }
    +840 
    +841                 return this.height;
    +842             },
    +843 
    +844             /**
    +845              * Every element is positioned at line's baseline.
    +846              * @param x
    +847              * @param y
    +848              * @private
    +849              */
    +850             __getElementAt : function( x, y ) {
    +851                 for( var i=0; i<this.elements.length; i++ ) {
    +852                     var elem= this.elements[i];
    +853                     if ( elem.contains(x,y) ) {
    +854                         return elem;
    +855                     }
    +856                 }
    +857 
    +858                 return null;
    +859             }
    +860         };
    +861 
    +862         return {
    +863 
    +864             /**
    +865              * @lends CAAT.Foundation.UI.Label.prototype
    +866              */
    +867 
    +868 
    +869             __init : function() {
    +870                 this.__super();
    +871 
    +872                 this.rc= new renderContext();
    +873                 this.lines= [];
    +874                 this.styles= {};
    +875                 this.images= {};
    +876 
    +877                 return this;
    +878             },
    +879 
    +880             /**
    +881              * This Label document´s horizontal alignment.
    +882              * @type {CAAT.Foundation.UI.Layout.LayoutManager}
    +883              * @private
    +884              */
    +885             halignment  :   CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.LEFT,
    +886 
    +887             /**
    +888              * This Label document´s vertical alignment.
    +889              * @type {CAAT.Foundation.UI.Layout.LayoutManager}
    +890              * @private
    +891              */
    +892             valignment  :   CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.TOP,
    +893 
    +894             /**
    +895              * This label text.
    +896              * @type {string}
    +897              * @private
    +898              */
    +899             text        :   null,
    +900 
    +901             /**
    +902              * This label document´s render context
    +903              * @type {RenderContext}
    +904              * @private
    +905              */
    +906             rc          :   null,
    +907 
    +908             /**
    +909              * Styles object.
    +910              * @private
    +911              */
    +912             styles      :   null,
    +913 
    +914             /**
    +915              * Calculated document width.
    +916              * @private
    +917              */
    +918             documentWidth   : 0,
    +919 
    +920             /**
    +921              * Calculated document Height.
    +922              * @private
    +923              */
    +924             documentHeight  : 0,
    +925 
    +926             /**
    +927              * Document x position.
    +928              * @private
    +929              */
    +930             documentX       : 0,
    +931 
    +932             /**
    +933              * Document y position.
    +934              * @private
    +935              */
    +936             documentY       : 0,
    +937 
    +938             /**
    +939              * Does this label document flow ?
    +940              * @private
    +941              */
    +942             reflow      :   true,
    +943 
    +944             /**
    +945              * Collection of text lines calculated for the label.
    +946              * @private
    +947              */
    +948             lines       :   null,   // calculated elements lines...
    +949 
    +950             /**
    +951              * Collection of image objects in this label´s document.
    +952              * @private
    +953              */
    +954             images      :   null,
    +955 
    +956             /**
    +957              * Registered callback to notify on anchor click event.
    +958              * @private
    +959              */
    +960             clickCallback   : null,
    +961 
    +962             matchTextSize : true,
    +963 
    +964             /**
    +965              * Make the label actor the size the label document has been calculated for.
    +966              * @param match {boolean}
    +967              */
    +968             setMatchTextSize : function( match ) {
    +969                 this.matchTextSize= match;
    +970                 if ( match ) {
    +971                     this.width= this.preferredSize.width;
    +972                     this.height= this.preferredSize.height;
    +973                 }
    +974             },
    +975 
    +976             setStyle : function( name, styleData ) {
    +977                 this.styles[ name ]= styleData;
    +978                 return this;
    +979             },
    +980 
    +981             addImage : function( name, spriteImage ) {
    +982                 this.images[ name ]= spriteImage;
    +983                 return this;
    +984             },
    +985 
    +986             setSize : function(w,h) {
    +987                 CAAT.Foundation.UI.Label.superclass.setSize.call( this, w, h );
    +988                 this.setText( this.text, this.width );
    +989                 return this;
    +990             },
    +991 
    +992             setBounds : function( x,y,w,h ) {
    +993                 CAAT.Foundation.UI.Label.superclass.setBounds.call( this,x,y,w,h );
    +994                 this.setText( this.text, this.width );
    +995                 return this;
    +996             },
    +997 
    +998             setText : function( _text, width ) {
    +999 
    +1000                 if ( null===_text ) {
    +1001                    return;
    +1002                 }
    +1003 
    +1004                 var cached= this.cached;
    +1005                 if ( cached ) {
    +1006                     this.stopCacheAsBitmap();
    +1007                 }
    +1008 
    +1009                 this.documentWidth= 0;
    +1010                 this.documentHeight= 0;
    +1011 
    +1012                 this.text= _text;
    +1013 
    +1014                 var i, l, text;
    +1015                 var tag_closes_at_pos, tag;
    +1016                 var _char;
    +1017                 var ctx= CAAT.currentDirector.ctx;
    +1018                 ctx.save();
    +1019 
    +1020                 text= this.text;
    +1021 
    +1022                 i=0;
    +1023                 l=text.length;
    +1024 
    +1025                 this.rc.start( ctx, this.styles, this.images, width );
    +1026 
    +1027                 while( i<l ) {
    +1028                     _char= text.charAt(i);
    +1029 
    +1030                     if ( _char==='\\' ) {
    +1031                         i+=1;
    +1032                         this.rc.fchar( text.charAt(i) );
    +1033                         i+=1;
    +1034 
    +1035                     } else if ( _char==='<' ) {   // try an enhancement.
    +1036 
    +1037                         // try finding another '>' and see whether it matches a tag
    +1038                         tag_closes_at_pos= text.indexOf('>', i+1);
    +1039                         if ( -1!==tag_closes_at_pos ) {
    +1040                             tag= text.substr( i+1, tag_closes_at_pos-i-1 );
    +1041                             if ( tag.indexOf("<")!==-1 ) {
    +1042                                 this.rc.fchar( _char );
    +1043                                 i+=1;
    +1044                             } else {
    +1045                                 this.rc.setTag( tag );
    +1046                                 i= tag_closes_at_pos+1;
    +1047                             }
    +1048                         }
    +1049                     } else {
    +1050                         this.rc.fchar( _char );
    +1051                         i+= 1;
    +1052                     }
    +1053                 }
    +1054 
    +1055                 this.rc.end();
    +1056                 this.lines= this.rc.lines;
    +1057 
    +1058                 this.__calculateDocumentDimension( typeof width==="undefined" ? 0 : width );
    +1059                 this.setLinesAlignment();
    +1060 
    +1061                 ctx.restore();
    +1062 
    +1063                 this.setPreferredSize( this.documentWidth, this.documentHeight );
    +1064                 this.invalidateLayout();
    +1065 
    +1066                 this.setDocumentPosition();
    +1067 
    +1068                 if ( cached ) {
    +1069                     this.cacheAsBitmap(0,cached);
    +1070                 }
    +1071 
    +1072                 if ( this.matchTextSize ) {
    +1073                     this.width= this.preferredSize.width;
    +1074                     this.height= this.preferredSize.height;
    +1075                 }
    +1076 
    +1077                 return this;
    +1078             },
    +1079 
    +1080             setVerticalAlignment : function( align ) {
    +1081                 this.valignment= align;
    +1082                 this.setDocumentPosition();
    +1083                 return this;
    +1084             },
    +1085 
    +1086             setHorizontalAlignment : function( align ) {
    +1087                 this.halignment= align;
    +1088                 this.setDocumentPosition();
    +1089                 return this;
    +1090             },
    +1091 
    +1092             setDocumentPosition : function( halign, valign ) {
    +1093 
    +1094                 if ( typeof halign!=="undefined" ) {
    +1095                     this.setHorizontalAlignment(halign);
    +1096                 }
    +1097                 if ( typeof valign!=="undefined" ) {
    +1098                     this.setVerticalAlignment(valign);
    +1099                 }
    +1100 
    +1101                 var xo=0, yo=0;
    +1102 
    +1103                 if ( this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER ) {
    +1104                     yo= (this.height - this.documentHeight )/2;
    +1105                 } else if ( this.valignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.BOTTOM ) {
    +1106                     yo= this.height - this.documentHeight;
    +1107                 }
    +1108 
    +1109                 if ( this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER ) {
    +1110                     xo= (this.width - this.documentWidth )/2;
    +1111                 } else if ( this.halignment===CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.RIGHT ) {
    +1112                     xo= this.width - this.documentWidth;
    +1113                 }
    +1114 
    +1115                 this.documentX= xo;
    +1116                 this.documentY= yo;
    +1117             },
    +1118 
    +1119             __calculateDocumentDimension : function( suggestedWidth ) {
    +1120                 var i;
    +1121                 var y= 0;
    +1122 
    +1123                 this.documentWidth= 0;
    +1124                 this.documentHeight= 0;
    +1125                 for( i=0; i<this.lines.length; i++ ) {
    +1126                     this.lines[i].y =y;
    +1127                     this.documentWidth= Math.max( this.documentWidth, this.lines[i].width );
    +1128                     this.documentHeight+= this.lines[i].adjustHeight();
    +1129                     y+= this.lines[i].getHeight();
    +1130                 }
    +1131 
    +1132                 this.documentWidth= Math.max( this.documentWidth, suggestedWidth );
    +1133 
    +1134                 return this;
    +1135             },
    +1136 
    +1137             setLinesAlignment : function() {
    +1138 
    +1139                 for( var i=0; i<this.lines.length; i++ ) {
    +1140                     this.lines[i].setAlignment( this.documentWidth )
    +1141                 }
    +1142             },
    +1143 
    +1144             paint : function( director, time ) {
    +1145 
    +1146                 if ( this.cached===CAAT.Foundation.Actor.CACHE_NONE ) {
    +1147                     var ctx= director.ctx;
    +1148 
    +1149                     ctx.save();
    +1150 
    +1151                     ctx.textBaseline="alphabetic";
    +1152                     ctx.translate( this.documentX, this.documentY );
    +1153 
    +1154                     for( var i=0; i<this.lines.length; i++ ) {
    +1155                         var line= this.lines[i];
    +1156                         line.paint( director.ctx );
    +1157 
    +1158                         if ( DEBUG ) {
    +1159                             ctx.strokeRect( line.x, line.y, line.width, line.height );
    +1160                         }
    +1161                     }
    +1162 
    +1163                     ctx.restore();
    +1164                 } else {
    +1165                     if ( this.backgroundImage ) {
    +1166                         this.backgroundImage.paint(director,time,0,0);
    +1167                     }
    +1168                 }
    +1169             },
    +1170 
    +1171             __getDocumentElementAt : function( x, y ) {
    +1172 
    +1173                 x-= this.documentX;
    +1174                 y-= this.documentY;
    +1175 
    +1176                 for( var i=0; i<this.lines.length; i++ ) {
    +1177                     var line= this.lines[i];
    +1178 
    +1179                     if ( line.x<=x && line.y<=y && line.x+line.width>=x && line.y+line.height>=y ) {
    +1180                         return line.__getElementAt( x - line.x, y - line.y );
    +1181                     }
    +1182                 }
    +1183 
    +1184                 return null;
    +1185             },
    +1186 
    +1187             mouseExit : function(e) {
    +1188                 CAAT.setCursor( "default");
    +1189             },
    +1190 
    +1191             mouseMove : function(e) {
    +1192                 var elem= this.__getDocumentElementAt(e.x, e.y);
    +1193                 if ( elem && elem.getLink() ) {
    +1194                     CAAT.setCursor( "pointer");
    +1195                 } else {
    +1196                     CAAT.setCursor( "default");
    +1197                 }
    +1198             },
    +1199 
    +1200             mouseClick : function(e) {
    +1201                 if ( this.clickCallback ) {
    +1202                     var elem= this.__getDocumentElementAt(e.x, e.y);
    +1203                     if ( elem.getLink() ) {
    +1204                         this.clickCallback( elem.getLink() );
    +1205                     }
    +1206                 }
    +1207             },
    +1208 
    +1209             setClickCallback : function( callback ) {
    +1210                 this.clickCallback= callback;
    +1211                 return this;
    +1212             }
    +1213         }
    +1214 
    +1215     }
    +1216 
    +1217 });
    +1218 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BorderLayout.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BorderLayout.js.html new file mode 100644 index 00000000..612c419e --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BorderLayout.js.html @@ -0,0 +1,226 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name BorderLayout
    +  5      * @memberOf CAAT.Foundation.UI.Layout
    +  6      * @extends CAAT.Foundation.UI.Layout.LayoutManager
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Foundation.UI.Layout.BorderLayout",
    + 11     aliases : ["CAAT.UI.BorderLayout"],
    + 12     depends : [
    + 13         "CAAT.Foundation.UI.Layout.LayoutManager",
    + 14         "CAAT.Math.Dimension"
    + 15     ],
    + 16     extendsClass : "CAAT.Foundation.UI.Layout.LayoutManager",
    + 17     extendsWith : {
    + 18 
    + 19         /**
    + 20          * @lends CAAT.Foundation.UI.Layout.BorderLayout.prototype
    + 21          */
    + 22 
    + 23 
    + 24         __init : function() {
    + 25             this.__super();
    + 26             return this;
    + 27         },
    + 28 
    + 29         /**
    + 30          * An actor to position left.
    + 31          */
    + 32         left    : null,
    + 33 
    + 34         /**
    + 35          * An actor to position right.
    + 36          */
    + 37         right   : null,
    + 38 
    + 39         /**
    + 40          * An actor to position top.
    + 41          */
    + 42         top     : null,
    + 43 
    + 44         /**
    + 45          * An actor to position botton.
    + 46          */
    + 47         bottom  : null,
    + 48 
    + 49         /**
    + 50          * An actor to position center.
    + 51          */
    + 52         center  : null,
    + 53 
    + 54         addChild : function( child, constraint ) {
    + 55 
    + 56             if ( typeof constraint==="undefined" ) {
    + 57                 constraint="center";
    + 58             }
    + 59 
    + 60             CAAT.Foundation.UI.Layout.BorderLayout.superclass.addChild.call( this, child, constraint );
    + 61 
    + 62             if ( constraint==="left" ) {
    + 63                 this.left= child;
    + 64             } else if ( constraint==="right" ) {
    + 65                 this.right= child;
    + 66             } else if ( constraint==="top" ) {
    + 67                 this.top= child;
    + 68             } else if ( constraint==="bottom" ) {
    + 69                 this.bottom= child;
    + 70             } else {
    + 71                 //"center"
    + 72                 this.center= child;
    + 73             }
    + 74         },
    + 75 
    + 76         removeChild : function( child ) {
    + 77             if ( this.center===child ) {
    + 78                 this.center=null;
    + 79             } else if ( this.left===child ) {
    + 80                 this.left= null;
    + 81             } else if ( this.right===child ) {
    + 82                 this.right= null;
    + 83             } else if ( this.top===child ) {
    + 84                 this.top= null;
    + 85             } else if ( this.bottom===child ) {
    + 86                 this.bottom= null;
    + 87             }
    + 88         },
    + 89 
    + 90         __getChild : function( constraint ) {
    + 91             if ( constraint==="center" ) {
    + 92                 return this.center;
    + 93             } else if ( constraint==="left" ) {
    + 94                 return this.left;
    + 95             } else if ( constraint==="right" ) {
    + 96                 return this.right;
    + 97             } else if ( constraint==="top" ) {
    + 98                 return this.top;
    + 99             } else if ( constraint==="bottom" ) {
    +100                 return this.bottom;
    +101             }
    +102         },
    +103 
    +104         getMinimumLayoutSize : function( container ) {
    +105             var c, d;
    +106             var dim= new CAAT.Math.Dimension();
    +107 
    +108             if ((c=this.__getChild("right")) != null) {
    +109                 d = c.getMinimumSize();
    +110                 dim.width += d.width + this.hgap;
    +111                 dim.height = Math.max(d.height, dim.height);
    +112             }
    +113             if ((c=this.__getChild("left")) != null) {
    +114                 d = c.getMinimumSize();
    +115                 dim.width += d.width + this.hgap;
    +116                 dim.height = Math.max(d.height, dim.height);
    +117             }
    +118             if ((c=this.__getChild("center")) != null) {
    +119                 d = c.getMinimumSize();
    +120                 dim.width += d.width;
    +121                 dim.height = Math.max(d.height, dim.height);
    +122             }
    +123             if ((c=this.__getChild("top")) != null) {
    +124                 d = c.getMinimumSize();
    +125                 dim.width = Math.max(d.width, dim.width);
    +126                 dim.height += d.height + this.vgap;
    +127             }
    +128             if ((c=this.__getChild("bottom")) != null) {
    +129                 d = c.getMinimumSize();
    +130                 dim.width = Math.max(d.width, dim.width);
    +131                 dim.height += d.height + this.vgap;
    +132             }
    +133 
    +134             dim.width += this.padding.left + this.padding.right;
    +135             dim.height += this.padding.top + this.padding.bottom;
    +136 
    +137             return dim;
    +138         },
    +139 
    +140         getPreferredLayoutSize : function( container ) {
    +141             var c, d;
    +142             var dim= new CAAT.Dimension();
    +143 
    +144             if ((c=this.__getChild("left")) != null) {
    +145                 d = c.getPreferredSize();
    +146                 dim.width += d.width + this.hgap;
    +147                 dim.height = Math.max(d.height, dim.height);
    +148             }
    +149             if ((c=this.__getChild("right")) != null) {
    +150                 d = c.getPreferredSize();
    +151                 dim.width += d.width + this.hgap;
    +152                 dim.height = Math.max(d.height, dim.height);
    +153             }
    +154             if ((c=this.__getChild("center")) != null) {
    +155                 d = c.getPreferredSize();
    +156                 dim.width += d.width;
    +157                 dim.height = Math.max(d.height, dim.height);
    +158             }
    +159             if ((c=this.__getChild("top")) != null) {
    +160                 d = c.getPreferredSize();
    +161                 dim.width = Math.max(d.width, dim.width);
    +162                 dim.height += d.height + this.vgap;
    +163             }
    +164             if ((c=this.__getChild("bottom")) != null) {
    +165                 d = c.getPreferredSize();
    +166                 dim.width = Math.max(d.width, dim.width);
    +167                 dim.height += d.height + this.vgap;
    +168             }
    +169 
    +170             dim.width += this.padding.left + this.padding.right;
    +171             dim.height += this.padding.top + this.padding.bottom;
    +172 
    +173             return dim;
    +174         },
    +175 
    +176         doLayout : function( container ) {
    +177 
    +178             var top = this.padding.top;
    +179             var bottom = container.height - this.padding.bottom;
    +180             var left = this.padding.left;
    +181             var right = container.width - this.padding.right;
    +182             var c, d;
    +183 
    +184             if ((c=this.__getChild("top")) != null) {
    +185                 c.setSize(right - left, c.height);
    +186                 d = c.getPreferredSize();
    +187                 c.setBounds(left, top, right - left, d.height);
    +188                 top += d.height + this.vgap;
    +189             }
    +190             if ((c=this.__getChild("bottom")) != null) {
    +191                 c.setSize(right - left, c.height);
    +192                 d = c.getPreferredSize();
    +193                 c.setBounds(left, bottom - d.height, right - left, d.height);
    +194                 bottom -= d.height + this.vgap;
    +195             }
    +196             if ((c=this.__getChild("right")) != null) {
    +197                 c.setSize(c.width, bottom - top);
    +198                 d = c.getPreferredSize();
    +199                 c.setBounds(right - d.width, top, d.width, bottom - top);
    +200                 right -= d.width + this.hgap;
    +201             }
    +202             if ((c=this.__getChild("left")) != null) {
    +203                 c.setSize(c.width, bottom - top);
    +204                 d = c.getPreferredSize();
    +205                 c.setBounds(left, top, d.width, bottom - top);
    +206                 left += d.width + this.hgap;
    +207             }
    +208             if ((c=this.__getChild("center")) != null) {
    +209                 c.setBounds(left, top, right - left, bottom - top);
    +210             }
    +211 
    +212             CAAT.Foundation.UI.Layout.BorderLayout.superclass.doLayout.call(this, container);
    +213         }
    +214 
    +215 
    +216     }
    +217 
    +218 });
    +219 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BoxLayout.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BoxLayout.js.html new file mode 100644 index 00000000..4f49cbfa --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_BoxLayout.js.html @@ -0,0 +1,255 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name BoxLayout
    +  5      * @memberOf CAAT.Foundation.UI.Layout
    +  6      * @extends CAAT.Foundation.UI.Layout.LayoutManager
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines:"CAAT.Foundation.UI.Layout.BoxLayout",
    + 11     aliases:["CAAT.UI.BoxLayout"],
    + 12     depends:[
    + 13         "CAAT.Foundation.UI.Layout.LayoutManager",
    + 14         "CAAT.Math.Dimension"
    + 15     ],
    + 16     extendsClass:"CAAT.Foundation.UI.Layout.LayoutManager",
    + 17     extendsWith:function () {
    + 18 
    + 19         return {
    + 20 
    + 21             /**
    + 22              * @lends CAAT.Foundation.UI.Layout.BoxLayout.prototype
    + 23              */
    + 24 
    + 25             /**
    + 26              * Stack elements in this axis.
    + 27              * @type {CAAT.Foundation.UI.Layout.LayoutManager}
    + 28              */
    + 29             axis:CAAT.Foundation.UI.Layout.LayoutManager.AXIS.Y,
    + 30 
    + 31             /**
    + 32              * Vertical alignment.
    + 33              * @type {CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT}
    + 34              */
    + 35             valign:CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER,
    + 36 
    + 37             /**
    + 38              * Horizontal alignment.
    + 39              * @type {CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT}
    + 40              */
    + 41             halign:CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.CENTER,
    + 42 
    + 43             setAxis:function (axis) {
    + 44                 this.axis = axis;
    + 45                 this.invalidateLayout();
    + 46                 return this;
    + 47             },
    + 48 
    + 49             setHorizontalAlignment:function (align) {
    + 50                 this.halign = align;
    + 51                 this.invalidateLayout();
    + 52                 return this;
    + 53             },
    + 54 
    + 55             setVerticalAlignment:function (align) {
    + 56                 this.valign = align;
    + 57                 this.invalidateLayout();
    + 58                 return this;
    + 59             },
    + 60 
    + 61             doLayout:function (container) {
    + 62 
    + 63                 if (this.axis === CAAT.Foundation.UI.Layout.LayoutManager.AXIS.Y) {
    + 64                     this.doLayoutVertical(container);
    + 65                 } else {
    + 66                     this.doLayoutHorizontal(container);
    + 67                 }
    + 68 
    + 69                 CAAT.Foundation.UI.Layout.BoxLayout.superclass.doLayout.call(this, container);
    + 70             },
    + 71 
    + 72             doLayoutHorizontal:function (container) {
    + 73 
    + 74                 var computedW = 0, computedH = 0;
    + 75                 var yoffset = 0, xoffset;
    + 76                 var i, l, actor;
    + 77 
    + 78                 // calculamos ancho y alto de los elementos.
    + 79                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    + 80 
    + 81                     actor = container.getChildAt(i);
    + 82                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    + 83                         if (computedH < actor.height) {
    + 84                             computedH = actor.height;
    + 85                         }
    + 86 
    + 87                         computedW += actor.width;
    + 88                         if (i > 0) {
    + 89                             computedW += this.hgap;
    + 90                         }
    + 91                     }
    + 92                 }
    + 93 
    + 94                 switch (this.halign) {
    + 95                     case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.LEFT:
    + 96                         xoffset = this.padding.left;
    + 97                         break;
    + 98                     case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.RIGHT:
    + 99                         xoffset = container.width - computedW - this.padding.right;
    +100                         break;
    +101                     default:
    +102                         xoffset = (container.width - computedW) / 2;
    +103                 }
    +104 
    +105                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    +106                     actor = container.getChildAt(i);
    +107                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    +108                         switch (this.valign) {
    +109                             case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.TOP:
    +110                                 yoffset = this.padding.top;
    +111                                 break;
    +112                             case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.BOTTOM:
    +113                                 yoffset = container.height - this.padding.bottom - actor.height;
    +114                                 break;
    +115                             default:
    +116                                 yoffset = (container.height - actor.height) / 2;
    +117                         }
    +118 
    +119                         this.__setActorPosition(actor, xoffset, yoffset);
    +120 
    +121                         xoffset += actor.width + this.hgap;
    +122                     }
    +123                 }
    +124 
    +125             },
    +126 
    +127             __setActorPosition:function (actor, xoffset, yoffset) {
    +128                 if (this.animated) {
    +129                     if (this.newChildren.indexOf(actor) !== -1) {
    +130                         actor.setPosition(xoffset, yoffset);
    +131                         actor.setScale(0, 0);
    +132                         actor.scaleTo(1, 1, 500, 0, .5, .5, this.newElementInterpolator);
    +133                     } else {
    +134                         actor.moveTo(xoffset, yoffset, 500, 0, this.moveElementInterpolator);
    +135                     }
    +136                 } else {
    +137                     actor.setPosition(xoffset, yoffset);
    +138                 }
    +139             },
    +140 
    +141             doLayoutVertical:function (container) {
    +142 
    +143                 var computedW = 0, computedH = 0;
    +144                 var yoffset, xoffset;
    +145                 var i, l, actor;
    +146 
    +147                 // calculamos ancho y alto de los elementos.
    +148                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    +149 
    +150                     actor = container.getChildAt(i);
    +151                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    +152                         if (computedW < actor.width) {
    +153                             computedW = actor.width;
    +154                         }
    +155 
    +156                         computedH += actor.height;
    +157                         if (i > 0) {
    +158                             computedH += this.vgap;
    +159                         }
    +160                     }
    +161                 }
    +162 
    +163                 switch (this.valign) {
    +164                     case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.TOP:
    +165                         yoffset = this.padding.top;
    +166                         break;
    +167                     case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.BOTTOM:
    +168                         yoffset = container.height - computedH - this.padding.bottom;
    +169                         break;
    +170                     default:
    +171                         yoffset = (container.height - computedH) / 2;
    +172                 }
    +173 
    +174                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    +175                     actor = container.getChildAt(i);
    +176                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    +177                         switch (this.halign) {
    +178                             case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.LEFT:
    +179                                 xoffset = this.padding.left;
    +180                                 break;
    +181                             case CAAT.Foundation.UI.Layout.LayoutManager.ALIGNMENT.RIGHT:
    +182                                 xoffset = container.width - this.padding.right - actor.width;
    +183                                 break;
    +184                             default:
    +185                                 xoffset = (container.width - actor.width) / 2;
    +186                         }
    +187 
    +188                         this.__setActorPosition(actor, xoffset, yoffset);
    +189 
    +190                         yoffset += actor.height + this.vgap;
    +191                     }
    +192                 }
    +193             },
    +194 
    +195             getPreferredLayoutSize:function (container) {
    +196 
    +197                 var dim = new CAAT.Math.Dimension();
    +198                 var computedW = 0, computedH = 0;
    +199                 var i, l;
    +200 
    +201                 // calculamos ancho y alto de los elementos.
    +202                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    +203 
    +204                     var actor = container.getChildAt(i);
    +205                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    +206                         var ps = actor.getPreferredSize();
    +207 
    +208                         if (computedH < ps.height) {
    +209                             computedH = ps.height;
    +210                         }
    +211                         computedW += ps.width;
    +212                     }
    +213                 }
    +214 
    +215                 dim.width = computedW;
    +216                 dim.height = computedH;
    +217 
    +218                 return dim;
    +219             },
    +220 
    +221             getMinimumLayoutSize:function (container) {
    +222                 var dim = new CAAT.Math.Dimension();
    +223                 var computedW = 0, computedH = 0;
    +224                 var i, l;
    +225 
    +226                 // calculamos ancho y alto de los elementos.
    +227                 for (i = 0, l = container.getNumChildren(); i < l; i += 1) {
    +228 
    +229                     var actor = container.getChildAt(i);
    +230                     if (!actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame(CAAT.getCurrentSceneTime())) {
    +231                         var ps = actor.getMinimumSize();
    +232 
    +233                         if (computedH < ps.height) {
    +234                             computedH = ps.height;
    +235                         }
    +236                         computedW += ps.width;
    +237                     }
    +238                 }
    +239 
    +240                 dim.width = computedW;
    +241                 dim.height = computedH;
    +242 
    +243                 return dim;
    +244             }
    +245         }
    +246     }
    +247 });
    +248 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_GridLayout.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_GridLayout.js.html new file mode 100644 index 00000000..fafe6f2d --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_GridLayout.js.html @@ -0,0 +1,186 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name GridLayout
    +  5      * @memberOf CAAT.Foundation.UI.Layout
    +  6      * @extends CAAT.Foundation.UI.Layout.LayoutManager
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Foundation.UI.Layout.GridLayout",
    + 11     aliases : ["CAAT.UI.GridLayout"],
    + 12     depends : [
    + 13         "CAAT.Foundation.UI.Layout.LayoutManager",
    + 14         "CAAT.Math.Dimension"
    + 15     ],
    + 16     extendsClass : "CAAT.Foundation.UI.Layout.LayoutManager",
    + 17     extendsWith : {
    + 18 
    + 19         /**
    + 20          * @lends CAAT.Foundation.UI.Layout.GridLayout.prototype
    + 21          */
    + 22 
    + 23         __init : function( rows, columns ) {
    + 24             this.__super();
    + 25             this.rows= rows;
    + 26             this.columns= columns;
    + 27 
    + 28             return this;
    + 29         },
    + 30 
    + 31         /**
    + 32          * Layout elements using this number of rows.
    + 33          */
    + 34         rows    : 0,
    + 35 
    + 36         /**
    + 37          * Layout elements using this number of columns.
    + 38          */
    + 39         columns : 2,
    + 40 
    + 41         doLayout : function( container ) {
    + 42 
    + 43             var actors= [];
    + 44             for( var i=0; i<container.getNumChildren(); i++ ) {
    + 45                 var child= container.getChildAt(i);
    + 46                 if (!child.preventLayout && child.isVisible() && child.isInAnimationFrame( CAAT.getCurrentSceneTime()) ) {
    + 47                     actors.push(child);
    + 48                 }
    + 49             }
    + 50             var nactors= actors.length;
    + 51 
    + 52             if (nactors.length=== 0) {
    + 53                 return;
    + 54             }
    + 55 
    + 56             var nrows = this.rows;
    + 57             var ncols = this.columns;
    + 58 
    + 59             if (nrows > 0) {
    + 60                 ncols = Math.floor( (nactors + nrows - 1) / nrows );
    + 61             } else {
    + 62                 nrows = Math.floor( (nactors + ncols - 1) / ncols );
    + 63             }
    + 64 
    + 65             var totalGapsWidth = (ncols - 1) * this.hgap;
    + 66             var widthWOInsets = container.width - (this.padding.left + this.padding.right);
    + 67             var widthOnComponent = Math.floor( (widthWOInsets - totalGapsWidth) / ncols );
    + 68             var extraWidthAvailable = Math.floor( (widthWOInsets - (widthOnComponent * ncols + totalGapsWidth)) / 2 );
    + 69 
    + 70             var totalGapsHeight = (nrows - 1) * this.vgap;
    + 71             var heightWOInsets = container.height - (this.padding.top + this.padding.bottom);
    + 72             var heightOnComponent = Math.floor( (heightWOInsets - totalGapsHeight) / nrows );
    + 73             var extraHeightAvailable = Math.floor( (heightWOInsets - (heightOnComponent * nrows + totalGapsHeight)) / 2 );
    + 74 
    + 75             for (var c = 0, x = this.padding.left + extraWidthAvailable; c < ncols ; c++, x += widthOnComponent + this.hgap) {
    + 76                 for (var r = 0, y = this.padding.top + extraHeightAvailable; r < nrows ; r++, y += heightOnComponent + this.vgap) {
    + 77                     var i = r * ncols + c;
    + 78                     if (i < actors.length) {
    + 79                         var child= actors[i];
    + 80                         if ( !child.preventLayout && child.isVisible() && child.isInAnimationFrame( CAAT.getCurrentSceneTime() ) ) {
    + 81                             if ( !this.animated ) {
    + 82                                 child.setBounds(
    + 83                                     x + (widthOnComponent-child.width)/2,
    + 84                                     y,
    + 85                                     widthOnComponent,
    + 86                                     heightOnComponent);
    + 87                             } else {
    + 88                                 if ( child.width!==widthOnComponent || child.height!==heightOnComponent ) {
    + 89                                     child.setSize(widthOnComponent, heightOnComponent);
    + 90                                     if ( this.newChildren.indexOf( child ) !==-1 ) {
    + 91                                         child.setPosition(
    + 92                                             x + (widthOnComponent-child.width)/2,
    + 93                                             y );
    + 94                                         child.setScale(0.01,0.01);
    + 95                                         child.scaleTo( 1,1, 500, 0,.5,.5, this.newElementInterpolator );
    + 96                                     } else {
    + 97                                         child.moveTo(
    + 98                                             x + (widthOnComponent-child.width)/2,
    + 99                                             y,
    +100                                             500,
    +101                                             0,
    +102                                             this.moveElementInterpolator );
    +103                                     }
    +104                                 }
    +105                             }
    +106                         }
    +107                     }
    +108                 }
    +109             }
    +110 
    +111             CAAT.Foundation.UI.Layout.GridLayout.superclass.doLayout.call(this, container);
    +112         },
    +113 
    +114         getMinimumLayoutSize : function( container ) {
    +115             var nrows = this.rows;
    +116             var ncols = this.columns;
    +117             var nchildren= container.getNumChildren();
    +118             var w=0, h=0, i;
    +119 
    +120             if (nrows > 0) {
    +121                 ncols = Math.ceil( (nchildren + nrows - 1) / nrows );
    +122             } else {
    +123                 nrows = Math.ceil( (nchildren + ncols - 1) / ncols );
    +124             }
    +125 
    +126             for ( i= 0; i < nchildren; i+=1 ) {
    +127                 var actor= container.getChildAt(i);
    +128                 if ( !actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame( CAAT.getCurrentSceneTime() ) ) {
    +129                     var d = actor.getMinimumSize();
    +130                     if (w < d.width) {
    +131                         w = d.width;
    +132                     }
    +133                     if (h < d.height) {
    +134                         h = d.height;
    +135                     }
    +136                 }
    +137             }
    +138 
    +139             return new CAAT.Math.Dimension(
    +140                 this.padding.left + this.padding.right + ncols * w + (ncols - 1) * this.hgap,
    +141                 this.padding.top + this.padding.bottom + nrows * h + (nrows - 1) * this.vgap
    +142             );
    +143         },
    +144 
    +145         getPreferredLayoutSize : function( container ) {
    +146 
    +147             var nrows = this.rows;
    +148             var ncols = this.columns;
    +149             var nchildren= container.getNumChildren();
    +150             var w=0, h=0, i;
    +151 
    +152             if (nrows > 0) {
    +153                 ncols = Math.ceil( (nchildren + nrows - 1) / nrows );
    +154             } else {
    +155                 nrows = Math.ceil( (nchildren + ncols - 1) / ncols );
    +156             }
    +157 
    +158             for ( i= 0; i < nchildren; i+=1 ) {
    +159                 var actor= container.getChildAt(i);
    +160                 if ( !actor.preventLayout && actor.isVisible() && actor.isInAnimationFrame( CAAT.getCurrentSceneTime() ) ) {
    +161                     var d = actor.getPreferredSize();
    +162                     if (w < d.width) {
    +163                         w = d.width;
    +164                     }
    +165                     if (h < d.height) {
    +166                         h = d.height;
    +167                     }
    +168                 }
    +169             }
    +170 
    +171             return new CAAT.Math.Dimension(
    +172                 this.padding.left + this.padding.right + ncols * w + (ncols - 1) * this.hgap,
    +173                 this.padding.top + this.padding.bottom + nrows * h + (nrows - 1) * this.vgap
    +174             );
    +175         }
    +176 
    +177     }
    +178 });
    +179 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_LayoutManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_LayoutManager.js.html new file mode 100644 index 00000000..8ccaf7d0 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_Layout_LayoutManager.js.html @@ -0,0 +1,187 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name Layout
    +  5      * @memberOf CAAT.Foundation.UI
    +  6      * @namespace
    +  7      */
    +  8 
    +  9     /**
    + 10      * @name LayoutManager
    + 11      * @memberOf CAAT.Foundation.UI.Layout
    + 12      * @constructor
    + 13      */
    + 14 
    + 15     defines : "CAAT.Foundation.UI.Layout.LayoutManager",
    + 16     aliases : ["CAAT.UI.LayoutManager"],
    + 17     depends : [
    + 18         "CAAT.Behavior.Interpolator"
    + 19     ],
    + 20     constants : {
    + 21 
    + 22         /**
    + 23          * @lends CAAT.Foundation.UI.Layout.LayoutManager
    + 24          */
    + 25 
    + 26         /**
    + 27          * @enum {number}
    + 28          */
    + 29         AXIS: {
    + 30             X : 0,
    + 31             Y : 1
    + 32         },
    + 33 
    + 34         /**
    + 35          * @enum {number}
    + 36          */
    + 37         ALIGNMENT : {
    + 38             LEFT :  0,
    + 39             RIGHT:  1,
    + 40             CENTER: 2,
    + 41             TOP:    3,
    + 42             BOTTOM: 4,
    + 43             JUSTIFY:5
    + 44         }
    + 45 
    + 46     },
    + 47     extendsWith : function() {
    + 48 
    + 49         return {
    + 50 
    + 51             /**
    + 52              * @lends CAAT.Foundation.UI.Layout.LayoutManager.prototype
    + 53              */
    + 54 
    + 55 
    + 56             __init : function( ) {
    + 57 
    + 58                 this.newChildren= [];
    + 59                 this.padding= {
    + 60                     left:   2,
    + 61                     right:  2,
    + 62                     top:    2,
    + 63                     bottom: 2
    + 64                 };
    + 65 
    + 66                 return this;
    + 67             },
    + 68 
    + 69             /**
    + 70              * If animation enabled, new element interpolator.
    + 71              */
    + 72             newElementInterpolator : new CAAT.Behavior.Interpolator().createElasticOutInterpolator(1.1,.7),
    + 73 
    + 74             /**
    + 75              * If animation enabled, relayout elements interpolator.
    + 76              */
    + 77             moveElementInterpolator : new CAAT.Behavior.Interpolator().createExponentialOutInterpolator(2),
    + 78 
    + 79             /**
    + 80              * Defines insets:
    + 81              * @type {{ left, right, top, botton }}
    + 82              */
    + 83             padding : null,
    + 84 
    + 85             /**
    + 86              * Needs relayout ??
    + 87              */
    + 88             invalid : true,
    + 89 
    + 90             /**
    + 91              * Horizontal gap between children.
    + 92              */
    + 93             hgap        : 2,
    + 94 
    + 95             /**
    + 96              * Vertical gap between children.
    + 97              */
    + 98             vgap        : 2,
    + 99 
    +100             /**
    +101              * Animate on adding/removing elements.
    +102              */
    +103             animated    : false,
    +104 
    +105             /**
    +106              * pending to be laid-out actors.
    +107              */
    +108             newChildren : null,
    +109 
    +110             setAnimated : function( animate ) {
    +111                 this.animated= animate;
    +112                 return this;
    +113             },
    +114 
    +115             setHGap : function( gap ) {
    +116                 this.hgap= gap;
    +117                 this.invalidateLayout();
    +118                 return this;
    +119             },
    +120 
    +121             setVGap : function( gap ) {
    +122                 this.vgap= gap;
    +123                 this.invalidateLayout();
    +124                 return this;
    +125             },
    +126 
    +127             setAllPadding : function( s ) {
    +128                 this.padding.left= s;
    +129                 this.padding.right= s;
    +130                 this.padding.top= s;
    +131                 this.padding.bottom= s;
    +132                 this.invalidateLayout();
    +133                 return this;
    +134             },
    +135 
    +136             setPadding : function( l,r, t,b ) {
    +137                 this.padding.left= l;
    +138                 this.padding.right= r;
    +139                 this.padding.top= t;
    +140                 this.padding.bottom= b;
    +141                 this.invalidateLayout();
    +142                 return this;
    +143             },
    +144 
    +145             addChild : function( child, constraints ) {
    +146                 this.newChildren.push( child );
    +147             },
    +148 
    +149             removeChild : function( child ) {
    +150 
    +151             },
    +152 
    +153             doLayout : function( container ) {
    +154                 this.newChildren= [];
    +155                 this.invalid= false;
    +156             },
    +157 
    +158             invalidateLayout : function( container ) {
    +159                 this.invalid= true;
    +160             },
    +161 
    +162             getMinimumLayoutSize : function( container ) {
    +163 
    +164             },
    +165 
    +166             getPreferredLayoutSize : function(container ) {
    +167 
    +168             },
    +169 
    +170             isValid : function() {
    +171                 return !this.invalid;
    +172             },
    +173 
    +174             isInvalidated : function() {
    +175                 return this.invalid;
    +176             }
    +177         }
    +178     }
    +179 });
    +180 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_PathActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_PathActor.js.html new file mode 100644 index 00000000..c1f9dfdb --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_PathActor.js.html @@ -0,0 +1,167 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * An actor to show the path and its handles in the scene graph. 
    +  5  *
    +  6  **/
    +  7 CAAT.Module( {
    +  8 
    +  9     /**
    + 10      * @name PathActor
    + 11      * @memberOf CAAT.Foundation.UI
    + 12      * @extends CAAT.Foundation.Actor
    + 13      * @constructor
    + 14      */
    + 15 
    + 16     defines : "CAAT.Foundation.UI.PathActor",
    + 17     aliases : ["CAAT.PathActor"],
    + 18     depends : [
    + 19         "CAAT.Foundation.Actor"
    + 20     ],
    + 21     extendsClass : "CAAT.Foundation.Actor",
    + 22     extendsWith : {
    + 23 
    + 24         /**
    + 25          * @lends CAAT.Foundation.UI.PathActor.prototype
    + 26          */
    + 27 
    + 28         /**
    + 29          * Path to draw.
    + 30          * @type {CAAT.PathUtil.Path}
    + 31          */
    + 32 		path                    : null,
    + 33 
    + 34         /**
    + 35          * Calculated path´s bounding box.
    + 36          */
    + 37 		pathBoundingRectangle   : null,
    + 38 
    + 39         /**
    + 40          * draw the bounding rectangle too ?
    + 41          */
    + 42 		bOutline                : false,
    + 43 
    + 44         /**
    + 45          * Outline the path in this color.
    + 46          */
    + 47         outlineColor            : 'black',
    + 48 
    + 49         /**
    + 50          * If the path is interactive, some handlers are shown to modify the path.
    + 51          * This callback function will be called when the path is interactively changed.
    + 52          */
    + 53         onUpdateCallback        : null,
    + 54 
    + 55         /**
    + 56          * Set this path as interactive.
    + 57          */
    + 58         interactive             : false,
    + 59 
    + 60         /**
    + 61          * Return the contained path.
    + 62          * @return {CAAT.Path}
    + 63          */
    + 64         getPath : function() {
    + 65             return this.path;
    + 66         },
    + 67 
    + 68         /**
    + 69          * Sets the path to manage.
    + 70          * @param path {CAAT.PathUtil.PathSegment}
    + 71          * @return this
    + 72          */
    + 73 		setPath : function(path) {
    + 74 			this.path= path;
    + 75             if ( path!=null ) {
    + 76 			    this.pathBoundingRectangle= path.getBoundingBox();
    + 77                 this.setInteractive( this.interactive );
    + 78             }
    + 79             return this;
    + 80 		},
    + 81         /**
    + 82          * Paint this actor.
    + 83          * @param director {CAAT.Foundation.Director}
    + 84          * @param time {number}. Scene time.
    + 85          */
    + 86 		paint : function(director, time) {
    + 87 
    + 88             CAAT.Foundation.UI.PathActor.superclass.paint.call( this, director, time );
    + 89 
    + 90             if ( !this.path ) {
    + 91                 return;
    + 92             }
    + 93 
    + 94             var ctx= director.ctx;
    + 95 
    + 96             ctx.strokeStyle='#000';
    + 97 			this.path.paint(director, this.interactive);
    + 98 
    + 99             if ( this.bOutline ) {
    +100                 ctx.strokeStyle= this.outlineColor;
    +101                 ctx.strokeRect(
    +102                     this.pathBoundingRectangle.x,
    +103                     this.pathBoundingRectangle.y,
    +104                     this.pathBoundingRectangle.width,
    +105                     this.pathBoundingRectangle.height
    +106                 );
    +107             }
    +108 		},
    +109         /**
    +110          * Enables/disables drawing of the contained path's bounding box.
    +111          * @param show {boolean} whether to show the bounding box
    +112          * @param color {=string} optional parameter defining the path's bounding box stroke style.
    +113          */
    +114         showBoundingBox : function(show, color) {
    +115             this.bOutline= show;
    +116             if ( show && color ) {
    +117                 this.outlineColor= color;
    +118             }
    +119             return this;
    +120         },
    +121         /**
    +122          * Set the contained path as interactive. This means it can be changed on the fly by manipulation
    +123          * of its control points.
    +124          * @param interactive
    +125          */
    +126         setInteractive : function(interactive) {
    +127             this.interactive= interactive;
    +128             if ( this.path ) {
    +129                 this.path.setInteractive(interactive);
    +130             }
    +131             return this;
    +132         },
    +133         setOnUpdateCallback : function( fn ) {
    +134             this.onUpdateCallback= fn;
    +135             return this;
    +136         },
    +137         /**
    +138          * Route mouse dragging functionality to the contained path.
    +139          * @param mouseEvent {CAAT.Event.MouseEvent}
    +140          */
    +141 		mouseDrag : function(mouseEvent) {
    +142 			this.path.drag(mouseEvent.point.x, mouseEvent.point.y, this.onUpdateCallback);
    +143 		},
    +144         /**
    +145          * Route mouse down functionality to the contained path.
    +146          * @param mouseEvent {CAAT.Event.MouseEvent}
    +147          */
    +148 		mouseDown : function(mouseEvent) {
    +149 			this.path.press(mouseEvent.point.x, mouseEvent.point.y);
    +150 		},
    +151         /**
    +152          * Route mouse up functionality to the contained path.
    +153          * @param mouseEvent {CAAT.Event.MouseEvent}
    +154          */
    +155 		mouseUp : function(mouseEvent) {
    +156 			this.path.release();
    +157 		}
    +158 	}
    +159 });
    +160 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_ShapeActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_ShapeActor.js.html new file mode 100644 index 00000000..4147595d --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_ShapeActor.js.html @@ -0,0 +1,235 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name ShapeActor
    +  5      * @memberOf CAAT.Foundation.UI
    +  6      * @extends CAAT.Foundation.ActorContainer
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Foundation.UI.ShapeActor",
    + 11     aliases : ["CAAT.ShapeActor"],
    + 12     extendsClass : "CAAT.Foundation.ActorContainer",
    + 13     depends : [
    + 14         "CAAT.Foundation.ActorContainer"
    + 15     ],
    + 16     constants : {
    + 17 
    + 18         /**
    + 19          * @lends CAAT.Foundation.UI.ShapeActor
    + 20          */
    + 21 
    + 22         /** @const */ SHAPE_CIRCLE:   0,      // Constants to describe different shapes.
    + 23         /** @const */ SHAPE_RECTANGLE:1
    + 24     },
    + 25     extendsWith : {
    + 26 
    + 27         /**
    + 28          * @lends CAAT.Foundation.UI.ShapeActor.prototype
    + 29          */
    + 30 
    + 31         __init : function() {
    + 32             this.__super();
    + 33             this.compositeOp= 'source-over';
    + 34 
    + 35             /**
    + 36              * Thanks Svend Dutz and Thomas Karolski for noticing this call was not performed by default,
    + 37              * so if no explicit call to setShape was made, nothing would be drawn.
    + 38              */
    + 39             this.setShape( CAAT.Foundation.UI.ShapeActor.SHAPE_CIRCLE );
    + 40             return this;
    + 41         },
    + 42 
    + 43         /**
    + 44          * Define this actor shape: rectangle or circle
    + 45          */
    + 46         shape:          0,      // shape type. One of the constant SHAPE_* values
    + 47 
    + 48         /**
    + 49          * Set this shape composite operation when drawing it.
    + 50          */
    + 51         compositeOp:    null,   // a valid canvas rendering context string describing compositeOps.
    + 52 
    + 53         /**
    + 54          * Stroke the shape with this line width.
    + 55          */
    + 56         lineWidth:      1,
    + 57 
    + 58         /**
    + 59          * Stroke the shape with this line cap.
    + 60          */
    + 61         lineCap:        null,
    + 62 
    + 63         /**
    + 64          * Stroke the shape with this line Join.
    + 65          */
    + 66         lineJoin:       null,
    + 67 
    + 68         /**
    + 69          * Stroke the shape with this line mitter limit.
    + 70          */
    + 71         miterLimit:     null,
    + 72 
    + 73         /**
    + 74          * 
    + 75          * @param l {number>0}
    + 76          */
    + 77         setLineWidth : function(l)  {
    + 78             this.lineWidth= l;
    + 79             return this;
    + 80         },
    + 81         /**
    + 82          *
    + 83          * @param lc {string{butt|round|square}}
    + 84          */
    + 85         setLineCap : function(lc)   {
    + 86             this.lineCap= lc;
    + 87             return this;
    + 88         },
    + 89         /**
    + 90          *
    + 91          * @param lj {string{bevel|round|miter}}
    + 92          */
    + 93         setLineJoin : function(lj)  {
    + 94             this.lineJoin= lj;
    + 95             return this;
    + 96         },
    + 97         /**
    + 98          *
    + 99          * @param ml {integer>0}
    +100          */
    +101         setMiterLimit : function(ml)    {
    +102             this.miterLimit= ml;
    +103             return this;
    +104         },
    +105         getLineCap : function() {
    +106             return this.lineCap;
    +107         },
    +108         getLineJoin : function()    {
    +109             return this.lineJoin;
    +110         },
    +111         getMiterLimit : function()  {
    +112             return this.miterLimit;
    +113         },
    +114         getLineWidth : function()   {
    +115             return this.lineWidth;
    +116         },
    +117         /**
    +118          * Sets shape type.
    +119          * No check for parameter validity is performed.
    +120          * Set paint method according to the shape.
    +121          * @param iShape an integer with any of the SHAPE_* constants.
    +122          * @return this
    +123          */
    +124         setShape : function(iShape) {
    +125             this.shape= iShape;
    +126             this.paint= this.shape===CAAT.Foundation.UI.ShapeActor.SHAPE_CIRCLE ?
    +127                     this.paintCircle :
    +128                     this.paintRectangle;
    +129             return this;
    +130         },
    +131         /**
    +132          * Sets the composite operation to apply on shape drawing.
    +133          * @param compositeOp an string with a valid canvas rendering context string describing compositeOps.
    +134          * @return this
    +135          */
    +136         setCompositeOp : function(compositeOp){
    +137             this.compositeOp= compositeOp;
    +138             return this;
    +139         },
    +140         /**
    +141          * Draws the shape.
    +142          * Applies the values of fillStype, strokeStyle, compositeOp, etc.
    +143          *
    +144          * @param director a valid CAAT.Director instance.
    +145          * @param time an integer with the Scene time the Actor is being drawn.
    +146          */
    +147         paint : function(director,time) {
    +148         },
    +149         /**
    +150          * @private
    +151          * Draws a circle.
    +152          * @param director a valid CAAT.Director instance.
    +153          * @param time an integer with the Scene time the Actor is being drawn.
    +154          */
    +155         paintCircle : function(director,time) {
    +156 
    +157             if ( this.cached ) {
    +158                 CAAT.Foundation.ActorContainer.prototype.paint.call( this, director, time );
    +159                 return;
    +160             }
    +161 
    +162             var ctx= director.ctx;
    +163 
    +164             ctx.lineWidth= this.lineWidth;
    +165 
    +166             ctx.globalCompositeOperation= this.compositeOp;
    +167             if ( null!==this.fillStyle ) {
    +168                 ctx.fillStyle= this.fillStyle;
    +169                 ctx.beginPath();
    +170                 ctx.arc( this.width/2, this.height/2, Math.min(this.width,this.height)/2- this.lineWidth/2, 0, 2*Math.PI, false );
    +171                 ctx.fill();
    +172             }
    +173 
    +174             if ( null!==this.strokeStyle ) {
    +175                 ctx.strokeStyle= this.strokeStyle;
    +176                 ctx.beginPath();
    +177                 ctx.arc( this.width/2, this.height/2, Math.min(this.width,this.height)/2- this.lineWidth/2, 0, 2*Math.PI, false );
    +178                 ctx.stroke();
    +179             }
    +180         },
    +181         /**
    +182          *
    +183          * Private
    +184          * Draws a Rectangle.
    +185          *
    +186          * @param director a valid CAAT.Director instance.
    +187          * @param time an integer with the Scene time the Actor is being drawn.
    +188          */
    +189         paintRectangle : function(director,time) {
    +190 
    +191             if ( this.cached ) {
    +192                 CAAT.Foundation.ActorContainer.prototype.paint.call( this, director, time );
    +193                 return;
    +194             }
    +195 
    +196             var ctx= director.ctx;
    +197 
    +198             ctx.lineWidth= this.lineWidth;
    +199 
    +200             if ( this.lineCap ) {
    +201                 ctx.lineCap= this.lineCap;
    +202             }
    +203             if ( this.lineJoin )    {
    +204                 ctx.lineJoin= this.lineJoin;
    +205             }
    +206             if ( this.miterLimit )  {
    +207                 ctx.miterLimit= this.miterLimit;
    +208             }
    +209 
    +210             ctx.globalCompositeOperation= this.compositeOp;
    +211             if ( null!==this.fillStyle ) {
    +212                 ctx.fillStyle= this.fillStyle;
    +213                 ctx.beginPath();
    +214                 ctx.fillRect(0,0,this.width,this.height);
    +215                 ctx.fill();
    +216             }
    +217 
    +218             if ( null!==this.strokeStyle ) {
    +219                 ctx.strokeStyle= this.strokeStyle;
    +220                 ctx.beginPath();
    +221                 ctx.strokeRect(0,0,this.width,this.height);
    +222                 ctx.stroke();
    +223             }
    +224         }
    +225     }
    +226 
    +227 });
    +228 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_StarActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_StarActor.js.html new file mode 100644 index 00000000..4aaa4201 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_StarActor.js.html @@ -0,0 +1,237 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name StarActor
    +  5      * @memberOf CAAT.Foundation.UI
    +  6      * @extends CAAT.Foundation.ActorContainer
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Foundation.UI.StarActor",
    + 11     aliases : ["CAAT.StarActor"],
    + 12     depends : [
    + 13         "CAAT.Foundation.ActorContainer"
    + 14     ],
    + 15     extendsClass : "CAAT.Foundation.ActorContainer",
    + 16     extendsWith : {
    + 17 
    + 18         /**
    + 19          * @lends CAAT.Foundation.UI.StarActor.prototype
    + 20          */
    + 21 
    + 22         __init : function() {
    + 23             this.__super();
    + 24             this.compositeOp= 'source-over';
    + 25             return this;
    + 26         },
    + 27 
    + 28         /**
    + 29          * Number of star peaks.
    + 30          */
    + 31         nPeaks:         0,
    + 32 
    + 33         /**
    + 34          * Maximum radius.
    + 35          */
    + 36         maxRadius:      0,
    + 37 
    + 38         /**
    + 39          * Minimum radius.
    + 40          */
    + 41         minRadius:      0,
    + 42 
    + 43         /**
    + 44          * Staring angle in radians.
    + 45          */
    + 46         initialAngle:   0,
    + 47 
    + 48         /**
    + 49          * Draw the star with this composite operation.
    + 50          */
    + 51         compositeOp:    null,
    + 52 
    + 53         /**
    + 54          *
    + 55          */
    + 56         lineWidth:      1,
    + 57 
    + 58         /**
    + 59          *
    + 60          */
    + 61         lineCap:        null,
    + 62 
    + 63         /**
    + 64          *
    + 65          */
    + 66         lineJoin:       null,
    + 67 
    + 68         /**
    + 69          *
    + 70          */
    + 71         miterLimit:     null,
    + 72 
    + 73         /**
    + 74          *
    + 75          * @param l {number>0}
    + 76          */
    + 77         setLineWidth : function(l)  {
    + 78             this.lineWidth= l;
    + 79             return this;
    + 80         },
    + 81         /**
    + 82          *
    + 83          * @param lc {string{butt|round|square}}
    + 84          */
    + 85         setLineCap : function(lc)   {
    + 86             this.lineCap= lc;
    + 87             return this;
    + 88         },
    + 89         /**
    + 90          *
    + 91          * @param lj {string{bevel|round|miter}}
    + 92          */
    + 93         setLineJoin : function(lj)  {
    + 94             this.lineJoin= lj;
    + 95             return this;
    + 96         },
    + 97         /**
    + 98          *
    + 99          * @param ml {integer>0}
    +100          */
    +101         setMiterLimit : function(ml)    {
    +102             this.miterLimit= ml;
    +103             return this;
    +104         },
    +105         getLineCap : function() {
    +106             return this.lineCap;
    +107         },
    +108         getLineJoin : function()    {
    +109             return this.lineJoin;
    +110         },
    +111         getMiterLimit : function()  {
    +112             return this.miterLimit;
    +113         },
    +114         getLineWidth : function()   {
    +115             return this.lineWidth;
    +116         },
    +117         /**
    +118          * Sets whether the star will be color filled.
    +119          * @param filled {boolean}
    +120          * @deprecated
    +121          */
    +122         setFilled : function( filled ) {
    +123             return this;
    +124         },
    +125         /**
    +126          * Sets whether the star will be outlined.
    +127          * @param outlined {boolean}
    +128          * @deprecated
    +129          */
    +130         setOutlined : function( outlined ) {
    +131             return this;
    +132         },
    +133         /**
    +134          * Sets the composite operation to apply on shape drawing.
    +135          * @param compositeOp an string with a valid canvas rendering context string describing compositeOps.
    +136          * @return this
    +137          */
    +138         setCompositeOp : function(compositeOp){
    +139             this.compositeOp= compositeOp;
    +140             return this;
    +141         },
    +142         /**
    +143          * 
    +144          * @param angle {number} number in radians.
    +145          */
    +146         setInitialAngle : function(angle) {
    +147             this.initialAngle= angle;
    +148             return this;
    +149         },
    +150         /**
    +151          * Initialize the star values.
    +152          * <p>
    +153          * The star actor will be of size 2*maxRadius.
    +154          *
    +155          * @param nPeaks {number} number of star points.
    +156          * @param maxRadius {number} maximum star radius
    +157          * @param minRadius {number} minimum star radius
    +158          *
    +159          * @return this
    +160          */
    +161         initialize : function(nPeaks, maxRadius, minRadius) {
    +162             this.setSize( 2*maxRadius, 2*maxRadius );
    +163 
    +164             this.nPeaks= nPeaks;
    +165             this.maxRadius= maxRadius;
    +166             this.minRadius= minRadius;
    +167 
    +168             return this;
    +169         },
    +170         /**
    +171          * Paint the star.
    +172          *
    +173          * @param director {CAAT.Director}
    +174          * @param timer {number}
    +175          */
    +176         paint : function(director, timer) {
    +177 
    +178             var ctx=        director.ctx;
    +179             var centerX=    this.width/2;
    +180             var centerY=    this.height/2;
    +181             var r1=         this.maxRadius;
    +182             var r2=         this.minRadius;
    +183             var ix=         centerX + r1*Math.cos(this.initialAngle);
    +184             var iy=         centerY + r1*Math.sin(this.initialAngle);
    +185 
    +186             ctx.lineWidth= this.lineWidth;
    +187             if ( this.lineCap ) {
    +188                 ctx.lineCap= this.lineCap;
    +189             }
    +190             if ( this.lineJoin )    {
    +191                 ctx.lineJoin= this.lineJoin;
    +192             }
    +193             if ( this.miterLimit )  {
    +194                 ctx.miterLimit= this.miterLimit;
    +195             }
    +196 
    +197             ctx.globalCompositeOperation= this.compositeOp;
    +198 
    +199             ctx.beginPath();
    +200             ctx.moveTo(ix,iy);
    +201 
    +202             for( var i=1; i<this.nPeaks*2; i++ )   {
    +203                 var angleStar= Math.PI/this.nPeaks * i + this.initialAngle;
    +204                var rr= (i%2===0) ? r1 : r2;
    +205                 var x= centerX + rr*Math.cos(angleStar);
    +206                 var y= centerY + rr*Math.sin(angleStar);
    +207                 ctx.lineTo(x,y);
    +208             }
    +209 
    +210             ctx.lineTo(
    +211                 centerX + r1*Math.cos(this.initialAngle),
    +212                 centerY + r1*Math.sin(this.initialAngle) );
    +213 
    +214             ctx.closePath();
    +215             
    +216             if ( this.fillStyle ) {
    +217                 ctx.fillStyle= this.fillStyle;
    +218                 ctx.fill();
    +219             }
    +220 
    +221             if ( this.strokeStyle ) {
    +222                 ctx.strokeStyle= this.strokeStyle;
    +223                 ctx.stroke();
    +224             }
    +225 
    +226         }
    +227     }
    +228 
    +229 });
    +230 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_TextActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_TextActor.js.html new file mode 100644 index 00000000..54f2545d --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Foundation_UI_TextActor.js.html @@ -0,0 +1,615 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name TextActor
    +  5      * @memberOf CAAT.Foundation.UI
    +  6      * @extends CAAT.Foundation.Actor
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Foundation.UI.TextActor",
    + 11     aliases : ["CAAT.TextActor"],
    + 12     extendsClass : "CAAT.Foundation.Actor",
    + 13     constants : {
    + 14         TRAVERSE_PATH_FORWARD: 1,
    + 15         TRAVERSE_PATH_BACKWARD: -1
    + 16     },
    + 17     depends : [
    + 18         "CAAT.Foundation.Actor",
    + 19         "CAAT.Foundation.SpriteImage",
    + 20         "CAAT.Module.Font.Font",
    + 21         "CAAT.Math.Point",
    + 22         "CAAT.Behavior.Interpolator"
    + 23     ],
    + 24     extendsWith : {
    + 25 
    + 26         /**
    + 27          * @lends CAAT.Foundation.UI.TextActor.prototype
    + 28          */
    + 29 
    + 30         __init : function() {
    + 31             this.__super();
    + 32             this.font= "10px sans-serif";
    + 33             this.textAlign= "left";
    + 34             this.outlineColor= "black";
    + 35             this.clip= false;
    + 36             this.__calcFontData();
    + 37 
    + 38             return this;
    + 39         },
    + 40 
    + 41         /**
    + 42          * a valid canvas rendering context font description. Default font will be "10px sans-serif".
    + 43          */
    + 44 		font:			    null,
    + 45 
    + 46         /**
    + 47          * Font info. Calculated in CAAT.
    + 48          */
    + 49         fontData:           null,
    + 50 
    + 51         /**
    + 52          * a valid canvas rendering context textAlign string. Any of:
    + 53          *   start, end, left, right, center.
    + 54          * defaults to "left".
    + 55          */
    + 56 		textAlign:		    null,
    + 57 
    + 58         /**
    + 59          * a valid canvas rendering context textBaseLine string. Any of:
    + 60          *   top, hanging, middle, alphabetic, ideographic, bottom.
    + 61          * defaults to "top".
    + 62          */
    + 63 		textBaseline:	    "top",
    + 64 
    + 65         /**
    + 66          * a boolean indicating whether the text should be filled.
    + 67          */
    + 68 		fill:			    true,
    + 69 
    + 70         /**
    + 71          * text fill color
    + 72          */
    + 73         textFillStyle   :   '#eee',
    + 74 
    + 75         /**
    + 76          * a string with the text to draw.
    + 77          */
    + 78 		text:			    null,
    + 79 
    + 80         /**
    + 81          * calculated text width in pixels.
    + 82          */
    + 83 		textWidth:		    0,
    + 84 
    + 85         /**
    + 86          * calculated text height in pixels.
    + 87          */
    + 88         textHeight:         0,
    + 89 
    + 90         /**
    + 91          * a boolean indicating whether the text should be outlined. not all browsers support it.
    + 92          */
    + 93 		outline:		    false,
    + 94 
    + 95         /**
    + 96          * a valid color description string.
    + 97          */
    + 98 		outlineColor:	    null,
    + 99 
    +100         /**
    +101          * text's stroke line width.
    +102          */
    +103         lineWidth:          1,
    +104 
    +105         /**
    +106          * a CAAT.PathUtil.Path which will be traversed by the text.
    +107          */
    +108 		path:			    null,
    +109 
    +110         /**
    +111          * A CAAT.Behavior.Interpolator to apply to the path traversal.
    +112          */
    +113         pathInterpolator:	null,
    +114 
    +115         /**
    +116          * time to be taken to traverse the path. ms.
    +117          */
    +118         pathDuration:       10000,
    +119 
    +120         /**
    +121          * traverse the path forward (1) or backwards (-1).
    +122          */
    +123 		sign:			    1,      //
    +124 
    +125         lx:                 0,
    +126         ly:                 0,
    +127 
    +128         /**
    +129          * Set the text to be filled. The default Filling style will be set by calling setFillStyle method.
    +130          * Default value is true.
    +131          * @param fill {boolean} a boolean indicating whether the text will be filled.
    +132          * @return this;
    +133          */
    +134         setFill : function( fill ) {
    +135             this.stopCacheAsBitmap();
    +136             this.fill= fill;
    +137             return this;
    +138         },
    +139         setLineWidth : function( lw ) {
    +140             this.stopCacheAsBitmap();
    +141             this.lineWidth= lw;
    +142             return this;
    +143         },
    +144         setTextFillStyle : function( style ) {
    +145             this.stopCacheAsBitmap();
    +146             this.textFillStyle= style;
    +147             return this;
    +148         },
    +149         /**
    +150          * Sets whether the text will be outlined.
    +151          * @param outline {boolean} a boolean indicating whether the text will be outlined.
    +152          * @return this;
    +153          */
    +154         setOutline : function( outline ) {
    +155             this.stopCacheAsBitmap();
    +156             this.outline= outline;
    +157             return this;
    +158         },
    +159         setPathTraverseDirection : function(direction) {
    +160             this.sign= direction;
    +161             return this;
    +162         },
    +163         /**
    +164          * Defines text's outline color.
    +165          *
    +166          * @param color {string} sets a valid canvas context color.
    +167          * @return this.
    +168          */
    +169         setOutlineColor : function( color ) {
    +170             this.stopCacheAsBitmap();
    +171             this.outlineColor= color;
    +172             return this;
    +173         },
    +174         /**
    +175          * Set the text to be shown by the actor.
    +176          * @param sText a string with the text to be shwon.
    +177          * @return this
    +178          */
    +179 		setText : function( sText ) {
    +180             this.stopCacheAsBitmap();
    +181 			this.text= sText;
    +182             if ( null===this.text || this.text==="" ) {
    +183                 this.width= this.height= 0;
    +184             }
    +185             this.calcTextSize( CAAT.currentDirector );
    +186 
    +187             this.invalidate();
    +188 
    +189             return this;
    +190         },
    +191         setTextAlign : function( align ) {
    +192             this.textAlign= align;
    +193             this.__setLocation();
    +194             return this;
    +195         },
    +196         /**
    +197          * Sets text alignment
    +198          * @param align
    +199          * @deprecated use setTextAlign
    +200          */
    +201         setAlign : function( align ) {
    +202             return this.setTextAlign(align);
    +203         },
    +204         /**
    +205          * Set text baseline.
    +206          * @param baseline
    +207          */
    +208         setTextBaseline : function( baseline ) {
    +209             this.stopCacheAsBitmap();
    +210             this.textBaseline= baseline;
    +211             return this;
    +212 
    +213         },
    +214         setBaseline : function( baseline ) {
    +215             this.stopCacheAsBitmap();
    +216             return this.setTextBaseline(baseline);
    +217         },
    +218         /**
    +219          * Sets the font to be applied for the text.
    +220          * @param font a string with a valid canvas rendering context font description.
    +221          * @return this
    +222          */
    +223         setFont : function(font) {
    +224 
    +225             this.stopCacheAsBitmap();
    +226 
    +227             if ( !font ) {
    +228                 font= "10px sans-serif";
    +229             }
    +230 
    +231             if ( font instanceof CAAT.Module.Font.Font ) {
    +232                 font.setAsSpriteImage();
    +233             } else if (font instanceof CAAT.Foundation.SpriteImage ) {
    +234                 //CAAT.log("WARN: setFont will no more accept a CAAT.SpriteImage as argument.");
    +235             }
    +236             this.font= font;
    +237 
    +238             this.__calcFontData();
    +239             this.calcTextSize( CAAT.director[0] );
    +240 
    +241             return this;
    +242 		},
    +243 
    +244         setLocation : function( x,y) {
    +245             this.lx= x;
    +246             this.ly= y;
    +247             this.__setLocation();
    +248             return this;
    +249         },
    +250 
    +251         setPosition : function( x,y ) {
    +252             this.lx= x;
    +253             this.ly= y;
    +254             this.__setLocation();
    +255             return this;
    +256         },
    +257 
    +258         setBounds : function( x,y,w,h ) {
    +259             this.lx= x;
    +260             this.ly= y;
    +261             this.setSize(w,h);
    +262             this.__setLocation();
    +263             return this;
    +264         },
    +265 
    +266         setSize : function( w, h ) {
    +267             CAAT.Foundation.UI.TextActor.superclass.setSize.call(this,w,h);
    +268             this.__setLocation();
    +269             return this;
    +270         },
    +271 
    +272         /**
    +273          * @private
    +274          */
    +275         __setLocation : function() {
    +276 
    +277             var nx, ny;
    +278 
    +279             if ( this.textAlign==="center" ) {
    +280                 nx= this.lx - this.width/2;
    +281             } else if ( this.textAlign==="right" || this.textAlign==="end" ) {
    +282                 nx= this.lx - this.width;
    +283             } else {
    +284                 nx= this.lx;
    +285             }
    +286 
    +287             if ( this.textBaseline==="bottom" ) {
    +288                 ny= this.ly - this.height;
    +289             } else if ( this.textBaseline==="middle" ) {
    +290                 ny= this.ly - this.height/2;
    +291             } else if ( this.textBaseline==="alphabetic" ) {
    +292                 ny= this.ly - this.fontData.ascent;
    +293             } else {
    +294                 ny= this.ly;
    +295             }
    +296 
    +297             CAAT.Foundation.UI.TextActor.superclass.setLocation.call( this, nx, ny );
    +298         },
    +299 
    +300         centerAt : function(x,y) {
    +301             this.textAlign="left";
    +302             this.textBaseline="top";
    +303             return CAAT.Foundation.UI.TextActor.superclass.centerAt.call( this, x, y );
    +304         },
    +305 
    +306         /**
    +307          * Calculates the text dimension in pixels and stores the values in textWidth and textHeight
    +308          * attributes.
    +309          * If Actor's width and height were not set, the Actor's dimension will be set to these values.
    +310          * @param director a CAAT.Director instance.
    +311          * @return this
    +312          */
    +313         calcTextSize : function(director) {
    +314 
    +315             if ( typeof this.text==='undefined' || null===this.text || ""===this.text ) {
    +316                 this.textWidth= 0;
    +317                 this.textHeight= 0;
    +318                 return this;
    +319             }
    +320 
    +321             if ( director.glEnabled ) {
    +322                 return this;
    +323             }
    +324 
    +325             if ( this.font instanceof CAAT.Foundation.SpriteImage ) {
    +326                 this.textWidth= this.font.stringWidth( this.text );
    +327                 this.textHeight=this.font.stringHeight();
    +328                 this.width= this.textWidth;
    +329                 this.height= this.textHeight;
    +330                 this.fontData= this.font.getFontData();
    +331 /*
    +332                 var as= (this.font.singleHeight *.8)>>0;
    +333                 this.fontData= {
    +334                     height : this.font.singleHeight,
    +335                     ascent : as,
    +336                     descent: this.font.singleHeight - as
    +337                 };
    +338 */
    +339                 return this;
    +340             }
    +341 
    +342             if ( this.font instanceof CAAT.Module.Font.Font ) {
    +343                 this.textWidth= this.font.stringWidth( this.text );
    +344                 this.textHeight=this.font.stringHeight();
    +345                 this.width= this.textWidth;
    +346                 this.height= this.textHeight;
    +347                 this.fontData= this.font.getFontData();
    +348                 return this;
    +349             }
    +350 
    +351             var ctx= director.ctx;
    +352 
    +353             ctx.save();
    +354             ctx.font= this.font;
    +355 
    +356             this.textWidth= ctx.measureText( this.text ).width;
    +357             if (this.width===0) {
    +358                 this.width= this.textWidth;
    +359             }
    +360 /*
    +361             var pos= this.font.indexOf("px");
    +362             if (-1===pos) {
    +363                 pos= this.font.indexOf("pt");
    +364             }
    +365             if ( -1===pos ) {
    +366                 // no pt or px, so guess a size: 32. why not ?
    +367                 this.textHeight= 32;
    +368             } else {
    +369                 var s =  this.font.substring(0, pos );
    +370                 this.textHeight= parseInt(s,10);
    +371             }
    +372 */
    +373 
    +374             this.textHeight= this.fontData.height;
    +375             this.setSize( this.textWidth, this.textHeight );
    +376 
    +377             ctx.restore();
    +378 
    +379             return this;
    +380         },
    +381 
    +382         __calcFontData : function() {
    +383             this.fontData= CAAT.Module.Font.Font.getFontMetrics( this.font );
    +384         },
    +385 
    +386         /**
    +387          * Custom paint method for TextActor instances.
    +388          * If the path attribute is set, the text will be drawn traversing the path.
    +389          *
    +390          * @param director a valid CAAT.Director instance.
    +391          * @param time an integer with the Scene time the Actor is being drawn.
    +392          */
    +393 		paint : function(director, time) {
    +394 
    +395             if (!this.text) {
    +396                 return;
    +397             }
    +398 
    +399             CAAT.Foundation.UI.TextActor.superclass.paint.call(this, director, time );
    +400 
    +401             if ( this.cached ) {
    +402                 // cacheAsBitmap sets this actor's background image as a representation of itself.
    +403                 // So if after drawing the background it was cached, we're done.
    +404                 return;
    +405             }
    +406 
    +407 			if ( null===this.text) {
    +408 				return;
    +409 			}
    +410 
    +411             if ( this.textWidth===0 || this.textHeight===0 ) {
    +412                 this.calcTextSize(director);
    +413             }
    +414 
    +415 			var ctx= director.ctx;
    +416 			
    +417 			if ( this.font instanceof CAAT.Module.Font.Font || this.font instanceof CAAT.Foundation.SpriteImage ) {
    +418 				this.drawSpriteText(director,time);
    +419                 return;
    +420 			}
    +421 
    +422 			if( null!==this.font ) {
    +423 				ctx.font= this.font;
    +424 			}
    +425 
    +426             /**
    +427              * always draw text with middle or bottom, top is buggy in FF.
    +428              * @type {String}
    +429              */
    +430             ctx.textBaseline="alphabetic";
    +431 
    +432 			if (null===this.path) {
    +433 
    +434                 if ( null!==this.textAlign ) {
    +435                     ctx.textAlign= this.textAlign;
    +436                 }
    +437 
    +438                 var tx=0;
    +439                 if ( this.textAlign==='center') {
    +440                     tx= (this.width/2)|0;
    +441                 } else if ( this.textAlign==='right' ) {
    +442                     tx= this.width;
    +443                 }
    +444 
    +445 				if ( this.fill ) {
    +446                     if ( null!==this.textFillStyle ) {
    +447                         ctx.fillStyle= this.textFillStyle;
    +448                     }
    +449 					ctx.fillText( this.text, tx, this.fontData.ascent  );
    +450 				}
    +451 
    +452                 if ( this.outline ) {
    +453                     if (null!==this.outlineColor ) {
    +454                         ctx.strokeStyle= this.outlineColor;
    +455                     }
    +456 
    +457                     ctx.lineWidth= this.lineWidth;
    +458                     ctx.beginPath();
    +459 					ctx.strokeText( this.text, tx, this.fontData.ascent );
    +460 				}
    +461 			}
    +462 			else {
    +463 				this.drawOnPath(director,time);
    +464 			}
    +465 		},
    +466         /**
    +467          * Private.
    +468          * Draw the text traversing a path.
    +469          * @param director a valid CAAT.Director instance.
    +470          * @param time an integer with the Scene time the Actor is being drawn.
    +471          */
    +472 		drawOnPath : function(director, time) {
    +473 
    +474 			var ctx= director.ctx;
    +475 
    +476             if ( this.fill && null!==this.textFillStyle ) {
    +477                 ctx.fillStyle= this.textFillStyle;
    +478             }
    +479 
    +480             if ( this.outline && null!==this.outlineColor ) {
    +481                 ctx.strokeStyle= this.outlineColor;
    +482             }
    +483 
    +484 			var textWidth=this.sign * this.pathInterpolator.getPosition(
    +485                     (time%this.pathDuration)/this.pathDuration ).y * this.path.getLength() ;
    +486 			var p0= new CAAT.Math.Point(0,0,0);
    +487 			var p1= new CAAT.Math.Point(0,0,0);
    +488 
    +489 			for( var i=0; i<this.text.length; i++ ) {
    +490 				var caracter= this.text[i].toString();
    +491 				var charWidth= ctx.measureText( caracter ).width;
    +492 
    +493                 // guonjien: remove "+charWidth/2" since it destroys the kerning. and he's right!!!. thanks.
    +494 				var currentCurveLength= textWidth;
    +495 
    +496 				p0= this.path.getPositionFromLength(currentCurveLength).clone();
    +497 				p1= this.path.getPositionFromLength(currentCurveLength-0.1).clone();
    +498 
    +499 				var angle= Math.atan2( p0.y-p1.y, p0.x-p1.x );
    +500 
    +501 				ctx.save();
    +502 
    +503                     if ( CAAT.CLAMP ) {
    +504 					    ctx.translate( p0.x>>0, p0.y>>0 );
    +505                     } else {
    +506                         ctx.translate( p0.x, p0.y );
    +507                     }
    +508 					ctx.rotate( angle );
    +509                     if ( this.fill ) {
    +510 					    ctx.fillText(caracter,0,0);
    +511                     }
    +512                     if ( this.outline ) {
    +513                         ctx.beginPath();
    +514                         ctx.lineWidth= this.lineWidth;
    +515                         ctx.strokeText(caracter,0,0);
    +516                     }
    +517 
    +518 				ctx.restore();
    +519 
    +520 				textWidth+= charWidth;
    +521 			}
    +522 		},
    +523 		
    +524 		/**
    +525          * Private.
    +526          * Draw the text using a sprited font instead of a canvas font.
    +527          * @param director a valid CAAT.Director instance.
    +528          * @param time an integer with the Scene time the Actor is being drawn.
    +529          */
    +530 		drawSpriteText: function(director, time) {
    +531 			if (null===this.path) {
    +532 				this.font.drawText( this.text, director.ctx, 0, 0);
    +533 			} else {
    +534 				this.drawSpriteTextOnPath(director, time);
    +535 			}
    +536 		},
    +537 		
    +538 		/**
    +539          * Private.
    +540          * Draw the text traversing a path using a sprited font.
    +541          * @param director a valid CAAT.Director instance.
    +542          * @param time an integer with the Scene time the Actor is being drawn.
    +543          */
    +544 		drawSpriteTextOnPath: function(director, time) {
    +545 			var context= director.ctx;
    +546 
    +547 			var textWidth=this.sign * this.pathInterpolator.getPosition(
    +548                     (time%this.pathDuration)/this.pathDuration ).y * this.path.getLength() ;
    +549 			var p0= new CAAT.Math.Point(0,0,0);
    +550 			var p1= new CAAT.Math.Point(0,0,0);
    +551 
    +552 			for( var i=0; i<this.text.length; i++ ) {
    +553 				var character= this.text[i].toString();
    +554 				var charWidth= this.font.stringWidth(character);
    +555 
    +556 				//var pathLength= this.path.getLength();
    +557 
    +558 				var currentCurveLength= charWidth/2 + textWidth;
    +559 
    +560 				p0= this.path.getPositionFromLength(currentCurveLength).clone();
    +561 				p1= this.path.getPositionFromLength(currentCurveLength-0.1).clone();
    +562 
    +563 				var angle= Math.atan2( p0.y-p1.y, p0.x-p1.x );
    +564 
    +565 				context.save();
    +566 
    +567                 if ( CAAT.CLAMP ) {
    +568 				    context.translate( p0.x|0, p0.y|0 );
    +569                 } else {
    +570                     context.translate( p0.x, p0.y );
    +571                 }
    +572 				context.rotate( angle );
    +573 				
    +574 				var y = this.textBaseline === "bottom" ? 0 - this.font.getHeight() : 0;
    +575 				
    +576 				this.font.drawText(character, context, 0, y);
    +577 
    +578 				context.restore();
    +579 
    +580 				textWidth+= charWidth;
    +581 			}
    +582 		},
    +583 		
    +584         /**
    +585          * Set the path, interpolator and duration to draw the text on.
    +586          * @param path a valid CAAT.Path instance.
    +587          * @param interpolator a CAAT.Interpolator object. If not set, a Linear Interpolator will be used.
    +588          * @param duration an integer indicating the time to take to traverse the path. Optional. 10000 ms
    +589          * by default.
    +590          */
    +591 		setPath : function( path, interpolator, duration ) {
    +592 			this.path= path;
    +593             this.pathInterpolator= interpolator || new CAAT.Behavior.Interpolator().createLinearInterpolator();
    +594             this.pathDuration= duration || 10000;
    +595 
    +596             /*
    +597                 parent could not be set by the time this method is called.
    +598                 so the actors bounds set is removed.
    +599                 the developer must ensure to call setbounds properly on actor.
    +600              */
    +601 			this.mouseEnabled= false;
    +602 
    +603             return this;
    +604 		}
    +605 	}
    +606 
    +607 });
    +608 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Bezier.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Bezier.js.html new file mode 100644 index 00000000..c7618315 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Bezier.js.html @@ -0,0 +1,267 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  **/
    +  5 
    +  6 CAAT.Module( {
    +  7 
    +  8     /**
    +  9      * @name Math
    + 10      * @memberOf CAAT
    + 11      * @namespace
    + 12      */
    + 13 
    + 14     /**
    + 15      * @name Bezier
    + 16      * @memberOf CAAT.Math
    + 17      * @extends CAAT.Math.Curve
    + 18      * @constructor
    + 19      */
    + 20 
    + 21     defines:    "CAAT.Math.Bezier",
    + 22     depends:    ["CAAT.Math.Curve"],
    + 23     extendsClass:    "CAAT.Math.Curve",
    + 24     aliases:    ["CAAT.Bezier"],
    + 25     extendsWith:    function() {
    + 26         return {
    + 27 
    + 28             /**
    + 29              * @lends CAAT.Math.Bezier.prototype
    + 30              */
    + 31 
    + 32             /**
    + 33              * This curbe is cubic or quadratic bezier ?
    + 34              */
    + 35             cubic:		false,
    + 36 
    + 37             applyAsPath : function( director ) {
    + 38 
    + 39                 var cc= this.coordlist;
    + 40 
    + 41                 if ( this.cubic ) {
    + 42                     director.ctx.bezierCurveTo(
    + 43                         cc[1].x,
    + 44                         cc[1].y,
    + 45                         cc[2].x,
    + 46                         cc[2].y,
    + 47                         cc[3].x,
    + 48                         cc[3].y
    + 49                     );
    + 50                 } else {
    + 51                     director.ctx.quadraticCurveTo(
    + 52                         cc[1].x,
    + 53                         cc[1].y,
    + 54                         cc[2].x,
    + 55                         cc[2].y
    + 56                     );
    + 57                 }
    + 58                 return this;
    + 59             },
    + 60             isQuadric : function() {
    + 61                 return !this.cubic;
    + 62             },
    + 63             isCubic : function() {
    + 64                 return this.cubic;
    + 65             },
    + 66             /**
    + 67              * Set this curve as a cubic bezier defined by the given four control points.
    + 68              * @param cp0x {number}
    + 69              * @param cp0y {number}
    + 70              * @param cp1x {number}
    + 71              * @param cp1y {number}
    + 72              * @param cp2x {number}
    + 73              * @param cp2y {number}
    + 74              * @param cp3x {number}
    + 75              * @param cp3y {number}
    + 76              */
    + 77             setCubic : function( cp0x,cp0y, cp1x,cp1y, cp2x,cp2y, cp3x,cp3y ) {
    + 78 
    + 79                 this.coordlist= [];
    + 80 
    + 81                 this.coordlist.push( new CAAT.Math.Point().set(cp0x, cp0y ) );
    + 82                 this.coordlist.push( new CAAT.Math.Point().set(cp1x, cp1y ) );
    + 83                 this.coordlist.push( new CAAT.Math.Point().set(cp2x, cp2y ) );
    + 84                 this.coordlist.push( new CAAT.Math.Point().set(cp3x, cp3y ) );
    + 85 
    + 86                 this.cubic= true;
    + 87                 this.update();
    + 88 
    + 89                 return this;
    + 90             },
    + 91             /**
    + 92              * Set this curve as a quadric bezier defined by the three control points.
    + 93              * @param cp0x {number}
    + 94              * @param cp0y {number}
    + 95              * @param cp1x {number}
    + 96              * @param cp1y {number}
    + 97              * @param cp2x {number}
    + 98              * @param cp2y {number}
    + 99              */
    +100             setQuadric : function(cp0x,cp0y, cp1x,cp1y, cp2x,cp2y ) {
    +101 
    +102                 this.coordlist= [];
    +103 
    +104                 this.coordlist.push( new CAAT.Math.Point().set(cp0x, cp0y ) );
    +105                 this.coordlist.push( new CAAT.Math.Point().set(cp1x, cp1y ) );
    +106                 this.coordlist.push( new CAAT.Math.Point().set(cp2x, cp2y ) );
    +107 
    +108                 this.cubic= false;
    +109                 this.update();
    +110 
    +111                 return this;
    +112             },
    +113             setPoints : function( points ) {
    +114                 if ( points.length===3 ) {
    +115                     this.coordlist= points;
    +116                     this.cubic= false;
    +117                     this.update();
    +118                 } else if (points.length===4 ) {
    +119                     this.coordlist= points;
    +120                     this.cubic= true;
    +121                     this.update();
    +122                 } else {
    +123                     throw 'points must be an array of 3 or 4 CAAT.Point instances.'
    +124                 }
    +125 
    +126                 return this;
    +127             },
    +128             /**
    +129              * Paint this curve.
    +130              * @param director {CAAT.Director}
    +131              */
    +132             paint : function( director ) {
    +133                 if ( this.cubic ) {
    +134                     this.paintCubic(director);
    +135                 } else {
    +136                     this.paintCuadric( director );
    +137                 }
    +138 
    +139                 CAAT.Math.Bezier.superclass.paint.call(this,director);
    +140 
    +141             },
    +142             /**
    +143              * Paint this quadric Bezier curve. Each time the curve is drawn it will be solved again from 0 to 1 with
    +144              * CAAT.Bezier.k increments.
    +145              *
    +146              * @param director {CAAT.Director}
    +147              * @private
    +148              */
    +149             paintCuadric : function( director ) {
    +150                 var x1,y1;
    +151                 x1 = this.coordlist[0].x;
    +152                 y1 = this.coordlist[0].y;
    +153 
    +154                 var ctx= director.ctx;
    +155 
    +156                 ctx.save();
    +157                 ctx.beginPath();
    +158                 ctx.moveTo(x1,y1);
    +159 
    +160                 var point= new CAAT.Math.Point();
    +161                 for(var t=this.k;t<=1+this.k;t+=this.k){
    +162                     this.solve(point,t);
    +163                     ctx.lineTo(point.x, point.y );
    +164                 }
    +165 
    +166                 ctx.stroke();
    +167                 ctx.restore();
    +168 
    +169             },
    +170             /**
    +171              * Paint this cubic Bezier curve. Each time the curve is drawn it will be solved again from 0 to 1 with
    +172              * CAAT.Bezier.k increments.
    +173              *
    +174              * @param director {CAAT.Director}
    +175              * @private
    +176              */
    +177             paintCubic : function( director ) {
    +178 
    +179                 var x1,y1;
    +180                 x1 = this.coordlist[0].x;
    +181                 y1 = this.coordlist[0].y;
    +182 
    +183                 var ctx= director.ctx;
    +184 
    +185                 ctx.save();
    +186                 ctx.beginPath();
    +187                 ctx.moveTo(x1,y1);
    +188 
    +189                 var point= new CAAT.Math.Point();
    +190                 for(var t=this.k;t<=1+this.k;t+=this.k){
    +191                     this.solve(point,t);
    +192                     ctx.lineTo(point.x, point.y );
    +193                 }
    +194 
    +195                 ctx.stroke();
    +196                 ctx.restore();
    +197             },
    +198             /**
    +199              * Solves the curve for any given parameter t.
    +200              * @param point {CAAT.Point} the point to store the solved value on the curve.
    +201              * @param t {number} a number in the range 0..1
    +202              */
    +203             solve : function(point,t) {
    +204                 if ( this.cubic ) {
    +205                     return this.solveCubic(point,t);
    +206                 } else {
    +207                     return this.solveQuadric(point,t);
    +208                 }
    +209             },
    +210             /**
    +211              * Solves a cubic Bezier.
    +212              * @param point {CAAT.Point} the point to store the solved value on the curve.
    +213              * @param t {number} the value to solve the curve for.
    +214              */
    +215             solveCubic : function(point,t) {
    +216 
    +217                 var t2= t*t;
    +218                 var t3= t*t2;
    +219 
    +220                 var cl= this.coordlist;
    +221                 var cl0= cl[0];
    +222                 var cl1= cl[1];
    +223                 var cl2= cl[2];
    +224                 var cl3= cl[3];
    +225 
    +226                 point.x=(
    +227                     cl0.x + t * (-cl0.x * 3 + t * (3 * cl0.x-
    +228                     cl0.x*t)))+t*(3*cl1.x+t*(-6*cl1.x+
    +229                     cl1.x*3*t))+t2*(cl2.x*3-cl2.x*3*t)+
    +230                     cl3.x * t3;
    +231 
    +232                 point.y=(
    +233                         cl0.y+t*(-cl0.y*3+t*(3*cl0.y-
    +234                         cl0.y*t)))+t*(3*cl1.y+t*(-6*cl1.y+
    +235                         cl1.y*3*t))+t2*(cl2.y*3-cl2.y*3*t)+
    +236                         cl3.y * t3;
    +237 
    +238                 return point;
    +239             },
    +240             /**
    +241              * Solves a quadric Bezier.
    +242              * @param point {CAAT.Point} the point to store the solved value on the curve.
    +243              * @param t {number} the value to solve the curve for.
    +244              */
    +245             solveQuadric : function(point,t) {
    +246                 var cl= this.coordlist;
    +247                 var cl0= cl[0];
    +248                 var cl1= cl[1];
    +249                 var cl2= cl[2];
    +250                 var t1= 1-t;
    +251 
    +252                 point.x= t1*t1*cl0.x + 2*t1*t*cl1.x + t*t*cl2.x;
    +253                 point.y= t1*t1*cl0.y + 2*t1*t*cl1.y + t*t*cl2.y;
    +254 
    +255                 return point;
    +256             }
    +257         }
    +258     }
    +259 });
    +260 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_CatmullRom.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_CatmullRom.js.html new file mode 100644 index 00000000..ff8bb301 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_CatmullRom.js.html @@ -0,0 +1,130 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name CatmullRom
    +  5      * @memberOf CAAT.Math
    +  6      * @extends CAAT.Math.Curve
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines:"CAAT.Math.CatmullRom",
    + 11     depends:["CAAT.Math.Curve"],
    + 12     extendsClass:"CAAT.Math.Curve",
    + 13     aliases:["CAAT.CatmullRom"],
    + 14     extendsWith:function () {
    + 15         return {
    + 16 
    + 17             /**
    + 18              * @lends CAAT.Math.CatmullRom.prototype
    + 19              */
    + 20 
    + 21             /**
    + 22              * Set curve control points.
    + 23              * @param p0 <CAAT.Point>
    + 24              * @param p1 <CAAT.Point>
    + 25              * @param p2 <CAAT.Point>
    + 26              * @param p3 <CAAT.Point>
    + 27              */
    + 28             setCurve:function (p0, p1, p2, p3) {
    + 29 
    + 30                 this.coordlist = [];
    + 31                 this.coordlist.push(p0);
    + 32                 this.coordlist.push(p1);
    + 33                 this.coordlist.push(p2);
    + 34                 this.coordlist.push(p3);
    + 35 
    + 36                 this.update();
    + 37 
    + 38                 return this;
    + 39             },
    + 40             /**
    + 41              * Paint the contour by solving again the entire curve.
    + 42              * @param director {CAAT.Director}
    + 43              */
    + 44             paint:function (director) {
    + 45 
    + 46                 var x1, y1;
    + 47 
    + 48                 // Catmull rom solves from point 1 !!!
    + 49 
    + 50                 x1 = this.coordlist[1].x;
    + 51                 y1 = this.coordlist[1].y;
    + 52 
    + 53                 var ctx = director.ctx;
    + 54 
    + 55                 ctx.save();
    + 56                 ctx.beginPath();
    + 57                 ctx.moveTo(x1, y1);
    + 58 
    + 59                 var point = new CAAT.Point();
    + 60 
    + 61                 for (var t = this.k; t <= 1 + this.k; t += this.k) {
    + 62                     this.solve(point, t);
    + 63                     ctx.lineTo(point.x, point.y);
    + 64                 }
    + 65 
    + 66                 ctx.stroke();
    + 67                 ctx.restore();
    + 68 
    + 69                 CAAT.Math.CatmullRom.superclass.paint.call(this, director);
    + 70             },
    + 71             /**
    + 72              * Solves the curve for any given parameter t.
    + 73              * @param point {CAAT.Point} the point to store the solved value on the curve.
    + 74              * @param t {number} a number in the range 0..1
    + 75              */
    + 76             solve:function (point, t) {
    + 77                 var c = this.coordlist;
    + 78 
    + 79                 // Handy from CAKE. Thanks.
    + 80                 var af = ((-t + 2) * t - 1) * t * 0.5
    + 81                 var bf = (((3 * t - 5) * t) * t + 2) * 0.5
    + 82                 var cf = ((-3 * t + 4) * t + 1) * t * 0.5
    + 83                 var df = ((t - 1) * t * t) * 0.5
    + 84 
    + 85                 point.x = c[0].x * af + c[1].x * bf + c[2].x * cf + c[3].x * df;
    + 86                 point.y = c[0].y * af + c[1].y * bf + c[2].y * cf + c[3].y * df;
    + 87 
    + 88                 return point;
    + 89 
    + 90             },
    + 91 
    + 92             applyAsPath:function (director) {
    + 93 
    + 94                 var ctx = director.ctx;
    + 95 
    + 96                 var point = new CAAT.Math.Point();
    + 97 
    + 98                 for (var t = this.k; t <= 1 + this.k; t += this.k) {
    + 99                     this.solve(point, t);
    +100                     ctx.lineTo(point.x, point.y);
    +101                 }
    +102 
    +103                 return this;
    +104             },
    +105 
    +106             /**
    +107              * Return the first curve control point.
    +108              * @return {CAAT.Point}
    +109              */
    +110             endCurvePosition:function () {
    +111                 return this.coordlist[ this.coordlist.length - 2 ];
    +112             },
    +113             /**
    +114              * Return the last curve control point.
    +115              * @return {CAAT.Point}
    +116              */
    +117             startCurvePosition:function () {
    +118                 return this.coordlist[ 1 ];
    +119             }
    +120         }
    +121     }
    +122 });
    +123 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Curve.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Curve.js.html new file mode 100644 index 00000000..ace184de --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Curve.js.html @@ -0,0 +1,210 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  **/
    +  5 
    +  6 CAAT.Module({
    +  7 
    +  8     /**
    +  9      * @name Curve
    + 10      * @memberOf CAAT.Math
    + 11      * @constructor
    + 12      */
    + 13 
    + 14     defines:"CAAT.Math.Curve",
    + 15     depends:["CAAT.Math.Point"],
    + 16     extendsWith:function () {
    + 17 
    + 18         return {
    + 19 
    + 20             /**
    + 21              * @lends CAAT.Math.Curve.prototype
    + 22              */
    + 23 
    + 24             /**
    + 25              * A collection of CAAT.Math.Point objects.
    + 26              */
    + 27             coordlist:null,
    + 28 
    + 29             /**
    + 30              * Minimun solver step.
    + 31              */
    + 32             k:0.05,
    + 33 
    + 34             /**
    + 35              * Curve length.
    + 36              */
    + 37             length:-1,
    + 38 
    + 39             /**
    + 40              * If this segments belongs to an interactive path, the handlers will be this size.
    + 41              */
    + 42             HANDLE_SIZE:20,
    + 43 
    + 44             /**
    + 45              * Draw interactive handlers ?
    + 46              */
    + 47             drawHandles:true,
    + 48 
    + 49             /**
    + 50              * Paint the curve control points.
    + 51              * @param director {CAAT.Director}
    + 52              */
    + 53             paint:function (director) {
    + 54                 if (false === this.drawHandles) {
    + 55                     return;
    + 56                 }
    + 57 
    + 58                 var cl = this.coordlist;
    + 59                 var ctx = director.ctx;
    + 60 
    + 61                 // control points
    + 62                 ctx.save();
    + 63                 ctx.beginPath();
    + 64 
    + 65                 ctx.strokeStyle = '#a0a0a0';
    + 66                 ctx.moveTo(cl[0].x, cl[0].y);
    + 67                 ctx.lineTo(cl[1].x, cl[1].y);
    + 68                 ctx.stroke();
    + 69                 if (this.cubic) {
    + 70                     ctx.moveTo(cl[2].x, cl[2].y);
    + 71                     ctx.lineTo(cl[3].x, cl[3].y);
    + 72                     ctx.stroke();
    + 73                 }
    + 74 
    + 75 
    + 76                 ctx.globalAlpha = 0.5;
    + 77                 for (var i = 0; i < this.coordlist.length; i++) {
    + 78                     ctx.fillStyle = '#7f7f00';
    + 79                     var w = this.HANDLE_SIZE / 2;
    + 80                     ctx.beginPath();
    + 81                     ctx.arc(cl[i].x, cl[i].y, w, 0, 2 * Math.PI, false);
    + 82                     ctx.fill();
    + 83                 }
    + 84 
    + 85                 ctx.restore();
    + 86             },
    + 87             /**
    + 88              * Signal the curve has been modified and recalculate curve length.
    + 89              */
    + 90             update:function () {
    + 91                 this.calcLength();
    + 92             },
    + 93             /**
    + 94              * This method must be overriden by subclasses. It is called whenever the curve must be solved for some time=t.
    + 95              * The t parameter must be in the range 0..1
    + 96              * @param point {CAAT.Point} to store curve solution for t.
    + 97              * @param t {number}
    + 98              * @return {CAAT.Point} the point parameter.
    + 99              */
    +100             solve:function (point, t) {
    +101             },
    +102             /**
    +103              * Get an array of points defining the curve contour.
    +104              * @param numSamples {number} number of segments to get.
    +105              */
    +106             getContour:function (numSamples) {
    +107                 var contour = [], i;
    +108 
    +109                 for (i = 0; i <= numSamples; i++) {
    +110                     var point = new CAAT.Math.Point();
    +111                     this.solve(point, i / numSamples);
    +112                     contour.push(point);
    +113                 }
    +114 
    +115                 return contour;
    +116             },
    +117             /**
    +118              * Calculates a curve bounding box.
    +119              *
    +120              * @param rectangle {CAAT.Rectangle} a rectangle to hold the bounding box.
    +121              * @return {CAAT.Rectangle} the rectangle parameter.
    +122              */
    +123             getBoundingBox:function (rectangle) {
    +124                 if (!rectangle) {
    +125                     rectangle = new CAAT.Math.Rectangle();
    +126                 }
    +127 
    +128                 // thanks yodesoft.com for spotting the first point is out of the BB
    +129                 rectangle.setEmpty();
    +130                 rectangle.union(this.coordlist[0].x, this.coordlist[0].y);
    +131 
    +132                 var pt = new CAAT.Math.Point();
    +133                 for (var t = this.k; t <= 1 + this.k; t += this.k) {
    +134                     this.solve(pt, t);
    +135                     rectangle.union(pt.x, pt.y);
    +136                 }
    +137 
    +138                 return rectangle;
    +139             },
    +140             /**
    +141              * Calculate the curve length by incrementally solving the curve every substep=CAAT.Curve.k. This value defaults
    +142              * to .05 so at least 20 iterations will be performed.
    +143              *
    +144              * @return {number} the approximate curve length.
    +145              */
    +146             calcLength:function () {
    +147                 var x1, y1;
    +148                 x1 = this.coordlist[0].x;
    +149                 y1 = this.coordlist[0].y;
    +150                 var llength = 0;
    +151                 var pt = new CAAT.Math.Point();
    +152                 for (var t = this.k; t <= 1 + this.k; t += this.k) {
    +153                     this.solve(pt, t);
    +154                     llength += Math.sqrt((pt.x - x1) * (pt.x - x1) + (pt.y - y1) * (pt.y - y1));
    +155                     x1 = pt.x;
    +156                     y1 = pt.y;
    +157                 }
    +158 
    +159                 this.length = llength;
    +160                 return llength;
    +161             },
    +162             /**
    +163              * Return the cached curve length.
    +164              * @return {number} the cached curve length.
    +165              */
    +166             getLength:function () {
    +167                 return this.length;
    +168             },
    +169             /**
    +170              * Return the first curve control point.
    +171              * @return {CAAT.Point}
    +172              */
    +173             endCurvePosition:function () {
    +174                 return this.coordlist[ this.coordlist.length - 1 ];
    +175             },
    +176             /**
    +177              * Return the last curve control point.
    +178              * @return {CAAT.Point}
    +179              */
    +180             startCurvePosition:function () {
    +181                 return this.coordlist[ 0 ];
    +182             },
    +183 
    +184             setPoints:function (points) {
    +185             },
    +186 
    +187             setPoint:function (point, index) {
    +188                 if (index >= 0 && index < this.coordlist.length) {
    +189                     this.coordlist[index] = point;
    +190                 }
    +191             },
    +192             /**
    +193              *
    +194              * @param director <=CAAT.Director>
    +195              */
    +196             applyAsPath:function (director) {
    +197             }
    +198         }
    +199     }
    +200 
    +201 });
    +202 
    +203 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Dimension.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Dimension.js.html new file mode 100644 index 00000000..4e4c7d65 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Dimension.js.html @@ -0,0 +1,44 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name Dimension
    +  5      * @memberOf CAAT.Math
    +  6      * @constructor
    +  7      */
    +  8 
    +  9 
    + 10     defines:"CAAT.Math.Dimension",
    + 11     aliases:["CAAT.Dimension"],
    + 12     extendsWith:function () {
    + 13         return {
    + 14 
    + 15             /**
    + 16              * @lends CAAT.Math.Dimension.prototype
    + 17              */
    + 18 
    + 19             /**
    + 20              * Width dimension.
    + 21              */
    + 22             width:0,
    + 23 
    + 24             /**
    + 25              * Height dimension.
    + 26              */
    + 27             height:0,
    + 28 
    + 29             __init:function (w, h) {
    + 30                 this.width = w;
    + 31                 this.height = h;
    + 32                 return this;
    + 33             }
    + 34         }
    + 35     }
    + 36 });
    + 37 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix.js.html new file mode 100644 index 00000000..d49e821d --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix.js.html @@ -0,0 +1,431 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  **/
    +  5 
    +  6 
    +  7 CAAT.Module({
    +  8 
    +  9     /**
    + 10      * @name Matrix
    + 11      * @memberOf CAAT.Math
    + 12      * @constructor
    + 13      */
    + 14 
    + 15 
    + 16     defines:"CAAT.Math.Matrix",
    + 17     depends:["CAAT.Math.Point"],
    + 18     aliases:["CAAT.Matrix"],
    + 19     onCreate : function() {
    + 20         CAAT.Math.Matrix.prototype.transformRenderingContext= CAAT.Math.Matrix.prototype.transformRenderingContext_NoClamp;
    + 21         CAAT.Math.Matrix.prototype.transformRenderingContextSet= CAAT.Math.Matrix.prototype.transformRenderingContextSet_NoClamp;
    + 22     },
    + 23     constants : {
    + 24 
    + 25         /**
    + 26          * @lends CAAT.Math.Matrix.prototype
    + 27          */
    + 28 
    + 29         setCoordinateClamping : function( clamp ) {
    + 30             if ( clamp ) {
    + 31                 CAAT.Matrix.prototype.transformRenderingContext= CAAT.Matrix.prototype.transformRenderingContext_Clamp;
    + 32                 CAAT.Matrix.prototype.transformRenderingContextSet= CAAT.Matrix.prototype.transformRenderingContextSet_Clamp;
    + 33                 CAAT.Math.Matrix.prototype.transformRenderingContext= CAAT.Matrix.prototype.transformRenderingContext_Clamp;
    + 34                 CAAT.Math.Matrix.prototype.transformRenderingContextSet= CAAT.Matrix.prototype.transformRenderingContextSet_Clamp;
    + 35             } else {
    + 36                 CAAT.Matrix.prototype.transformRenderingContext= CAAT.Matrix.prototype.transformRenderingContext_NoClamp;
    + 37                 CAAT.Matrix.prototype.transformRenderingContextSet= CAAT.Matrix.prototype.transformRenderingContextSet_NoClamp;
    + 38                 CAAT.Math.Matrix.prototype.transformRenderingContext= CAAT.Matrix.prototype.transformRenderingContext_NoClamp;
    + 39                 CAAT.Math.Matrix.prototype.transformRenderingContextSet= CAAT.Matrix.prototype.transformRenderingContextSet_NoClamp;
    + 40             }
    + 41         },
    + 42         /**
    + 43          * Create a scale matrix.
    + 44          * @param scalex {number} x scale magnitude.
    + 45          * @param scaley {number} y scale magnitude.
    + 46          *
    + 47          * @return {CAAT.Matrix} a matrix object.
    + 48          *
    + 49          * @static
    + 50          */
    + 51         scale:function (scalex, scaley) {
    + 52             var m = new CAAT.Math.Matrix();
    + 53 
    + 54             m.matrix[0] = scalex;
    + 55             m.matrix[4] = scaley;
    + 56 
    + 57             return m;
    + 58         },
    + 59         /**
    + 60          * Create a new rotation matrix and set it up for the specified angle in radians.
    + 61          * @param angle {number}
    + 62          * @return {CAAT.Matrix} a matrix object.
    + 63          *
    + 64          * @static
    + 65          */
    + 66         rotate:function (angle) {
    + 67             var m = new CAAT.Math.Matrix();
    + 68             m.setRotation(angle);
    + 69             return m;
    + 70         },
    + 71         /**
    + 72          * Create a translation matrix.
    + 73          * @param x {number} x translation magnitude.
    + 74          * @param y {number} y translation magnitude.
    + 75          *
    + 76          * @return {CAAT.Matrix} a matrix object.
    + 77          * @static
    + 78          *
    + 79          */
    + 80         translate:function (x, y) {
    + 81             var m = new CAAT.Math.Matrix();
    + 82 
    + 83             m.matrix[2] = x;
    + 84             m.matrix[5] = y;
    + 85 
    + 86             return m;
    + 87         }
    + 88     },
    + 89     extendsWith:function () {
    + 90         return {
    + 91 
    + 92             /**
    + 93              * @lends CAAT.Math.Matrix.prototype
    + 94              */
    + 95 
    + 96             /**
    + 97              * An array of 9 numbers.
    + 98              */
    + 99             matrix:null,
    +100 
    +101             __init:function () {
    +102                 this.matrix = [
    +103                     1.0, 0.0, 0.0,
    +104                     0.0, 1.0, 0.0, 0.0, 0.0, 1.0 ];
    +105 
    +106                 if (typeof Float32Array !== "undefined") {
    +107                     this.matrix = new Float32Array(this.matrix);
    +108                 }
    +109 
    +110                 return this;
    +111             },
    +112 
    +113             /**
    +114              * Transform a point by this matrix. The parameter point will be modified with the transformation values.
    +115              * @param point {CAAT.Point}.
    +116              * @return {CAAT.Point} the parameter point.
    +117              */
    +118             transformCoord:function (point) {
    +119                 var x = point.x;
    +120                 var y = point.y;
    +121 
    +122                 var tm = this.matrix;
    +123 
    +124                 point.x = x * tm[0] + y * tm[1] + tm[2];
    +125                 point.y = x * tm[3] + y * tm[4] + tm[5];
    +126 
    +127                 return point;
    +128             },
    +129 
    +130             setRotation:function (angle) {
    +131 
    +132                 this.identity();
    +133 
    +134                 var tm = this.matrix;
    +135                 var c = Math.cos(angle);
    +136                 var s = Math.sin(angle);
    +137                 tm[0] = c;
    +138                 tm[1] = -s;
    +139                 tm[3] = s;
    +140                 tm[4] = c;
    +141 
    +142                 return this;
    +143             },
    +144 
    +145             setScale:function (scalex, scaley) {
    +146                 this.identity();
    +147 
    +148                 this.matrix[0] = scalex;
    +149                 this.matrix[4] = scaley;
    +150 
    +151                 return this;
    +152             },
    +153 
    +154             /**
    +155              * Sets this matrix as a translation matrix.
    +156              * @param x
    +157              * @param y
    +158              */
    +159             setTranslate:function (x, y) {
    +160                 this.identity();
    +161 
    +162                 this.matrix[2] = x;
    +163                 this.matrix[5] = y;
    +164 
    +165                 return this;
    +166             },
    +167             /**
    +168              * Copy into this matrix the given matrix values.
    +169              * @param matrix {CAAT.Matrix}
    +170              * @return this
    +171              */
    +172             copy:function (matrix) {
    +173                 matrix = matrix.matrix;
    +174 
    +175                 var tmatrix = this.matrix;
    +176                 tmatrix[0] = matrix[0];
    +177                 tmatrix[1] = matrix[1];
    +178                 tmatrix[2] = matrix[2];
    +179                 tmatrix[3] = matrix[3];
    +180                 tmatrix[4] = matrix[4];
    +181                 tmatrix[5] = matrix[5];
    +182                 tmatrix[6] = matrix[6];
    +183                 tmatrix[7] = matrix[7];
    +184                 tmatrix[8] = matrix[8];
    +185 
    +186                 return this;
    +187             },
    +188             /**
    +189              * Set this matrix to the identity matrix.
    +190              * @return this
    +191              */
    +192             identity:function () {
    +193 
    +194                 var m = this.matrix;
    +195                 m[0] = 1.0;
    +196                 m[1] = 0.0;
    +197                 m[2] = 0.0;
    +198 
    +199                 m[3] = 0.0;
    +200                 m[4] = 1.0;
    +201                 m[5] = 0.0;
    +202 
    +203                 m[6] = 0.0;
    +204                 m[7] = 0.0;
    +205                 m[8] = 1.0;
    +206 
    +207                 return this;
    +208             },
    +209             /**
    +210              * Multiply this matrix by a given matrix.
    +211              * @param m {CAAT.Matrix}
    +212              * @return this
    +213              */
    +214             multiply:function (m) {
    +215 
    +216                 var tm = this.matrix;
    +217                 var mm = m.matrix;
    +218 
    +219                 var tm0 = tm[0];
    +220                 var tm1 = tm[1];
    +221                 var tm2 = tm[2];
    +222                 var tm3 = tm[3];
    +223                 var tm4 = tm[4];
    +224                 var tm5 = tm[5];
    +225                 var tm6 = tm[6];
    +226                 var tm7 = tm[7];
    +227                 var tm8 = tm[8];
    +228 
    +229                 var mm0 = mm[0];
    +230                 var mm1 = mm[1];
    +231                 var mm2 = mm[2];
    +232                 var mm3 = mm[3];
    +233                 var mm4 = mm[4];
    +234                 var mm5 = mm[5];
    +235                 var mm6 = mm[6];
    +236                 var mm7 = mm[7];
    +237                 var mm8 = mm[8];
    +238 
    +239                 tm[0] = tm0 * mm0 + tm1 * mm3 + tm2 * mm6;
    +240                 tm[1] = tm0 * mm1 + tm1 * mm4 + tm2 * mm7;
    +241                 tm[2] = tm0 * mm2 + tm1 * mm5 + tm2 * mm8;
    +242                 tm[3] = tm3 * mm0 + tm4 * mm3 + tm5 * mm6;
    +243                 tm[4] = tm3 * mm1 + tm4 * mm4 + tm5 * mm7;
    +244                 tm[5] = tm3 * mm2 + tm4 * mm5 + tm5 * mm8;
    +245                 tm[6] = tm6 * mm0 + tm7 * mm3 + tm8 * mm6;
    +246                 tm[7] = tm6 * mm1 + tm7 * mm4 + tm8 * mm7;
    +247                 tm[8] = tm6 * mm2 + tm7 * mm5 + tm8 * mm8;
    +248 
    +249                 return this;
    +250             },
    +251             /**
    +252              * Premultiply this matrix by a given matrix.
    +253              * @param m {CAAT.Matrix}
    +254              * @return this
    +255              */
    +256             premultiply:function (m) {
    +257 
    +258                 var m00 = m.matrix[0] * this.matrix[0] + m.matrix[1] * this.matrix[3] + m.matrix[2] * this.matrix[6];
    +259                 var m01 = m.matrix[0] * this.matrix[1] + m.matrix[1] * this.matrix[4] + m.matrix[2] * this.matrix[7];
    +260                 var m02 = m.matrix[0] * this.matrix[2] + m.matrix[1] * this.matrix[5] + m.matrix[2] * this.matrix[8];
    +261 
    +262                 var m10 = m.matrix[3] * this.matrix[0] + m.matrix[4] * this.matrix[3] + m.matrix[5] * this.matrix[6];
    +263                 var m11 = m.matrix[3] * this.matrix[1] + m.matrix[4] * this.matrix[4] + m.matrix[5] * this.matrix[7];
    +264                 var m12 = m.matrix[3] * this.matrix[2] + m.matrix[4] * this.matrix[5] + m.matrix[5] * this.matrix[8];
    +265 
    +266                 var m20 = m.matrix[6] * this.matrix[0] + m.matrix[7] * this.matrix[3] + m.matrix[8] * this.matrix[6];
    +267                 var m21 = m.matrix[6] * this.matrix[1] + m.matrix[7] * this.matrix[4] + m.matrix[8] * this.matrix[7];
    +268                 var m22 = m.matrix[6] * this.matrix[2] + m.matrix[7] * this.matrix[5] + m.matrix[8] * this.matrix[8];
    +269 
    +270                 this.matrix[0] = m00;
    +271                 this.matrix[1] = m01;
    +272                 this.matrix[2] = m02;
    +273 
    +274                 this.matrix[3] = m10;
    +275                 this.matrix[4] = m11;
    +276                 this.matrix[5] = m12;
    +277 
    +278                 this.matrix[6] = m20;
    +279                 this.matrix[7] = m21;
    +280                 this.matrix[8] = m22;
    +281 
    +282 
    +283                 return this;
    +284             },
    +285             /**
    +286              * Creates a new inverse matrix from this matrix.
    +287              * @return {CAAT.Matrix} an inverse matrix.
    +288              */
    +289             getInverse:function () {
    +290                 var tm = this.matrix;
    +291 
    +292                 var m00 = tm[0];
    +293                 var m01 = tm[1];
    +294                 var m02 = tm[2];
    +295                 var m10 = tm[3];
    +296                 var m11 = tm[4];
    +297                 var m12 = tm[5];
    +298                 var m20 = tm[6];
    +299                 var m21 = tm[7];
    +300                 var m22 = tm[8];
    +301 
    +302                 var newMatrix = new CAAT.Math.Matrix();
    +303 
    +304                 var determinant = m00 * (m11 * m22 - m21 * m12) - m10 * (m01 * m22 - m21 * m02) + m20 * (m01 * m12 - m11 * m02);
    +305                 if (determinant === 0) {
    +306                     return null;
    +307                 }
    +308 
    +309                 var m = newMatrix.matrix;
    +310 
    +311                 m[0] = m11 * m22 - m12 * m21;
    +312                 m[1] = m02 * m21 - m01 * m22;
    +313                 m[2] = m01 * m12 - m02 * m11;
    +314 
    +315                 m[3] = m12 * m20 - m10 * m22;
    +316                 m[4] = m00 * m22 - m02 * m20;
    +317                 m[5] = m02 * m10 - m00 * m12;
    +318 
    +319                 m[6] = m10 * m21 - m11 * m20;
    +320                 m[7] = m01 * m20 - m00 * m21;
    +321                 m[8] = m00 * m11 - m01 * m10;
    +322 
    +323                 newMatrix.multiplyScalar(1 / determinant);
    +324 
    +325                 return newMatrix;
    +326             },
    +327             /**
    +328              * Multiply this matrix by a scalar.
    +329              * @param scalar {number} scalar value
    +330              *
    +331              * @return this
    +332              */
    +333             multiplyScalar:function (scalar) {
    +334                 var i;
    +335 
    +336                 for (i = 0; i < 9; i++) {
    +337                     this.matrix[i] *= scalar;
    +338                 }
    +339 
    +340                 return this;
    +341             },
    +342 
    +343             /**
    +344              *
    +345              * @param ctx
    +346              */
    +347             transformRenderingContextSet_NoClamp:function (ctx) {
    +348                 var m = this.matrix;
    +349                 ctx.setTransform(m[0], m[3], m[1], m[4], m[2], m[5]);
    +350                 return this;
    +351             },
    +352 
    +353             /**
    +354              *
    +355              * @param ctx
    +356              */
    +357             transformRenderingContext_NoClamp:function (ctx) {
    +358                 var m = this.matrix;
    +359                 ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
    +360                 return this;
    +361             },
    +362 
    +363             /**
    +364              *
    +365              * @param ctx
    +366              */
    +367             transformRenderingContextSet_Clamp:function (ctx) {
    +368                 var m = this.matrix;
    +369                 ctx.setTransform(m[0], m[3], m[1], m[4], m[2] >> 0, m[5] >> 0);
    +370                 return this;
    +371             },
    +372 
    +373             /**
    +374              *
    +375              * @param ctx
    +376              */
    +377             transformRenderingContext_Clamp:function (ctx) {
    +378                 var m = this.matrix;
    +379                 ctx.transform(m[0], m[3], m[1], m[4], m[2] >> 0, m[5] >> 0);
    +380                 return this;
    +381             },
    +382 
    +383             setModelViewMatrix:function ( x, y, sx, sy, r  ) {
    +384                 var c, s, _m00, _m01, _m10, _m11;
    +385                 var mm0, mm1, mm2, mm3, mm4, mm5;
    +386                 var mm;
    +387 
    +388                 mm = this.matrix;
    +389 
    +390                 mm0 = 1;
    +391                 mm1 = 0;
    +392                 mm3 = 0;
    +393                 mm4 = 1;
    +394 
    +395                 mm2 = x;
    +396                 mm5 = y;
    +397 
    +398                 c = Math.cos(r);
    +399                 s = Math.sin(r);
    +400                 _m00 = mm0;
    +401                 _m01 = mm1;
    +402                 _m10 = mm3;
    +403                 _m11 = mm4;
    +404                 mm0 = _m00 * c + _m01 * s;
    +405                 mm1 = -_m00 * s + _m01 * c;
    +406                 mm3 = _m10 * c + _m11 * s;
    +407                 mm4 = -_m10 * s + _m11 * c;
    +408 
    +409                 mm0 = mm0 * this.scaleX;
    +410                 mm1 = mm1 * this.scaleY;
    +411                 mm3 = mm3 * this.scaleX;
    +412                 mm4 = mm4 * this.scaleY;
    +413 
    +414                 mm[0] = mm0;
    +415                 mm[1] = mm1;
    +416                 mm[2] = mm2;
    +417                 mm[3] = mm3;
    +418                 mm[4] = mm4;
    +419                 mm[5] = mm5;
    +420             }
    +421         }
    +422     }
    +423 });
    +424 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix3.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix3.js.html new file mode 100644 index 00000000..a066b4ff --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Matrix3.js.html @@ -0,0 +1,553 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  **/
    +  5 
    +  6 CAAT.Module({
    +  7 
    +  8     /**
    +  9      * @name Matrix3
    + 10      * @memberOf CAAT.Math
    + 11      * @constructor
    + 12      */
    + 13 
    + 14     defines:"CAAT.Math.Matrix3",
    + 15     aliases:["CAAT.Matrix3"],
    + 16     extendsWith:function () {
    + 17         return {
    + 18 
    + 19             /**
    + 20              * @lends CAAT.Math.Matrix3.prototype
    + 21              */
    + 22 
    + 23             /**
    + 24              * An Array of 4 Array of 4 numbers.
    + 25              */
    + 26             matrix:null,
    + 27 
    + 28             /**
    + 29              * An array of 16 numbers.
    + 30              */
    + 31             fmatrix:null,
    + 32 
    + 33             __init:function () {
    + 34                 this.matrix = [
    + 35                     [1, 0, 0, 0],
    + 36                     [0, 1, 0, 0],
    + 37                     [0, 0, 1, 0],
    + 38                     [0, 0, 0, 1]
    + 39                 ];
    + 40 
    + 41                 this.fmatrix = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
    + 42 
    + 43                 return this;
    + 44             },
    + 45 
    + 46             transformCoord:function (point) {
    + 47                 var x = point.x;
    + 48                 var y = point.y;
    + 49                 var z = point.z;
    + 50 
    + 51                 point.x = x * this.matrix[0][0] + y * this.matrix[0][1] + z * this.matrix[0][2] + this.matrix[0][3];
    + 52                 point.y = x * this.matrix[1][0] + y * this.matrix[1][1] + z * this.matrix[1][2] + this.matrix[1][3];
    + 53                 point.z = x * this.matrix[2][0] + y * this.matrix[2][1] + z * this.matrix[2][2] + this.matrix[2][3];
    + 54 
    + 55                 return point;
    + 56             },
    + 57             initialize:function (x0, y0, z0, x1, y1, z1, x2, y2, z2) {
    + 58                 this.identity();
    + 59                 this.matrix[0][0] = x0;
    + 60                 this.matrix[0][1] = y0;
    + 61                 this.matrix[0][2] = z0;
    + 62 
    + 63                 this.matrix[1][0] = x1;
    + 64                 this.matrix[1][1] = y1;
    + 65                 this.matrix[1][2] = z1;
    + 66 
    + 67                 this.matrix[2][0] = x2;
    + 68                 this.matrix[2][1] = y2;
    + 69                 this.matrix[2][2] = z2;
    + 70 
    + 71                 return this;
    + 72             },
    + 73             initWithMatrix:function (matrixData) {
    + 74                 this.matrix = matrixData;
    + 75                 return this;
    + 76             },
    + 77             flatten:function () {
    + 78                 var d = this.fmatrix;
    + 79                 var s = this.matrix;
    + 80                 d[ 0] = s[0][0];
    + 81                 d[ 1] = s[1][0];
    + 82                 d[ 2] = s[2][0];
    + 83                 d[ 3] = s[3][0];
    + 84 
    + 85                 d[ 4] = s[0][1];
    + 86                 d[ 5] = s[1][1];
    + 87                 d[ 6] = s[2][1];
    + 88                 d[ 7] = s[2][1];
    + 89 
    + 90                 d[ 8] = s[0][2];
    + 91                 d[ 9] = s[1][2];
    + 92                 d[10] = s[2][2];
    + 93                 d[11] = s[3][2];
    + 94 
    + 95                 d[12] = s[0][3];
    + 96                 d[13] = s[1][3];
    + 97                 d[14] = s[2][3];
    + 98                 d[15] = s[3][3];
    + 99 
    +100                 return this.fmatrix;
    +101             },
    +102 
    +103             /**
    +104              * Set this matrix to identity matrix.
    +105              * @return this
    +106              */
    +107             identity:function () {
    +108                 for (var i = 0; i < 4; i++) {
    +109                     for (var j = 0; j < 4; j++) {
    +110                         this.matrix[i][j] = (i === j) ? 1.0 : 0.0;
    +111                     }
    +112                 }
    +113 
    +114                 return this;
    +115             },
    +116             /**
    +117              * Get this matri'x internal representation data. The bakced structure is a 4x4 array of number.
    +118              */
    +119             getMatrix:function () {
    +120                 return this.matrix;
    +121             },
    +122             /**
    +123              * Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate around
    +124              * xy axis.
    +125              *
    +126              * @param xy {Number} radians to rotate.
    +127              *
    +128              * @return this
    +129              */
    +130             rotateXY:function (xy) {
    +131                 return this.rotate(xy, 0, 0);
    +132             },
    +133             /**
    +134              * Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate around
    +135              * xz axis.
    +136              *
    +137              * @param xz {Number} radians to rotate.
    +138              *
    +139              * @return this
    +140              */
    +141             rotateXZ:function (xz) {
    +142                 return this.rotate(0, xz, 0);
    +143             },
    +144             /**
    +145              * Multiply this matrix by a created rotation matrix. The rotation matrix is set up to rotate aroind
    +146              * yz axis.
    +147              *
    +148              * @param yz {Number} radians to rotate.
    +149              *
    +150              * @return this
    +151              */
    +152             rotateYZ:function (yz) {
    +153                 return this.rotate(0, 0, yz);
    +154             },
    +155             /**
    +156              *
    +157              * @param xy
    +158              * @param xz
    +159              * @param yz
    +160              */
    +161             setRotate:function (xy, xz, yz) {
    +162                 var m = this.rotate(xy, xz, yz);
    +163                 this.copy(m);
    +164                 return this;
    +165             },
    +166             /**
    +167              * Creates a matrix to represent arbitrary rotations around the given planes.
    +168              * @param xy {number} radians to rotate around xy plane.
    +169              * @param xz {number} radians to rotate around xz plane.
    +170              * @param yz {number} radians to rotate around yz plane.
    +171              *
    +172              * @return {CAAT.Matrix3} a newly allocated matrix.
    +173              * @static
    +174              */
    +175             rotate:function (xy, xz, yz) {
    +176                 var res = new CAAT.Math.Matrix3();
    +177                 var s, c, m;
    +178 
    +179                 if (xy !== 0) {
    +180                     m = new CAAT.Math.Math.Matrix3();
    +181                     s = Math.sin(xy);
    +182                     c = Math.cos(xy);
    +183                     m.matrix[1][1] = c;
    +184                     m.matrix[1][2] = -s;
    +185                     m.matrix[2][1] = s;
    +186                     m.matrix[2][2] = c;
    +187                     res.multiply(m);
    +188                 }
    +189 
    +190                 if (xz !== 0) {
    +191                     m = new CAAT.Math.Matrix3();
    +192                     s = Math.sin(xz);
    +193                     c = Math.cos(xz);
    +194                     m.matrix[0][0] = c;
    +195                     m.matrix[0][2] = -s;
    +196                     m.matrix[2][0] = s;
    +197                     m.matrix[2][2] = c;
    +198                     res.multiply(m);
    +199                 }
    +200 
    +201                 if (yz !== 0) {
    +202                     m = new CAAT.Math.Matrix3();
    +203                     s = Math.sin(yz);
    +204                     c = Math.cos(yz);
    +205                     m.matrix[0][0] = c;
    +206                     m.matrix[0][1] = -s;
    +207                     m.matrix[1][0] = s;
    +208                     m.matrix[1][1] = c;
    +209                     res.multiply(m);
    +210                 }
    +211 
    +212                 return res;
    +213             },
    +214             /**
    +215              * Creates a new matrix being a copy of this matrix.
    +216              * @return {CAAT.Matrix3} a newly allocated matrix object.
    +217              */
    +218             getClone:function () {
    +219                 var m = new CAAT.Math.Matrix3();
    +220                 m.copy(this);
    +221                 return m;
    +222             },
    +223             /**
    +224              * Multiplies this matrix by another matrix.
    +225              *
    +226              * @param n {CAAT.Matrix3} a CAAT.Matrix3 object.
    +227              * @return this
    +228              */
    +229             multiply:function (m) {
    +230                 var n = this.getClone();
    +231 
    +232                 var nm = n.matrix;
    +233                 var n00 = nm[0][0];
    +234                 var n01 = nm[0][1];
    +235                 var n02 = nm[0][2];
    +236                 var n03 = nm[0][3];
    +237 
    +238                 var n10 = nm[1][0];
    +239                 var n11 = nm[1][1];
    +240                 var n12 = nm[1][2];
    +241                 var n13 = nm[1][3];
    +242 
    +243                 var n20 = nm[2][0];
    +244                 var n21 = nm[2][1];
    +245                 var n22 = nm[2][2];
    +246                 var n23 = nm[2][3];
    +247 
    +248                 var n30 = nm[3][0];
    +249                 var n31 = nm[3][1];
    +250                 var n32 = nm[3][2];
    +251                 var n33 = nm[3][3];
    +252 
    +253                 var mm = m.matrix;
    +254                 var m00 = mm[0][0];
    +255                 var m01 = mm[0][1];
    +256                 var m02 = mm[0][2];
    +257                 var m03 = mm[0][3];
    +258 
    +259                 var m10 = mm[1][0];
    +260                 var m11 = mm[1][1];
    +261                 var m12 = mm[1][2];
    +262                 var m13 = mm[1][3];
    +263 
    +264                 var m20 = mm[2][0];
    +265                 var m21 = mm[2][1];
    +266                 var m22 = mm[2][2];
    +267                 var m23 = mm[2][3];
    +268 
    +269                 var m30 = mm[3][0];
    +270                 var m31 = mm[3][1];
    +271                 var m32 = mm[3][2];
    +272                 var m33 = mm[3][3];
    +273 
    +274                 this.matrix[0][0] = n00 * m00 + n01 * m10 + n02 * m20 + n03 * m30;
    +275                 this.matrix[0][1] = n00 * m01 + n01 * m11 + n02 * m21 + n03 * m31;
    +276                 this.matrix[0][2] = n00 * m02 + n01 * m12 + n02 * m22 + n03 * m32;
    +277                 this.matrix[0][3] = n00 * m03 + n01 * m13 + n02 * m23 + n03 * m33;
    +278 
    +279                 this.matrix[1][0] = n10 * m00 + n11 * m10 + n12 * m20 + n13 * m30;
    +280                 this.matrix[1][1] = n10 * m01 + n11 * m11 + n12 * m21 + n13 * m31;
    +281                 this.matrix[1][2] = n10 * m02 + n11 * m12 + n12 * m22 + n13 * m32;
    +282                 this.matrix[1][3] = n10 * m03 + n11 * m13 + n12 * m23 + n13 * m33;
    +283 
    +284                 this.matrix[2][0] = n20 * m00 + n21 * m10 + n22 * m20 + n23 * m30;
    +285                 this.matrix[2][1] = n20 * m01 + n21 * m11 + n22 * m21 + n23 * m31;
    +286                 this.matrix[2][2] = n20 * m02 + n21 * m12 + n22 * m22 + n23 * m32;
    +287                 this.matrix[2][3] = n20 * m03 + n21 * m13 + n22 * m23 + n23 * m33;
    +288 
    +289                 return this;
    +290             },
    +291             /**
    +292              * Pre multiplies this matrix by a given matrix.
    +293              *
    +294              * @param m {CAAT.Matrix3} a CAAT.Matrix3 object.
    +295              *
    +296              * @return this
    +297              */
    +298             premultiply:function (m) {
    +299                 var n = this.getClone();
    +300 
    +301                 var nm = n.matrix;
    +302                 var n00 = nm[0][0];
    +303                 var n01 = nm[0][1];
    +304                 var n02 = nm[0][2];
    +305                 var n03 = nm[0][3];
    +306 
    +307                 var n10 = nm[1][0];
    +308                 var n11 = nm[1][1];
    +309                 var n12 = nm[1][2];
    +310                 var n13 = nm[1][3];
    +311 
    +312                 var n20 = nm[2][0];
    +313                 var n21 = nm[2][1];
    +314                 var n22 = nm[2][2];
    +315                 var n23 = nm[2][3];
    +316 
    +317                 var n30 = nm[3][0];
    +318                 var n31 = nm[3][1];
    +319                 var n32 = nm[3][2];
    +320                 var n33 = nm[3][3];
    +321 
    +322                 var mm = m.matrix;
    +323                 var m00 = mm[0][0];
    +324                 var m01 = mm[0][1];
    +325                 var m02 = mm[0][2];
    +326                 var m03 = mm[0][3];
    +327 
    +328                 var m10 = mm[1][0];
    +329                 var m11 = mm[1][1];
    +330                 var m12 = mm[1][2];
    +331                 var m13 = mm[1][3];
    +332 
    +333                 var m20 = mm[2][0];
    +334                 var m21 = mm[2][1];
    +335                 var m22 = mm[2][2];
    +336                 var m23 = mm[2][3];
    +337 
    +338                 var m30 = mm[3][0];
    +339                 var m31 = mm[3][1];
    +340                 var m32 = mm[3][2];
    +341                 var m33 = mm[3][3];
    +342 
    +343                 this.matrix[0][0] = n00 * m00 + n01 * m10 + n02 * m20;
    +344                 this.matrix[0][1] = n00 * m01 + n01 * m11 + n02 * m21;
    +345                 this.matrix[0][2] = n00 * m02 + n01 * m12 + n02 * m22;
    +346                 this.matrix[0][3] = n00 * m03 + n01 * m13 + n02 * m23 + n03;
    +347                 this.matrix[1][0] = n10 * m00 + n11 * m10 + n12 * m20;
    +348                 this.matrix[1][1] = n10 * m01 + n11 * m11 + n12 * m21;
    +349                 this.matrix[1][2] = n10 * m02 + n11 * m12 + n12 * m22;
    +350                 this.matrix[1][3] = n10 * m03 + n11 * m13 + n12 * m23 + n13;
    +351                 this.matrix[2][0] = n20 * m00 + n21 * m10 + n22 * m20;
    +352                 this.matrix[2][1] = n20 * m01 + n21 * m11 + n22 * m21;
    +353                 this.matrix[2][2] = n20 * m02 + n21 * m12 + n22 * m22;
    +354                 this.matrix[2][3] = n20 * m03 + n21 * m13 + n22 * m23 + n23;
    +355 
    +356                 return this;
    +357             },
    +358             /**
    +359              * Set this matrix translation values to be the given parameters.
    +360              *
    +361              * @param x {number} x component of translation point.
    +362              * @param y {number} y component of translation point.
    +363              * @param z {number} z component of translation point.
    +364              *
    +365              * @return this
    +366              */
    +367             setTranslate:function (x, y, z) {
    +368                 this.identity();
    +369                 this.matrix[0][3] = x;
    +370                 this.matrix[1][3] = y;
    +371                 this.matrix[2][3] = z;
    +372                 return this;
    +373             },
    +374             /**
    +375              * Create a translation matrix.
    +376              * @param x {number}
    +377              * @param y {number}
    +378              * @param z {number}
    +379              * @return {CAAT.Matrix3} a new matrix.
    +380              */
    +381             translate:function (x, y, z) {
    +382                 var m = new CAAT.Math.Matrix3();
    +383                 m.setTranslate(x, y, z);
    +384                 return m;
    +385             },
    +386             setScale:function (sx, sy, sz) {
    +387                 this.identity();
    +388                 this.matrix[0][0] = sx;
    +389                 this.matrix[1][1] = sy;
    +390                 this.matrix[2][2] = sz;
    +391                 return this;
    +392             },
    +393             scale:function (sx, sy, sz) {
    +394                 var m = new CAAT.Math.Matrix3();
    +395                 m.setScale(sx, sy, sz);
    +396                 return m;
    +397             },
    +398             /**
    +399              * Set this matrix as the rotation matrix around the given axes.
    +400              * @param xy {number} radians of rotation around z axis.
    +401              * @param xz {number} radians of rotation around y axis.
    +402              * @param yz {number} radians of rotation around x axis.
    +403              *
    +404              * @return this
    +405              */
    +406             rotateModelView:function (xy, xz, yz) {
    +407                 var sxy = Math.sin(xy);
    +408                 var sxz = Math.sin(xz);
    +409                 var syz = Math.sin(yz);
    +410                 var cxy = Math.cos(xy);
    +411                 var cxz = Math.cos(xz);
    +412                 var cyz = Math.cos(yz);
    +413 
    +414                 this.matrix[0][0] = cxz * cxy;
    +415                 this.matrix[0][1] = -cxz * sxy;
    +416                 this.matrix[0][2] = sxz;
    +417                 this.matrix[0][3] = 0;
    +418                 this.matrix[1][0] = syz * sxz * cxy + sxy * cyz;
    +419                 this.matrix[1][1] = cyz * cxy - syz * sxz * sxy;
    +420                 this.matrix[1][2] = -syz * cxz;
    +421                 this.matrix[1][3] = 0;
    +422                 this.matrix[2][0] = syz * sxy - cyz * sxz * cxy;
    +423                 this.matrix[2][1] = cyz * sxz * sxy + syz * cxy;
    +424                 this.matrix[2][2] = cyz * cxz;
    +425                 this.matrix[2][3] = 0;
    +426                 this.matrix[3][0] = 0;
    +427                 this.matrix[3][1] = 0;
    +428                 this.matrix[3][2] = 0;
    +429                 this.matrix[3][3] = 1;
    +430 
    +431                 return this;
    +432             },
    +433             /**
    +434              * Copy a given matrix values into this one's.
    +435              * @param m {CAAT.Matrix} a matrix
    +436              *
    +437              * @return this
    +438              */
    +439             copy:function (m) {
    +440                 for (var i = 0; i < 4; i++) {
    +441                     for (var j = 0; j < 4; j++) {
    +442                         this.matrix[i][j] = m.matrix[i][j];
    +443                     }
    +444                 }
    +445 
    +446                 return this;
    +447             },
    +448             /**
    +449              * Calculate this matrix's determinant.
    +450              * @return {number} matrix determinant.
    +451              */
    +452             calculateDeterminant:function () {
    +453 
    +454                 var mm = this.matrix;
    +455                 var m11 = mm[0][0], m12 = mm[0][1], m13 = mm[0][2], m14 = mm[0][3],
    +456                     m21 = mm[1][0], m22 = mm[1][1], m23 = mm[1][2], m24 = mm[1][3],
    +457                     m31 = mm[2][0], m32 = mm[2][1], m33 = mm[2][2], m34 = mm[2][3],
    +458                     m41 = mm[3][0], m42 = mm[3][1], m43 = mm[3][2], m44 = mm[3][3];
    +459 
    +460                 return  m14 * m22 * m33 * m41 +
    +461                     m12 * m24 * m33 * m41 +
    +462                     m14 * m23 * m31 * m42 +
    +463                     m13 * m24 * m31 * m42 +
    +464 
    +465                     m13 * m21 * m34 * m42 +
    +466                     m11 * m23 * m34 * m42 +
    +467                     m14 * m21 * m32 * m43 +
    +468                     m11 * m24 * m32 * m43 +
    +469 
    +470                     m13 * m22 * m31 * m44 +
    +471                     m12 * m23 * m31 * m44 +
    +472                     m12 * m21 * m33 * m44 +
    +473                     m11 * m22 * m33 * m44 +
    +474 
    +475                     m14 * m23 * m32 * m41 -
    +476                     m13 * m24 * m32 * m41 -
    +477                     m13 * m22 * m34 * m41 -
    +478                     m12 * m23 * m34 * m41 -
    +479 
    +480                     m14 * m21 * m33 * m42 -
    +481                     m11 * m24 * m33 * m42 -
    +482                     m14 * m22 * m31 * m43 -
    +483                     m12 * m24 * m31 * m43 -
    +484 
    +485                     m12 * m21 * m34 * m43 -
    +486                     m11 * m22 * m34 * m43 -
    +487                     m13 * m21 * m32 * m44 -
    +488                     m11 * m23 * m32 * m44;
    +489             },
    +490             /**
    +491              * Return a new matrix which is this matrix's inverse matrix.
    +492              * @return {CAAT.Matrix3} a new matrix.
    +493              */
    +494             getInverse:function () {
    +495                 var mm = this.matrix;
    +496                 var m11 = mm[0][0], m12 = mm[0][1], m13 = mm[0][2], m14 = mm[0][3],
    +497                     m21 = mm[1][0], m22 = mm[1][1], m23 = mm[1][2], m24 = mm[1][3],
    +498                     m31 = mm[2][0], m32 = mm[2][1], m33 = mm[2][2], m34 = mm[2][3],
    +499                     m41 = mm[3][0], m42 = mm[3][1], m43 = mm[3][2], m44 = mm[3][3];
    +500 
    +501                 var m2 = new CAAT.Math.Matrix3();
    +502                 m2.matrix[0][0] = m23 * m34 * m42 + m24 * m32 * m43 + m22 * m33 * m44 - m24 * m33 * m42 - m22 * m34 * m43 - m23 * m32 * m44;
    +503                 m2.matrix[0][1] = m14 * m33 * m42 + m12 * m34 * m43 + m13 * m32 * m44 - m12 * m33 * m44 - m13 * m34 * m42 - m14 * m32 * m43;
    +504                 m2.matrix[0][2] = m13 * m24 * m42 + m12 * m23 * m44 + m14 * m22 * m43 - m12 * m24 * m43 - m13 * m22 * m44 - m14 * m23 * m42;
    +505                 m2.matrix[0][3] = m14 * m23 * m32 + m12 * m24 * m33 + m13 * m22 * m34 - m13 * m24 * m32 - m14 * m22 * m33 - m12 * m23 * m34;
    +506 
    +507                 m2.matrix[1][0] = m24 * m33 * m41 + m21 * m34 * m43 + m23 * m31 * m44 - m23 * m34 * m41 - m24 * m31 * m43 - m21 * m33 * m44;
    +508                 m2.matrix[1][1] = m13 * m34 * m41 + m14 * m31 * m43 + m11 * m33 * m44 - m14 * m33 * m41 - m11 * m34 * m43 - m13 * m31 * m44;
    +509                 m2.matrix[1][2] = m14 * m23 * m41 + m11 * m24 * m43 + m13 * m21 * m44 - m13 * m24 * m41 - m14 * m21 * m43 - m11 * m23 * m44;
    +510                 m2.matrix[1][3] = m13 * m24 * m31 + m14 * m21 * m33 + m11 * m23 * m34 - m14 * m23 * m31 - m11 * m24 * m33 - m13 * m21 * m34;
    +511 
    +512                 m2.matrix[2][0] = m22 * m34 * m41 + m24 * m31 * m42 + m21 * m32 * m44 - m24 * m32 * m41 - m21 * m34 * m42 - m22 * m31 * m44;
    +513                 m2.matrix[2][1] = m14 * m32 * m41 + m11 * m34 * m42 + m12 * m31 * m44 - m11 * m32 * m44 - m12 * m34 * m41 - m14 * m31 * m42;
    +514                 m2.matrix[2][2] = m13 * m24 * m41 + m14 * m21 * m42 + m11 * m22 * m44 - m14 * m22 * m41 - m11 * m24 * m42 - m12 * m21 * m44;
    +515                 m2.matrix[2][3] = m14 * m22 * m31 + m11 * m24 * m32 + m12 * m21 * m34 - m11 * m22 * m34 - m12 * m24 * m31 - m14 * m21 * m32;
    +516 
    +517                 m2.matrix[3][0] = m23 * m32 * m41 + m21 * m33 * m42 + m22 * m31 * m43 - m22 * m33 * m41 - m23 * m31 * m42 - m21 * m32 * m43;
    +518                 m2.matrix[3][1] = m12 * m33 * m41 + m13 * m31 * m42 + m11 * m32 * m43 - m13 * m32 * m41 - m11 * m33 * m42 - m12 * m31 * m43;
    +519                 m2.matrix[3][2] = m13 * m22 * m41 + m11 * m23 * m42 + m12 * m21 * m43 - m11 * m22 * m43 - m12 * m23 * m41 - m13 * m21 * m42;
    +520                 m2.matrix[3][3] = m12 * m23 * m31 + m13 * m21 * m32 + m11 * m22 * m33 - m13 * m22 * m31 - m11 * m23 * m32 - m12 * m21 * m33;
    +521 
    +522                 return m2.multiplyScalar(1 / this.calculateDeterminant());
    +523             },
    +524             /**
    +525              * Multiply this matrix by a scalar.
    +526              * @param scalar {number} scalar value
    +527              *
    +528              * @return this
    +529              */
    +530             multiplyScalar:function (scalar) {
    +531                 var i, j;
    +532 
    +533                 for (i = 0; i < 4; i++) {
    +534                     for (j = 0; j < 4; j++) {
    +535                         this.matrix[i][j] *= scalar;
    +536                     }
    +537                 }
    +538 
    +539                 return this;
    +540             }
    +541 
    +542         }
    +543     }
    +544 
    +545 });
    +546 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Point.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Point.js.html new file mode 100644 index 00000000..65077773 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Point.js.html @@ -0,0 +1,243 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  **/
    +  5 CAAT.Module({
    +  6 
    +  7     /**
    +  8      * @name Point
    +  9      * @memberOf CAAT.Math
    + 10      * @constructor
    + 11      */
    + 12 
    + 13     defines:"CAAT.Math.Point",
    + 14     aliases:["CAAT.Point"],
    + 15     extendsWith:function () {
    + 16         return {
    + 17 
    + 18             /**
    + 19              * @lends CAAT.Math.Point.prototype
    + 20              */
    + 21 
    + 22 
    + 23             /**
    + 24              * point x coordinate.
    + 25              */
    + 26             x:0,
    + 27 
    + 28             /**
    + 29              * point y coordinate.
    + 30              */
    + 31             y:0,
    + 32 
    + 33             /**
    + 34              * point z coordinate.
    + 35              */
    + 36             z:0,
    + 37 
    + 38             __init:function (xpos, ypos, zpos) {
    + 39                 this.x = xpos;
    + 40                 this.y = ypos;
    + 41                 this.z = zpos || 0;
    + 42                 return this;
    + 43             },
    + 44 
    + 45             /**
    + 46              * Sets this point coordinates.
    + 47              * @param x {number}
    + 48              * @param y {number}
    + 49              * @param z {number=}
    + 50              *
    + 51              * @return this
    + 52              */
    + 53             set:function (x, y, z) {
    + 54                 this.x = x;
    + 55                 this.y = y;
    + 56                 this.z = z || 0;
    + 57                 return this;
    + 58             },
    + 59             /**
    + 60              * Create a new CAAT.Point equal to this one.
    + 61              * @return {CAAT.Point}
    + 62              */
    + 63             clone:function () {
    + 64                 var p = new CAAT.Math.Point(this.x, this.y, this.z);
    + 65                 return p;
    + 66             },
    + 67             /**
    + 68              * Translate this point to another position. The final point will be (point.x+x, point.y+y)
    + 69              * @param x {number}
    + 70              * @param y {number}
    + 71              *
    + 72              * @return this
    + 73              */
    + 74             translate:function (x, y, z) {
    + 75                 this.x += x;
    + 76                 this.y += y;
    + 77                 this.z += z;
    + 78 
    + 79                 return this;
    + 80             },
    + 81             /**
    + 82              * Translate this point to another point.
    + 83              * @param aPoint {CAAT.Point}
    + 84              * @return this
    + 85              */
    + 86             translatePoint:function (aPoint) {
    + 87                 this.x += aPoint.x;
    + 88                 this.y += aPoint.y;
    + 89                 this.z += aPoint.z;
    + 90                 return this;
    + 91             },
    + 92             /**
    + 93              * Substract a point from this one.
    + 94              * @param aPoint {CAAT.Point}
    + 95              * @return this
    + 96              */
    + 97             subtract:function (aPoint) {
    + 98                 this.x -= aPoint.x;
    + 99                 this.y -= aPoint.y;
    +100                 this.z -= aPoint.z;
    +101                 return this;
    +102             },
    +103             /**
    +104              * Multiply this point by a scalar.
    +105              * @param factor {number}
    +106              * @return this
    +107              */
    +108             multiply:function (factor) {
    +109                 this.x *= factor;
    +110                 this.y *= factor;
    +111                 this.z *= factor;
    +112                 return this;
    +113             },
    +114             /**
    +115              * Rotate this point by an angle. The rotation is held by (0,0) coordinate as center.
    +116              * @param angle {number}
    +117              * @return this
    +118              */
    +119             rotate:function (angle) {
    +120                 var x = this.x, y = this.y;
    +121                 this.x = x * Math.cos(angle) - Math.sin(angle) * y;
    +122                 this.y = x * Math.sin(angle) + Math.cos(angle) * y;
    +123                 this.z = 0;
    +124                 return this;
    +125             },
    +126             /**
    +127              *
    +128              * @param angle {number}
    +129              * @return this
    +130              */
    +131             setAngle:function (angle) {
    +132                 var len = this.getLength();
    +133                 this.x = Math.cos(angle) * len;
    +134                 this.y = Math.sin(angle) * len;
    +135                 this.z = 0;
    +136                 return this;
    +137             },
    +138             /**
    +139              *
    +140              * @param length {number}
    +141              * @return this
    +142              */
    +143             setLength:function (length) {
    +144                 var len = this.getLength();
    +145                 if (len)this.multiply(length / len);
    +146                 else this.x = this.y = this.z = length;
    +147                 return this;
    +148             },
    +149             /**
    +150              * Normalize this point, that is, both set coordinates proportionally to values raning 0..1
    +151              * @return this
    +152              */
    +153             normalize:function () {
    +154                 var len = this.getLength();
    +155                 this.x /= len;
    +156                 this.y /= len;
    +157                 this.z /= len;
    +158                 return this;
    +159             },
    +160             /**
    +161              * Return the angle from -Pi to Pi of this point.
    +162              * @return {number}
    +163              */
    +164             getAngle:function () {
    +165                 return Math.atan2(this.y, this.x);
    +166             },
    +167             /**
    +168              * Set this point coordinates proportinally to a maximum value.
    +169              * @param max {number}
    +170              * @return this
    +171              */
    +172             limit:function (max) {
    +173                 var aLenthSquared = this.getLengthSquared();
    +174                 if (aLenthSquared + 0.01 > max * max) {
    +175                     var aLength = Math.sqrt(aLenthSquared);
    +176                     this.x = (this.x / aLength) * max;
    +177                     this.y = (this.y / aLength) * max;
    +178                     this.z = (this.z / aLength) * max;
    +179                 }
    +180                 return this;
    +181             },
    +182             /**
    +183              * Get this point's lenght.
    +184              * @return {number}
    +185              */
    +186             getLength:function () {
    +187                 var length = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
    +188                 if (length < 0.005 && length > -0.005) return 0.000001;
    +189                 return length;
    +190 
    +191             },
    +192             /**
    +193              * Get this point's squared length.
    +194              * @return {number}
    +195              */
    +196             getLengthSquared:function () {
    +197                 var lengthSquared = this.x * this.x + this.y * this.y + this.z * this.z;
    +198                 if (lengthSquared < 0.005 && lengthSquared > -0.005) return 0;
    +199                 return lengthSquared;
    +200             },
    +201             /**
    +202              * Get the distance between two points.
    +203              * @param point {CAAT.Point}
    +204              * @return {number}
    +205              */
    +206             getDistance:function (point) {
    +207                 var deltaX = this.x - point.x;
    +208                 var deltaY = this.y - point.y;
    +209                 var deltaZ = this.z - point.z;
    +210                 return Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
    +211             },
    +212             /**
    +213              * Get the squared distance between two points.
    +214              * @param point {CAAT.Point}
    +215              * @return {number}
    +216              */
    +217             getDistanceSquared:function (point) {
    +218                 var deltaX = this.x - point.x;
    +219                 var deltaY = this.y - point.y;
    +220                 var deltaZ = this.z - point.z;
    +221                 return deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;
    +222             },
    +223             /**
    +224              * Get a string representation.
    +225              * @return {string}
    +226              */
    +227             toString:function () {
    +228                 return "(CAAT.Math.Point)" +
    +229                     " x:" + String(Math.round(Math.floor(this.x * 10)) / 10) +
    +230                     " y:" + String(Math.round(Math.floor(this.y * 10)) / 10) +
    +231                     " z:" + String(Math.round(Math.floor(this.z * 10)) / 10);
    +232             }
    +233         }
    +234     }
    +235 });
    +236 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Rectangle.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Rectangle.js.html new file mode 100644 index 00000000..5056c20a --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Math_Rectangle.js.html @@ -0,0 +1,226 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  */
    +  5 
    +  6 
    +  7 CAAT.Module( {
    +  8 
    +  9     /**
    + 10      * @name Rectangle
    + 11      * @memberOf CAAT.Math
    + 12      * @constructor
    + 13      */
    + 14 
    + 15 
    + 16     defines:        "CAAT.Math.Rectangle",
    + 17     aliases:        ["CAAT.Rectangle"],
    + 18     extendsWith:    function() {
    + 19         return {
    + 20 
    + 21             /**
    + 22              * @lends CAAT.Math.Rectangle.prototype
    + 23              */
    + 24 
    + 25             __init : function( x,y,w,h ) {
    + 26                 if ( arguments.length!==4 ) {
    + 27                     this.setEmpty();
    + 28                 } else {
    + 29                     this.setLocation(x,y);
    + 30                     this.setDimension(w,h);
    + 31                 }
    + 32             },
    + 33 
    + 34             /**
    + 35              * Rectangle x position.
    + 36              */
    + 37             x:		0,
    + 38 
    + 39             /**
    + 40              * Rectangle y position.
    + 41              */
    + 42             y:		0,
    + 43 
    + 44             /**
    + 45              * Rectangle x1 position.
    + 46              */
    + 47             x1:		0,
    + 48 
    + 49             /**
    + 50              * Rectangle y1 position.
    + 51              */
    + 52             y1:		0,
    + 53 
    + 54             /**
    + 55              * Rectangle width.
    + 56              */
    + 57             width:	-1,
    + 58 
    + 59             /**
    + 60              * Rectangle height.
    + 61              */
    + 62             height:	-1,
    + 63 
    + 64             setEmpty : function() {
    + 65                 this.width=     -1;
    + 66                 this.height=    -1;
    + 67                 this.x=         0;
    + 68                 this.y=         0;
    + 69                 this.x1=        0;
    + 70                 this.y1=        0;
    + 71                 return this;
    + 72             },
    + 73             /**
    + 74              * Set this rectangle's location.
    + 75              * @param x {number}
    + 76              * @param y {number}
    + 77              */
    + 78             setLocation: function( x,y ) {
    + 79                 this.x= x;
    + 80                 this.y= y;
    + 81                 this.x1= this.x+this.width;
    + 82                 this.y1= this.y+this.height;
    + 83                 return this;
    + 84             },
    + 85             /**
    + 86              * Set this rectangle's dimension.
    + 87              * @param w {number}
    + 88              * @param h {number}
    + 89              */
    + 90             setDimension : function( w,h ) {
    + 91                 this.width= w;
    + 92                 this.height= h;
    + 93                 this.x1= this.x+this.width;
    + 94                 this.y1= this.y+this.height;
    + 95                 return this;
    + 96             },
    + 97             setBounds : function( x,y,w,h ) {
    + 98                 this.setLocation( x, y );
    + 99                 this.setDimension( w, h );
    +100                 return this;
    +101             },
    +102             /**
    +103              * Return whether the coordinate is inside this rectangle.
    +104              * @param px {number}
    +105              * @param py {number}
    +106              *
    +107              * @return {boolean}
    +108              */
    +109             contains : function(px,py) {
    +110                 //return px>=0 && px<this.width && py>=0 && py<this.height;
    +111                 return px>=this.x && px<this.x1 && py>=this.y && py<this.y1;
    +112             },
    +113             /**
    +114              * Return whether this rectangle is empty, that is, has zero dimension.
    +115              * @return {boolean}
    +116              */
    +117             isEmpty : function() {
    +118                 return this.width===-1 && this.height===-1;
    +119             },
    +120             /**
    +121              * Set this rectangle as the union of this rectangle and the given point.
    +122              * @param px {number}
    +123              * @param py {number}
    +124              */
    +125             union : function(px,py) {
    +126 
    +127                 if ( this.isEmpty() ) {
    +128                     this.x= px;
    +129                     this.x1= px;
    +130                     this.y= py;
    +131                     this.y1= py;
    +132                     this.width=0;
    +133                     this.height=0;
    +134                     return;
    +135                 }
    +136 
    +137                 this.x1= this.x+this.width;
    +138                 this.y1= this.y+this.height;
    +139 
    +140                 if ( py<this.y ) {
    +141                     this.y= py;
    +142                 }
    +143                 if ( px<this.x ) {
    +144                     this.x= px;
    +145                 }
    +146                 if ( py>this.y1 ) {
    +147                     this.y1= py;
    +148                 }
    +149                 if ( px>this.x1 ){
    +150                     this.x1= px;
    +151                 }
    +152 
    +153                 this.width= this.x1-this.x;
    +154                 this.height= this.y1-this.y;
    +155             },
    +156             unionRectangle : function( rectangle ) {
    +157                 this.union( rectangle.x , rectangle.y  );
    +158                 this.union( rectangle.x1, rectangle.y  );
    +159                 this.union( rectangle.x,  rectangle.y1 );
    +160                 this.union( rectangle.x1, rectangle.y1 );
    +161                 return this;
    +162             },
    +163             intersects : function( r ) {
    +164                 if ( r.isEmpty() || this.isEmpty() ) {
    +165                     return false;
    +166                 }
    +167 
    +168                 if ( r.x1<= this.x ) {
    +169                     return false;
    +170                 }
    +171                 if ( r.x >= this.x1 ) {
    +172                     return false;
    +173                 }
    +174                 if ( r.y1<= this.y ) {
    +175                     return false;
    +176                 }
    +177 
    +178                 return r.y < this.y1;
    +179             },
    +180 
    +181             intersectsRect : function( x,y,w,h ) {
    +182                 if ( -1===w || -1===h ) {
    +183                     return false;
    +184                 }
    +185 
    +186                 var x1= x+w-1;
    +187                 var y1= y+h-1;
    +188 
    +189                 if ( x1< this.x ) {
    +190                     return false;
    +191                 }
    +192                 if ( x > this.x1 ) {
    +193                     return false;
    +194                 }
    +195                 if ( y1< this.y ) {
    +196                     return false;
    +197                 }
    +198                 return y <= this.y1;
    +199 
    +200             },
    +201 
    +202             intersect : function( i, r ) {
    +203                 if ( typeof r==='undefined' ) {
    +204                     r= new CAAT.Math.Rectangle();
    +205                 }
    +206 
    +207                 r.x= Math.max( this.x, i.x );
    +208                 r.y= Math.max( this.y, i.y );
    +209                 r.x1=Math.min( this.x1, i.x1 );
    +210                 r.y1=Math.min( this.y1, i.y1 );
    +211                 r.width= r.x1-r.x;
    +212                 r.height=r.y1-r.y;
    +213 
    +214                 return r;
    +215             }
    +216         }
    +217 	}
    +218 });
    +219 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Audio_AudioManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Audio_AudioManager.js.html new file mode 100644 index 00000000..706bd098 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Audio_AudioManager.js.html @@ -0,0 +1,570 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * Sound implementation.
    +  5  */
    +  6 
    +  7 CAAT.Module({
    +  8 
    +  9     /**
    + 10      * @name Module
    + 11      * @memberOf CAAT
    + 12      * @namespace
    + 13      */
    + 14 
    + 15     /**
    + 16      * @name Audio
    + 17      * @memberOf CAAT.Module
    + 18      * @namespace
    + 19      */
    + 20 
    + 21     /**
    + 22      * @name AudioManager
    + 23      * @memberOf CAAT.Module.Audio
    + 24      * @constructor
    + 25      */
    + 26 
    + 27     defines:"CAAT.Module.Audio.AudioManager",
    + 28     extendsWith:function () {
    + 29         return {
    + 30 
    + 31             /**
    + 32              * @lends CAAT.Module.Audio.AudioManager.prototype
    + 33              */
    + 34 
    + 35             __init:function () {
    + 36                 this.isFirefox= navigator.userAgent.match(/Firefox/g)!==null;
    + 37                 return this;
    + 38             },
    + 39 
    + 40             isFirefox : false,
    + 41 
    + 42             /**
    + 43              * The only background music audio channel.
    + 44              */
    + 45             musicChannel: null,
    + 46 
    + 47             /**
    + 48              * Is music enabled ?
    + 49              */
    + 50             musicEnabled:true,
    + 51 
    + 52             /**
    + 53              * Are FX sounds enabled ?
    + 54              */
    + 55             fxEnabled:true,
    + 56 
    + 57             /**
    + 58              * A collection of Audio objects.
    + 59              */
    + 60             audioCache:null,
    + 61 
    + 62             /**
    + 63              * A cache of empty Audio objects.
    + 64              */
    + 65             channels:null,
    + 66 
    + 67             /**
    + 68              * Currently used Audio objects.
    + 69              */
    + 70             workingChannels:null,
    + 71 
    + 72             /**
    + 73              * Currently looping Audio objects.
    + 74              */
    + 75             loopingChannels:[],
    + 76 
    + 77             /**
    + 78              * available formats for audio elements.
    + 79              * the system will load audio files with the extensions in this preferred order.
    + 80              */
    + 81             audioFormatExtensions : [
    + 82                 'ogg',
    + 83                 'wav',
    + 84                 'x-wav',
    + 85                 'mp3'
    + 86             ],
    + 87 
    + 88             currentAudioFormatExtension : 'ogg',
    + 89 
    + 90             /**
    + 91              * Audio formats.
    + 92              * @dict
    + 93              */
    + 94             audioTypes:{               // supported audio formats. Don't remember where i took them from :S
    + 95                 'ogg':  'audio/ogg',
    + 96                 'mp3':  'audio/mpeg;',
    + 97                 'wav':  'audio/wav',
    + 98                 'x-wav':'audio/x-wav',
    + 99                 'mp4':  'audio/mp4"'
    +100             },
    +101 
    +102             /**
    +103              * Initializes the sound subsystem by creating a fixed number of Audio channels.
    +104              * Every channel registers a handler for sound playing finalization. If a callback is set, the
    +105              * callback function will be called with the associated sound id in the cache.
    +106              *
    +107              * @param numChannels {number} number of channels to pre-create. 8 by default.
    +108              *
    +109              * @return this.
    +110              */
    +111             initialize:function (numChannels ) {
    +112 
    +113                 this.setAudioFormatExtensions( this.audioFormatExtensions );
    +114 
    +115                 this.audioCache = [];
    +116                 this.channels = [];
    +117                 this.workingChannels = [];
    +118 
    +119                 for (var i = 0; i <= numChannels; i++) {
    +120                     var channel = document.createElement('audio');
    +121 
    +122                     if (null !== channel) {
    +123                         channel.finished = -1;
    +124                         this.channels.push(channel);
    +125                         var me = this;
    +126                         channel.addEventListener(
    +127                             'ended',
    +128                             // on sound end, set channel to available channels list.
    +129                             function (audioEvent) {
    +130                                 var target = audioEvent.target;
    +131                                 var i;
    +132 
    +133                                 // remove from workingChannels
    +134                                 for (i = 0; i < me.workingChannels.length; i++) {
    +135                                     if (me.workingChannels[i] === target) {
    +136                                         me.workingChannels.splice(i, 1);
    +137                                         break;
    +138                                     }
    +139                                 }
    +140 
    +141                                 if (target.caat_callback) {
    +142                                     target.caat_callback(target.caat_id);
    +143                                 }
    +144 
    +145                                 // set back to channels.
    +146                                 me.channels.push(target);
    +147                             },
    +148                             false
    +149                         );
    +150                     }
    +151                 }
    +152 
    +153                 this.musicChannel= this.channels.pop();
    +154 
    +155                 return this;
    +156             },
    +157 
    +158             setAudioFormatExtensions : function( formats ) {
    +159                 this.audioFormatExtensions= formats;
    +160                 this.__setCurrentAudioFormatExtension();
    +161                 return this;
    +162             },
    +163 
    +164             __setCurrentAudioFormatExtension : function( ) {
    +165 
    +166                 var audio= new Audio();
    +167 
    +168                 for( var i= 0, l=this.audioFormatExtensions.length; i<l; i+=1 ) {
    +169                     var res= audio.canPlayType( this.audioTypes[this.audioFormatExtensions[i]]).toLowerCase();
    +170                     if ( res!=="no" && res!=="" ) {
    +171                         this.currentAudioFormatExtension= this.audioFormatExtensions[i];
    +172                         console.log("Audio type set to: "+this.currentAudioFormatExtension);
    +173                         return;
    +174                     }
    +175                 }
    +176 
    +177                 this.currentAudioFormatExtension= null;
    +178             },
    +179 
    +180             __getAudioUrl : function( url ) {
    +181 
    +182                 if ( this.currentAudioFormatExtension===null ) {
    +183                     return url;
    +184                 }
    +185 
    +186                 var lio= url.lastIndexOf( "." );
    +187                 if ( lio<0 ) {
    +188                     console.log("Audio w/o extension: "+url);
    +189                     lio= url.length()-1;
    +190                 }
    +191 
    +192                 var uri= url.substring( 0, lio+1 ) + this.currentAudioFormatExtension;
    +193                 return uri;
    +194             },
    +195 
    +196             /**
    +197              * Tries to add an audio tag to the available list of valid audios. The audio is described by a url.
    +198              * @param id {object} an object to associate the audio element (if suitable to be played).
    +199              * @param url {string} a string describing an url.
    +200              * @param endplaying_callback {function} callback to be called upon sound end.
    +201              *
    +202              * @return {boolean} a boolean indicating whether the browser can play this resource.
    +203              *
    +204              * @private
    +205              */
    +206             addAudioFromURL:function (id, url, endplaying_callback) {
    +207                 var audio = document.createElement('audio');
    +208 
    +209                 if (null !== audio) {
    +210 
    +211                     audio.src = this.__getAudioUrl(url);
    +212                     console.log("Loading audio: "+audio.src);
    +213                     audio.preload = "auto";
    +214                     audio.load();
    +215                     if (endplaying_callback) {
    +216                         audio.caat_callback = endplaying_callback;
    +217                         audio.caat_id = id;
    +218                     }
    +219                     this.audioCache.push({ id:id, audio:audio });
    +220 
    +221                     return true;
    +222                 }
    +223 
    +224                 return false;
    +225             },
    +226             /**
    +227              * Tries to add an audio tag to the available list of valid audios. The audio element comes from
    +228              * an HTMLAudioElement.
    +229              * @param id {object} an object to associate the audio element (if suitable to be played).
    +230              * @param audio {HTMLAudioElement} a DOM audio node.
    +231              * @param endplaying_callback {function} callback to be called upon sound end.
    +232              *
    +233              * @return {boolean} a boolean indicating whether the browser can play this resource.
    +234              *
    +235              * @private
    +236              */
    +237             addAudioFromDomNode:function (id, audio, endplaying_callback) {
    +238 
    +239                 var extension = audio.src.substr(audio.src.lastIndexOf('.') + 1);
    +240                 if (audio.canPlayType(this.audioTypes[extension])) {
    +241                     if (endplaying_callback) {
    +242                         audio.caat_callback = endplaying_callback;
    +243                         audio.caat_id = id;
    +244                     }
    +245                     this.audioCache.push({ id:id, audio:audio });
    +246 
    +247                     return true;
    +248                 }
    +249 
    +250                 return false;
    +251             },
    +252             /**
    +253              * Adds an elements to the audio cache.
    +254              * @param id {object} an object to associate the audio element (if suitable to be played).
    +255              * @param element {URL|HTMLElement} an url or html audio tag.
    +256              * @param endplaying_callback {function} callback to be called upon sound end.
    +257              *
    +258              * @return {boolean} a boolean indicating whether the browser can play this resource.
    +259              *
    +260              * @private
    +261              */
    +262             addAudioElement:function (id, element, endplaying_callback) {
    +263                 if (typeof element === "string") {
    +264                     return this.addAudioFromURL(id, element, endplaying_callback);
    +265                 } else {
    +266                     try {
    +267                         if (element instanceof HTMLAudioElement) {
    +268                             return this.addAudioFromDomNode(id, element, endplaying_callback);
    +269                         }
    +270                     }
    +271                     catch (e) {
    +272                     }
    +273                 }
    +274 
    +275                 return false;
    +276             },
    +277             /**
    +278              * creates an Audio object and adds it to the audio cache.
    +279              * This function expects audio data described by two elements, an id and an object which will
    +280              * describe an audio element to be associated with the id. The object will be of the form
    +281              * array, dom node or a url string.
    +282              *
    +283              * <p>
    +284              * The audio element can be one of the two forms:
    +285              *
    +286              * <ol>
    +287              *  <li>Either an HTMLAudioElement/Audio object or a string url.
    +288              *  <li>An array of elements of the previous form.
    +289              * </ol>
    +290              *
    +291              * <p>
    +292              * When the audio attribute is an array, this function will iterate throught the array elements
    +293              * until a suitable audio element to be played is found. When this is the case, the other array
    +294              * elements won't be taken into account. The valid form of using this addAudio method will be:
    +295              *
    +296              * <p>
    +297              * 1.<br>
    +298              * addAudio( id, url } ). In this case, if the resource pointed by url is
    +299              * not suitable to be played (i.e. a call to the Audio element's canPlayType method return 'no')
    +300              * no resource will be added under such id, so no sound will be played when invoking the play(id)
    +301              * method.
    +302              * <p>
    +303              * 2.<br>
    +304              * addAudio( id, dom_audio_tag ). In this case, the same logic than previous case is applied, but
    +305              * this time, the parameter url is expected to be an audio tag present in the html file.
    +306              * <p>
    +307              * 3.<br>
    +308              * addAudio( id, [array_of_url_or_domaudiotag] ). In this case, the function tries to locate a valid
    +309              * resource to be played in any of the elements contained in the array. The array element's can
    +310              * be any type of case 1 and 2. As soon as a valid resource is found, it will be associated to the
    +311              * id in the valid audio resources to be played list.
    +312              *
    +313              * @return this
    +314              */
    +315             addAudio:function (id, array_of_url_or_domnodes, endplaying_callback) {
    +316 
    +317                 if (array_of_url_or_domnodes instanceof Array) {
    +318                     /*
    +319                      iterate throught array elements until we can safely add an audio element.
    +320                      */
    +321                     for (var i = 0; i < array_of_url_or_domnodes.length; i++) {
    +322                         if (this.addAudioElement(id, array_of_url_or_domnodes[i], endplaying_callback)) {
    +323                             break;
    +324                         }
    +325                     }
    +326                 } else {
    +327                     this.addAudioElement(id, array_of_url_or_domnodes, endplaying_callback);
    +328                 }
    +329 
    +330                 return this;
    +331             },
    +332             /**
    +333              * Returns an audio object.
    +334              * @param aId {object} the id associated to the target Audio object.
    +335              * @return {object} the HTMLAudioElement addociated to the given id.
    +336              */
    +337             getAudio:function (aId) {
    +338                 for (var i = 0; i < this.audioCache.length; i++) {
    +339                     if (this.audioCache[i].id === aId) {
    +340                         return this.audioCache[i].audio;
    +341                     }
    +342                 }
    +343 
    +344                 return null;
    +345             },
    +346 
    +347             stopMusic : function() {
    +348                 this.musicChannel.pause();
    +349             },
    +350 
    +351             playMusic : function(id) {
    +352                 if (!this.musicEnabled) {
    +353                     return null;
    +354                 }
    +355 
    +356                 var audio_in_cache = this.getAudio(id);
    +357                 // existe el audio, y ademas hay un canal de audio disponible.
    +358                 if (null !== audio_in_cache) {
    +359                     var audio =this.musicChannel;
    +360                     if (null !== audio) {
    +361                         audio.src = audio_in_cache.src;
    +362                         audio.preload = "auto";
    +363 
    +364                         if (this.isFirefox) {
    +365                             audio.addEventListener(
    +366                                 'ended',
    +367                                 // on sound end, restart music.
    +368                                 function (audioEvent) {
    +369                                     var target = audioEvent.target;
    +370                                     target.currentTime = 0;
    +371                                 },
    +372                                 false
    +373                             );
    +374                         } else {
    +375                             audio.loop = true;
    +376                         }
    +377                         audio.load();
    +378                         audio.play();
    +379                         return audio;
    +380                     }
    +381                 }
    +382 
    +383                 return null;
    +384             },
    +385 
    +386             /**
    +387              * Set an audio object volume.
    +388              * @param id {object} an audio Id
    +389              * @param volume {number} volume to set. The volume value is not checked.
    +390              *
    +391              * @return this
    +392              */
    +393             setVolume:function (id, volume) {
    +394                 var audio = this.getAudio(id);
    +395                 if (null != audio) {
    +396                     audio.volume = volume;
    +397                 }
    +398 
    +399                 return this;
    +400             },
    +401 
    +402             /**
    +403              * Plays an audio file from the cache if any sound channel is available.
    +404              * The playing sound will occupy a sound channel and when ends playing will leave
    +405              * the channel free for any other sound to be played in.
    +406              * @param id {object} an object identifying a sound in the sound cache.
    +407              * @return { id: {Object}, audio: {(Audio|HTMLAudioElement)} }
    +408              */
    +409             play:function (id) {
    +410                 if (!this.fxEnabled) {
    +411                     return null;
    +412                 }
    +413 
    +414                 var audio = this.getAudio(id);
    +415                 // existe el audio, y ademas hay un canal de audio disponible.
    +416                 if (null !== audio && this.channels.length > 0) {
    +417                     var channel = this.channels.shift();
    +418                     channel.src = audio.src;
    +419 //                    channel.load();
    +420                     channel.volume = audio.volume;
    +421                     channel.play();
    +422                     this.workingChannels.push(channel);
    +423                 } else {
    +424                     console.log("Can't play audio: "+id);
    +425                 }
    +426 
    +427                 return audio;
    +428             },
    +429 
    +430             /**
    +431              * cancel all instances of a sound identified by id. This id is the value set
    +432              * to identify a sound.
    +433              * @param id
    +434              * @return {*}
    +435              */
    +436             cancelPlay : function(id) {
    +437 
    +438                 for( var i=0 ; this.workingChannels.length; i++ ) {
    +439                     var audio= this.workingChannels[i];
    +440                     if ( audio.caat_id===id ) {
    +441                         audio.pause();
    +442                         this.channels.push(audio);
    +443                         this.workingChannels.splice(i,1);
    +444                     }
    +445                 }
    +446 
    +447                 return this;
    +448             },
    +449 
    +450             /**
    +451              * cancel a channel sound
    +452              * @param audioObject
    +453              * @return {*}
    +454              */
    +455             cancelPlayByChannel : function(audioObject) {
    +456 
    +457                 for( var i=0 ; this.workingChannels.length; i++ ) {
    +458                     if ( this.workingChannels[i]===audioObject ) {
    +459                         this.channels.push(audioObject);
    +460                         this.workingChannels.splice(i,1);
    +461                         return this;
    +462                     }
    +463                 }
    +464 
    +465                 return this;
    +466             },
    +467 
    +468             /**
    +469              * This method creates a new AudioChannel to loop the sound with.
    +470              * It returns an Audio object so that the developer can cancel the sound loop at will.
    +471              * The user must call <code>pause()</code> method to stop playing a loop.
    +472              * <p>
    +473              * Firefox does not honor the loop property, so looping is performed by attending end playing
    +474              * event on audio elements.
    +475              *
    +476              * @return {HTMLElement} an Audio instance if a valid sound id is supplied. Null otherwise
    +477              */
    +478             loop:function (id) {
    +479 
    +480                 if (!this.musicEnabled) {
    +481                     return null;
    +482                 }
    +483 
    +484                 var audio_in_cache = this.getAudio(id);
    +485                 // existe el audio, y ademas hay un canal de audio disponible.
    +486                 if (null !== audio_in_cache) {
    +487                     var audio = document.createElement('audio');
    +488                     if (null !== audio) {
    +489                         audio.src = audio_in_cache.src;
    +490                         audio.preload = "auto";
    +491 
    +492                         if (this.isFirefox) {
    +493                             audio.addEventListener(
    +494                                 'ended',
    +495                                 // on sound end, set channel to available channels list.
    +496                                 function (audioEvent) {
    +497                                     var target = audioEvent.target;
    +498                                     target.currentTime = 0;
    +499                                 },
    +500                                 false
    +501                             );
    +502                         } else {
    +503                             audio.loop = true;
    +504                         }
    +505                         audio.load();
    +506                         audio.play();
    +507                         this.loopingChannels.push(audio);
    +508                         return audio;
    +509                     }
    +510                 }
    +511 
    +512                 return null;
    +513             },
    +514             /**
    +515              * Cancel all playing audio channels
    +516              * Get back the playing channels to available channel list.
    +517              *
    +518              * @return this
    +519              */
    +520             endSound:function () {
    +521                 var i;
    +522                 for (i = 0; i < this.workingChannels.length; i++) {
    +523                     this.workingChannels[i].pause();
    +524                     this.channels.push(this.workingChannels[i]);
    +525                 }
    +526 
    +527                 for (i = 0; i < this.loopingChannels.length; i++) {
    +528                     this.loopingChannels[i].pause();
    +529                 }
    +530 
    +531                 this.workingChannels= [];
    +532                 this.loopingChannels= [];
    +533 
    +534                 this.stopMusic();
    +535 
    +536                 return this;
    +537             },
    +538             setSoundEffectsEnabled:function (enable) {
    +539                 this.fxEnabled = enable;
    +540                 for (var i = 0; i < this.loopingChannels.length; i++) {
    +541                     if (enable) {
    +542                         this.loopingChannels[i].play();
    +543                     } else {
    +544                         this.loopingChannels[i].pause();
    +545                     }
    +546                 }
    +547                 return this;
    +548             },
    +549             isSoundEffectsEnabled:function () {
    +550                 return this.fxEnabled;
    +551             },
    +552             setMusicEnabled:function (enable) {
    +553                 this.musicEnabled = enable;
    +554                 this.stopMusic();
    +555                 return this;
    +556             },
    +557             isMusicEnabled:function () {
    +558                 return this.musicEnabled;
    +559             }
    +560         }
    +561     }
    +562 });
    +563 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CSS_csskeyframehelper.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CSS_csskeyframehelper.js.html new file mode 100644 index 00000000..b5ae464d --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CSS_csskeyframehelper.js.html @@ -0,0 +1,185 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * This object manages CSS3 transitions reflecting applying behaviors.
    +  5  *
    +  6  **/
    +  7 
    +  8 (function() {
    +  9 
    + 10     /**
    + 11      * @name CSS
    + 12      * @memberOf CAAT
    + 13      * @namespace
    + 14      */
    + 15 
    + 16     CAAT.CSS= {};
    + 17 
    + 18     /**
    + 19      * @lends CAAT.CSS
    + 20      */
    + 21 
    + 22 
    + 23     /**
    + 24      * Guess a browser custom prefix.
    + 25      * @type {*}
    + 26      */
    + 27     CAAT.CSS.PREFIX= (function() {
    + 28 
    + 29         var prefix = "";
    + 30         var prefixes = ['WebKit', 'Moz', 'O'];
    + 31         var keyframes= "";
    + 32 
    + 33         // guess this browser vendor prefix.
    + 34         for (var i = 0; i < prefixes.length; i++) {
    + 35             if (window[prefixes[i] + 'CSSKeyframeRule']) {
    + 36                 prefix = prefixes[i].toLowerCase();
    + 37                 break;
    + 38             }
    + 39         }
    + 40 
    + 41         CAAT.CSS.PROP_ANIMATION= '-'+prefix+'-animation';
    + 42 
    + 43         return prefix;
    + 44     })();
    + 45 
    + 46     /**
    + 47      * Apply a given @key-frames animation to a DOM element.
    + 48      * @param domElement {DOMElement}
    + 49      * @param name {string} animation name
    + 50      * @param duration_millis {number}
    + 51      * @param delay_millis {number}
    + 52      * @param forever {boolean}
    + 53      */
    + 54     CAAT.CSS.applyKeyframe= function( domElement, name, duration_millis, delay_millis, forever ) {
    + 55         domElement.style[CAAT.CSS.PROP_ANIMATION]= name+' '+(duration_millis/1000)+'s '+(delay_millis/1000)+'s linear both '+(forever ? 'infinite' : '') ;
    + 56     };
    + 57 
    + 58     /**
    + 59      * Remove a @key-frames animation from the stylesheet.
    + 60      * @param name
    + 61      */
    + 62     CAAT.CSS.unregisterKeyframes= function( name ) {
    + 63         var index= CAAT.CSS.getCSSKeyframesIndex(name);
    + 64         if ( null!==index ) {
    + 65             document.styleSheets[ index.sheetIndex ].deleteRule( index.index );
    + 66         }
    + 67     };
    + 68 
    + 69     /**
    + 70      *
    + 71      * @param kfDescriptor {object}
    + 72      *      {
    + 73      *          name{string},
    + 74      *          behavior{CAAT.Behavior},
    + 75      *          size{!number},
    + 76      *          overwrite{boolean}
    + 77      *      }
    + 78      *  }
    + 79      */
    + 80     CAAT.CSS.registerKeyframes= function( kfDescriptor ) {
    + 81 
    + 82         var name=       kfDescriptor.name;
    + 83         var behavior=   kfDescriptor.behavior;
    + 84         var size=       kfDescriptor.size;
    + 85         var overwrite=  kfDescriptor.overwrite;
    + 86 
    + 87         if ( typeof name==='undefined' || typeof behavior==='undefined' ) {
    + 88             throw 'Keyframes must be defined by a name and a CAAT.Behavior instance.';
    + 89         }
    + 90 
    + 91         if ( typeof size==='undefined' ) {
    + 92             size= 100;
    + 93         }
    + 94         if ( typeof overwrite==='undefined' ) {
    + 95             overwrite= false;
    + 96         }
    + 97 
    + 98         // find if keyframes has already a name set.
    + 99         var cssRulesIndex= CAAT.CSS.getCSSKeyframesIndex(name);
    +100         if (null!==cssRulesIndex && !overwrite) {
    +101             return;
    +102         }
    +103 
    +104         var keyframesRule= behavior.calculateKeyFramesData(CAAT.CSS.PREFIX, name, size, kfDescriptor.anchorX, kfDescriptor.anchorY );
    +105 
    +106         if (document.styleSheets) {
    +107             if ( !document.styleSheets.length) {
    +108                 var s = document.createElement('style');
    +109                 s.type="text/css";
    +110 
    +111                 document.getElementsByTagName('head')[ 0 ].appendChild(s);
    +112             }
    +113 
    +114             if ( null!==cssRulesIndex ) {
    +115                 document.styleSheets[ cssRulesIndex.sheetIndex ].deleteRule( cssRulesIndex.index );
    +116             }
    +117 
    +118             var index= cssRulesIndex ? cssRulesIndex.sheetIndex : 0;
    +119             document.styleSheets[ index ].insertRule( keyframesRule, 0 );
    +120         }
    +121 
    +122         return keyframesRule;
    +123     };
    +124 
    +125     CAAT.CSS.getCSSKeyframesIndex= function(name) {
    +126         var ss = document.styleSheets;
    +127         for (var i = ss.length - 1; i >= 0; i--) {
    +128             try {
    +129                 var s = ss[i],
    +130                     rs = s.cssRules ? s.cssRules :
    +131                          s.rules ? s.rules :
    +132                          [];
    +133 
    +134                 for (var j = rs.length - 1; j >= 0; j--) {
    +135                     if ( ( rs[j].type === window.CSSRule.WEBKIT_KEYFRAMES_RULE ||
    +136                            rs[j].type === window.CSSRule.MOZ_KEYFRAMES_RULE ) && rs[j].name === name) {
    +137 
    +138                         return {
    +139                             sheetIndex : i,
    +140                             index: j
    +141                         };
    +142                     }
    +143                 }
    +144             } catch(e) {
    +145             }
    +146         }
    +147 
    +148         return null;
    +149     };
    +150 
    +151     CAAT.CSS.getCSSKeyframes= function(name) {
    +152 
    +153         var ss = document.styleSheets;
    +154         for (var i = ss.length - 1; i >= 0; i--) {
    +155             try {
    +156                 var s = ss[i],
    +157                     rs = s.cssRules ? s.cssRules :
    +158                          s.rules ? s.rules :
    +159                          [];
    +160 
    +161                 for (var j = rs.length - 1; j >= 0; j--) {
    +162                     if ( ( rs[j].type === window.CSSRule.WEBKIT_KEYFRAMES_RULE ||
    +163                            rs[j].type === window.CSSRule.MOZ_KEYFRAMES_RULE ) && rs[j].name === name) {
    +164 
    +165                         return rs[j];
    +166                     }
    +167                 }
    +168             }
    +169             catch(e) {
    +170             }
    +171         }
    +172         return null;
    +173     };
    +174 
    +175 
    +176 
    +177 })();
    +178 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CircleManager_PackedCircle.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CircleManager_PackedCircle.js.html new file mode 100644 index 00000000..3ced438d --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CircleManager_PackedCircle.js.html @@ -0,0 +1,205 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  ####  #####  ##### ####    ###  #   # ###### ###### ##     ##  #####  #     #      ########    ##    #  #  #####
    +  5  #   # #   #  ###   #   #  #####  ###    ##     ##   ##  #  ##    #    #     #     #   ##   #  #####  ###   ###
    +  6  ###  #   #  ##### ####   #   #   #   ######   ##   #########  #####  ##### ##### #   ##   #  #   #  #   # #####
    +  7  -
    +  8  File:
    +  9  PackedCircle.js
    + 10  Created By:
    + 11  Mario Gonzalez
    + 12  Project    :
    + 13  None
    + 14  Abstract:
    + 15  A single packed circle.
    + 16  Contains a reference to it's div, and information pertaining to it state.
    + 17  Basic Usage:
    + 18  http://onedayitwillmake.com/CirclePackJS/
    + 19  */
    + 20 
    + 21 CAAT.Module({
    + 22 
    + 23     /**
    + 24      * @name CircleManager
    + 25      * @memberOf CAAT.Module
    + 26      * @namespace
    + 27      */
    + 28 
    + 29     /**
    + 30      * @name PackedCircle
    + 31      * @memberOf CAAT.Module.CircleManager
    + 32      * @constructor
    + 33      */
    + 34 
    + 35     defines:"CAAT.Module.CircleManager.PackedCircle",
    + 36     depends:[
    + 37         "CAAT.Module.CircleManager.PackedCircle",
    + 38         "CAAT.Math.Point"
    + 39     ],
    + 40     constants:{
    + 41 
    + 42         /**
    + 43          * @lends CAAT.Module.CircleManager.PackedCircle
    + 44          */
    + 45 
    + 46         /** @const */ BOUNDS_RULE_WRAP:1, // Wrap to otherside
    + 47         /** @const */ BOUNDS_RULE_CONSTRAINT:2, // Constrain within bounds
    + 48         /** @const */ BOUNDS_RULE_DESTROY:4, // Destroy when it reaches the edge
    + 49         /** @const */ BOUNDS_RULE_IGNORE:8        // Ignore when reaching bounds
    + 50     },
    + 51     extendsWith:{
    + 52 
    + 53         /**
    + 54          * @lends CAAT.Module.CircleManager.PackedCircle.prototype
    + 55          */
    + 56 
    + 57         __init:function () {
    + 58             this.boundsRule = CAAT.Module.CircleManager.PackedCircle.BOUNDS_RULE_IGNORE;
    + 59             this.position = new CAAT.Math.Point(0, 0, 0);
    + 60             this.offset = new CAAT.Math.Point(0, 0, 0);
    + 61             this.targetPosition = new CAAT.Math.Point(0, 0, 0);
    + 62             return this;
    + 63         },
    + 64 
    + 65         /**
    + 66          *
    + 67          */
    + 68         id:0,
    + 69 
    + 70         /**
    + 71          *
    + 72          */
    + 73         delegate:null,
    + 74 
    + 75         /**
    + 76          *
    + 77          */
    + 78         position:null,
    + 79 
    + 80         /**
    + 81          *
    + 82          */
    + 83         offset:null,
    + 84 
    + 85         /**
    + 86          *
    + 87          */
    + 88         targetPosition:null, // Where it wants to go
    + 89 
    + 90         /**
    + 91          *
    + 92          */
    + 93         targetChaseSpeed:0.02,
    + 94 
    + 95         /**
    + 96          *
    + 97          */
    + 98         isFixed:false,
    + 99 
    +100         /**
    +101          *
    +102          */
    +103         boundsRule:0,
    +104 
    +105         /**
    +106          *
    +107          */
    +108         collisionMask:0,
    +109 
    +110         /**
    +111          *
    +112          */
    +113         collisionGroup:0,
    +114 
    +115         containsPoint:function (aPoint) {
    +116             var distanceSquared = this.position.getDistanceSquared(aPoint);
    +117             return distanceSquared < this.radiusSquared;
    +118         },
    +119 
    +120         getDistanceSquaredFromPosition:function (aPosition) {
    +121             var distanceSquared = this.position.getDistanceSquared(aPosition);
    +122             // if it's shorter than either radius, we intersect
    +123             return distanceSquared < this.radiusSquared;
    +124         },
    +125 
    +126         intersects:function (aCircle) {
    +127             var distanceSquared = this.position.getDistanceSquared(aCircle.position);
    +128             return (distanceSquared < this.radiusSquared || distanceSquared < aCircle.radiusSquared);
    +129         },
    +130 
    +131         /**
    +132          * ACCESSORS
    +133          */
    +134         setPosition:function (aPosition) {
    +135             this.position = aPosition;
    +136             return this;
    +137         },
    +138 
    +139         setDelegate:function (aDelegate) {
    +140             this.delegate = aDelegate;
    +141             return this;
    +142         },
    +143 
    +144         setOffset:function (aPosition) {
    +145             this.offset = aPosition;
    +146             return this;
    +147         },
    +148 
    +149         setTargetPosition:function (aTargetPosition) {
    +150             this.targetPosition = aTargetPosition;
    +151             return this;
    +152         },
    +153 
    +154         setTargetChaseSpeed:function (aTargetChaseSpeed) {
    +155             this.targetChaseSpeed = aTargetChaseSpeed;
    +156             return this;
    +157         },
    +158 
    +159         setIsFixed:function (value) {
    +160             this.isFixed = value;
    +161             return this;
    +162         },
    +163 
    +164         setCollisionMask:function (aCollisionMask) {
    +165             this.collisionMask = aCollisionMask;
    +166             return this;
    +167         },
    +168 
    +169         setCollisionGroup:function (aCollisionGroup) {
    +170             this.collisionGroup = aCollisionGroup;
    +171             return this;
    +172         },
    +173 
    +174         setRadius:function (aRadius) {
    +175             this.radius = aRadius;
    +176             this.radiusSquared = this.radius * this.radius;
    +177             return this;
    +178         },
    +179 
    +180         initialize:function (overrides) {
    +181             if (overrides) {
    +182                 for (var i in overrides) {
    +183                     this[i] = overrides[i];
    +184                 }
    +185             }
    +186 
    +187             return this;
    +188         },
    +189 
    +190         dealloc:function () {
    +191             this.position = null;
    +192             this.offset = null;
    +193             this.delegate = null;
    +194             this.targetPosition = null;
    +195         }
    +196     }
    +197 });
    +198 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CircleManager_PackedCircleManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CircleManager_PackedCircleManager.js.html new file mode 100644 index 00000000..c07cf24b --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_CircleManager_PackedCircleManager.js.html @@ -0,0 +1,405 @@ +
      1 /**
    +  2  *
    +  3  * See LICENSE file.
    +  4  * 
    +  5 	  ####  #####  ##### ####    ###  #   # ###### ###### ##     ##  #####  #     #      ########    ##    #  #  #####
    +  6 	 #   # #   #  ###   #   #  #####  ###    ##     ##   ##  #  ##    #    #     #     #   ##   #  #####  ###   ###
    +  7 	 ###  #   #  ##### ####   #   #   #   ######   ##   #########  #####  ##### ##### #   ##   #  #   #  #   # #####
    +  8  -
    +  9  File:
    + 10  	PackedCircle.js
    + 11  Created By:
    + 12  	Mario Gonzalez
    + 13  Project	:
    + 14  	None
    + 15  Abstract:
    + 16  	 A single packed circle.
    + 17 	 Contains a reference to it's div, and information pertaining to it state.
    + 18  Basic Usage:
    + 19 	http://onedayitwillmake.com/CirclePackJS/
    + 20 */
    + 21 
    + 22 CAAT.Module( {
    + 23 
    + 24 
    + 25     /**
    + 26      * @name PackedCircleManager
    + 27      * @memberOf CAAT.Module.CircleManager
    + 28      * @constructor
    + 29      */
    + 30 
    + 31 
    + 32     defines : "CAAT.Module.CircleManager.PackedCircleManager",
    + 33     depends : [
    + 34         "CAAT.Math.Point",
    + 35         "CAAT.Math.Rectangle"
    + 36     ],
    + 37     extendsWith : {
    + 38 
    + 39         /**
    + 40          * @lends CAAT.Module.CircleManager.PackedCircleManager.prototype
    + 41          * @private
    + 42          */
    + 43 
    + 44         __init : function() {
    + 45             this.bounds= new CAAT.Math.Rectangle();
    + 46         },
    + 47 
    + 48         /**
    + 49          *
    + 50          */
    + 51 		allCircles:					[],
    + 52 
    + 53         /**
    + 54          *
    + 55          */
    + 56 		numberOfCollisionPasses:	1,
    + 57 
    + 58         /**
    + 59          *
    + 60          */
    + 61 		numberOfTargetingPasses:	0,
    + 62 
    + 63         /**
    + 64          *
    + 65          */
    + 66 		bounds:						null,
    + 67 
    + 68 		/**
    + 69 		 * Adds a circle to the simulation
    + 70 		 * @param aCircle
    + 71 		 */
    + 72 		addCircle: function(aCircle)
    + 73 		{
    + 74 			aCircle.id = this.allCircles.length;
    + 75 			this.allCircles.push(aCircle);
    + 76 			return this;
    + 77 		},
    + 78 
    + 79 		/**
    + 80 		 * Removes a circle from the simulations
    + 81 		 * @param aCircle	Circle to remove
    + 82 		 */
    + 83 		removeCircle: function(aCircle)
    + 84 		{
    + 85 			var index = 0,
    + 86 				found = false,
    + 87 				len = this.allCircles.length;
    + 88 
    + 89 			if(len === 0) {
    + 90 				throw "Error: (PackedCircleManager) attempting to remove circle, and allCircles.length === 0!!";
    + 91 			}
    + 92 
    + 93 			while (len--) {
    + 94 				if(this.allCircles[len] === aCircle) {
    + 95 					found = true;
    + 96 					index = len;
    + 97 					break;
    + 98 				}
    + 99 			}
    +100 
    +101 			if(!found) {
    +102 				throw "Could not locate circle in allCircles array!";
    +103 			}
    +104 
    +105 			// Remove
    +106 			this.allCircles[index].dealloc();
    +107 			this.allCircles[index] = null;
    +108 
    +109 			return this;
    +110 		},
    +111 
    +112 		/**
    +113 		 * Forces all circles to move to where their delegate position is
    +114 		 * Assumes all targets have a 'position' property!
    +115 		 */
    +116 		forceCirclesToMatchDelegatePositions: function()
    +117 		{
    +118 			var len = this.allCircles.length;
    +119 
    +120 			// push toward target position
    +121 			for(var n = 0; n < len; n++)
    +122 			{
    +123 				var aCircle = this.allCircles[n];
    +124 				if(!aCircle || !aCircle.delegate) {
    +125 					continue;
    +126 				}
    +127 
    +128 				aCircle.position.set(aCircle.delegate.x + aCircle.offset.x,
    +129 						aCircle.delegate.y + aCircle.offset.y);
    +130 			}
    +131 		},
    +132 
    +133 		pushAllCirclesTowardTarget: function(aTarget)
    +134 		{
    +135 			var v = new CAAT.Math.Point(0,0,0),
    +136 				circleList = this.allCircles,
    +137 				len = circleList.length;
    +138 
    +139 			// push toward target position
    +140 			for(var n = 0; n < this.numberOfTargetingPasses; n++)
    +141 			{
    +142 				for(var i = 0; i < len; i++)
    +143 				{
    +144 					var c = circleList[i];
    +145 
    +146 					if(c.isFixed) continue;
    +147 
    +148 					v.x = c.position.x - (c.targetPosition.x+c.offset.x);
    +149 					v.y = c.position.y - (c.targetPosition.y+c.offset.y);
    +150 					v.multiply(c.targetChaseSpeed);
    +151 
    +152 					c.position.x -= v.x;
    +153 					c.position.y -= v.y;
    +154 				}
    +155 			}
    +156 		},
    +157 
    +158 		/**
    +159 		 * Packs the circles towards the center of the bounds.
    +160 		 * Each circle will have it's own 'targetPosition' later on
    +161 		 */
    +162 		handleCollisions: function()
    +163 		{
    +164 			this.removeExpiredElements();
    +165 
    +166 			var v = new CAAT.Math.Point(0,0, 0),
    +167 				circleList = this.allCircles,
    +168 				len = circleList.length;
    +169 
    +170 			// Collide circles
    +171 			for(var n = 0; n < this.numberOfCollisionPasses; n++)
    +172 			{
    +173 				for(var i = 0; i < len; i++)
    +174 				{
    +175 					var ci = circleList[i];
    +176 
    +177 
    +178 					for (var j = i + 1; j< len; j++)
    +179 					{
    +180 						var cj = circleList[j];
    +181 
    +182 						if( !this.circlesCanCollide(ci, cj) ) continue;   // It's us!
    +183 
    +184 						var dx = cj.position.x - ci.position.x,
    +185 							dy = cj.position.y - ci.position.y;
    +186 
    +187 						// The distance between the two circles radii, but we're also gonna pad it a tiny bit
    +188 						var r = (ci.radius + cj.radius) * 1.08,
    +189 							d = ci.position.getDistanceSquared(cj.position);
    +190 
    +191 						/**
    +192 						 * Collision detected!
    +193 						 */
    +194 						if (d < (r * r) - 0.02 )
    +195 						{
    +196 							v.x = dx;
    +197 							v.y = dy;
    +198 							v.normalize();
    +199 
    +200 							var inverseForce = (r - Math.sqrt(d)) * 0.5;
    +201 							v.multiply(inverseForce);
    +202 
    +203 							// Move cj opposite of the collision as long as its not fixed
    +204 							if(!cj.isFixed)
    +205 							{
    +206 								if(ci.isFixed)
    +207 									v.multiply(2.2);	// Double inverse force to make up for the fact that the other object is fixed
    +208 
    +209 								// ADD the velocity
    +210 								cj.position.translatePoint(v);
    +211 							}
    +212 
    +213 							// Move ci opposite of the collision as long as its not fixed
    +214 							if(!ci.isFixed)
    +215 							{
    +216 								if(cj.isFixed)
    +217 									v.multiply(2.2);	// Double inverse force to make up for the fact that the other object is fixed
    +218 
    +219 								 // SUBTRACT the velocity
    +220 								ci.position.subtract(v);
    +221 							}
    +222 
    +223 							// Emit the collision event from each circle, with itself as the first parameter
    +224 //							if(this.dispatchCollisionEvents && n == this.numberOfCollisionPasses-1)
    +225 //							{
    +226 //								this.eventEmitter.emit('collision', cj, ci, v);
    +227 //							}
    +228 						}
    +229 					}
    +230 				}
    +231 			}
    +232 		},
    +233 
    +234 		handleBoundaryForCircle: function(aCircle, boundsRule)
    +235 		{
    +236 //			if(aCircle.boundsRule === true) return; // Ignore if being dragged
    +237 
    +238 			var xpos = aCircle.position.x;
    +239 			var ypos = aCircle.position.y;
    +240 
    +241 			var radius = aCircle.radius;
    +242 			var diameter = radius*2;
    +243 
    +244 			// Toggle these on and off,
    +245 			// Wrap and bounce, are opposite behaviors so pick one or the other for each axis, or bad things will happen.
    +246 			var wrapXMask = 1 << 0;
    +247 			var wrapYMask = 1 << 2;
    +248 			var constrainXMask = 1 << 3;
    +249 			var constrainYMask = 1 << 4;
    +250 			var emitEvent = 1 << 5;
    +251 
    +252 			// TODO: Promote to member variable
    +253 			// Convert to bitmask - Uncomment the one you want, or concact your own :)
    +254 	//		boundsRule = wrapY; // Wrap only Y axis
    +255 	//		boundsRule = wrapX; // Wrap only X axis
    +256 	//		boundsRule = wrapXMask | wrapYMask; // Wrap both X and Y axis
    +257 			boundsRule = wrapYMask | constrainXMask;  // Wrap Y axis, but constrain horizontally
    +258 
    +259 			// Wrap X
    +260 			if(boundsRule & wrapXMask && xpos-diameter > this.bounds.right) {
    +261 				aCircle.position.x = this.bounds.left + radius;
    +262 			} else if(boundsRule & wrapXMask && xpos+diameter < this.bounds.left) {
    +263 				aCircle.position.x = this.bounds.right - radius;
    +264 			}
    +265 			// Wrap Y
    +266 			if(boundsRule & wrapYMask && ypos-diameter > this.bounds.bottom) {
    +267 				aCircle.position.y = this.bounds.top - radius;
    +268 			} else if(boundsRule & wrapYMask && ypos+diameter < this.bounds.top) {
    +269 				aCircle.position.y = this.bounds.bottom + radius;
    +270 			}
    +271 
    +272 			// Constrain X
    +273 			if(boundsRule & constrainXMask && xpos+radius >= this.bounds.right) {
    +274 				aCircle.position.x = aCircle.position.x = this.bounds.right-radius;
    +275 			} else if(boundsRule & constrainXMask && xpos-radius < this.bounds.left) {
    +276 				aCircle.position.x = this.bounds.left + radius;
    +277 			}
    +278 
    +279 			// Constrain Y
    +280 			if(boundsRule & constrainYMask && ypos+radius > this.bounds.bottom) {
    +281 				aCircle.position.y = this.bounds.bottom - radius;
    +282 			} else if(boundsRule & constrainYMask && ypos-radius < this.bounds.top) {
    +283 				aCircle.position.y = this.bounds.top + radius;
    +284 			}
    +285 		},
    +286 
    +287 		/**
    +288 		 * Given an x,y position finds circle underneath and sets it to the currently grabbed circle
    +289 		 * @param {Number} xpos		An x position
    +290 		 * @param {Number} ypos		A y position
    +291 		 * @param {Number} buffer	A radiusSquared around the point in question where something is considered to match
    +292 		 */
    +293 		getCircleAt: function(xpos, ypos, buffer)
    +294 		{
    +295 			var circleList = this.allCircles;
    +296 			var len = circleList.length;
    +297 			var grabVector = new CAAT.Math.Point(xpos, ypos, 0);
    +298 
    +299 			// These are set every time a better match i found
    +300 			var closestCircle = null;
    +301 			var closestDistance = Number.MAX_VALUE;
    +302 
    +303 			// Loop thru and find the closest match
    +304 			for(var i = 0; i < len; i++)
    +305 			{
    +306 				var aCircle = circleList[i];
    +307 				if(!aCircle) continue;
    +308 				var distanceSquared = aCircle.position.getDistanceSquared(grabVector);
    +309 
    +310 				if(distanceSquared < closestDistance && distanceSquared < aCircle.radiusSquared + buffer)
    +311 				{
    +312 					closestDistance = distanceSquared;
    +313 					closestCircle = aCircle;
    +314 				}
    +315 			}
    +316 
    +317 			return closestCircle;
    +318 		},
    +319 
    +320 		circlesCanCollide: function(circleA, circleB)
    +321 		{
    +322 		    if(!circleA || !circleB || circleA===circleB) return false; 					// one is null (will be deleted next loop), or both point to same obj.
    +323 //			if(circleA.delegate == null || circleB.delegate == null) return false;					// This circle will be removed next loop, it's entity is already removed
    +324 
    +325 //			if(circleA.isFixed & circleB.isFixed) return false;
    +326 //			if(circleA.delegate .clientID === circleB.delegate.clientID) return false; 				// Don't let something collide with stuff it owns
    +327 
    +328 			// They dont want to collide
    +329 //			if((circleA.collisionGroup & circleB.collisionMask) == 0) return false;
    +330 //			if((circleB.collisionGroup & circleA.collisionMask) == 0) return false;
    +331 
    +332 			return true;
    +333 		},
    +334 /**
    +335  * Accessors
    +336  */
    +337 		setBounds: function(x, y, w, h)
    +338 		{
    +339 			this.bounds.x = x;
    +340 			this.bounds.y = y;
    +341 			this.bounds.width = w;
    +342 			this.bounds.height = h;
    +343 		},
    +344 
    +345 		setNumberOfCollisionPasses: function(value)
    +346 		{
    +347 			this.numberOfCollisionPasses = value;
    +348 			return this;
    +349 		},
    +350 
    +351 		setNumberOfTargetingPasses: function(value)
    +352 		{
    +353 			this.numberOfTargetingPasses = value;
    +354 			return this;
    +355 		},
    +356 
    +357 /**
    +358  * Helpers
    +359  */
    +360 		sortOnDistanceToTarget: function(circleA, circleB)
    +361 		{
    +362 			var valueA = circleA.getDistanceSquaredFromPosition(circleA.targetPosition);
    +363 			var valueB = circleB.getDistanceSquaredFromPosition(circleA.targetPosition);
    +364 			var comparisonResult = 0;
    +365 
    +366 			if(valueA > valueB) comparisonResult = -1;
    +367 			else if(valueA < valueB) comparisonResult = 1;
    +368 
    +369 			return comparisonResult;
    +370 		},
    +371 
    +372 /**
    +373  * Memory Management
    +374  */
    +375 		removeExpiredElements: function()
    +376 		{
    +377 			// remove null elements
    +378 			for (var k = this.allCircles.length; k >= 0; k--) {
    +379 				if (this.allCircles[k] === null)
    +380 					this.allCircles.splice(k, 1);
    +381 			}
    +382 		},
    +383 
    +384 		initialize : function(overrides)
    +385 		{
    +386 			if (overrides)
    +387 			{
    +388 				for (var i in overrides)
    +389 				{
    +390 					this[i] = overrides[i];
    +391 				}
    +392 			}
    +393 
    +394 			return this;
    +395 		}
    +396 	}
    +397 });
    +398 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_Quadtree.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_Quadtree.js.html new file mode 100644 index 00000000..caa5c240 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_Quadtree.js.html @@ -0,0 +1,138 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * This file contains the definition for objects QuadTree and HashMap.
    +  5  * Quadtree offers an exact list of collisioning areas, while HashMap offers a list of potentially colliding
    +  6  * elements.
    +  7  * Specially suited for static content.
    +  8  *
    +  9  **/
    + 10 
    + 11 CAAT.Module({
    + 12 
    + 13     /**
    + 14      * @name Collision
    + 15      * @memberOf CAAT.Module
    + 16      * @namespace
    + 17      */
    + 18 
    + 19     /**
    + 20      * @name QuadTree
    + 21      * @memberOf CAAT.Module.Collision
    + 22      * @constructor
    + 23      */
    + 24 
    + 25     defines:"CAAT.Module.Collision.QuadTree",
    + 26     depends:[
    + 27         "CAAT.Math.Rectangle"
    + 28     ],
    + 29     extendsClass:"CAAT.Math.Rectangle",
    + 30     extendsWith:function () {
    + 31 
    + 32         var QT_MAX_ELEMENTS = 1;
    + 33         var QT_MIN_WIDTH = 32;
    + 34 
    + 35         return {
    + 36 
    + 37             /**
    + 38              * @lends CAAT.Module.Collision.QuadTree.prototype
    + 39              */
    + 40 
    + 41             /**
    + 42              * For each quadtree level this keeps the list of overlapping elements.
    + 43              */
    + 44             bgActors:null,
    + 45 
    + 46             /**
    + 47              * For each quadtree, this quadData keeps another 4 quadtrees up to the  maximum recursion level.
    + 48              */
    + 49             quadData:null,
    + 50 
    + 51             create:function (l, t, r, b, backgroundElements, minWidth, maxElements) {
    + 52 
    + 53                 if (typeof minWidth === 'undefined') {
    + 54                     minWidth = QT_MIN_WIDTH;
    + 55                 }
    + 56                 if (typeof maxElements === 'undefined') {
    + 57                     maxElements = QT_MAX_ELEMENTS;
    + 58                 }
    + 59 
    + 60                 var cx = (l + r) / 2;
    + 61                 var cy = (t + b) / 2;
    + 62 
    + 63                 this.x = l;
    + 64                 this.y = t;
    + 65                 this.x1 = r;
    + 66                 this.y1 = b;
    + 67                 this.width = r - l;
    + 68                 this.height = b - t;
    + 69 
    + 70                 this.bgActors = this.__getOverlappingActorList(backgroundElements);
    + 71 
    + 72                 if (this.bgActors.length <= maxElements || this.width <= minWidth) {
    + 73                     return this;
    + 74                 }
    + 75 
    + 76                 this.quadData = new Array(4);
    + 77                 this.quadData[0] = new CAAT.Module.Collision.QuadTree().create(l, t, cx, cy, this.bgActors);  // TL
    + 78                 this.quadData[1] = new CAAT.Module.Collision.QuadTree().create(cx, t, r, cy, this.bgActors);  // TR
    + 79                 this.quadData[2] = new CAAT.Module.Collision.QuadTree().create(l, cy, cx, b, this.bgActors);  // BL
    + 80                 this.quadData[3] = new CAAT.Module.Collision.QuadTree().create(cx, cy, r, b, this.bgActors);
    + 81 
    + 82                 return this;
    + 83             },
    + 84 
    + 85             __getOverlappingActorList:function (actorList) {
    + 86                 var tmpList = [];
    + 87                 for (var i = 0, l = actorList.length; i < l; i++) {
    + 88                     var actor = actorList[i];
    + 89                     if (this.intersects(actor.AABB)) {
    + 90                         tmpList.push(actor);
    + 91                     }
    + 92                 }
    + 93                 return tmpList;
    + 94             },
    + 95 
    + 96             /**
    + 97              * Call this method to thet the list of colliding elements with the parameter rectangle.
    + 98              * @param rectangle
    + 99              * @return {Array}
    +100              */
    +101             getOverlappingActors:function (rectangle) {
    +102                 var i, j, l;
    +103                 var overlappingActors = [];
    +104                 var qoverlappingActors;
    +105                 var actors = this.bgActors;
    +106                 var actor;
    +107 
    +108                 if (this.quadData) {
    +109                     for (i = 0; i < 4; i++) {
    +110                         if (this.quadData[i].intersects(rectangle)) {
    +111                             qoverlappingActors = this.quadData[i].getOverlappingActors(rectangle);
    +112                             for (j = 0, l = qoverlappingActors.length; j < l; j++) {
    +113                                 overlappingActors.push(qoverlappingActors[j]);
    +114                             }
    +115                         }
    +116                     }
    +117                 } else {
    +118                     for (i = 0, l = actors.length; i < l; i++) {
    +119                         actor = actors[i];
    +120                         if (rectangle.intersects(actor.AABB)) {
    +121                             overlappingActors.push(actor);
    +122                         }
    +123                     }
    +124                 }
    +125 
    +126                 return overlappingActors;
    +127             }
    +128         }
    +129     }
    +130 });
    +131 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_SpatialHash.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_SpatialHash.js.html new file mode 100644 index 00000000..14a0e524 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Collision_SpatialHash.js.html @@ -0,0 +1,247 @@ +
      1 CAAT.Module( {
    +  2 
    +  3 
    +  4     /**
    +  5      * @name SpatialHash
    +  6      * @memberOf CAAT.Module.Collision
    +  7      * @constructor
    +  8      */
    +  9 
    + 10 
    + 11     defines : "CAAT.Module.Collision.SpatialHash",
    + 12     aliases : ["CAAT.SpatialHash"],
    + 13     depends : [
    + 14         "CAAT.Math.Rectangle"
    + 15     ],
    + 16     extendsWith : {
    + 17 
    + 18         /**
    + 19          * @lends CAAT.Module.Collision.SpatialHash.prototype
    + 20          */
    + 21 
    + 22         /**
    + 23          * A collection ob objects to test collision among them.
    + 24          */
    + 25         elements    :   null,
    + 26 
    + 27         /**
    + 28          * Space width
    + 29          */
    + 30         width       :   null,
    + 31 
    + 32         /**
    + 33          * Space height
    + 34          */
    + 35         height      :   null,
    + 36 
    + 37         /**
    + 38          * Rows to partition the space.
    + 39          */
    + 40         rows        :   null,
    + 41 
    + 42         /**
    + 43          * Columns to partition the space.
    + 44          */
    + 45         columns     :   null,
    + 46 
    + 47         xcache      :   null,
    + 48         ycache      :   null,
    + 49         xycache     :   null,
    + 50 
    + 51         rectangle   :   null,
    + 52 
    + 53         /**
    + 54          * Spare rectangle to hold temporary calculations.
    + 55          */
    + 56         r0          :   null,
    + 57 
    + 58         /**
    + 59          * Spare rectangle to hold temporary calculations.
    + 60          */
    + 61         r1          :   null,
    + 62 
    + 63         initialize : function( w,h, rows,columns ) {
    + 64 
    + 65             var i, j;
    + 66 
    + 67             this.elements= [];
    + 68             for( i=0; i<rows*columns; i++ ) {
    + 69                 this.elements.push( [] );
    + 70             }
    + 71 
    + 72             this.width=     w;
    + 73             this.height=    h;
    + 74 
    + 75             this.rows=      rows;
    + 76             this.columns=   columns;
    + 77 
    + 78             this.xcache= [];
    + 79             for( i=0; i<w; i++ ) {
    + 80                 this.xcache.push( (i/(w/columns))>>0 );
    + 81             }
    + 82 
    + 83             this.ycache= [];
    + 84             for( i=0; i<h; i++ ) {
    + 85                 this.ycache.push( (i/(h/rows))>>0 );
    + 86             }
    + 87 
    + 88             this.xycache=[];
    + 89             for( i=0; i<this.rows; i++ ) {
    + 90 
    + 91                 this.xycache.push( [] );
    + 92                 for( j=0; j<this.columns; j++ ) {
    + 93                     this.xycache[i].push( j + i*columns  );
    + 94                 }
    + 95             }
    + 96 
    + 97             this.rectangle= new CAAT.Math.Rectangle().setBounds( 0, 0, w, h );
    + 98             this.r0=        new CAAT.Math.Rectangle();
    + 99             this.r1=        new CAAT.Math.Rectangle();
    +100 
    +101             return this;
    +102         },
    +103 
    +104         clearObject : function() {
    +105             var i;
    +106 
    +107             for( i=0; i<this.rows*this.columns; i++ ) {
    +108                 this.elements[i]= [];
    +109             }
    +110 
    +111             return this;
    +112         },
    +113 
    +114         /**
    +115          * Add an element of the form { id, x,y,width,height, rectangular }
    +116          */
    +117         addObject : function( obj  ) {
    +118             var x= obj.x|0;
    +119             var y= obj.y|0;
    +120             var width= obj.width|0;
    +121             var height= obj.height|0;
    +122 
    +123             var cells= this.__getCells( x,y,width,height );
    +124             for( var i=0; i<cells.length; i++ ) {
    +125                 this.elements[ cells[i] ].push( obj );
    +126             }
    +127         },
    +128 
    +129         __getCells : function( x,y,width,height ) {
    +130 
    +131             var cells= [];
    +132             var i;
    +133 
    +134             if ( this.rectangle.contains(x,y) ) {
    +135                 cells.push( this.xycache[ this.ycache[y] ][ this.xcache[x] ] );
    +136             }
    +137 
    +138             /**
    +139              * if both squares lay inside the same cell, it is not crossing a boundary.
    +140              */
    +141             if ( this.rectangle.contains(x+width-1,y+height-1) ) {
    +142                 var c= this.xycache[ this.ycache[y+height-1] ][ this.xcache[x+width-1] ];
    +143                 if ( c===cells[0] ) {
    +144                     return cells;
    +145                 }
    +146                 cells.push( c );
    +147             }
    +148 
    +149             /**
    +150              * the other two AABB points lie inside the screen as well.
    +151              */
    +152             if ( this.rectangle.contains(x+width-1,y) ) {
    +153                 var c= this.xycache[ this.ycache[y] ][ this.xcache[x+width-1] ];
    +154                 if ( c===cells[0] || c===cells[1] ) {
    +155                     return cells;
    +156                 }
    +157                 cells.push(c);
    +158             }
    +159 
    +160             // worst case, touching 4 screen cells.
    +161             if ( this.rectangle.contains(x+width-1,y+height-1) ) {
    +162                 var c= this.xycache[ this.ycache[y+height-1] ][ this.xcache[x] ];
    +163                 cells.push(c);
    +164             }
    +165 
    +166             return cells;
    +167         },
    +168 
    +169         solveCollision : function( callback ) {
    +170             var i,j,k;
    +171 
    +172             for( i=0; i<this.elements.length; i++ ) {
    +173                 var cell= this.elements[i];
    +174 
    +175                 if ( cell.length>1 ) {  // at least 2 elements could collide
    +176                     this._solveCollisionCell( cell, callback );
    +177                 }
    +178             }
    +179         },
    +180 
    +181         _solveCollisionCell : function( cell, callback ) {
    +182             var i,j;
    +183 
    +184             for( i=0; i<cell.length; i++ ) {
    +185 
    +186                 var pivot= cell[i];
    +187                 this.r0.setBounds( pivot.x, pivot.y, pivot.width, pivot.height );
    +188 
    +189                 for( j=i+1; j<cell.length; j++ ) {
    +190                     var c= cell[j];
    +191 
    +192                     if ( this.r0.intersects( this.r1.setBounds( c.x, c.y, c.width, c.height ) ) ) {
    +193                         callback( pivot, c );
    +194                     }
    +195                 }
    +196             }
    +197         },
    +198 
    +199         /**
    +200          *
    +201          * @param x
    +202          * @param y
    +203          * @param w
    +204          * @param h
    +205          * @param oncollide function that returns boolean. if returns true, stop testing collision.
    +206          */
    +207         collide : function( x,y,w,h, oncollide ) {
    +208             x|=0;
    +209             y|=0;
    +210             w|=0;
    +211             h|=0;
    +212 
    +213             var cells= this.__getCells( x,y,w,h );
    +214             var i,j,l;
    +215             var el= this.elements;
    +216 
    +217             this.r0.setBounds( x,y,w,h );
    +218 
    +219             for( i=0; i<cells.length; i++ ) {
    +220                 var cell= cells[i];
    +221 
    +222                 var elcell= el[cell];
    +223                 for( j=0, l=elcell.length; j<l; j++ ) {
    +224                     var obj= elcell[j];
    +225 
    +226                     this.r1.setBounds( obj.x, obj.y, obj.width, obj.height );
    +227 
    +228                     // collides
    +229                     if ( this.r0.intersects( this.r1 ) ) {
    +230                         if ( oncollide(obj) ) {
    +231                             return;
    +232                         }
    +233                     }
    +234                 }
    +235             }
    +236         }
    +237 
    +238     }
    +239 });
    +240 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_ColorUtil_Color.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_ColorUtil_Color.js.html new file mode 100644 index 00000000..3cb5b8f5 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_ColorUtil_Color.js.html @@ -0,0 +1,301 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * @author: Mario Gonzalez (@onedayitwilltake) and Ibon Tolosana (@hyperandroid)
    +  5  *
    +  6  * Helper classes for color manipulation.
    +  7  *
    +  8  **/
    +  9 
    + 10 CAAT.Module({
    + 11 
    + 12     /**
    + 13      * @name ColorUtil
    + 14      * @memberOf CAAT.Module
    + 15      * @namespace
    + 16      */
    + 17 
    + 18     /**
    + 19      * @name Color
    + 20      * @memberOf CAAT.Module.ColorUtil
    + 21      * @namespace
    + 22      */
    + 23 
    + 24 
    + 25     defines:"CAAT.Module.ColorUtil.Color",
    + 26     depends:[
    + 27     ],
    + 28     constants:{
    + 29 
    + 30         /**
    + 31          * @lends CAAT.Module.ColorUtil.Color
    + 32          */
    + 33 
    + 34         /**
    + 35          * Enumeration to define types of color ramps.
    + 36          * @enum {number}
    + 37          */
    + 38         RampEnumeration:{
    + 39             RAMP_RGBA:0,
    + 40             RAMP_RGB:1,
    + 41             RAMP_CHANNEL_RGB:2,
    + 42             RAMP_CHANNEL_RGBA:3,
    + 43             RAMP_CHANNEL_RGB_ARRAY:4,
    + 44             RAMP_CHANNEL_RGBA_ARRAY:5
    + 45         },
    + 46 
    + 47         /**
    + 48          * HSV to RGB color conversion
    + 49          * <p>
    + 50          * H runs from 0 to 360 degrees<br>
    + 51          * S and V run from 0 to 100
    + 52          * <p>
    + 53          * Ported from the excellent java algorithm by Eugene Vishnevsky at:
    + 54          * http://www.cs.rit.edu/~ncs/color/t_convert.html
    + 55          *
    + 56          * @static
    + 57          */
    + 58         hsvToRgb:function (h, s, v) {
    + 59             var r, g, b, i, f, p, q, t;
    + 60 
    + 61             // Make sure our arguments stay in-range
    + 62             h = Math.max(0, Math.min(360, h));
    + 63             s = Math.max(0, Math.min(100, s));
    + 64             v = Math.max(0, Math.min(100, v));
    + 65 
    + 66             // We accept saturation and value arguments from 0 to 100 because that's
    + 67             // how Photoshop represents those values. Internally, however, the
    + 68             // saturation and value are calculated from a range of 0 to 1. We make
    + 69             // That conversion here.
    + 70             s /= 100;
    + 71             v /= 100;
    + 72 
    + 73             if (s === 0) {
    + 74                 // Achromatic (grey)
    + 75                 r = g = b = v;
    + 76                 return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
    + 77             }
    + 78 
    + 79             h /= 60; // sector 0 to 5
    + 80             i = Math.floor(h);
    + 81             f = h - i; // factorial part of h
    + 82             p = v * (1 - s);
    + 83             q = v * (1 - s * f);
    + 84             t = v * (1 - s * (1 - f));
    + 85 
    + 86             switch (i) {
    + 87                 case 0:
    + 88                     r = v;
    + 89                     g = t;
    + 90                     b = p;
    + 91                     break;
    + 92 
    + 93                 case 1:
    + 94                     r = q;
    + 95                     g = v;
    + 96                     b = p;
    + 97                     break;
    + 98 
    + 99                 case 2:
    +100                     r = p;
    +101                     g = v;
    +102                     b = t;
    +103                     break;
    +104 
    +105                 case 3:
    +106                     r = p;
    +107                     g = q;
    +108                     b = v;
    +109                     break;
    +110 
    +111                 case 4:
    +112                     r = t;
    +113                     g = p;
    +114                     b = v;
    +115                     break;
    +116 
    +117                 default: // case 5:
    +118                     r = v;
    +119                     g = p;
    +120                     b = q;
    +121             }
    +122 
    +123             return new CAAT.Module.ColorUtil.Color(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255));
    +124         },
    +125 
    +126         /**
    +127          * Interpolate the color between two given colors. The return value will be a calculated color
    +128          * among the two given initial colors which corresponds to the 'step'th color of the 'nsteps'
    +129          * calculated colors.
    +130          * @param r0 {number} initial color red component.
    +131          * @param g0 {number} initial color green component.
    +132          * @param b0 {number} initial color blue component.
    +133          * @param r1 {number} final color red component.
    +134          * @param g1 {number} final color green component.
    +135          * @param b1 {number} final color blue component.
    +136          * @param nsteps {number} number of colors to calculate including the two given colors. If 16 is passed as value,
    +137          * 14 colors plus the two initial ones will be calculated.
    +138          * @param step {number} return this color index of all the calculated colors.
    +139          *
    +140          * @return { {r{number}, g{number}, b{number}} } return an object with the new calculated color components.
    +141          * @static
    +142          */
    +143         interpolate:function (r0, g0, b0, r1, g1, b1, nsteps, step) {
    +144 
    +145             var r, g, b;
    +146 
    +147             if (step <= 0) {
    +148                 return {
    +149                     r:r0,
    +150                     g:g0,
    +151                     b:b0
    +152                 };
    +153             } else if (step >= nsteps) {
    +154                 return {
    +155                     r:r1,
    +156                     g:g1,
    +157                     b:b1
    +158                 };
    +159             }
    +160 
    +161             r = (r0 + (r1 - r0) / nsteps * step) >> 0;
    +162             g = (g0 + (g1 - g0) / nsteps * step) >> 0;
    +163             b = (b0 + (b1 - b0) / nsteps * step) >> 0;
    +164 
    +165             if (r > 255) {
    +166                 r = 255;
    +167             } else if (r < 0) {
    +168                 r = 0;
    +169             }
    +170             if (g > 255) {
    +171                 g = 255;
    +172             } else if (g < 0) {
    +173                 g = 0;
    +174             }
    +175             if (b > 255) {
    +176                 b = 255;
    +177             } else if (b < 0) {
    +178                 b = 0;
    +179             }
    +180 
    +181             return {
    +182                 r:r,
    +183                 g:g,
    +184                 b:b
    +185             };
    +186         },
    +187 
    +188         /**
    +189          * Generate a ramp of colors from an array of given colors.
    +190          * @param fromColorsArray {[number]} an array of colors. each color is defined by an integer number from which
    +191          * color components will be extracted. Be aware of the alpha component since it will also be interpolated for
    +192          * new colors.
    +193          * @param rampSize {number} number of colors to produce.
    +194          * @param returnType {CAAT.ColorUtils.RampEnumeration} a value of CAAT.ColorUtils.RampEnumeration enumeration.
    +195          *
    +196          * @return { [{number},{number},{number},{number}] } an array of integers each of which represents a color of
    +197          * the calculated color ramp.
    +198          *
    +199          * @static
    +200          */
    +201         makeRGBColorRamp:function (fromColorsArray, rampSize, returnType) {
    +202 
    +203             var ramp = [], nc = fromColorsArray.length - 1, chunk = rampSize / nc, i, j,
    +204                 na, nr, ng, nb,
    +205                 c, a0, r0, g0, b0,
    +206                 c1, a1, r1, g1, b1,
    +207                 da, dr, dg, db;
    +208 
    +209             for (i = 0; i < nc; i += 1) {
    +210                 c = fromColorsArray[i];
    +211                 a0 = (c >> 24) & 0xff;
    +212                 r0 = (c & 0xff0000) >> 16;
    +213                 g0 = (c & 0xff00) >> 8;
    +214                 b0 = c & 0xff;
    +215 
    +216                 c1 = fromColorsArray[i + 1];
    +217                 a1 = (c1 >> 24) & 0xff;
    +218                 r1 = (c1 & 0xff0000) >> 16;
    +219                 g1 = (c1 & 0xff00) >> 8;
    +220                 b1 = c1 & 0xff;
    +221 
    +222                 da = (a1 - a0) / chunk;
    +223                 dr = (r1 - r0) / chunk;
    +224                 dg = (g1 - g0) / chunk;
    +225                 db = (b1 - b0) / chunk;
    +226 
    +227                 for (j = 0; j < chunk; j += 1) {
    +228                     na = (a0 + da * j) >> 0;
    +229                     nr = (r0 + dr * j) >> 0;
    +230                     ng = (g0 + dg * j) >> 0;
    +231                     nb = (b0 + db * j) >> 0;
    +232 
    +233                     var re = CAAT.Module.ColorUtil.Color.RampEnumeration;
    +234 
    +235                     switch (returnType) {
    +236                         case re.RAMP_RGBA:
    +237                             ramp.push('argb(' + na + ',' + nr + ',' + ng + ',' + nb + ')');
    +238                             break;
    +239                         case re.RAMP_RGB:
    +240                             ramp.push('rgb(' + nr + ',' + ng + ',' + nb + ')');
    +241                             break;
    +242                         case re.RAMP_CHANNEL_RGB:
    +243                             ramp.push(0xff000000 | nr << 16 | ng << 8 | nb);
    +244                             break;
    +245                         case re.RAMP_CHANNEL_RGBA:
    +246                             ramp.push(na << 24 | nr << 16 | ng << 8 | nb);
    +247                             break;
    +248                         case re.RAMP_CHANNEL_RGBA_ARRAY:
    +249                             ramp.push([ nr, ng, nb, na ]);
    +250                             break;
    +251                         case re.RAMP_CHANNEL_RGB_ARRAY:
    +252                             ramp.push([ nr, ng, nb ]);
    +253                             break;
    +254                     }
    +255                 }
    +256             }
    +257 
    +258             return ramp;
    +259 
    +260         },
    +261 
    +262         random:function () {
    +263             var a = '0123456789abcdef';
    +264             var c = '#';
    +265             for (var i = 0; i < 3; i++) {
    +266                 c += a[ (Math.random() * a.length) >> 0 ];
    +267             }
    +268             return c;
    +269         }
    +270     },
    +271 
    +272     extendsWith:{
    +273         __init:function (r, g, b) {
    +274             this.r = r || 255;
    +275             this.g = g || 255;
    +276             this.b = b || 255;
    +277             return this;
    +278         },
    +279 
    +280         r:255,
    +281         g:255,
    +282         b:255,
    +283 
    +284         /**
    +285          * Get color hexadecimal representation.
    +286          * @return {string} a string with color hexadecimal representation.
    +287          */
    +288         toHex:function () {
    +289             // See: http://jsperf.com/rgb-decimal-to-hex/5
    +290             return ('000000' + ((this.r << 16) + (this.g << 8) + this.b).toString(16)).slice(-6);
    +291         }
    +292     }
    +293 });
    +294 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Debug_Debug.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Debug_Debug.js.html new file mode 100644 index 00000000..8ea2dc42 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Debug_Debug.js.html @@ -0,0 +1,473 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * Get realtime Debug information of CAAT's activity.
    +  5  * Set CAAT.DEBUG=1 before any CAAT.Director object creation.
    +  6  * This class creates a DOM node called 'caat-debug' and associated styles
    +  7  * The debug panel is minimized by default and shows short information. It can be expanded and minimized again by clicking on it
    +  8  *
    +  9  */
    + 10 
    + 11 CAAT.Module( {
    + 12 
    + 13     /**
    + 14      * @name Debug
    + 15      * @memberOf CAAT.Module
    + 16      * @namespace
    + 17      */
    + 18 
    + 19     /**
    + 20      * @name Debug
    + 21      * @memberOf CAAT.Module.Debug
    + 22      * @constructor
    + 23      */
    + 24 
    + 25     defines : "CAAT.Module.Debug.Debug",
    + 26     depends : [
    + 27         "CAAT.Event.AnimationLoop"
    + 28     ],
    + 29     extendsWith : {
    + 30 
    + 31         /**
    + 32          * @lends CAAT.Module.Debug.Debug.prototype
    + 33          */
    + 34 
    + 35         width:              0,
    + 36         height:             0,
    + 37         canvas:             null,
    + 38         ctx:                null,
    + 39         statistics:         null,
    + 40         framerate:          null,
    + 41         textContainer:      null,
    + 42         textFPS:            null,
    + 43         textEntitiesTotal:  null,
    + 44         textEntitiesActive: null,
    + 45         textDraws:          null,
    + 46         textDrawTime:       null,
    + 47         textRAFTime:        null,
    + 48         textDirtyRects:     null,
    + 49         textDiscardDR:      null,
    + 50 
    + 51         frameTimeAcc :      0,
    + 52         frameRAFAcc :       0,
    + 53 
    + 54         canDebug:           false,
    + 55 
    + 56         SCALE:  60,
    + 57 
    + 58         debugTpl: 
    + 59             "    <style type=\"text/css\">"+
    + 60             "        #caat-debug {"+
    + 61             "            z-index: 10000;"+
    + 62             "            position:fixed;"+
    + 63             "            bottom:0;"+
    + 64             "            left:0;"+
    + 65             "            width:100%;"+
    + 66             "            background-color: rgba(0,0,0,0.8);"+
    + 67             "        }"+
    + 68             "        #caat-debug.caat_debug_max {"+
    + 69             "            margin-bottom: 0px;"+
    + 70             "        }"+
    + 71             "        .caat_debug_bullet {"+
    + 72             "            display:inline-block;"+
    + 73             "            background-color:#f00;"+
    + 74             "            width:8px;"+
    + 75             "            height:8px;"+
    + 76             "            border-radius: 4px;"+
    + 77             "            margin-left:10px;"+
    + 78             "            margin-right:2px;"+
    + 79             "        }"+
    + 80             "        .caat_debug_description {"+
    + 81             "            font-size:11px;"+
    + 82             "            font-family: helvetica, arial;"+
    + 83             "            color: #aaa;"+
    + 84             "            display: inline-block;"+
    + 85             "        }"+
    + 86             "        .caat_debug_value {"+
    + 87             "            font-size:11px;"+
    + 88             "            font-family: helvetica, arial;"+
    + 89             "            color: #fff;"+
    + 90             "            width:25px;"+
    + 91             "            text-align: right;"+
    + 92             "            display: inline-block;"+
    + 93             "            margin-right: .3em;"+
    + 94             "        }"+
    + 95             "        .caat_debug_indicator {"+
    + 96             "            float: right;"+
    + 97             "        }"+
    + 98             "        #debug_tabs {"+
    + 99             "            border-top: 1px solid #888;"+
    +100             "            height:25px;"+
    +101             "        }"+
    +102             "        .tab_max_min {"+
    +103             "            font-family: helvetica, arial;"+
    +104             "            font-size: 12px;"+
    +105             "            font-weight: bold;"+
    +106             "            color: #888;"+
    +107             "            border-right: 1px solid #888;"+
    +108             "            float: left;"+
    +109             "            cursor: pointer;"+
    +110             "            padding-left: 5px;"+
    +111             "            padding-right: 5px;"+
    +112             "            padding-top: 5px;"+
    +113             "            height: 20px;"+
    +114             "        }"+
    +115             "        .debug_tabs_content_hidden {"+
    +116             "            display: none;"+
    +117             "            width: 100%;"+
    +118             "        }"+
    +119             "        .debug_tabs_content_visible {"+
    +120             "            display: block;"+
    +121             "            width: 100%;"+
    +122             "        }"+
    +123             "        .checkbox_enabled {"+
    +124             "            display:inline-block;"+
    +125             "            background-color:#eee;"+
    +126             "            border: 1px solid #eee;"+
    +127             "            width:6px;"+
    +128             "            height:8px;"+
    +129             "            margin-left:12px;"+
    +130             "            margin-right:2px;"+
    +131             "            cursor: pointer;"+
    +132             "        }"+
    +133             "        .checkbox_disabled {"+
    +134             "            display:inline-block;"+
    +135             "            width:6px;"+
    +136             "            height:8px;"+
    +137             "            background-color: #333;"+
    +138             "            border: 1px solid #eee;"+
    +139             "            margin-left:12px;"+
    +140             "            margin-right:2px;"+
    +141             "            cursor: pointer;"+
    +142             "        }"+
    +143             "        .checkbox_description {"+
    +144             "            font-size:11px;"+
    +145             "            font-family: helvetica, arial;"+
    +146             "            color: #fff;"+
    +147             "        }"+
    +148             "        .debug_tab {"+
    +149             "            font-family: helvetica, arial;"+
    +150             "            font-size: 12px;"+
    +151             "            color: #fff;"+
    +152             "            border-right: 1px solid #888;"+
    +153             "            float: left;"+
    +154             "            padding-left: 5px;"+
    +155             "            padding-right: 5px;"+
    +156             "            height: 20px;"+
    +157             "            padding-top: 5px;"+
    +158             "            cursor: default;"+
    +159             "        }"+
    +160             "        .debug_tab_selected {"+
    +161             "            background-color: #444;"+
    +162             "            cursor: default;"+
    +163             "        }"+
    +164             "        .debug_tab_not_selected {"+
    +165             "            background-color: #000;"+
    +166             "            cursor: pointer;"+
    +167             "        }"+
    +168             "    </style>"+
    +169             "    <div id=\"caat-debug\">"+
    +170             "        <div id=\"debug_tabs\">"+
    +171             "            <span class=\"tab_max_min\" onCLick=\"javascript: var debug = document.getElementById('debug_tabs_content');if (debug.className === 'debug_tabs_content_visible') {debug.className = 'debug_tabs_content_hidden'} else {debug.className = 'debug_tabs_content_visible'}\"> CAAT Debug panel </span>"+
    +172             "            <span id=\"caat-debug-tab0\" class=\"debug_tab debug_tab_selected\">Performance</span>"+
    +173             "            <span id=\"caat-debug-tab1\" class=\"debug_tab debug_tab_not_selected\">Controls</span>"+
    +174             "            <span class=\"caat_debug_indicator\">"+
    +175             "                <span class=\"caat_debug_bullet\" style=\"background-color:#0f0;\"></span>"+
    +176             "                <span class=\"caat_debug_description\">Draw Time: </span>"+
    +177             "                <span class=\"caat_debug_value\" id=\"textDrawTime\">5.46</span>"+
    +178             "                <span class=\"caat_debug_description\">ms.</span>"+
    +179             "            </span>"+
    +180             "            <span class=\"caat_debug_indicator\">"+
    +181             "                <span class=\"caat_debug_bullet\" style=\"background-color:#f00;\"></span>"+
    +182             "                <span class=\"caat_debug_description\">FPS: </span>"+
    +183             "                <span class=\"caat_debug_value\" id=\"textFPS\">48</span>"+
    +184             "            </span>"+
    +185             "        </div>"+
    +186             "        <div id=\"debug_tabs_content\" class=\"debug_tabs_content_hidden\">"+
    +187             "            <div id=\"caat-debug-tab0-content\">"+
    +188             "                <canvas id=\"caat-debug-canvas\" height=\"60\"></canvas>"+
    +189             "                <div>"+
    +190             "                    <span>"+
    +191             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#0f0;\"></span>"+
    +192             "                        <span class=\"caat_debug_description\">RAF Time:</span>"+
    +193             "                        <span class=\"caat_debug_value\" id=\"textRAFTime\">20.76</span>"+
    +194             "                        <span class=\"caat_debug_description\">ms.</span>"+
    +195             "                    </span>"+
    +196             "                    <span>"+
    +197             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#0ff;\"></span>"+
    +198             "                        <span class=\"caat_debug_description\">Entities Total: </span>"+
    +199             "                        <span class=\"caat_debug_value\" id=\"textEntitiesTotal\">41</span>"+
    +200             "                    </span>"+
    +201             "                    <span>"+
    +202             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#0ff;\"></span>"+
    +203             "                        <span class=\"caat_debug_description\">Entities Active: </span>"+
    +204             "                        <span class=\"caat_debug_value\" id=\"textEntitiesActive\">37</span>"+
    +205             "                    </span>"+
    +206             "                    <span>"+
    +207             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#00f;\"></span>"+
    +208             "                        <span class=\"caat_debug_description\">Draws: </span>"+
    +209             "                        <span class=\"caat_debug_value\" id=\"textDraws\">0</span>"+
    +210             "                    </span>"+
    +211             "                    <span>"+
    +212             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#00f;\"></span>"+
    +213             "                        <span class=\"caat_debug_description\">DirtyRects: </span>"+
    +214             "                        <span class=\"caat_debug_value\" id=\"textDirtyRects\">0</span>"+
    +215             "                    </span>"+
    +216             "                    <span>"+
    +217             "                        <span class=\"caat_debug_bullet\" style=\"background-color:#00f;\"></span>"+
    +218             "                        <span class=\"caat_debug_description\">Discard DR: </span>"+
    +219             "                        <span class=\"caat_debug_value\" id=\"textDiscardDR\">0</span>"+
    +220             "                    </span>"+
    +221             "                </div>"+
    +222             "            </div>"+
    +223             "            <div id=\"caat-debug-tab1-content\">"+
    +224             "                <div>"+
    +225             "                    <div>"+
    +226             "                        <span id=\"control-sound\"></span>"+
    +227             "                        <span class=\"checkbox_description\">Sound</span>"+
    +228             "                    </div>"+
    +229             "                    <div>"+
    +230             "                        <span id=\"control-music\"></span>"+
    +231             "                        <span class=\"checkbox_description\">Music</span>"+
    +232             "                    </div>"+
    +233             "                    <div>"+
    +234             "                        <span id=\"control-aabb\"></span>"+
    +235             "                        <span class=\"checkbox_description\">AA Bounding Boxes</span>"+
    +236             "                    </div>"+
    +237             "                    <div>"+
    +238             "                        <span id=\"control-bb\"></span>"+
    +239             "                        <span class=\"checkbox_description\">Bounding Boxes</span>"+
    +240             "                    </div>"+
    +241             "                    <div>"+
    +242             "                        <span id=\"control-dr\"></span>"+
    +243             "                        <span class=\"checkbox_description\">Dirty Rects</span>"+
    +244             "                    </div>"+
    +245             "                </div>"+
    +246             "            </div>"+
    +247             "        </div>"+
    +248             "    </div>",
    +249 
    +250 
    +251         setScale : function(s) {
    +252             this.scale= s;
    +253             return this;
    +254         },
    +255 
    +256         initialize: function(w,h) {
    +257             w= window.innerWidth;
    +258 
    +259             this.width= w;
    +260             this.height= h;
    +261 
    +262             this.framerate = {
    +263                 refreshInterval: CAAT.FPS_REFRESH || 500,   // refresh every ? ms, updating too quickly gives too large rounding errors
    +264                 frames: 0,                                  // number offrames since last refresh
    +265                 timeLastRefresh: 0,                         // When was the framerate counter refreshed last
    +266                 fps: 0,                                     // current framerate
    +267                 prevFps: -1,                                // previously drawn FPS
    +268                 fpsMin: 1000,                               // minimum measured framerate
    +269                 fpsMax: 0                                   // maximum measured framerate
    +270             };
    +271 
    +272             var debugContainer= document.getElementById('caat-debug');
    +273             if (!debugContainer) {
    +274                 var wrap = document.createElement('div');
    +275                 wrap.innerHTML=this.debugTpl;
    +276                 document.body.appendChild(wrap);
    +277 
    +278                 eval( ""+
    +279                     " var __x= CAAT;" +
    +280                     "        function initCheck( name, bool, callback ) {"+
    +281                     "            var elem= document.getElementById(name);"+
    +282                     "            if ( elem ) {"+
    +283                     "                elem.className= (bool) ? \"checkbox_enabled\" : \"checkbox_disabled\";"+
    +284                     "                if ( callback ) {"+
    +285                     "                    elem.addEventListener( \"click\", (function(elem, callback) {"+
    +286                     "                        return function(e) {"+
    +287                     "                            elem.__value= !elem.__value;"+
    +288                     "                            elem.className= (elem.__value) ? \"checkbox_enabled\" : \"checkbox_disabled\";"+
    +289                     "                            callback(e,elem.__value);"+
    +290                     "                        }"+
    +291                     "                    })(elem, callback), false );"+
    +292                     "                }"+
    +293                     "                elem.__value= bool;"+
    +294                     "            }"+
    +295                     "        }"+
    +296                     "        function setupTabs() {"+
    +297                     "            var numTabs=0;"+
    +298                     "            var elem;"+
    +299                     "            var elemContent;"+
    +300                     "            do {"+
    +301                     "                elem= document.getElementById(\"caat-debug-tab\"+numTabs);"+
    +302                     "                if ( elem ) {"+
    +303                     "                    elemContent= document.getElementById(\"caat-debug-tab\"+numTabs+\"-content\");"+
    +304                     "                    if ( elemContent ) {"+
    +305                     "                        elemContent.style.display= numTabs===0 ? 'block' : 'none';"+
    +306                     "                        elem.className= numTabs===0 ? \"debug_tab debug_tab_selected\" : \"debug_tab debug_tab_not_selected\";"+
    +307                     "                        elem.addEventListener( \"click\", (function(tabIndex) {"+
    +308                     "                            return function(e) {"+
    +309                     "                                for( var i=0; i<numTabs; i++ ) {"+
    +310                     "                                    var _elem= document.getElementById(\"caat-debug-tab\"+i);"+
    +311                     "                                    var _elemContent= document.getElementById(\"caat-debug-tab\"+i+\"-content\");"+
    +312                     "                                    _elemContent.style.display= i===tabIndex ? 'block' : 'none';"+
    +313                     "                                    _elem.className= i===tabIndex ? \"debug_tab debug_tab_selected\" : \"debug_tab debug_tab_not_selected\";"+
    +314                     "                                }"+
    +315                     "                            }"+
    +316                     "                        })(numTabs), false );"+
    +317                     "                    }"+
    +318                     "                    numTabs++;"+
    +319                     "                }"+
    +320                     "            } while( elem );"+
    +321                     "        }"+
    +322                     "        initCheck( \"control-sound\", __x.director[0].isSoundEffectsEnabled(), function(e, bool) {"+
    +323                     "            __x.director[0].setSoundEffectsEnabled(bool);"+
    +324                     "        } );"+
    +325                     "        initCheck( \"control-music\", __x.director[0].isMusicEnabled(), function(e, bool) {"+
    +326                     "            __x.director[0].setMusicEnabled(bool);"+
    +327                     "        } );"+
    +328                     "        initCheck( \"control-aabb\", CAAT.DEBUGBB, function(e,bool) {"+
    +329                     "            CAAT.DEBUGAABB= bool;"+
    +330                     "            __x.director[0].currentScene.dirty= true;"+
    +331                     "        } );"+
    +332                     "        initCheck( \"control-bb\", CAAT.DEBUGBB, function(e,bool) {"+
    +333                     "            CAAT.DEBUGBB= bool;"+
    +334                     "            if ( bool ) {"+
    +335                     "                CAAT.DEBUGAABB= true;"+
    +336                     "            }"+
    +337                     "            __x.director[0].currentScene.dirty= true;"+
    +338                     "        } );"+
    +339                     "        initCheck( \"control-dr\", CAAT.DEBUG_DIRTYRECTS , function( e,bool ) {"+
    +340                     "            CAAT.DEBUG_DIRTYRECTS= bool;"+
    +341                     "        });"+
    +342                     "        setupTabs();" );
    +343 
    +344             }
    +345 
    +346             this.canvas= document.getElementById('caat-debug-canvas');
    +347             if ( null===this.canvas ) {
    +348                 this.canDebug= false;
    +349                 return;
    +350             }
    +351 
    +352             this.canvas.width= w;
    +353             this.canvas.height=h;
    +354             this.ctx= this.canvas.getContext('2d');
    +355 
    +356             this.ctx.fillStyle= '#000';
    +357             this.ctx.fillRect(0,0,this.width,this.height);
    +358 
    +359             this.textFPS= document.getElementById("textFPS");
    +360             this.textDrawTime= document.getElementById("textDrawTime");
    +361             this.textRAFTime= document.getElementById("textRAFTime");
    +362             this.textEntitiesTotal= document.getElementById("textEntitiesTotal");
    +363             this.textEntitiesActive= document.getElementById("textEntitiesActive");
    +364             this.textDraws= document.getElementById("textDraws");
    +365             this.textDirtyRects= document.getElementById("textDirtyRects");
    +366             this.textDiscardDR= document.getElementById("textDiscardDR");
    +367 
    +368 
    +369             this.canDebug= true;
    +370 
    +371             return this;
    +372         },
    +373 
    +374         debugInfo : function( statistics ) {
    +375             this.statistics= statistics;
    +376 
    +377             var cc= CAAT;
    +378 
    +379             this.frameTimeAcc+= cc.FRAME_TIME;
    +380             this.frameRAFAcc+= cc.REQUEST_ANIMATION_FRAME_TIME;
    +381 
    +382             /* Update the framerate counter */
    +383             this.framerate.frames++;
    +384             var tt= new Date().getTime() ;
    +385             if ( tt> this.framerate.timeLastRefresh + this.framerate.refreshInterval ) {
    +386                 this.framerate.fps = ( ( this.framerate.frames * 1000 ) / ( tt - this.framerate.timeLastRefresh ) ) | 0;
    +387                 this.framerate.fpsMin = this.framerate.frames > 0 ? Math.min( this.framerate.fpsMin, this.framerate.fps ) : this.framerate.fpsMin;
    +388                 this.framerate.fpsMax = Math.max( this.framerate.fpsMax, this.framerate.fps );
    +389 
    +390                 this.textFPS.innerHTML= this.framerate.fps;
    +391 
    +392                 var value= ((this.frameTimeAcc*100/this.framerate.frames)|0)/100;
    +393                 this.frameTimeAcc=0;
    +394                 this.textDrawTime.innerHTML= value;
    +395 
    +396                 var value2= ((this.frameRAFAcc*100/this.framerate.frames)|0)/100;
    +397                 this.frameRAFAcc=0;
    +398                 this.textRAFTime.innerHTML= value2;
    +399 
    +400                 this.framerate.timeLastRefresh = tt;
    +401                 this.framerate.frames = 0;
    +402 
    +403                 this.paint(value2);
    +404             }
    +405 
    +406             this.textEntitiesTotal.innerHTML= this.statistics.size_total;
    +407             this.textEntitiesActive.innerHTML= this.statistics.size_active;
    +408             this.textDirtyRects.innerHTML= this.statistics.size_dirtyRects;
    +409             this.textDraws.innerHTML= this.statistics.draws;
    +410             this.textDiscardDR.innerHTML= this.statistics.size_discarded_by_dirty_rects;
    +411         },
    +412 
    +413         paint : function( rafValue ) {
    +414             var ctx= this.ctx;
    +415             var t=0;
    +416 
    +417             ctx.drawImage(
    +418                 this.canvas,
    +419                 1, 0, this.width-1, this.height,
    +420                 0, 0, this.width-1, this.height );
    +421 
    +422             ctx.strokeStyle= 'black';
    +423             ctx.beginPath();
    +424             ctx.moveTo( this.width-.5, 0 );
    +425             ctx.lineTo( this.width-.5, this.height );
    +426             ctx.stroke();
    +427 
    +428             ctx.strokeStyle= '#a22';
    +429             ctx.beginPath();
    +430             t= this.height-((20/this.SCALE*this.height)>>0)-.5;
    +431             ctx.moveTo( .5, t );
    +432             ctx.lineTo( this.width+.5, t );
    +433             ctx.stroke();
    +434 
    +435             ctx.strokeStyle= '#aa2';
    +436             ctx.beginPath();
    +437             t= this.height-((30/this.SCALE*this.height)>>0)-.5;
    +438             ctx.moveTo( .5, t );
    +439             ctx.lineTo( this.width+.5, t );
    +440             ctx.stroke();
    +441 
    +442             var fps = Math.min( this.height-(this.framerate.fps/this.SCALE*this.height), 59 );
    +443             if (-1===this.framerate.prevFps) {
    +444                 this.framerate.prevFps= fps|0;
    +445             }
    +446 
    +447             ctx.strokeStyle= '#0ff';//this.framerate.fps<15 ? 'red' : this.framerate.fps<30 ? 'yellow' : 'green';
    +448             ctx.beginPath();
    +449             ctx.moveTo( this.width, (fps|0)-.5 );
    +450             ctx.lineTo( this.width, this.framerate.prevFps-.5 );
    +451             ctx.stroke();
    +452 
    +453             this.framerate.prevFps= fps;
    +454 
    +455 
    +456             var t1= ((this.height-(rafValue/this.SCALE*this.height))>>0)-.5;
    +457             ctx.strokeStyle= '#ff0';
    +458             ctx.beginPath();
    +459             ctx.moveTo( this.width, t1 );
    +460             ctx.lineTo( this.width, t1 );
    +461             ctx.stroke();
    +462         }
    +463     }
    +464 
    +465 });
    +466 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Font_Font.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Font_Font.js.html new file mode 100644 index 00000000..6cda3778 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Font_Font.js.html @@ -0,0 +1,387 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  **/
    +  5 
    +  6 CAAT.Module({
    +  7 
    +  8     /**
    +  9      * @name Font
    + 10      * @memberOf CAAT.Module
    + 11      * @namespace
    + 12      */
    + 13 
    + 14     /**
    + 15      * @name Font
    + 16      * @memberOf CAAT.Module.Font
    + 17      * @constructor
    + 18      */
    + 19 
    + 20     defines : "CAAT.Module.Font.Font",
    + 21     aliases : "CAAT.Font",
    + 22     depends : [
    + 23         "CAAT.Foundation.SpriteImage"
    + 24     ],
    + 25     constants: {
    + 26 
    + 27         /**
    + 28          * @lends CAAT.Module.Font.Font
    + 29          */
    + 30 
    + 31         getFontMetrics:function (font) {
    + 32             var ret;
    + 33             if (CAAT.CSS_TEXT_METRICS) {
    + 34                 try {
    + 35                     ret = CAAT.Module.Font.Font.getFontMetricsCSS(font);
    + 36                     return ret;
    + 37                 } catch (e) {
    + 38 
    + 39                 }
    + 40             }
    + 41 
    + 42             return CAAT.Module.Font.Font.getFontMetricsNoCSS(font);
    + 43         },
    + 44 
    + 45         getFontMetricsNoCSS:function (font) {
    + 46 
    + 47             var re = /(\d+)p[x|t]\s*/i;
    + 48             var res = re.exec(font);
    + 49 
    + 50             var height;
    + 51 
    + 52             if (!res) {
    + 53                 height = 32;     // no px or pt value in font. assume 32.)
    + 54             } else {
    + 55                 height = res[1] | 0;
    + 56             }
    + 57 
    + 58             var ascent = height - 1;
    + 59             var h = (height + height * .2) | 0;
    + 60             return {
    + 61                 height:h,
    + 62                 ascent:ascent,
    + 63                 descent:h - ascent
    + 64             }
    + 65 
    + 66         },
    + 67 
    + 68         /**
    + 69          * Totally ripped from:
    + 70          *
    + 71          * jQuery (offset function)
    + 72          * Daniel Earwicker: http://stackoverflow.com/questions/1134586/how-can-you-find-the-height-of-text-on-an-html-canvas
    + 73          *
    + 74          * @param font
    + 75          * @return {*}
    + 76          */
    + 77         getFontMetricsCSS:function (font) {
    + 78 
    + 79             function offset(elem) {
    + 80 
    + 81                 var box, docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, top, left;
    + 82                 var doc = elem && elem.ownerDocument;
    + 83                 docElem = doc.documentElement;
    + 84 
    + 85                 box = elem.getBoundingClientRect();
    + 86                 //win = getWindow( doc );
    + 87 
    + 88                 body = document.body;
    + 89                 win = doc.nodeType === 9 ? doc.defaultView || doc.parentWindow : false;
    + 90 
    + 91                 clientTop = docElem.clientTop || body.clientTop || 0;
    + 92                 clientLeft = docElem.clientLeft || body.clientLeft || 0;
    + 93                 scrollTop = win.pageYOffset || docElem.scrollTop;
    + 94                 scrollLeft = win.pageXOffset || docElem.scrollLeft;
    + 95                 top = box.top + scrollTop - clientTop;
    + 96                 left = box.left + scrollLeft - clientLeft;
    + 97 
    + 98                 return { top:top, left:left };
    + 99             }
    +100 
    +101             try {
    +102                 var text = document.createElement("span");
    +103                 text.style.font = font;
    +104                 text.innerHTML = "Hg";
    +105 
    +106                 var block = document.createElement("div");
    +107                 block.style.display = "inline-block";
    +108                 block.style.width = "1px";
    +109                 block.style.heigh = "0px";
    +110 
    +111                 var div = document.createElement("div");
    +112                 div.appendChild(text);
    +113                 div.appendChild(block);
    +114 
    +115 
    +116                 var body = document.body;
    +117                 body.appendChild(div);
    +118 
    +119                 try {
    +120 
    +121                     var result = {};
    +122 
    +123                     block.style.verticalAlign = 'baseline';
    +124                     result.ascent = offset(block).top - offset(text).top;
    +125 
    +126                     block.style.verticalAlign = 'bottom';
    +127                     result.height = offset(block).top - offset(text).top;
    +128 
    +129                     result.ascent = Math.ceil(result.ascent);
    +130                     result.height = Math.ceil(result.height);
    +131 
    +132                     result.descent = result.height - result.ascent;
    +133 
    +134                     return result;
    +135 
    +136                 } finally {
    +137                     body.removeChild(div);
    +138                 }
    +139             } catch (e) {
    +140                 return null;
    +141             }
    +142         }
    +143     },
    +144     extendsWith:function () {
    +145 
    +146         var UNKNOWN_CHAR_WIDTH = 10;
    +147 
    +148         return {
    +149 
    +150             /**
    +151              * @lends CAAT.Module.Font.Font.prototype
    +152              */
    +153 
    +154             fontSize:10,
    +155             fontSizeUnit:"px",
    +156             font:'Sans-Serif',
    +157             fontStyle:'',
    +158             fillStyle:'#fff',
    +159             strokeStyle:null,
    +160             strokeSize:1,
    +161             padding:0,
    +162             image:null,
    +163             charMap:null,
    +164 
    +165             height:0,
    +166             ascent:0,
    +167             descent:0,
    +168 
    +169             setPadding:function (padding) {
    +170                 this.padding = padding;
    +171                 return this;
    +172             },
    +173 
    +174             setFontStyle:function (style) {
    +175                 this.fontStyle = style;
    +176                 return this;
    +177             },
    +178 
    +179             setStrokeSize:function (size) {
    +180                 this.strokeSize = size;
    +181                 return this;
    +182             },
    +183 
    +184             setFontSize:function (fontSize) {
    +185                 this.fontSize = fontSize;
    +186                 this.fontSizeUnit = 'px';
    +187                 return this;
    +188             },
    +189 
    +190             setFont:function (font) {
    +191                 this.font = font;
    +192                 return this;
    +193             },
    +194 
    +195             setFillStyle:function (style) {
    +196                 this.fillStyle = style;
    +197                 return this;
    +198             },
    +199 
    +200             setStrokeStyle:function (style) {
    +201                 this.strokeStyle = style;
    +202                 return this;
    +203             },
    +204 
    +205             createDefault:function (padding) {
    +206                 var str = "";
    +207                 for (var i = 32; i < 128; i++) {
    +208                     str = str + String.fromCharCode(i);
    +209                 }
    +210 
    +211                 return this.create(str, padding);
    +212             },
    +213 
    +214             create:function (chars, padding) {
    +215 
    +216                 padding = padding | 0;
    +217                 this.padding = padding;
    +218 
    +219                 var canvas = document.createElement('canvas');
    +220                 var ctx = canvas.getContext('2d');
    +221 
    +222                 ctx.textBaseline = 'bottom';
    +223                 ctx.font = this.fontStyle + ' ' + this.fontSize + "" + this.fontSizeUnit + " " + this.font;
    +224 
    +225                 var textWidth = 0;
    +226                 var charWidth = [];
    +227                 var i;
    +228                 var x;
    +229                 var cchar;
    +230 
    +231                 for (i = 0; i < chars.length; i++) {
    +232                     var cw = Math.max(1, (ctx.measureText(chars.charAt(i)).width >> 0) + 1) + 2 * padding;
    +233                     charWidth.push(cw);
    +234                     textWidth += cw;
    +235                 }
    +236 
    +237 
    +238                 var fontMetrics = CAAT.Font.getFontMetrics(ctx.font);
    +239                 var baseline = "alphabetic", yoffset, canvasheight;
    +240 
    +241                 canvasheight = fontMetrics.height;
    +242                 this.ascent = fontMetrics.ascent;
    +243                 this.descent = fontMetrics.descent;
    +244                 this.height = fontMetrics.height;
    +245                 yoffset = fontMetrics.ascent;
    +246 
    +247                 canvas.width = textWidth;
    +248                 canvas.height = canvasheight;
    +249                 ctx = canvas.getContext('2d');
    +250 
    +251                 //ctx.textBaseline= 'bottom';
    +252                 ctx.textBaseline = baseline;
    +253                 ctx.font = this.fontStyle + ' ' + this.fontSize + "" + this.fontSizeUnit + " " + this.font;
    +254                 ctx.fillStyle = this.fillStyle;
    +255                 ctx.strokeStyle = this.strokeStyle;
    +256 
    +257                 this.charMap = {};
    +258 
    +259                 x = 0;
    +260                 for (i = 0; i < chars.length; i++) {
    +261                     cchar = chars.charAt(i);
    +262                     ctx.fillText(cchar, x + padding, yoffset);
    +263                     if (this.strokeStyle) {
    +264                         ctx.beginPath();
    +265                         ctx.lineWidth = this.strokeSize;
    +266                         ctx.strokeText(cchar, x + padding, yoffset);
    +267                     }
    +268                     this.charMap[cchar] = {
    +269                         x:x + padding,
    +270                         width:charWidth[i] - 2 * padding,
    +271                         height: this.height
    +272                     };
    +273                     x += charWidth[i];
    +274                 }
    +275 
    +276                 this.image = canvas;
    +277 
    +278                 return this;
    +279             },
    +280 
    +281             setAsSpriteImage:function () {
    +282                 var cm = [];
    +283                 var _index = 0;
    +284                 for (var i in this.charMap) {
    +285                     var _char = i;
    +286                     var charData = this.charMap[i];
    +287 
    +288                     cm[i] = {
    +289                         id:_index++,
    +290                         height:this.height,
    +291                         xoffset:0,
    +292                         letter:_char,
    +293                         yoffset:0,
    +294                         width:charData.width,
    +295                         xadvance:charData.width,
    +296                         x:charData.x,
    +297                         y:0
    +298                     };
    +299                 }
    +300 
    +301                 this.spriteImage = new CAAT.Foundation.SpriteImage().initializeAsGlyphDesigner(this.image, cm);
    +302                 return this;
    +303             },
    +304 
    +305             getAscent:function () {
    +306                 return this.ascent;
    +307             },
    +308 
    +309             getDescent:function () {
    +310                 return this.descent;
    +311             },
    +312 
    +313             stringHeight:function () {
    +314                 return this.height;
    +315             },
    +316 
    +317             getFontData:function () {
    +318                 return {
    +319                     height:this.height,
    +320                     ascent:this.ascent,
    +321                     descent:this.descent
    +322                 };
    +323             },
    +324 
    +325             stringWidth:function (str) {
    +326                 var i, l, w = 0, c;
    +327 
    +328                 for (i = 0, l = str.length; i < l; i++) {
    +329                     c = this.charMap[ str.charAt(i) ];
    +330                     if (c) {
    +331                         w += c.width;
    +332                     } else {
    +333                         w += UNKNOWN_CHAR_WIDTH;
    +334                     }
    +335                 }
    +336 
    +337                 return w;
    +338             },
    +339 
    +340             drawText:function (str, ctx, x, y) {
    +341                 var i, l, charInfo, w;
    +342                 var height = this.image.height;
    +343 
    +344                 for (i = 0, l = str.length; i < l; i++) {
    +345                     charInfo = this.charMap[ str.charAt(i) ];
    +346                     if (charInfo) {
    +347                         w = charInfo.width;
    +348                         if ( w>0 && charInfo.height>0 ) {
    +349                             ctx.drawImage(
    +350                                 this.image,
    +351                                 charInfo.x, 0,
    +352                                 w, height,
    +353                                 x, y,
    +354                                 w, height);
    +355                         }
    +356                         x += w;
    +357                     } else {
    +358                         ctx.strokeStyle = '#f00';
    +359                         ctx.strokeRect(x, y, UNKNOWN_CHAR_WIDTH, height);
    +360                         x += UNKNOWN_CHAR_WIDTH;
    +361                     }
    +362                 }
    +363             },
    +364 
    +365             save:function () {
    +366                 var str = "image/png";
    +367                 var strData = this.image.toDataURL(str);
    +368                 document.location.href = strData.replace(str, "image/octet-stream");
    +369             },
    +370 
    +371             drawSpriteText:function (director, time) {
    +372                 this.spriteImage.drawSpriteText(director, time);
    +373             }
    +374 
    +375         }
    +376     }
    +377 
    +378 });
    +379 
    +380 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMBumpMapping.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMBumpMapping.js.html new file mode 100644 index 00000000..feee121f --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMBumpMapping.js.html @@ -0,0 +1,275 @@ +
      1 CAAT.Module({
    +  2 
    +  3 
    +  4     /**
    +  5      * @name IMBumpMapping
    +  6      * @memberOf CAAT.Module.Image.ImageProcessor
    +  7      * @extends CAAT.Module.Image.ImageProcessor.ImageProcessor
    +  8      * @constructor
    +  9      */
    + 10 
    + 11 
    + 12     defines : "CAAT.Module.Image.ImageProcess.IMBumpMapping",
    + 13     depends : [
    + 14         "CAAT.Module.Image.ImageProcess.ImageProcessor"
    + 15     ],
    + 16     extendsClass : "CAAT.Module.Image.ImageProcess.ImageProcessor",
    + 17     extendsWith : {
    + 18 
    + 19         /**
    + 20          * @lends CAAT.Module.Image.ImageProcessor.IMBumpMapping.prototype
    + 21          */
    + 22 
    + 23         // bump
    + 24         m_avgX:         null,
    + 25         m_avgY:         null,
    + 26         m_tt:           null,
    + 27         phong:          null,
    + 28 
    + 29         m_radius:       75,
    + 30 
    + 31         m_lightcolor:   null,
    + 32         bcolor:         false,
    + 33         lightPosition:  [],
    + 34 
    + 35         /**
    + 36          * Initializes internal bump effect data.
    + 37          *
    + 38          * @param image {HTMLImageElement}
    + 39          * @param radius {number} lights radius.
    + 40          *
    + 41          * @private
    + 42          */
    + 43         prepareBump : function(image, radius) {
    + 44             var i,j;
    + 45 
    + 46             this.m_radius= (radius ? radius : 75);
    + 47 
    + 48             var imageData= this.grabPixels(image);
    + 49 
    + 50             this.m_tt= this.makeArray(this.height,0);
    + 51             for( i=0; i<this.height; i++ ){
    + 52                 this.m_tt[ i ]=this.width*i;
    + 53             }
    + 54 
    + 55             this.m_avgX= this.makeArray2D(this.height,this.width,0);
    + 56             this.m_avgY= this.makeArray2D(this.height,this.width,0);
    + 57 
    + 58             var bump=this.makeArray2D(this.height,this.width,0);
    + 59 
    + 60             if ( null===imageData ) {
    + 61                 return;
    + 62             }
    + 63             
    + 64             var sourceImagePixels= imageData.data;
    + 65 
    + 66             for (i=0;i<this.height;i++) {
    + 67                 for (j=0;j<this.width;j++) {
    + 68                     var pos= (i*this.width+j)*4;
    + 69                     bump[i][j]=
    + 70                         sourceImagePixels[pos  ]+
    + 71                         sourceImagePixels[pos+1]+
    + 72                         sourceImagePixels[pos+2];
    + 73                 }
    + 74             }
    + 75 
    + 76             bump= this.soften( bump );
    + 77 
    + 78             for (var x=1;x<this.width-1;x++)    {
    + 79                 for (var y=1;y<this.height-1;y++)   {
    + 80                     this.m_avgX[y][x]=Math.floor(bump[y][x+1]-bump[y][x-1]);
    + 81                     this.m_avgY[y][x]=Math.floor(bump[y+1][x]-bump[y-1][x]);
    + 82                 }
    + 83             }
    + 84 
    + 85             bump=null;
    + 86         },
    + 87         /**
    + 88          * Soften source images extracted data on prepareBump method.
    + 89          * @param bump bidimensional array of black and white source image version.
    + 90          * @return bidimensional array with softened version of source image's b&w representation.
    + 91          */
    + 92         soften : function( bump ) {
    + 93             var temp;
    + 94             var sbump=this.makeArray2D( this.height,this.width, 0);
    + 95 
    + 96             for (var j=0;j<this.width;j++) {
    + 97                 for (var i=0;i<this.height;i++) {
    + 98                     temp=(bump[i][j]);
    + 99                     temp+=(bump[(i+1)%this.height][j]);
    +100                     temp+=(bump[(i+this.height-1)%this.height][j]);
    +101                     temp+=(bump[i][(j+1)%this.width]);
    +102                     temp+=(bump[i][(j+this.width-1)%this.width]);
    +103                     temp+=(bump[(i+1)%this.height][(j+1)%this.width]);
    +104                     temp+=(bump[(i+this.height-1)%this.height][(j+this.width-1)%this.width]);
    +105                     temp+=(bump[(i+this.height-1)%this.height][(j+1)%this.width]);
    +106                     temp+=(bump[(i+1)%this.height][(j+this.width-1)%this.width]);
    +107                     temp/=9;
    +108                     sbump[i][j]=temp/3;
    +109                 }
    +110             }
    +111 
    +112             return sbump;
    +113         },
    +114         /**
    +115          * Create a phong image to apply bump effect.
    +116          * @private
    +117          */
    +118         calculatePhong : function( ) {
    +119             this.phong= this.makeArray2D(this.m_radius,this.m_radius,0);
    +120 
    +121             var i,j,z;
    +122             for( i=0; i<this.m_radius; i++ ) {
    +123                 for( j=0; j<this.m_radius; j++ ) {
    +124                     var x= j/this.m_radius;
    +125                     var y= i/this.m_radius;
    +126                     z= (1-Math.sqrt(x*x+y*y))*0.8;
    +127                     if ( z<0 ) {
    +128                         z=0;
    +129                     }
    +130                     this.phong[ i ][ j ]= Math.floor(z*255);
    +131                 }
    +132             }
    +133         },
    +134         /**
    +135          * Generates a bump image.
    +136          * @param dstPixels {ImageData.data} destinarion pixel array to store the calculated image.
    +137          */
    +138         drawColored : function(dstPixels)	{
    +139             var i,j,k;
    +140             for( i=0; i<this.height; i++ ) {
    +141                 for( j=0; j<this.width; j++ ){
    +142 
    +143                     var rrr=0;
    +144                     var ggg=0;
    +145                     var bbb=0;
    +146 
    +147                     for( k=0; k<this.m_lightcolor.length; k++ ) {
    +148 
    +149                         var lx= this.lightPosition[k].x;
    +150                         var ly= this.lightPosition[k].y;
    +151 
    +152                         var dx=Math.floor(Math.abs(this.m_avgX[i][j]-j+lx));
    +153                         var dy=Math.floor(Math.abs(this.m_avgY[i][j]-i+ly));
    +154 
    +155                         if (dx>=this.m_radius) {
    +156                             dx=this.m_radius-1;
    +157                         }
    +158                         if (dy>=this.m_radius) {
    +159                             dy=this.m_radius-1;
    +160                         }
    +161 
    +162                         var c= this.phong[ dx ] [ dy ];
    +163                         var r=0;
    +164                         var g=0;
    +165                         var b=0;
    +166 
    +167                         if ( c>=0 ) {// oscurecer
    +168                             r= (this.m_lightcolor[k][0]*c/128);
    +169                             g= (this.m_lightcolor[k][1]*c/128);
    +170                             b= (this.m_lightcolor[k][2]*c/128);
    +171                         }
    +172                         else {			// blanquear.
    +173                             c=128+c;
    +174                             var rr= (this.m_lightcolor[k][0]);
    +175                             var gg= (this.m_lightcolor[k][1]);
    +176                             var bb= (this.m_lightcolor[k][2]);
    +177 
    +178                             r= Math.floor(rr+ (255-rr)*c/128);
    +179                             g= Math.floor(gg+ (255-gg)*c/128);
    +180                             b= Math.floor(bb+ (255-bb)*c/128);
    +181                         }
    +182 
    +183                         rrr+=r;
    +184                         ggg+=g;
    +185                         bbb+=b;
    +186                     }
    +187 
    +188                     if ( rrr>255 ) {
    +189                         rrr=255;
    +190                     }
    +191                     if ( ggg>255 ) {
    +192                         ggg=255;
    +193                     }
    +194                     if ( bbb>255 ) {
    +195                         bbb=255;
    +196                     }
    +197 
    +198                     var pos= (j+this.m_tt[i])*4;
    +199                     dstPixels[pos  ]= rrr;
    +200                     dstPixels[pos+1]= ggg;
    +201                     dstPixels[pos+2]= bbb;
    +202                     dstPixels[pos+3]= 255;
    +203                 }
    +204             }
    +205         },
    +206         /**
    +207          * Sets lights color.
    +208          * @param colors_rgb_array an array of arrays. Each internal array has three integers defining an RGB color.
    +209          * ie:
    +210          *  [
    +211          *     [ 255,0,0 ],
    +212          *     [ 0,255,0 ]
    +213          *  ]
    +214          * @return this
    +215          */
    +216         setLightColors : function( colors_rgb_array ) {
    +217             this.m_lightcolor= colors_rgb_array;
    +218             this.lightPosition= [];
    +219             for( var i=0; i<this.m_lightcolor.length; i++ ) {
    +220                 var x= this.width*Math.random();
    +221                 var y= this.height*Math.random();
    +222                 this.lightPosition.push( new CAAT.Math.Point().set(x,y) );
    +223             }
    +224             return this;
    +225         },
    +226         /**
    +227          * Initialize the bump image processor.
    +228          * @param image {HTMLImageElement} source image to bump.
    +229          * @param radius {number} light radius.
    +230          */
    +231         initialize : function(image,radius) {
    +232             CAAT.Module.Image.ImageProcess.IMBumpMapping.superclass.initialize.call(this,image.width,image.height);
    +233 
    +234             this.setLightColors(
    +235                     [
    +236                         [255,128,0],
    +237                         [0,0,255]
    +238                     ]);
    +239 
    +240             this.prepareBump(image,radius);
    +241             this.calculatePhong();
    +242 
    +243             return this;
    +244         },
    +245         /**
    +246          * Set a light position.
    +247          * @param lightIndex {number} light index to position.
    +248          * @param x {number} light x coordinate.
    +249          * @param y {number} light y coordinate.
    +250          * @return this
    +251          */
    +252         setLightPosition : function( lightIndex, x, y ) {
    +253             this.lightPosition[lightIndex].set(x,y);
    +254             return this;
    +255         },
    +256         /**
    +257          * Applies the bump effect and makes it visible on the canvas surface.
    +258          * @param director {CAAT.Director}
    +259          * @param time {number}
    +260          */
    +261         applyIM : function(director,time) {
    +262             this.drawColored(this.bufferImage);
    +263             return CAAT.Module.Image.ImageProcess.IMBumpMapping.superclass.applyIM.call(this,director,time);
    +264         }
    +265     }
    +266 
    +267 });
    +268 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMPlasma.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMPlasma.js.html new file mode 100644 index 00000000..b4f6d49d --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMPlasma.js.html @@ -0,0 +1,181 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name IMPlasma
    +  5      * @memberOf CAAT.Module.Image.ImageProcessor
    +  6      * @extends CAAT.Module.Image.ImageProcessor.ImageProcessor
    +  7      * @constructor
    +  8      */
    +  9 
    + 10 
    + 11     defines : "CAAT.Module.Image.ImageProcess.IMPlasma",
    + 12     depends : [
    + 13         "CAAT.Module.Image.ImageProcess.ImageProcessor",
    + 14         "CAAT.Module.ColorUtil.Color"
    + 15     ],
    + 16     extendsClass : "CAAT.Module.Image.ImageProcess.ImageProcessor",
    + 17     extendsWith : {
    + 18 
    + 19         /**
    + 20          * @lends CAAT.Module.Image.ImageProcessor.IMPlasma.prototype
    + 21          */
    + 22 
    + 23         wavetable: null,
    + 24         m_colorMap: null,
    + 25         spd1: 1,
    + 26         spd2: 2,
    + 27         spd3: 3,
    + 28         spd4: 4,
    + 29         pos1: 0,
    + 30         pos2: 0,
    + 31         pos3: 0,
    + 32         pos4: 0,
    + 33         tpos1: 0,
    + 34         tpos2: 0,
    + 35         tpos3: 0,
    + 36         tpos4: 0,
    + 37         m_colorMapSize: 256,
    + 38         i1: 0,
    + 39         i2: 0,
    + 40         i3: 0,
    + 41         i4: 0,
    + 42         b1: false,
    + 43         b2: false,
    + 44         b3: false,
    + 45         b4: false,
    + 46 
    + 47         color: [0xffffffff, 0xffff00ff, 0xffffff00, 0xff00ff00, 0xffff0000, 0xff0000ff, 0xff000000],
    + 48 
    + 49         /**
    + 50          * Initialize the plasma image processor.
    + 51          * <p>
    + 52          * This image processor creates a color ramp of 256 elements from the colors of the parameter 'colors'.
    + 53          * Be aware of color definition since the alpha values count to create the ramp.
    + 54          *
    + 55          * @param width {number}
    + 56          * @param height {number}
    + 57          * @param colors {Array.<number>} an array of color values.
    + 58          *
    + 59          * @return this
    + 60          */
    + 61         initialize : function(width,height,colors) {
    + 62             CAAT.IMPlasma.superclass.initialize.call(this,width,height);
    + 63 
    + 64             this.wavetable= [];
    + 65             for (var x=0; x<256; x++)   {
    + 66                 this.wavetable.push( Math.floor(32 * (1 + Math.cos(x*2 * Math.PI / 256))) );
    + 67             }
    + 68 
    + 69             this.pos1=Math.floor(255*Math.random());
    + 70             this.pos2=Math.floor(255*Math.random());
    + 71             this.pos3=Math.floor(255*Math.random());
    + 72             this.pos4=Math.floor(255*Math.random());
    + 73 
    + 74             this.m_colorMap= CAAT.Module.ColorUtil.Color.makeRGBColorRamp(
    + 75                     colors!==null ? colors : this.color,
    + 76                     256,
    + 77                     CAAT.Module.ColorUtil.Color.RampEnumeration.RAMP_CHANNEL_RGBA_ARRAY );
    + 78 
    + 79             this.setB();
    + 80 
    + 81             return this;
    + 82         },
    + 83         /**
    + 84          * Initialize internal plasma structures. Calling repeatedly this method will make the plasma
    + 85          * look different.
    + 86          */
    + 87         setB : function() {
    + 88 
    + 89             this.b1= Math.random()>0.5;
    + 90             this.b2= Math.random()>0.5;
    + 91             this.b3= Math.random()>0.5;
    + 92             this.b4= Math.random()>0.5;
    + 93 
    + 94             this.spd1= Math.floor((Math.random()*3+1)*(Math.random()<0.5?1:-1));
    + 95             this.spd2= Math.floor((Math.random()*3+1)*(Math.random()<0.5?1:-1));
    + 96             this.spd3= Math.floor((Math.random()*3+1)*(Math.random()<0.5?1:-1));
    + 97             this.spd4= Math.floor((Math.random()*3+1)*(Math.random()<0.5?1:-1));
    + 98 
    + 99             this.i1= Math.floor((Math.random()*2.4+1)*(Math.random()<0.5?1:-1));
    +100             this.i2= Math.floor((Math.random()*2.4+1)*(Math.random()<0.5?1:-1));
    +101             this.i3= Math.floor((Math.random()*2.4+1)*(Math.random()<0.5?1:-1));
    +102             this.i4= Math.floor((Math.random()*2.4+1)*(Math.random()<0.5?1:-1));
    +103         },
    +104         /**
    +105          * Apply image processing to create the plasma and call superclass's apply to make the result
    +106          * visible.
    +107          * @param director {CAAT.Director}
    +108          * @param time {number}
    +109          *
    +110          * @return this
    +111          */
    +112         apply : function(director,time) {
    +113 
    +114             var v = 0;
    +115 	        this.tpos1 = this.pos1;
    +116 	        this.tpos2 = this.pos2;
    +117 
    +118             var bi= this.bufferImage;
    +119             var cm= this.m_colorMap;
    +120             var wt= this.wavetable;
    +121             var z;
    +122             var cmz;
    +123 
    +124 	        for (var x=0; x<this.height; x++) {
    +125                 this.tpos3 = this.pos3;
    +126                 this.tpos4 = this.pos4;
    +127 
    +128                 for(var y=0; y<this.width; y++) {
    +129                     // mix at will, or at your own risk.
    +130                     var o1= this.tpos1+this.tpos2+this.tpos3;
    +131                     var o2= this.tpos2+this.tpos3-this.tpos1;
    +132                     var o3= this.tpos3+this.tpos4-this.tpos2;
    +133                     var o4= this.tpos4+this.tpos1-this.tpos2;
    +134 
    +135                     // set different directions. again, change at will.
    +136                     if ( this.b1 ) o1= -o1;
    +137                     if ( this.b2 ) o2= -o2;
    +138                     if ( this.b3 ) o3= -o3;
    +139                     if ( this.b4 ) o4= -o4;
    +140 
    +141                     z = Math.floor( wt[o1&255] + wt[o2&255] + wt[o3&255] + wt[o4&255] );
    +142                     cmz= cm[z];
    +143 
    +144                     bi[ v++ ]= cmz[0];
    +145                     bi[ v++ ]= cmz[1];
    +146                     bi[ v++ ]= cmz[2];
    +147                     bi[ v++ ]= cmz[3];
    +148 
    +149                     this.tpos3 += this.i1;
    +150                     this.tpos3&=255;
    +151                     this.tpos4 += this.i2;
    +152                     this.tpos4&=255;
    +153                 }
    +154 
    +155                 this.tpos1 += this.i3;
    +156                 this.tpos1&=255;
    +157                 this.tpos2 += this.i4;
    +158                 this.tpos2&=255;
    +159             }
    +160 
    +161             this.pos1 += this.spd1;
    +162             this.pos2 -= this.spd2;
    +163             this.pos3 += this.spd3;
    +164             this.pos4 -= this.spd4;
    +165             this.pos1&=255;
    +166             this.pos3&=255;
    +167             this.pos2&=255;
    +168             this.pos4&=255;
    +169 
    +170             return CAAT.Module.Image.ImageProcess.IMPlasma.superclass.applyIM.call(this,director,time);
    +171         }
    +172     }
    +173 });
    +174 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMRotoZoom.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMRotoZoom.js.html new file mode 100644 index 00000000..6484bc5d --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_IMRotoZoom.js.html @@ -0,0 +1,210 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name IMRotoZoom
    +  5      * @memberOf CAAT.Module.Image.ImageProcessor
    +  6      * @extends CAAT.Module.Image.ImageProcessor.ImageProcessor
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Module.Image.ImageProcess.IMRotoZoom",
    + 11     depends : [
    + 12         "CAAT.Module.Image.ImageProcess.ImageProcessor"
    + 13     ],
    + 14     extendsClass : "CAAT.Module.Image.ImageProcess.ImageProcessor",
    + 15     extendsWith : {
    + 16 
    + 17         /**
    + 18          * @lends CAAT.Module.Image.ImageProcessor.IMRotoZoom.prototype
    + 19          */
    + 20 
    + 21         m_alignv:       1,
    + 22         m_alignh:       1,
    + 23         distortion:     2,
    + 24         mask:           0,
    + 25         shift:          0,
    + 26         sourceImageData:null,   // pattern to fill area with.
    + 27 
    + 28         /**
    + 29          * Initialize the rotozoom.
    + 30          * @param width {number}
    + 31          * @param height {number}
    + 32          * @param patternImage {HTMLImageElement} image to tile with.
    + 33          *
    + 34          * @return this
    + 35          */
    + 36         initialize : function( width, height, patternImage ) {
    + 37             CAAT.Module.Image.ImageProcess.IMRotoZoom.superclass.initialize.call(this,width,height);
    + 38 
    + 39             this.clear( 255,128,0, 255 );
    + 40 
    + 41             this.sourceImageData= this.grabPixels(patternImage);
    + 42 
    + 43             if ( null!==this.sourceImageData ) {
    + 44                 // patternImage must be 2^n sized.
    + 45                 switch( this.sourceImageData.width ) {
    + 46                     case 1024:
    + 47                         this.mask=1023;
    + 48                         this.shift=10;
    + 49                         break;
    + 50                     case 512:
    + 51                         this.mask=511;
    + 52                         this.shift=9;
    + 53                         break;
    + 54                     case 256:
    + 55                         this.mask=255;
    + 56                         this.shift=8;
    + 57                         break;
    + 58                     case 128:
    + 59                         this.mask=127;
    + 60                         this.shift=7;
    + 61                         break;
    + 62                     case 64:
    + 63                         this.mask=63;
    + 64                         this.shift=6;
    + 65                         break;
    + 66                     case 32:
    + 67                         this.mask=31;
    + 68                         this.shift=5;
    + 69                         break;
    + 70                     case 16:
    + 71                         this.mask=15;
    + 72                         this.shift=4;
    + 73                         break;
    + 74                     case 8:
    + 75                         this.mask=7;
    + 76                         this.shift=3;
    + 77                         break;
    + 78                 }
    + 79             }
    + 80 
    + 81             this.setCenter();
    + 82 
    + 83             return this;
    + 84         },
    + 85         /**
    + 86          * Performs the process of tiling rotozoom.
    + 87          * @param director {CAAT.Director}
    + 88          * @param time {number}
    + 89          *
    + 90          * @private
    + 91          */
    + 92         rotoZoom: function(director,time)  {
    + 93 
    + 94             var timer = new Date().getTime();
    + 95 
    + 96             var angle=Math.PI*2 * Math.cos(timer * 0.0001);
    + 97             var distance= 600+ 550*Math.sin(timer*0.0002);
    + 98 
    + 99             var dist= this.distortion;
    +100 
    +101             var off=0;
    +102             var ddx=Math.floor(Math.cos(angle)*distance);
    +103             var ddy=Math.floor(Math.sin(angle)*distance);
    +104 
    +105             var hh=0, ww=0;
    +106 
    +107             switch( this.m_alignh )	{
    +108                 case 0:
    +109                     hh = 0;
    +110                     break;
    +111                 case 1:
    +112                     hh = (this.height >> 1);
    +113                     break;
    +114                 case 2:
    +115                     hh = this.height - 1;
    +116                     break;
    +117             }
    +118 
    +119             switch (this.m_alignv) {
    +120                 case 0:
    +121                     ww = 0;
    +122                     break;
    +123                 case 1:
    +124                     ww = (this.width >> 1);
    +125                     break;
    +126                 case 2:
    +127                     ww = this.width - 1;
    +128                     break;
    +129             }
    +130 
    +131             var i = (((this.width >> 1) << 8)  - ddx * ww + ddy * hh)&0xffff;
    +132             var j = (((this.height >> 1) << 8) - ddy * ww - ddx * hh) & 0xffff;
    +133 
    +134             var srcwidth=   this.sourceImageData.width;
    +135             var srcheight=  this.sourceImageData.height;
    +136             var srcdata=    this.sourceImageData.data;
    +137             var bi=         this.bufferImage;
    +138             var dstoff;
    +139             var addx;
    +140             var addy;
    +141 
    +142             while (off < this.width * this.height * 4) {
    +143                 addx = i;
    +144                 addy = j;
    +145 
    +146                 for (var m = 0; m < this.width; m++) {
    +147                     dstoff = ((addy >> this.shift) & this.mask) * srcwidth + ((addx >> this.shift) & this.mask);
    +148                     dstoff <<= 2;
    +149 
    +150                     bi[ off++ ] = srcdata[ dstoff++ ];
    +151                     bi[ off++ ] = srcdata[ dstoff++ ];
    +152                     bi[ off++ ] = srcdata[ dstoff++ ];
    +153                     bi[ off++ ] = srcdata[ dstoff++ ];
    +154 
    +155                     addx += ddx;
    +156                     addy += ddy;
    +157 
    +158                 }
    +159 
    +160                 dist += this.distortion;
    +161                 i -= ddy;
    +162                 j += ddx - dist;
    +163             }
    +164         },
    +165         /**
    +166          * Perform and apply the rotozoom effect.
    +167          * @param director {CAAT.Director}
    +168          * @param time {number}
    +169          * @return this
    +170          */
    +171         applyIM : function(director,time) {
    +172             if ( null!==this.sourceImageData ) {
    +173                 this.rotoZoom(director,time);
    +174             }
    +175             return CAAT.Module.Image.ImageProcess.IMRotoZoom.superclass.applyIM.call(this,director,time);
    +176         },
    +177         /**
    +178          * Change the effect's rotation anchor. Call this method repeatedly to make the effect look
    +179          * different.
    +180          */
    +181         setCenter: function() {
    +182             var d = Math.random();
    +183             if (d < 0.33) {
    +184                 this.m_alignv = 0;
    +185             } else if (d < 0.66) {
    +186                 this.m_alignv = 1;
    +187             } else {
    +188                 this.m_alignv = 2;
    +189             }
    +190 
    +191             d = Math.random();
    +192             if (d < 0.33) {
    +193                 this.m_alignh = 0;
    +194             } else if (d < 0.66) {
    +195                 this.m_alignh = 1;
    +196             } else {
    +197                 this.m_alignh = 2;
    +198             }
    +199         }
    +200 
    +201     }
    +202 });
    +203 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_ImageProcessor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_ImageProcessor.js.html new file mode 100644 index 00000000..1411bdd1 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_ImageProcess_ImageProcessor.js.html @@ -0,0 +1,207 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name Image
    +  5      * @memberOf CAAT.Module
    +  6      * @namespace
    +  7      */
    +  8 
    +  9     /**
    + 10      * @name ImageProcessor
    + 11      * @memberOf CAAT.Module.Image
    + 12      * @namespace
    + 13      */
    + 14 
    + 15     /**
    + 16      * @name ImageProcessor
    + 17      * @memberOf CAAT.Module.Image.ImageProcessor
    + 18      * @constructor
    + 19      */
    + 20 
    + 21 
    + 22     defines : "CAAT.Module.Image.ImageProcessor.ImageProcessor",
    + 23     extendsWith : {
    + 24 
    + 25         /**
    + 26          * @lends CAAT.Module.Image.ImageProcessor.ImageProcessor.prototype
    + 27          */
    + 28 
    + 29         canvas:     null,
    + 30         ctx:        null,
    + 31         width:      0,
    + 32         height:     0,
    + 33         imageData:  null,
    + 34         bufferImage:null,
    + 35 
    + 36         /**
    + 37          * Grabs an image pixels.
    + 38          *
    + 39          * @param image {HTMLImageElement}
    + 40          * @return {ImageData} returns an ImageData object with the image representation or null in
    + 41          * case the pixels can not be grabbed.
    + 42          *
    + 43          * @static
    + 44          */
    + 45         grabPixels : function(image) {
    + 46             var canvas= document.createElement('canvas');
    + 47             if ( canvas!==null ) {
    + 48                 canvas.width= image.width;
    + 49                 canvas.height= image.height;
    + 50                 var ctx= canvas.getContext('2d');
    + 51                 ctx.drawImage(image,0,0);
    + 52                 try {
    + 53                     var imageData= ctx.getImageData(0,0,canvas.width,canvas.height);
    + 54                     return imageData;
    + 55                 }
    + 56                 catch(e) {
    + 57                     CAAT.log('error pixelgrabbing.', image);
    + 58                     return null;
    + 59                 }
    + 60             }
    + 61             return null;
    + 62         },
    + 63         /**
    + 64          * Helper method to create an array.
    + 65          *
    + 66          * @param size {number} integer number of elements in the array.
    + 67          * @param initValue {number} initial array values.
    + 68          *
    + 69          * @return {[]} an array of 'initialValue' elements.
    + 70          *
    + 71          * @static
    + 72          */
    + 73         makeArray : function(size, initValue) {
    + 74             var a= [];
    + 75 
    + 76             for(var i=0; i<size; i++ )  {
    + 77                 a.push( initValue );
    + 78             }
    + 79 
    + 80             return a;
    + 81         },
    + 82         /**
    + 83          * Helper method to create a bidimensional array.
    + 84          *
    + 85          * @param size {number} number of array rows.
    + 86          * @param size2 {number} number of array columns.
    + 87          * @param initvalue array initial values.
    + 88          *
    + 89          * @return {[]} a bidimensional array of 'initvalue' elements.
    + 90          *
    + 91          * @static
    + 92          *
    + 93          */
    + 94         makeArray2D : function (size, size2, initvalue)  {
    + 95             var a= [];
    + 96 
    + 97             for( var i=0; i<size; i++ ) {
    + 98                 a.push( this.makeArray(size2,initvalue) );
    + 99             }
    +100 
    +101             return a;
    +102         },
    +103         /**
    +104          * Initializes and creates an offscreen Canvas object. It also creates an ImageData object and
    +105          * initializes the internal bufferImage attribute to imageData's data.
    +106          * @param width {number} canvas width.
    +107          * @param height {number} canvas height.
    +108          * @return this
    +109          */
    +110         initialize : function(width,height) {
    +111 
    +112             this.width=  width;
    +113             this.height= height;
    +114 
    +115             this.canvas= document.createElement('canvas');
    +116             if ( this.canvas!==null ) {
    +117                 this.canvas.width= width;
    +118                 this.canvas.height= height;
    +119                 this.ctx= this.canvas.getContext('2d');
    +120                 this.imageData= this.ctx.getImageData(0,0,width,height);
    +121                 this.bufferImage= this.imageData.data;
    +122             }
    +123 
    +124             return this;
    +125         },
    +126         /**
    +127          * Clear this ImageData object to the given color components.
    +128          * @param r {number} red color component 0..255.
    +129          * @param g {number} green color component 0..255.
    +130          * @param b {number} blue color component 0..255.
    +131          * @param a {number} alpha color component 0..255.
    +132          * @return this
    +133          */
    +134         clear : function( r,g,b,a ) {
    +135             if ( null===this.imageData ) {
    +136                 return this;
    +137             }
    +138             var data= this.imageData.data;
    +139             for( var i=0; i<this.width*this.height; i++ ) {
    +140                 data[i*4+0]= r;
    +141                 data[i*4+1]= g;
    +142                 data[i*4+2]= b;
    +143                 data[i*4+3]= a;
    +144             }
    +145             this.imageData.data= data;
    +146 
    +147             return this;
    +148         },
    +149         /**
    +150          * Get this ImageData.
    +151          * @return {ImageData}
    +152          */
    +153         getImageData : function() {
    +154             return this.ctx.getImageData(0,0,this.width,this.height);
    +155         },
    +156         /**
    +157          * Sets canvas pixels to be the applied effect. After process pixels, this method must be called
    +158          * to show the result of such processing.
    +159          * @param director {CAAT.Director}
    +160          * @param time {number}
    +161          * @return this
    +162          */
    +163         applyIM : function(director, time) {
    +164             if ( null!==this.imageData ) {
    +165                 this.imageData.data= this.bufferImage;
    +166                 this.ctx.putImageData(this.imageData, 0, 0);
    +167             }
    +168             return this;
    +169         },
    +170         /**
    +171          * Returns the offscreen canvas.
    +172          * @return {HTMLCanvasElement}
    +173          */
    +174         getCanvas : function() {
    +175             return this.canvas;
    +176         },
    +177         /**
    +178          * Creates a pattern that will make this ImageProcessor object suitable as a fillStyle value.
    +179          * This effect can be drawn too as an image by calling: canvas_context.drawImage methods.
    +180          * @param type {string} the pattern type. if no value is supplied 'repeat' will be used.
    +181          * @return CanvasPattern.
    +182          */
    +183         createPattern : function( type ) {
    +184             return this.ctx.createPattern(this.canvas,type ? type : 'repeat');
    +185         },
    +186         /**
    +187          * Paint this ImageProcessor object result.
    +188          * @param director {CAAT.Director}.
    +189          * @param time {number} scene time.
    +190          */
    +191         paint : function( director, time ) {
    +192             if ( null!==this.canvas ) {
    +193                 var ctx= director.ctx;
    +194                 ctx.drawImage( this.getCanvas(), 0, 0 );
    +195             }
    +196         }
    +197     }
    +198 
    +199 });
    +200 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_ImagePreloader.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_ImagePreloader.js.html new file mode 100644 index 00000000..ec8d6d0b --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_ImagePreloader.js.html @@ -0,0 +1,108 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * Image/Resource preloader.
    +  5  *
    +  6  *
    +  7  **/
    +  8 
    +  9 CAAT.Module( {
    + 10 
    + 11 
    + 12     /**
    + 13      * @name Preloader
    + 14      * @memberOf CAAT.Module
    + 15      * @namespace
    + 16      */
    + 17 
    + 18     /**
    + 19      * @name ImagePreloader
    + 20      * @memberOf CAAT.Module.Preloader
    + 21      * @constructor
    + 22      */
    + 23 
    + 24     defines : "CAAT.Module.Preloader.ImagePreloader",
    + 25     aliases : ["CAAT.ImagePreloader"],
    + 26     extendsWith : {
    + 27 
    + 28         /**
    + 29          * @lends CAAT.Module.Preloader.ImagePreloader.prototype
    + 30          */
    + 31 
    + 32         __init : function()   {
    + 33             this.images = [];
    + 34             return this;
    + 35         },
    + 36 
    + 37         /**
    + 38          * a list of elements to load.
    + 39          * @type {Array.<{ id, image }>}
    + 40          */
    + 41         images:                 null,
    + 42 
    + 43         /**
    + 44          * notification callback invoked for each image loaded.
    + 45          */
    + 46         notificationCallback:   null,
    + 47 
    + 48         /**
    + 49          * elements counter.
    + 50          */
    + 51         imageCounter:           0,
    + 52 
    + 53         /**
    + 54          * Start images loading asynchronous process. This method will notify every image loaded event
    + 55          * and is responsibility of the caller to count the number of loaded images to see if it fits his
    + 56          * needs.
    + 57          * 
    + 58          * @param aImages {{ id:{url}, id2:{url}, ...} an object with id/url pairs.
    + 59          * @param callback_loaded_one_image {function( imageloader {CAAT.ImagePreloader}, counter {number}, images {{ id:{string}, image: {Image}}} )}
    + 60          * function to call on every image load.
    + 61          */
    + 62         loadImages: function( aImages, callback_loaded_one_image, callback_error ) {
    + 63 
    + 64             if (!aImages) {
    + 65                 if (callback_loaded_one_image ) {
    + 66                     callback_loaded_one_image(0,[]);
    + 67                 }
    + 68             }
    + 69 
    + 70             var me= this, i;
    + 71             this.notificationCallback = callback_loaded_one_image;
    + 72             this.images= [];
    + 73             for( i=0; i<aImages.length; i++ ) {
    + 74                 this.images.push( {id:aImages[i].id, image: new Image() } );
    + 75             }
    + 76 
    + 77             for( i=0; i<aImages.length; i++ ) {
    + 78                 this.images[i].image.onload = function imageLoaded() {
    + 79                     me.imageCounter++;
    + 80                     me.notificationCallback(me.imageCounter, me.images);
    + 81                 };
    + 82 
    + 83                 this.images[i].image.onerror= (function(index) {
    + 84                         return function(e) {
    + 85                             if ( callback_error ) {
    + 86                                 callback_error( e, index );
    + 87                             }
    + 88                         }
    + 89                     })(i);
    + 90 
    + 91                 this.images[i].image.src= aImages[i].url;
    + 92             }
    + 93 
    + 94             if ( aImages.length===0 ) {
    + 95                 callback_loaded_one_image(0,[]);
    + 96             }
    + 97         }
    + 98 
    + 99     }
    +100 });
    +101 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_Preloader.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_Preloader.js.html new file mode 100644 index 00000000..38cbfb88 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Preloader_Preloader.js.html @@ -0,0 +1,169 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * Image/Resource preloader.
    +  5  *
    +  6  *
    +  7  **/
    +  8 
    +  9 CAAT.Module( {
    + 10 
    + 11 
    + 12     /**
    + 13      * @name Preloader
    + 14      * @memberOf CAAT.Module.Preloader
    + 15      * @constructor
    + 16      */
    + 17 
    + 18     defines : "CAAT.Module.Preloader.Preloader",
    + 19     extendsWith : function() {
    + 20 
    + 21         var descriptor= function(id, path, loader) {
    + 22 
    + 23             var me= this;
    + 24 
    + 25             this.id=    id;
    + 26             this.path=  path;
    + 27             this.image= new Image();
    + 28             this.loader= loader;
    + 29 
    + 30             this.image.onload= this.onload.bind(this);
    + 31             this.image.onerror= this.onerror.bind(this);
    + 32 
    + 33             return this;
    + 34         };
    + 35 
    + 36         descriptor.prototype= {
    + 37             id : null,
    + 38             path : null,
    + 39             image : null,
    + 40             loader : null,
    + 41 
    + 42             onload : function(e) {
    + 43                 this.loader.__onload(this);
    + 44                 this.image.onload= null;
    + 45                 this.image.onerror= null;
    + 46             },
    + 47 
    + 48             onerror : function(e) {
    + 49                 this.loader.__onerror(this);
    + 50             },
    + 51 
    + 52             load : function() {
    + 53                 this.image.src= this.path;
    + 54             },
    + 55 
    + 56             clear : function() {
    + 57                 this.loader= null;
    + 58 
    + 59             }
    + 60         };
    + 61 
    + 62         return {
    + 63 
    + 64             /**
    + 65              * @lends CAAT.Module.Preloader.Preloader.prototype
    + 66              */
    + 67 
    + 68             __init : function()   {
    + 69                 this.elements= [];
    + 70                 this.baseURL= "";
    + 71                 return this;
    + 72             },
    + 73 
    + 74             currentGroup : null,
    + 75 
    + 76             /**
    + 77              * a list of elements to load.
    + 78              * @type {Array.<{ id, image }>}
    + 79              */
    + 80             elements:       null,
    + 81 
    + 82             /**
    + 83              * elements counter.
    + 84              */
    + 85             imageCounter:   0,
    + 86 
    + 87             /**
    + 88              * Callback finished loading.
    + 89              */
    + 90             cfinished:      null,
    + 91 
    + 92             /**
    + 93              * Callback element loaded.
    + 94              */
    + 95             cloaded:        null,
    + 96 
    + 97             /**
    + 98              * Callback error loading.
    + 99              */
    +100             cerrored:       null,
    +101 
    +102             /**
    +103              * loaded elements count.
    +104              */
    +105             loadedCount:    0,
    +106 
    +107             baseURL : null,
    +108 
    +109             addElement : function( id, path ) {
    +110                 this.elements.push( new descriptor(id,this.baseURL+path,this) );
    +111                 return this;
    +112             },
    +113 
    +114             clear : function() {
    +115                 for( var i=0; i<this.elements.length; i++ ) {
    +116                     this.elements[i].clear();
    +117                 }
    +118                 this.elements= null;
    +119             },
    +120 
    +121             __onload : function( d ) {
    +122                 if ( this.cloaded ) {
    +123                     this.cloaded(d.id);
    +124                 }
    +125 
    +126                 this.loadedCount++;
    +127                 if ( this.loadedCount===this.elements.length ) {
    +128                     if ( this.cfinished ) {
    +129                         this.cfinished( this.elements );
    +130                     }
    +131                 }
    +132             },
    +133 
    +134             __onerror : function( d ) {
    +135                 if ( this.cerrored ) {
    +136                     this.cerrored(d.id);
    +137                 }
    +138             },
    +139 
    +140             setBaseURL : function( base ) {
    +141                 this.baseURL= base;
    +142                 return this;
    +143             },
    +144 
    +145             load: function( onfinished, onload_one, onerror ) {
    +146 
    +147                 this.cfinished= onfinished;
    +148                 this.cloaded= onload_one;
    +149                 this.cerroed= onerror;
    +150 
    +151                 var i;
    +152 
    +153                 for( i=0; i<this.elements.length; i++ ) {
    +154                     this.elements[i].load();
    +155                 }
    +156 
    +157                 return this;
    +158             }
    +159         }
    +160     }
    +161 });
    +162 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Util_ImageUtil.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Util_ImageUtil.js.html new file mode 100644 index 00000000..e14ccccf --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Image_Util_ImageUtil.js.html @@ -0,0 +1,234 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  */
    +  4 CAAT.Module({
    +  5 
    +  6     /**
    +  7      * @name ImageUtil
    +  8      * @memberOf CAAT.Module.Image
    +  9      * @namespace
    + 10      */
    + 11 
    + 12     defines:"CAAT.Module.Image.ImageUtil",
    + 13     depends : [
    + 14         "CAAT.Math.Matrix"
    + 15     ],
    + 16     extendsWith:{
    + 17 
    + 18     },
    + 19     constants:{
    + 20 
    + 21         /**
    + 22          * @lends CAAT.Module.Image.ImageUtil
    + 23          */
    + 24 
    + 25         createAlphaSpriteSheet:function (maxAlpha, minAlpha, sheetSize, image, bg_fill_style) {
    + 26 
    + 27             if (maxAlpha < minAlpha) {
    + 28                 var t = maxAlpha;
    + 29                 maxAlpha = minAlpha;
    + 30                 minAlpha = t;
    + 31             }
    + 32 
    + 33             var canvas = document.createElement('canvas');
    + 34             canvas.width = image.width;
    + 35             canvas.height = image.height * sheetSize;
    + 36             var ctx = canvas.getContext('2d');
    + 37             ctx.fillStyle = bg_fill_style ? bg_fill_style : 'rgba(255,255,255,0)';
    + 38             ctx.fillRect(0, 0, image.width, image.height * sheetSize);
    + 39 
    + 40             var i;
    + 41             for (i = 0; i < sheetSize; i++) {
    + 42                 ctx.globalAlpha = 1 - (maxAlpha - minAlpha) / sheetSize * (i + 1);
    + 43                 ctx.drawImage(image, 0, i * image.height);
    + 44             }
    + 45 
    + 46             return canvas;
    + 47         },
    + 48 
    + 49         /**
    + 50          * Creates a rotated canvas image element.
    + 51          */
    + 52         rotate:function (image, angle) {
    + 53 
    + 54             angle = angle || 0;
    + 55             if (!angle) {
    + 56                 return image;
    + 57             }
    + 58 
    + 59             var canvas = document.createElement("canvas");
    + 60             canvas.width = image.height;
    + 61             canvas.height = image.width;
    + 62             var ctx = canvas.getContext('2d');
    + 63             ctx.globalAlpha = 1;
    + 64             ctx.fillStyle = 'rgba(0,0,0,0)';
    + 65             ctx.clearRect(0, 0, canvas.width, canvas.height);
    + 66 
    + 67             var m = new CAAT.Math.Matrix();
    + 68             m.multiply(new CAAT.Math.Matrix().setTranslate(canvas.width / 2, canvas.width / 2));
    + 69             m.multiply(new CAAT.Math.Matrix().setRotation(angle * Math.PI / 180));
    + 70             m.multiply(new CAAT.Math.Matrix().setTranslate(-canvas.width / 2, -canvas.width / 2));
    + 71             m.transformRenderingContext(ctx);
    + 72             ctx.drawImage(image, 0, 0);
    + 73 
    + 74             return canvas;
    + 75         },
    + 76 
    + 77         /**
    + 78          * Remove an image's padding transparent border.
    + 79          * Transparent means that every scan pixel is alpha=0.
    + 80          */
    + 81         optimize:function (image, threshold, areas) {
    + 82             threshold >>= 0;
    + 83 
    + 84             var atop = true;
    + 85             var abottom = true;
    + 86             var aleft = true;
    + 87             var aright = true;
    + 88             if (typeof areas !== 'undefined') {
    + 89                 if (typeof areas.top !== 'undefined') {
    + 90                     atop = areas.top;
    + 91                 }
    + 92                 if (typeof areas.bottom !== 'undefined') {
    + 93                     abottom = areas.bottom;
    + 94                 }
    + 95                 if (typeof areas.left !== 'undefined') {
    + 96                     aleft = areas.left;
    + 97                 }
    + 98                 if (typeof areas.right !== 'undefined') {
    + 99                     aright = areas.right;
    +100                 }
    +101             }
    +102 
    +103 
    +104             var canvas = document.createElement('canvas');
    +105             canvas.width = image.width;
    +106             canvas.height = image.height;
    +107             var ctx = canvas.getContext('2d');
    +108 
    +109             ctx.fillStyle = 'rgba(0,0,0,0)';
    +110             ctx.fillRect(0, 0, image.width, image.height);
    +111             ctx.drawImage(image, 0, 0);
    +112 
    +113             var imageData = ctx.getImageData(0, 0, image.width, image.height);
    +114             var data = imageData.data;
    +115 
    +116             var i, j;
    +117             var miny = 0, maxy = canvas.height - 1;
    +118             var minx = 0, maxx = canvas.width - 1;
    +119 
    +120             var alpha = false;
    +121 
    +122             if (atop) {
    +123                 for (i = 0; i < canvas.height; i++) {
    +124                     for (j = 0; j < canvas.width; j++) {
    +125                         if (data[i * canvas.width * 4 + 3 + j * 4] > threshold) {
    +126                             alpha = true;
    +127                             break;
    +128                         }
    +129                     }
    +130 
    +131                     if (alpha) {
    +132                         break;
    +133                     }
    +134                 }
    +135                 // i contiene el indice del ultimo scan que no es transparente total.
    +136                 miny = i;
    +137             }
    +138 
    +139             if (abottom) {
    +140                 alpha = false;
    +141                 for (i = canvas.height - 1; i >= miny; i--) {
    +142                     for (j = 0; j < canvas.width; j++) {
    +143                         if (data[i * canvas.width * 4 + 3 + j * 4] > threshold) {
    +144                             alpha = true;
    +145                             break;
    +146                         }
    +147                     }
    +148 
    +149                     if (alpha) {
    +150                         break;
    +151                     }
    +152                 }
    +153                 maxy = i;
    +154             }
    +155 
    +156             if (aleft) {
    +157                 alpha = false;
    +158                 for (j = 0; j < canvas.width; j++) {
    +159                     for (i = miny; i <= maxy; i++) {
    +160                         if (data[i * canvas.width * 4 + 3 + j * 4 ] > threshold) {
    +161                             alpha = true;
    +162                             break;
    +163                         }
    +164                     }
    +165                     if (alpha) {
    +166                         break;
    +167                     }
    +168                 }
    +169                 minx = j;
    +170             }
    +171 
    +172             if (aright) {
    +173                 alpha = false;
    +174                 for (j = canvas.width - 1; j >= minx; j--) {
    +175                     for (i = miny; i <= maxy; i++) {
    +176                         if (data[i * canvas.width * 4 + 3 + j * 4 ] > threshold) {
    +177                             alpha = true;
    +178                             break;
    +179                         }
    +180                     }
    +181                     if (alpha) {
    +182                         break;
    +183                     }
    +184                 }
    +185                 maxx = j;
    +186             }
    +187 
    +188             if (0 === minx && 0 === miny && canvas.width - 1 === maxx && canvas.height - 1 === maxy) {
    +189                 return canvas;
    +190             }
    +191 
    +192             var width = maxx - minx + 1;
    +193             var height = maxy - miny + 1;
    +194             var id2 = ctx.getImageData(minx, miny, width, height);
    +195 
    +196             canvas.width = width;
    +197             canvas.height = height;
    +198             ctx = canvas.getContext('2d');
    +199             ctx.putImageData(id2, 0, 0);
    +200 
    +201             return canvas;
    +202         },
    +203 
    +204 
    +205         createThumb:function (image, w, h, best_fit) {
    +206             w = w || 24;
    +207             h = h || 24;
    +208             var canvas = document.createElement('canvas');
    +209             canvas.width = w;
    +210             canvas.height = h;
    +211             var ctx = canvas.getContext('2d');
    +212 
    +213             if (best_fit) {
    +214                 var max = Math.max(image.width, image.height);
    +215                 var ww = image.width / max * w;
    +216                 var hh = image.height / max * h;
    +217                 ctx.drawImage(image, (w - ww) / 2, (h - hh) / 2, ww, hh);
    +218             } else {
    +219                 ctx.drawImage(image, 0, 0, w, h);
    +220             }
    +221 
    +222             return canvas;
    +223         }
    +224     }
    +225 
    +226 })
    +227 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_Template.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_Template.js.html new file mode 100644 index 00000000..cc76c5bd --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_Template.js.html @@ -0,0 +1,98 @@ +
      1 CAAT.Module({
    +  2     defines : "CAAT.Module.Initialization.Template",
    +  3     depends : [
    +  4         "CAAT.Foundation.Director",
    +  5         "CAAT.Module.Preloader.ImagePreloader"
    +  6     ],
    +  7     constants: {
    +  8         init : function( width, height, runHere, imagesURL, onEndLoading )   {
    +  9 
    + 10             var canvascontainer= document.getElementById(runHere);
    + 11             var director;
    + 12 
    + 13             if ( CAAT.__CSS__ ) {   // css renderer
    + 14                 if ( canvascontainer ) {
    + 15                     if ( false===canvascontainer instanceof HTMLDivElement ) {
    + 16                         canvascontainer= null;
    + 17                     }
    + 18                 }
    + 19 
    + 20                 if ( canvascontainer===null ) {
    + 21                     canvascontainer= document.createElement('div'); // create a new DIV
    + 22                     document.body.appendChild(canvascontainer);
    + 23                 }
    + 24 
    + 25                 director= new CAAT.Foundation.Director().
    + 26                     initialize(
    + 27                         width||800,
    + 28                         height||600,
    + 29                         canvascontainer);
    + 30 
    + 31             } else {
    + 32 
    + 33                 if ( canvascontainer ) {
    + 34                     if ( canvascontainer instanceof HTMLDivElement ) {
    + 35                         var ncanvascontainer= document.createElement("canvas");
    + 36                         canvascontainer.appendChild(ncanvascontainer);
    + 37                         canvascontainer= ncanvascontainer;
    + 38                     } else if ( false==canvascontainer instanceof HTMLCanvasElement ) {
    + 39                         var ncanvascontainer= document.createElement("canvas");
    + 40                         document.body.appendChild(ncanvascontainer);
    + 41                         canvascontainer= ncanvascontainer;
    + 42                     }
    + 43                 } else {
    + 44                     canvascontainer= document.createElement('canvas');
    + 45                     document.body.appendChild(canvascontainer);
    + 46                 }
    + 47 
    + 48                 director= new CAAT.Foundation.Director().
    + 49                         initialize(
    + 50                             width||800,
    + 51                             height||600,
    + 52                             canvascontainer);
    + 53             }
    + 54 
    + 55             /**
    + 56              * Load splash images. It is supossed the splash has some images.
    + 57              */
    + 58             new CAAT.Module.Preloader.ImagePreloader().loadImages(
    + 59                 imagesURL,
    + 60                 function on_load( counter, images ) {
    + 61 
    + 62                     if ( counter===images.length ) {
    + 63 
    + 64                         director.emptyScenes();
    + 65                         director.setImagesCache(images);
    + 66 
    + 67                         onEndLoading(director);
    + 68 
    + 69                         /**
    + 70                          * Change this sentence's parameters to play with different entering-scene
    + 71                          * curtains.
    + 72                          * just perform a director.setScene(0) to play first director's scene.
    + 73                          */
    + 74                         director.easeIn(
    + 75                                 0,
    + 76                                 CAAT.Foundation.Scene.EASE_SCALE,
    + 77                                 2000,
    + 78                                 false,
    + 79                                 CAAT.Foundation.Actor.ANCHOR_CENTER,
    + 80                                 new CAAT.Behavior.Interpolator().createElasticOutInterpolator(2.5, .4) );
    + 81 
    + 82                         CAAT.loop(60);
    + 83 
    + 84                     }
    + 85                 }
    + 86             );
    + 87 
    + 88         }
    + 89     }
    + 90 });
    + 91 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_TemplateWithSplash.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_TemplateWithSplash.js.html new file mode 100644 index 00000000..1633a96e --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Initialization_TemplateWithSplash.js.html @@ -0,0 +1,189 @@ +
      1 CAAT.Module({
    +  2     defines : "CAAT.Module.Initialization.TemplateWithSplash",
    +  3     depends : [
    +  4         "CAAT.Foundation.Director",
    +  5         "CAAT.Module.Preloader.ImagePreloader"
    +  6     ],
    +  7     constants: {
    +  8 
    +  9         init : function( width, height, runHere, minTime, imagesURL, onEndSplash, splash_path, spinner_path )   {
    + 10 
    + 11             function createSplashScene(director, showTime, sceneCreationCallback) {
    + 12 
    + 13                 var spinnerImg= director.getImage('spinner');
    + 14                 var splashImg=  director.getImage('splash');
    + 15                 var scene=      director.createScene();
    + 16                 var TIME=       showTime;
    + 17                 var time=       new Date().getTime();
    + 18 
    + 19                 if ( splashImg ) {
    + 20                     scene.addChild(
    + 21                             new CAAT.Foundation.Actor().
    + 22                                 setBackgroundImage(splashImg, false).
    + 23                                 setBounds(0,0,director.width,director.height).
    + 24                                 setImageTransformation( CAAT.Foundation.SpriteImage.TR_FIXED_TO_SIZE )
    + 25                             );
    + 26                 }
    + 27 
    + 28                 if ( spinnerImg ) {
    + 29                     scene.addChild(
    + 30                             new CAAT.Foundation.Actor().
    + 31                                 setBackgroundImage(spinnerImg).
    + 32                                 centerAt( scene.width/2, scene.height/2).
    + 33                                 addBehavior(
    + 34                                     new CAAT.Behavior.RotateBehavior().
    + 35                                             setValues(0,2*Math.PI).
    + 36                                             setFrameTime(0,1000).
    + 37                                             setCycle(true)
    + 38                                     )
    + 39                             );
    + 40                 }
    + 41 
    + 42                 scene.loadedImage = function(count, images) {
    + 43 
    + 44                     if ( !images || count===images.length ) {
    + 45 
    + 46                         var difftime= new Date().getTime()-time;
    + 47                         if ( difftime<TIME ){
    + 48                             difftime= Math.abs(TIME-difftime);
    + 49                             if ( difftime>TIME ) {
    + 50                                 difftime= TIME;
    + 51                             }
    + 52 
    + 53                             setTimeout(
    + 54                                     function() {
    + 55                                         endSplash(director, images, sceneCreationCallback);
    + 56                                     },
    + 57                                     difftime );
    + 58 
    + 59                         } else {
    + 60                             endSplash(director, images, sceneCreationCallback);
    + 61                         }
    + 62 
    + 63                     }
    + 64                 };
    + 65 
    + 66                 return scene;
    + 67             }
    + 68             /**
    + 69              * Finish splash process by either timeout or resources allocation end.
    + 70              */
    + 71             function endSplash(director, images, onEndSplashCallback) {
    + 72 
    + 73                 director.emptyScenes();
    + 74                 director.setImagesCache(images);
    + 75                 director.setClear( true );
    + 76 
    + 77                 onEndSplashCallback(director);
    + 78 
    + 79                 /**
    + 80                  * Change this sentence's parameters to play with different entering-scene
    + 81                  * curtains.
    + 82                  * just perform a director.setScene(0) to play first director's scene.
    + 83                  */
    + 84 
    + 85                 director.setClear( CAAT.Foundation.Director.CLEAR_ALL );
    + 86                 director.easeIn(
    + 87                         0,
    + 88                         CAAT.Foundation.Scene.EASE_SCALE,
    + 89                         2000,
    + 90                         false,
    + 91                         CAAT.Foundation.Actor.ANCHOR_CENTER,
    + 92                         new CAAT.Behavior.Interpolator().createElasticOutInterpolator(2.5, .4) );
    + 93 
    + 94             }
    + 95 
    + 96             var canvascontainer= document.getElementById(runHere);
    + 97             var director;
    + 98 
    + 99             if ( CAAT.__CSS__ ) {   // css renderer
    +100                 if ( canvascontainer ) {
    +101                     if ( false===canvascontainer instanceof HTMLDivElement ) {
    +102                         canvascontainer= null;
    +103                     }
    +104                 }
    +105 
    +106                 if ( canvascontainer===null ) {
    +107                     canvascontainer= document.createElement('div'); // create a new DIV
    +108                     document.body.appendChild(canvascontainer);
    +109                 }
    +110 
    +111                 director= new CAAT.Foundation.Director().
    +112                     initialize(
    +113                         width||800,
    +114                         height||600,
    +115                         canvascontainer);
    +116 
    +117             } else {
    +118 
    +119                 if ( canvascontainer ) {
    +120                     if ( canvascontainer instanceof HTMLDivElement ) {
    +121                         var ncanvascontainer= document.createElement("canvas");
    +122                         canvascontainer.appendChild(ncanvascontainer);
    +123                         canvascontainer= ncanvascontainer;
    +124                     } else if ( false==canvascontainer instanceof HTMLCanvasElement ) {
    +125                         var ncanvascontainer= document.createElement("canvas");
    +126                         document.body.appendChild(ncanvascontainer);
    +127                         canvascontainer= ncanvascontainer;
    +128                     }
    +129                 } else {
    +130                     canvascontainer= document.createElement('canvas');
    +131                     document.body.appendChild(canvascontainer);
    +132                 }
    +133 
    +134                 director= new CAAT.Foundation.Director().
    +135                         initialize(
    +136                             width||800,
    +137                             height||600,
    +138                             canvascontainer);
    +139             }
    +140 
    +141 
    +142             /**
    +143              * Load splash images. It is supossed the splash has some images.
    +144              */
    +145             var imgs= [];
    +146             if ( splash_path ) {
    +147                 imgs.push( {id:'splash',   url: splash_path } );
    +148             }
    +149             if ( spinner_path ) {
    +150                 imgs.push( {id:'spinner',  url: spinner_path } );
    +151             }
    +152 
    +153             director.setClear( CAAT.Foundation.Director.CLEAR_DIRTY_RECTS );
    +154 
    +155             new CAAT.Module.Preloader.ImagePreloader().loadImages(
    +156                 imgs,
    +157                 function on_load( counter, images ) {
    +158 
    +159                     if ( counter===images.length ) {
    +160 
    +161                         director.setImagesCache(images);
    +162                         var splashScene= createSplashScene(director, minTime || 5000, onEndSplash);
    +163                         CAAT.loop(60);
    +164 
    +165                         if ( imagesURL && imagesURL.length>0 ) {
    +166                             /**
    +167                              * Load resources for non splash screen
    +168                              */
    +169                             new CAAT.Module.Preloader.ImagePreloader().loadImages(
    +170                                     imagesURL,
    +171                                     splashScene.loadedImage
    +172                             );
    +173                         } else {
    +174                             splashScene.loadedImage(0,null);
    +175                         }
    +176                     }
    +177                 }
    +178             );
    +179         }
    +180 
    +181     }
    +182 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_LayoutUtils_RowLayout.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_LayoutUtils_RowLayout.js.html new file mode 100644 index 00000000..0c7e92b9 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_LayoutUtils_RowLayout.js.html @@ -0,0 +1,68 @@ +
      1 CAAT.Module({
    +  2     defines:"CAAT.Module.LayoutUtils.RowLayout",
    +  3     constants:{
    +  4         Row:function (dst, what_to_layout_array, constraint_object) {
    +  5 
    +  6             var width = dst.width;
    +  7             var x = 0, y = 0, i = 0, l = 0;
    +  8             var actor_max_h = -Number.MAX_VALUE, actor_max_w = Number.MAX_VALUE;
    +  9 
    + 10             // compute max/min actor list size.
    + 11             for (i = what_to_layout_array.length - 1; i; i -= 1) {
    + 12                 if (actor_max_w < what_to_layout_array[i].width) {
    + 13                     actor_max_w = what_to_layout_array[i].width;
    + 14                 }
    + 15                 if (actor_max_h < what_to_layout_array[i].height) {
    + 16                     actor_max_h = what_to_layout_array[i].height;
    + 17                 }
    + 18             }
    + 19 
    + 20             if (constraint_object.padding_left) {
    + 21                 x = constraint_object.padding_left;
    + 22                 width -= x;
    + 23             }
    + 24             if (constraint_object.padding_right) {
    + 25                 width -= constraint_object.padding_right;
    + 26             }
    + 27 
    + 28             if (constraint_object.top) {
    + 29                 var top = parseInt(constraint_object.top, 10);
    + 30                 if (!isNaN(top)) {
    + 31                     y = top;
    + 32                 } else {
    + 33                     // not number
    + 34                     switch (constraint_object.top) {
    + 35                         case 'center':
    + 36                             y = (dst.height - actor_max_h) / 2;
    + 37                             break;
    + 38                         case 'top':
    + 39                             y = 0;
    + 40                             break;
    + 41                         case 'bottom':
    + 42                             y = dst.height - actor_max_h;
    + 43                             break;
    + 44                         default:
    + 45                             y = 0;
    + 46                     }
    + 47                 }
    + 48             }
    + 49 
    + 50             // space for each actor
    + 51             var actor_area = width / what_to_layout_array.length;
    + 52 
    + 53             for (i = 0, l = what_to_layout_array.length; i < l; i++) {
    + 54                 what_to_layout_array[i].setLocation(
    + 55                     x + i * actor_area + (actor_area - what_to_layout_array[i].width) / 2,
    + 56                     y);
    + 57             }
    + 58 
    + 59         }
    + 60     }
    + 61 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Locale_ResourceBundle.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Locale_ResourceBundle.js.html new file mode 100644 index 00000000..4bf1d5de --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Locale_ResourceBundle.js.html @@ -0,0 +1,242 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name Locale
    +  5      * @memberOf CAAT.Module
    +  6      * @namespace
    +  7      */
    +  8 
    +  9     /**
    + 10      * @name ResourceBundle
    + 11      * @memberOf CAAT.Module.Locale
    + 12      * @constructor
    + 13      */
    + 14 
    + 15     defines:"CAAT.Module.Locale.ResourceBundle",
    + 16     extendsWith:function () {
    + 17 
    + 18         return {
    + 19 
    + 20             /**
    + 21              * @lends CAAT.Module.Locale.ResourceBundle.prototype
    + 22              */
    + 23 
    + 24 
    + 25             /**
    + 26              * Is this bundle valid ?
    + 27              */
    + 28             valid : false,
    + 29 
    + 30             /**
    + 31              * Original file contents.
    + 32              */
    + 33             localeInfo : null,      // content from resourceFile
    + 34 
    + 35             /**
    + 36              * Current set locale.
    + 37              */
    + 38             __currentLocale : null, // default locale data
    + 39 
    + 40             /**
    + 41              * Default locale info.
    + 42              */
    + 43             __defaultLocale : null,
    + 44 
    + 45             /**
    + 46              * <p>
    + 47              * Load a bundle file.
    + 48              * The expected file format is as follows:
    + 49              *
    + 50              * <code>
    + 51              * {
    + 52              *  "defaultLocale" : "en-US",
    + 53              *  "en-US" : {
    + 54              *          "key1", "value1",
    + 55              *          "key2", "value2",
    + 56              *          ...
    + 57              *      },
    + 58              *  "en-UK" : {
    + 59              *          "key1", "value1",
    + 60              *          "key2", "value2",
    + 61              *          ...
    + 62              *      }
    + 63              * }
    + 64              * </code>
    + 65              *
    + 66              * <p>
    + 67              * defaultLocale is compulsory.
    + 68              *
    + 69              * <p>
    + 70              * The function getString solves as follows:
    + 71              *
    + 72              * <li>a ResouceBundle object will honor browser/system locale by searching for these strings in
    + 73              *   the navigator object to define the value of currentLocale:
    + 74              *
    + 75              *   <ul>navigator.language
    + 76              *   <ul>navigator.browserLanguage
    + 77              *   <ul>navigator.systemLanguage
    + 78              *   <ul>navigator.userLanguage
    + 79              *
    + 80              * <li>the ResouceBundle class will also get defaultLocale value, and set the corresponding key
    + 81              *   as default Locale.
    + 82              *
    + 83              * <li>a call to getString(id,defaultValue) will work as follows:
    + 84              *
    + 85              * <pre>
    + 86              *   1)     will get the value associated in currentLocale[id]
    + 87              *   2)     if the value is set, it is returned.
    + 88              *   2.1)       else if it is not set, will get the value from defaultLocale[id] (sort of fallback)
    + 89              *   3)     if the value of defaultLocale is set, it is returned.
    + 90              *   3.1)       else defaultValue is returned.
    + 91              * </pre>
    + 92              *
    + 93              * @param resourceFile
    + 94              * @param asynch
    + 95              * @param onSuccess
    + 96              * @param onError
    + 97              * @return {*}
    + 98              * @private
    + 99              */
    +100             __init : function( resourceFile, asynch, onSuccess, onError ) {
    +101 
    +102                 this.loadDoc( resourceFile, asynch, onSuccess, onError );
    +103                 if ( this.valid ) {
    +104                     try {
    +105                         var locale= navigator.language || navigator.browserLanguage || navigator.systemLanguage  || navigator.userLanguage;
    +106                         this.__currentLocale= this.localeInfo[locale];
    +107                         this.__defaultLocale= this.localeInfo["defaultLocale"];
    +108 
    +109                         if ( typeof this.__currentLocale==='undefined' ) {
    +110                             this.__currentLocale= this.__defaultLocale;
    +111                         }
    +112 
    +113                         if ( !this.__currentLocale ) {
    +114                             onError("No available default or system defined locale('"+locale+"'");
    +115                         }
    +116 
    +117                         this.valid= false;
    +118 
    +119                     } catch(e) {
    +120                         onError("No default locale");
    +121                         this.valid= false;
    +122                     }
    +123                 }
    +124 
    +125                 return this;
    +126             },
    +127 
    +128             /**
    +129              * A formated string is a regular string that has embedded holder for string values.
    +130              * for example a string like:
    +131              *
    +132              * "hi this is a $2 $1"
    +133              *
    +134              * will be after calling __formatString( str, ["string","parameterized"] );
    +135              *
    +136              * "hi this is a parameterized string"
    +137              *
    +138              * IMPORTANT: Holder values start in 1.
    +139              *
    +140              * @param string {string} a parameterized string
    +141              * @param args {object} object whose keys are used to find holders and replace them in string parameter
    +142              * @return {string}
    +143              * @private
    +144              */
    +145             __formatString : function( string, args ) {
    +146 
    +147                 if ( !args ) {
    +148                     return string;
    +149                 }
    +150 
    +151                 for( var key in args ) {
    +152                     string= string.replace("$"+key, args[key]);
    +153                 }
    +154 
    +155                 return string;
    +156 
    +157             },
    +158 
    +159             /**
    +160              *
    +161              * @param id {string} a key from the bundle file.
    +162              * @param defaultValue {string} default value in case
    +163              * @param args {Array.<string>=} optional arguments array in case the returned string is a
    +164              *          parameterized string.
    +165              *
    +166              * @return {string}
    +167              */
    +168             getString : function(id, defaultValue, args) {
    +169 
    +170                 if ( this.valid ) {
    +171                     var str= this.__currentLocale[id];
    +172                     if ( str ) {
    +173                         return this.__formatString(str,args);
    +174                     } else {
    +175 
    +176                         if ( this.__currentLocale!==this.__defaultLocale ) {
    +177                             str= this.__defaultLocale[id];
    +178                             if ( str ) {
    +179                                 return this.__formatString(str,args);
    +180                             }
    +181                         }
    +182                     }
    +183                 }
    +184 
    +185                 return this.__formatString(defaultValue,args);
    +186             },
    +187 
    +188             loadDoc : function(resourceFile, asynch, onSuccess, onError ) {
    +189                 var me= this;
    +190 
    +191                 var req;
    +192                 if (window.XMLHttpRequest && !(window.ActiveXObject)) {
    +193                     try {
    +194                         req = new XMLHttpRequest();
    +195                     } catch (e) {
    +196                         req = null;
    +197                         onError(e);
    +198                     }
    +199                 } else if (window.ActiveXObject) {
    +200                     try {
    +201                         req = new ActiveXObject("Msxml2.XMLHTTP");
    +202                     } catch (e) {
    +203                         try {
    +204                             req = new ActiveXObject("Microsoft.XMLHTTP");
    +205                         } catch (e) {
    +206                             req = null;
    +207                             onError(e);
    +208                         }
    +209                     }
    +210                 }
    +211 
    +212                 if (req) {
    +213                     req.onreadystatechange = function () {
    +214                         if (req.readyState == 4) {
    +215                             if (req.status == 200) {
    +216                                 try {
    +217                                     me.localeInfo= JSON.parse(req.responseText);
    +218                                     me.valid= true;
    +219                                     onSuccess(me.localeInfo);
    +220                                 } catch(e) {
    +221                                     onError(e);
    +222                                 }
    +223                             } else {
    +224                                 onError("onReadyStateChange status="+req.status);
    +225                             }
    +226                         }
    +227                     };
    +228 
    +229                     req.open("GET", resourceFile, false);
    +230                     req.send("");
    +231                 }
    +232             }
    +233         }
    +234     }
    +235 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Runtime_BrowserInfo.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Runtime_BrowserInfo.js.html new file mode 100644 index 00000000..4f90f6a3 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Runtime_BrowserInfo.js.html @@ -0,0 +1,170 @@ +
      1 /**
    +  2  *
    +  3  * taken from: http://www.quirksmode.org/js/detect.html
    +  4  *
    +  5  * 20101008 Hyperandroid. IE9 seems to identify himself as Explorer and stopped calling himself MSIE.
    +  6  *          Added Explorer description to browser list. Thanks @alteredq for this tip.
    +  7  *
    +  8  */
    +  9 CAAT.Module({
    + 10 
    + 11     /**
    + 12      * @name Runtime
    + 13      * @memberOf CAAT.Module
    + 14      * @namespace
    + 15      */
    + 16 
    + 17     /**
    + 18      * @name BrowserInfo
    + 19      * @memberOf CAAT.Module.Runtime
    + 20      * @namespace
    + 21      */
    + 22 
    + 23     defines:"CAAT.Module.Runtime.BrowserInfo",
    + 24 
    + 25     constants: function() {
    + 26 
    + 27         /**
    + 28          * @lends CAAT.Module.Runtime.BrowserInfo
    + 29          */
    + 30 
    + 31         function searchString(data) {
    + 32             for (var i = 0; i < data.length; i++) {
    + 33                 var dataString = data[i].string;
    + 34                 var dataProp = data[i].prop;
    + 35                 this.versionSearchString = data[i].versionSearch || data[i].identity;
    + 36                 if (dataString) {
    + 37                     if (dataString.indexOf(data[i].subString) !== -1)
    + 38                         return data[i].identity;
    + 39                 }
    + 40                 else if (dataProp)
    + 41                     return data[i].identity;
    + 42             }
    + 43         }
    + 44 
    + 45         function searchVersion(dataString) {
    + 46             var index = dataString.indexOf(this.versionSearchString);
    + 47             if (index === -1) return;
    + 48             return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
    + 49         }
    + 50 
    + 51         var dataBrowser= [
    + 52             {
    + 53                 string:navigator.userAgent,
    + 54                 subString:"Chrome",
    + 55                 identity:"Chrome"
    + 56             },
    + 57             {   string:navigator.userAgent,
    + 58                 subString:"OmniWeb",
    + 59                 versionSearch:"OmniWeb/",
    + 60                 identity:"OmniWeb"
    + 61             },
    + 62             {
    + 63                 string:navigator.vendor,
    + 64                 subString:"Apple",
    + 65                 identity:"Safari",
    + 66                 versionSearch:"Version"
    + 67             },
    + 68             {
    + 69                 prop:window.opera,
    + 70                 identity:"Opera"
    + 71             },
    + 72             {
    + 73                 string:navigator.vendor,
    + 74                 subString:"iCab",
    + 75                 identity:"iCab"
    + 76             },
    + 77             {
    + 78                 string:navigator.vendor,
    + 79                 subString:"KDE",
    + 80                 identity:"Konqueror"
    + 81             },
    + 82             {
    + 83                 string:navigator.userAgent,
    + 84                 subString:"Firefox",
    + 85                 identity:"Firefox"
    + 86             },
    + 87             {
    + 88                 string:navigator.vendor,
    + 89                 subString:"Camino",
    + 90                 identity:"Camino"
    + 91             },
    + 92             {        // for newer Netscapes (6+)
    + 93                 string:navigator.userAgent,
    + 94                 subString:"Netscape",
    + 95                 identity:"Netscape"
    + 96             },
    + 97             {
    + 98                 string:navigator.userAgent,
    + 99                 subString:"MSIE",
    +100                 identity:"Explorer",
    +101                 versionSearch:"MSIE"
    +102             },
    +103             {
    +104                 string:navigator.userAgent,
    +105                 subString:"Explorer",
    +106                 identity:"Explorer",
    +107                 versionSearch:"Explorer"
    +108             },
    +109             {
    +110                 string:navigator.userAgent,
    +111                 subString:"Gecko",
    +112                 identity:"Mozilla",
    +113                 versionSearch:"rv"
    +114             },
    +115             { // for older Netscapes (4-)
    +116                 string:navigator.userAgent,
    +117                 subString:"Mozilla",
    +118                 identity:"Netscape",
    +119                 versionSearch:"Mozilla"
    +120             }
    +121         ];
    +122 
    +123         var dataOS=[
    +124             {
    +125                 string:navigator.platform,
    +126                 subString:"Win",
    +127                 identity:"Windows"
    +128             },
    +129             {
    +130                 string:navigator.platform,
    +131                 subString:"Mac",
    +132                 identity:"Mac"
    +133             },
    +134             {
    +135                 string:navigator.userAgent,
    +136                 subString:"iPhone",
    +137                 identity:"iPhone/iPod"
    +138             },
    +139             {
    +140                 string:navigator.platform,
    +141                 subString:"Linux",
    +142                 identity:"Linux"
    +143             }
    +144         ];
    +145 
    +146         var browser = searchString(dataBrowser) || "An unknown browser";
    +147         var version = searchVersion(navigator.userAgent) ||
    +148                       searchVersion(navigator.appVersion) ||
    +149                       "an unknown version";
    +150         var OS = searchString(dataOS) || "an unknown OS";
    +151 
    +152         var DevicePixelRatio = window.devicePixelRatio || 1;
    +153 
    +154         return {
    +155             browser: browser,
    +156             version: version,
    +157             OS: OS,
    +158             DevicePixelRatio : DevicePixelRatio
    +159         }
    +160 
    +161     }
    +162 });
    +163 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Bone.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Bone.js.html new file mode 100644 index 00000000..6894ed9e --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Bone.js.html @@ -0,0 +1,514 @@ +
      1 /**
    +  2  * Created with JetBrains WebStorm.
    +  3  * User: ibon
    +  4  * Date: 3/21/13
    +  5  * Time: 7:51 PM
    +  6  * To change this template use File | Settings | File Templates.
    +  7  */
    +  8 CAAT.Module({
    +  9 
    + 10     /**
    + 11      * @name Skeleton
    + 12      * @memberof CAAT.Module
    + 13      * @namespace
    + 14      */
    + 15 
    + 16     /**
    + 17      * @name Bone
    + 18      * @memberof CAAT.Module.Skeleton
    + 19      * @constructor
    + 20      */
    + 21 
    + 22     defines : "CAAT.Module.Skeleton.Bone",
    + 23     depends : [
    + 24         "CAAT.Behavior.Interpolator",
    + 25         "CAAT.Behavior.RotateBehavior",
    + 26         "CAAT.Behavior.PathBehavior",
    + 27         "CAAT.Behavior.ScaleBehavior",
    + 28         "CAAT.Behavior.ContainerBehavior"
    + 29     ],
    + 30     extendsWith : function() {
    + 31 
    + 32 
    + 33         /**
    + 34          * @lends CAAT.Module.Skeleton.Bone.prototype
    + 35          */
    + 36 
    + 37         var defPoint = { x: 0, y: 0 };
    + 38         var defScale = { scaleX: 1, scaleY: 1 };
    + 39         var defAngle = 0;
    + 40 
    + 41         var cangle;
    + 42         var cscale;
    + 43         var cpoint;
    + 44 
    + 45         function fntr(behavior, orgtime, time, actor, value) {
    + 46             cpoint= value;
    + 47         }
    + 48 
    + 49         function fnsc(behavior, orgtime, time, actor, value) {
    + 50             cscale= value;
    + 51         }
    + 52 
    + 53         function fnrt(behavior, orgtime, time, actor, value) {
    + 54             cangle= value;
    + 55         }
    + 56 
    + 57         return {
    + 58             id : null,
    + 59 
    + 60             wx : 0,
    + 61             wy : 0,
    + 62             wrotationAngle : 0,
    + 63             wscaleX : 0,
    + 64             wscaleY : 0,
    + 65 
    + 66             /**
    + 67              * Bone x position relative parent
    + 68              * @type number
    + 69              */
    + 70             x : 0,
    + 71 
    + 72             /**
    + 73              * Bone y position relative parent
    + 74              * @type {number}
    + 75              */
    + 76             y : 0,
    + 77 
    + 78             positionAnchorX : 0,
    + 79             positionAnchorY : 0,
    + 80 
    + 81             /**
    + 82              * Bone rotation angle
    + 83              * @type {number}
    + 84              */
    + 85             rotationAngle : 0,
    + 86             rotationAnchorX : 0,
    + 87             rotationAnchorY : 0.5,
    + 88 
    + 89             scaleX : 1,
    + 90             scaleY : 1,
    + 91             scaleAnchorX : .5,
    + 92             scaleAnchorY : .5,
    + 93 
    + 94             /**
    + 95              * Bone size.
    + 96              * @type number
    + 97              */
    + 98             size : 0,
    + 99 
    +100             /**
    +101              * @type CAAT.Math.Matrix
    +102              */
    +103             matrix : null,
    +104 
    +105             /**
    +106              * @type CAAT.Math.Matrix
    +107              */
    +108             wmatrix : null,
    +109 
    +110             /**
    +111              * @type CAAT.Skeleton.Bone
    +112              */
    +113             parent : null,
    +114 
    +115             /**
    +116              * @type CAAT.Behavior.ContainerBehavior
    +117              */
    +118             keyframesTranslate : null,
    +119 
    +120             /**
    +121              * @type CAAT.PathUtil.Path
    +122              */
    +123             keyframesTranslatePath : null,
    +124 
    +125             /**
    +126              * @type CAAT.Behavior.ContainerBehavior
    +127              */
    +128             keyframesScale : null,
    +129 
    +130             /**
    +131              * @type CAAT.Behavior.ContainerBehavior
    +132              */
    +133             keyframesRotate : null,
    +134 
    +135             /**
    +136              * @type object
    +137              */
    +138             keyframesByAnimation : null,
    +139 
    +140             currentAnimation : null,
    +141 
    +142             /**
    +143              * @type Array.<CAAT.Skeleton.Bone>
    +144              */
    +145             children : null,
    +146 
    +147             behaviorApplicationTime : -1,
    +148 
    +149             __init : function(id) {
    +150                 this.id= id;
    +151                 this.matrix= new CAAT.Math.Matrix();
    +152                 this.wmatrix= new CAAT.Math.Matrix();
    +153                 this.parent= null;
    +154                 this.children= [];
    +155 
    +156                 this.keyframesByAnimation = {};
    +157 
    +158                 return this;
    +159             },
    +160 
    +161             setBehaviorApplicationTime : function(t) {
    +162                 this.behaviorApplicationTime= t;
    +163                 return this;
    +164             },
    +165 
    +166             __createAnimation : function(name) {
    +167 
    +168                 var keyframesTranslate= new CAAT.Behavior.ContainerBehavior(true).setCycle(true, true).setId("keyframes_tr");
    +169                 var keyframesScale= new CAAT.Behavior.ContainerBehavior(true).setCycle(true, true).setId("keyframes_sc");
    +170                 var keyframesRotate= new CAAT.Behavior.ContainerBehavior(true).setCycle(true, true).setId("keyframes_rt");
    +171 
    +172                 keyframesTranslate.addListener( { behaviorApplied : fntr });
    +173                 keyframesScale.addListener( { behaviorApplied : fnsc });
    +174                 keyframesRotate.addListener( { behaviorApplied : fnrt });
    +175 
    +176                 var animData= {
    +177                     keyframesTranslate  : keyframesTranslate,
    +178                     keyframesScale      : keyframesScale,
    +179                     keyframesRotate     : keyframesRotate
    +180                 };
    +181 
    +182                 this.keyframesByAnimation[name]= animData;
    +183 
    +184                 return animData;
    +185             },
    +186 
    +187             __getAnimation : function(name) {
    +188                 var animation= this.keyframesByAnimation[ name ];
    +189                 if (!animation) {
    +190                     animation= this.__createAnimation(name);
    +191                 }
    +192 
    +193                 return animation;
    +194             },
    +195 
    +196             /**
    +197              *
    +198              * @param parent {CAAT.Skeleton.Bone}
    +199              * @returns {*}
    +200              */
    +201             __setParent : function( parent ) {
    +202                 this.parent= parent;
    +203                 return this;
    +204             },
    +205 
    +206             addBone : function( bone ) {
    +207                 this.children.push(bone);
    +208                 bone.__setParent(this);
    +209                 return this;
    +210             },
    +211 
    +212             __noValue : function( keyframes ) {
    +213                 keyframes.doValueApplication= false;
    +214                 if ( keyframes instanceof CAAT.Behavior.ContainerBehavior ) {
    +215                     this.__noValue( keyframes );
    +216                 }
    +217             },
    +218 
    +219             __setInterpolator : function(behavior, curve) {
    +220                 if (curve && curve!=="stepped") {
    +221                     behavior.setInterpolator(
    +222                             new CAAT.Behavior.Interpolator().createQuadricBezierInterpolator(
    +223                                     new CAAT.Math.Point(0,0),
    +224                                     new CAAT.Math.Point(curve[0], curve[1]),
    +225                                     new CAAT.Math.Point(curve[2], curve[3])
    +226                             )
    +227                     );
    +228                 }
    +229             },
    +230 
    +231             /**
    +232              *
    +233              * @param name {string} keyframe animation name
    +234              * @param angleStart {number} rotation start angle
    +235              * @param angleEnd {number} rotation end angle
    +236              * @param timeStart {number} keyframe start time
    +237              * @param timeEnd {number} keyframe end time
    +238              * @param curve {Array.<number>=} 4 numbers definint a quadric bezier info. two first points
    +239              *  assumed to be 0,0.
    +240              */
    +241             addRotationKeyframe : function( name, angleStart, angleEnd, timeStart, timeEnd, curve ) {
    +242 
    +243                 var as= 2*Math.PI*angleStart/360;
    +244                 var ae= 2*Math.PI*angleEnd/360;
    +245 
    +246                 // minimum distant between two angles.
    +247 
    +248                 if ( as<-Math.PI ) {
    +249                     if (Math.abs(as+this.rotationAngle)>2*Math.PI) {
    +250                         as= -(as+Math.PI);
    +251                     } else {
    +252                         as= (as+Math.PI);
    +253                     }
    +254                 } else if (as > Math.PI) {
    +255                     as -= 2 * Math.PI;
    +256                 }
    +257 
    +258                 if ( ae<-Math.PI ) {
    +259 
    +260                     if (Math.abs(ae+this.rotationAngle)>2*Math.PI) {
    +261                         ae= -(ae+Math.PI);
    +262                     } else {
    +263                         ae= (ae+Math.PI);
    +264                     }
    +265                 } else if ( ae>Math.PI ) {
    +266                     ae-=2*Math.PI;
    +267                 }
    +268 
    +269                 angleStart= -as;
    +270                 angleEnd= -ae;
    +271 
    +272                 var behavior= new CAAT.Behavior.RotateBehavior().
    +273                         setFrameTime( timeStart, timeEnd-timeStart+1).
    +274                         setValues( angleStart, angleEnd, 0, .5).
    +275                         setValueApplication(false);
    +276 
    +277                 this.__setInterpolator( behavior, curve );
    +278 
    +279                 var animation= this.__getAnimation(name);
    +280                 animation.keyframesRotate.addBehavior(behavior);
    +281             },
    +282 
    +283             endRotationKeyframes : function(name) {
    +284 
    +285             },
    +286 
    +287             addTranslationKeyframe : function( name, startX, startY, endX, endY, timeStart, timeEnd, curve ) {
    +288                 var behavior= new CAAT.Behavior.PathBehavior().
    +289                     setFrameTime( timeStart, timeEnd-timeStart+1).
    +290                     setValues( new CAAT.PathUtil.Path().
    +291                         setLinear( startX, startY, endX, endY )
    +292                     ).
    +293                     setValueApplication(false);
    +294 
    +295                 this.__setInterpolator( behavior, curve );
    +296 
    +297                 var animation= this.__getAnimation(name);
    +298                 animation.keyframesTranslate.addBehavior( behavior );
    +299             },
    +300 
    +301             addScaleKeyframe : function( name, scaleX, endScaleX, scaleY, endScaleY, timeStart, timeEnd, curve ) {
    +302                 var behavior= new CAAT.Behavior.ScaleBehavior().
    +303                     setFrameTime( timeStart, timeEnd-timeStart+1).
    +304                     setValues( scaleX, endScaleX, scaleY, endScaleY ).
    +305                     setValueApplication(false);
    +306 
    +307                 this.__setInterpolator( behavior, curve );
    +308 
    +309                 var animation= this.__getAnimation(name);
    +310                 animation.keyframesScale.addBehavior( behavior );
    +311             },
    +312 
    +313             endTranslationKeyframes : function(name) {
    +314 
    +315             },
    +316 
    +317             setSize : function(s) {
    +318                 this.width= s;
    +319                 this.height= 0;
    +320             },
    +321 
    +322             endScaleKeyframes : function(name) {
    +323 
    +324             },
    +325 
    +326             setPosition : function( x, y ) {
    +327                 this.x= x;
    +328                 this.y= -y;
    +329                 return this;
    +330             } ,
    +331 
    +332             /**
    +333              * default anchor values are for spine tool.
    +334              * @param angle {number}
    +335              * @param anchorX {number=}
    +336              * @param anchorY {number=}
    +337              * @returns {*}
    +338              */
    +339             setRotateTransform : function( angle, anchorX, anchorY ) {
    +340                 this.rotationAngle= -angle*2*Math.PI/360;
    +341                 this.rotationAnchorX= typeof anchorX!=="undefined" ? anchorX : 0;
    +342                 this.rotationAnchorY= typeof anchorY!=="undefined" ? anchorY : .5;
    +343                 return this;
    +344             },
    +345 
    +346             /**
    +347              *
    +348              * @param sx {number}
    +349              * @param sy {number}
    +350              * @param anchorX {number=} anchorX: .5 by default
    +351              * @param anchorY {number=} anchorY. .5 by default
    +352              * @returns {*}
    +353              */
    +354             setScaleTransform : function( sx, sy, anchorX, anchorY ) {
    +355                 this.scaleX= sx;
    +356                 this.scaleY= sy;
    +357                 this.scaleAnchorX= typeof anchorX!=="undefined" ? anchorX : .5;
    +358                 this.scaleAnchorY= typeof anchorY!=="undefined" ? anchorY : .5;
    +359                 return this;
    +360             },
    +361 
    +362 
    +363             __setModelViewMatrix : function() {
    +364                 var c, s, _m00, _m01, _m10, _m11;
    +365                 var mm0, mm1, mm2, mm3, mm4, mm5;
    +366                 var mm;
    +367 
    +368                 var mm = this.matrix.matrix;
    +369 
    +370                 mm0 = 1;
    +371                 mm1 = 0;
    +372                 mm3 = 0;
    +373                 mm4 = 1;
    +374 
    +375                 mm2 = this.wx - this.positionAnchorX * this.width;
    +376                 mm5 = this.wy - this.positionAnchorY * this.height;
    +377 
    +378                 if (this.wrotationAngle) {
    +379 
    +380                     var rx = this.rotationAnchorX * this.width;
    +381                     var ry = this.rotationAnchorY * this.height;
    +382 
    +383                     mm2 += mm0 * rx + mm1 * ry;
    +384                     mm5 += mm3 * rx + mm4 * ry;
    +385 
    +386                     c = Math.cos(this.wrotationAngle);
    +387                     s = Math.sin(this.wrotationAngle);
    +388                     _m00 = mm0;
    +389                     _m01 = mm1;
    +390                     _m10 = mm3;
    +391                     _m11 = mm4;
    +392                     mm0 = _m00 * c + _m01 * s;
    +393                     mm1 = -_m00 * s + _m01 * c;
    +394                     mm3 = _m10 * c + _m11 * s;
    +395                     mm4 = -_m10 * s + _m11 * c;
    +396 
    +397                     mm2 += -mm0 * rx - mm1 * ry;
    +398                     mm5 += -mm3 * rx - mm4 * ry;
    +399                 }
    +400                 if (this.wscaleX != 1 || this.wscaleY != 1) {
    +401 
    +402                     var sx = this.scaleAnchorX * this.width;
    +403                     var sy = this.scaleAnchorY * this.height;
    +404 
    +405                     mm2 += mm0 * sx + mm1 * sy;
    +406                     mm5 += mm3 * sx + mm4 * sy;
    +407 
    +408                     mm0 = mm0 * this.wscaleX;
    +409                     mm1 = mm1 * this.wscaleY;
    +410                     mm3 = mm3 * this.wscaleX;
    +411                     mm4 = mm4 * this.wscaleY;
    +412 
    +413                     mm2 += -mm0 * sx - mm1 * sy;
    +414                     mm5 += -mm3 * sx - mm4 * sy;
    +415                 }
    +416 
    +417                 mm[0] = mm0;
    +418                 mm[1] = mm1;
    +419                 mm[2] = mm2;
    +420                 mm[3] = mm3;
    +421                 mm[4] = mm4;
    +422                 mm[5] = mm5;
    +423 
    +424                 if (this.parent) {
    +425                     this.wmatrix.copy(this.parent.wmatrix);
    +426                     this.wmatrix.multiply(this.matrix);
    +427                 } else {
    +428                     this.wmatrix.identity();
    +429                 }
    +430             },
    +431 
    +432             setAnimation : function(name) {
    +433                 var animation= this.keyframesByAnimation[name];
    +434                 if (animation) {
    +435                     this.keyframesRotate= animation.keyframesRotate;
    +436                     this.keyframesScale= animation.keyframesScale;
    +437                     this.keyframesTranslate= animation.keyframesTranslate;
    +438                 }
    +439 
    +440                 for( var i= 0, l=this.children.length; i<l; i+=1 ) {
    +441                     this.children[i].setAnimation(name);
    +442                 }
    +443             },
    +444 
    +445             /**
    +446              * @param time {number}
    +447              */
    +448             apply : function( time, animationTime ) {
    +449 
    +450                 cpoint= defPoint;
    +451                 cangle= defAngle;
    +452                 cscale= defScale;
    +453 
    +454                 if (this.keyframesTranslate) {
    +455                     this.keyframesTranslate.apply(time);
    +456                 }
    +457 
    +458                 if ( this.keyframesRotate ) {
    +459                     this.keyframesRotate.apply(time);
    +460                 }
    +461 
    +462                 if ( this.keyframesScale ) {
    +463                     this.keyframesScale.apply(time);
    +464                 }
    +465 
    +466                 this.wx= cpoint.x + this.x;
    +467                 this.wy= cpoint.y + this.y;
    +468 
    +469                 this.wrotationAngle = cangle + this.rotationAngle;
    +470 
    +471                 this.wscaleX= cscale.scaleX * this.scaleX;
    +472                 this.wscaleY= cscale.scaleY * this.scaleY;
    +473 
    +474                 this.__setModelViewMatrix();
    +475 
    +476                 for( var i=0; i<this.children.length; i++ ) {
    +477                     this.children[i].apply(time);
    +478                 }
    +479             },
    +480 
    +481             transformContext : function(ctx) {
    +482                 var m= this.wmatrix.matrix;
    +483                 ctx.transform( m[0], m[3], m[1], m[4], m[2], m[5] );
    +484             },
    +485 
    +486             paint : function( actorMatrix, ctx ) {
    +487                 ctx.save();
    +488                     this.transformContext(ctx);
    +489 
    +490                     ctx.strokeStyle= 'blue';
    +491                     ctx.beginPath();
    +492                     ctx.moveTo(0,-2);
    +493                     ctx.lineTo(this.width,this.height);
    +494                     ctx.lineTo(0,2);
    +495                     ctx.lineTo(0,-2);
    +496                     ctx.stroke();
    +497                 ctx.restore();
    +498 
    +499                 for( var i=0; i<this.children.length; i++ ) {
    +500                     this.children[i].paint(actorMatrix, ctx);
    +501                 }
    +502 
    +503 
    +504             }
    +505         }
    +506     }
    +507 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_BoneActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_BoneActor.js.html new file mode 100644 index 00000000..c67f389d --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_BoneActor.js.html @@ -0,0 +1,265 @@ +
      1 CAAT.Module({
    +  2 
    +  3 
    +  4     /**
    +  5      * @name BoneActor
    +  6      * @memberof CAAT.Module.Skeleton
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.Module.Skeleton.BoneActor",
    + 11     depends : [
    + 12         "CAAT.Module.Skeleton.BoneActorAttachment"
    + 13     ],
    + 14     extendsWith : function() {
    + 15 
    + 16         return {
    + 17 
    + 18             /**
    + 19              * @lends CAAT.Module.Skeleton.BoneActor.prototype
    + 20              */
    + 21 
    + 22             bone    : null,
    + 23             skinInfo : null,
    + 24             skinInfoByName : null,
    + 25             currentSkinInfo : null,
    + 26             skinDataKeyframes : null,
    + 27             parent : null,
    + 28             worldModelViewMatrix : null,
    + 29             skinMatrix : null,  // compositon of bone + skin info
    + 30             AABB : null,
    + 31 
    + 32             /**
    + 33              * @type {object}
    + 34              * @map {string}, { x:{number}, y: {number} }
    + 35              */
    + 36             attachments : null,
    + 37 
    + 38             __init : function() {
    + 39                 this.skinInfo= [];
    + 40                 this.worldModelViewMatrix= new CAAT.Math.Matrix();
    + 41                 this.skinMatrix= new CAAT.Math.Matrix();
    + 42                 this.skinInfoByName= {};
    + 43                 this.skinDataKeyframes= [];
    + 44                 this.attachments= [];
    + 45                 this.AABB= new CAAT.Math.Rectangle();
    + 46             },
    + 47 
    + 48             addAttachment : function( id, normalized_x, normalized_y, callback ) {
    + 49 
    + 50                 this.attachments.push( new CAAT.Module.Skeleton.BoneActorAttachment(id, normalized_x, normalized_y, callback) );
    + 51             },
    + 52 
    + 53             addAttachmentListener : function( al ) {
    + 54 
    + 55             },
    + 56 
    + 57             setBone : function(bone) {
    + 58                 this.bone= bone;
    + 59                 return this;
    + 60             },
    + 61 
    + 62             addSkinInfo : function( si ) {
    + 63                 if (null===this.currentSkinInfo) {
    + 64                     this.currentSkinInfo= si;
    + 65                 }
    + 66                 this.skinInfo.push( si );
    + 67                 this.skinInfoByName[ si.name ]= si;
    + 68                 return this;
    + 69             },
    + 70 
    + 71             setDefaultSkinInfoByName : function( name ) {
    + 72                 var v= this.skinInfoByName[name];
    + 73                 if (v) {
    + 74                     this.currentSkinInfo= v;
    + 75                 }
    + 76 
    + 77                 return this;
    + 78             },
    + 79 
    + 80             emptySkinDataKeyframe : function() {
    + 81                 this.skinDataKeyframes= [];
    + 82             },
    + 83 
    + 84             addSkinDataKeyframe : function( name, start, duration ) {
    + 85                 this.skinDataKeyframes.push( {
    + 86                     name : name,
    + 87                     start : start,
    + 88                     duration : duration
    + 89                 });
    + 90             },
    + 91 
    + 92             __getCurrentSkinInfo : function(time) {
    + 93                 if ( this.skinDataKeyframes.length ) {
    + 94                     time=(time%1000)/1000;
    + 95 
    + 96                     for( var i=0, l=this.skinDataKeyframes.length; i<l; i+=1 ) {
    + 97                         var sdkf= this.skinDataKeyframes[i];
    + 98                         if ( time>=sdkf.start && time<=sdkf.start+sdkf.duration ) {
    + 99                             return this.currentSkinInfo= this.skinInfoByName[ sdkf.name ];
    +100                         }
    +101                     }
    +102 
    +103                     return null;
    +104                 }
    +105 
    +106                 return this.currentSkinInfo;
    +107             },
    +108 
    +109             paint : function( ctx, time ) {
    +110 
    +111                 var skinInfo= this.__getCurrentSkinInfo(time);
    +112 
    +113                 if (!skinInfo || !skinInfo.image) {
    +114                     return;
    +115                 }
    +116 
    +117                 /*
    +118                     var w= skinInfo.width*.5;
    +119                     var h= skinInfo.height*.5;
    +120 
    +121                     ctx.translate(skinInfo.x, skinInfo.y );
    +122                     ctx.rotate(skinInfo.angle);
    +123                     ctx.scale(skinInfo.scaleX, skinInfo.scaleY);
    +124                     ctx.translate( -w, -h);
    +125                 */
    +126 
    +127                 this.worldModelViewMatrix.transformRenderingContextSet(ctx);
    +128                 skinInfo.matrix.transformRenderingContext( ctx );
    +129                 ctx.drawImage( skinInfo.image, 0, 0, skinInfo.image.width, skinInfo.image.height );
    +130 
    +131             },
    +132 
    +133             setupAnimation : function(time) {
    +134                 this.setModelViewMatrix();
    +135                 this.prepareAABB(time);
    +136                 this.__setupAttachments();
    +137             },
    +138 
    +139             prepareAABB : function(time) {
    +140                 var skinInfo= this.__getCurrentSkinInfo(time);
    +141                 var x=0, y=0, w, h;
    +142 
    +143                 if ( skinInfo ) {
    +144                     w= skinInfo.width;
    +145                     h= skinInfo.height;
    +146                 } else {
    +147                     w= h= 1;
    +148                 }
    +149 
    +150                 var vv= [
    +151                     new CAAT.Math.Point(x,y),
    +152                     new CAAT.Math.Point(x+w,0),
    +153                     new CAAT.Math.Point(x+w, y+h),
    +154                     new CAAT.Math.Point(x, y + h)
    +155                 ];
    +156 
    +157                 var AABB= this.AABB;
    +158                 var vvv;
    +159 
    +160                 /**
    +161                  * cache the bone+skin matrix for later usage in attachment calculations.
    +162                  */
    +163                 var amatrix= this.skinMatrix;
    +164                 amatrix.copy( this.worldModelViewMatrix );
    +165                 amatrix.multiply( this.currentSkinInfo.matrix );
    +166 
    +167                 for( var i=0; i<vv.length; i++ ) {
    +168                     vv[i]= amatrix.transformCoord(vv[i]);
    +169                 }
    +170 
    +171                 var xmin = Number.MAX_VALUE, xmax = -Number.MAX_VALUE;
    +172                 var ymin = Number.MAX_VALUE, ymax = -Number.MAX_VALUE;
    +173 
    +174                 vvv = vv[0];
    +175                 if (vvv.x < xmin) {
    +176                     xmin = vvv.x;
    +177                 }
    +178                 if (vvv.x > xmax) {
    +179                     xmax = vvv.x;
    +180                 }
    +181                 if (vvv.y < ymin) {
    +182                     ymin = vvv.y;
    +183                 }
    +184                 if (vvv.y > ymax) {
    +185                     ymax = vvv.y;
    +186                 }
    +187                 vvv = vv[1];
    +188                 if (vvv.x < xmin) {
    +189                     xmin = vvv.x;
    +190                 }
    +191                 if (vvv.x > xmax) {
    +192                     xmax = vvv.x;
    +193                 }
    +194                 if (vvv.y < ymin) {
    +195                     ymin = vvv.y;
    +196                 }
    +197                 if (vvv.y > ymax) {
    +198                     ymax = vvv.y;
    +199                 }
    +200                 vvv = vv[2];
    +201                 if (vvv.x < xmin) {
    +202                     xmin = vvv.x;
    +203                 }
    +204                 if (vvv.x > xmax) {
    +205                     xmax = vvv.x;
    +206                 }
    +207                 if (vvv.y < ymin) {
    +208                     ymin = vvv.y;
    +209                 }
    +210                 if (vvv.y > ymax) {
    +211                     ymax = vvv.y;
    +212                 }
    +213                 vvv = vv[3];
    +214                 if (vvv.x < xmin) {
    +215                     xmin = vvv.x;
    +216                 }
    +217                 if (vvv.x > xmax) {
    +218                     xmax = vvv.x;
    +219                 }
    +220                 if (vvv.y < ymin) {
    +221                     ymin = vvv.y;
    +222                 }
    +223                 if (vvv.y > ymax) {
    +224                     ymax = vvv.y;
    +225                 }
    +226 
    +227                 AABB.x = xmin;
    +228                 AABB.y = ymin;
    +229                 AABB.x1 = xmax;
    +230                 AABB.y1 = ymax;
    +231                 AABB.width = (xmax - xmin);
    +232                 AABB.height = (ymax - ymin);
    +233             },
    +234 
    +235             setModelViewMatrix : function() {
    +236 
    +237                 if (this.parent) {
    +238                     this.worldModelViewMatrix.copy(this.parent.worldModelViewMatrix);
    +239                     this.worldModelViewMatrix.multiply(this.bone.wmatrix);
    +240 
    +241                 } else {
    +242                     this.worldModelViewMatrix.identity();
    +243                 }
    +244             },
    +245 
    +246             __setupAttachments : function( ) {
    +247                 for( var i= 0, l=this.attachments.length; i<l; i+=1 ) {
    +248                     var attachment= this.attachments[ i ];
    +249                     attachment.transform( this.skinMatrix, this.currentSkinInfo.width, this.currentSkinInfo.height );
    +250                 }
    +251             },
    +252 
    +253             getAttachment : function( id ) {
    +254                 return this.attachments[id];
    +255             }
    +256         }
    +257     }
    +258 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Skeleton.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Skeleton.js.html new file mode 100644 index 00000000..099388a2 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_Skeleton.js.html @@ -0,0 +1,290 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name Skeleton
    +  5      * @memberof CAAT.Module.Skeleton
    +  6      * @constructor
    +  7      */
    +  8 
    +  9     defines : "CAAT.Module.Skeleton.Skeleton",
    + 10     depends : [
    + 11         "CAAT.Module.Skeleton.Bone"
    + 12     ],
    + 13     extendsWith : {
    + 14 
    + 15         /**
    + 16          * @lends CAAT.Module.Skeleton.Skeleton.prototype
    + 17          */
    + 18 
    + 19         bones : null,
    + 20         bonesArray : null,
    + 21         animation : null,
    + 22         root  : null,
    + 23         currentAnimationName : null,
    + 24         skeletonDataFromFile : null,
    + 25 
    + 26         __init : function(skeletonDataFromFile) {
    + 27             this.bones= {};
    + 28             this.bonesArray= [];
    + 29             this.animations= {};
    + 30 
    + 31             // bones
    + 32             if (skeletonDataFromFile) {
    + 33                 this.__setSkeleton( skeletonDataFromFile );
    + 34             }
    + 35         },
    + 36 
    + 37         getSkeletonDataFromFile : function() {
    + 38             return this.skeletonDataFromFile;
    + 39         },
    + 40 
    + 41         __setSkeleton : function( skeletonDataFromFile ) {
    + 42             this.skeletonDataFromFile= skeletonDataFromFile;
    + 43             for ( var i=0; i<skeletonDataFromFile.bones.length; i++ ) {
    + 44                 var boneInfo= skeletonDataFromFile.bones[i];
    + 45                 this.addBone(boneInfo);
    + 46             }
    + 47         },
    + 48 
    + 49         setSkeletonFromFile : function(url) {
    + 50             var me= this;
    + 51             new CAAT.Module.Preloader.XHR().load(
    + 52                     function( result, content ) {
    + 53                         if (result==="ok" ) {
    + 54                             me.__setSkeleton( JSON.parse(content) );
    + 55                         }
    + 56                     },
    + 57                     url,
    + 58                     false,
    + 59                     "GET"
    + 60             );
    + 61 
    + 62             return this;
    + 63         },
    + 64 
    + 65         addAnimationFromFile : function(name, url) {
    + 66             var me= this;
    + 67             new CAAT.Module.Preloader.XHR().load(
    + 68                     function( result, content ) {
    + 69                         if (result==="ok" ) {
    + 70                             me.addAnimation( name, JSON.parse(content) );
    + 71                         }
    + 72                     },
    + 73                     url,
    + 74                     false,
    + 75                     "GET"
    + 76             );
    + 77 
    + 78             return this;
    + 79         },
    + 80 
    + 81         addAnimation : function(name, animation) {
    + 82 
    + 83             // bones animation
    + 84             for( var bonename in animation.bones ) {
    + 85 
    + 86                 var boneanimation= animation.bones[bonename];
    + 87 
    + 88                 if ( boneanimation.rotate ) {
    + 89 
    + 90                     for( var i=0; i<boneanimation.rotate.length-1; i++ ) {
    + 91                         this.addRotationKeyframe(
    + 92                             name,
    + 93                             {
    + 94                                 boneId : bonename,
    + 95                                 angleStart : boneanimation.rotate[i].angle,
    + 96                                 angleEnd : boneanimation.rotate[i+1].angle,
    + 97                                 timeStart : boneanimation.rotate[i].time*1000,
    + 98                                 timeEnd : boneanimation.rotate[i+1].time*1000,
    + 99                                 curve : boneanimation.rotate[i].curve
    +100                             } );
    +101                     }
    +102                 }
    +103 
    +104                 if (boneanimation.translate) {
    +105 
    +106                     for( var i=0; i<boneanimation.translate.length-1; i++ ) {
    +107 
    +108                         this.addTranslationKeyframe(
    +109                             name,
    +110                             {
    +111                                 boneId      : bonename,
    +112                                 startX      : boneanimation.translate[i].x,
    +113                                 startY      : -boneanimation.translate[i].y,
    +114                                 endX        : boneanimation.translate[i+1].x,
    +115                                 endY        : -boneanimation.translate[i+1].y,
    +116                                 timeStart   : boneanimation.translate[i].time * 1000,
    +117                                 timeEnd     : boneanimation.translate[i+1].time * 1000,
    +118                                 curve       : "stepped" //boneanimation.translate[i].curve
    +119 
    +120                             });
    +121                     }
    +122                 }
    +123 
    +124                 if ( boneanimation.scale ) {
    +125                     for( var i=0; i<boneanimation.scale.length-1; i++ ) {
    +126                         this.addScaleKeyframe(
    +127                             name,
    +128                             {
    +129                                 boneId : bonename,
    +130                                 startScaleX : boneanimation.rotate[i].x,
    +131                                 endScaleX : boneanimation.rotate[i+1].x,
    +132                                 startScaleY : boneanimation.rotate[i].y,
    +133                                 endScaleY : boneanimation.rotate[i+1].y,
    +134                                 timeStart : boneanimation.rotate[i].time*1000,
    +135                                 timeEnd : boneanimation.rotate[i+1].time*1000,
    +136                                 curve : boneanimation.rotate[i].curve
    +137                             } );
    +138                     }
    +139                 }
    +140 
    +141                 this.endKeyframes( name, bonename );
    +142 
    +143             }
    +144 
    +145             if ( null===this.currentAnimationName ) {
    +146                 this.animations[name]= animation;
    +147                 this.setAnimation(name);
    +148             }
    +149 
    +150             return this;
    +151         },
    +152 
    +153         setAnimation : function(name) {
    +154             this.root.setAnimation( name );
    +155             this.currentAnimationName= name;
    +156         },
    +157 
    +158         getCurrentAnimationData : function() {
    +159             return this.animations[ this.currentAnimationName ];
    +160         },
    +161 
    +162         getAnimationDataByName : function(name) {
    +163             return this.animations[name];
    +164         },
    +165 
    +166         getNumBones : function() {
    +167             return this.bonesArray.length;
    +168         },
    +169 
    +170         getRoot : function() {
    +171             return this.root;
    +172         },
    +173 
    +174         calculate : function(time, animationTime) {
    +175             this.root.apply(time, animationTime);
    +176         },
    +177 
    +178         getBoneById : function(id) {
    +179             return this.bones[id];
    +180         },
    +181 
    +182         getBoneByIndex : function(index) {
    +183             return this.bonesArray[ index ];
    +184         },
    +185 
    +186         addBone : function( boneInfo ) {
    +187             var bone= new CAAT.Module.Skeleton.Bone(boneInfo.name);
    +188 
    +189             bone.setPosition(
    +190                 typeof boneInfo.x!=="undefined" ? boneInfo.x : 0,
    +191                 typeof boneInfo.y!=="undefined" ? boneInfo.y : 0 );
    +192             bone.setRotateTransform( boneInfo.rotation ? boneInfo.rotation : 0 );
    +193             bone.setSize( boneInfo.length ? boneInfo.length : 0, 0 );
    +194 
    +195             this.bones[boneInfo.name]= bone;
    +196 
    +197             if (boneInfo.parent) {
    +198 
    +199                 var parent= this.bones[boneInfo.parent];
    +200                 if ( parent ) {
    +201                     parent.addBone(bone);
    +202                 } else {
    +203                     console.log("Referenced parent Bone '"+boneInfo.parent+"' which does not exist");
    +204                 }
    +205             }
    +206 
    +207             this.bonesArray.push(bone);
    +208 
    +209             // BUGBUG should be an explicit root bone identification.
    +210             if (!this.root) {
    +211                 this.root= bone;
    +212             }
    +213         },
    +214 
    +215         addRotationKeyframe : function( name, keyframeInfo ) {
    +216             var bone= this.bones[ keyframeInfo.boneId ];
    +217             if ( bone ) {
    +218                 bone.addRotationKeyframe(
    +219                     name,
    +220                     keyframeInfo.angleStart,
    +221                     keyframeInfo.angleEnd,
    +222                     keyframeInfo.timeStart,
    +223                     keyframeInfo.timeEnd,
    +224                     keyframeInfo.curve
    +225                 )
    +226             } else {
    +227                 console.log("Rotation Keyframe for non-existant bone: '"+keyframeInfo.boneId+"'" );
    +228             }
    +229         },
    +230 
    +231         addScaleKeyframe : function( name, keyframeInfo ) {
    +232             var bone= this.bones[ keyframeInfo.boneId ];
    +233             if ( bone ) {
    +234                 bone.addRotationKeyframe(
    +235                     name,
    +236                     keyframeInfo.startScaleX,
    +237                     keyframeInfo.endScaleX,
    +238                     keyframeInfo.startScaleY,
    +239                     keyframeInfo.endScaleY,
    +240                     keyframeInfo.timeStart,
    +241                     keyframeInfo.timeEnd,
    +242                     keyframeInfo.curve
    +243                 )
    +244             } else {
    +245                 console.log("Scale Keyframe for non-existant bone: '"+keyframeInfo.boneId+"'" );
    +246             }
    +247         },
    +248 
    +249         addTranslationKeyframe : function( name, keyframeInfo ) {
    +250 
    +251             var bone= this.bones[ keyframeInfo.boneId ];
    +252             if ( bone ) {
    +253 
    +254                 bone.addTranslationKeyframe(
    +255                     name,
    +256                     keyframeInfo.startX,
    +257                     keyframeInfo.startY,
    +258                     keyframeInfo.endX,
    +259                     keyframeInfo.endY,
    +260                     keyframeInfo.timeStart,
    +261                     keyframeInfo.timeEnd,
    +262                     keyframeInfo.curve
    +263                 )
    +264             } else {
    +265                 console.log("Translation Keyframe for non-existant bone: '"+keyframeInfo.boneId+"'" );
    +266             }
    +267         },
    +268 
    +269         endKeyframes : function( name, boneId ) {
    +270             var bone= this.bones[boneId];
    +271             if (bone) {
    +272                 bone.endTranslationKeyframes(name);
    +273                 bone.endRotationKeyframes(name);
    +274                 bone.endScaleKeyframes(name);
    +275             }
    +276         },
    +277 
    +278         paint : function( actorMatrix, ctx ) {
    +279             this.root.paint(actorMatrix,ctx);
    +280         }
    +281 
    +282     }
    +283 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_SkeletonActor.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_SkeletonActor.js.html new file mode 100644 index 00000000..947f7677 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Skeleton_SkeletonActor.js.html @@ -0,0 +1,389 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name SkeletonActor
    +  5      * @memberof CAAT.Module.Skeleton.prototype
    +  6      * @constructor
    +  7      */
    +  8 
    +  9     defines: "CAAT.Module.Skeleton.SkeletonActor",
    + 10     extendsClass: "CAAT.Foundation.Actor",
    + 11     depends: [
    + 12         "CAAT.Module.Skeleton.Skeleton",
    + 13         "CAAT.Module.Skeleton.BoneActor",
    + 14         "CAAT.Foundation.Actor"
    + 15     ],
    + 16     extendsWith: function () {
    + 17 
    + 18 
    + 19 
    + 20         /**
    + 21          * Holder to keep animation slots information.
    + 22          */
    + 23         function SlotInfoData( sortId, attachment, name, bone ) {
    + 24 
    + 25             this.sortId= sortId;
    + 26             this.attachment= attachment;
    + 27             this.name= name;
    + 28             this.bone= bone;
    + 29 
    + 30             return this;
    + 31         }
    + 32 
    + 33         return {
    + 34 
    + 35             /**
    + 36              * @lends CAAT.Module.Skeleton.SkeletonActor
    + 37              */
    + 38 
    + 39             skeleton: null,
    + 40 
    + 41             /**
    + 42              * @type object
    + 43              * @map < boneId{string}, SlotInfoData >
    + 44              */
    + 45             slotInfo: null,
    + 46 
    + 47             /**
    + 48              * @type Array.<SlotInfoData>
    + 49              */
    + 50             slotInfoArray: null,
    + 51 
    + 52             /**
    + 53              * @type object
    + 54              * @map
    + 55              */
    + 56             skinByName: null,
    + 57 
    + 58             /**
    + 59              * @type CAAT.Foundation.Director
    + 60              */
    + 61             director: null,
    + 62 
    + 63             /**
    + 64              * @type boolean
    + 65              */
    + 66             _showBones: false,
    + 67 
    + 68             /**
    + 69              * Currently selected animation play time.
    + 70              * Zero to make it last for its default value.
    + 71              * @type number
    + 72              */
    + 73             animationDuration : 0,
    + 74 
    + 75             showAABB : false,
    + 76             bonesActor : null,
    + 77 
    + 78             __init: function (director, skeleton) {
    + 79                 this.__super();
    + 80 
    + 81                 this.director = director;
    + 82                 this.skeleton = skeleton;
    + 83                 this.slotInfo = {};
    + 84                 this.slotInfoArray = [];
    + 85                 this.bonesActor= [];
    + 86                 this.skinByName = {};
    + 87 
    + 88                 this.setSkin();
    + 89                 this.setAnimation("default");
    + 90 
    + 91                 return this;
    + 92             },
    + 93 
    + 94             showBones: function (show) {
    + 95                 this._showBones = show;
    + 96                 return this;
    + 97             },
    + 98 
    + 99             /**
    +100              * build an sprite-sheet composed of numSprites elements and organized in rows x columns
    +101              * @param numSprites {number}
    +102              * @param rows {number=}
    +103              * @param columns {number=}
    +104              */
    +105             buildSheet : function( numSprites, rows, columns ) {
    +106 
    +107                 var i, j,l;
    +108                 var AABBs= [];
    +109                 var maxTime= 1000;  // BUGBUG search for animation time.
    +110                 var ssItemWidth, ssItemHeight;  // sprite sheet item width and height
    +111                 var ssItemMinX= Number.MAX_VALUE, ssItemMinY= Number.MAX_VALUE;
    +112                 var ssItemMaxOffsetY, ssItemMaxOffsetX;
    +113 
    +114                 // prepare this actor's world model view matrix, but with no position.
    +115                 var px= this.x;
    +116                 var py= this.y;
    +117                 this.x= this.y= 0;
    +118                 this.setModelViewMatrix();
    +119 
    +120 
    +121                 rows= rows || 1;
    +122                 columns= columns || 1;
    +123 
    +124                 // calculate all sprite sheet frames aabb.
    +125                 for( j=0; j<numSprites; j++ ) {
    +126                     var aabb= new CAAT.Math.Rectangle();
    +127                     var time= maxTime/numSprites*j;
    +128                     AABBs.push( aabb );
    +129                     this.skeleton.calculate( time, this.animationDuration );
    +130 
    +131                     for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    +132                         var bone= this.bonesActor[i];
    +133                         var boneAABB;
    +134                         bone.setupAnimation(time);
    +135                         boneAABB= bone.AABB;
    +136                         aabb.unionRectangle(boneAABB);
    +137                         if ( boneAABB.x < ssItemMinX ) {
    +138                             ssItemMinX= boneAABB.x;
    +139                         }
    +140                     }
    +141                 }
    +142 
    +143                 // calculate offsets for each aabb and sprite-sheet element size.
    +144                 ssItemWidth= 0;
    +145                 ssItemHeight= 0;
    +146                 ssItemMinX= Number.MAX_VALUE;
    +147                 ssItemMinY= Number.MAX_VALUE;
    +148                 for( i=0; i<AABBs.length; i++ ) {
    +149                     if ( AABBs[i].x < ssItemMinX ) {
    +150                         ssItemMinX= AABBs[i].x;
    +151                     }
    +152                     if ( AABBs[i].y < ssItemMinY ) {
    +153                         ssItemMinY= AABBs[i].y;
    +154                     }
    +155                     if ( AABBs[i].width>ssItemWidth ) {
    +156                         ssItemWidth= AABBs[i].width;
    +157                     }
    +158                     if ( AABBs[i].height>ssItemHeight ) {
    +159                         ssItemHeight= AABBs[i].height;
    +160                     }
    +161                 }
    +162                 ssItemWidth= (ssItemWidth|0)+1;
    +163                 ssItemHeight= (ssItemHeight|0)+1;
    +164 
    +165                 // calculate every animation offset against biggest animation size.
    +166                 ssItemMaxOffsetY= -Number.MAX_VALUE;
    +167                 ssItemMaxOffsetX= -Number.MAX_VALUE;
    +168                 var offsetMinX=Number.MAX_VALUE, offsetMaxX=-Number.MAX_VALUE;
    +169                 for( i=0; i<AABBs.length; i++ ) {
    +170                     var offsetX= (ssItemWidth - AABBs[i].width)/2;
    +171                     var offsetY= (ssItemHeight - AABBs[i].height)/2;
    +172 
    +173                     if ( offsetY>ssItemMaxOffsetY ) {
    +174                         ssItemMaxOffsetY= offsetY;
    +175                     }
    +176 
    +177                     if ( offsetX>ssItemMaxOffsetX ) {
    +178                         ssItemMaxOffsetX= offsetX;
    +179                     }
    +180                 }
    +181 
    +182 
    +183                 // create a canvas of the neccessary size
    +184                 var canvas= document.createElement("canvas");
    +185                 canvas.width= ssItemWidth * numSprites;
    +186                 canvas.height= ssItemHeight;
    +187                 var ctx= canvas.getContext("2d");
    +188 
    +189                 // draw animation into canvas.
    +190                 for( j=0; j<numSprites; j++ ) {
    +191 
    +192                     //this.x= j*ssItemWidth + offsetMaxX - ssItemMaxOffsetX ;
    +193                     this.x= j*ssItemWidth - ssItemMinX;
    +194                     this.y= ssItemHeight - ssItemMaxOffsetY/2 - 1;
    +195 
    +196                     this.setModelViewMatrix();
    +197 
    +198                     var time= maxTime/numSprites*j;
    +199                     this.skeleton.calculate( time, this.animationDuration );
    +200 
    +201                     // prepare bones
    +202                     for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    +203                         this.bonesActor[i].setupAnimation(time);
    +204                         this.bonesActor[i].paint( ctx, time );
    +205                     }
    +206 
    +207                     ctx.restore();
    +208                 }
    +209 
    +210                 this.x= px;
    +211                 this.y= py;
    +212 
    +213                 return canvas;
    +214             },
    +215 
    +216             animate: function (director, time) {
    +217                 var i,l;
    +218 
    +219                 var ret= CAAT.Module.Skeleton.SkeletonActor.superclass.animate.call( this, director, time );
    +220 
    +221                 this.skeleton.calculate( time, this.animationDuration );
    +222 
    +223                 for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    +224                     this.bonesActor[i].setupAnimation(time);
    +225                 }
    +226 
    +227                 this.AABB.setEmpty();
    +228                 for( i= 0, l= this.bonesActor.length; i<l; i+=1 ) {
    +229                     this.AABB.unionRectangle(this.bonesActor[i].AABB);
    +230                 }
    +231 
    +232                 return ret;
    +233             },
    +234 
    +235             paint : function( director, time ) {
    +236                 CAAT.Module.Skeleton.SkeletonActor.superclass.paint.call(this,director,time);
    +237                 for( var i= 0, l=this.bonesActor.length; i<l; i+=1 ) {
    +238                     this.bonesActor[i].paint( director.ctx, time );
    +239                 }
    +240 
    +241 
    +242                 if (this._showBones && this.skeleton) {
    +243                     this.worldModelViewMatrix.transformRenderingContextSet(director.ctx);
    +244                     this.skeleton.paint(this.worldModelViewMatrix, director.ctx);
    +245                 }
    +246             },
    +247 
    +248             __addBoneActor : function( boneActor ) {
    +249                 this.bonesActor.push( boneActor );
    +250                 boneActor.parent= this;
    +251                 return this;
    +252             },
    +253 
    +254             setSkin: function (skin) {
    +255 
    +256                 this.bonesActor= [];
    +257                 this.slotInfoArray = [];
    +258                 this.slotInfo = {};
    +259 
    +260                 var skeletonData = this.skeleton.getSkeletonDataFromFile();
    +261 
    +262                 // slots info
    +263                 for (var slot = 0; slot < skeletonData.slots.length; slot++) {
    +264                     var slotInfo = skeletonData.slots[slot];
    +265                     var bone = this.skeleton.getBoneById(slotInfo.bone);
    +266                     if (bone) {
    +267                         var slotInfoData = new SlotInfoData(
    +268                                 slot,
    +269                                 slotInfo.attachment,
    +270                                 slotInfo.name,
    +271                                 slotInfo.bone );
    +272 
    +273                         this.slotInfo[ bone.id ] = slotInfoData;
    +274                         this.slotInfoArray.push(slotInfoData);
    +275 
    +276 
    +277                         var skinData = null;
    +278                         if (skin) {
    +279                             skinData = skeletonData.skins[skin][slotInfo.name];
    +280                         }
    +281                         if (!skinData) {
    +282                             skinData = skeletonData.skins["default"][slotInfo.name];
    +283                         }
    +284                         if (skinData) {
    +285 
    +286                             //create an actor for each slot data found.
    +287                             var boneActorSkin = new CAAT.Module.Skeleton.BoneActor();
    +288                             boneActorSkin.id = slotInfo.name;
    +289                             boneActorSkin.setBone(bone);
    +290 
    +291                             this.__addBoneActor(boneActorSkin);
    +292                             this.skinByName[slotInfo.name] = boneActorSkin;
    +293 
    +294                             // add skining info for each slot data.
    +295                             for (var skinDef in skinData) {
    +296                                 var skinInfo = skinData[skinDef];
    +297                                 var angle= -(skinInfo.rotation || 0) * 2 * Math.PI / 360;
    +298                                 var x= skinInfo.x|0;
    +299                                 var y= -skinInfo.y|0;
    +300                                 var w= skinInfo.width|0;
    +301                                 var h= skinInfo.height|0;
    +302                                 var scaleX= skinInfo.scaleX|1;
    +303                                 var scaleY= skinInfo.scaleY|1;
    +304 
    +305                                 var matrix= CAAT.Math.Matrix.translate( -skinInfo.width/2, -skinInfo.height/2 );
    +306                                 matrix.premultiply( CAAT.Math.Matrix.rotate( angle ) );
    +307                                 matrix.premultiply( CAAT.Math.Matrix.scale( scaleX, scaleY ) );
    +308                                 matrix.premultiply( CAAT.Math.Matrix.translate( x, y ) );
    +309 
    +310                                 /*
    +311                                 only needed values are:
    +312                                   + image
    +313                                   + matrix
    +314                                   + name
    +315 
    +316                                   all the rest are just to keep original values.
    +317                                  */
    +318                                 boneActorSkin.addSkinInfo({
    +319                                     angle: angle,
    +320                                     x: x,
    +321                                     y: y,
    +322                                     width: w,
    +323                                     height: h,
    +324                                     image: this.director.getImage(skinData[skinDef].name ? skinData[skinDef].name : skinDef),
    +325                                     matrix : matrix,
    +326                                     scaleX : scaleX,
    +327                                     scaleY : scaleY,
    +328                                     name: skinDef
    +329                                 });
    +330                             }
    +331 
    +332                             boneActorSkin.setDefaultSkinInfoByName(slotInfo.attachment);
    +333                         }
    +334                     } else {
    +335                         console.log("Unknown bone to apply skin: " + slotInfo.bone);
    +336                     }
    +337                 }
    +338 
    +339                 return this;
    +340             },
    +341 
    +342             setAnimation: function (name, animationDuration ) {
    +343 
    +344                 this.animationDuration= animationDuration||0;
    +345 
    +346                 var animationInfo = this.skeleton.getAnimationDataByName(name);
    +347                 if (!animationInfo) {
    +348                     return;
    +349                 }
    +350 
    +351                 var animationSlots = animationInfo.slots;
    +352                 for (var animationSlot in animationSlots) {
    +353                     var attachments = animationSlots[animationSlot].attachment;
    +354                     var boneActor = this.skinByName[ animationSlot ];
    +355                     if (boneActor) {
    +356                         boneActor.emptySkinDataKeyframe();
    +357                         for (var i = 0, l = attachments.length - 1; i < l; i += 1) {
    +358                             var start = attachments[i].time;
    +359                             var len = attachments[i + 1].time - attachments[i].time;
    +360                             boneActor.addSkinDataKeyframe(attachments[i].name, start, len);
    +361                         }
    +362                     } else {
    +363                         console.log("Adding skinDataKeyframe to unkown boneActor: " + animationSlot);
    +364                     }
    +365                 }
    +366 
    +367                 return this;
    +368             },
    +369 
    +370             getBoneActorById : function( id ) {
    +371                 return this.skinByName[id];
    +372             },
    +373 
    +374             addAttachment : function( slotId, normalized_x, normalized_y, callback ) {
    +375                 var slotBoneActor= this.getBoneActorById(slotId);
    +376                 if ( slotBoneActor ) {
    +377                     slotBoneActor.addAttachment(slotId,normalized_x,normalized_y,callback);
    +378                 }
    +379             }
    +380         }
    +381     }
    +382 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Storage_LocalStorage.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Storage_LocalStorage.js.html new file mode 100644 index 00000000..26c2f31f --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_Storage_LocalStorage.js.html @@ -0,0 +1,87 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  **/
    +  5 CAAT.Module({
    +  6 
    +  7     /**
    +  8      * @name Storage
    +  9      * @memberOf CAAT.Module
    + 10      * @namespace
    + 11      */
    + 12 
    + 13     /**
    + 14      * @name LocalStorage
    + 15      * @memberOf CAAT.Module.Storage
    + 16      * @namespace
    + 17      */
    + 18 
    + 19     defines : "CAAT.Module.Storage.LocalStorage",
    + 20     constants : {
    + 21 
    + 22         /**
    + 23          * @lends CAAT.Module.Storage.LocalStorage
    + 24          */
    + 25 
    + 26         /**
    + 27          * Stores an object in local storage. The data will be saved as JSON.stringify.
    + 28          * @param key {string} key to store data under.
    + 29          * @param data {object} an object.
    + 30          * @return this
    + 31          *
    + 32          * @static
    + 33          */
    + 34         save : function( key, data ) {
    + 35             try {
    + 36                 localStorage.setItem( key, JSON.stringify(data) );
    + 37             } catch(e) {
    + 38                 // eat it
    + 39             }
    + 40             return this;
    + 41         },
    + 42         /**
    + 43          * Retrieve a value from local storage.
    + 44          * @param key {string} the key to retrieve.
    + 45          * @return {object} object stored under the key parameter.
    + 46          *
    + 47          * @static
    + 48          */
    + 49         load : function( key, defValue ) {
    + 50             try {
    + 51                 var v= localStorage.getItem( key );
    + 52 
    + 53                 return null===v ? defValue : JSON.parse(v);
    + 54             } catch(e) {
    + 55                 return null;
    + 56             }
    + 57         },
    + 58 
    + 59         /**
    + 60          * Removes a value stored in local storage.
    + 61          * @param key {string}
    + 62          * @return this
    + 63          *
    + 64          * @static
    + 65          */
    + 66         remove : function( key ) {
    + 67             try {
    + 68                 localStorage.removeItem(key);
    + 69             } catch(e) {
    + 70                 // eat it
    + 71             }
    + 72             return this;
    + 73         }
    + 74     },
    + 75     extendsWith : {
    + 76 
    + 77     }
    + 78 
    + 79 });
    + 80 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureElement.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureElement.js.html new file mode 100644 index 00000000..3b34d0b2 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureElement.js.html @@ -0,0 +1,56 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name TexturePacker
    +  5      * @memberOf CAAT.Module
    +  6      * @namespace
    +  7      */
    +  8 
    +  9     /**
    + 10      * @name TextureElement
    + 11      * @memberOf CAAT.Module.TexturePacker
    + 12      * @constructor
    + 13      */
    + 14 
    + 15 
    + 16     defines : "CAAT.Module.TexturePacker.TextureElement",
    + 17     extendsWith : {
    + 18 
    + 19         /**
    + 20          * @lends CAAT.Module.TexturePacker.TextureElement.prototype
    + 21          */
    + 22 
    + 23         /**
    + 24          *
    + 25          */
    + 26         inverted:   false,
    + 27 
    + 28         /**
    + 29          *
    + 30          */
    + 31         image:      null,
    + 32 
    + 33         /**
    + 34          *
    + 35          */
    + 36         u:          0,
    + 37 
    + 38         /**
    + 39          *
    + 40          */
    + 41         v:          0,
    + 42 
    + 43         /**
    + 44          *
    + 45          */
    + 46         glTexture:  null
    + 47     }
    + 48 });
    + 49 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePage.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePage.js.html new file mode 100644 index 00000000..6b9f482b --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePage.js.html @@ -0,0 +1,303 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name TexturePage
    +  5      * @memberOf CAAT.Module.TexturePacker
    +  6      * @constructor
    +  7      */
    +  8 
    +  9 
    + 10     defines : "CAAT.Module.TexturePacker.TexturePage",
    + 11     depends : [
    + 12         "CAAT.Module.TexturePacker.TextureScanMap"
    + 13     ],
    + 14     extendsWith : {
    + 15 
    + 16         /**
    + 17          * @lends CAAT.Module.TexturePacker.TexturePage.prototype
    + 18          */
    + 19 
    + 20         __init : function(w,h) {
    + 21             this.width=         w || 1024;
    + 22             this.height=        h || 1024;
    + 23             this.images=        [];
    + 24 
    + 25             return this;
    + 26         },
    + 27 
    + 28         /**
    + 29          *
    + 30          */
    + 31         width:                  1024,
    + 32 
    + 33         /**
    + 34          *
    + 35          */
    + 36         height:                 1024,
    + 37 
    + 38         /**
    + 39          *
    + 40          */
    + 41         gl:                     null,
    + 42 
    + 43         /**
    + 44          *
    + 45          */
    + 46         texture:                null,
    + 47 
    + 48         /**
    + 49          *
    + 50          */
    + 51         allowImagesInvertion:   false,
    + 52 
    + 53         /**
    + 54          *
    + 55          */
    + 56         padding:                4,
    + 57 
    + 58         /**
    + 59          *
    + 60          */
    + 61         scan:                   null,
    + 62 
    + 63         /**
    + 64          *
    + 65          */
    + 66         images:                 null,
    + 67 
    + 68         /**
    + 69          *
    + 70          */
    + 71         criteria:               'area',
    + 72 
    + 73         initialize : function(gl) {
    + 74             this.gl= gl;
    + 75 
    + 76             // Fix firefox.
    + 77             gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
    + 78 
    + 79             this.texture = gl.createTexture();
    + 80 
    + 81             gl.bindTexture(gl.TEXTURE_2D, this.texture);
    + 82             gl.enable( gl.BLEND );
    + 83             gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
    + 84 
    + 85             var uarr= new Uint8Array(this.width*this.height*4);
    + 86             for (var jj = 0; jj < 4*this.width*this.height; ) {
    + 87                 uarr[jj++]=0;
    + 88                 uarr[jj++]=0;
    + 89                 uarr[jj++]=0;
    + 90                 uarr[jj++]=0;
    + 91             }
    + 92             gl.texImage2D(
    + 93                     gl.TEXTURE_2D,
    + 94                     0,
    + 95                     gl.RGBA,
    + 96                     this.width,
    + 97                     this.height,
    + 98                     0,
    + 99                     gl.RGBA,
    +100                     gl.UNSIGNED_BYTE,
    +101                     uarr);
    +102 
    +103             gl.enable( gl.BLEND );
    +104 
    +105             for( var i=0; i<this.images.length; i++ ) {
    +106 
    +107                 var img= this.images[i];
    +108                 if ( img.inverted ) {
    +109                     img= CAAT.Module.Image.ImageUtil.rotate( img, -90 );
    +110                 }
    +111 
    +112                 gl.texSubImage2D(
    +113                         gl.TEXTURE_2D,
    +114                         0,
    +115                         this.images[i].__tx, this.images[i].__ty,
    +116                         gl.RGBA,
    +117                         gl.UNSIGNED_BYTE,
    +118                         img );
    +119             }
    +120 
    +121         },
    +122         create: function(imagesCache) {
    +123 
    +124             var images= [];
    +125             for( var i=0; i<imagesCache.length; i++ ) {
    +126                 var img= imagesCache[i].image;
    +127                 if ( !img.__texturePage ) {
    +128                     images.push( img );
    +129                 }
    +130             }
    +131 
    +132             this.createFromImages(images);
    +133         },
    +134         clear : function() {
    +135             this.createFromImages([]);
    +136         },
    +137         update : function(invert,padding,width,height) {
    +138             this.allowImagesInvertion= invert;
    +139             this.padding= padding;
    +140 
    +141             if ( width<100 ) {
    +142                 width= 100;
    +143             }
    +144             if ( height<100 ) {
    +145                 height= 100;
    +146             }
    +147 
    +148             this.width=  width;
    +149             this.height= height;
    +150             
    +151             this.createFromImages(this.images);
    +152         },
    +153         createFromImages : function( images ) {
    +154 
    +155             var i;
    +156 
    +157             this.scan=   new CAAT.Module.TexturePacker.TextureScanMap( this.width, this.height );
    +158             this.images= [];
    +159 
    +160             if ( this.allowImagesInvertion ) {
    +161                 for( i=0; i<images.length; i++ ) {
    +162                     images[i].inverted= this.allowImagesInvertion && images[i].height<images[i].width;
    +163                 }
    +164             }
    +165 
    +166             var me= this;
    +167 
    +168             images.sort( function(a,b) {
    +169 
    +170                 var aarea= a.width*a.height;
    +171                 var barea= b.width*b.height;
    +172 
    +173                 if ( me.criteria==='width' ) {
    +174                     return a.width<b.width ? 1 : a.width>b.width ? -1 : 0;
    +175                 } else if ( me.criteria==='height' ) {
    +176                     return a.height<b.height ? 1 : a.height>b.height ? -1 : 0;
    +177                 }
    +178                 return aarea<barea ? 1 : aarea>barea ? -1 : 0;
    +179             });
    +180 
    +181             for( i=0; i<images.length; i++ ) {
    +182                 var img=  images[i];
    +183                 this.packImage(img);
    +184             }
    +185         },
    +186         addImage : function( image, invert, padding ) {
    +187             this.allowImagesInvertion= invert;
    +188             this.padding= padding;
    +189             this.images.push(image);
    +190             this.createFromImages(Array.prototype.slice.call(this.images));
    +191         },
    +192         endCreation : function() {
    +193             var gl= this.gl;
    +194             gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +195             gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
    +196             gl.generateMipmap(gl.TEXTURE_2D);
    +197         },
    +198         deletePage : function() {
    +199             for( var i=0; i<this.images.length; i++ ) {
    +200                 delete this.images[i].__texturePage;
    +201                 delete this.images[i].__u;
    +202                 delete this.images[i].__v;
    +203             }
    +204 
    +205             this.gl.deleteTexture( this.texture );
    +206         },
    +207         toCanvas : function(canvass, outline) {
    +208 
    +209             canvass= canvass || document.createElement('canvas');
    +210             canvass.width= this.width;
    +211             canvass.height= this.height;
    +212             var ctxx= canvass.getContext('2d');
    +213             ctxx.fillStyle= 'rgba(0,0,0,0)';
    +214             ctxx.fillRect(0,0,this.width,this.height);
    +215 
    +216             for( var i=0; i<this.images.length; i++ ) {
    +217                 ctxx.drawImage(
    +218                         !this.images[i].inverted ?
    +219                                 this.images[i] :
    +220                                 CAAT.Modules.Image.ImageUtil.rotate( this.images[i], 90 ),
    +221                         this.images[i].__tx,
    +222                         this.images[i].__ty );
    +223                 if ( outline ) {
    +224                     ctxx.strokeStyle= 'red';
    +225                     ctxx.strokeRect(
    +226                             this.images[i].__tx,
    +227                             this.images[i].__ty,
    +228                             this.images[i].__w,
    +229                             this.images[i].__h );
    +230                 }
    +231             }
    +232 
    +233 
    +234             if (outline) {
    +235                 ctxx.strokeStyle= 'red';
    +236                 ctxx.strokeRect(0,0,this.width,this.height);
    +237             }
    +238 
    +239             return canvass;
    +240         },
    +241         packImage : function(img) {
    +242             var newWidth, newHeight;
    +243             if ( img.inverted ) {
    +244                 newWidth= img.height;
    +245                 newHeight= img.width;
    +246             } else {
    +247                 newWidth= img.width;
    +248                 newHeight= img.height;
    +249             }
    +250 
    +251             var w= newWidth;
    +252             var h= newHeight;
    +253 
    +254             var mod;
    +255 
    +256             // dejamos un poco de espacio para que las texturas no se pisen.
    +257             // coordenadas normalizadas 0..1 dan problemas cuando las texturas no estan
    +258             // alineadas a posicion mod 4,8...
    +259             if ( w && this.padding ) {
    +260                 mod= this.padding;
    +261                 if ( w+mod<=this.width ) {
    +262                     w+=mod;
    +263                 }
    +264             }
    +265             if ( h && this.padding ) {
    +266                 mod= this.padding;
    +267                 if ( h+mod<=this.height ) {
    +268                     h+=mod;
    +269                 }
    +270             }
    +271             
    +272             var where=  this.scan.whereFitsChunk( w, h );
    +273             if ( null!==where ) {
    +274                 this.images.push( img );
    +275 
    +276                 img.__tx= where.x;
    +277                 img.__ty= where.y;
    +278                 img.__u=  where.x / this.width;
    +279                 img.__v=  where.y / this.height;
    +280                 img.__u1= (where.x+newWidth) / this.width;
    +281                 img.__v1= (where.y+newHeight) / this.height;
    +282                 img.__texturePage= this;
    +283                 img.__w= newWidth;
    +284                 img.__h= newHeight;
    +285 
    +286                 this.scan.substract(where.x,where.y,w,h);
    +287             } else {
    +288                 CAAT.log('Imagen ',img.src,' de tamano ',img.width,img.height,' no cabe.');
    +289             }
    +290         },
    +291         changeHeuristic : function(criteria) {
    +292             this.criteria= criteria;
    +293         }
    +294     }
    +295 });
    +296 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePageManager.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePageManager.js.html new file mode 100644 index 00000000..8c77c931 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TexturePageManager.js.html @@ -0,0 +1,72 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  */
    +  4 
    +  5 CAAT.Module({
    +  6 
    +  7     /**
    +  8      * @name TexturePageManager
    +  9      * @memberOf CAAT.Module.TexturePacker
    + 10      * @constructor
    + 11      */
    + 12 
    + 13     defines : "CAAT.Module.TexturePacker.TexturePageManager",
    + 14     depends : [
    + 15         "CAAT.Module.TexturePacker.TexturePage"
    + 16     ],
    + 17     extendsWith : {
    + 18 
    + 19         /**
    + 20          * @lends CAAT.Module.TexturePacker.TexturePageManager.prototype
    + 21          */
    + 22 
    + 23         __init : function() {
    + 24             this.pages= [];
    + 25             return this;
    + 26         },
    + 27 
    + 28         /**
    + 29          *
    + 30          */
    + 31         pages:  null,
    + 32 
    + 33         createPages:    function(gl,width,height,imagesCache) {
    + 34 
    + 35             var end= false;
    + 36             while( !end ) {
    + 37                 var page= new CAAT.Module.TexturePacker.TexturePage(width,height);
    + 38                 page.create(imagesCache);
    + 39                 page.initialize(gl);
    + 40                 page.endCreation();
    + 41                 this.pages.push(page);
    + 42 
    + 43                 end= true;
    + 44                 for( var i=0; i<imagesCache.length; i++ ) {
    + 45                     // imagen sin asociacion de textura
    + 46                     if ( !imagesCache[i].image.__texturePage ) {
    + 47                         // cabe en la pagina ?? continua con otras paginas.
    + 48                         if ( imagesCache[i].image.width<=width && imagesCache[i].image.height<=height ) {
    + 49                             end= false;
    + 50                         }
    + 51                         break;
    + 52                     }
    + 53                 }
    + 54             }
    + 55         },
    + 56         deletePages : function() {
    + 57             for( var i=0; i<this.pages.length; i++ ) {
    + 58                 this.pages[i].deletePage();
    + 59             }
    + 60             this.pages= null;
    + 61         }
    + 62     }
    + 63 
    + 64 });
    + 65 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScan.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScan.js.html new file mode 100644 index 00000000..63271906 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScan.js.html @@ -0,0 +1,116 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name TextureScan
    +  5      * @memberOf CAAT.Module.TexturePacker
    +  6      * @constructor
    +  7      */
    +  8 
    +  9     defines : "CAAT.Module.TexturePacker.TextureScan",
    + 10     depends : [
    + 11         "CAAT.Module.TexturePacker.TextureElement"
    + 12     ],
    + 13     extendsWith : {
    + 14 
    + 15         /**
    + 16          * @lends CAAT.Module.TexturePacker.TextureScan.prototype
    + 17          */
    + 18 
    + 19         __init : function(w) {
    + 20             this.freeChunks=[ {position:0, size:w||1024} ];
    + 21             return this;
    + 22         },
    + 23 
    + 24         /**
    + 25          *
    + 26          */
    + 27         freeChunks: null,
    + 28 
    + 29         /**
    + 30          * return an array of values where a chunk of width size fits in this scan.
    + 31          * @param width
    + 32          */
    + 33         findWhereFits : function( width ) {
    + 34             if ( this.freeChunks.length===0 ) {
    + 35                 return [];
    + 36             }
    + 37 
    + 38             var fitsOnPosition= [];
    + 39             var i;
    + 40 
    + 41             for( i=0; i<this.freeChunks.length; i++ ) {
    + 42                 var pos= 0;
    + 43                 while( pos+width<= this.freeChunks[i].size ) {
    + 44                     fitsOnPosition.push( pos+this.freeChunks[i].position );
    + 45                     pos+= width;
    + 46                 }
    + 47             }
    + 48 
    + 49             return fitsOnPosition;
    + 50         },
    + 51         fits : function( position, size ) {
    + 52             var i=0;
    + 53 
    + 54             for( i=0; i<this.freeChunks.length; i++ ) {
    + 55                 var fc= this.freeChunks[i];
    + 56                 if ( fc.position<=position && position+size<=fc.position+fc.size ) {
    + 57                     return true;
    + 58                 }
    + 59             }
    + 60 
    + 61             return false;
    + 62         },
    + 63         substract : function( position, size ) {
    + 64             var i=0;
    + 65 
    + 66             for( i=0; i<this.freeChunks.length; i++ ) {
    + 67                 var fc= this.freeChunks[i];
    + 68                 if ( fc.position<=position && position+size<=fc.position+fc.size ) {
    + 69                     var lp=0;
    + 70                     var ls=0;
    + 71                     var rp=0;
    + 72                     var rs=0;
    + 73 
    + 74                     lp= fc.position;
    + 75                     ls= position-fc.position;
    + 76 
    + 77                     rp= position+size;
    + 78                     rs= fc.position+fc.size - rp;
    + 79 
    + 80                     this.freeChunks.splice(i,1);
    + 81 
    + 82                     if ( ls>0 ) {
    + 83                         this.freeChunks.splice( i++,0,{position: lp, size:ls} );
    + 84                     }
    + 85                     if ( rs>0 ) {
    + 86                         this.freeChunks.splice( i,0,{position: rp, size:rs} );
    + 87                     }
    + 88 
    + 89                     return true;
    + 90                 }
    + 91             }
    + 92 
    + 93             return false;
    + 94         },
    + 95         log : function(index) {
    + 96             if ( 0===this.freeChunks.length ) {
    + 97                 CAAT.log('index '+index+' empty');
    + 98             } else {
    + 99                 var str='index '+index;
    +100                 for( var i=0; i<this.freeChunks.length; i++ ) {
    +101                     var fc= this.freeChunks[i];
    +102                     str+='['+fc.position+","+fc.size+"]";
    +103                 }
    +104                 CAAT.log(str);
    +105             }
    +106         }
    +107     }
    +108 });
    +109 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScanMap.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScanMap.js.html new file mode 100644 index 00000000..fb1936e1 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_Modules_TexturePacker_TextureScanMap.js.html @@ -0,0 +1,137 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name TextureScanMap
    +  5      * @memberOf CAAT.Module.TexturePacker
    +  6      * @constructor
    +  7      */
    +  8 
    +  9     defines : "CAAT.Module.TexturePacker.TextureScanMap",
    + 10     depends : [
    + 11         "CAAT.Module.TexturePacker.TextureScan"
    + 12     ],
    + 13     extendsWith : {
    + 14 
    + 15         /**
    + 16          * @lends CAAT.Module.TexturePacker.TextureScanMap.prototype
    + 17          */
    + 18 
    + 19         __init : function(w,h) {
    + 20             this.scanMapHeight= h;
    + 21             this.scanMapWidth= w;
    + 22 
    + 23             this.scanMap= [];
    + 24             for( var i=0; i<this.scanMapHeight; i++ ) {
    + 25                 this.scanMap.push( new CAAT.Module.TexturePacker.TextureScan(this.scanMapWidth) );
    + 26             }
    + 27 
    + 28             return this;
    + 29         },
    + 30 
    + 31         /**
    + 32          *
    + 33          */
    + 34         scanMap:        null,
    + 35 
    + 36         /**
    + 37          *
    + 38          */
    + 39         scanMapWidth:   0,
    + 40 
    + 41         /**
    + 42          *
    + 43          */
    + 44         scanMapHeight:  0,
    + 45 
    + 46         /**
    + 47          * Always try to fit a chunk of size width*height pixels from left-top.
    + 48          * @param width
    + 49          * @param height
    + 50          */
    + 51         whereFitsChunk : function( width, height ) {
    + 52 
    + 53             // trivial rejection:
    + 54             if ( width>this.width||height>this.height) {
    + 55                 return null;
    + 56             }
    + 57 
    + 58             // find first fitting point
    + 59             var i,j,initialPosition= 0;
    + 60 
    + 61             while( initialPosition<=this.scanMapHeight-height) {
    + 62 
    + 63                 // para buscar sitio se buscara un sitio hasta el tamano de alto del trozo.
    + 64                 // mas abajo no va a caber.
    + 65 
    + 66                 // fitHorizontalPosition es un array con todas las posiciones de este scan donde
    + 67                 // cabe un chunk de tamano width.
    + 68                 var fitHorizontalPositions= null;
    + 69                 var foundPositionOnScan=    false;
    + 70 
    + 71                 for( ; initialPosition<=this.scanMapHeight-height; initialPosition++ ) {
    + 72                     fitHorizontalPositions= this.scanMap[ initialPosition ].findWhereFits( width );
    + 73 
    + 74                     // si no es nulo el array de resultados, quiere decir que en alguno de los puntos
    + 75                     // nos cabe un trozo de tamano width.
    + 76                     if ( null!==fitHorizontalPositions && fitHorizontalPositions.length>0 ) {
    + 77                         foundPositionOnScan= true;
    + 78                         break;
    + 79                     }
    + 80                 }
    + 81 
    + 82                 if ( foundPositionOnScan ) {
    + 83                     // j es el scan donde cabe un trozo de tamano width.
    + 84                     // comprobamos desde este scan que en todos los scan verticales cabe el trozo.
    + 85                     // se comprueba que cabe en alguno de los tamanos que la rutina de busqueda horizontal
    + 86                     // nos ha devuelto antes.
    + 87 
    + 88                     var minInitialPosition=Number.MAX_VALUE;
    + 89                     for( j=0; j<fitHorizontalPositions.length; j++ ) {
    + 90                         var fits= true;
    + 91                         for( i=initialPosition; i<initialPosition+height; i++ ) {
    + 92                             // hay un trozo que no cabe
    + 93                             if ( !this.scanMap[i].fits( fitHorizontalPositions[j], width ) ) {
    + 94                                 fits= false;
    + 95                                 break;
    + 96                             }
    + 97                         }
    + 98 
    + 99                         // se ha encontrado un trozo donde la imagen entra.
    +100                         // d.p.m. incluirla en posicion, y seguir con otra.
    +101                         if ( fits ) {
    +102                             return { x: fitHorizontalPositions[j], y: initialPosition };
    +103                         } 
    +104                     }
    +105 
    +106                     initialPosition++;
    +107                 } else {
    +108                     // no hay sitio en ningun scan.
    +109                     return null;
    +110                 }
    +111             }
    +112 
    +113             // no se ha podido encontrar un area en la textura para un trozo de tamano width*height
    +114             return null;
    +115         },
    +116         substract : function( x,y, width, height ) {
    +117             for( var i=0; i<height; i++ ) {
    +118                 if ( !this.scanMap[i+y].substract(x,width) ) {
    +119                     CAAT.log('Error: removing chunk ',width,height,' at ',x,y);
    +120                 }
    +121             }
    +122         },
    +123         log : function() {
    +124             for( var i=0; i<this.scanMapHeight; i++ ) {
    +125                 this.scanMap[i].log(i);
    +126             }
    +127         }
    +128     }
    +129 });
    +130 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_ArcPath.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_ArcPath.js.html new file mode 100644 index 00000000..09594dbd --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_ArcPath.js.html @@ -0,0 +1,323 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name ArcPath
    +  5      * @memberOf CAAT.PathUtil
    +  6      * @extends CAAT.PathUtil.PathSegment
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines:"CAAT.PathUtil.ArcPath",
    + 11     depends:[
    + 12         "CAAT.PathUtil.PathSegment",
    + 13         "CAAT.Math.Point",
    + 14         "CAAT.Math.Rectangle"
    + 15     ],
    + 16     aliases:["CAAT.ArcPath"],
    + 17     extendsClass:"CAAT.PathUtil.PathSegment",
    + 18     extendsWith:function () {
    + 19 
    + 20         return {
    + 21 
    + 22             /**
    + 23              * @lends CAAT.PathUtil.ArcPath.prototype
    + 24              */
    + 25 
    + 26             __init:function () {
    + 27                 this.__super();
    + 28 
    + 29                 this.points = [];
    + 30                 this.points.push(new CAAT.Math.Point());
    + 31                 this.points.push(new CAAT.Math.Point());
    + 32 
    + 33                 this.newPosition = new CAAT.Math.Point();
    + 34 
    + 35                 return this;
    + 36             },
    + 37 
    + 38             /**
    + 39              * A collection of CAAT.Math.Point objects which defines the arc (center, start, end)
    + 40              */
    + 41             points:null,
    + 42 
    + 43             /**
    + 44              * Defined clockwise or counterclockwise ?
    + 45              */
    + 46             cw:true,
    + 47 
    + 48             /**
    + 49              * spare point for calculations
    + 50              */
    + 51             newPosition:null,
    + 52 
    + 53             /**
    + 54              * Arc radius.
    + 55              */
    + 56             radius:0,
    + 57 
    + 58             /**
    + 59              * Arc start angle.
    + 60              */
    + 61             startAngle:0,
    + 62 
    + 63             /**
    + 64              * Arc end angle.
    + 65              */
    + 66             angle:2 * Math.PI,
    + 67 
    + 68             /**
    + 69              * is a relative or absolute arc ?
    + 70              */
    + 71             arcTo:false,
    + 72 
    + 73             setRadius:function (r) {
    + 74                 this.radius = r;
    + 75                 return this;
    + 76             },
    + 77 
    + 78             isArcTo:function () {
    + 79                 return this.arcTo;
    + 80             },
    + 81 
    + 82             setArcTo:function (b) {
    + 83                 this.arcTo = b;
    + 84                 return this;
    + 85             },
    + 86 
    + 87             initialize:function (x, y, r, angle) {
    + 88                 this.setInitialPosition(x, y);
    + 89                 this.setFinalPosition(x + r, y);
    + 90                 this.angle = angle || 2 * Math.PI;
    + 91                 return this;
    + 92             },
    + 93 
    + 94             applyAsPath:function (director) {
    + 95                 var ctx = director.ctx;
    + 96                 if (!this.arcTo) {
    + 97                     ctx.arc(this.points[0].x, this.points[0].y, this.radius, this.startAngle, this.angle + this.startAngle, this.cw);
    + 98                 } else {
    + 99                     ctx.arcTo(this.points[0].x, this.points[0].y, this.points[1].x, this.points[1].y, this.radius);
    +100                 }
    +101                 return this;
    +102             },
    +103             setPoint:function (point, index) {
    +104                 if (index >= 0 && index < this.points.length) {
    +105                     this.points[index] = point;
    +106                 }
    +107             },
    +108             /**
    +109              * An array of {CAAT.Point} composed of two points.
    +110              * @param points {Array<CAAT.Point>}
    +111              */
    +112             setPoints:function (points) {
    +113                 this.points = [];
    +114                 this.points[0] = points[0];
    +115                 this.points[1] = points[1];
    +116                 this.updatePath();
    +117 
    +118                 return this;
    +119             },
    +120             setClockWise:function (cw) {
    +121                 this.cw = cw !== undefined ? cw : true;
    +122                 return this;
    +123             },
    +124             isClockWise:function () {
    +125                 return this.cw;
    +126             },
    +127             /**
    +128              * Set this path segment's starting position.
    +129              * This method should not be called again after setFinalPosition has been called.
    +130              * @param x {number}
    +131              * @param y {number}
    +132              */
    +133             setInitialPosition:function (x, y) {
    +134                 for (var i = 0, l = this.points.length; i < l; i++) {
    +135                     this.points[0].x = x;
    +136                     this.points[0].y = y;
    +137                 }
    +138 
    +139                 return this;
    +140             },
    +141             /**
    +142              * Set a rectangle from points[0] to (finalX, finalY)
    +143              * @param finalX {number}
    +144              * @param finalY {number}
    +145              */
    +146             setFinalPosition:function (finalX, finalY) {
    +147                 this.points[1].x = finalX;
    +148                 this.points[1].y = finalY;
    +149 
    +150                 this.updatePath(this.points[1]);
    +151                 return this;
    +152             },
    +153             /**
    +154              * An arc starts and ends in the same point.
    +155              */
    +156             endCurvePosition:function () {
    +157                 return this.points[0];
    +158             },
    +159             /**
    +160              * @inheritsDoc
    +161              */
    +162             startCurvePosition:function () {
    +163                 return this.points[0];
    +164             },
    +165             /**
    +166              * @inheritsDoc
    +167              */
    +168             getPosition:function (time) {
    +169 
    +170                 if (time > 1 || time < 0) {
    +171                     time %= 1;
    +172                 }
    +173                 if (time < 0) {
    +174                     time = 1 + time;
    +175                 }
    +176 
    +177                 if (-1 === this.length) {
    +178                     this.newPosition.set(this.points[0].x, this.points[0].y);
    +179                 } else {
    +180 
    +181                     var angle = this.angle * time * (this.cw ? 1 : -1) + this.startAngle;
    +182 
    +183                     this.newPosition.set(
    +184                         this.points[0].x + this.radius * Math.cos(angle),
    +185                         this.points[0].y + this.radius * Math.sin(angle)
    +186                     );
    +187                 }
    +188 
    +189                 return this.newPosition;
    +190             },
    +191             /**
    +192              * Returns initial path segment point's x coordinate.
    +193              * @return {number}
    +194              */
    +195             initialPositionX:function () {
    +196                 return this.points[0].x;
    +197             },
    +198             /**
    +199              * Returns final path segment point's x coordinate.
    +200              * @return {number}
    +201              */
    +202             finalPositionX:function () {
    +203                 return this.points[1].x;
    +204             },
    +205             /**
    +206              * Draws this path segment on screen. Optionally it can draw handles for every control point, in
    +207              * this case, start and ending path segment points.
    +208              * @param director {CAAT.Director}
    +209              * @param bDrawHandles {boolean}
    +210              */
    +211             paint:function (director, bDrawHandles) {
    +212 
    +213                 var ctx = director.ctx;
    +214 
    +215                 ctx.save();
    +216 
    +217                 ctx.strokeStyle = this.color;
    +218                 ctx.beginPath();
    +219                 if (!this.arcTo) {
    +220                     ctx.arc(this.points[0].x, this.points[0].y, this.radius, this.startAngle, this.startAngle + this.angle, this.cw);
    +221                 } else {
    +222                     ctx.arcTo(this.points[0].x, this.points[0].y, this.points[1].x, this.points[1].y, this.radius);
    +223                 }
    +224                 ctx.stroke();
    +225 
    +226                 if (bDrawHandles) {
    +227                     ctx.globalAlpha = 0.5;
    +228                     ctx.fillStyle = '#7f7f00';
    +229 
    +230                     for (var i = 0; i < this.points.length; i++) {
    +231                         this.drawHandle(ctx, this.points[i].x, this.points[i].y);
    +232                     }
    +233                 }
    +234 
    +235                 ctx.restore();
    +236             },
    +237             /**
    +238              * Get the number of control points. For this type of path segment, start and
    +239              * ending path segment points. Defaults to 2.
    +240              * @return {number}
    +241              */
    +242             numControlPoints:function () {
    +243                 return this.points.length;
    +244             },
    +245             /**
    +246              * @inheritsDoc
    +247              */
    +248             getControlPoint:function (index) {
    +249                 return this.points[index];
    +250             },
    +251             /**
    +252              * @inheritsDoc
    +253              */
    +254             getContour:function (iSize) {
    +255                 var contour = [];
    +256 
    +257                 for (var i = 0; i < iSize; i++) {
    +258                     contour.push(
    +259                         {
    +260                             x:this.points[0].x + this.radius * Math.cos(i * Math.PI / (iSize / 2)),
    +261                             y:this.points[0].y + this.radius * Math.sin(i * Math.PI / (iSize / 2))
    +262                         }
    +263                     );
    +264                 }
    +265 
    +266                 return contour;
    +267             },
    +268 
    +269             getPositionFromLength:function (iLength) {
    +270                 var ratio = iLength / this.length * (this.cw ? 1 : -1);
    +271                 return this.getPosition(ratio);
    +272                 /*
    +273                  this.newPosition.set(
    +274                  this.points[0].x + this.radius * Math.cos( 2*Math.PI * ratio ),
    +275                  this.points[0].y + this.radius * Math.sin( 2*Math.PI * ratio )
    +276                  );
    +277                  return this.newPosition;*/
    +278             },
    +279 
    +280             updatePath:function (point) {
    +281 
    +282                 // just move the circle, not modify radius.
    +283                 if (this.points[1] === point) {
    +284 
    +285                     if (!this.arcTo) {
    +286                         this.radius = Math.sqrt(
    +287                             ( this.points[0].x - this.points[1].x ) * ( this.points[0].x - this.points[1].x ) +
    +288                                 ( this.points[0].y - this.points[1].y ) * ( this.points[0].y - this.points[1].y )
    +289                         );
    +290                     }
    +291 
    +292                     this.length = this.angle * this.radius;
    +293                     this.startAngle = Math.atan2((this.points[1].y - this.points[0].y), (this.points[1].x - this.points[0].x));
    +294 
    +295                 } else if (this.points[0] === point) {
    +296                     this.points[1].set(
    +297                         this.points[0].x + this.radius * Math.cos(this.startAngle),
    +298                         this.points[0].y + this.radius * Math.sin(this.startAngle)
    +299                     );
    +300                 }
    +301 
    +302                 this.bbox.setEmpty();
    +303                 this.bbox.x = this.points[0].x - this.radius;
    +304                 this.bbox.y = this.points[0].y - this.radius;
    +305                 this.bbox.x1 = this.points[0].x + this.radius;
    +306                 this.bbox.y1 = this.points[0].y + this.radius;
    +307                 this.bbox.width = 2 * this.radius;
    +308                 this.bbox.height = 2 * this.radius;
    +309 
    +310                 return this;
    +311             }
    +312         }
    +313     }
    +314 
    +315 });
    +316 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_CurvePath.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_CurvePath.js.html new file mode 100644 index 00000000..8a20e013 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_CurvePath.js.html @@ -0,0 +1,213 @@ +
      1 /**
    +  2  * CAAT.CurvePath
    +  3  */
    +  4 CAAT.Module({
    +  5 
    +  6     /**
    +  7      * @name CurvePath
    +  8      * @memberOf CAAT.PathUtil
    +  9      * @extends CAAT.PathUtil.PathSegment
    + 10      * @constructor
    + 11      */
    + 12 
    + 13     defines:"CAAT.PathUtil.CurvePath",
    + 14     depends:[
    + 15         "CAAT.PathUtil.PathSegment",
    + 16         "CAAT.Math.Point",
    + 17         "CAAT.Math.Bezier"
    + 18     ],
    + 19     aliases:["CAAT.CurvePath"],
    + 20     extendsClass:"CAAT.PathUtil.PathSegment",
    + 21     extendsWith:function () {
    + 22         return {
    + 23 
    + 24             /**
    + 25              * @lends CAAT.PathUtil.CurvePath.prototype
    + 26              */
    + 27 
    + 28 
    + 29             __init:function () {
    + 30                 this.__super();
    + 31                 this.newPosition = new CAAT.Math.Point(0, 0, 0);
    + 32                 return this;
    + 33             },
    + 34 
    + 35             /**
    + 36              * A CAAT.Math.Curve instance.
    + 37              */
    + 38             curve:null,
    + 39 
    + 40             /**
    + 41              * spare holder for getPosition coordinate return.
    + 42              * @type {CAAT.Math.Point}
    + 43              */
    + 44             newPosition:null,
    + 45 
    + 46             applyAsPath:function (director) {
    + 47                 this.curve.applyAsPath(director);
    + 48                 return this;
    + 49             },
    + 50             setPoint:function (point, index) {
    + 51                 if (this.curve) {
    + 52                     this.curve.setPoint(point, index);
    + 53                 }
    + 54             },
    + 55             /**
    + 56              * Set this curve segment's points.
    + 57              * @param points {Array<CAAT.Point>}
    + 58              */
    + 59             setPoints:function (points) {
    + 60                 var curve = new CAAT.Math.Bezier();
    + 61                 curve.setPoints(points);
    + 62                 this.curve = curve;
    + 63                 return this;
    + 64             },
    + 65             /**
    + 66              * Set the pathSegment as a CAAT.Bezier quadric instance.
    + 67              * Parameters are quadric coordinates control points.
    + 68              *
    + 69              * @param p0x {number}
    + 70              * @param p0y {number}
    + 71              * @param p1x {number}
    + 72              * @param p1y {number}
    + 73              * @param p2x {number}
    + 74              * @param p2y {number}
    + 75              * @return this
    + 76              */
    + 77             setQuadric:function (p0x, p0y, p1x, p1y, p2x, p2y) {
    + 78                 var curve = new CAAT.Math.Bezier();
    + 79                 curve.setQuadric(p0x, p0y, p1x, p1y, p2x, p2y);
    + 80                 this.curve = curve;
    + 81                 this.updatePath();
    + 82 
    + 83                 return this;
    + 84             },
    + 85             /**
    + 86              * Set the pathSegment as a CAAT.Bezier cubic instance.
    + 87              * Parameters are cubic coordinates control points.
    + 88              * @param p0x {number}
    + 89              * @param p0y {number}
    + 90              * @param p1x {number}
    + 91              * @param p1y {number}
    + 92              * @param p2x {number}
    + 93              * @param p2y {number}
    + 94              * @param p3x {number}
    + 95              * @param p3y {number}
    + 96              * @return this
    + 97              */
    + 98             setCubic:function (p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {
    + 99                 var curve = new CAAT.Math.Bezier();
    +100                 curve.setCubic(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y);
    +101                 this.curve = curve;
    +102                 this.updatePath();
    +103 
    +104                 return this;
    +105             },
    +106             /**
    +107              * @inheritDoc
    +108              */
    +109             updatePath:function (point) {
    +110                 this.curve.update();
    +111                 this.length = this.curve.getLength();
    +112                 this.curve.getBoundingBox(this.bbox);
    +113                 return this;
    +114             },
    +115             /**
    +116              * @inheritDoc
    +117              */
    +118             getPosition:function (time) {
    +119 
    +120                 if (time > 1 || time < 0) {
    +121                     time %= 1;
    +122                 }
    +123                 if (time < 0) {
    +124                     time = 1 + time;
    +125                 }
    +126 
    +127                 this.curve.solve(this.newPosition, time);
    +128 
    +129                 return this.newPosition;
    +130             },
    +131             /**
    +132              * Gets the coordinate on the path relative to the path length.
    +133              * @param iLength {number} the length at which the coordinate will be taken from.
    +134              * @return {CAAT.Point} a CAAT.Point instance with the coordinate on the path corresponding to the
    +135              * iLenght parameter relative to segment's length.
    +136              */
    +137             getPositionFromLength:function (iLength) {
    +138                 this.curve.solve(this.newPosition, iLength / this.length);
    +139                 return this.newPosition;
    +140             },
    +141             /**
    +142              * Get path segment's first point's x coordinate.
    +143              * @return {number}
    +144              */
    +145             initialPositionX:function () {
    +146                 return this.curve.coordlist[0].x;
    +147             },
    +148             /**
    +149              * Get path segment's last point's y coordinate.
    +150              * @return {number}
    +151              */
    +152             finalPositionX:function () {
    +153                 return this.curve.coordlist[this.curve.coordlist.length - 1].x;
    +154             },
    +155             /**
    +156              * @inheritDoc
    +157              * @param director {CAAT.Director}
    +158              * @param bDrawHandles {boolean}
    +159              */
    +160             paint:function (director, bDrawHandles) {
    +161                 this.curve.drawHandles = bDrawHandles;
    +162                 director.ctx.strokeStyle = this.color;
    +163                 this.curve.paint(director, bDrawHandles);
    +164             },
    +165             /**
    +166              * @inheritDoc
    +167              */
    +168             numControlPoints:function () {
    +169                 return this.curve.coordlist.length;
    +170             },
    +171             /**
    +172              * @inheritDoc
    +173              * @param index
    +174              */
    +175             getControlPoint:function (index) {
    +176                 return this.curve.coordlist[index];
    +177             },
    +178             /**
    +179              * @inheritDoc
    +180              */
    +181             endCurvePosition:function () {
    +182                 return this.curve.endCurvePosition();
    +183             },
    +184             /**
    +185              * @inheritDoc
    +186              */
    +187             startCurvePosition:function () {
    +188                 return this.curve.startCurvePosition();
    +189             },
    +190             /**
    +191              * @inheritDoc
    +192              * @param iSize
    +193              */
    +194             getContour:function (iSize) {
    +195                 var contour = [];
    +196                 for (var i = 0; i <= iSize; i++) {
    +197                     contour.push({x:i / iSize, y:this.getPosition(i / iSize).y});
    +198                 }
    +199 
    +200                 return contour;
    +201             }
    +202         }
    +203     }
    +204 
    +205 });
    +206 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_LinearPath.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_LinearPath.js.html new file mode 100644 index 00000000..9ec5ce2a --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_LinearPath.js.html @@ -0,0 +1,218 @@ +
      1 /**
    +  2  * CAAT.LinearPath
    +  3  */
    +  4 CAAT.Module({
    +  5 
    +  6 
    +  7     /**
    +  8      * @name LinearPath
    +  9      * @memberOf CAAT.PathUtil
    + 10      * @extends CAAT.PathUtil.PathSegment
    + 11      * @constructor
    + 12      */
    + 13 
    + 14     defines:"CAAT.PathUtil.LinearPath",
    + 15     depends:[
    + 16         "CAAT.PathUtil.PathSegment",
    + 17         "CAAT.Math.Point"
    + 18     ],
    + 19     aliases:["CAAT.LinearPath"],
    + 20     extendsClass:"CAAT.PathUtil.PathSegment",
    + 21     extendsWith:function () {
    + 22 
    + 23         return  {
    + 24 
    + 25             /**
    + 26              * @lends CAAT.PathUtil.LinearPath.prototype
    + 27              */
    + 28 
    + 29             __init:function () {
    + 30                 this.__super();
    + 31 
    + 32                 this.points = [];
    + 33                 this.points.push(new CAAT.Math.Point());
    + 34                 this.points.push(new CAAT.Math.Point());
    + 35 
    + 36                 this.newPosition = new CAAT.Math.Point(0, 0, 0);
    + 37                 return this;
    + 38             },
    + 39 
    + 40             /**
    + 41              * A collection of points.
    + 42              * @type {Array.<CAAT.Math.Point>}
    + 43              */
    + 44             points:null,
    + 45 
    + 46             /**
    + 47              * spare holder for getPosition coordinate return.
    + 48              */
    + 49             newPosition:null,
    + 50 
    + 51             applyAsPath:function (director) {
    + 52                 // Fixed: Thanks https://github.com/roed
    + 53                 director.ctx.lineTo(this.points[1].x, this.points[1].y);
    + 54             },
    + 55             setPoint:function (point, index) {
    + 56                 if (index === 0) {
    + 57                     this.points[0] = point;
    + 58                 } else if (index === 1) {
    + 59                     this.points[1] = point;
    + 60                 }
    + 61             },
    + 62             /**
    + 63              * Update this segments length and bounding box info.
    + 64              */
    + 65             updatePath:function (point) {
    + 66                 var x = this.points[1].x - this.points[0].x;
    + 67                 var y = this.points[1].y - this.points[0].y;
    + 68                 this.length = Math.sqrt(x * x + y * y);
    + 69 
    + 70                 this.bbox.setEmpty();
    + 71                 this.bbox.union(this.points[0].x, this.points[0].y);
    + 72                 this.bbox.union(this.points[1].x, this.points[1].y);
    + 73 
    + 74                 return this;
    + 75             },
    + 76             setPoints:function (points) {
    + 77                 this.points[0] = points[0];
    + 78                 this.points[1] = points[1];
    + 79                 this.updatePath();
    + 80                 return this;
    + 81             },
    + 82             /**
    + 83              * Set this path segment's starting position.
    + 84              * @param x {number}
    + 85              * @param y {number}
    + 86              */
    + 87             setInitialPosition:function (x, y) {
    + 88                 this.points[0].x = x;
    + 89                 this.points[0].y = y;
    + 90                 this.newPosition.set(x, y);
    + 91                 return this;
    + 92             },
    + 93             /**
    + 94              * Set this path segment's ending position.
    + 95              * @param finalX {number}
    + 96              * @param finalY {number}
    + 97              */
    + 98             setFinalPosition:function (finalX, finalY) {
    + 99                 this.points[1].x = finalX;
    +100                 this.points[1].y = finalY;
    +101                 return this;
    +102             },
    +103             /**
    +104              * @inheritDoc
    +105              */
    +106             endCurvePosition:function () {
    +107                 return this.points[1];
    +108             },
    +109             /**
    +110              * @inheritsDoc
    +111              */
    +112             startCurvePosition:function () {
    +113                 return this.points[0];
    +114             },
    +115             /**
    +116              * @inheritsDoc
    +117              */
    +118             getPosition:function (time) {
    +119 
    +120                 if (time > 1 || time < 0) {
    +121                     time %= 1;
    +122                 }
    +123                 if (time < 0) {
    +124                     time = 1 + time;
    +125                 }
    +126 
    +127                 this.newPosition.set(
    +128                     (this.points[0].x + (this.points[1].x - this.points[0].x) * time),
    +129                     (this.points[0].y + (this.points[1].y - this.points[0].y) * time));
    +130 
    +131                 return this.newPosition;
    +132             },
    +133             getPositionFromLength:function (len) {
    +134                 return this.getPosition(len / this.length);
    +135             },
    +136             /**
    +137              * Returns initial path segment point's x coordinate.
    +138              * @return {number}
    +139              */
    +140             initialPositionX:function () {
    +141                 return this.points[0].x;
    +142             },
    +143             /**
    +144              * Returns final path segment point's x coordinate.
    +145              * @return {number}
    +146              */
    +147             finalPositionX:function () {
    +148                 return this.points[1].x;
    +149             },
    +150             /**
    +151              * Draws this path segment on screen. Optionally it can draw handles for every control point, in
    +152              * this case, start and ending path segment points.
    +153              * @param director {CAAT.Director}
    +154              * @param bDrawHandles {boolean}
    +155              */
    +156             paint:function (director, bDrawHandles) {
    +157 
    +158                 var ctx = director.ctx;
    +159 
    +160                 ctx.save();
    +161 
    +162                 ctx.strokeStyle = this.color;
    +163                 ctx.beginPath();
    +164                 ctx.moveTo(this.points[0].x, this.points[0].y);
    +165                 ctx.lineTo(this.points[1].x, this.points[1].y);
    +166                 ctx.stroke();
    +167 
    +168                 if (bDrawHandles) {
    +169                     ctx.globalAlpha = 0.5;
    +170                     ctx.fillStyle = '#7f7f00';
    +171                     ctx.beginPath();
    +172                     this.drawHandle(ctx, this.points[0].x, this.points[0].y);
    +173                     this.drawHandle(ctx, this.points[1].x, this.points[1].y);
    +174 
    +175                 }
    +176 
    +177                 ctx.restore();
    +178             },
    +179             /**
    +180              * Get the number of control points. For this type of path segment, start and
    +181              * ending path segment points. Defaults to 2.
    +182              * @return {number}
    +183              */
    +184             numControlPoints:function () {
    +185                 return 2;
    +186             },
    +187             /**
    +188              * @inheritsDoc
    +189              */
    +190             getControlPoint:function (index) {
    +191                 if (0 === index) {
    +192                     return this.points[0];
    +193                 } else if (1 === index) {
    +194                     return this.points[1];
    +195                 }
    +196             },
    +197             /**
    +198              * @inheritsDoc
    +199              */
    +200             getContour:function (iSize) {
    +201                 var contour = [];
    +202 
    +203                 contour.push(this.getPosition(0).clone());
    +204                 contour.push(this.getPosition(1).clone());
    +205 
    +206                 return contour;
    +207             }
    +208         }
    +209     }
    +210 });
    +211 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_Path.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_Path.js.html new file mode 100644 index 00000000..6c7cb2ed --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_Path.js.html @@ -0,0 +1,1172 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name Path
    +  5      * @memberOf CAAT.PathUtil
    +  6      * @extends CAAT.PathUtil.PathSegment
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.PathUtil.Path",
    + 11     aliases : ["CAAT.Path"],
    + 12     depends : [
    + 13         "CAAT.PathUtil.PathSegment",
    + 14         "CAAT.PathUtil.ArcPath",
    + 15         "CAAT.PathUtil.CurvePath",
    + 16         "CAAT.PathUtil.LinearPath",
    + 17         "CAAT.PathUtil.RectPath",
    + 18         "CAAT.Math.Bezier",
    + 19         "CAAT.Math.CatmullRom",
    + 20         "CAAT.Math.Point",
    + 21         "CAAT.Math.Matrix"
    + 22     ],
    + 23     extendsClass : "CAAT.PathUtil.PathSegment",
    + 24     extendsWith : {
    + 25 
    + 26         /**
    + 27          * @lends CAAT.PathUtil.Path.prototype
    + 28          */
    + 29 
    + 30 
    + 31         __init : function()	{
    + 32                 this.__super();
    + 33 
    + 34                 this.newPosition=   new CAAT.Math.Point(0,0,0);
    + 35                 this.pathSegments=  [];
    + 36 
    + 37                 this.behaviorList=  [];
    + 38                 this.matrix=        new CAAT.Math.Matrix();
    + 39                 this.tmpMatrix=     new CAAT.Math.Matrix();
    + 40 
    + 41                 return this;
    + 42         },
    + 43 
    + 44         /**
    + 45          * A collection of PathSegments.
    + 46          * @type {Array.<CAAT.PathUtil.PathSegment>}
    + 47          */
    + 48 		pathSegments:	            null,   // a collection of CAAT.PathSegment instances.
    + 49 
    + 50         /**
    + 51          * For each path segment in this path, the normalized calculated duration.
    + 52          * precomputed segment duration relative to segment legnth/path length
    + 53          */
    + 54 		pathSegmentDurationTime:	null,
    + 55 
    + 56         /**
    + 57          * For each path segment in this path, the normalized calculated start time.
    + 58          * precomputed segment start time relative to segment legnth/path length and duration.
    + 59          */
    + 60 		pathSegmentStartTime:		null,
    + 61 
    + 62         /**
    + 63          * spare CAAT.Math.Point to return calculated values in the path.
    + 64          */
    + 65 		newPosition:	            null,
    + 66 
    + 67         /**
    + 68          * path length (sum of every segment length)
    + 69          */
    + 70 		pathLength:		            -1,
    + 71 
    + 72         /**
    + 73          * starting path x position
    + 74          */
    + 75 		beginPathX:		            -1,
    + 76 
    + 77         /**
    + 78          * starting path y position
    + 79          */
    + 80 		beginPathY:                 -1,
    + 81 
    + 82         /*
    + 83             last path coordinates position (using when building the path).
    + 84          */
    + 85 		trackPathX:		            -1,
    + 86 		trackPathY:		            -1,
    + 87 
    + 88         /*
    + 89             needed to drag control points.
    + 90           */
    + 91 		ax:                         -1,
    + 92 		ay:                         -1,
    + 93 		point:                      [],
    + 94 
    + 95         /**
    + 96          * Is this path interactive ?. If so, controls points can be moved with a CAAT.Foundation.UI.PathActor.
    + 97          */
    + 98         interactive:                true,
    + 99 
    +100         /**
    +101          * A list of behaviors to apply to this path.
    +102          * A path can be affine transformed to create a different path.
    +103          */
    +104         behaviorList:               null,
    +105 
    +106         /* rotation behavior info **/
    +107 
    +108         /**
    +109          * Path rotation angle.
    +110          */
    +111         rb_angle:                   0,
    +112 
    +113         /**
    +114          * Path rotation x anchor.
    +115          */
    +116         rb_rotateAnchorX:           .5,
    +117 
    +118         /**
    +119          * Path rotation x anchor.
    +120          */
    +121         rb_rotateAnchorY:           .5,
    +122 
    +123         /* scale behavior info **/
    +124 
    +125         /**
    +126          * Path X scale.
    +127          */
    +128         sb_scaleX:                  1,
    +129 
    +130         /**
    +131          * Path Y scale.
    +132          */
    +133         sb_scaleY:                  1,
    +134 
    +135         /**
    +136          * Path scale X anchor.
    +137          */
    +138         sb_scaleAnchorX:            .5,
    +139 
    +140         /**
    +141          * Path scale Y anchor.
    +142          */
    +143         sb_scaleAnchorY:            .5,
    +144 
    +145         /**
    +146          * Path translation anchor X.
    +147          */
    +148         tAnchorX:                   0,
    +149 
    +150         /**
    +151          * Path translation anchor Y.
    +152          */
    +153         tAnchorY:                   0,
    +154 
    +155         /* translate behavior info **/
    +156 
    +157         /**
    +158          * Path translation X.
    +159          */
    +160         tb_x:                       0,
    +161 
    +162         /**
    +163          * Path translation Y.
    +164          */
    +165         tb_y:                       0,
    +166 
    +167         /* behavior affine transformation matrix **/
    +168 
    +169         /**
    +170          * Path behaviors matrix.
    +171          */
    +172         matrix:                     null,
    +173 
    +174         /**
    +175          * Spare calculation matrix.
    +176          */
    +177         tmpMatrix:                  null,
    +178 
    +179         /**
    +180          * Original Path´s path segments points.
    +181          */
    +182         pathPoints:                 null,
    +183 
    +184         /**
    +185          * Path bounding box width.
    +186          */
    +187         width:                      0,
    +188 
    +189         /**
    +190          * Path bounding box height.
    +191          */
    +192         height:                     0,
    +193 
    +194         /**
    +195          * Path bounding box X position.
    +196          */
    +197         clipOffsetX             :   0,
    +198 
    +199         /**
    +200          * Path bounding box Y position.
    +201          */
    +202         clipOffsetY             :   0,
    +203 
    +204         /**
    +205          * Is this path closed ?
    +206          */
    +207         closed                  :   false,
    +208 
    +209         /**
    +210          * Apply this path as a Canvas context path.
    +211          * You must explicitly call context.beginPath
    +212          * @param director
    +213          * @return {*}
    +214          */
    +215         applyAsPath : function(director) {
    +216             var ctx= director.ctx;
    +217 
    +218             director.modelViewMatrix.transformRenderingContext( ctx );
    +219             ctx.globalCompositeOperation= 'source-out';
    +220             ctx.moveTo(
    +221                 this.getFirstPathSegment().startCurvePosition().x,
    +222                 this.getFirstPathSegment().startCurvePosition().y
    +223             );
    +224             for( var i=0; i<this.pathSegments.length; i++ ) {
    +225                 this.pathSegments[i].applyAsPath(director);
    +226             }
    +227             ctx.globalCompositeOperation= 'source-over';
    +228             return this;
    +229         },
    +230         /**
    +231          * Set whether this path should paint handles for every control point.
    +232          * @param interactive {boolean}.
    +233          */
    +234         setInteractive : function(interactive) {
    +235             this.interactive= interactive;
    +236             return this;
    +237         },
    +238         getFirstPathSegment : function() {
    +239             return this.pathSegments.length ?
    +240                 this.pathSegments[0] :
    +241                 null;
    +242         },
    +243         getLastPathSegment : function() {
    +244             return this.pathSegments.length ?
    +245                 this.pathSegments[ this.pathSegments.length-1 ] :
    +246                 null;
    +247         },
    +248         /**
    +249          * Return the last point of the last path segment of this compound path.
    +250          * @return {CAAT.Point}
    +251          */
    +252         endCurvePosition : function() {
    +253             if ( this.pathSegments.length ) {
    +254                 return this.pathSegments[ this.pathSegments.length-1 ].endCurvePosition();
    +255             } else {
    +256                 return new CAAT.Math.Point().set( this.beginPathX, this.beginPathY );
    +257             }
    +258         },
    +259         /**
    +260          * Return the first point of the first path segment of this compound path.
    +261          * @return {CAAT.Point}
    +262          */
    +263         startCurvePosition : function() {
    +264             return this.pathSegments[ 0 ].startCurvePosition();
    +265         },
    +266         /**
    +267          * Return the last path segment added to this path.
    +268          * @return {CAAT.PathSegment}
    +269          */
    +270         getCurrentPathSegment : function() {
    +271             return this.pathSegments[ this.pathSegments.length-1 ];
    +272         },
    +273         /**
    +274          * Set the path to be composed by a single LinearPath segment.
    +275          * @param x0 {number}
    +276          * @param y0 {number}
    +277          * @param x1 {number}
    +278          * @param y1 {number}
    +279          * @return this
    +280          */
    +281         setLinear : function(x0,y0,x1,y1) {
    +282             this.pathSegments= [];
    +283             this.beginPath(x0,y0);
    +284             this.addLineTo(x1,y1);
    +285             this.endPath();
    +286 
    +287             return this;
    +288         },
    +289         /**
    +290          * Set this path to be composed by a single Quadric Bezier path segment.
    +291          * @param x0 {number}
    +292          * @param y0 {number}
    +293          * @param x1 {number}
    +294          * @param y1 {number}
    +295          * @param x2 {number}
    +296          * @param y2 {number}
    +297          * @return this
    +298          */
    +299         setQuadric : function(x0,y0,x1,y1,x2,y2) {
    +300             this.beginPath(x0,y0);
    +301             this.addQuadricTo(x1,y1,x2,y2);
    +302             this.endPath();
    +303 
    +304             return this;
    +305         },
    +306         /**
    +307          * Sets this path to be composed by a single Cubic Bezier path segment.
    +308          * @param x0 {number}
    +309          * @param y0 {number}
    +310          * @param x1 {number}
    +311          * @param y1 {number}
    +312          * @param x2 {number}
    +313          * @param y2 {number}
    +314          * @param x3 {number}
    +315          * @param y3 {number}
    +316          *
    +317          * @return this
    +318          */
    +319         setCubic : function(x0,y0,x1,y1,x2,y2,x3,y3) {
    +320             this.beginPath(x0,y0);
    +321             this.addCubicTo(x1,y1,x2,y2,x3,y3);
    +322             this.endPath();
    +323 
    +324             return this;
    +325         },
    +326         setRectangle : function(x0,y0, x1,y1) {
    +327             this.beginPath(x0,y0);
    +328             this.addRectangleTo(x1,y1);
    +329             this.endPath();
    +330 
    +331             return this;
    +332         },
    +333         setCatmullRom : function( points, closed ) {
    +334             if ( closed ) {
    +335                 points = points.slice(0)
    +336                 points.unshift(points[points.length-1])
    +337                 points.push(points[1])
    +338                 points.push(points[2])
    +339             }
    +340 
    +341             for( var i=1; i<points.length-2; i++ ) {
    +342 
    +343                 var segment= new CAAT.PathUtil.CurvePath().setColor("#000").setParent(this);
    +344                 var cm= new CAAT.Math.CatmullRom().setCurve(
    +345                     points[ i-1 ],
    +346                     points[ i ],
    +347                     points[ i+1 ],
    +348                     points[ i+2 ]
    +349                 );
    +350                 segment.curve= cm;
    +351                 this.pathSegments.push(segment);
    +352             }
    +353             return this;
    +354         },
    +355         /**
    +356          * Add a CAAT.PathSegment instance to this path.
    +357          * @param pathSegment {CAAT.PathSegment}
    +358          * @return this
    +359          *
    +360          */
    +361 		addSegment : function(pathSegment) {
    +362             pathSegment.setParent(this);
    +363 			this.pathSegments.push(pathSegment);
    +364             return this;
    +365 		},
    +366         addArcTo : function( x1,y1, x2,y2, radius, cw, color ) {
    +367             var r= new CAAT.PathUtil.ArcPath();
    +368             r.setArcTo(true);
    +369             r.setRadius( radius );
    +370             r.setInitialPosition( x1,y1).
    +371                 setFinalPosition( x2,y2 );
    +372 
    +373 
    +374             r.setParent( this );
    +375             r.setColor( color );
    +376 
    +377             this.pathSegments.push(r);
    +378 
    +379             return this;
    +380         },
    +381         addRectangleTo : function( x1,y1, cw, color ) {
    +382             var r= new CAAT.PathUtil.RectPath();
    +383             r.setPoints([
    +384                     this.endCurvePosition(),
    +385                     new CAAT.Math.Point().set(x1,y1)
    +386                 ]);
    +387 
    +388             r.setClockWise(cw);
    +389             r.setColor(color);
    +390             r.setParent(this);
    +391 
    +392             this.pathSegments.push(r);
    +393 
    +394             return this;
    +395         },
    +396         /**
    +397          * Add a Quadric Bezier path segment to this path.
    +398          * The segment starts in the current last path coordinate.
    +399          * @param px1 {number}
    +400          * @param py1 {number}
    +401          * @param px2 {number}
    +402          * @param py2 {number}
    +403          * @param color {color=}. optional parameter. determines the color to draw the segment with (if
    +404          *         being drawn by a CAAT.PathActor).
    +405          *
    +406          * @return this
    +407          */
    +408 		addQuadricTo : function( px1,py1, px2,py2, color ) {
    +409 			var bezier= new CAAT.Math.Bezier();
    +410 
    +411             bezier.setPoints(
    +412                 [
    +413                     this.endCurvePosition(),
    +414                     new CAAT.Math.Point().set(px1,py1),
    +415                     new CAAT.Math.Point().set(px2,py2)
    +416                 ]);
    +417 
    +418 			this.trackPathX= px2;
    +419 			this.trackPathY= py2;
    +420 			
    +421 			var segment= new CAAT.PathUtil.CurvePath().setColor(color).setParent(this);
    +422 			segment.curve= bezier;
    +423 
    +424 			this.pathSegments.push(segment);
    +425 
    +426             return this;
    +427 		},
    +428         /**
    +429          * Add a Cubic Bezier segment to this path.
    +430          * The segment starts in the current last path coordinate.
    +431          * @param px1 {number}
    +432          * @param py1 {number}
    +433          * @param px2 {number}
    +434          * @param py2 {number}
    +435          * @param px3 {number}
    +436          * @param py3 {number}
    +437          * @param color {color=}. optional parameter. determines the color to draw the segment with (if
    +438          *         being drawn by a CAAT.PathActor).
    +439          *
    +440          * @return this
    +441          */
    +442 		addCubicTo : function( px1,py1, px2,py2, px3,py3, color ) {
    +443 			var bezier= new CAAT.Math.Bezier();
    +444 
    +445             bezier.setPoints(
    +446                 [
    +447                     this.endCurvePosition(),
    +448                     new CAAT.Math.Point().set(px1,py1),
    +449                     new CAAT.Math.Point().set(px2,py2),
    +450                     new CAAT.Math.Point().set(px3,py3)
    +451                 ]);
    +452 
    +453 			this.trackPathX= px3;
    +454 			this.trackPathY= py3;
    +455 			
    +456 			var segment= new CAAT.PathUtil.CurvePath().setColor(color).setParent(this);
    +457 			segment.curve= bezier;
    +458 
    +459 			this.pathSegments.push(segment);
    +460             return this;
    +461 		},
    +462         /**
    +463          * Add a Catmull-Rom segment to this path.
    +464          * The segment starts in the current last path coordinate.
    +465          * @param px1 {number}
    +466          * @param py1 {number}
    +467          * @param px2 {number}
    +468          * @param py2 {number}
    +469          * @param px3 {number}
    +470          * @param py3 {number}
    +471          * @param color {color=}. optional parameter. determines the color to draw the segment with (if
    +472          *         being drawn by a CAAT.PathActor).
    +473          *
    +474          * @return this
    +475          */
    +476 		addCatmullTo : function( px1,py1, px2,py2, px3,py3, color ) {
    +477 			var curve= new CAAT.Math.CatmullRom().setColor(color);
    +478 			curve.setCurve(this.trackPathX,this.trackPathY, px1,py1, px2,py2, px3,py3);
    +479 			this.trackPathX= px3;
    +480 			this.trackPathY= py3;
    +481 			
    +482 			var segment= new CAAT.PathUtil.CurvePath().setParent(this);
    +483 			segment.curve= curve;
    +484 
    +485 			this.pathSegments.push(segment);
    +486             return this;
    +487 		},
    +488         /**
    +489          * Adds a line segment to this path.
    +490          * The segment starts in the current last path coordinate.
    +491          * @param px1 {number}
    +492          * @param py1 {number}
    +493          * @param color {color=}. optional parameter. determines the color to draw the segment with (if
    +494          *         being drawn by a CAAT.PathActor).
    +495          *
    +496          * @return this
    +497          */
    +498 		addLineTo : function( px1,py1, color ) {
    +499 			var segment= new CAAT.PathUtil.LinearPath().setColor(color);
    +500             segment.setPoints( [
    +501                     this.endCurvePosition(),
    +502                     new CAAT.Math.Point().set(px1,py1)
    +503                 ]);
    +504 
    +505             segment.setParent(this);
    +506 
    +507 			this.trackPathX= px1;
    +508 			this.trackPathY= py1;
    +509 			
    +510 			this.pathSegments.push(segment);
    +511             return this;
    +512 		},
    +513         /**
    +514          * Set the path's starting point. The method startCurvePosition will return this coordinate.
    +515          * <p>
    +516          * If a call to any method of the form <code>add<Segment>To</code> is called before this calling
    +517          * this method, they will assume to start at -1,-1 and probably you'll get the wrong path.
    +518          * @param px0 {number}
    +519          * @param py0 {number}
    +520          *
    +521          * @return this
    +522          */
    +523 		beginPath : function( px0, py0 ) {
    +524 			this.trackPathX= px0;
    +525 			this.trackPathY= py0;
    +526 			this.beginPathX= px0;
    +527 			this.beginPathY= py0;
    +528             return this;
    +529 		},
    +530         /**
    +531          * <del>Close the path by adding a line path segment from the current last path
    +532          * coordinate to startCurvePosition coordinate</del>.
    +533          * <p>
    +534          * This method closes a path by setting its last path segment's last control point
    +535          * to be the first path segment's first control point.
    +536          * <p>
    +537          *     This method also sets the path as finished, and calculates all path's information
    +538          *     such as length and bounding box.
    +539          *
    +540          * @return this
    +541          */
    +542 		closePath : function()	{
    +543 
    +544             this.getLastPathSegment().setPoint(
    +545                 this.getFirstPathSegment().startCurvePosition(),
    +546                 this.getLastPathSegment().numControlPoints()-1 );
    +547 
    +548 
    +549 			this.trackPathX= this.beginPathX;
    +550 			this.trackPathY= this.beginPathY;
    +551 
    +552             this.closed= true;
    +553 
    +554 			this.endPath();
    +555             return this;
    +556 		},
    +557         /**
    +558          * Finishes the process of building the path. It involves calculating each path segments length
    +559          * and proportional length related to a normalized path length of 1.
    +560          * It also sets current paths length.
    +561          * These calculi are needed to traverse the path appropriately.
    +562          * <p>
    +563          * This method must be called explicitly, except when closing a path (that is, calling the
    +564          * method closePath) which calls this method as well.
    +565          *
    +566          * @return this
    +567          */
    +568 		endPath : function() {
    +569 
    +570 			this.pathSegmentStartTime=[];
    +571 			this.pathSegmentDurationTime= [];
    +572 
    +573             this.updatePath();
    +574 
    +575             return this;
    +576 		},
    +577         /**
    +578          * This method, returns a CAAT.Foundation.Point instance indicating a coordinate in the path.
    +579          * The returned coordinate is the corresponding to normalizing the path's length to 1,
    +580          * and then finding what path segment and what coordinate in that path segment corresponds
    +581          * for the input time parameter.
    +582          * <p>
    +583          * The parameter time must be a value ranging 0..1.
    +584          * If not constrained to these values, the parameter will be modulus 1, and then, if less
    +585          * than 0, be normalized to 1+time, so that the value always ranges from 0 to 1.
    +586          * <p>
    +587          * This method is needed when traversing the path throughout a CAAT.Interpolator instance.
    +588          *
    +589          *
    +590          * @param time {number} a value between 0 and 1 both inclusive. 0 will return path's starting coordinate.
    +591          * 1 will return path's end coordinate.
    +592          * @param open_contour {boolean=} treat this path as an open contour. It is intended for
    +593          * open paths, and interpolators which give values above 1. see tutorial 7.1.
    +594          * @link{../../documentation/tutorials/t7-1.html}
    +595          *
    +596          * @return {CAAT.Foundation.Point}
    +597          */
    +598 		getPosition : function(time, open_contour) {
    +599 
    +600             if (open_contour && (time>=1 || time<=0) ) {
    +601 
    +602                 var p0,p1,ratio, angle;
    +603 
    +604                 if ( time>=1 ) {
    +605                     // these values could be cached.
    +606                     p0= this.__getPositionImpl( .999 );
    +607                     p1= this.endCurvePosition();
    +608 
    +609                     angle= Math.atan2( p1.y - p0.y, p1.x - p0.x );
    +610                     ratio= time%1;
    +611 
    +612 
    +613                 } else {
    +614                     // these values could be cached.
    +615                     p0= this.__getPositionImpl( .001 );
    +616                     p1= this.startCurvePosition();
    +617 
    +618                     angle= Math.atan2( p1.y - p0.y, p1.x - p0.x );
    +619                     ratio= -time;
    +620                 }
    +621 
    +622                 var np= this.newPosition;
    +623                 var length= this.getLength();
    +624 
    +625                 np.x = p1.x + (ratio * length)*Math.cos(angle);
    +626                 np.y = p1.y + (ratio * length)*Math.sin(angle);
    +627 
    +628 
    +629                 return np;
    +630             }
    +631 
    +632             return this.__getPositionImpl(time);
    +633         },
    +634 
    +635         __getPositionImpl : function(time) {
    +636 
    +637             if ( time>1 || time<0 ) {
    +638                 time%=1;
    +639             }
    +640             if ( time<0 ) {
    +641                 time= 1+time;
    +642             }
    +643 
    +644             var ps= this.pathSegments;
    +645             var psst= this.pathSegmentStartTime;
    +646             var psdt= this.pathSegmentDurationTime;
    +647             var l=  0;
    +648             var r=  ps.length;
    +649             var m;
    +650             var np= this.newPosition;
    +651             var psstv;
    +652             while( l!==r ) {
    +653 
    +654                 m= ((r+l)/2)|0;
    +655                 psstv= psst[m];
    +656                 if ( psstv<=time && time<=psstv+psdt[m]) {
    +657                     time= psdt[m] ?
    +658                             (time-psstv)/psdt[m] :
    +659                             0;
    +660 
    +661                     // Clamp this segment's time to a maximum since it is relative to the path.
    +662                     // thanks https://github.com/donaldducky for spotting.
    +663                     if (time>1) {
    +664                         time=1;
    +665                     } else if (time<0 ) {
    +666                         time= 0;
    +667                     }
    +668 
    +669                     var pointInPath= ps[m].getPosition(time);
    +670                     np.x= pointInPath.x;
    +671                     np.y= pointInPath.y;
    +672                     return np;
    +673                 } else if ( time<psstv ) {
    +674                     r= m;
    +675                 } else /*if ( time>=psstv )*/ {
    +676                     l= m+1;
    +677                 }
    +678             }
    +679             return this.endCurvePosition();
    +680 
    +681 
    +682 		},
    +683         /**
    +684          * Analogously to the method getPosition, this method returns a CAAT.Point instance with
    +685          * the coordinate on the path that corresponds to the given length. The input length is
    +686          * related to path's length.
    +687          *
    +688          * @param iLength {number} a float with the target length.
    +689          * @return {CAAT.Point}
    +690          */
    +691 		getPositionFromLength : function(iLength) {
    +692 			
    +693 			iLength%=this.getLength();
    +694 			if (iLength<0 ) {
    +695 				iLength+= this.getLength();
    +696 			}
    +697 			
    +698 			var accLength=0;
    +699 			
    +700 			for( var i=0; i<this.pathSegments.length; i++ ) {
    +701 				if (accLength<=iLength && iLength<=this.pathSegments[i].getLength()+accLength) {
    +702 					iLength-= accLength;
    +703 					var pointInPath= this.pathSegments[i].getPositionFromLength(iLength);
    +704 					this.newPosition.x= pointInPath.x;
    +705 					this.newPosition.y= pointInPath.y;
    +706 					break;
    +707 				}
    +708 				accLength+= this.pathSegments[i].getLength();
    +709 			}
    +710 			
    +711 			return this.newPosition;
    +712 		},
    +713         /**
    +714          * Paints the path.
    +715          * This method is called by CAAT.PathActor instances.
    +716          * If the path is set as interactive (by default) path segment will draw curve modification
    +717          * handles as well.
    +718          *
    +719          * @param director {CAAT.Director} a CAAT.Director instance.
    +720          */
    +721 		paint : function( director ) {
    +722 			for( var i=0; i<this.pathSegments.length; i++ ) {
    +723 				this.pathSegments[i].paint(director,this.interactive);
    +724 			}
    +725 		},
    +726         /**
    +727          * Method invoked when a CAAT.PathActor stops dragging a control point.
    +728          */
    +729 		release : function() {
    +730 			this.ax= -1;
    +731 			this.ay= -1;
    +732 		},
    +733         isEmpty : function() {
    +734             return !this.pathSegments.length;
    +735         },
    +736         /**
    +737          * Returns an integer with the number of path segments that conform this path.
    +738          * @return {number}
    +739          */
    +740         getNumSegments : function() {
    +741             return this.pathSegments.length;
    +742         },
    +743         /**
    +744          * Gets a CAAT.PathSegment instance.
    +745          * @param index {number} the index of the desired CAAT.PathSegment.
    +746          * @return CAAT.PathSegment
    +747          */
    +748 		getSegment : function(index) {
    +749 			return this.pathSegments[index];
    +750 		},
    +751 
    +752         numControlPoints : function() {
    +753             return this.points.length;
    +754         },
    +755 
    +756         getControlPoint : function(index) {
    +757             return this.points[index];
    +758         },
    +759 
    +760         /**
    +761          * Indicates that some path control point has changed, and that the path must recalculate
    +762          * its internal data, ie: length and bbox.
    +763          */
    +764 		updatePath : function(point, callback) {
    +765             var i,j;
    +766 
    +767             this.length=0;
    +768             this.bbox.setEmpty();
    +769             this.points= [];
    +770 
    +771             var xmin= Number.MAX_VALUE, ymin= Number.MAX_VALUE;
    +772 			for( i=0; i<this.pathSegments.length; i++ ) {
    +773 				this.pathSegments[i].updatePath(point);
    +774                 this.length+= this.pathSegments[i].getLength();
    +775                 this.bbox.unionRectangle( this.pathSegments[i].bbox );
    +776 
    +777                 for( j=0; j<this.pathSegments[i].numControlPoints(); j++ ) {
    +778                     var pt= this.pathSegments[i].getControlPoint( j );
    +779                     this.points.push( pt );
    +780                     if ( pt.x < xmin ) {
    +781                         xmin= pt.x;
    +782                     }
    +783                     if ( pt.y < ymin ) {
    +784                         ymin= pt.y;
    +785                     }
    +786                 }
    +787 			}
    +788 
    +789             this.clipOffsetX= -xmin;
    +790             this.clipOffsetY= -ymin;
    +791 
    +792             this.width= this.bbox.width;
    +793             this.height= this.bbox.height;
    +794             this.setLocation( this.bbox.x, this.bbox.y );
    +795 
    +796             this.pathSegmentStartTime=      [];
    +797             this.pathSegmentDurationTime=   [];
    +798             
    +799             var i;
    +800             for( i=0; i<this.pathSegments.length; i++) {
    +801                 this.pathSegmentStartTime.push(0);
    +802                 this.pathSegmentDurationTime.push(0);
    +803             }
    +804 
    +805             for( i=0; i<this.pathSegments.length; i++) {
    +806                 this.pathSegmentDurationTime[i]= this.getLength() ? this.pathSegments[i].getLength()/this.getLength() : 0;
    +807                 if ( i>0 ) {
    +808                     this.pathSegmentStartTime[i]= this.pathSegmentStartTime[i-1]+this.pathSegmentDurationTime[i-1];
    +809                 } else {
    +810                     this.pathSegmentStartTime[0]= 0;
    +811                 }
    +812 
    +813                 this.pathSegments[i].endPath();
    +814             }
    +815 
    +816             this.extractPathPoints();
    +817 
    +818             if ( callback ) {
    +819                 callback(this);
    +820             }
    +821 
    +822             return this;
    +823 
    +824 		},
    +825         /**
    +826          * Sent by a CAAT.PathActor instance object to try to drag a path's control point.
    +827          * @param x {number}
    +828          * @param y {number}
    +829          */
    +830 		press: function(x,y) {
    +831             if (!this.interactive) {
    +832                 return;
    +833             }
    +834 
    +835             var HS= CAAT.Math.Curve.prototype.HANDLE_SIZE/2;
    +836 			for( var i=0; i<this.pathSegments.length; i++ ) {
    +837 				for( var j=0; j<this.pathSegments[i].numControlPoints(); j++ ) {
    +838 					var point= this.pathSegments[i].getControlPoint(j);
    +839 					if ( x>=point.x-HS &&
    +840 						 y>=point.y-HS &&
    +841 						 x<point.x+HS &&
    +842 						 y<point.y+HS ) {
    +843 						
    +844 						this.point= point;
    +845 						return;
    +846 					}
    +847 				}
    +848 			}
    +849 			this.point= null;
    +850 		},
    +851         /**
    +852          * Drags a path's control point.
    +853          * If the method press has not set needed internal data to drag a control point, this
    +854          * method will do nothing, regardless the user is dragging on the CAAT.PathActor delegate.
    +855          * @param x {number}
    +856          * @param y {number}
    +857          */
    +858 		drag : function(x,y,callback) {
    +859             if (!this.interactive) {
    +860                 return;
    +861             }
    +862 
    +863 			if ( null===this.point ) {
    +864 				return;
    +865 			}
    +866 			
    +867 			if ( -1===this.ax || -1===this.ay ) {
    +868 				this.ax= x;
    +869 				this.ay= y;
    +870 			}
    +871 			
    +872             this.point.x+= x-this.ax;
    +873             this.point.y+= y-this.ay;
    +874 
    +875 			this.ax= x;
    +876 			this.ay= y;
    +877 
    +878 			this.updatePath(this.point,callback);
    +879 		},
    +880         /**
    +881          * Returns a collection of CAAT.Point objects which conform a path's contour.
    +882          * @param iSize {number}. Number of samples for each path segment.
    +883          * @return {[CAAT.Point]}
    +884          */
    +885         getContour : function(iSize) {
    +886             var contour=[];
    +887             for( var i=0; i<=iSize; i++ ) {
    +888                 contour.push( new CAAT.Math.Point().set( i/iSize, this.getPosition(i/iSize).y, 0 ) );
    +889             }
    +890 
    +891             return contour;
    +892         },
    +893 
    +894         /**
    +895          * Reposition this path points.
    +896          * This operation will only take place if the supplied points array equals in size to
    +897          * this path's already set points.
    +898          * @param points {Array<CAAT.Point>}
    +899          */
    +900         setPoints : function( points ) {
    +901             if ( this.points.length===points.length ) {
    +902                 for( var i=0; i<points.length; i++ ) {
    +903                     this.points[i].x= points[i].x;
    +904                     this.points[i].y= points[i].y;
    +905                 }
    +906             }
    +907             return this;
    +908         },
    +909 
    +910         /**
    +911          * Set a point from this path.
    +912          * @param point {CAAT.Point}
    +913          * @param index {integer} a point index.
    +914          */
    +915         setPoint : function( point, index ) {
    +916             if ( index>=0 && index<this.points.length ) {
    +917                 this.points[index].x= point.x;
    +918                 this.points[index].y= point.y;
    +919             }
    +920             return this;
    +921         },
    +922 
    +923 
    +924         /**
    +925          * Removes all behaviors from an Actor.
    +926          * @return this
    +927          */
    +928 		emptyBehaviorList : function() {
    +929 			this.behaviorList=[];
    +930             return this;
    +931 		},
    +932 
    +933         extractPathPoints : function() {
    +934             if ( !this.pathPoints ) {
    +935                 var i;
    +936                 this.pathPoints= [];
    +937                 for ( i=0; i<this.numControlPoints(); i++ ) {
    +938                     this.pathPoints.push( this.getControlPoint(i).clone() );
    +939                 }
    +940             }
    +941 
    +942             return this;
    +943         },
    +944 
    +945         /**
    +946          * Add a Behavior to the Actor.
    +947          * An Actor accepts an undefined number of Behaviors.
    +948          *
    +949          * @param behavior {CAAT.Behavior} a CAAT.Behavior instance
    +950          * @return this
    +951          */
    +952 		addBehavior : function( behavior )	{
    +953 			this.behaviorList.push(behavior);
    +954 //            this.extractPathPoints();
    +955             return this;
    +956 		},
    +957         /**
    +958          * Remove a Behavior from the Actor.
    +959          * If the Behavior is not present at the actor behavior collection nothing happends.
    +960          *
    +961          * @param behavior {CAAT.Behavior} a CAAT.Behavior instance.
    +962          */
    +963         removeBehaviour : function( behavior ) {
    +964             var n= this.behaviorList.length-1;
    +965             while(n) {
    +966                 if ( this.behaviorList[n]===behavior ) {
    +967                     this.behaviorList.splice(n,1);
    +968                     return this;
    +969                 }
    +970             }
    +971 
    +972             return this;
    +973         },
    +974         /**
    +975          * Remove a Behavior with id param as behavior identifier from this actor.
    +976          * This function will remove ALL behavior instances with the given id.
    +977          *
    +978          * @param id {number} an integer.
    +979          * return this;
    +980          */
    +981         removeBehaviorById : function( id ) {
    +982             for( var n=0; n<this.behaviorList.length; n++ ) {
    +983                 if ( this.behaviorList[n].id===id) {
    +984                     this.behaviorList.splice(n,1);
    +985                 }
    +986             }
    +987 
    +988             return this;
    +989 
    +990         },
    +991 
    +992         applyBehaviors : function(time) {
    +993 //            if (this.behaviorList.length) {
    +994                 for( var i=0; i<this.behaviorList.length; i++ )	{
    +995                     this.behaviorList[i].apply(time,this);
    +996                 }
    +997 
    +998                 /** calculate behavior affine transform matrix **/
    +999                 this.setATMatrix();
    +1000 
    +1001                 for (i = 0; i < this.numControlPoints(); i++) {
    +1002                     this.setPoint(
    +1003                         this.matrix.transformCoord(
    +1004                             this.pathPoints[i].clone().translate( this.clipOffsetX, this.clipOffsetY )), i);
    +1005                 }
    +1006 //            }
    +1007 
    +1008             return this;
    +1009         },
    +1010 
    +1011         setATMatrix : function() {
    +1012             this.matrix.identity();
    +1013 
    +1014             var m= this.tmpMatrix.identity();
    +1015             var mm= this.matrix.matrix;
    +1016             var c,s,_m00,_m01,_m10,_m11;
    +1017             var mm0, mm1, mm2, mm3, mm4, mm5;
    +1018 
    +1019             var bbox= this.bbox;
    +1020             var bbw= bbox.width  ;
    +1021             var bbh= bbox.height ;
    +1022             var bbx= bbox.x;
    +1023             var bby= bbox.y
    +1024 
    +1025             mm0= 1;
    +1026             mm1= 0;
    +1027             mm3= 0;
    +1028             mm4= 1;
    +1029 
    +1030             mm2= this.tb_x - bbx - this.tAnchorX * bbw;
    +1031             mm5= this.tb_y - bby - this.tAnchorY * bbh;
    +1032 
    +1033             if ( this.rb_angle ) {
    +1034 
    +1035                 var rbx= (this.rb_rotateAnchorX*bbw + bbx);
    +1036                 var rby= (this.rb_rotateAnchorY*bbh + bby);
    +1037 
    +1038                 mm2+= mm0*rbx + mm1*rby;
    +1039                 mm5+= mm3*rbx + mm4*rby;
    +1040 
    +1041                 c= Math.cos( this.rb_angle );
    +1042                 s= Math.sin( this.rb_angle);
    +1043                 _m00= mm0;
    +1044                 _m01= mm1;
    +1045                 _m10= mm3;
    +1046                 _m11= mm4;
    +1047                 mm0=  _m00*c + _m01*s;
    +1048                 mm1= -_m00*s + _m01*c;
    +1049                 mm3=  _m10*c + _m11*s;
    +1050                 mm4= -_m10*s + _m11*c;
    +1051 
    +1052                 mm2+= -mm0*rbx - mm1*rby;
    +1053                 mm5+= -mm3*rbx - mm4*rby;
    +1054             }
    +1055 
    +1056             if ( this.sb_scaleX!=1 || this.sb_scaleY!=1 ) {
    +1057 
    +1058                 var sbx= (this.sb_scaleAnchorX*bbw + bbx);
    +1059                 var sby= (this.sb_scaleAnchorY*bbh + bby);
    +1060 
    +1061                 mm2+= mm0*sbx + mm1*sby;
    +1062                 mm5+= mm3*sbx + mm4*sby;
    +1063 
    +1064                 mm0= mm0*this.sb_scaleX;
    +1065                 mm1= mm1*this.sb_scaleY;
    +1066                 mm3= mm3*this.sb_scaleX;
    +1067                 mm4= mm4*this.sb_scaleY;
    +1068 
    +1069                 mm2+= -mm0*sbx - mm1*sby;
    +1070                 mm5+= -mm3*sbx - mm4*sby;
    +1071             }
    +1072 
    +1073             mm[0]= mm0;
    +1074             mm[1]= mm1;
    +1075             mm[2]= mm2;
    +1076             mm[3]= mm3;
    +1077             mm[4]= mm4;
    +1078             mm[5]= mm5;
    +1079 
    +1080             return this;
    +1081 
    +1082         },
    +1083 
    +1084         setRotationAnchored : function( angle, rx, ry ) {
    +1085             this.rb_angle=          angle;
    +1086             this.rb_rotateAnchorX=  rx;
    +1087             this.rb_rotateAnchorY=  ry;
    +1088             return this;
    +1089         },
    +1090 
    +1091         setRotationAnchor : function( ax, ay ) {
    +1092             this.rb_rotateAnchorX= ax;
    +1093             this.rb_rotateAnchorY= ay;
    +1094         },
    +1095 
    +1096         setRotation : function( angle ) {
    +1097             this.rb_angle= angle;
    +1098         },
    +1099 
    +1100         setScaleAnchored : function( scaleX, scaleY, sx, sy ) {
    +1101             this.sb_scaleX= scaleX;
    +1102             this.sb_scaleAnchorX= sx;
    +1103             this.sb_scaleY= scaleY;
    +1104             this.sb_scaleAnchorY= sy;
    +1105             return this;
    +1106         },
    +1107 
    +1108         setScale : function( sx, sy ) {
    +1109             this.sb_scaleX= sx;
    +1110             this.sb_scaleY= sy;
    +1111             return this;
    +1112         },
    +1113 
    +1114         setScaleAnchor : function( ax, ay ) {
    +1115             this.sb_scaleAnchorX= ax;
    +1116             this.sb_scaleAnchorY= ay;
    +1117             return this;
    +1118         },
    +1119 
    +1120         setPositionAnchor : function( ax, ay ) {
    +1121             this.tAnchorX= ax;
    +1122             this.tAnchorY= ay;
    +1123             return this;
    +1124         },
    +1125 
    +1126         setPositionAnchored : function( x,y,ax,ay ) {
    +1127             this.tb_x= x;
    +1128             this.tb_y= y;
    +1129             this.tAnchorX= ax;
    +1130             this.tAnchorY= ay;
    +1131             return this;
    +1132         },
    +1133 
    +1134         setPosition : function( x,y ) {
    +1135             this.tb_x= x;
    +1136             this.tb_y= y;
    +1137             return this;
    +1138         },
    +1139 
    +1140         setLocation : function( x, y ) {
    +1141             this.tb_x= x;
    +1142             this.tb_y= y;
    +1143             return this;
    +1144         },
    +1145 
    +1146         flatten : function( npatches, closed ) {
    +1147             var point= this.getPositionFromLength(0);
    +1148             var path= new CAAT.PathUtil.Path().beginPath( point.x, point.y );
    +1149             for( var i=0; i<npatches; i++ ) {
    +1150                 point= this.getPositionFromLength(i/npatches*this.length);
    +1151                 path.addLineTo( point.x, point.y  );
    +1152             }
    +1153             if ( closed) {
    +1154                 path.closePath();
    +1155             } else {
    +1156                 path.endPath();
    +1157             }
    +1158 
    +1159             return path;
    +1160         }
    +1161 
    +1162     }
    +1163 	
    +1164 });
    +1165 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_PathSegment.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_PathSegment.js.html new file mode 100644 index 00000000..631e91d5 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_PathSegment.js.html @@ -0,0 +1,220 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  * These classes encapsulate different kinds of paths.
    +  5  * LinearPath, defines an straight line path, just 2 points.
    +  6  * CurvePath, defines a path based on a Curve. Curves can be bezier quadric/cubic and catmull-rom.
    +  7  * Path, is a general purpose class, which composes a path of different path segments (Linear or Curve paths).
    +  8  *
    +  9  * A path, has an interpolator which stablish the way the path is traversed (accelerating, by
    + 10  * easing functions, etc.). Normally, interpolators will be defined by CAAT.Behavior.Interpolator instances, but
    + 11  * general Paths could be used as well.
    + 12  *
    + 13  **/
    + 14 
    + 15 
    + 16 CAAT.Module({
    + 17 
    + 18     /**
    + 19      * @name PathUtil
    + 20      * @memberOf CAAT
    + 21      * @namespace
    + 22      */
    + 23 
    + 24     /**
    + 25      * @name PathSegment
    + 26      * @memberOf CAAT.PathUtil
    + 27      * @constructor
    + 28      */
    + 29 
    + 30     defines:"CAAT.PathUtil.PathSegment",
    + 31     depends:[
    + 32         "CAAT.Math.Rectangle",
    + 33         "CAAT.Math.Point",
    + 34         "CAAT.Math.Matrix",
    + 35         "CAAT.Math.Curve"
    + 36     ],
    + 37     extendsWith:function () {
    + 38         return {
    + 39 
    + 40             /**
    + 41              * @lends CAAT.PathUtil.PathSegment.prototype
    + 42              */
    + 43 
    + 44 
    + 45             __init:function () {
    + 46                 this.bbox = new CAAT.Math.Rectangle();
    + 47                 return this;
    + 48             },
    + 49 
    + 50             /**
    + 51              * Color to draw the segment.
    + 52              */
    + 53             color:'#000',
    + 54 
    + 55             /**
    + 56              * Segment length.
    + 57              */
    + 58             length:0,
    + 59 
    + 60             /**
    + 61              * Segment bounding box.
    + 62              */
    + 63             bbox:null,
    + 64 
    + 65             /**
    + 66              * Path this segment belongs to.
    + 67              */
    + 68             parent:null,
    + 69 
    + 70             /**
    + 71              * Set a PathSegment's parent
    + 72              * @param parent
    + 73              */
    + 74             setParent:function (parent) {
    + 75                 this.parent = parent;
    + 76                 return this;
    + 77             },
    + 78             setColor:function (color) {
    + 79                 if (color) {
    + 80                     this.color = color;
    + 81                 }
    + 82                 return this;
    + 83             },
    + 84             /**
    + 85              * Get path's last coordinate.
    + 86              * @return {CAAT.Point}
    + 87              */
    + 88             endCurvePosition:function () {
    + 89             },
    + 90 
    + 91             /**
    + 92              * Get path's starting coordinate.
    + 93              * @return {CAAT.Point}
    + 94              */
    + 95             startCurvePosition:function () {
    + 96             },
    + 97 
    + 98             /**
    + 99              * Set this path segment's points information.
    +100              * @param points {Array<CAAT.Point>}
    +101              */
    +102             setPoints:function (points) {
    +103             },
    +104 
    +105             /**
    +106              * Set a point from this path segment.
    +107              * @param point {CAAT.Point}
    +108              * @param index {integer} a point index.
    +109              */
    +110             setPoint:function (point, index) {
    +111             },
    +112 
    +113             /**
    +114              * Get a coordinate on path.
    +115              * The parameter time is normalized, that is, its values range from zero to one.
    +116              * zero will mean <code>startCurvePosition</code> and one will be <code>endCurvePosition</code>. Other values
    +117              * will be a position on the path relative to the path length. if the value is greater that 1, if will be set
    +118              * to modulus 1.
    +119              * @param time a float with a value between zero and 1 inclusive both.
    +120              *
    +121              * @return {CAAT.Point}
    +122              */
    +123             getPosition:function (time) {
    +124             },
    +125 
    +126             /**
    +127              * Gets Path length.
    +128              * @return {number}
    +129              */
    +130             getLength:function () {
    +131                 return this.length;
    +132             },
    +133 
    +134             /**
    +135              * Gets the path bounding box (or the rectangle that contains the whole path).
    +136              * @param rectangle a CAAT.Rectangle instance with the bounding box.
    +137              * @return {CAAT.Rectangle}
    +138              */
    +139             getBoundingBox:function () {
    +140                 return this.bbox;
    +141             },
    +142 
    +143             /**
    +144              * Gets the number of control points needed to create the path.
    +145              * Each PathSegment type can have different control points.
    +146              * @return {number} an integer with the number of control points.
    +147              */
    +148             numControlPoints:function () {
    +149             },
    +150 
    +151             /**
    +152              * Gets CAAT.Point instance with the 2d position of a control point.
    +153              * @param index an integer indicating the desired control point coordinate.
    +154              * @return {CAAT.Point}
    +155              */
    +156             getControlPoint:function (index) {
    +157             },
    +158 
    +159             /**
    +160              * Instruments the path has finished building, and that no more segments will be added to it.
    +161              * You could later add more PathSegments and <code>endPath</code> must be called again.
    +162              */
    +163             endPath:function () {
    +164             },
    +165 
    +166             /**
    +167              * Gets a polyline describing the path contour. The contour will be defined by as mush as iSize segments.
    +168              * @param iSize an integer indicating the number of segments of the contour polyline.
    +169              *
    +170              * @return {[CAAT.Point]}
    +171              */
    +172             getContour:function (iSize) {
    +173             },
    +174 
    +175             /**
    +176              * Recalculate internal path structures.
    +177              */
    +178             updatePath:function (point) {
    +179             },
    +180 
    +181             /**
    +182              * Draw this path using RenderingContext2D drawing primitives.
    +183              * The intention is to set a path or pathsegment as a clipping region.
    +184              *
    +185              * @param ctx {RenderingContext2D}
    +186              */
    +187             applyAsPath:function (director) {
    +188             },
    +189 
    +190             /**
    +191              * Transform this path with the given affinetransform matrix.
    +192              * @param matrix
    +193              */
    +194             transform:function (matrix) {
    +195             },
    +196 
    +197             drawHandle:function (ctx, x, y) {
    +198 
    +199                 ctx.beginPath();
    +200                 ctx.arc(
    +201                     x,
    +202                     y,
    +203                     CAAT.Math.Curve.prototype.HANDLE_SIZE / 2,
    +204                     0,
    +205                     2 * Math.PI,
    +206                     false);
    +207                 ctx.fill();
    +208             }
    +209         }
    +210     }
    +211 
    +212 });
    +213 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_RectPath.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_RectPath.js.html new file mode 100644 index 00000000..5b08db4f --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_RectPath.js.html @@ -0,0 +1,328 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * @name RectPath
    +  5      * @memberOf CAAT.PathUtil
    +  6      * @extends CAAT.PathUtil.PathSegment
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines:"CAAT.PathUtil.RectPath",
    + 11     depends:[
    + 12         "CAAT.PathUtil.PathSegment",
    + 13         "CAAT.Math.Point",
    + 14         "CAAT.Math.Rectangle"
    + 15     ],
    + 16     aliases:["CAAT.RectPath", "CAAT.ShapePath"],
    + 17     extendsClass:"CAAT.PathUtil.PathSegment",
    + 18     extendsWith:function () {
    + 19 
    + 20         return {
    + 21 
    + 22             /**
    + 23              * @lends CAAT.PathUtil.RectPath.prototype
    + 24              */
    + 25 
    + 26             __init:function () {
    + 27                 this.__super();
    + 28 
    + 29                 this.points = [];
    + 30                 this.points.push(new CAAT.Math.Point());
    + 31                 this.points.push(new CAAT.Math.Point());
    + 32                 this.points.push(new CAAT.Math.Point());
    + 33                 this.points.push(new CAAT.Math.Point());
    + 34                 this.points.push(new CAAT.Math.Point());
    + 35 
    + 36                 this.newPosition = new CAAT.Math.Point();
    + 37 
    + 38                 return this;
    + 39             },
    + 40 
    + 41             /**
    + 42              * A collection of Points.
    + 43              * @type {Array.<CAAT.Math.Point>}
    + 44              */
    + 45             points:null,
    + 46 
    + 47             /**
    + 48              * Traverse this path clockwise or counterclockwise (false).
    + 49              */
    + 50             cw:true,
    + 51 
    + 52             /**
    + 53              * spare point for calculations
    + 54              */
    + 55             newPosition:null,
    + 56 
    + 57             applyAsPath:function (director) {
    + 58                 var ctx = director.ctx;
    + 59 
    + 60                 if (this.cw) {
    + 61                     ctx.lineTo(this.points[0].x, this.points[0].y);
    + 62                     ctx.lineTo(this.points[1].x, this.points[1].y);
    + 63                     ctx.lineTo(this.points[2].x, this.points[2].y);
    + 64                     ctx.lineTo(this.points[3].x, this.points[3].y);
    + 65                     ctx.lineTo(this.points[4].x, this.points[4].y);
    + 66                 } else {
    + 67                     ctx.lineTo(this.points[4].x, this.points[4].y);
    + 68                     ctx.lineTo(this.points[3].x, this.points[3].y);
    + 69                     ctx.lineTo(this.points[2].x, this.points[2].y);
    + 70                     ctx.lineTo(this.points[1].x, this.points[1].y);
    + 71                     ctx.lineTo(this.points[0].x, this.points[0].y);
    + 72                 }
    + 73                 return this;
    + 74             },
    + 75             setPoint:function (point, index) {
    + 76                 if (index >= 0 && index < this.points.length) {
    + 77                     this.points[index] = point;
    + 78                 }
    + 79             },
    + 80             /**
    + 81              * An array of {CAAT.Point} composed of two points.
    + 82              * @param points {Array<CAAT.Point>}
    + 83              */
    + 84             setPoints:function (points) {
    + 85                 this.points = [];
    + 86                 this.points.push(points[0]);
    + 87                 this.points.push(new CAAT.Math.Point().set(points[1].x, points[0].y));
    + 88                 this.points.push(points[1]);
    + 89                 this.points.push(new CAAT.Math.Point().set(points[0].x, points[1].y));
    + 90                 this.points.push(points[0].clone());
    + 91                 this.updatePath();
    + 92 
    + 93                 return this;
    + 94             },
    + 95             setClockWise:function (cw) {
    + 96                 this.cw = cw !== undefined ? cw : true;
    + 97                 return this;
    + 98             },
    + 99             isClockWise:function () {
    +100                 return this.cw;
    +101             },
    +102             /**
    +103              * Set this path segment's starting position.
    +104              * This method should not be called again after setFinalPosition has been called.
    +105              * @param x {number}
    +106              * @param y {number}
    +107              */
    +108             setInitialPosition:function (x, y) {
    +109                 for (var i = 0, l = this.points.length; i < l; i++) {
    +110                     this.points[i].x = x;
    +111                     this.points[i].y = y;
    +112                 }
    +113                 return this;
    +114             },
    +115             /**
    +116              * Set a rectangle from points[0] to (finalX, finalY)
    +117              * @param finalX {number}
    +118              * @param finalY {number}
    +119              */
    +120             setFinalPosition:function (finalX, finalY) {
    +121                 this.points[2].x = finalX;
    +122                 this.points[2].y = finalY;
    +123 
    +124                 this.points[1].x = finalX;
    +125                 this.points[1].y = this.points[0].y;
    +126 
    +127                 this.points[3].x = this.points[0].x;
    +128                 this.points[3].y = finalY;
    +129 
    +130                 this.points[4].x = this.points[0].x;
    +131                 this.points[4].y = this.points[0].y;
    +132 
    +133                 this.updatePath();
    +134                 return this;
    +135             },
    +136             /**
    +137              * @inheritDoc
    +138              */
    +139             endCurvePosition:function () {
    +140                 return this.points[4];
    +141             },
    +142             /**
    +143              * @inheritsDoc
    +144              */
    +145             startCurvePosition:function () {
    +146                 return this.points[0];
    +147             },
    +148             /**
    +149              * @inheritsDoc
    +150              */
    +151             getPosition:function (time) {
    +152 
    +153                 if (time > 1 || time < 0) {
    +154                     time %= 1;
    +155                 }
    +156                 if (time < 0) {
    +157                     time = 1 + time;
    +158                 }
    +159 
    +160                 if (-1 === this.length) {
    +161                     this.newPosition.set(0, 0);
    +162                 } else {
    +163                     var w = this.bbox.width / this.length;
    +164                     var h = this.bbox.height / this.length;
    +165                     var accTime = 0;
    +166                     var times;
    +167                     var segments;
    +168                     var index = 0;
    +169 
    +170                     if (this.cw) {
    +171                         segments = [0, 1, 2, 3, 4];
    +172                         times = [w, h, w, h];
    +173                     } else {
    +174                         segments = [4, 3, 2, 1, 0];
    +175                         times = [h, w, h, w];
    +176                     }
    +177 
    +178                     while (index < times.length) {
    +179                         if (accTime + times[index] < time) {
    +180                             accTime += times[index];
    +181                             index++;
    +182                         } else {
    +183                             break;
    +184                         }
    +185                     }
    +186                     time -= accTime;
    +187 
    +188                     var p0 = segments[index];
    +189                     var p1 = segments[index + 1];
    +190 
    +191                     // index tiene el indice del segmento en tiempo.
    +192                     this.newPosition.set(
    +193                         (this.points[p0].x + (this.points[p1].x - this.points[p0].x) * time / times[index]),
    +194                         (this.points[p0].y + (this.points[p1].y - this.points[p0].y) * time / times[index]));
    +195                 }
    +196 
    +197                 return this.newPosition;
    +198             },
    +199             /**
    +200              * Returns initial path segment point's x coordinate.
    +201              * @return {number}
    +202              */
    +203             initialPositionX:function () {
    +204                 return this.points[0].x;
    +205             },
    +206             /**
    +207              * Returns final path segment point's x coordinate.
    +208              * @return {number}
    +209              */
    +210             finalPositionX:function () {
    +211                 return this.points[2].x;
    +212             },
    +213             /**
    +214              * Draws this path segment on screen. Optionally it can draw handles for every control point, in
    +215              * this case, start and ending path segment points.
    +216              * @param director {CAAT.Director}
    +217              * @param bDrawHandles {boolean}
    +218              */
    +219             paint:function (director, bDrawHandles) {
    +220 
    +221                 var ctx = director.ctx;
    +222 
    +223                 ctx.save();
    +224 
    +225                 ctx.strokeStyle = this.color;
    +226                 ctx.beginPath();
    +227                 ctx.strokeRect(
    +228                     this.bbox.x, this.bbox.y,
    +229                     this.bbox.width, this.bbox.height);
    +230 
    +231                 if (bDrawHandles) {
    +232                     ctx.globalAlpha = 0.5;
    +233                     ctx.fillStyle = '#7f7f00';
    +234 
    +235                     for (var i = 0; i < this.points.length; i++) {
    +236                         this.drawHandle(ctx, this.points[i].x, this.points[i].y);
    +237                     }
    +238 
    +239                 }
    +240 
    +241                 ctx.restore();
    +242             },
    +243             /**
    +244              * Get the number of control points. For this type of path segment, start and
    +245              * ending path segment points. Defaults to 2.
    +246              * @return {number}
    +247              */
    +248             numControlPoints:function () {
    +249                 return this.points.length;
    +250             },
    +251             /**
    +252              * @inheritsDoc
    +253              */
    +254             getControlPoint:function (index) {
    +255                 return this.points[index];
    +256             },
    +257             /**
    +258              * @inheritsDoc
    +259              */
    +260             getContour:function (/*iSize*/) {
    +261                 var contour = [];
    +262 
    +263                 for (var i = 0; i < this.points.length; i++) {
    +264                     contour.push(this.points[i]);
    +265                 }
    +266 
    +267                 return contour;
    +268             },
    +269             updatePath:function (point) {
    +270 
    +271                 if (point) {
    +272                     if (point === this.points[0]) {
    +273                         this.points[1].y = point.y;
    +274                         this.points[3].x = point.x;
    +275                     } else if (point === this.points[1]) {
    +276                         this.points[0].y = point.y;
    +277                         this.points[2].x = point.x;
    +278                     } else if (point === this.points[2]) {
    +279                         this.points[3].y = point.y;
    +280                         this.points[1].x = point.x;
    +281                     } else if (point === this.points[3]) {
    +282                         this.points[0].x = point.x;
    +283                         this.points[2].y = point.y;
    +284                     }
    +285                     this.points[4].x = this.points[0].x;
    +286                     this.points[4].y = this.points[0].y;
    +287                 }
    +288 
    +289                 this.bbox.setEmpty();
    +290 
    +291                 for (var i = 0; i < 4; i++) {
    +292                     this.bbox.union(this.points[i].x, this.points[i].y);
    +293                 }
    +294 
    +295                 this.length = 2 * this.bbox.width + 2 * this.bbox.height;
    +296 
    +297                 this.points[0].x = this.bbox.x;
    +298                 this.points[0].y = this.bbox.y;
    +299 
    +300                 this.points[1].x = this.bbox.x + this.bbox.width;
    +301                 this.points[1].y = this.bbox.y;
    +302 
    +303                 this.points[2].x = this.bbox.x + this.bbox.width;
    +304                 this.points[2].y = this.bbox.y + this.bbox.height;
    +305 
    +306                 this.points[3].x = this.bbox.x;
    +307                 this.points[3].y = this.bbox.y + this.bbox.height;
    +308 
    +309                 this.points[4].x = this.bbox.x;
    +310                 this.points[4].y = this.bbox.y;
    +311 
    +312                 return this;
    +313             },
    +314 
    +315             getPositionFromLength:function (iLength) {
    +316                 return this.getPosition(iLength / (this.bbox.width * 2 + this.bbox.height * 2));
    +317             }
    +318         }
    +319     }
    +320 });
    +321 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_SVGPath.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_SVGPath.js.html new file mode 100644 index 00000000..e3853808 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_PathUtil_SVGPath.js.html @@ -0,0 +1,493 @@ +
      1 CAAT.Module({
    +  2 
    +  3     /**
    +  4      * <p>
    +  5      * This class is a SVG Path parser.
    +  6      * By calling the method parsePath( svgpath ) an instance of CAAT.PathUtil.Path will be built by parsing
    +  7      * its contents.
    +  8      *
    +  9      * <p>
    + 10      * See <a href="../../demos/demo32/svgpath.html">demo32</a>
    + 11      *
    + 12      * @name SVGPath
    + 13      * @memberOf CAAT.PathUtil
    + 14      * @constructor
    + 15      */
    + 16 
    + 17     defines:"CAAT.PathUtil.SVGPath",
    + 18     depends:[
    + 19         "CAAT.PathUtil.Path"
    + 20     ],
    + 21     extendsWith:function () {
    + 22 
    + 23         var OK = 0;
    + 24         var EOF = 1;
    + 25         var NAN = 2;
    + 26 
    + 27         function error(pathInfo, c) {
    + 28             var cpos = c;
    + 29             if (cpos < 0) {
    + 30                 cpos = 0;
    + 31             }
    + 32             console.log("parse error near ..." + pathInfo.substr(cpos, 20));
    + 33         }
    + 34 
    + 35         return {
    + 36 
    + 37             /**
    + 38              * @lends CAAT.PathUtil.SVGPath.prototype
    + 39              */
    + 40 
    + 41 
    + 42             __init:function () {
    + 43 
    + 44             },
    + 45 
    + 46             /**
    + 47              * @private
    + 48              */
    + 49             c:0,
    + 50 
    + 51             /**
    + 52              * @private
    + 53              */
    + 54             bezierInfo:null,
    + 55 
    + 56             __skipBlank:function (pathInfo, c) {
    + 57                 var p = pathInfo.charAt(c);
    + 58                 while (c < pathInfo.length && (p == ' ' || p == '\n' || p == '\t' || p == ',')) {
    + 59                     ++c;
    + 60                     var p = pathInfo.charAt(c);
    + 61                 }
    + 62 
    + 63                 return c;
    + 64             },
    + 65 
    + 66             __maybeNumber:function (pathInfo, c) {
    + 67 
    + 68                 if (c < pathInfo.length - 2) {
    + 69 
    + 70                     var p = pathInfo.charAt(c);
    + 71                     var p1 = pathInfo.charAt(c + 1);
    + 72 
    + 73                     return  p == '-' ||
    + 74                         this.__isDigit(p) ||
    + 75                         (p === "." && this.__isDigit(p1) );
    + 76                 }
    + 77 
    + 78                 return false;
    + 79             },
    + 80 
    + 81             __isDigit:function (c) {
    + 82                 return c >= "0" && c <= "9";
    + 83             },
    + 84 
    + 85 
    + 86             __getNumber:function (pathInfo, c, v, error) {
    + 87                 c = this.__skipBlank(pathInfo, c);
    + 88                 if (c < pathInfo.length) {
    + 89                     var nc = this.__findNumber(pathInfo, c);
    + 90                     if (nc !== -1) {
    + 91                         v.push(parseFloat(pathInfo.substr(c, nc)));
    + 92                         c = this.__skipBlank(pathInfo, nc);
    + 93                         error.pos = c;
    + 94                         error.result = OK;
    + 95                         return;
    + 96                     } else {
    + 97                         error.result = NAN;
    + 98                         return;
    + 99                     }
    +100                 }
    +101 
    +102                 error.result = EOF;
    +103             },
    +104 
    +105             ____getNumbers:function (pathInfo, c, v, n, error) {
    +106 
    +107                 for (var i = 0; i < n; i++) {
    +108                     this.__getNumber(pathInfo, c, v, error);
    +109                     if (error.result != OK) {
    +110                         break;
    +111                     } else {
    +112                         c = error.pos;
    +113                     }
    +114                 }
    +115 
    +116                 return c;
    +117             },
    +118 
    +119 
    +120             __findNumber:function (pathInfo, c) {
    +121 
    +122                 var p;
    +123 
    +124                 if ((p = pathInfo.charAt(c)) == '-') {
    +125                     ++c;
    +126                 }
    +127 
    +128                 if (!this.__isDigit((p = pathInfo.charAt(c)))) {
    +129                     if ((p = pathInfo.charAt(c)) != '.' || !this.__isDigit(pathInfo.charAt(c + 1))) {
    +130                         return -1;
    +131                     }
    +132                 }
    +133 
    +134                 while (this.__isDigit((p = pathInfo.charAt(c)))) {
    +135                     ++c;
    +136                 }
    +137 
    +138                 if ((p = pathInfo.charAt(c)) == '.') {
    +139                     ++c;
    +140                     if (!this.__isDigit((p = pathInfo.charAt(c)))) {   // asumo un numero [d+]\. como valido.
    +141                         return c;
    +142                     }
    +143                     while (this.__isDigit((p = pathInfo.charAt(c)))) {
    +144                         ++c;
    +145                     }
    +146                 }
    +147 
    +148                 return c;
    +149             },
    +150 
    +151             __parseMoveTo:function (pathInfo, c, absolute, path, error) {
    +152 
    +153                 var numbers = [];
    +154 
    +155                 c = this.____getNumbers(pathInfo, c, numbers, 2, error);
    +156 
    +157                 if (error.result === OK) {
    +158                     if (!absolute) {
    +159                         numbers[0] += path.trackPathX;
    +160                         numbers[1] += path.trackPathY;
    +161                     }
    +162                     path.beginPath(numbers[0], numbers[1]);
    +163                 } else {
    +164                     return;
    +165                 }
    +166 
    +167                 if (this.__maybeNumber(pathInfo, c)) {
    +168                     c = this.parseLine(pathInfo, c, absolute, path, error);
    +169                 }
    +170 
    +171                 error.pos = c;
    +172             },
    +173 
    +174             __parseLine:function (pathInfo, c, absolute, path, error) {
    +175 
    +176                 var numbers = [];
    +177 
    +178                 do {
    +179                     c = this.____getNumbers(pathInfo, c, numbers, 2, error);
    +180                     if (!absolute) {
    +181                         numbers[0] += path.trackPathX;
    +182                         numbers[1] += path.trackPathY;
    +183                     }
    +184                     path.addLineTo(numbers[0], numbers[1]);
    +185 
    +186                 } while (this.__maybeNumber(pathInfo, c));
    +187 
    +188                 error.pos = c;
    +189             },
    +190 
    +191 
    +192             __parseLineH:function (pathInfo, c, absolute, path, error) {
    +193 
    +194                 var numbers = [];
    +195 
    +196                 do {
    +197                     c = this.____getNumbers(pathInfo, c, numbers, 1, error);
    +198 
    +199                     if (!absolute) {
    +200                         numbers[0] += path.trackPathX;
    +201                     }
    +202                     numbers[1].push(path.trackPathY);
    +203 
    +204                     path.addLineTo(numbers[0], numbers[1]);
    +205 
    +206                 } while (this.__maybeNumber(pathInfo, c));
    +207 
    +208                 error.pos = c;
    +209             },
    +210 
    +211             __parseLineV:function (pathInfo, c, absolute, path, error) {
    +212 
    +213                 var numbers = [ path.trackPathX ];
    +214 
    +215                 do {
    +216                     c = this.____getNumbers(pathInfo, c, numbers, 1, error);
    +217 
    +218                     if (!absolute) {
    +219                         numbers[1] += path.trackPathY;
    +220                     }
    +221 
    +222                     path.addLineTo(numbers[0], numbers[1]);
    +223 
    +224                 } while (this.__maybeNumber(pathInfo, c));
    +225 
    +226                 error.pos = c;
    +227             },
    +228 
    +229             __parseCubic:function (pathInfo, c, absolute, path, error) {
    +230 
    +231                 var v = [];
    +232 
    +233                 do {
    +234                     c = this.____getNumbers(pathInfo, c, v, 6, error);
    +235                     if (error.result === OK) {
    +236                         if (!absolute) {
    +237                             v[0] += path.trackPathX;
    +238                             v[1] += path.trackPathY;
    +239                             v[2] += path.trackPathX;
    +240                             v[3] += path.trackPathY;
    +241                             v[4] += path.trackPathX;
    +242                             v[5] += path.trackPathY;
    +243                         }
    +244 
    +245                         path.addCubicTo(v[0], v[1], v[2], v[3], v[4], v[5]);
    +246 
    +247 
    +248                         v.shift();
    +249                         v.shift();
    +250                         this.bezierInfo = v;
    +251 
    +252                     } else {
    +253                         return;
    +254                     }
    +255                 } while (this.__maybeNumber(pathInfo, c));
    +256 
    +257                 error.pos = c;
    +258             },
    +259 
    +260             __parseCubicS:function (pathInfo, c, absolute, path, error) {
    +261 
    +262                 var v = [];
    +263 
    +264                 do {
    +265                     c = this.____getNumbers(pathInfo, c, v, 4, error);
    +266                     if (error.result == OK) {
    +267                         if (!absolute) {
    +268 
    +269                             v[0] += path.trackPathX;
    +270                             v[1] += path.trackPathY;
    +271                             v[2] += path.trackPathX;
    +272                             v[3] += path.trackPathY;
    +273                         }
    +274 
    +275                         var x, y;
    +276 
    +277                         x = this.bezierInfo[2] + (this.bezierInfo[2] - this.bezierInfo[0]);
    +278                         y = this.bezierInfo[3] + (this.bezierInfo[3] - this.bezierInfo[1]);
    +279 
    +280                         path.addCubicTo(x, y, v[0], v[1], v[2], v[3]);
    +281 
    +282                         this.bezierInfo = v;
    +283 
    +284                     } else {
    +285                         return;
    +286                     }
    +287                 } while (this.__maybeNumber(c));
    +288 
    +289                 error.pos = c;
    +290             },
    +291 
    +292             __parseQuadricS:function (pathInfo, c, absolute, path, error) {
    +293 
    +294                 var v = [];
    +295 
    +296                 do {
    +297                     c = this.____getNumbers(pathInfo, c, v, 4, error);
    +298                     if (error.result === OK) {
    +299 
    +300                         if (!absolute) {
    +301 
    +302                             v[0] += path.trackPathX;
    +303                             v[1] += path.trackPathY;
    +304                         }
    +305 
    +306                         var x, y;
    +307 
    +308                         x = this.bezierInfo[2] + (this.bezierInfo[2] - this.bezierInfo[0]);
    +309                         y = this.bezierInfo[3] + (this.bezierInfo[3] - this.bezierInfo[1]);
    +310 
    +311                         path.addQuadricTo(x, y, v[0], v[1]);
    +312 
    +313                         this.bezierInfo = [];
    +314                         bezierInfo.push(x);
    +315                         bezierInfo.push(y);
    +316                         bezierInfo.push(v[0]);
    +317                         bezierInfo.push(v[1]);
    +318 
    +319 
    +320                     } else {
    +321                         return;
    +322                     }
    +323                 } while (this.__maybeNumber(c));
    +324 
    +325                 error.pos = c;
    +326             },
    +327 
    +328 
    +329             __parseQuadric:function (pathInfo, c, absolute, path, error) {
    +330 
    +331                 var v = [];
    +332 
    +333                 do {
    +334                     c = this.____getNumbers(pathInfo, c, v, 4, error);
    +335                     if (error.result === OK) {
    +336                         if (!absolute) {
    +337 
    +338                             v[0] += path.trackPathX;
    +339                             v[1] += path.trackPathY;
    +340                             v[2] += path.trackPathX;
    +341                             v[3] += path.trackPathY;
    +342                         }
    +343 
    +344                         path.addQuadricTo(v[0], v[1], v[2], v[3]);
    +345 
    +346                         this.bezierInfo = v;
    +347                     } else {
    +348                         return;
    +349                     }
    +350                 } while (this.__maybeNumber(c));
    +351 
    +352                 error.pos = c;
    +353             },
    +354 
    +355             __parseClosePath:function (pathInfo, c, path, error) {
    +356 
    +357                 path.closePath();
    +358                 error.pos= c;
    +359 
    +360             },
    +361 
    +362             /**
    +363              * This method will create a CAAT.PathUtil.Path object with as many contours as needed.
    +364              * @param pathInfo {string} a SVG path
    +365              * @return Array.<CAAT.PathUtil.Path>
    +366              */
    +367             parsePath:function (pathInfo) {
    +368 
    +369                 this.c = 0;
    +370                 this.contours= [];
    +371 
    +372                 var path = new CAAT.PathUtil.Path();
    +373                 this.contours.push( path );
    +374 
    +375                 this.c = this.__skipBlank(pathInfo, this.c);
    +376                 if (this.c === pathInfo.length) {
    +377                     return path;
    +378                 }
    +379 
    +380                 var ret = {
    +381                     pos:0,
    +382                     result:0
    +383                 }
    +384 
    +385                 while (this.c != pathInfo.length) {
    +386                     var segment = pathInfo.charAt(this.c);
    +387                     switch (segment) {
    +388                         case 'm':
    +389                             this.__parseMoveTo(pathInfo, this.c + 1, false, path, ret);
    +390                             break;
    +391                         case 'M':
    +392                             this.__parseMoveTo(pathInfo, this.c + 1, true, path, ret);
    +393                             break;
    +394                         case 'c':
    +395                             this.__parseCubic(pathInfo, this.c + 1, false, path, ret);
    +396                             break;
    +397                         case 'C':
    +398                             this.__parseCubic(pathInfo, this.c + 1, true, path, ret);
    +399                             break;
    +400                         case 's':
    +401                             this.__parseCubicS(pathInfo, this.c + 1, false, path, ret);
    +402                             break;
    +403                         case 'S':
    +404                             this.__parseCubicS(pathInfo, this.c + 1, true, path, ret);
    +405                             break;
    +406                         case 'q':
    +407                             this.__parseQuadric(pathInfo, this.c + 1, false, path, ret);
    +408                             break;
    +409                         case 'Q':
    +410                             this.__parseQuadricS(pathInfo, this.c + 1, true, path, ret);
    +411                             break;
    +412                         case 't':
    +413                             this.__parseQuadricS(pathInfo, this.c + 1, false, path, ret);
    +414                             break;
    +415                         case 'T':
    +416                             this.__parseQuadric(pathInfo, this.c + 1, true, path, ret);
    +417                             break;
    +418                         case 'l':
    +419                             this.__parseLine(pathInfo, this.c + 1, false, path, ret);
    +420                             break;
    +421                         case 'L':
    +422                             this.__parseLine(pathInfo, this.c + 1, true, path, ret);
    +423                             break;
    +424                         case 'h':
    +425                             this.__parseLineH(pathInfo, this.c + 1, false, path, ret);
    +426                             break;
    +427                         case 'H':
    +428                             this.__parseLineH(pathInfo, this.c + 1, true, path, ret);
    +429                             break;
    +430                         case 'v':
    +431                             this.__parseLineV(pathInfo, this.c + 1, false, path, ret);
    +432                             break;
    +433                         case 'V':
    +434                             this.__parseLineV(pathInfo, this.c + 1, true, path, ret);
    +435                             break;
    +436                         case 'z':
    +437                         case 'Z':
    +438                             this.__parseClosePath(pathInfo, this.c + 1, path, ret);
    +439                             path= new CAAT.PathUtil.Path();
    +440                             this.contours.push( path );
    +441                             break;
    +442                         case 0:
    +443                             break;
    +444                         default:
    +445                             error(pathInfo, this.c);
    +446                             break;
    +447                     }
    +448 
    +449                     if (ret.result != OK) {
    +450                         error(pathInfo, this.c);
    +451                         break;
    +452                     } else {
    +453                         this.c = ret.pos;
    +454                     }
    +455 
    +456                 } // while
    +457 
    +458                 var count= 0;
    +459                 var fpath= null;
    +460                 for( var i=0; i<this.contours.length; i++ ) {
    +461                     if ( !this.contours[i].isEmpty() ) {
    +462                         fpath= this.contours[i];
    +463                         if ( !fpath.closed ) {
    +464                             fpath.endPath();
    +465                         }
    +466                         count++;
    +467                     }
    +468                 }
    +469 
    +470                 if ( count===1 ) {
    +471                     return fpath;
    +472                 }
    +473 
    +474                 path= new CAAT.PathUtil.Path();
    +475                 for( var i=0; i<this.contours.length; i++ ) {
    +476                     if ( !this.contours[i].isEmpty() ) {
    +477                         path.addSegment( this.contours[i] );
    +478                     }
    +479                 }
    +480                 return path.endPath();
    +481 
    +482             }
    +483 
    +484         }
    +485     }
    +486 });
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_ColorProgram.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_ColorProgram.js.html new file mode 100644 index 00000000..a56daec6 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_ColorProgram.js.html @@ -0,0 +1,121 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name ColorProgram
    +  5      * @memberOf CAAT.WebGL
    +  6      * @extends CAAT.WebGL.Program
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.WebGL.ColorProgram",
    + 11     aliases : ["CAAT.ColorProgram"],
    + 12     extendsClass : "CAAT.WebGL.Program",
    + 13     depends : [
    + 14         "CAAT.WebGL.Program"
    + 15     ],
    + 16     extendsWith : {
    + 17 
    + 18         /**
    + 19          * @lends CAAT.WebGL.ColorProgram.prototype
    + 20          */
    + 21 
    + 22 
    + 23         __init : function(gl) {
    + 24             this.__super(gl);
    + 25             return this;
    + 26         },
    + 27 
    + 28         /**
    + 29          * int32 Array for color Buffer
    + 30          */
    + 31         colorBuffer:    null,
    + 32 
    + 33         /**
    + 34          * GLBuffer for vertex buffer.
    + 35          */
    + 36         vertexPositionBuffer:   null,
    + 37 
    + 38         /**
    + 39          * Float32 Array for vertex buffer.
    + 40          */
    + 41         vertexPositionArray:    null,
    + 42 
    + 43         getFragmentShader : function() {
    + 44             return this.getShader(this.gl, "x-shader/x-fragment",
    + 45                     "#ifdef GL_ES \n"+
    + 46                     "precision highp float; \n"+
    + 47                     "#endif \n"+
    + 48 
    + 49                     "varying vec4 color; \n"+
    + 50                             
    + 51                     "void main(void) { \n"+
    + 52                     "  gl_FragColor = color;\n"+
    + 53                     "}\n"
    + 54                     );
    + 55 
    + 56         },
    + 57         getVertexShader : function() {
    + 58             return this.getShader(this.gl, "x-shader/x-vertex",
    + 59                     "attribute vec3 aVertexPosition; \n"+
    + 60                     "attribute vec4 aColor; \n"+
    + 61                     "uniform mat4 uPMatrix; \n"+
    + 62                     "varying vec4 color; \n"+
    + 63 
    + 64                     "void main(void) { \n"+
    + 65                     "gl_Position = uPMatrix * vec4(aVertexPosition, 1.0); \n"+
    + 66                     "color= aColor; \n"+
    + 67                     "}\n"
    + 68                     );
    + 69         },
    + 70         initialize : function() {
    + 71             this.shaderProgram.vertexPositionAttribute =
    + 72                     this.gl.getAttribLocation(this.shaderProgram, "aVertexPosition");
    + 73             this.gl.enableVertexAttribArray(
    + 74                     this.shaderProgram.vertexPositionAttribute);
    + 75 
    + 76             this.shaderProgram.vertexColorAttribute =
    + 77                     this.gl.getAttribLocation(this.shaderProgram, "aColor");
    + 78             this.gl.enableVertexAttribArray(
    + 79                     this.shaderProgram.vertexColorAttribute);
    + 80 
    + 81             this.shaderProgram.pMatrixUniform =
    + 82                     this.gl.getUniformLocation(this.shaderProgram, "uPMatrix");
    + 83 
    + 84             this.useProgram();
    + 85 
    + 86             this.colorBuffer= this.gl.createBuffer();
    + 87             this.setColor( [1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1] );
    + 88 
    + 89             var maxTris=512, i;
    + 90             /// set vertex data
    + 91             this.vertexPositionBuffer = this.gl.createBuffer();
    + 92             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexPositionBuffer );
    + 93             this.vertexPositionArray= new Float32Array(maxTris*12);
    + 94             this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertexPositionArray, this.gl.DYNAMIC_DRAW);
    + 95             this.gl.vertexAttribPointer(this.shaderProgram.vertexPositionAttribute, 3, this.gl.FLOAT, false, 0, 0);
    + 96 
    + 97             return CAAT.ColorProgram.superclass.initialize.call(this);
    + 98         },
    + 99         setColor : function( colorArray ) {
    +100             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.colorBuffer );
    +101             this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(colorArray), this.gl.STATIC_DRAW);
    +102 
    +103             this.gl.vertexAttribPointer(
    +104                     this.shaderProgram.vertexColorAttribute,
    +105                     this.colorBuffer,
    +106                     this.gl.FLOAT,
    +107                     false,
    +108                     0,
    +109                     0);
    +110         }
    +111     }
    +112 
    +113 });
    +114 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_GLU.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_GLU.js.html new file mode 100644 index 00000000..24425635 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_GLU.js.html @@ -0,0 +1,101 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  *
    +  4  */
    +  5 CAAT.Module( {
    +  6 
    +  7     /**
    +  8      * @name GLU
    +  9      * @memberOf CAAT.WebGL
    + 10      * @namespace
    + 11      */
    + 12 
    + 13     defines : "CAAT.WebGL.GLU",
    + 14     depends : [
    + 15         "CAAT.Math.Matrix3"
    + 16     ],
    + 17     constants : {
    + 18 
    + 19         /**
    + 20          * @lends CAAT.WebGL.GLU
    + 21          */
    + 22 
    + 23         /**
    + 24          * Create a perspective matrix.
    + 25          *
    + 26          * @param fovy
    + 27          * @param aspect
    + 28          * @param znear
    + 29          * @param zfar
    + 30          * @param viewportHeight
    + 31          */
    + 32         makePerspective : function (fovy, aspect, znear, zfar, viewportHeight) {
    + 33             var ymax = znear * Math.tan(fovy * Math.PI / 360.0);
    + 34             var ymin = -ymax;
    + 35             var xmin = ymin * aspect;
    + 36             var xmax = ymax * aspect;
    + 37 
    + 38             return makeFrustum(xmin, xmax, ymin, ymax, znear, zfar, viewportHeight);
    + 39         },
    + 40 
    + 41         /**
    + 42          * Create a matrix for a frustum.
    + 43          *
    + 44          * @param left
    + 45          * @param right
    + 46          * @param bottom
    + 47          * @param top
    + 48          * @param znear
    + 49          * @param zfar
    + 50          * @param viewportHeight
    + 51          */
    + 52         makeFrustum : function (left, right, bottom, top, znear, zfar, viewportHeight) {
    + 53             var X = 2*znear/(right-left);
    + 54             var Y = 2*znear/(top-bottom);
    + 55             var A = (right+left)/(right-left);
    + 56             var B = (top+bottom)/(top-bottom);
    + 57             var C = -(zfar+znear)/(zfar-znear);
    + 58             var D = -2*zfar*znear/(zfar-znear);
    + 59 
    + 60             return new CAAT.Math.Matrix3().initWithMatrix(
    + 61                     [
    + 62                         [X,  0,  A, -viewportHeight/2 ],
    + 63                         [0, -Y,  B,  viewportHeight/2 ],
    + 64                         [0,  0,  C,                 D ],
    + 65                         [0,  0, -1,                 0 ]
    + 66                     ]);
    + 67         },
    + 68 
    + 69         /**
    + 70          * Create an orthogonal projection matrix.
    + 71          * @param left
    + 72          * @param right
    + 73          * @param bottom
    + 74          * @param top
    + 75          * @param znear
    + 76          * @param zfar
    + 77          */
    + 78         makeOrtho : function (left, right, bottom, top, znear, zfar) {
    + 79             var tx = - (right + left) / (right - left) ;
    + 80             var ty = - (top + bottom) / (top - bottom) ;
    + 81             var tz = - (zfar + znear) / (zfar - znear);
    + 82 
    + 83             return new CAAT.Math.Matrix3().initWithMatrix(
    + 84                     [
    + 85                         [2 / (right - left), 0, 0, tx ],
    + 86                         [0, 2 / (top - bottom), 0, ty ],
    + 87                         [0, 0, -2 / (zfar- znear), tz ],
    + 88                         [0, 0, 0,                  1  ]
    + 89                     ]);
    + 90         }
    + 91 
    + 92     }
    + 93 });
    + 94 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_Program.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_Program.js.html new file mode 100644 index 00000000..b4540612 --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_Program.js.html @@ -0,0 +1,144 @@ +
      1 /**
    +  2  * See LICENSE file.
    +  3  */
    +  4 
    +  5 CAAT.Module( {
    +  6 
    +  7 
    +  8     /**
    +  9      * @name WebGL
    + 10      * @memberOf CAAT
    + 11      * @namespace
    + 12      */
    + 13 
    + 14     /**
    + 15      * @name Program
    + 16      * @memberOf CAAT.WebGL
    + 17      * @constructor
    + 18      */
    + 19 
    + 20 
    + 21     defines : "CAAT.WebGL.Program",
    + 22     extendsWith : {
    + 23 
    + 24         /**
    + 25          * @lends CAAT.WebGL.Program.prototype
    + 26          */
    + 27 
    + 28         __init : function(gl) {
    + 29             this.gl= gl;
    + 30             return this;
    + 31         },
    + 32 
    + 33         /**
    + 34          *
    + 35          */
    + 36         shaderProgram:  null,
    + 37 
    + 38         /**
    + 39          * Canvas 3D context.
    + 40          */
    + 41         gl:             null,
    + 42 
    + 43         /**
    + 44          * Set fragment shader's alpha composite value.
    + 45          * @param alpha {number} float value 0..1.
    + 46          */
    + 47         setAlpha : function( alpha ) {
    + 48 
    + 49         },
    + 50         getShader : function (gl,type,str) {
    + 51             var shader;
    + 52             if (type === "x-shader/x-fragment") {
    + 53                 shader = gl.createShader(gl.FRAGMENT_SHADER);
    + 54             } else if (type === "x-shader/x-vertex") {
    + 55                 shader = gl.createShader(gl.VERTEX_SHADER);
    + 56             } else {
    + 57                 return null;
    + 58             }
    + 59 
    + 60             gl.shaderSource(shader, str);
    + 61             gl.compileShader(shader);
    + 62 
    + 63             if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
    + 64                 alert(gl.getShaderInfoLog(shader));
    + 65                 return null;
    + 66             }
    + 67 
    + 68             return shader;
    + 69 
    + 70         },
    + 71         getDomShader : function(gl, id) {
    + 72             var shaderScript = document.getElementById(id);
    + 73             if (!shaderScript) {
    + 74                 return null;
    + 75             }
    + 76 
    + 77             var str = "";
    + 78             var k = shaderScript.firstChild;
    + 79             while (k) {
    + 80                 if (k.nodeType === 3) {
    + 81                     str += k.textContent;
    + 82                 }
    + 83                 k = k.nextSibling;
    + 84             }
    + 85 
    + 86             var shader;
    + 87             if (shaderScript.type === "x-shader/x-fragment") {
    + 88                 shader = gl.createShader(gl.FRAGMENT_SHADER);
    + 89             } else if (shaderScript.type === "x-shader/x-vertex") {
    + 90                 shader = gl.createShader(gl.VERTEX_SHADER);
    + 91             } else {
    + 92                 return null;
    + 93             }
    + 94 
    + 95             gl.shaderSource(shader, str);
    + 96             gl.compileShader(shader);
    + 97 
    + 98             if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
    + 99                 alert(gl.getShaderInfoLog(shader));
    +100                 return null;
    +101             }
    +102 
    +103             return shader;
    +104         },
    +105         initialize : function() {
    +106             return this;
    +107         },
    +108         getFragmentShader : function() {
    +109             return null;
    +110         },
    +111         getVertexShader : function() {
    +112             return null;
    +113         },
    +114         create : function() {
    +115             var gl= this.gl;
    +116 
    +117             this.shaderProgram = gl.createProgram();
    +118             gl.attachShader(this.shaderProgram, this.getVertexShader());
    +119             gl.attachShader(this.shaderProgram, this.getFragmentShader());
    +120             gl.linkProgram(this.shaderProgram);
    +121             gl.useProgram(this.shaderProgram);
    +122             return this;
    +123         },
    +124         setMatrixUniform : function( caatMatrix4 ) {
    +125             this.gl.uniformMatrix4fv(
    +126                     this.shaderProgram.pMatrixUniform,
    +127                     false,
    +128                     new Float32Array(caatMatrix4.flatten()));
    +129 
    +130         },
    +131         useProgram : function() {
    +132             this.gl.useProgram(this.shaderProgram);
    +133             return this;
    +134         }
    +135     }
    +136 });
    +137 
    \ No newline at end of file diff --git a/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_TextureProgram.js.html b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_TextureProgram.js.html new file mode 100644 index 00000000..d1fed22f --- /dev/null +++ b/documentation/jsdoc/symbols/src/_Users_ibon_js_CAAT_src_WebGL_TextureProgram.js.html @@ -0,0 +1,309 @@ +
      1 CAAT.Module( {
    +  2 
    +  3     /**
    +  4      * @name TextureProgram
    +  5      * @memberOf CAAT.WebGL
    +  6      * @extends CAAT.WebGL.Program
    +  7      * @constructor
    +  8      */
    +  9 
    + 10     defines : "CAAT.WebGL.TextureProgram",
    + 11     aliases : ["CAAT.TextureProgram"],
    + 12     extendsClass : "CAAT.WebGL.Program",
    + 13     depends : [
    + 14         "CAAT.WebGL.Program"
    + 15     ],
    + 16     extendsWith : {
    + 17 
    + 18         /**
    + 19          * @lends CAAT.WebGL.TextureProgram.prototype
    + 20          */
    + 21 
    + 22         __init : function(gl) {
    + 23             this.__super(gl);
    + 24             return this;
    + 25         },
    + 26 
    + 27         /**
    + 28          * VertextBuffer GLBuffer
    + 29          */
    + 30         vertexPositionBuffer:   null,
    + 31 
    + 32         /**
    + 33          * VertextBuffer Float32 Array
    + 34          */
    + 35         vertexPositionArray:    null,
    + 36 
    + 37         /**
    + 38          * UVBuffer GLBuffer
    + 39          */
    + 40         vertexUVBuffer:         null,
    + 41 
    + 42         /**
    + 43          * VertexBuffer Float32 Array
    + 44          */
    + 45         vertexUVArray:          null,
    + 46 
    + 47         /**
    + 48          * VertexIndex GLBuffer.
    + 49          */
    + 50         vertexIndexBuffer:      null,
    + 51 
    + 52         /**
    + 53          * Lines GLBuffer
    + 54          */
    + 55         linesBuffer:            null,
    + 56 
    + 57         /**
    + 58          *
    + 59          */
    + 60         prevAlpha:              -1,
    + 61 
    + 62         /**
    + 63          *
    + 64          */
    + 65         prevR:                  -1,
    + 66 
    + 67         /**
    + 68          *
    + 69          */
    + 70         prevG:                  -1,
    + 71 
    + 72         /**
    + 73          *
    + 74          */
    + 75         prevB:                  -1,
    + 76 
    + 77         /**
    + 78          *
    + 79          */
    + 80         prevA:                  -1,
    + 81 
    + 82         /**
    + 83          *
    + 84          */
    + 85         prevTexture:            null,
    + 86 
    + 87         getFragmentShader : function() {
    + 88             return this.getShader( this.gl, "x-shader/x-fragment",
    + 89                     "#ifdef GL_ES \n"+
    + 90                     "precision highp float; \n"+
    + 91                     "#endif \n"+
    + 92 
    + 93                     "varying vec2 vTextureCoord; \n"+
    + 94                     "uniform sampler2D uSampler; \n"+
    + 95                     "uniform float alpha; \n"+
    + 96                     "uniform bool uUseColor;\n"+
    + 97                     "uniform vec4 uColor;\n"+
    + 98 
    + 99                     "void main(void) { \n"+
    +100 
    +101                     "if ( uUseColor ) {\n"+
    +102                     "  gl_FragColor= vec4(uColor.r*alpha, uColor.g*alpha, uColor.b*alpha, uColor.a*alpha);\n"+
    +103                     "} else { \n"+
    +104                     "  vec4 textureColor= texture2D(uSampler, vec2(vTextureCoord)); \n"+
    +105 // Fix FF   "  gl_FragColor = vec4(textureColor.rgb, textureColor.a * alpha); \n"+
    +106                     "  gl_FragColor = vec4(textureColor.r*alpha, textureColor.g*alpha, textureColor.b*alpha, textureColor.a * alpha ); \n"+
    +107                     "}\n"+
    +108 
    +109                     "}\n"
    +110                     );
    +111         },
    +112         getVertexShader : function() {
    +113             return this.getShader(this.gl, "x-shader/x-vertex",
    +114                     "attribute vec3 aVertexPosition; \n"+
    +115                     "attribute vec2 aTextureCoord; \n"+
    +116 
    +117                     "uniform mat4 uPMatrix; \n"+
    +118 
    +119                     "varying vec2 vTextureCoord; \n"+
    +120 
    +121                     "void main(void) { \n"+
    +122                     "gl_Position = uPMatrix * vec4(aVertexPosition, 1.0); \n"+
    +123                     "vTextureCoord = aTextureCoord;\n"+
    +124                     "}\n"
    +125                     );
    +126         },
    +127         useProgram : function() {
    +128             CAAT.TextureProgram.superclass.useProgram.call(this);
    +129 
    +130             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexPositionBuffer );
    +131             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexUVBuffer);
    +132             this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.vertexIndexBuffer);
    +133         },
    +134         initialize : function() {
    +135 
    +136             var i;
    +137 
    +138             this.linesBuffer= this.gl.createBuffer();
    +139             this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.linesBuffer );
    +140             var arr= [];
    +141             for( i=0; i<1024; i++ ) {
    +142                 arr[i]= i;
    +143             }
    +144             this.linesBufferArray= new Uint16Array(arr);
    +145             this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, this.linesBufferArray, this.gl.DYNAMIC_DRAW);
    +146 
    +147 
    +148             this.shaderProgram.vertexPositionAttribute =
    +149                     this.gl.getAttribLocation(this.shaderProgram, "aVertexPosition");
    +150             this.gl.enableVertexAttribArray(
    +151                     this.shaderProgram.vertexPositionAttribute);
    +152 
    +153             this.shaderProgram.textureCoordAttribute =
    +154                     this.gl.getAttribLocation(this.shaderProgram, "aTextureCoord");
    +155             this.gl.enableVertexAttribArray(
    +156                     this.shaderProgram.textureCoordAttribute);
    +157 
    +158             this.shaderProgram.pMatrixUniform =
    +159                     this.gl.getUniformLocation(this.shaderProgram, "uPMatrix");
    +160             this.shaderProgram.samplerUniform =
    +161                     this.gl.getUniformLocation(this.shaderProgram, "uSampler");
    +162             this.shaderProgram.alphaUniform   =
    +163                     this.gl.getUniformLocation(this.shaderProgram, "alpha");
    +164             this.shaderProgram.useColor =
    +165                     this.gl.getUniformLocation(this.shaderProgram, "uUseColor");
    +166             this.shaderProgram.color =
    +167                     this.gl.getUniformLocation(this.shaderProgram, "uColor");
    +168 
    +169             this.setAlpha(1);
    +170             this.setUseColor(false);
    +171 
    +172             var maxTris=4096;
    +173             /// set vertex data
    +174             this.vertexPositionBuffer = this.gl.createBuffer();
    +175             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexPositionBuffer );
    +176             this.vertexPositionArray= new Float32Array(maxTris*12);
    +177             this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertexPositionArray, this.gl.DYNAMIC_DRAW);
    +178             this.gl.vertexAttribPointer(this.shaderProgram.vertexPositionAttribute, 3, this.gl.FLOAT, false, 0, 0);
    +179 
    +180             // uv info
    +181             this.vertexUVBuffer= this.gl.createBuffer();
    +182             this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexUVBuffer);
    +183             this.vertexUVArray= new Float32Array(maxTris*8);
    +184             this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertexUVArray, this.gl.DYNAMIC_DRAW);
    +185             this.gl.vertexAttribPointer(this.shaderProgram.textureCoordAttribute, 2, this.gl.FLOAT, false, 0, 0);
    +186 
    +187             // vertex index
    +188             this.vertexIndexBuffer = this.gl.createBuffer();
    +189             this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.vertexIndexBuffer);            
    +190             var vertexIndex = [];
    +191             for( i=0; i<maxTris; i++ ) {
    +192                 vertexIndex.push(0 + i*4); vertexIndex.push(1 + i*4); vertexIndex.push(2 + i*4);
    +193                 vertexIndex.push(0 + i*4); vertexIndex.push(2 + i*4); vertexIndex.push(3 + i*4);
    +194             }
    +195             this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vertexIndex), this.gl.DYNAMIC_DRAW);
    +196 
    +197             return CAAT.TextureProgram.superclass.initialize.call(this);
    +198         },
    +199         setUseColor : function( use,r,g,b,a ) {
    +200             this.gl.uniform1i(this.shaderProgram.useColor, use?1:0);
    +201             if ( use ) {
    +202                 if ( this.prevA!==a || this.prevR!==r || this.prevG!==g || this.prevB!==b ) {
    +203                     this.gl.uniform4f(this.shaderProgram.color, r,g,b,a );
    +204                     this.prevA= a;
    +205                     this.prevR= r;
    +206                     this.prevG= g;
    +207                     this.prevB= b;
    +208                 }
    +209             }
    +210         },
    +211         setTexture : function( glTexture ) {
    +212             if ( this.prevTexture!==glTexture ) {
    +213                 var gl= this.gl;
    +214 
    +215                 gl.activeTexture(gl.TEXTURE0);
    +216                 gl.bindTexture(gl.TEXTURE_2D, glTexture);
    +217                 gl.uniform1i(this.shaderProgram.samplerUniform, 0);
    +218 
    +219                 this.prevTexture= glTexture;
    +220             }
    +221 
    +222             return this;
    +223         },
    +224         updateVertexBuffer : function(vertexArray) {
    +225             var gl= this.gl;
    +226             gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexPositionBuffer );
    +227             gl.bufferSubData(gl.ARRAY_BUFFER, 0, vertexArray);
    +228             return this;
    +229         },
    +230         updateUVBuffer : function(uvArray) {
    +231             var gl= this.gl;
    +232             gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexUVBuffer );
    +233             gl.bufferSubData(gl.ARRAY_BUFFER, 0, uvArray);
    +234             return this;
    +235         },
    +236         setAlpha : function(alpha) {
    +237             if ( this.prevAlpha !== alpha ) {
    +238                 this.gl.uniform1f(
    +239                     this.shaderProgram.alphaUniform, alpha);
    +240                 this.prevAlpha= alpha;
    +241             }
    +242             return this;
    +243         },
    +244         /**
    +245          *
    +246          * @param lines_data {Float32Array} array of number with x,y,z coords for each line point.
    +247          * @param size {number} number of lines to draw.
    +248          * @param r
    +249          * @param g
    +250          * @param b
    +251          * @param a
    +252          * @param lineWidth {number} drawing line size.
    +253          */
    +254         drawLines : function( lines_data, size, r,g,b,a, lineWidth ) {
    +255             var gl= this.gl;
    +256 
    +257             this.setAlpha( a );
    +258 
    +259             gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.linesBuffer );
    +260             gl.lineWidth(lineWidth);
    +261 
    +262             this.updateVertexBuffer(lines_data);
    +263             this.setUseColor(true, r,g,b,1 );
    +264             gl.drawElements(gl.LINES, size, gl.UNSIGNED_SHORT, 0);
    +265 
    +266             /// restore
    +267             this.setAlpha( 1 );
    +268             this.setUseColor(false);
    +269             gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.vertexIndexBuffer);
    +270 
    +271         },
    +272         /**
    +273          * 
    +274          * @param polyline_data
    +275          * @param size
    +276          * @param r
    +277          * @param g
    +278          * @param b
    +279          * @param a
    +280          * @param lineWidth
    +281          */
    +282         drawPolylines : function( polyline_data, size, r,g,b,a, lineWidth ) {
    +283             var gl= this.gl;
    +284 
    +285             gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.linesBuffer );
    +286             gl.lineWidth(lineWidth);
    +287 
    +288             this.setAlpha(a);
    +289 
    +290             this.updateVertexBuffer(polyline_data);
    +291             this.setUseColor(true, r,g,b,1 );
    +292             gl.drawElements(gl.LINE_STRIP, size, gl.UNSIGNED_SHORT, 0);
    +293 
    +294             /// restore
    +295             this.setAlpha( 1 );
    +296             this.setUseColor(false);
    +297             gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.vertexIndexBuffer);
    +298 
    +299         }
    +300     }
    +301 });
    +302 
    \ No newline at end of file diff --git a/version.incremental b/version.incremental index b8626c4c..1e8b3149 100644 --- a/version.incremental +++ b/version.incremental @@ -1 +1 @@ -4 +6 diff --git a/version.nfo b/version.nfo index ca20bcab..9e2ed689 100644 --- a/version.nfo +++ b/version.nfo @@ -1 +1 @@ -0.6 build: 4 +0.6 build: 6 From 6379bb3a97aa95ebabd3ae731a4617d7b23aefbc Mon Sep 17 00:00:00 2001 From: ibon tolosana Date: Mon, 1 Jul 2013 05:02:27 -0700 Subject: [PATCH 49/52] Added demos to menu.html --- documentation/demos/menu/menu.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/demos/menu/menu.html b/documentation/demos/menu/menu.html index 528f03a6..8fd87743 100644 --- a/documentation/demos/menu/menu.html +++ b/documentation/demos/menu/menu.html @@ -14,6 +14,8 @@

    Demos

    From a6e10217ac85de0cbf0f25e3dbf0938eb1ea7eb8 Mon Sep 17 00:00:00 2001 From: ibon tolosana Date: Mon, 1 Jul 2013 05:06:57 -0700 Subject: [PATCH 50/52] Added demos to readme.md --- readme.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 7d7634f2..9d220fe6 100644 --- a/readme.md +++ b/readme.md @@ -19,6 +19,10 @@ Visit CAAT's github pages, inc ## Examples and sample code ## +Skeletal animation +Sprite Animations +Multiline text +Bitmap Atlas Path management Procedural fishpond Sprites traversing a random path @@ -49,7 +53,6 @@ Visit CAAT's github pages, inc Minimal Paint Auto Layout Fonts -Sprite Animations SVG Path CSS3 Keyframes From 63aa3d973173c722d63d4199da920c2a3ae95c02 Mon Sep 17 00:00:00 2001 From: Rob Boerman Date: Fri, 19 Apr 2013 17:40:45 +0200 Subject: [PATCH 51/52] When a CatMulRom only has 2 or 3 control points, duplicate the first and last points so we can at least create a path --- src/PathUtil/Path.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/PathUtil/Path.js b/src/PathUtil/Path.js index 4d353dfe..ff3ac1aa 100644 --- a/src/PathUtil/Path.js +++ b/src/PathUtil/Path.js @@ -337,12 +337,14 @@ CAAT.Module( { return this; }, setCatmullRom : function( points, closed ) { - points = points.slice(0); if ( closed ) { + points = points.slice(0); points.unshift(points[points.length-1]); points.push(points[1]); points.push(points[2]); - } else { + } + + if (points.length < 4) { points.unshift(points[0]); points.push(points[points.length-1]); } From 47f2837fa10ee24393fd8adfab456202c3e24229 Mon Sep 17 00:00:00 2001 From: Rob Boerman Date: Sat, 21 Dec 2013 22:19:29 +0100 Subject: [PATCH 52/52] particle emitter --- version.compile.pack.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/version.compile.pack.sh b/version.compile.pack.sh index 823c4c6e..9aa11fc5 100755 --- a/version.compile.pack.sh +++ b/version.compile.pack.sh @@ -72,6 +72,9 @@ more ./src/Modules/Initialization/Template.js >> "${FILE_CAAT}" more ./src/Modules/Initialization/TemplateWithSplash.js >> "${FILE_CAAT}" more ./src/Modules/CSS/csskeyframehelper.js >> "${FILE_CAAT}" +# more ./src/Modules/Particle/Particle.js >> "${FILE_CAAT}" +more ./src/Modules/Particle/Emitter.js >> "${FILE_CAAT}" + more ./src/PathUtil/PathSegment.js >> "${FILE_CAAT}" more ./src/PathUtil/ArcPath.js >> "${FILE_CAAT}" @@ -191,6 +194,9 @@ more ./src/Modules/Initialization/Template.js >> "${FILE_CAAT_CSS}" more ./src/Modules/Initialization/TemplateWithSplash.js >> "${FILE_CAAT_CSS}" more ./src/Modules/CSS/csskeyframehelper.js >> "${FILE_CAAT}" +# more ./src/Modules/Particle/Particle.js >> "${FILE_CAAT_CSS}" +# more ./src/Modules/Particle/Emitter.js >> "${FILE_CAAT_CSS}" + more ./src/PathUtil/PathSegment.js >> "${FILE_CAAT_CSS}" more ./src/PathUtil/ArcPath.js >> "${FILE_CAAT_CSS}"