'use strict'; exports.__esModule = true; var _mapWebGLBlendModesToPixi = require('./utils/mapWebGLBlendModesToPixi'); var _mapWebGLBlendModesToPixi2 = _interopRequireDefault(_mapWebGLBlendModesToPixi); 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"); } } var BLEND = 0; var DEPTH_TEST = 1; var FRONT_FACE = 2; var CULL_FACE = 3; var BLEND_FUNC = 4; /** * A WebGL state machines * * @memberof PIXI * @class */ var WebGLState = function () { /** * @param {WebGLRenderingContext} gl - The current WebGL rendering context */ function WebGLState(gl) { _classCallCheck(this, WebGLState); /** * The current active state * * @member {Uint8Array} */ this.activeState = new Uint8Array(16); /** * The default state * * @member {Uint8Array} */ this.defaultState = new Uint8Array(16); // default blend mode.. this.defaultState[0] = 1; /** * The current state index in the stack * * @member {number} * @private */ this.stackIndex = 0; /** * The stack holding all the different states * * @member {Array<*>} * @private */ this.stack = []; /** * The current WebGL rendering context * * @member {WebGLRenderingContext} */ this.gl = gl; this.maxAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS); this.attribState = { tempAttribState: new Array(this.maxAttribs), attribState: new Array(this.maxAttribs) }; this.blendModes = (0, _mapWebGLBlendModesToPixi2.default)(gl); // check we have vao.. this.nativeVaoExtension = gl.getExtension('OES_vertex_array_object') || gl.getExtension('MOZ_OES_vertex_array_object') || gl.getExtension('WEBKIT_OES_vertex_array_object'); } /** * Pushes a new active state */ WebGLState.prototype.push = function push() { // next state.. var state = this.stack[this.stackIndex]; if (!state) { state = this.stack[this.stackIndex] = new Uint8Array(16); } ++this.stackIndex; // copy state.. // set active state so we can force overrides of gl state for (var i = 0; i < this.activeState.length; i++) { state[i] = this.activeState[i]; } }; /** * Pops a state out */ WebGLState.prototype.pop = function pop() { var state = this.stack[--this.stackIndex]; this.setState(state); }; /** * Sets the current state * * @param {*} state - The state to set. */ WebGLState.prototype.setState = function setState(state) { this.setBlend(state[BLEND]); this.setDepthTest(state[DEPTH_TEST]); this.setFrontFace(state[FRONT_FACE]); this.setCullFace(state[CULL_FACE]); this.setBlendMode(state[BLEND_FUNC]); }; /** * Enables or disabled blending. * * @param {boolean} value - Turn on or off webgl blending. */ WebGLState.prototype.setBlend = function setBlend(value) { value = value ? 1 : 0; if (this.activeState[BLEND] === value) { return; } this.activeState[BLEND] = value; this.gl[value ? 'enable' : 'disable'](this.gl.BLEND); }; /** * Sets the blend mode. * * @param {number} value - The blend mode to set to. */ WebGLState.prototype.setBlendMode = function setBlendMode(value) { if (value === this.activeState[BLEND_FUNC]) { return; } this.activeState[BLEND_FUNC] = value; var mode = this.blendModes[value]; if (mode.length === 2) { this.gl.blendFunc(mode[0], mode[1]); } else { this.gl.blendFuncSeparate(mode[0], mode[1], mode[2], mode[3]); } }; /** * Sets whether to enable or disable depth test. * * @param {boolean} value - Turn on or off webgl depth testing. */ WebGLState.prototype.setDepthTest = function setDepthTest(value) { value = value ? 1 : 0; if (this.activeState[DEPTH_TEST] === value) { return; } this.activeState[DEPTH_TEST] = value; this.gl[value ? 'enable' : 'disable'](this.gl.DEPTH_TEST); }; /** * Sets whether to enable or disable cull face. * * @param {boolean} value - Turn on or off webgl cull face. */ WebGLState.prototype.setCullFace = function setCullFace(value) { value = value ? 1 : 0; if (this.activeState[CULL_FACE] === value) { return; } this.activeState[CULL_FACE] = value; this.gl[value ? 'enable' : 'disable'](this.gl.CULL_FACE); }; /** * Sets the gl front face. * * @param {boolean} value - true is clockwise and false is counter-clockwise */ WebGLState.prototype.setFrontFace = function setFrontFace(value) { value = value ? 1 : 0; if (this.activeState[FRONT_FACE] === value) { return; } this.activeState[FRONT_FACE] = value; this.gl.frontFace(this.gl[value ? 'CW' : 'CCW']); }; /** * Disables all the vaos in use * */ WebGLState.prototype.resetAttributes = function resetAttributes() { for (var i = 0; i < this.attribState.tempAttribState.length; i++) { this.attribState.tempAttribState[i] = 0; } for (var _i = 0; _i < this.attribState.attribState.length; _i++) { this.attribState.attribState[_i] = 0; } // im going to assume one is always active for performance reasons. for (var _i2 = 1; _i2 < this.maxAttribs; _i2++) { this.gl.disableVertexAttribArray(_i2); } }; // used /** * Resets all the logic and disables the vaos */ WebGLState.prototype.resetToDefault = function resetToDefault() { // unbind any VAO if they exist.. if (this.nativeVaoExtension) { this.nativeVaoExtension.bindVertexArrayOES(null); } // reset all attributes.. this.resetAttributes(); // set active state so we can force overrides of gl state for (var i = 0; i < this.activeState.length; ++i) { this.activeState[i] = 32; } this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, false); this.setState(this.defaultState); }; return WebGLState; }(); exports.default = WebGLState; //# sourceMappingURL=WebGLState.js.map