159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2012 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 Bartapackage com.jme3.scene.plugins.blender.materials; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.BlenderKey.FeaturesToLoad; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.MatParam; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.MatParamTexture; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.Material; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.RenderState.BlendMode; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.RenderState.FaceCullMode; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.ColorRGBA; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.FastMath; 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.AbstractBlenderHelper; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.BlenderContext; 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.BlenderContext.LoadedFeatureDataType; 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.exceptions.BlenderFileException; 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.file.Pointer; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.file.Structure; 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.shader.VarType; 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Image; 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Image.Format; 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture; 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture.Type; 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.BufferUtils; 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ByteBuffer; 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.HashMap; 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.List; 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Map; 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Map.Entry; 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level; 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger; 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class MaterialHelper extends AbstractBlenderHelper { 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static final Logger LOGGER = Logger.getLogger(MaterialHelper.class.getName()); 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected static final float DEFAULT_SHININESS = 20.0f; 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final String TEXTURE_TYPE_3D = "Texture"; 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final String TEXTURE_TYPE_COLOR = "ColorMap"; 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final String TEXTURE_TYPE_DIFFUSE = "DiffuseMap"; 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final String TEXTURE_TYPE_NORMAL = "NormalMap"; 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final String TEXTURE_TYPE_SPECULAR = "SpecularMap"; 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final String TEXTURE_TYPE_GLOW = "GlowMap"; 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final String TEXTURE_TYPE_ALPHA = "AlphaMap"; 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final Integer ALPHA_MASK_NONE = Integer.valueOf(0); 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final Integer ALPHA_MASK_CIRCLE = Integer.valueOf(1); 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final Integer ALPHA_MASK_CONE = Integer.valueOf(2); 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final Integer ALPHA_MASK_HYPERBOLE = Integer.valueOf(3); 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected final Map<Integer, IAlphaMask> alphaMasks = new HashMap<Integer, IAlphaMask>(); 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The type of the material's diffuse shader. 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static enum DiffuseShader { 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta LAMBERT, ORENNAYAR, TOON, MINNAERT, FRESNEL 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The type of the material's specular shader. 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static enum SpecularShader { 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta COOKTORRENCE, PHONG, BLINN, TOON, WARDISO 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** Face cull mode. Should be excplicitly set before this helper is used. */ 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected FaceCullMode faceCullMode; 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This constructor parses the given blender version and stores the result. Some functionalities may differ in different blender 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * versions. 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param blenderVersion 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the version read from the blend file 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param fixUpAxis 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * a variable that indicates if the Y asxis is the UP axis or not 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public MaterialHelper(String blenderVersion, boolean fixUpAxis) { 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta super(blenderVersion, false); 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // setting alpha masks 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta alphaMasks.put(ALPHA_MASK_NONE, new IAlphaMask() { 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setImageSize(int width, int height) {} 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public byte getAlpha(float x, float y) { 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (byte) 255; 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta alphaMasks.put(ALPHA_MASK_CIRCLE, new IAlphaMask() { 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float r; 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float[] center; 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setImageSize(int width, int height) { 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta r = Math.min(width, height) * 0.5f; 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta center = new float[] { width * 0.5f, height * 0.5f }; 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public byte getAlpha(float x, float y) { 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float d = FastMath.abs(FastMath.sqrt((x - center[0]) * (x - center[0]) + (y - center[1]) * (y - center[1]))); 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (byte) (d >= r ? 0 : 255); 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta alphaMasks.put(ALPHA_MASK_CONE, new IAlphaMask() { 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float r; 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float[] center; 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setImageSize(int width, int height) { 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta r = Math.min(width, height) * 0.5f; 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta center = new float[] { width * 0.5f, height * 0.5f }; 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public byte getAlpha(float x, float y) { 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float d = FastMath.abs(FastMath.sqrt((x - center[0]) * (x - center[0]) + (y - center[1]) * (y - center[1]))); 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (byte) (d >= r ? 0 : -255.0f * d / r + 255.0f); 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta alphaMasks.put(ALPHA_MASK_HYPERBOLE, new IAlphaMask() { 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float r; 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float[] center; 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setImageSize(int width, int height) { 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta r = Math.min(width, height) * 0.5f; 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta center = new float[] { width * 0.5f, height * 0.5f }; 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public byte getAlpha(float x, float y) { 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float d = FastMath.abs(FastMath.sqrt((x - center[0]) * (x - center[0]) + (y - center[1]) * (y - center[1]))) / r; 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return d >= 1.0f ? 0 : (byte) ((-FastMath.sqrt((2.0f - d) * d) + 1.0f) * 255.0f); 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method sets the face cull mode to be used with every loaded material. 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param faceCullMode 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the face cull mode 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setFaceCullMode(FaceCullMode faceCullMode) { 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.faceCullMode = faceCullMode; 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method converts the material structure to jme Material. 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param structure 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * structure with material data 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param blenderContext 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the blender context 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return jme material 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @throws BlenderFileException 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * an exception is throw when problems with blend file occur 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Material toMaterial(Structure structure, BlenderContext blenderContext) throws BlenderFileException { 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta LOGGER.log(Level.INFO, "Loading material."); 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (structure == null) { 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return blenderContext.getDefaultMaterial(); 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material result = (Material) blenderContext.getLoadedFeature(structure.getOldMemoryAddress(), LoadedFeatureDataType.LOADED_FEATURE); 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (result != null) { 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return result; 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta MaterialContext materialContext = new MaterialContext(structure, blenderContext); 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta LOGGER.log(Level.INFO, "Material's name: {0}", materialContext.name); 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if(materialContext.textures.size() > 1) { 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta LOGGER.log(Level.WARNING, "Attetion! Many textures found for material: {0}. Only the first of each supported mapping types will be used!", materialContext.name); 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // texture 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Type colorTextureType = null; 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Map<String, Texture> texturesMap = new HashMap<String, Texture>(); 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for(Entry<Number, Texture> textureEntry : materialContext.loadedTextures.entrySet()) { 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int mapto = textureEntry.getKey().intValue(); 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Texture texture = textureEntry.getValue(); 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if ((mapto & MaterialContext.MTEX_COL) != 0) { 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta colorTextureType = texture.getType(); 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (materialContext.shadeless) { 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texturesMap.put(colorTextureType==Type.ThreeDimensional ? TEXTURE_TYPE_3D : TEXTURE_TYPE_COLOR, texture); 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texturesMap.put(colorTextureType==Type.ThreeDimensional ? TEXTURE_TYPE_3D : TEXTURE_TYPE_DIFFUSE, texture); 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if(texture.getType()==Type.TwoDimensional) {//so far only 2D textures can be mapped in other way than color 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if ((mapto & MaterialContext.MTEX_NOR) != 0 && !materialContext.shadeless) { 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //Structure mTex = materialContext.getMTex(texture); 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //Texture normalMapTexture = textureHelper.convertToNormalMapTexture(texture, ((Number) mTex.getFieldValue("norfac")).floatValue()); 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //texturesMap.put(TEXTURE_TYPE_NORMAL, normalMapTexture); 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texturesMap.put(TEXTURE_TYPE_NORMAL, texture); 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if ((mapto & MaterialContext.MTEX_EMIT) != 0) { 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texturesMap.put(TEXTURE_TYPE_GLOW, texture); 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if ((mapto & MaterialContext.MTEX_SPEC) != 0 && !materialContext.shadeless) { 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texturesMap.put(TEXTURE_TYPE_SPECULAR, texture); 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if ((mapto & MaterialContext.MTEX_ALPHA) != 0 && !materialContext.shadeless) { 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texturesMap.put(TEXTURE_TYPE_ALPHA, texture); 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //creating the material 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if(colorTextureType==Type.ThreeDimensional) { 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result = new Material(blenderContext.getAssetManager(), "Common/MatDefs/Texture3D/tex3D.j3md"); 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (materialContext.shadeless) { 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result = new Material(blenderContext.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!materialContext.transparent) { 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta materialContext.diffuseColor.a = 1; 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setColor("Color", materialContext.diffuseColor); 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result = new Material(blenderContext.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md"); 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setBoolean("UseMaterialColors", Boolean.TRUE); 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // setting the colors 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setBoolean("Minnaert", materialContext.diffuseShader == DiffuseShader.MINNAERT); 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!materialContext.transparent) { 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta materialContext.diffuseColor.a = 1; 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setColor("Diffuse", materialContext.diffuseColor); 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setBoolean("WardIso", materialContext.specularShader == SpecularShader.WARDISO); 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setColor("Specular", materialContext.specularColor); 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setColor("Ambient", materialContext.ambientColor); 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setFloat("Shininess", materialContext.shininess); 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (materialContext.vertexColor) { 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setBoolean(materialContext.shadeless ? "VertexColor" : "UseVertexColor", true); 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //applying textures 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for(Entry<String, Texture> textureEntry : texturesMap.entrySet()) { 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setTexture(textureEntry.getKey(), textureEntry.getValue()); 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //applying other data 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.getAdditionalRenderState().setFaceCullMode(faceCullMode); 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (materialContext.transparent) { 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setTransparent(true); 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setName(materialContext.getName()); 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta blenderContext.setMaterialContext(result, materialContext); 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta blenderContext.addLoadedFeatures(structure.getOldMemoryAddress(), structure.getName(), structure, result); 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return result; 28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns a material similar to the one given but without textures. If the material has no textures it is not cloned but 29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * returned itself. 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param material 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * a material to be cloned without textures 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param imageType 29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * type of image defined by blender; the constants are defined in TextureHelper 29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return material without textures of a specified type 30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Material getNonTexturedMaterial(Material material, int imageType) { 30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String[] textureParamNames = new String[] { TEXTURE_TYPE_DIFFUSE, TEXTURE_TYPE_NORMAL, TEXTURE_TYPE_GLOW, TEXTURE_TYPE_SPECULAR, TEXTURE_TYPE_ALPHA }; 30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Map<String, Texture> textures = new HashMap<String, Texture>(textureParamNames.length); 30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (String textureParamName : textureParamNames) { 30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta MatParamTexture matParamTexture = material.getTextureParam(textureParamName); 30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (matParamTexture != null) { 30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta textures.put(textureParamName, matParamTexture.getTextureValue()); 30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (textures.isEmpty()) { 31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return material; 31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // clear all textures first so that wo de not waste resources cloning them 31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (Entry<String, Texture> textureParamName : textures.entrySet()) { 31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String name = textureParamName.getValue().getName(); 31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 31759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int type = Integer.parseInt(name); 31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (type == imageType) { 31959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.clearParam(textureParamName.getKey()); 32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (NumberFormatException e) { 32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta LOGGER.log(Level.WARNING, "The name of the texture does not contain the texture type value! {0} will not be removed!", name); 32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material result = material.clone(); 32659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // put the textures back in place 32759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (Entry<String, Texture> textureEntry : textures.entrySet()) { 32859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material.setTexture(textureEntry.getKey(), textureEntry.getValue()); 32959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 33059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return result; 33159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 33259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 33359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 33459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 33559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method converts the given material into particles-usable material. 33659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The texture and glow color are being copied. 33759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The method assumes it receives the Lighting type of material. 33859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param material 33959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the source material 34059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param blenderContext 34159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the blender context 34259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return material converted into particles-usable material 34359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 34459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Material getParticlesMaterial(Material material, Integer alphaMaskIndex, BlenderContext blenderContext) { 34559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material result = new Material(blenderContext.getAssetManager(), "Common/MatDefs/Misc/Particle.j3md"); 34659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 34759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // copying texture 34859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta MatParam diffuseMap = material.getParam("DiffuseMap"); 34959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (diffuseMap != null) { 35059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Texture texture = ((Texture) diffuseMap.getValue()).clone(); 35159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 35259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // applying alpha mask to the texture 35359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Image image = texture.getImage(); 35459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ByteBuffer sourceBB = image.getData(0); 35559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta sourceBB.rewind(); 35659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int w = image.getWidth(); 35759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int h = image.getHeight(); 35859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ByteBuffer bb = BufferUtils.createByteBuffer(w * h * 4); 35959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta IAlphaMask iAlphaMask = alphaMasks.get(alphaMaskIndex); 36059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta iAlphaMask.setImageSize(w, h); 36159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 36259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int x = 0; x < w; ++x) { 36359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int y = 0; y < h; ++y) { 36459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bb.put(sourceBB.get()); 36559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bb.put(sourceBB.get()); 36659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bb.put(sourceBB.get()); 36759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bb.put(iAlphaMask.getAlpha(x, y)); 36859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 36959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 37059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 37159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta image = new Image(Format.RGBA8, w, h, bb); 37259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta texture.setImage(image); 37359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 37459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setTextureParam("Texture", VarType.Texture2D, texture); 37559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 37659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 37759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // copying glow color 37859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta MatParam glowColor = material.getParam("GlowColor"); 37959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (glowColor != null) { 38059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ColorRGBA color = (ColorRGBA) glowColor.getValue(); 38159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.setParam("GlowColor", VarType.Vector3, color); 38259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 38359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return result; 38459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 38559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 38659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 38759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method indicates if the material has any kind of texture. 38859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 38959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param material 39059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the material 39159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return <b>true</b> if the texture exists in the material and <B>false</b> otherwise 39259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 39359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public boolean hasTexture(Material material) { 39459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (material != null) { 39559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (material.getTextureParam(TEXTURE_TYPE_3D) != null) { 39659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 39759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 39859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (material.getTextureParam(TEXTURE_TYPE_ALPHA) != null) { 39959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 40059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 40159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (material.getTextureParam(TEXTURE_TYPE_COLOR) != null) { 40259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 40359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 40459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (material.getTextureParam(TEXTURE_TYPE_DIFFUSE) != null) { 40559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 40659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 40759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (material.getTextureParam(TEXTURE_TYPE_GLOW) != null) { 40859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 40959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 41059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (material.getTextureParam(TEXTURE_TYPE_NORMAL) != null) { 41159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 41259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 41359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (material.getTextureParam(TEXTURE_TYPE_SPECULAR) != null) { 41459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 41559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 41659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 41759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return false; 41859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 41959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 42059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 42159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method indicates if the material has a texture of a specified type. 42259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 42359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param material 42459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the material 42559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param textureType 42659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the type of the texture 42759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return <b>true</b> if the texture exists in the material and <B>false</b> otherwise 42859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 42959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public boolean hasTexture(Material material, String textureType) { 43059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (material != null) { 43159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return material.getTextureParam(textureType) != null; 43259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 43359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return false; 43459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 43559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 43659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 43759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the table of materials connected to the specified structure. The given structure can be of any type (ie. mesh or 43859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * curve) but needs to have 'mat' field/ 43959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 44059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param structureWithMaterials 44159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the structure containing the mesh data 44259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param blenderContext 44359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the blender context 44459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return a list of vertices colors, each color belongs to a single vertex 44559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @throws BlenderFileException 44659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * this exception is thrown when the blend file structure is somehow invalid or corrupted 44759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 44859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Material[] getMaterials(Structure structureWithMaterials, BlenderContext blenderContext) throws BlenderFileException { 44959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Pointer ppMaterials = (Pointer) structureWithMaterials.getFieldValue("mat"); 45059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material[] materials = null; 45159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (ppMaterials.isNotNull()) { 45259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta List<Structure> materialStructures = ppMaterials.fetchData(blenderContext.getInputStream()); 45359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (materialStructures != null && materialStructures.size() > 0) { 45459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta MaterialHelper materialHelper = blenderContext.getHelper(MaterialHelper.class); 45559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta materials = new Material[materialStructures.size()]; 45659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int i = 0; 45759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (Structure s : materialStructures) { 45859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material material = (Material) blenderContext.getLoadedFeature(s.getOldMemoryAddress(), LoadedFeatureDataType.LOADED_FEATURE); 45959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (material == null) { 46059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta material = materialHelper.toMaterial(s, blenderContext); 46159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 46259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta materials[i++] = material; 46359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 46459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 46559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 46659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return materials; 46759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 46859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 46959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 47059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method converts rgb values to hsv values. 47159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 47259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param r 47359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * red value of the color 47459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param g 47559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * green value of the color 47659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param b 47759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * blue value of the color 47859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param hsv 47959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * hsv values of a color (this table contains the result of the transformation) 48059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 48159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void rgbToHsv(float r, float g, float b, float[] hsv) { 48259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float cmax = r; 48359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float cmin = r; 48459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cmax = g > cmax ? g : cmax; 48559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cmin = g < cmin ? g : cmin; 48659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cmax = b > cmax ? b : cmax; 48759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cmin = b < cmin ? b : cmin; 48859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 48959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[2] = cmax; /* value */ 49059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (cmax != 0.0) { 49159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[1] = (cmax - cmin) / cmax; 49259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 49359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[1] = 0.0f; 49459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[0] = 0.0f; 49559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 49659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (hsv[1] == 0.0) { 49759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[0] = -1.0f; 49859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 49959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float cdelta = cmax - cmin; 50059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float rc = (cmax - r) / cdelta; 50159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float gc = (cmax - g) / cdelta; 50259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float bc = (cmax - b) / cdelta; 50359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (r == cmax) { 50459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[0] = bc - gc; 50559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (g == cmax) { 50659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[0] = 2.0f + rc - bc; 50759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 50859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[0] = 4.0f + gc - rc; 50959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 51059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[0] *= 60.0f; 51159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (hsv[0] < 0.0f) { 51259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[0] += 360.0f; 51359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 51459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 51559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 51659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[0] /= 360.0f; 51759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (hsv[0] < 0.0f) { 51859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta hsv[0] = 0.0f; 51959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 52059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 52159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 52259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 52359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method converts rgb values to hsv values. 52459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 52559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param h 52659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * hue 52759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param s 52859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * saturation 52959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param v 53059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * value 53159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param rgb 53259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * rgb result vector (should have 3 elements) 53359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 53459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void hsvToRgb(float h, float s, float v, float[] rgb) { 53559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta h *= 360.0f; 53659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (s == 0.0) { 53759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[0] = rgb[1] = rgb[2] = v; 53859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 53959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (h == 360) { 54059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta h = 0; 54159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 54259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta h /= 60; 54359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 54459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int i = (int) Math.floor(h); 54559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float f = h - i; 54659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float p = v * (1.0f - s); 54759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float q = v * (1.0f - s * f); 54859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float t = v * (1.0f - s * (1.0f - f)); 54959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (i) { 55059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 0: 55159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[0] = v; 55259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[1] = t; 55359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[2] = p; 55459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 55559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 1: 55659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[0] = q; 55759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[1] = v; 55859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[2] = p; 55959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 56059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 2: 56159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[0] = p; 56259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[1] = v; 56359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[2] = t; 56459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 56559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 3: 56659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[0] = p; 56759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[1] = q; 56859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[2] = v; 56959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 57059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 4: 57159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[0] = t; 57259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[1] = p; 57359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[2] = v; 57459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 57559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 5: 57659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[0] = v; 57759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[1] = p; 57859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rgb[2] = q; 57959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 58059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 58159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 58259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 58359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 58459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 58559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public boolean shouldBeLoaded(Structure structure, BlenderContext blenderContext) { 58659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (blenderContext.getBlenderKey().getFeaturesToLoad() & FeaturesToLoad.MATERIALS) != 0; 58759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 58859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 589