From 78a41c35a70de6a3c59703306589e248b29ffe48 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Fri, 17 Nov 2017 11:53:04 -0500 Subject: [PATCH 1/2] Load mtllib that has spaces in its path --- lib/loadObj.js | 21 +++++++- .../box-mtllib-spaces/box mtllib blue.mtl | 12 +++++ .../box-mtllib-spaces/box mtllib green.mtl | 12 +++++ .../data/box-mtllib-spaces/box mtllib red.mtl | 12 +++++ specs/data/box-mtllib-spaces/box mtllib.obj | 50 +++++++++++++++++++ specs/lib/loadObjSpec.js | 21 ++++++++ 6 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 specs/data/box-mtllib-spaces/box mtllib blue.mtl create mode 100644 specs/data/box-mtllib-spaces/box mtllib green.mtl create mode 100644 specs/data/box-mtllib-spaces/box mtllib red.mtl create mode 100644 specs/data/box-mtllib-spaces/box mtllib.obj diff --git a/lib/loadObj.js b/lib/loadObj.js index 6aa504f..fb810a4 100644 --- a/lib/loadObj.js +++ b/lib/loadObj.js @@ -437,8 +437,8 @@ function loadObj(objPath, options) { var materialName = line.substring(7).trim(); useMaterial(materialName); } else if (/^mtllib/i.test(line)) { - var paths = line.substring(7).trim().split(' '); - mtlPaths = mtlPaths.concat(paths); + var mtllibLine = line.substring(7).trim(); + mtlPaths = mtlPaths.concat(getMtlPaths(mtllibLine)); } else if ((result = vertexPattern.exec(line)) !== null) { positions.push(parseFloat(result[1])); positions.push(parseFloat(result[2])); @@ -495,6 +495,23 @@ function loadObj(objPath, options) { }); } +function getMtlPaths(mtllibLine) { + // Handle paths with spaces. E.g. mtllib my material file.mtl + var mtlPaths = []; + var splits = mtllibLine.split(' '); + var length = splits.length; + var startIndex = 0; + for (var i = 0; i < length; ++i) { + if (path.extname(splits[i]) === '') { + continue; + } + var mtlPath = splits.slice(startIndex, i + 1).join(' '); + mtlPaths.push(mtlPath); + startIndex = i + 1; + } + return mtlPaths; +} + function finishLoading(nodes, mtlPaths, objPath, options) { nodes = cleanNodes(nodes); if (nodes.length === 0) { diff --git a/specs/data/box-mtllib-spaces/box mtllib blue.mtl b/specs/data/box-mtllib-spaces/box mtllib blue.mtl new file mode 100644 index 0000000..d3fe863 --- /dev/null +++ b/specs/data/box-mtllib-spaces/box mtllib blue.mtl @@ -0,0 +1,12 @@ +# Blender MTL File: 'box-multiple-materials.blend' +# Material Count: 1 + +newmtl Blue +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.000000 0.000000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/specs/data/box-mtllib-spaces/box mtllib green.mtl b/specs/data/box-mtllib-spaces/box mtllib green.mtl new file mode 100644 index 0000000..89abba9 --- /dev/null +++ b/specs/data/box-mtllib-spaces/box mtllib green.mtl @@ -0,0 +1,12 @@ +# Blender MTL File: 'box-multiple-materials.blend' +# Material Count: 1 + +newmtl Green +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.000000 0.640000 0.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/specs/data/box-mtllib-spaces/box mtllib red.mtl b/specs/data/box-mtllib-spaces/box mtllib red.mtl new file mode 100644 index 0000000..3721d86 --- /dev/null +++ b/specs/data/box-mtllib-spaces/box mtllib red.mtl @@ -0,0 +1,12 @@ +# Blender MTL File: 'box-multiple-materials.blend' +# Material Count: 1 + +newmtl Red +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.640000 0.000000 0.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/specs/data/box-mtllib-spaces/box mtllib.obj b/specs/data/box-mtllib-spaces/box mtllib.obj new file mode 100644 index 0000000..fe03d89 --- /dev/null +++ b/specs/data/box-mtllib-spaces/box mtllib.obj @@ -0,0 +1,50 @@ +# Blender v2.78 (sub 0) OBJ File: 'box-multiple-materials.blend' +# www.blender.org +mtllib box mtllib red.mtl +mtllib box mtllib green.mtl box mtllib blue.mtl +v -1.000000 -1.000000 1.000000 +v -1.000000 1.000000 1.000000 +v -1.000000 -1.000000 -1.000000 +v -1.000000 1.000000 -1.000000 +v 1.000000 -1.000000 1.000000 +v 1.000000 1.000000 1.000000 +v 1.000000 -1.000000 -1.000000 +v 1.000000 1.000000 -1.000000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +usemtl Red +f 3/1/1 7/2/1 5/3/1 1/4/1 +usemtl Green +f 1/9/3 2/10/3 4/11/3 3/12/3 +usemtl Blue +f 3/1/5 4/6/5 8/17/5 7/18/5 +usemtl Red +f 8/5/2 4/6/2 2/7/2 6/8/2 +usemtl Green +f 7/13/4 8/14/4 6/15/4 5/16/4 +usemtl Blue +f 5/19/6 6/20/6 2/7/6 1/4/6 diff --git a/specs/lib/loadObjSpec.js b/specs/lib/loadObjSpec.js index a2c3c10..9014b6b 100644 --- a/specs/lib/loadObjSpec.js +++ b/specs/lib/loadObjSpec.js @@ -21,6 +21,7 @@ var objNoMaterialsPath = 'specs/data/box-no-materials/box-no-materials.obj'; var objMultipleMaterialsPath = 'specs/data/box-multiple-materials/box-multiple-materials.obj'; var objUncleanedPath = 'specs/data/box-uncleaned/box-uncleaned.obj'; var objMtllibPath = 'specs/data/box-mtllib/box-mtllib.obj'; +var objMtllibSpacesPath = 'specs/data/box-mtllib-spaces/box mtllib.obj'; var objMissingMtllibPath = 'specs/data/box-missing-mtllib/box-missing-mtllib.obj'; var objExternalResourcesPath = 'specs/data/box-external-resources/box-external-resources.obj'; var objTexturedPath = 'specs/data/box-textured/box-textured.obj'; @@ -289,6 +290,26 @@ describe('loadObj', function() { }), done).toResolve(); }); + it('loads obj with mtllib paths with spaces', function(done) { + expect(loadObj(objMtllibSpacesPath, options) + .then(function(data) { + var materials = data.materials; + expect(materials.length).toBe(3); + + // .mtl files are loaded in an arbitrary order, so sort for testing purposes + materials.sort(function(a, b){ + return a.name.localeCompare(b.name); + }); + + expect(materials[0].name).toBe('Blue'); + expect(materials[0].pbrMetallicRoughness.baseColorFactor).toEqual([0.0, 0.0, 0.64, 1.0]); + expect(materials[1].name).toBe('Green'); + expect(materials[1].pbrMetallicRoughness.baseColorFactor).toEqual([0.0, 0.64, 0.0, 1.0]); + expect(materials[2].name).toBe('Red'); + expect(materials[2].pbrMetallicRoughness.baseColorFactor).toEqual([0.64, 0.0, 0.0, 1.0]); + }), done).toResolve(); + }); + it('loads obj with missing mtllib', function(done) { var spy = jasmine.createSpy('logger'); options.logger = spy; From 0eddab51f923cb7f0b583d1fcfe9fc9e8715d86f Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Wed, 29 Nov 2017 13:49:30 -0500 Subject: [PATCH 2/2] Change extension check --- lib/loadObj.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/loadObj.js b/lib/loadObj.js index fb810a4..12a3059 100644 --- a/lib/loadObj.js +++ b/lib/loadObj.js @@ -502,7 +502,7 @@ function getMtlPaths(mtllibLine) { var length = splits.length; var startIndex = 0; for (var i = 0; i < length; ++i) { - if (path.extname(splits[i]) === '') { + if (path.extname(splits[i]) !== '.mtl') { continue; } var mtlPath = splits.slice(startIndex, i + 1).join(' ');