浏览代码

Feature: user can now decide if the mipmaps will be generated or not; by default 'mipmap' blender flag is used to decide if mips for specified textures shall be generated or not

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10201 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
Kae..pl 12 年之前
父节点
当前提交
fea4c37e06

+ 31 - 1
engine/src/blender/com/jme3/asset/BlenderKey.java

@@ -104,6 +104,8 @@ public class BlenderKey extends ModelKey {
 	protected int								maxTextureSize = -1;
 	/** Allows to toggle generated textures loading. Disabled by default because it very often takes too much memory and needs to be used wisely. */
 	protected boolean							loadGeneratedTextures;
+	/** Tells if the mipmaps will be generated by jme or not. By default generation is dependant on the blender settings. */
+	protected MipmapGenerationMethod			mipmapGenerationMethod = MipmapGenerationMethod.GENERATE_WHEN_NEEDED;
 	
 	/**
 	 * Constructor used by serialization mechanisms.
@@ -334,6 +336,21 @@ public class BlenderKey extends ModelKey {
 		return generatedTexturePPU;
 	}
 	
+	/**
+	 * @return mipmaps generation method
+	 */
+	public MipmapGenerationMethod getMipmapGenerationMethod() {
+		return mipmapGenerationMethod;
+	}
+
+	/**
+	 * @param mipmapGenerationMethod
+	 * 				mipmaps generation method
+	 */
+	public void setMipmapGenerationMethod(MipmapGenerationMethod mipmapGenerationMethod) {
+		this.mipmapGenerationMethod = mipmapGenerationMethod;
+	}
+	
 	/**
 	 * This mehtod sets the name of the WORLD data block taht should be used during file loading. By default the name is
 	 * not set. If no name is set or the given name does not occur in the file - the first WORLD data block will be used
@@ -384,6 +401,7 @@ public class BlenderKey extends ModelKey {
 		oc.write(defaultMaterial, "default-material", null);
 		oc.write(faceCullMode, "face-cull-mode", FaceCullMode.Off);
 		oc.write(layersToLoad, "layers-to-load", -1);
+		oc.write(mipmapGenerationMethod , "mipmap-generation-method", MipmapGenerationMethod.GENERATE_WHEN_NEEDED);
 	}
 
 	@Override
@@ -400,6 +418,7 @@ public class BlenderKey extends ModelKey {
 		defaultMaterial = (Material) ic.readSavable("default-material", null);
 		faceCullMode = ic.readEnum("face-cull-mode", FaceCullMode.class, FaceCullMode.Off);
 		layersToLoad = ic.readInt("layers-to=load", -1);
+		mipmapGenerationMethod = ic.readEnum("mipmap-generation-method", MipmapGenerationMethod.class, MipmapGenerationMethod.GENERATE_WHEN_NEEDED);
 	}
 
 	@Override
@@ -476,7 +495,18 @@ public class BlenderKey extends ModelKey {
 		return true;
 	}
 
-
+	/**
+	 * This enum tells the importer if the mipmaps for textures will be generated by jme.
+	 * <li> NEVER_GENERATE and ALWAYS_GENERATE are quite understandable
+	 * <li> GENERATE_WHEN_NEEDED is an option that checks if the texture had 'Generate mipmaps' option set
+	 * in blender, mipmaps are generated only when the option is set
+	 * @author Marcin Roguski (Kaelthas)
+	 */
+	public static enum MipmapGenerationMethod {
+		NEVER_GENERATE,
+		ALWAYS_GENERATE,
+		GENERATE_WHEN_NEEDED;
+	}
 
 	/**
 	 * This interface describes the features of the scene that are to be loaded.

+ 19 - 6
engine/src/blender/com/jme3/scene/plugins/blender/textures/TextureHelper.java

@@ -162,11 +162,7 @@ public class TextureHelper extends AbstractBlenderHelper {
 			case TEX_NONE:// No texture, do nothing
 				break;
 			case TEX_POINTDENSITY:
-				LOGGER.warning("Point density texture loading currently not supported!");
-				break;
 			case TEX_VOXELDATA:
-				LOGGER.warning("Voxel data texture loading currently not supported!");
-				break;
 			case TEX_PLUGIN:
 			case TEX_ENVMAP:
 				LOGGER.log(Level.WARNING, "Unsupported texture type: {0} for texture: {1}", new Object[] { type, tex.getName() });
@@ -177,8 +173,25 @@ public class TextureHelper extends AbstractBlenderHelper {
 		if (result != null) {
 			result.setName(tex.getName());
 			result.setWrap(WrapMode.Repeat);
-			// NOTE: Enable mipmaps FOR ALL TEXTURES EVER
-			result.setMinFilter(MinFilter.Trilinear);
+			
+			//decide if the mipmaps will be generated
+			switch(blenderContext.getBlenderKey().getMipmapGenerationMethod()) {
+				case ALWAYS_GENERATE:
+					result.setMinFilter(MinFilter.Trilinear);
+					break;
+				case NEVER_GENERATE:
+					break;
+				case GENERATE_WHEN_NEEDED:
+					int imaflag = ((Number) tex.getFieldValue("imaflag")).intValue();
+					if((imaflag & 0x04) != 0) {
+						result.setMinFilter(MinFilter.Trilinear);
+					}
+					break;
+				default:
+					throw new IllegalStateException("Unknown mipmap generation method: " +
+								blenderContext.getBlenderKey().getMipmapGenerationMethod());
+			}
+			
 			if (type != TEX_IMAGE) {// only generated textures should have this key
 				result.setKey(new GeneratedTextureKey(tex.getName()));
 			}