This commit is contained in:
Sean Lilley 2018-10-31 20:47:52 -04:00
parent a55ea69661
commit eaca567a25
1 changed files with 28 additions and 24 deletions

View File

@ -199,7 +199,7 @@ function getTexture(gltf, texture) {
} }
function cloneMaterial(material, removeTextures) { function cloneMaterial(material, removeTextures) {
if (material === null || typeof material !== 'object') { if (typeof material !== 'object') {
return material; return material;
} else if (material instanceof Texture) { } else if (material instanceof Texture) {
if (removeTextures) { if (removeTextures) {
@ -236,7 +236,7 @@ function resolveTextures(gltf, material) {
} }
} }
function addMaterial(gltf, material) { function addGltfMaterial(gltf, material) {
resolveTextures(gltf, material); resolveTextures(gltf, material);
var materialIndex = gltf.materials.length; var materialIndex = gltf.materials.length;
gltf.materials.push(material); gltf.materials.push(material);
@ -261,12 +261,12 @@ function getMaterialIndex(materials, materialName) {
} }
} }
function getMaterial(gltf, materials, materialName) { function getOrCreateGltfMaterial(gltf, materials, materialName) {
var material = getMaterialByName(materials, materialName); var material = getMaterialByName(materials, materialName);
var materialIndex = getMaterialIndex(gltf.materials, materialName); var materialIndex = getMaterialIndex(gltf.materials, materialName);
if (!defined(materialIndex)) { if (!defined(materialIndex)) {
materialIndex = addMaterial(gltf, material); materialIndex = addGltfMaterial(gltf, material);
} }
return materialIndex; return materialIndex;
@ -277,6 +277,18 @@ function primitiveInfoMatch(a, b) {
a.hasNormals === b.hasNormals; a.hasNormals === b.hasNormals;
} }
function getSplitMaterialName(originalMaterialName, primitiveInfo, primitiveInfoByMaterial) {
var splitMaterialName = originalMaterialName;
var suffix = 2;
while (defined(primitiveInfoByMaterial[splitMaterialName])) {
if (primitiveInfoMatch(primitiveInfo, primitiveInfoByMaterial[splitMaterialName])) {
break;
}
splitMaterialName = originalMaterialName + '-' + suffix++;
}
return splitMaterialName;
}
function splitIncompatibleMaterials(nodes, materials, options) { function splitIncompatibleMaterials(nodes, materials, options) {
var splitMaterials = []; var splitMaterials = [];
var primitiveInfoByMaterial = {}; var primitiveInfoByMaterial = {};
@ -296,31 +308,23 @@ function splitIncompatibleMaterials(nodes, materials, options) {
hasNormals : hasNormals hasNormals : hasNormals
}; };
var originalMaterialName = defaultValue(primitive.material, 'default'); var originalMaterialName = defaultValue(primitive.material, 'default');
var materialName = originalMaterialName; var splitMaterialName = getSplitMaterialName(originalMaterialName, primitiveInfo, primitiveInfoByMaterial);
var suffix = 2; primitive.material = splitMaterialName;
while (defined(primitiveInfoByMaterial[materialName])) { primitiveInfoByMaterial[splitMaterialName] = primitiveInfo;
if (primitiveInfoMatch(primitiveInfo, primitiveInfoByMaterial[materialName])) {
break;
}
materialName = originalMaterialName + '-' + suffix++;
}
primitive.material = materialName; var splitMaterial = getMaterialByName(splitMaterials, splitMaterialName);
primitiveInfoByMaterial[materialName] = primitiveInfo; if (defined(splitMaterial)) {
var material = getMaterialByName(splitMaterials, materialName);
if (defined(material)) {
continue; continue;
} }
material = getMaterialByName(materials, originalMaterialName); var originalMaterial = getMaterialByName(materials, originalMaterialName);
if (defined(material)) { if (defined(originalMaterial)) {
material = cloneMaterial(material, !hasUvs); splitMaterial = cloneMaterial(originalMaterial, !hasUvs);
} else { } else {
material = getDefaultMaterial(options); splitMaterial = getDefaultMaterial(options);
} }
material.name = materialName; splitMaterial.name = splitMaterialName;
splitMaterials.push(material); splitMaterials.push(splitMaterial);
} }
} }
} }
@ -422,7 +426,7 @@ function addPrimitive(gltf, materials, bufferState, uint32Indices, mesh, primiti
primitive.uvs = undefined; primitive.uvs = undefined;
primitive.indices = undefined; primitive.indices = undefined;
var materialIndex = getMaterial(gltf, materials, primitive.material); var materialIndex = getOrCreateGltfMaterial(gltf, materials, primitive.material);
return { return {
attributes : attributes, attributes : attributes,