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
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;
|