Merge pull request #150 from AnalyticalGraphicsInc/fix-paths

Normalize Windows paths correctly
This commit is contained in:
Matthew Amato 2018-08-31 14:59:38 -04:00 committed by GitHub
commit 37f55a008a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 157 additions and 86 deletions

View File

@ -3,6 +3,7 @@ Change Log
### 2.3.0 ??? ### 2.3.0 ???
* Fixed normalization on Windows paths running the converter on Linux. [#150](https://github.com/AnalyticalGraphicsInc/obj2gltf/pull/150)
* Added ability to use the first material in the mtl file when the obj is missing `usemtl`. [#133](https://github.com/AnalyticalGraphicsInc/obj2gltf/pull/133) * Added ability to use the first material in the mtl file when the obj is missing `usemtl`. [#133](https://github.com/AnalyticalGraphicsInc/obj2gltf/pull/133)
* Fixed handling of unnormalized input normals. [#136](https://github.com/AnalyticalGraphicsInc/obj2gltf/pull/136) * Fixed handling of unnormalized input normals. [#136](https://github.com/AnalyticalGraphicsInc/obj2gltf/pull/136)

View File

@ -81,19 +81,15 @@ function loadMtl(mtlPath, options) {
materials.push(material); materials.push(material);
} }
/** function normalizeTexturePath(texturePath, mtlDirectory) {
* Removes texture options from texture name // Removes texture options from texture name
* NOTE: assumes no spaces in texture name // Assumes no spaces in texture name
*
* @param {String} name
* @returns {String} The clean texture name
*/
function cleanTextureName (name) {
var re = /-(bm|t|s|o|blendu|blendv|boost|mm|texres|clamp|imfchan|type)/; var re = /-(bm|t|s|o|blendu|blendv|boost|mm|texres|clamp|imfchan|type)/;
if (re.test(name)) { if (re.test(texturePath)) {
return name.split(/\s+/).pop(); texturePath = texturePath.split(/\s+/).pop();
} }
return name; texturePath = texturePath.replace(/\\/g, '/');
return path.normalize(path.join(mtlDirectory, texturePath));
} }
function parseLine(line) { function parseLine(line) {
@ -144,31 +140,31 @@ function loadMtl(mtlPath, options) {
material.alpha = correctAlpha(1.0 - parseFloat(value)); material.alpha = correctAlpha(1.0 - parseFloat(value));
} else if (/^map_Ka /i.test(line)) { } else if (/^map_Ka /i.test(line)) {
if (!defined(overridingAmbientTexture)) { if (!defined(overridingAmbientTexture)) {
material.ambientTexture = path.resolve(mtlDirectory, cleanTextureName(line.substring(7).trim())); material.ambientTexture = normalizeTexturePath(line.substring(7).trim(), mtlDirectory);
} }
} else if (/^map_Ke /i.test(line)) { } else if (/^map_Ke /i.test(line)) {
if (!defined(overridingEmissiveTexture)) { if (!defined(overridingEmissiveTexture)) {
material.emissiveTexture = path.resolve(mtlDirectory, cleanTextureName(line.substring(7).trim())); material.emissiveTexture = normalizeTexturePath(line.substring(7).trim(), mtlDirectory);
} }
} else if (/^map_Kd /i.test(line)) { } else if (/^map_Kd /i.test(line)) {
if (!defined(overridingDiffuseTexture)) { if (!defined(overridingDiffuseTexture)) {
material.diffuseTexture = path.resolve(mtlDirectory, cleanTextureName(line.substring(7).trim())); material.diffuseTexture = normalizeTexturePath(line.substring(7).trim(), mtlDirectory);
} }
} else if (/^map_Ks /i.test(line)) { } else if (/^map_Ks /i.test(line)) {
if (!defined(overridingSpecularTexture)) { if (!defined(overridingSpecularTexture)) {
material.specularTexture = path.resolve(mtlDirectory, cleanTextureName(line.substring(7).trim())); material.specularTexture = normalizeTexturePath(line.substring(7).trim(), mtlDirectory);
} }
} else if (/^map_Ns /i.test(line)) { } else if (/^map_Ns /i.test(line)) {
if (!defined(overridingSpecularShininessTexture)) { if (!defined(overridingSpecularShininessTexture)) {
material.specularShininessTexture = path.resolve(mtlDirectory, cleanTextureName(line.substring(7).trim())); material.specularShininessTexture = normalizeTexturePath(line.substring(7).trim(), mtlDirectory);
} }
} else if (/^map_Bump /i.test(line)) { } else if (/^map_Bump /i.test(line)) {
if (!defined(overridingNormalTexture)) { if (!defined(overridingNormalTexture)) {
material.normalTexture = path.resolve(mtlDirectory, cleanTextureName(line.substring(9).trim())); material.normalTexture = normalizeTexturePath(line.substring(9).trim(), mtlDirectory);
} }
} else if (/^map_d /i.test(line)) { } else if (/^map_d /i.test(line)) {
if (!defined(overridingAlphaTexture)) { if (!defined(overridingAlphaTexture)) {
material.alphaTexture = path.resolve(mtlDirectory, cleanTextureName(line.substring(6).trim())); material.alphaTexture = normalizeTexturePath(line.substring(6).trim(), mtlDirectory);
} }
} }
} }
@ -244,7 +240,7 @@ function loadMaterialTexture(material, name, textureOptions, mtlDirectory, textu
var texturePromise = texturePromiseMap[texturePath]; var texturePromise = texturePromiseMap[texturePath];
if (!defined(texturePromise)) { if (!defined(texturePromise)) {
var shallowPath = path.resolve(path.join(mtlDirectory, path.basename(texturePath))); var shallowPath = path.join(mtlDirectory, path.basename(texturePath));
if (options.secure && outsideDirectory(texturePath, mtlDirectory)) { if (options.secure && outsideDirectory(texturePath, mtlDirectory)) {
// Try looking for the texture in the same directory as the obj // Try looking for the texture in the same directory as the obj
options.logger('Texture file is outside of the mtl directory and the secure flag is true. Attempting to read the texture file from within the obj directory instead.'); options.logger('Texture file is outside of the mtl directory and the secure flag is true. Attempting to read the texture file from within the obj directory instead.');

View File

@ -540,6 +540,11 @@ function finishLoading(nodes, mtlPaths, objPath, options) {
}); });
} }
function normalizeMtlPath(mtlPath, objDirectory) {
mtlPath = mtlPath.replace(/\\/g, '/');
return path.normalize(path.join(objDirectory, mtlPath));
}
function loadMtls(mtlPaths, objPath, options) { function loadMtls(mtlPaths, objPath, options) {
var objDirectory = path.dirname(objPath); var objDirectory = path.dirname(objPath);
var materials = []; var materials = [];
@ -550,8 +555,8 @@ function loadMtls(mtlPaths, objPath, options) {
}); });
return Promise.map(mtlPaths, function(mtlPath) { return Promise.map(mtlPaths, function(mtlPath) {
mtlPath = path.resolve(objDirectory, mtlPath); mtlPath = normalizeMtlPath(mtlPath, objDirectory);
var shallowPath = path.resolve(path.join(objDirectory, path.basename(mtlPath))); var shallowPath = path.join(objDirectory, path.basename(mtlPath));
if (options.secure && outsideDirectory(mtlPath, objDirectory)) { if (options.secure && outsideDirectory(mtlPath, objDirectory)) {
// Try looking for the .mtl in the same directory as the obj // Try looking for the .mtl in the same directory as the obj
options.logger('The material file is outside of the obj directory and the secure flag is true. Attempting to read the material file from within the obj directory instead.'); options.logger('The material file is outside of the obj directory and the secure flag is true. Attempting to read the material file from within the obj directory instead.');

View File

@ -1,19 +1,19 @@
# Blender MTL File: 'box.blend' # Blender MTL File: 'box.blend'
# Material Count: 1 # Material Count: 1
newmtl Material newmtl Material
Ns 96.078431 Ns 96.078431
Ka 0.200000 0.200000 0.200000 Ka 0.200000 0.200000 0.200000
Kd 0.640000 0.640000 0.640000 Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000 Ks 0.500000 0.500000 0.500000
Ke 0.100000 0.100000 0.100000 Ke 0.100000 0.100000 0.100000
Ni 1.000000 Ni 1.000000
d 0.900000 d 0.900000
Tr 0.100000 Tr 0.100000
map_Ka -s 1.0 1.0 1.0 -o 0.0 0.0 0.0 ambient.gif map_Ka -s 1.0 1.0 1.0 -o 0.0 0.0 0.0 ambient.gif
map_Ke -s 1.0 1.0 1.0 -o 0.0 0.0 0.0 emission.jpg map_Ke -s 1.0 1.0 1.0 -o 0.0 0.0 0.0 emission.jpg
map_Kd -s 1.0 1.0 1.0 -o 0.0 0.0 0.0 diffuse.png map_Kd -s 1.0 1.0 1.0 -o 0.0 0.0 0.0 diffuse.png
map_Ks -s 1.0 1.0 1.0 -o 0.0 0.0 0.0 specular.jpeg map_Ks -s 1.0 1.0 1.0 -o 0.0 0.0 0.0 specular.jpeg
map_Ns -s 1.0 1.0 1.0 -o 0.0 0.0 0.0 shininess.png map_Ns -s 1.0 1.0 1.0 -o 0.0 0.0 0.0 shininess.png
map_Bump -bm 0.2 bump.png map_Bump -bm 0.2 bump.png
illum 2 illum 2

View File

@ -1,46 +1,46 @@
# Blender v2.78 (sub 0) OBJ File: 'box.blend' # Blender v2.78 (sub 0) OBJ File: 'box.blend'
# www.blender.org # www.blender.org
mtllib box-texture-options.mtl mtllib box-texture-options.mtl
o Cube o Cube
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
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 0.0000 0.0000
vt 1.0000 0.0000 vt 1.0000 0.0000
vt 1.0000 1.0000 vt 1.0000 1.0000
vt 0.0000 1.0000 vt 0.0000 1.0000
vt 0.0000 0.0000 vt 0.0000 0.0000
vt 1.0000 0.0000 vt 1.0000 0.0000
vt 1.0000 1.0000 vt 1.0000 1.0000
vt 0.0000 1.0000 vt 0.0000 1.0000
vt 0.0000 0.0000 vt 0.0000 0.0000
vt 1.0000 0.0000 vt 1.0000 0.0000
vt 1.0000 1.0000 vt 1.0000 1.0000
vt 0.0000 1.0000 vt 0.0000 1.0000
vt 0.0000 0.0000 vt 0.0000 0.0000
vt 1.0000 0.0000 vt 1.0000 0.0000
vt 1.0000 1.0000 vt 1.0000 1.0000
vt 0.0000 1.0000 vt 0.0000 1.0000
vt 1.0000 0.0000 vt 1.0000 0.0000
vt 1.0000 1.0000 vt 1.0000 1.0000
vt 0.0000 0.0000 vt 0.0000 0.0000
vt 0.0000 1.0000 vt 0.0000 1.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
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
vn 0.0000 -1.0000 0.0000 vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000 vn 0.0000 1.0000 0.0000
usemtl Material usemtl Material
s off s off
f 1/1/1 2/2/1 4/3/1 3/4/1 f 1/1/1 2/2/1 4/3/1 3/4/1
f 3/5/2 4/6/2 8/7/2 7/8/2 f 3/5/2 4/6/2 8/7/2 7/8/2
f 7/9/3 8/10/3 6/11/3 5/12/3 f 7/9/3 8/10/3 6/11/3 5/12/3
f 5/13/4 6/14/4 2/15/4 1/16/4 f 5/13/4 6/14/4 2/15/4 1/16/4
f 3/5/5 7/17/5 5/18/5 1/16/5 f 3/5/5 7/17/5 5/18/5 1/16/5
f 8/19/6 4/6/6 2/15/6 6/20/6 f 8/19/6 4/6/6 2/15/6 6/20/6

View File

@ -0,0 +1,46 @@
# Blender v2.78 (sub 0) OBJ File: 'box.blend'
# www.blender.org
mtllib materials\\box-windows-paths.mtl
o Cube
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 0.0000
vt 1.0000 1.0000
vt 0.0000 0.0000
vt 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl Material
s off
f 1/1/1 2/2/1 4/3/1 3/4/1
f 3/5/2 4/6/2 8/7/2 7/8/2
f 7/9/3 8/10/3 6/11/3 5/12/3
f 5/13/4 6/14/4 2/15/4 1/16/4
f 3/5/5 7/17/5 5/18/5 1/16/5
f 8/19/6 4/6/6 2/15/6 6/20/6

View File

@ -0,0 +1,13 @@
# Blender MTL File: 'box.blend'
# Material Count: 1
newmtl Material
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
map_Kd .\images\cesium.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@ -34,6 +34,7 @@ var objExternalResourcesInRootPath = 'specs/data/box-external-resources-in-root/
var objTexturedPath = 'specs/data/box-textured/box-textured.obj'; var objTexturedPath = 'specs/data/box-textured/box-textured.obj';
var objMissingTexturePath = 'specs/data/box-missing-texture/box-missing-texture.obj'; var objMissingTexturePath = 'specs/data/box-missing-texture/box-missing-texture.obj';
var objSubdirectoriesPath = 'specs/data/box-subdirectories/box-textured.obj'; var objSubdirectoriesPath = 'specs/data/box-subdirectories/box-textured.obj';
var objWindowsPaths = 'specs/data/box-windows-paths/box-windows-paths.obj';
var objInvalidContentsPath = 'specs/data/box/box.mtl'; var objInvalidContentsPath = 'specs/data/box/box.mtl';
var objConcavePath = 'specs/data/concave/concave.obj'; var objConcavePath = 'specs/data/concave/concave.obj';
var objUnnormalizedPath = 'specs/data/box-unnormalized/box-unnormalized.obj'; var objUnnormalizedPath = 'specs/data/box-unnormalized/box-unnormalized.obj';
@ -478,6 +479,15 @@ describe('loadObj', function() {
}), done).toResolve(); }), done).toResolve();
}); });
it('loads obj with windows paths', function(done) {
expect(loadObj(objWindowsPaths, options)
.then(function(data) {
var baseColorTexture = data.materials[0].pbrMetallicRoughness.baseColorTexture;
expect(baseColorTexture.name).toBe('cesium');
expect(baseColorTexture.source).toBeDefined();
}), done).toResolve();
});
it('throws when file has invalid contents', function(done) { it('throws when file has invalid contents', function(done) {
expect(loadObj(objInvalidContentsPath, options), done).toRejectWith(RuntimeError); expect(loadObj(objInvalidContentsPath, options), done).toRejectWith(RuntimeError);
}); });