mirror of https://github.com/CesiumGS/obj2gltf.git
Fixed normalizing Windows paths
This commit is contained in:
parent
26526c0f51
commit
26db16d892
|
@ -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.');
|
||||||
|
|
|
@ -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.');
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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 |
|
@ -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);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue