UNPKG

@luma.gl/gltools

Version:

WebGL2 API Polyfills for WebGL1 WebGLRenderingContext

191 lines (152 loc) 5.33 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.popContextState = popContextState; exports.pushContextState = pushContextState; exports.trackContextState = trackContextState; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _webglParameterTables = require("./webgl-parameter-tables"); var _unifiedParameterApi = require("./unified-parameter-api"); var _assert = require("../utils/assert"); var _utils = require("../utils/utils"); function installGetterOverride(gl, functionName) { var originalGetterFunc = gl[functionName].bind(gl); gl[functionName] = function get() { var pname = arguments.length <= 0 ? undefined : arguments[0]; if (!(pname in gl.state.cache)) { return originalGetterFunc.apply(void 0, arguments); } return gl.state.enable ? gl.state.cache[pname] : originalGetterFunc.apply(void 0, arguments); }; Object.defineProperty(gl[functionName], 'name', { value: "".concat(functionName, "-from-cache"), configurable: false }); } function installSetterSpy(gl, functionName, setter) { var originalSetterFunc = gl[functionName].bind(gl); gl[functionName] = function set() { for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) { params[_key] = arguments[_key]; } var _setter = setter.apply(void 0, [gl.state._updateCache].concat(params)), valueChanged = _setter.valueChanged, oldValue = _setter.oldValue; if (valueChanged) { originalSetterFunc.apply(void 0, params); } return oldValue; }; Object.defineProperty(gl[functionName], 'name', { value: "".concat(functionName, "-to-cache"), configurable: false }); } function installProgramSpy(gl) { var originalUseProgram = gl.useProgram.bind(gl); gl.useProgram = function useProgramLuma(handle) { if (gl.state.program !== handle) { originalUseProgram(handle); gl.state.program = handle; } }; } var GLState = function () { function GLState(gl) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$copyState = _ref.copyState, copyState = _ref$copyState === void 0 ? false : _ref$copyState, _ref$log = _ref.log, log = _ref$log === void 0 ? function () {} : _ref$log; (0, _classCallCheck2.default)(this, GLState); this.gl = gl; this.program = null; this.stateStack = []; this.enable = true; this.cache = copyState ? (0, _unifiedParameterApi.getParameters)(gl) : Object.assign({}, _webglParameterTables.GL_PARAMETER_DEFAULTS); this.log = log; this._updateCache = this._updateCache.bind(this); Object.seal(this); } (0, _createClass2.default)(GLState, [{ key: "push", value: function push() { var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; this.stateStack.push({}); } }, { key: "pop", value: function pop() { (0, _assert.assert)(this.stateStack.length > 0); var oldValues = this.stateStack[this.stateStack.length - 1]; (0, _unifiedParameterApi.setParameters)(this.gl, oldValues); this.stateStack.pop(); } }, { key: "_updateCache", value: function _updateCache(values) { var valueChanged = false; var oldValue; var oldValues = this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1]; for (var key in values) { (0, _assert.assert)(key !== undefined); var value = values[key]; var cached = this.cache[key]; if (!(0, _utils.deepArrayEqual)(value, cached)) { valueChanged = true; oldValue = cached; if (oldValues && !(key in oldValues)) { oldValues[key] = cached; } this.cache[key] = value; } } return { valueChanged: valueChanged, oldValue: oldValue }; } }]); return GLState; }(); function trackContextState(gl) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var _options$enable = options.enable, enable = _options$enable === void 0 ? true : _options$enable, copyState = options.copyState; (0, _assert.assert)(copyState !== undefined); if (!gl.state) { var polyfillContext = globalThis.polyfillContext; if (polyfillContext) { polyfillContext(gl); } gl.state = new GLState(gl, { copyState: copyState }); installProgramSpy(gl); for (var key in _webglParameterTables.GL_HOOKED_SETTERS) { var setter = _webglParameterTables.GL_HOOKED_SETTERS[key]; installSetterSpy(gl, key, setter); } installGetterOverride(gl, 'getParameter'); installGetterOverride(gl, 'isEnabled'); } gl.state.enable = enable; return gl; } function pushContextState(gl) { if (!gl.state) { trackContextState(gl, { copyState: false }); } gl.state.push(); } function popContextState(gl) { (0, _assert.assert)(gl.state); gl.state.pop(); } //# sourceMappingURL=track-context-state.js.map