From 3e41cdc7f60c83859d3c577e8c90153f8c993324 Mon Sep 17 00:00:00 2001 From: Tim Knip Date: Mon, 2 Oct 2017 01:50:45 +0200 Subject: [PATCH] Fix texture options ending up in texture filename #109 This happens when in `*.mtl` a relative texture path does not have a `./` prefix. eg: map_bump -bm 0.1 foo.jpg --- lib/loadMtl.js | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/lib/loadMtl.js b/lib/loadMtl.js index 1500de9..2b25371 100644 --- a/lib/loadMtl.js +++ b/lib/loadMtl.js @@ -205,31 +205,40 @@ loadMtl._createMaterial = function(materialOptions, options) { */ function parseMapOptions (texturePath, textureOptions) { - 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(texturePath)) { - return; - } + if (!re.test(texturePath)) { + return; + } - var pathParts = texturePath.split(/[\\\/]/); + if (re.test('/'+path.basename(texturePath))) { + // options ended up in filename, eg: map_bump -bm 0.1 foo.jpg + // assume no spaces in texture filename + var parts = path.basename(texturePath).split(/\s+/); + var texture = parts.pop(); + // handle options below + texturePath = path.join(path.dirname(texturePath), parts.join(' '), texture); + } - if (pathParts.length && pathParts.length > 2) { - var mapOptions = pathParts[pathParts.length - 2].split(/\s+/); - var currPart = null; + var pathParts = texturePath.split(/[\\\/]/); - mapOptions.reduce(function (p, part) { - if (re.test('/'+part)) { - currPart = part; - p[part] = []; - } else if (currPart) { - p[currPart].push(part); - } - return p; - }, textureOptions); + if (pathParts.length && pathParts.length > 2) { + var mapOptions = pathParts[pathParts.length - 2].split(/\s+/); + var currPart = null; - pathParts.splice(pathParts.length - 2, 1); - return path.join.apply(null, pathParts); - } + mapOptions.reduce(function (p, part) { + if (re.test('/'+part)) { + currPart = part; + p[part] = []; + } else if (currPart) { + p[currPart].push(part); + } + return p; + }, textureOptions); + + pathParts.splice(pathParts.length - 2, 1); + return path.join.apply(null, pathParts); + } } function loadMaterialTexture(material, name, texturePath, textureOptions, mtlDirectory, texturePromiseMap, texturePromises, options) {