From 0fd34d3535b652157771fbeb6642dedf0dcb5602 Mon Sep 17 00:00:00 2001 From: "Kae..pl" Date: Tue, 28 Aug 2012 10:06:22 +0000 Subject: [PATCH] Ignoring textures when their UV coordinates type is not supported. This will prevent from unexpected exceptions to occur. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9690 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../blender/textures/CombinedTexture.java | 29 +++++++++------- .../textures/UVCoordinatesGenerator.java | 33 +++++++++++++++++++ 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/engine/src/blender/com/jme3/scene/plugins/blender/textures/CombinedTexture.java b/engine/src/blender/com/jme3/scene/plugins/blender/textures/CombinedTexture.java index 8cf718a29..eedd5f19c 100644 --- a/engine/src/blender/com/jme3/scene/plugins/blender/textures/CombinedTexture.java +++ b/engine/src/blender/com/jme3/scene/plugins/blender/textures/CombinedTexture.java @@ -7,6 +7,7 @@ import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.logging.Logger; import jme3tools.converters.ImageToAwt; @@ -39,6 +40,8 @@ import com.jme3.texture.Texture2D; * @author Marcin Roguski (Kaelthas) */ public class CombinedTexture { + private static final Logger LOGGER = Logger.getLogger(CombinedTexture.class.getName()); + /** The mapping type of the texture. Defined bu MaterialContext.MTEX_COL, MTEX_NOR etc. */ private final int mappingType; /** The data for each of the textures. */ @@ -81,17 +84,21 @@ public class CombinedTexture { if (!(texture instanceof GeneratedTexture) && !(texture instanceof Texture2D)) { throw new IllegalArgumentException("Unsupported texture type: " + (texture == null ? "null" : texture.getClass())); } - TextureData textureData = new TextureData(); - textureData.texture = texture; - textureData.textureBlender = textureBlender; - textureData.uvCoordinatesType = UVCoordinatesType.valueOf(uvCoordinatesType); - textureData.projectionType = UVProjectionType.valueOf(projectionType); - textureData.textureStructure = textureStructure; - - if (this.isWithoutAlpha(textureData, blenderContext)) { - textureDatas.clear();// clear previous textures, they will be covered anyway - } - textureDatas.add(textureData); + if(UVCoordinatesGenerator.isTextureCoordinateTypeSupported(UVCoordinatesType.valueOf(uvCoordinatesType))) { + TextureData textureData = new TextureData(); + textureData.texture = texture; + textureData.textureBlender = textureBlender; + textureData.uvCoordinatesType = UVCoordinatesType.valueOf(uvCoordinatesType); + textureData.projectionType = UVProjectionType.valueOf(projectionType); + textureData.textureStructure = textureStructure; + + if (this.isWithoutAlpha(textureData, blenderContext)) { + textureDatas.clear();// clear previous textures, they will be covered anyway + } + textureDatas.add(textureData); + } else { + LOGGER.warning("The texture coordinates type is not supported: " + UVCoordinatesType.valueOf(uvCoordinatesType) + ". The texture '" + textureStructure.getName() + "'."); + } } /** diff --git a/engine/src/blender/com/jme3/scene/plugins/blender/textures/UVCoordinatesGenerator.java b/engine/src/blender/com/jme3/scene/plugins/blender/textures/UVCoordinatesGenerator.java index c054ee078..d922466d7 100644 --- a/engine/src/blender/com/jme3/scene/plugins/blender/textures/UVCoordinatesGenerator.java +++ b/engine/src/blender/com/jme3/scene/plugins/blender/textures/UVCoordinatesGenerator.java @@ -236,6 +236,39 @@ public class UVCoordinatesGenerator { } return result; } + + /** + * This method should be used to determine if the texture will ever be + * computed. If the texture coordinates are not supported then the try of + * flattening the texture might result in runtime exceptions occurence. + * + * @param texco + * the texture coordinates type + * @return true if the type is supported and false otherwise + */ + public static boolean isTextureCoordinateTypeSupported(UVCoordinatesType texco) { + switch (texco) { + case TEXCO_ORCO: + case TEXCO_UV: + case TEXCO_NORM: + return true; + case TEXCO_REFL: + case TEXCO_GLOB: + case TEXCO_TANGENT: + case TEXCO_STRESS: + case TEXCO_LAVECTOR: + case TEXCO_OBJECT: + case TEXCO_OSA: + case TEXCO_PARTICLE_OR_STRAND: + case TEXCO_SPEED: + case TEXCO_STICKY: + case TEXCO_VIEW: + case TEXCO_WINDOW: + return false; + default: + throw new IllegalStateException("Unknown texture coordinates value: " + texco); + } + } /** * This method returns the bounding box of the given geometries.