You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
4.7 KiB
JavaScript

import addExtensionsUsed from './addExtensionsUsed.js'
import addExtensionsRequired from './addExtensionsRequired.js'
import addToArray from './addToArray.js'
import ForEach from './ForEach.js'
import defined from '../../Core/defined.js'
/**
* Move glTF 1.0 material techniques to glTF 2.0 KHR_techniques_webgl extension.
*
* @param {Object} gltf A javascript object containing a glTF asset.
* @returns {Object} The updated glTF asset.
*
* @private
*/
function moveTechniquesToExtension(gltf) {
var techniquesLegacy = gltf.techniques;
var mappedUniforms = {};
var updatedTechniqueIndices = {};
if (defined(techniquesLegacy)) {
var extension = {
programs: [],
shaders: [],
techniques: []
};
// Some 1.1 models have a glExtensionsUsed property that can be transferred to program.glExtensions
var glExtensions = gltf.glExtensionsUsed;
delete gltf.glExtensionsUsed;
ForEach.technique(gltf, function (techniqueLegacy, techniqueIndex) {
var technique = {
name: techniqueLegacy.name,
program: undefined,
attributes: {},
uniforms: {}
};
var parameterLegacy;
ForEach.techniqueAttribute(techniqueLegacy, function (parameterName, attributeName) {
parameterLegacy = techniqueLegacy.parameters[parameterName];
technique.attributes[attributeName] = {
semantic: parameterLegacy.semantic
};
});
ForEach.techniqueUniform(techniqueLegacy, function (parameterName, uniformName) {
parameterLegacy = techniqueLegacy.parameters[parameterName];
technique.uniforms[uniformName] = {
count: parameterLegacy.count,
node: parameterLegacy.node,
type: parameterLegacy.type,
semantic: parameterLegacy.semantic,
value: parameterLegacy.value
};
// Store the name of the uniform to update material values.
mappedUniforms[parameterName] = uniformName;
});
var programLegacy = gltf.programs[techniqueLegacy.program];
var program = {
name: programLegacy.name,
fragmentShader: undefined,
vertexShader: undefined,
glExtensions: glExtensions
};
var fs = gltf.shaders[programLegacy.fragmentShader];
program.fragmentShader = addToArray(extension.shaders, fs, true);
var vs = gltf.shaders[programLegacy.vertexShader];
program.vertexShader = addToArray(extension.shaders, vs, true);
technique.program = addToArray(extension.programs, program);
// Store the index of the new technique to reference instead.
updatedTechniqueIndices[techniqueIndex] = addToArray(extension.techniques, technique);
});
if (extension.techniques.length > 0) {
if (!defined(gltf.extensions)) {
gltf.extensions = {};
}
gltf.extensions.KHR_techniques_webgl = extension;
addExtensionsUsed(gltf, 'KHR_techniques_webgl');
addExtensionsRequired(gltf, 'KHR_techniques_webgl');
}
}
ForEach.material(gltf, function (material) {
if (defined(material.technique)) {
var materialExtension = {
technique: updatedTechniqueIndices[material.technique]
};
ForEach.objectLegacy(material.values, function (value, parameterName) {
if (!defined(materialExtension.values)) {
materialExtension.values = {};
}
var uniformName = mappedUniforms[parameterName];
materialExtension.values[uniformName] = value;
});
if (!defined(material.extensions)) {
material.extensions = {};
}
material.extensions.KHR_techniques_webgl = materialExtension;
}
delete material.technique;
delete material.values;
});
delete gltf.techniques;
delete gltf.programs;
delete gltf.shaders;
return gltf;
}
export default moveTechniquesToExtension;