Don't discard primitives that don't match the attribute layout

This commit is contained in:
Sean Lilley 2018-10-17 21:42:28 -04:00
parent b781459234
commit b3d5407a26
1 changed files with 31 additions and 20 deletions

View File

@ -122,25 +122,44 @@ function loadObj(objPath, options) {
vertexCount = 0; vertexCount = 0;
} }
function useMaterial(name) { function reusePrimitive(callback) {
var material = getName(name);
activeMaterial = material;
// Look to see if this material has already been used by a primitive in the mesh
var primitives = mesh.primitives; var primitives = mesh.primitives;
var primitivesLength = primitives.length; var primitivesLength = primitives.length;
for (var i = 0; i < primitivesLength; ++i) { for (var i = 0; i < primitivesLength; ++i) {
if (primitives[i].material === material) { if (primitives[i].material === activeMaterial) {
if (!defined(callback) || callback(primitives[i])) {
primitive = primitives[i]; primitive = primitives[i];
clearVertexCache(); clearVertexCache();
vertexCount = primitive.positions.length / 3; vertexCount = primitive.positions.length / 3;
return; return;
} }
} }
// Add a new primitive with this material }
addPrimitive(); addPrimitive();
} }
function useMaterial(name) {
activeMaterial = getName(name);
reusePrimitive();
}
function faceAndPrimitiveMatch(uvs, normals, primitive) {
var faceHasUvs = uvs[0].length > 0;
var faceHasNormals = normals[0].length > 0;
var primitiveHasUvs = primitive.uvs.length > 0;
var primitiveHasNormals = primitive.normals.length > 0;
return primitiveHasUvs === faceHasUvs && primitiveHasNormals === faceHasNormals;
}
function checkPrimitive(uvs, normals) {
var firstFace = primitive.indices.length === 0;
if (!firstFace && !faceAndPrimitiveMatch(uvs, normals, primitive)) {
reusePrimitive(function(primitive) {
return faceAndPrimitiveMatch(uvs, normals, primitive);
});
}
}
function getOffset(a, attributeData, components) { function getOffset(a, attributeData, components) {
var i = parseInt(a); var i = parseInt(a);
if (i < 0) { if (i < 0) {
@ -261,16 +280,8 @@ function loadObj(objPath, options) {
function addFace(vertices, positions, uvs, normals) { function addFace(vertices, positions, uvs, normals) {
var i; var i;
var isWindingCorrect; var isWindingCorrect;
var firstFace = primitive.indices.length === 0;
var faceHasUvs = uvs[0].length > 0;
var faceHasNormals = normals[0].length > 0;
var primitiveHasUvs = primitive.uvs.length > 0;
var primitiveHasNormals = primitive.normals.length > 0;
if (!firstFace && (faceHasUvs !== primitiveHasUvs || faceHasNormals !== primitiveHasNormals)) { checkPrimitive(uvs, normals);
// Discard faces that don't use the same attributes
return;
}
if (vertices.length === 3) { if (vertices.length === 3) {
isWindingCorrect = checkWindingCorrect(positions[0], positions[1], positions[2], normals[0]); isWindingCorrect = checkWindingCorrect(positions[0], positions[1], positions[2], normals[0]);