'use strict'; exports.__esModule = true; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _core = require('../core'); var core = _interopRequireWildcard(_core); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var tempPoint = new core.Point(); var tempPolygon = new core.Polygon(); /** * Base mesh class * @class * @extends PIXI.Container * @memberof PIXI.mesh */ var Mesh = function (_core$Container) { _inherits(Mesh, _core$Container); /** * @param {PIXI.Texture} texture - The texture to use * @param {Float32Array} [vertices] - if you want to specify the vertices * @param {Float32Array} [uvs] - if you want to specify the uvs * @param {Uint16Array} [indices] - if you want to specify the indices * @param {number} [drawMode] - the drawMode, can be any of the Mesh.DRAW_MODES consts */ function Mesh(texture, vertices, uvs, indices, drawMode) { _classCallCheck(this, Mesh); /** * The texture of the Mesh * * @member {PIXI.Texture} * @private */ var _this = _possibleConstructorReturn(this, _core$Container.call(this)); _this._texture = null; /** * The Uvs of the Mesh * * @member {Float32Array} */ _this.uvs = uvs || new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]); /** * An array of vertices * * @member {Float32Array} */ _this.vertices = vertices || new Float32Array([0, 0, 100, 0, 100, 100, 0, 100]); /* * @member {Uint16Array} An array containing the indices of the vertices */ // TODO auto generate this based on draw mode! _this.indices = indices || new Uint16Array([0, 1, 3, 2]); /** * Version of mesh uvs are dirty or not * * @member {number} */ _this.dirty = 0; /** * Version of mesh indices * * @member {number} */ _this.indexDirty = 0; /** * The blend mode to be applied to the sprite. Set to `PIXI.BLEND_MODES.NORMAL` to remove * any blend mode. * * @member {number} * @default PIXI.BLEND_MODES.NORMAL * @see PIXI.BLEND_MODES */ _this.blendMode = core.BLEND_MODES.NORMAL; /** * Triangles in canvas mode are automatically antialiased, use this value to force triangles * to overlap a bit with each other. * * @member {number} */ _this.canvasPadding = 0; /** * The way the Mesh should be drawn, can be any of the {@link PIXI.mesh.Mesh.DRAW_MODES} consts * * @member {number} * @see PIXI.mesh.Mesh.DRAW_MODES */ _this.drawMode = drawMode || Mesh.DRAW_MODES.TRIANGLE_MESH; // run texture setter; _this.texture = texture; /** * The default shader that is used if a mesh doesn't have a more specific one. * * @member {PIXI.Shader} */ _this.shader = null; /** * The tint applied to the mesh. This is a [r,g,b] value. A value of [1,1,1] will remove any * tint effect. * * @member {number} * @memberof PIXI.mesh.Mesh# */ _this.tintRgb = new Float32Array([1, 1, 1]); /** * A map of renderer IDs to webgl render data * * @private * @member {object<number, object>} */ _this._glDatas = {}; return _this; } /** * Renders the object using the WebGL renderer * * @private * @param {PIXI.WebGLRenderer} renderer - a reference to the WebGL renderer */ Mesh.prototype._renderWebGL = function _renderWebGL(renderer) { renderer.setObjectRenderer(renderer.plugins.mesh); renderer.plugins.mesh.render(this); }; /** * Renders the object using the Canvas renderer * * @private * @param {PIXI.CanvasRenderer} renderer - The canvas renderer. */ Mesh.prototype._renderCanvas = function _renderCanvas(renderer) { renderer.plugins.mesh.render(this); }; /** * When the texture is updated, this event will fire to update the scale and frame * * @private */ Mesh.prototype._onTextureUpdate = function _onTextureUpdate() {} /* empty */ /** * Returns the bounds of the mesh as a rectangle. The bounds calculation takes the worldTransform into account. * */ ; Mesh.prototype._calculateBounds = function _calculateBounds() { // TODO - we can cache local bounds and use them if they are dirty (like graphics) this._bounds.addVertices(this.transform, this.vertices, 0, this.vertices.length); }; /** * Tests if a point is inside this mesh. Works only for TRIANGLE_MESH * * @param {PIXI.Point} point - the point to test * @return {boolean} the result of the test */ Mesh.prototype.containsPoint = function containsPoint(point) { if (!this.getBounds().contains(point.x, point.y)) { return false; } this.worldTransform.applyInverse(point, tempPoint); var vertices = this.vertices; var points = tempPolygon.points; var indices = this.indices; var len = this.indices.length; var step = this.drawMode === Mesh.DRAW_MODES.TRIANGLES ? 3 : 1; for (var i = 0; i + 2 < len; i += step) { var ind0 = indices[i] * 2; var ind1 = indices[i + 1] * 2; var ind2 = indices[i + 2] * 2; points[0] = vertices[ind0]; points[1] = vertices[ind0 + 1]; points[2] = vertices[ind1]; points[3] = vertices[ind1 + 1]; points[4] = vertices[ind2]; points[5] = vertices[ind2 + 1]; if (tempPolygon.contains(tempPoint.x, tempPoint.y)) { return true; } } return false; }; /** * The texture that the mesh uses. * * @member {PIXI.Texture} * @memberof PIXI.mesh.Mesh# */ _createClass(Mesh, [{ key: 'texture', get: function get() { return this._texture; } /** * Sets the texture the mesh uses. * * @param {Texture} value - The value to set. */ , set: function set(value) { if (this._texture === value) { return; } this._texture = value; if (value) { // wait for the texture to load if (value.baseTexture.hasLoaded) { this._onTextureUpdate(); } else { value.once('update', this._onTextureUpdate, this); } } } /** * The tint applied to the mesh. This is a hex value. A value of 0xFFFFFF will remove any tint effect. * * @member {number} * @memberof PIXI.mesh.Mesh# * @default 0xFFFFFF */ }, { key: 'tint', get: function get() { return core.utils.rgb2hex(this.tintRgb); } /** * Sets the tint the mesh uses. * * @param {number} value - The value to set. */ , set: function set(value) { this.tintRgb = core.utils.hex2rgb(value, this.tintRgb); } }]); return Mesh; }(core.Container); /** * Different drawing buffer modes supported * * @static * @constant * @type {object} * @property {number} TRIANGLE_MESH * @property {number} TRIANGLES */ exports.default = Mesh; Mesh.DRAW_MODES = { TRIANGLE_MESH: 0, TRIANGLES: 1 }; //# sourceMappingURL=Mesh.js.map