159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2010 jMonkeyEngine 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met: 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer. 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer in the 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * documentation and/or other materials provided with the distribution. 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * may be used to endorse or promote products derived from this software 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * without specific prior written permission. 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.scene.plugins; 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.*; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.Material; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.MaterialList; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.RenderState.BlendMode; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.ColorRGBA; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture.WrapMode; 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture2D; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.PlaceholderAssets; 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.File; 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException; 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.InputStream; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Locale; 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.NoSuchElementException; 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Scanner; 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level; 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger; 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class MTLLoader implements AssetLoader { 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static final Logger logger = Logger.getLogger(MTLLoader.class.getName()); 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Scanner scan; 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected MaterialList matList; 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //protected Material material; 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected AssetManager assetManager; 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected String folderName; 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected AssetKey key; 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Texture diffuseMap, normalMap, specularMap, alphaMap; 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected ColorRGBA ambient = new ColorRGBA(); 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected ColorRGBA diffuse = new ColorRGBA(); 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected ColorRGBA specular = new ColorRGBA(); 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected float shininess = 16; 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected boolean shadeless; 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected String matName; 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected float alpha = 1; 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected boolean transparent = false; 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected boolean disallowTransparency = false; 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected boolean disallowAmbient = false; 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected boolean disallowSpecular = false; 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void reset(){ 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta scan = null; 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matList = null; 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// material = null; 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta resetMaterial(); 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected ColorRGBA readColor(){ 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ColorRGBA v = new ColorRGBA(); 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta v.set(scan.nextFloat(), scan.nextFloat(), scan.nextFloat(), 1.0f); 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return v; 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected String nextStatement(){ 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta scan.useDelimiter("\n"); 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String result = scan.next(); 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta scan.useDelimiter("\\p{javaWhitespace}+"); 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return result; 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected boolean skipLine(){ 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta scan.skip(".*\r{0,1}\n"); 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (NoSuchElementException ex){ 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // EOF 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return false; 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected void resetMaterial(){ 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ambient.set(ColorRGBA.DarkGray); 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta diffuse.set(ColorRGBA.LightGray); 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta specular.set(ColorRGBA.Black); 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta shininess = 16; 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta disallowTransparency = false; 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta disallowAmbient = false; 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta disallowSpecular = false; 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta shadeless = false; 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta transparent = false; 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matName = null; 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta diffuseMap = null; 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta specularMap = null; 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta normalMap = null; 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta alphaMap = null; 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta alpha = 1; 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected void createMaterial(){ 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material material; 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (alpha < 1f && transparent && !disallowTransparency){ 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta diffuse.a = alpha; 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (shadeless){ 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.setColor("Color", diffuse.clone()); 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.setTexture("ColorMap", diffuseMap); 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // TODO: Add handling for alpha map? 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.setBoolean("UseMaterialColors", true); 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.setColor("Ambient", ambient.clone()); 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.setColor("Diffuse", diffuse.clone()); 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.setColor("Specular", specular.clone()); 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.setFloat("Shininess", shininess); // prevents "premature culling" bug 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (diffuseMap != null) material.setTexture("DiffuseMap", diffuseMap); 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (specularMap != null) material.setTexture("SpecularMap", specularMap); 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (normalMap != null) material.setTexture("NormalMap", normalMap); 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (alphaMap != null) material.setTexture("AlphaMap", alphaMap); 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (transparent && !disallowTransparency){ 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.setTransparent(true); 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.getAdditionalRenderState().setAlphaTest(true); 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.getAdditionalRenderState().setAlphaFallOff(0.01f); 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matList.put(matName, material); 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected void startMaterial(String name){ 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (matName != null){ 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // material is already in cache, generate it 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta createMaterial(); 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // now, reset the params and set the name to start a new material 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta resetMaterial(); 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matName = name; 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Texture loadTexture(String path){ 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String[] split = path.trim().split("\\p{javaWhitespace}+"); 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // will crash if path is an empty string 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta path = split[split.length-1]; 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String name = new File(path).getName(); 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta TextureKey texKey = new TextureKey(folderName + name); 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texKey.setGenerateMips(true); 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Texture texture; 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texture = assetManager.loadTexture(texKey); 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texture.setWrap(WrapMode.Repeat); 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (AssetNotFoundException ex){ 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.WARNING, "Cannot locate {0} for material {1}", new Object[]{texKey, key}); 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texture = new Texture2D(PlaceholderAssets.getPlaceholderImage()); 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return texture; 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected boolean readLine(){ 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!scan.hasNext()){ 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return false; 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String cmd = scan.next().toLowerCase(); 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (cmd.startsWith("#")){ 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // skip entire comment until next line 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return skipLine(); 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("newmtl")){ 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String name = scan.next(); 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta startMaterial(name); 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("ka")){ 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ambient.set(readColor()); 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("kd")){ 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta diffuse.set(readColor()); 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("ks")){ 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta specular.set(readColor()); 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("ns")){ 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float shiny = scan.nextFloat(); 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (shiny >= 1){ 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta shininess = shiny; /* (128f / 1000f)*/ 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (specular.equals(ColorRGBA.Black)){ 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta specular.set(ColorRGBA.White); 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // For some reason blender likes to export Ns 0 statements 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Ignore Ns 0 instead of setting it 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("d") || cmd.equals("tr")){ 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta alpha = scan.nextFloat(); 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta transparent = true; 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("map_ka")){ 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // ignore it for now 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return skipLine(); 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("map_kd")){ 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String path = nextStatement(); 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta diffuseMap = loadTexture(path); 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("map_bump") || cmd.equals("bump")){ 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (normalMap == null){ 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String path = nextStatement(); 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta normalMap = loadTexture(path); 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("map_ks")){ 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String path = nextStatement(); 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta specularMap = loadTexture(path); 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (specularMap != null){ 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // NOTE: since specular color is modulated with specmap 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // make sure we have it set 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (specular.equals(ColorRGBA.Black)){ 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta specular.set(ColorRGBA.White); 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("map_d")){ 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String path = scan.next(); 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta alphaMap = loadTexture(path); 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta transparent = true; 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("illum")){ 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int mode = scan.nextInt(); 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (mode){ 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 0: 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // no lighting 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta shadeless = true; 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta disallowTransparency = true; 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 1: 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta disallowSpecular = true; 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta disallowTransparency = true; 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 2: 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 3: 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 5: 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 8: 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta disallowTransparency = true; 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 4: 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 6: 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 7: 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 9: 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Enable transparency 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Works best if diffuse map has an alpha channel 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta transparent = true; 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (cmd.equals("ke") || cmd.equals("ni")){ 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Ni: index of refraction - unsupported in jME 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Ke: emission color 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return skipLine(); 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.WARNING, "Unknown statement in MTL! {0}", cmd); 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return skipLine(); 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @SuppressWarnings("empty-statement") 29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Object load(AssetInfo info) throws IOException{ 29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta reset(); 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.key = info.getKey(); 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.assetManager = info.getManager(); 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta folderName = info.getKey().getFolder(); 29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matList = new MaterialList(); 29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta InputStream in = null; 30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta in = info.openStream(); 30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta scan = new Scanner(in); 30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta scan.useLocale(Locale.US); 30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta while (readLine()); 30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } finally { 30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (in != null){ 30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta in.close(); 31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (matName != null){ 31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // still have a material in the vars 31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta createMaterial(); 31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta resetMaterial(); 31759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 31959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta MaterialList list = matList; 32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return list; 32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 326