1 /* 2 * Copyright (c) 2009-2010 jMonkeyEngine 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 package com.jme3.material; 34 35 import com.jme3.asset.AssetManager; 36 import com.jme3.shader.VarType; 37 import java.util.*; 38 import java.util.logging.Level; 39 import java.util.logging.Logger; 40 41 /** 42 * Describes a J3MD (Material definition). 43 * 44 * @author Kirill Vainer 45 */ 46 public class MaterialDef { 47 48 private static final Logger logger = Logger.getLogger(MaterialDef.class.getName()); 49 50 private String name; 51 private String assetName; 52 private AssetManager assetManager; 53 54 private List<TechniqueDef> defaultTechs; 55 private Map<String, TechniqueDef> techniques; 56 private Map<String, MatParam> matParams; 57 58 /** 59 * Serialization only. Do not use. 60 */ MaterialDef()61 public MaterialDef(){ 62 } 63 64 /** 65 * Creates a new material definition with the given name. 66 * 67 * @param assetManager The asset manager to use to load shaders 68 * @param name The debug name of the material definition 69 */ MaterialDef(AssetManager assetManager, String name)70 public MaterialDef(AssetManager assetManager, String name){ 71 this.assetManager = assetManager; 72 this.name = name; 73 techniques = new HashMap<String, TechniqueDef>(); 74 matParams = new HashMap<String, MatParam>(); 75 defaultTechs = new ArrayList<TechniqueDef>(); 76 logger.log(Level.INFO, "Loaded material definition: {0}", name); 77 } 78 79 /** 80 * Returns the asset key name of the asset from which this material 81 * definition was loaded. 82 * 83 * @return Asset key name of the j3md file 84 */ getAssetName()85 public String getAssetName() { 86 return assetName; 87 } 88 89 /** 90 * Set the asset key name. 91 * 92 * @param assetName the asset key name 93 */ setAssetName(String assetName)94 public void setAssetName(String assetName) { 95 this.assetName = assetName; 96 } 97 98 /** 99 * Returns the AssetManager passed in the constructor. 100 * 101 * @return the AssetManager passed in the constructor. 102 */ getAssetManager()103 public AssetManager getAssetManager(){ 104 return assetManager; 105 } 106 107 /** 108 * The debug name of the material definition. 109 * 110 * @return debug name of the material definition. 111 */ getName()112 public String getName(){ 113 return name; 114 } 115 116 /** 117 * Adds a new material parameter. 118 * 119 * @param type Type of the parameter 120 * @param name Name of the parameter 121 * @param value Default value of the parameter 122 * @param ffBinding Fixed function binding for the parameter 123 */ addMaterialParam(VarType type, String name, Object value, FixedFuncBinding ffBinding)124 public void addMaterialParam(VarType type, String name, Object value, FixedFuncBinding ffBinding) { 125 matParams.put(name, new MatParam(type, name, value, ffBinding)); 126 } 127 128 /** 129 * Returns the material parameter with the given name. 130 * 131 * @param name The name of the parameter to retrieve 132 * 133 * @return The material parameter, or null if it does not exist. 134 */ getMaterialParam(String name)135 public MatParam getMaterialParam(String name){ 136 return matParams.get(name); 137 } 138 139 /** 140 * Returns a collection of all material parameters declared in this 141 * material definition. 142 * <p> 143 * Modifying the material parameters or the collection will lead 144 * to undefined results. 145 * 146 * @return All material parameters declared in this definition. 147 */ getMaterialParams()148 public Collection<MatParam> getMaterialParams(){ 149 return matParams.values(); 150 } 151 152 /** 153 * Adds a new technique definition to this material definition. 154 * <p> 155 * If the technique name is "Default", it will be added 156 * to the list of {@link MaterialDef#getDefaultTechniques() default techniques}. 157 * 158 * @param technique The technique definition to add. 159 */ addTechniqueDef(TechniqueDef technique)160 public void addTechniqueDef(TechniqueDef technique){ 161 if (technique.getName().equals("Default")){ 162 defaultTechs.add(technique); 163 }else{ 164 techniques.put(technique.getName(), technique); 165 } 166 } 167 168 /** 169 * Returns a list of all default techniques. 170 * 171 * @return a list of all default techniques. 172 */ getDefaultTechniques()173 public List<TechniqueDef> getDefaultTechniques(){ 174 return defaultTechs; 175 } 176 177 /** 178 * Returns a technique definition with the given name. 179 * This does not include default techniques which can be 180 * retrieved via {@link MaterialDef#getDefaultTechniques() }. 181 * 182 * @param name The name of the technique definition to find 183 * 184 * @return The technique definition, or null if cannot be found. 185 */ getTechniqueDef(String name)186 public TechniqueDef getTechniqueDef(String name) { 187 return techniques.get(name); 188 } 189 190 } 191