|
|
|
@ -31,12 +31,14 @@ |
|
|
|
|
*/ |
|
|
|
|
package com.jme3.scene.plugins.blender.textures; |
|
|
|
|
|
|
|
|
|
import com.jme3.asset.AssetManager; |
|
|
|
|
import com.jme3.asset.TextureKey; |
|
|
|
|
import com.jme3.scene.plugins.blender.file.BlenderInputStream; |
|
|
|
|
import com.jme3.texture.Image; |
|
|
|
|
import com.jme3.texture.Texture; |
|
|
|
|
import com.jme3.texture.plugins.AWTLoader; |
|
|
|
|
import com.jme3.texture.plugins.DDSLoader; |
|
|
|
|
import com.jme3.texture.plugins.TGALoader; |
|
|
|
|
import java.io.InputStream; |
|
|
|
|
import com.jme3.texture.plugins.HDRLoader; |
|
|
|
|
import java.util.logging.Level; |
|
|
|
|
import java.util.logging.Logger; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -47,11 +49,29 @@ import java.util.logging.Logger; |
|
|
|
|
*/ |
|
|
|
|
/* package */class ImageLoader extends AWTLoader { |
|
|
|
|
private static final Logger LOGGER = Logger.getLogger(ImageLoader.class.getName()); |
|
|
|
|
|
|
|
|
|
protected DDSLoader ddsLoader = new DDSLoader(); // DirectX image loader
|
|
|
|
|
private static final Logger hdrLogger = Logger.getLogger(HDRLoader.class.getName()); // Used to silence HDR Errors
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* List of Blender-Supported Texture Extensions (we have to guess them, so |
|
|
|
|
* the AssetLoader can find them. Not good, but better than nothing. |
|
|
|
|
* Source: https://docs.blender.org/manual/en/dev/data_system/files/media/image_formats.html
|
|
|
|
|
*/ |
|
|
|
|
private static final String[] extensions = new String[] |
|
|
|
|
{ /* Windows Bitmap */".bmp", |
|
|
|
|
/* Iris */ ".sgi", ".rgb", ".bw", |
|
|
|
|
/* PNG */ ".png", |
|
|
|
|
/* JPEG */ ".jpg", ".jpeg", |
|
|
|
|
/* JPEG 2000 */ ".jp2", ".j2c", |
|
|
|
|
/* Targa */".tga", |
|
|
|
|
/* Cineon & DPX */".cin", ".dpx", |
|
|
|
|
/* OpenEXR */ ".exr", |
|
|
|
|
/* Radiance HDR */ ".hdr", |
|
|
|
|
/* TIFF */ ".tif", ".tiff", |
|
|
|
|
/* DDS (Direct X) */ ".dds" }; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* This method loads the image from the blender file itself. It tries each loader to load the image. |
|
|
|
|
* This method loads a image which is packed into the blender file. |
|
|
|
|
* It makes use of all the registered AssetLoaders |
|
|
|
|
* |
|
|
|
|
* @param inputStream |
|
|
|
|
* blender input stream |
|
|
|
@ -60,76 +80,57 @@ import java.util.logging.Logger; |
|
|
|
|
* @param flipY |
|
|
|
|
* if the image should be flipped (does not work with DirectX image) |
|
|
|
|
* @return loaded image or null if it could not be loaded |
|
|
|
|
* @deprecated This method has only been left in for API compability. |
|
|
|
|
* Use loadTexture instead |
|
|
|
|
*/ |
|
|
|
|
public Image loadImage(BlenderInputStream inputStream, int startPosition, boolean flipY) { |
|
|
|
|
// loading using AWT loader
|
|
|
|
|
inputStream.setPosition(startPosition); |
|
|
|
|
Image result = this.loadImage(inputStream, ImageType.AWT, flipY); |
|
|
|
|
// loading using TGA loader
|
|
|
|
|
if (result == null) { |
|
|
|
|
inputStream.setPosition(startPosition); |
|
|
|
|
result = this.loadImage(inputStream, ImageType.TGA, flipY); |
|
|
|
|
} |
|
|
|
|
// loading using DDS loader
|
|
|
|
|
if (result == null) { |
|
|
|
|
inputStream.setPosition(startPosition); |
|
|
|
|
result = this.loadImage(inputStream, ImageType.DDS, flipY); |
|
|
|
|
public Image loadImage(AssetManager assetManager, BlenderInputStream inputStream, int startPosition, boolean flipY) { |
|
|
|
|
Texture tex = loadTexture(assetManager, inputStream, startPosition, flipY); |
|
|
|
|
|
|
|
|
|
if (tex == null) { |
|
|
|
|
return null; |
|
|
|
|
} else { |
|
|
|
|
return tex.getImage(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (result == null) { |
|
|
|
|
LOGGER.warning("Image could not be loaded by none of available loaders!"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* This method loads an image of a specified type from the given input stream. |
|
|
|
|
* This method loads a texture which is packed into the blender file. |
|
|
|
|
* It makes use of all the registered AssetLoaders |
|
|
|
|
* |
|
|
|
|
* @param inputStream |
|
|
|
|
* the input stream we read the image from |
|
|
|
|
* @param imageType |
|
|
|
|
* the type of the image {@link ImageType} |
|
|
|
|
* blender input stream |
|
|
|
|
* @param startPosition |
|
|
|
|
* position in the stream where the image data starts |
|
|
|
|
* @param flipY |
|
|
|
|
* if the image should be flipped (does not work with DirectX image) |
|
|
|
|
* @return loaded image or null if it could not be loaded |
|
|
|
|
* @return loaded texture or null if it could not be loaded |
|
|
|
|
*/ |
|
|
|
|
public Image loadImage(InputStream inputStream, ImageType imageType, boolean flipY) { |
|
|
|
|
Image result = null; |
|
|
|
|
switch (imageType) { |
|
|
|
|
case AWT: |
|
|
|
|
try { |
|
|
|
|
result = this.load(inputStream, flipY); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
LOGGER.warning("Unable to load image using AWT loader!"); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case DDS: |
|
|
|
|
try { |
|
|
|
|
result = ddsLoader.load(inputStream); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
LOGGER.warning("Unable to load image using DDS loader!"); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case TGA: |
|
|
|
|
try { |
|
|
|
|
result = TGALoader.load(inputStream, flipY); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
LOGGER.warning("Unable to load image using TGA loader!"); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
throw new IllegalStateException("Unknown image type: " + imageType); |
|
|
|
|
public Texture loadTexture(AssetManager assetManager, BlenderInputStream inputStream, int startPosition, boolean flipY) { |
|
|
|
|
inputStream.setPosition(startPosition); |
|
|
|
|
TextureKey tKey; |
|
|
|
|
Texture result = null; |
|
|
|
|
|
|
|
|
|
hdrLogger.setLevel(Level.SEVERE); // When we bruteforce try HDR on a non hdr file, it prints unreadable chars
|
|
|
|
|
|
|
|
|
|
for (String ext: extensions) { |
|
|
|
|
tKey = new TextureKey("dummy" + ext, flipY); |
|
|
|
|
try { |
|
|
|
|
result = assetManager.loadAssetFromStream(tKey, inputStream); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (result != null) { |
|
|
|
|
break; // Could locate a possible asset
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (result == null) { |
|
|
|
|
LOGGER.warning("Texture could not be loaded by any of the available loaders!\n" |
|
|
|
|
+ "Since the file has been packed into the blender file, there is no" |
|
|
|
|
+ "way for us to tell you which texture it was."); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Image types that can be loaded. AWT: png, jpg, jped or bmp TGA: tga DDS: DirectX image files |
|
|
|
|
* |
|
|
|
|
* @author Marcin Roguski (Kaelthas) |
|
|
|
|
*/ |
|
|
|
|
private static enum ImageType { |
|
|
|
|
AWT, TGA, DDS; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|