@luma.gl/gltools
Version:
WebGL2 API Polyfills for WebGL1 WebGLRenderingContext
191 lines (152 loc) • 5.33 kB
JavaScript
;
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