"use strict"; var fs = require('fs-extra'); var defined = require('cesium').defined; module.exports = { getDefault : getDefault, parse : parse }; function createMaterial() { return { ambientColor : undefined, // Ka emissionColor : undefined, // Ke diffuseColor : undefined, // Kd specularColor : undefined, // Ks specularShininess : undefined, // Ns alpha : undefined, // d / Tr ambientColorMap : undefined, // map_Ka emissionColorMap : undefined, // map_Ke diffuseColorMap : undefined, // map_Kd specularColorMap : undefined, // map_Ks specularShininessMap : undefined, // map_Ns normalMap : undefined, // map_Bump alphaMap : undefined // map_d }; } function getDefault() { var material = createMaterial(); material.diffuseColor = [0.5, 0.5, 0.5, 1.0]; return material; } function parse(mtlPath, done) { fs.readFile(mtlPath, 'utf8', function (error, contents) { if (error) { console.log('Could not read material file at ' + mtlPath + '. Using default material instead.'); done({}); return; } var materials = {}; var material; var values; var value; var lines = contents.split('\n'); var length = lines.length; for (var i = 0; i < length; ++i) { var line = lines[i].trim(); if (/^newmtl /i.test(line)) { var name = line.substring(7).trim(); material = createMaterial(); materials[name] = material; } else if (/^Ka /i.test(line)) { values = line.substring(3).trim().split(' '); material.ambientColor = [ parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]), 1.0 ]; } else if (/^Ke /i.test(line)) { values = line.substring(3).trim().split(' '); material.emissionColor = [ parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]), 1.0 ]; } else if (/^Kd /i.test(line)) { values = line.substring(3).trim().split(' '); material.diffuseColor = [ parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]), 1.0 ]; } else if (/^Ks /i.test(line)) { values = line.substring(3).trim().split(' '); material.specularColor = [ parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]), 1.0 ]; } else if (/^Ns /i.test(line)) { value = line.substring(3).trim(); material.specularShininess = parseFloat(value); } else if (/^d /i.test(line)) { value = line.substring(2).trim(); material.alpha = parseFloat(value); } else if (/^Tr /i.test(line)) { value = line.substring(3).trim(); material.alpha = parseFloat(value); } else if (/^map_Ka /i.test(line)) { material.ambientColorMap = line.substring(7).trim(); } else if (/^map_Ke /i.test(line)) { material.emissionColorMap = line.substring(7).trim(); } else if (/^map_Kd /i.test(line)) { material.diffuseColorMap = line.substring(7).trim(); } else if (/^map_Ks /i.test(line)) { material.specularColorMap = line.substring(7).trim(); } else if (/^map_Ns /i.test(line)) { material.specularShininessMap = line.substring(7).trim(); } else if (/^map_Bump /i.test(line)) { material.normalMap = line.substring(9).trim(); } else if (/^map_d /i.test(line)) { material.alphaMap = line.substring(6).trim(); } } if (defined(material.alpha)) { material.diffuseColor[3] = material.alpha; } done(materials); }); }