@luma.gl/engine
Version:
3D Engine Components for luma.gl
46 lines • 1.75 kB
JavaScript
// luma.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
export function mergeShaderModuleBindingsIntoLayout(shaderLayout, modules) {
if (!shaderLayout || !modules.some(module => module.bindingLayout?.length)) {
return shaderLayout;
}
const mergedLayout = {
...shaderLayout,
bindings: shaderLayout.bindings.map(binding => ({ ...binding }))
};
if ('attributes' in (shaderLayout || {})) {
mergedLayout.attributes = shaderLayout?.attributes || [];
}
for (const module of modules) {
for (const bindingLayout of module.bindingLayout || []) {
for (const relatedBindingName of getRelatedBindingNames(bindingLayout.name)) {
const binding = mergedLayout.bindings.find(candidate => candidate.name === relatedBindingName);
if (binding?.group === 0) {
binding.group = bindingLayout.group;
}
}
}
}
return mergedLayout;
}
export function shaderModuleHasUniforms(module) {
return Boolean(module.uniformTypes && !isObjectEmpty(module.uniformTypes));
}
/** Returns binding-name aliases that should share the module-declared bind group. */
function getRelatedBindingNames(bindingName) {
const bindingNames = new Set([bindingName, `${bindingName}Uniforms`]);
if (!bindingName.endsWith('Uniforms')) {
bindingNames.add(`${bindingName}Sampler`);
}
return [...bindingNames];
}
function isObjectEmpty(obj) {
// @ts-ignore key is intentionally unused
// eslint-disable-next-line @typescript-eslint/no-unused-vars
for (const key in obj) {
return false;
}
return true;
}
//# sourceMappingURL=shader-module-utils.js.map