/** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The base class for all objects that are rendered on the screen. * * @class DisplayObject * @constructor */ PIXI.DisplayObject = function() { this.last = this; this.first = this; /** * The coordinate of the object relative to the local coordinates of the parent. * * @property position * @type Point */ this.position = new PIXI.Point(); /** * The scale factor of the object. * * @property scale * @type Point */ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** * The pivot point of the displayObject that it rotates around * * @property pivot * @type Point */ this.pivot = new PIXI.Point(0,0); /** * The rotation of the object in radians. * * @property rotation * @type Number */ this.rotation = 0; /** * The opacity of the object. * * @property alpha * @type Number */ this.alpha = 1; /** * The visibility of the object. * * @property visible * @type Boolean */ this.visible = true; /** * This is the defined area that will pick up mouse / touch events. It is null by default. * Setting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children) * * @property hitArea * @type Rectangle|Circle|Ellipse|Polygon */ this.hitArea = null; /** * This is used to indicate if the displayObject should display a mouse hand cursor on rollover * * @property buttonMode * @type Boolean */ this.buttonMode = false; /** * Can this object be rendered * * @property renderable * @type Boolean */ this.renderable = false; /** * [read-only] The display object container that contains this display object. * * @property parent * @type DisplayObjectContainer * @readOnly */ this.parent = null; /** * [read-only] The stage the display object is connected to, or undefined if it is not connected to the stage. * * @property stage * @type Stage * @readOnly */ this.stage = null; /** * [read-only] The multiplied alpha of the displayObject * * @property worldAlpha * @type Number * @readOnly */ this.worldAlpha = 1; /** * [read-only] Whether or not the object is interactive, do not toggle directly! use the `interactive` property * * @property _interactive * @type Boolean * @readOnly * @private */ this._interactive = false; /** * This is the cursor that will be used when the mouse is over this object. To enable this the element must have interaction = true and buttonMode = true * * @property defaultCursor * @type String * */ this.defaultCursor = 'pointer'; /** * [read-only] Current transform of the object based on world (parent) factors * * @property worldTransform * @type Mat3 * @readOnly * @private */ this.worldTransform = new PIXI.Matrix(); /** * [NYI] Unknown * * @property color * @type Array<> * @private */ this.color = []; /** * [NYI] Holds whether or not this object is dynamic, for rendering optimization * * @property dynamic * @type Boolean * @private */ this.dynamic = true; // cached sin rotation and cos rotation this._sr = 0; this._cr = 1; /** * The area the filter is applied to * * @property filterArea * @type Rectangle */ this.filterArea = new PIXI.Rectangle(0,0,1,1); /** * The original, cached bounds of the object * * @property _bounds * @type Rectangle * @private */ this._bounds = new PIXI.Rectangle(0, 0, 1, 1); /** * The most up-to-date bounds of the object * * @property _currentBounds * @type Rectangle * @private */ this._currentBounds = null; /** * The original, cached mask of the object * * @property _currentBounds * @type Rectangle * @private */ this._mask = null; /* * MOUSE Callbacks */ /** * A callback that is used when the users clicks on the displayObject with their mouse * @method click * @param interactionData {InteractionData} */ /** * A callback that is used when the user clicks the mouse down over the sprite * @method mousedown * @param interactionData {InteractionData} */ /** * A callback that is used when the user releases the mouse that was over the displayObject * for this callback to be fired the mouse must have been pressed down over the displayObject * @method mouseup * @param interactionData {InteractionData} */ /** * A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject * for this callback to be fired, The touch must have started over the displayObject * @method mouseupoutside * @param interactionData {InteractionData} */ /** * A callback that is used when the users mouse rolls over the displayObject * @method mouseover * @param interactionData {InteractionData} */ /** * A callback that is used when the users mouse leaves the displayObject * @method mouseout * @param interactionData {InteractionData} */ /* * TOUCH Callbacks */ /** * A callback that is used when the users taps on the sprite with their finger * basically a touch version of click * @method tap * @param interactionData {InteractionData} */ /** * A callback that is used when the user touches over the displayObject * @method touchstart * @param interactionData {InteractionData} */ /** * A callback that is used when the user releases a touch over the displayObject * @method touchend * @param interactionData {InteractionData} */ /** * A callback that is used when the user releases the touch that was over the displayObject * for this callback to be fired, The touch must have started over the sprite * @method touchendoutside * @param interactionData {InteractionData} */ }; // constructor PIXI.DisplayObject.prototype.constructor = PIXI.DisplayObject; /** * [Deprecated] Indicates if the sprite will have touch and mouse interactivity. It is false by default * Instead of using this function you can now simply set the interactive property to true or false * * @method setInteractive * @param interactive {Boolean} * @deprecated Simply set the `interactive` property directly */ PIXI.DisplayObject.prototype.setInteractive = function(interactive) { this.interactive = interactive; }; /** * Indicates if the sprite will have touch and mouse interactivity. It is false by default * * @property interactive * @type Boolean * @default false */ Object.defineProperty(PIXI.DisplayObject.prototype, 'interactive', { get: function() { return this._interactive; }, set: function(value) { this._interactive = value; // TODO more to be done here.. // need to sort out a re-crawl! if(this.stage)this.stage.dirty = true; } }); /** * [read-only] Indicates if the sprite is globaly visible. * * @property worldVisible * @type Boolean */ Object.defineProperty(PIXI.DisplayObject.prototype, 'worldVisible', { get: function() { var item = this; do { if(!item.visible)return false; item = item.parent; } while(item); return true; } }); /** * Sets a mask for the displayObject. A mask is an object that limits the visibility of an object to the shape of the mask applied to it. * In PIXI a regular mask must be a PIXI.Graphics object. This allows for much faster masking in canvas as it utilises shape clipping. * To remove a mask, set this property to null. * * @property mask * @type Graphics */ Object.defineProperty(PIXI.DisplayObject.prototype, 'mask', { get: function() { return this._mask; }, set: function(value) { if(this._mask)this._mask.isMask = false; this._mask = value; if(this._mask)this._mask.isMask = true; } }); /** * Sets the filters for the displayObject. * * IMPORTANT: This is a webGL only feature and will be ignored by the canvas renderer. * To remove filters simply set this property to 'null' * @property filters * @type Array An array of filters */ Object.defineProperty(PIXI.DisplayObject.prototype, 'filters', { get: function() { return this._filters; }, set: function(value) { if(value) { // now put all the passes in one place.. var passes = []; for (var i = 0; i < value.length; i++) { var filterPasses = value[i].passes; for (var j = 0; j < filterPasses.length; j++) { passes.push(filterPasses[j]); } } // TODO change this as it is legacy this._filterBlock = {target:this, filterPasses:passes}; } this._filters = value; } }); /* * Updates the object transform for rendering * * @method updateTransform * @private */ PIXI.DisplayObject.prototype.updateTransform = function() { // TODO OPTIMIZE THIS!! with dirty if(this.rotation !== this.rotationCache) { this.rotationCache = this.rotation; this._sr = Math.sin(this.rotation); this._cr = Math.cos(this.rotation); } // var localTransform = this.localTransform//.toArray(); var parentTransform = this.parent.worldTransform;//.toArray(); var worldTransform = this.worldTransform;//.toArray(); //console.log(localTransform) var px = this.pivot.x; var py = this.pivot.y; var a00 = this._cr * this.scale.x, a01 = -this._sr * this.scale.y, a10 = this._sr * this.scale.x, a11 = this._cr * this.scale.y, a02 = this.position.x + a00 * px - py * a01, a12 = this.position.y + a11 * py - px * a10, b00 = parentTransform.a, b01 = parentTransform.b, b02 = parentTransform.tx, b10 = parentTransform.c, b11 = parentTransform.d, b12 = parentTransform.ty; worldTransform.a = b00 * a00 + b01 * a10; worldTransform.b = b00 * a01 + b01 * a11; worldTransform.tx = b00 * a02 + b01 * a12 + b02; worldTransform.c = b10 * a00 + b11 * a10; worldTransform.d = b10 * a01 + b11 * a11; worldTransform.ty = b10 * a02 + b11 * a12 + b12; this.worldAlpha = this.alpha * this.parent.worldAlpha; }; /** * Retrieves the bounds of the displayObject as a rectangle object * * @method getBounds * @return {Rectangle} the rectangular bounding area */ PIXI.DisplayObject.prototype.getBounds = function() { return PIXI.EmptyRectangle; }; /** * Retrieves the local bounds of the displayObject as a rectangle object * * @method getLocalBounds * @return {Rectangle} the rectangular bounding area */ PIXI.DisplayObject.prototype.getLocalBounds = function() { var matrixCache = this.worldTransform; this.worldTransform = PIXI.identityMatrix; this.updateTransform(); var bounds = this.getBounds(); this.worldTransform = matrixCache; return bounds; }; /** * Sets the object's stage reference, the stage this object is connected to * * @method setStageReference * @param stage {Stage} the stage that the object will have as its current stage reference */ PIXI.DisplayObject.prototype.setStageReference = function(stage) { this.stage = stage; if(this._interactive)this.stage.dirty = true; }; /** * Renders the object using the WebGL renderer * * @method _renderWebGL * @param renderSession {RenderSession} * @private */ PIXI.DisplayObject.prototype._renderWebGL = function(renderSession) { // OVERWRITE; // this line is just here to pass jshinting :) renderSession = renderSession; }; /** * Renders the object using the Canvas renderer * * @method _renderCanvas * @param renderSession {RenderSession} * @private */ PIXI.DisplayObject.prototype._renderCanvas = function(renderSession) { // OVERWRITE; // this line is just here to pass jshinting :) renderSession = renderSession; }; /** * The position of the displayObject on the x axis relative to the local coordinates of the parent. * * @property x * @type Number */ Object.defineProperty(PIXI.DisplayObject.prototype, 'x', { get: function() { return this.position.x; }, set: function(value) { this.position.x = value; } }); /** * The position of the displayObject on the y axis relative to the local coordinates of the parent. * * @property y * @type Number */ Object.defineProperty(PIXI.DisplayObject.prototype, 'y', { get: function() { return this.position.y; }, set: function(value) { this.position.y = value; } });