var math = require('../math'),
utils = require('../utils'),
DisplayObjectContainer = require('./DisplayObjectContainer'),
InteractionManager = require('../interaction/InteractionManager');
/**
* A Stage represents the root of the display tree. Everything connected to the stage is rendered, but
* the stage itself cannot be transformed. If you want to transform everything within a stage use a single
* DOC as a child of the stage and transform that one.
*
* Creating a stage is a mandatory process when you use Pixi, which is as simple as this:
*
* ```js
* var stage = new Stage(0xFFFFFF);
* ```
*
* Where the parameter given is the background colour of the stage. You will use this stage instance to
* add your sprites to it and therefore to the renderer. Here is how to add a sprite to the stage:
*
* ```js
* stage.addChild(sprite);
* ```
*
* @class
* @extends DisplayObjectContainer
* @namespace PIXI
* @param backgroundColor {number} the background color of the stage, e.g.: 0xFFFFFF for white
*/
function Stage(backgroundColor) {
DisplayObjectContainer.call(this);
/**
* Current transform of the object based on world (parent) factors
*
* @member {Matrix}
* @readonly
* @private
*/
this.worldTransform = new math.Matrix();
/**
* Whether or not the stage is interactive
*
* @member {boolean}
*/
this.interactive = true;
/**
* The interaction manage for this stage, manages all interactive activity on the stage
*
* @member {InteractionManager}
*/
this.interactionManager = new InteractionManager(this);
/**
* Whether the stage is dirty and needs to have interactions updated
*
* @member {boolean}
* @private
*/
this.dirty = true;
//the stage is its own stage
this.stage = this;
//optimize hit detection a bit
this.stage.hitArea = new math.Rectangle(0, 0, 100000, 100000);
this.setBackgroundColor(backgroundColor);
}
// constructor
Stage.prototype = Object.create(DisplayObjectContainer.prototype);
Stage.prototype.constructor = Stage;
/**
* Sets another DOM element which can receive mouse/touch interactions instead of the default Canvas element.
* This is useful for when you have other DOM elements on top of the Canvas element.
*
* @param domElement {DOMElement} This new domElement which will receive mouse/touch events
*/
Stage.prototype.setInteractionDelegate = function (domElement) {
this.interactionManager.setTargetDomElement(domElement);
};
/*
* Updates the object transform for rendering
*
* @method updateTransform
* @private
*/
Stage.prototype.updateTransform = function () {
this.worldAlpha = 1;
for (var i = 0, j = this.children.length; i < j; ++i) {
this.children[i].updateTransform();
}
if (this.dirty) {
this.dirty = false;
// update interactive!
this.interactionManager.dirty = true;
}
if (this.interactive) {
this.interactionManager.update();
}
};
/**
* Sets the background color for the stage
*
* @param backgroundColor {number} The color of the background, e.g.: 0xFFFFFF for white
*/
Stage.prototype.setBackgroundColor = function (backgroundColor) {
this.backgroundColor = backgroundColor || 0x000000;
this.backgroundColorSplit = utils.hex2rgb(this.backgroundColor);
var hex = this.backgroundColor.toString(16);
hex = '000000'.substr(0, 6 - hex.length) + hex;
this.backgroundColorString = '#' + hex;
};
/**
* This will return the point containing global coordinates of the mouse.
*
* @return {Point} A point containing the coordinates of the global InteractionData position.
*/
Stage.prototype.getMousePosition = function () {
return this.interactionManager.mouse.global;
};