'use strict';
exports.__esModule = true;
var _pixiGlCore = require('pixi-gl-core');
var _pixiGlCore2 = _interopRequireDefault(_pixiGlCore);
var _createIndicesForQuads = require('../../core/utils/createIndicesForQuads');
var _createIndicesForQuads2 = _interopRequireDefault(_createIndicesForQuads);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* @author Mat Groves
*
* Big thanks to the very clever Matt DesLauriers <mattdesl> https://github.com/mattdesl/
* for creating the original pixi version!
* Also a thanks to https://github.com/bchevalier for tweaking the tint and alpha so that
* they now share 4 bytes on the vertex buffer
*
* Heavily inspired by LibGDX's ParticleBuffer:
* https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g2d/ParticleBuffer.java
*/
/**
* The particle buffer manages the static and dynamic buffers for a particle container.
*
* @class
* @private
* @memberof PIXI
*/
var ParticleBuffer = function () {
/**
* @param {WebGLRenderingContext} gl - The rendering context.
* @param {object} properties - The properties to upload.
* @param {boolean[]} dynamicPropertyFlags - Flags for which properties are dynamic.
* @param {number} size - The size of the batch.
*/
function ParticleBuffer(gl, properties, dynamicPropertyFlags, size) {
_classCallCheck(this, ParticleBuffer);
/**
* The current WebGL drawing context.
*
* @member {WebGLRenderingContext}
*/
this.gl = gl;
/**
* Size of a single vertex.
*
* @member {number}
*/
this.vertSize = 2;
/**
* Size of a single vertex in bytes.
*
* @member {number}
*/
this.vertByteSize = this.vertSize * 4;
/**
* The number of particles the buffer can hold
*
* @member {number}
*/
this.size = size;
/**
* A list of the properties that are dynamic.
*
* @member {object[]}
*/
this.dynamicProperties = [];
/**
* A list of the properties that are static.
*
* @member {object[]}
*/
this.staticProperties = [];
for (var i = 0; i < properties.length; ++i) {
var property = properties[i];
// Make copy of properties object so that when we edit the offset it doesn't
// change all other instances of the object literal
property = {
attribute: property.attribute,
size: property.size,
uploadFunction: property.uploadFunction,
offset: property.offset
};
if (dynamicPropertyFlags[i]) {
this.dynamicProperties.push(property);
} else {
this.staticProperties.push(property);
}
}
this.staticStride = 0;
this.staticBuffer = null;
this.staticData = null;
this.dynamicStride = 0;
this.dynamicBuffer = null;
this.dynamicData = null;
this.initBuffers();
}
/**
* Sets up the renderer context and necessary buffers.
*
* @private
*/
ParticleBuffer.prototype.initBuffers = function initBuffers() {
var gl = this.gl;
var dynamicOffset = 0;
/**
* Holds the indices of the geometry (quads) to draw
*
* @member {Uint16Array}
*/
this.indices = (0, _createIndicesForQuads2.default)(this.size);
this.indexBuffer = _pixiGlCore2.default.GLBuffer.createIndexBuffer(gl, this.indices, gl.STATIC_DRAW);
this.dynamicStride = 0;
for (var i = 0; i < this.dynamicProperties.length; ++i) {
var property = this.dynamicProperties[i];
property.offset = dynamicOffset;
dynamicOffset += property.size;
this.dynamicStride += property.size;
}
this.dynamicData = new Float32Array(this.size * this.dynamicStride * 4);
this.dynamicBuffer = _pixiGlCore2.default.GLBuffer.createVertexBuffer(gl, this.dynamicData, gl.STREAM_DRAW);
// static //
var staticOffset = 0;
this.staticStride = 0;
for (var _i = 0; _i < this.staticProperties.length; ++_i) {
var _property = this.staticProperties[_i];
_property.offset = staticOffset;
staticOffset += _property.size;
this.staticStride += _property.size;
}
this.staticData = new Float32Array(this.size * this.staticStride * 4);
this.staticBuffer = _pixiGlCore2.default.GLBuffer.createVertexBuffer(gl, this.staticData, gl.STATIC_DRAW);
this.vao = new _pixiGlCore2.default.VertexArrayObject(gl).addIndex(this.indexBuffer);
for (var _i2 = 0; _i2 < this.dynamicProperties.length; ++_i2) {
var _property2 = this.dynamicProperties[_i2];
this.vao.addAttribute(this.dynamicBuffer, _property2.attribute, gl.FLOAT, false, this.dynamicStride * 4, _property2.offset * 4);
}
for (var _i3 = 0; _i3 < this.staticProperties.length; ++_i3) {
var _property3 = this.staticProperties[_i3];
this.vao.addAttribute(this.staticBuffer, _property3.attribute, gl.FLOAT, false, this.staticStride * 4, _property3.offset * 4);
}
};
/**
* Uploads the dynamic properties.
*
* @param {PIXI.DisplayObject[]} children - The children to upload.
* @param {number} startIndex - The index to start at.
* @param {number} amount - The number to upload.
*/
ParticleBuffer.prototype.uploadDynamic = function uploadDynamic(children, startIndex, amount) {
for (var i = 0; i < this.dynamicProperties.length; i++) {
var property = this.dynamicProperties[i];
property.uploadFunction(children, startIndex, amount, this.dynamicData, this.dynamicStride, property.offset);
}
this.dynamicBuffer.upload();
};
/**
* Uploads the static properties.
*
* @param {PIXI.DisplayObject[]} children - The children to upload.
* @param {number} startIndex - The index to start at.
* @param {number} amount - The number to upload.
*/
ParticleBuffer.prototype.uploadStatic = function uploadStatic(children, startIndex, amount) {
for (var i = 0; i < this.staticProperties.length; i++) {
var property = this.staticProperties[i];
property.uploadFunction(children, startIndex, amount, this.staticData, this.staticStride, property.offset);
}
this.staticBuffer.upload();
};
/**
* Destroys the ParticleBuffer.
*
*/
ParticleBuffer.prototype.destroy = function destroy() {
this.dynamicProperties = null;
this.dynamicData = null;
this.dynamicBuffer.destroy();
this.staticProperties = null;
this.staticData = null;
this.staticBuffer.destroy();
};
return ParticleBuffer;
}();
exports.default = ParticleBuffer;
//# sourceMappingURL=ParticleBuffer.js.map