@luma.gl/shadertools
Version:
Shader module system for luma.gl
185 lines (155 loc) • 5.08 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
exports.normalizeShaderModule = normalizeShaderModule;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _utils = require("../utils");
var _propTypes = require("./filters/prop-types");
var VERTEX_SHADER = 'vs';
var FRAGMENT_SHADER = 'fs';
var ShaderModule = function () {
function ShaderModule(_ref) {
var name = _ref.name,
vs = _ref.vs,
fs = _ref.fs,
_ref$dependencies = _ref.dependencies,
dependencies = _ref$dependencies === void 0 ? [] : _ref$dependencies,
uniforms = _ref.uniforms,
getUniforms = _ref.getUniforms,
_ref$deprecations = _ref.deprecations,
deprecations = _ref$deprecations === void 0 ? [] : _ref$deprecations,
_ref$defines = _ref.defines,
defines = _ref$defines === void 0 ? {} : _ref$defines,
_ref$inject = _ref.inject,
inject = _ref$inject === void 0 ? {} : _ref$inject,
vertexShader = _ref.vertexShader,
fragmentShader = _ref.fragmentShader;
(0, _classCallCheck2.default)(this, ShaderModule);
(0, _utils.assert)(typeof name === 'string');
this.name = name;
this.vs = vs || vertexShader;
this.fs = fs || fragmentShader;
this.getModuleUniforms = getUniforms;
this.dependencies = dependencies;
this.deprecations = this._parseDeprecationDefinitions(deprecations);
this.defines = defines;
this.injections = normalizeInjections(inject);
if (uniforms) {
this.uniforms = (0, _propTypes.parsePropTypes)(uniforms);
}
}
(0, _createClass2.default)(ShaderModule, [{
key: "getModuleSource",
value: function getModuleSource(type) {
var moduleSource;
switch (type) {
case VERTEX_SHADER:
moduleSource = this.vs || '';
break;
case FRAGMENT_SHADER:
moduleSource = this.fs || '';
break;
default:
(0, _utils.assert)(false);
}
return "#define MODULE_".concat(this.name.toUpperCase().replace(/[^0-9a-z]/gi, '_'), "\n").concat(moduleSource, "// END MODULE_").concat(this.name, "\n\n");
}
}, {
key: "getUniforms",
value: function getUniforms(opts, uniforms) {
if (this.getModuleUniforms) {
return this.getModuleUniforms(opts, uniforms);
}
if (this.uniforms) {
return this._defaultGetUniforms(opts);
}
return {};
}
}, {
key: "getDefines",
value: function getDefines() {
return this.defines;
}
}, {
key: "checkDeprecations",
value: function checkDeprecations(shaderSource, log) {
this.deprecations.forEach(function (def) {
if (def.regex.test(shaderSource)) {
if (def.deprecated) {
log.deprecated(def.old, def.new)();
} else {
log.removed(def.old, def.new)();
}
}
});
}
}, {
key: "_parseDeprecationDefinitions",
value: function _parseDeprecationDefinitions(deprecations) {
deprecations.forEach(function (def) {
switch (def.type) {
case 'function':
def.regex = new RegExp("\\b".concat(def.old, "\\("));
break;
default:
def.regex = new RegExp("".concat(def.type, " ").concat(def.old, ";"));
}
});
return deprecations;
}
}, {
key: "_defaultGetUniforms",
value: function _defaultGetUniforms() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var uniforms = {};
var propTypes = this.uniforms;
for (var key in propTypes) {
var propDef = propTypes[key];
if (key in opts && !propDef.private) {
if (propDef.validate) {
(0, _utils.assert)(propDef.validate(opts[key], propDef), "".concat(this.name, ": invalid ").concat(key));
}
uniforms[key] = opts[key];
} else {
uniforms[key] = propDef.value;
}
}
return uniforms;
}
}]);
return ShaderModule;
}();
exports.default = ShaderModule;
function normalizeShaderModule(module) {
if (!module.normalized) {
module.normalized = true;
if (module.uniforms && !module.getUniforms) {
var shaderModule = new ShaderModule(module);
module.getUniforms = shaderModule.getUniforms.bind(shaderModule);
}
}
return module;
}
function normalizeInjections(injections) {
var result = {
vs: {},
fs: {}
};
for (var hook in injections) {
var injection = injections[hook];
var stage = hook.slice(0, 2);
if (typeof injection === 'string') {
injection = {
order: 0,
injection: injection
};
}
result[stage][hook] = injection;
}
return result;
}
//# sourceMappingURL=shader-module.js.map
;