diff options
Diffstat (limited to 'engine/src/ogre/com/jme3/scene/plugins/ogre/matext/MaterialExtensionLoader.java')
-rw-r--r-- | engine/src/ogre/com/jme3/scene/plugins/ogre/matext/MaterialExtensionLoader.java | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/engine/src/ogre/com/jme3/scene/plugins/ogre/matext/MaterialExtensionLoader.java b/engine/src/ogre/com/jme3/scene/plugins/ogre/matext/MaterialExtensionLoader.java new file mode 100644 index 0000000..d497d51 --- /dev/null +++ b/engine/src/ogre/com/jme3/scene/plugins/ogre/matext/MaterialExtensionLoader.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2009-2010 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.jme3.scene.plugins.ogre.matext; + +import com.jme3.asset.AssetKey; +import com.jme3.asset.AssetManager; +import com.jme3.asset.AssetNotFoundException; +import com.jme3.asset.TextureKey; +import com.jme3.material.Material; +import com.jme3.material.MaterialList; +import com.jme3.scene.plugins.ogre.MaterialLoader; +import com.jme3.texture.Texture; +import com.jme3.texture.Texture.WrapMode; +import com.jme3.texture.Texture2D; +import com.jme3.util.PlaceholderAssets; +import com.jme3.util.blockparser.Statement; +import java.io.IOException; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Used internally by {@link MaterialLoader} + */ +public class MaterialExtensionLoader { + + private static final Logger logger = Logger.getLogger(MaterialExtensionLoader.class.getName()); + + private AssetKey key; + private AssetManager assetManager; + private MaterialList list; + private MaterialExtensionSet matExts; + private MaterialExtension matExt; + private String matName; + private Material material; + + + private void readExtendingMaterialStatement(Statement statement) throws IOException { + if (statement.getLine().startsWith("set_texture_alias")){ + String[] split = statement.getLine().split(" ", 3); + String aliasName = split[1]; + String texturePath = split[2]; + + String jmeParamName = matExt.getTextureMapping(aliasName); + + TextureKey texKey = new TextureKey(texturePath, false); + texKey.setGenerateMips(true); + texKey.setAsCube(false); + Texture tex; + + try { + tex = assetManager.loadTexture(texKey); + tex.setWrap(WrapMode.Repeat); + } catch (AssetNotFoundException ex){ + logger.log(Level.WARNING, "Cannot locate {0} for material {1}", new Object[]{texKey, key}); + tex = new Texture2D( PlaceholderAssets.getPlaceholderImage() ); + } + + material.setTexture(jmeParamName, tex); + } + } + + private Material readExtendingMaterial(Statement statement) throws IOException{ + String[] split = statement.getLine().split(" ", 2); + String[] subsplit = split[1].split(":"); + matName = subsplit[0].trim(); + String extendedMat = subsplit[1].trim(); + + matExt = matExts.getMaterialExtension(extendedMat); + if (matExt == null){ + logger.log(Level.WARNING, "Cannot find MaterialExtension for: {0}. Ignoring material.", extendedMat); + matExt = null; + return null; + } + + material = new Material(assetManager, matExt.getJmeMatDefName()); + for (Statement extMatStat : statement.getContents()){ + readExtendingMaterialStatement(extMatStat); + } + return material; + } + + public MaterialList load(AssetManager assetManager, AssetKey key, MaterialExtensionSet matExts, + List<Statement> statements) throws IOException{ + this.assetManager = assetManager; + this.matExts = matExts; + this.key = key; + + list = new MaterialList(); + + for (Statement statement : statements){ + if (statement.getLine().startsWith("import")){ + // ignore + continue; + }else if (statement.getLine().startsWith("material")){ + Material material = readExtendingMaterial(statement); + list.put(matName, material); + List<String> matAliases = matExts.getNameMappings(matName); + if(matAliases != null){ + for (String string : matAliases) { + list.put(string, material); + } + } + } + } + return list; + } +} |