@luma.gl/shadertools
Version:
Shader module system for luma.gl
100 lines (98 loc) • 3.38 kB
JavaScript
// luma.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import { makePropValidators, getValidatedProperties } from "../filters/prop-types.js";
import { normalizeInjections } from "../shader-assembly/shader-injections.js";
// SHNDER MODULE API
export function initializeShaderModules(modules) {
modules.map((module) => initializeShaderModule(module));
}
export function initializeShaderModule(module) {
if (module.instance) {
return;
}
initializeShaderModules(module.dependencies || []);
const { propTypes = {}, deprecations = [],
// defines = {},
inject = {} } = module;
const instance = {
normalizedInjections: normalizeInjections(inject),
parsedDeprecations: parseDeprecationDefinitions(deprecations)
};
if (propTypes) {
instance.propValidators = makePropValidators(propTypes);
}
module.instance = instance;
// TODO(ib) - we need to apply the original prop types to the default uniforms
let defaultProps = {};
if (propTypes) {
defaultProps = Object.entries(propTypes).reduce((obj, [key, propType]) => {
// @ts-expect-error
const value = propType?.value;
if (value) {
// @ts-expect-error
obj[key] = value;
}
return obj;
}, {});
}
module.defaultUniforms = { ...module.defaultUniforms, ...defaultProps };
}
/** Convert module props to uniforms */
export function getShaderModuleUniforms(module, props, oldUniforms) {
initializeShaderModule(module);
const uniforms = oldUniforms || { ...module.defaultUniforms };
// If module has a getUniforms function, use it
if (props && module.getUniforms) {
return module.getUniforms(props, uniforms);
}
// Build uniforms from the uniforms array
// @ts-expect-error
return getValidatedProperties(props, module.instance?.propValidators, module.name);
}
/* TODO this looks like it was unused code
_defaultGetUniforms(opts: Record<string, any> = {}): Record<string, any> {
const uniforms: Record<string, any> = {};
const propTypes = this.uniforms;
for (const key in propTypes) {
const propDef = propTypes[key];
if (key in opts && !propDef.private) {
if (propDef.validate) {
assert(propDef.validate(opts[key], propDef), `${this.name}: invalid ${key}`);
}
uniforms[key] = opts[key];
} else {
uniforms[key] = propDef.value;
}
}
return uniforms;
}
}
*/
// Warn about deprecated uniforms or functions
export function checkShaderModuleDeprecations(shaderModule, shaderSource, log) {
shaderModule.deprecations?.forEach(def => {
if (def.regex?.test(shaderSource)) {
if (def.deprecated) {
log.deprecated(def.old, def.new)();
}
else {
log.removed(def.old, def.new)();
}
}
});
}
// HELPERS
function parseDeprecationDefinitions(deprecations) {
deprecations.forEach(def => {
switch (def.type) {
case 'function':
def.regex = new RegExp(`\\b${def.old}\\(`);
break;
default:
def.regex = new RegExp(`${def.type} ${def.old};`);
}
});
return deprecations;
}
//# sourceMappingURL=shader-module.js.map