AssetManager loadTexture from outside of assets folder

Hi, i am making a texuture previewer and converter,now i am testing how to load textures from files selected by the user by a JfileChooser. As it is necessary tu have the resoruces into asset folder when i try to load a texture with the next code the texture result is a null reference. So i need that assetmanager can accept loadtextures from the selectedfiles of the jfilechooser

[java]myFrame=new JFrame();
if(myFileChooser.showOpenDialog(myFrame)==JFileChooser.APPROVE_OPTION){
AssetManager assetManager= new AssetManager() {

			@Override
			public void unregisterLocator(String arg0,
					Class<? extends AssetLocator> arg1) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void unregisterLoader(Class<? extends AssetLoader> arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void setShaderGenerator(ShaderGenerator arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			@Deprecated
			public void setAssetEventListener(AssetEventListener arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void removeClassLoader(ClassLoader arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void removeAssetEventListener(AssetEventListener arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void registerLocator(String arg0, Class<? extends AssetLocator> arg1) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			@Deprecated
			public void registerLocator(String arg0, String arg1) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void registerLoader(Class<? extends AssetLoader> arg0,
					String... arg1) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			@Deprecated
			public void registerLoader(String arg0, String... arg1) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public AssetInfo locateAsset(AssetKey<?> arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Texture loadTexture(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Texture loadTexture(TextureKey arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Shader loadShader(ShaderKey arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Spatial loadModel(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Spatial loadModel(ModelKey arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Material loadMaterial(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public BitmapFont loadFont(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public FilterPostProcessor loadFilter(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public FilterPostProcessor loadFilter(FilterKey arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public AudioData loadAudio(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public AudioData loadAudio(AudioKey arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Object loadAsset(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public <T> T loadAsset(AssetKey<T> arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public ShaderGenerator getShaderGenerator(EnumSet<Caps> arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public List<ClassLoader> getClassLoaders() {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public void clearAssetEventListeners() {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void addClassLoader(ClassLoader arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void addAssetEventListener(AssetEventListener arg0) {
				// TODO Auto-generated method stub
				
			}
		};
		
		Texture inputTexture=assetManager.loadTexture(myFileChooser.getSelectedFile().getAbsolutePath());
		Image inputImage= inputTexture.getImage();
		Image outputImage= new Image();
		outputImage.setHeight(inputImage.getHeight());
		outputImage.setWidth(inputImage.getWidth());
		outputImage.setFormat(Image.Format.DXT1);
		ImageToAwt.convert(inputImage, outputImage);
		JmeExporter exporter= new JmeExporter() {
			
			@Override
			public boolean save(Savable arg0, File arg1) throws IOException {
				// TODO Auto-generated method stub
				return false;
			}
			
			@Override
			public boolean save(Savable arg0, OutputStream arg1) throws IOException {
				// TODO Auto-generated method stub
				return false;
			}
			
			@Override
			public OutputCapsule getCapsule(Savable arg0) {
				// TODO Auto-generated method stub
				return null;
			}
		};
		File outputFile= new File(myFileChooser.getSelectedFile().getAbsoluteFile() +"new.dds");
		exporter.save(outputImage,outputFile);
	}[/java]

Why are you creating a own emtpy assetmanager, that makes no sense.

You probably wnat to register a locator to the assetmanager, pointing to the correct location of the texture and then load it.

I created an empty assetmanager because it was the only way i saw to load a texture from a file, as my intention is to create a tool to preview textures from files selected by the user i need a way to load textures from any path in the pc.but i don´t know if there is any other way

Well i just told you how, register a locator that locates your texture.

assetManager.registerLocator(bla,blub)
Best is you see the javadoc for it.

https://wiki.jmonkeyengine.org/legacy/doku.php/jme3:beginner:hello_asset

I have followed the java doc and now my code is the next, but as i am not using an entire jmonkeyapp i must did something wrong because i can´t load the files, here is the new code:
[java]public class Main {
static JFrame myFrame;
static JFileChooser myFileChooser= new JFileChooser();
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
myFrame=new JFrame();
if(myFileChooser.showOpenDialog(myFrame)==JFileChooser.APPROVE_OPTION){
AssetManager assetManager= new AssetManager() {

			@Override
			public void unregisterLocator(String arg0,
					Class<? extends AssetLocator> arg1) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void unregisterLoader(Class<? extends AssetLoader> arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void setShaderGenerator(ShaderGenerator arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			@Deprecated
			public void setAssetEventListener(AssetEventListener arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void removeClassLoader(ClassLoader arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void removeAssetEventListener(AssetEventListener arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void registerLocator(String arg0, Class<? extends AssetLocator> arg1) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			@Deprecated
			public void registerLocator(String arg0, String arg1) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void registerLoader(Class<? extends AssetLoader> arg0,
					String... arg1) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			@Deprecated
			public void registerLoader(String arg0, String... arg1) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public AssetInfo locateAsset(AssetKey<?> arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Texture loadTexture(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Texture loadTexture(TextureKey arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Shader loadShader(ShaderKey arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Spatial loadModel(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Spatial loadModel(ModelKey arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Material loadMaterial(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public BitmapFont loadFont(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public FilterPostProcessor loadFilter(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public FilterPostProcessor loadFilter(FilterKey arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public AudioData loadAudio(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public AudioData loadAudio(AudioKey arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public Object loadAsset(String arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public <T> T loadAsset(AssetKey<T> arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public ShaderGenerator getShaderGenerator(EnumSet<Caps> arg0) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public List<ClassLoader> getClassLoaders() {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public void clearAssetEventListeners() {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void addClassLoader(ClassLoader arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void addAssetEventListener(AssetEventListener arg0) {
				// TODO Auto-generated method stub
				
			}
		};
		String path=myFileChooser.getSelectedFile().getAbsolutePath();
		Texture inputTexture=loadTextureFromFilePath(assetManager,myFileChooser.getSelectedFile().toPath());
		Image inputImage= inputTexture.getImage();
		Image outputImage= new Image();
		outputImage.setHeight(inputImage.getHeight());
		outputImage.setWidth(inputImage.getWidth());
		outputImage.setFormat(Image.Format.DXT1);
		ImageToAwt.convert(inputImage, outputImage);
		JmeExporter exporter= new JmeExporter() {
			
			@Override
			public boolean save(Savable arg0, File arg1) throws IOException {
				// TODO Auto-generated method stub
				return false;
			}
			
			@Override
			public boolean save(Savable arg0, OutputStream arg1) throws IOException {
				// TODO Auto-generated method stub
				return false;
			}
			
			@Override
			public OutputCapsule getCapsule(Savable arg0) {
				// TODO Auto-generated method stub
				return null;
			}
		};
		File outputFile= new File(myFileChooser.getSelectedFile().getAbsoluteFile() +"new.dds");
		exporter.save(outputImage,outputFile);
	}
}

private static Texture loadTextureFromFilePath(AssetManager assetManager,Path filePath){
	String fileName=filePath.getFileName().toString();
	String fileDirectory=filePath.getParent().toString();
	assetManager.registerLocator(fileDirectory, FileLocator.class);
	return assetManager.loadTexture(fileName);
}

}[/java]

Well, you’ve created an AssetLoader subclass that overrides all of its methods to do nothing. Very strange.

If all you want to do is load some images then why not just load the images? All JME is doing is calling the java ImageIO utility class.

If you instantiate your own AssetManager, you have to implement the methods which you’re going to use. Leaving them as auto-generated stubs is unlikely to do what you want. For instance, a loadTexture() method which returns null means you will never get a Texture instance out of it. You will always get null, which tends to result in a NullPointerException.

I have a suggestion. Instead of trying to create your own AssetManager (which is difficult), how about using the one provided by SimpleApplication and then point your the JFileChooser to the appropriate directory, which is probably at System.getProperty(“user.dir”)+"/assets" ?

You can also just instantiate your own DesktopAssetManager… which is what SimpleApplication is using.

…but again I kind of question the need. If you are going to try displaying these textures in Swing without JME then you will end up converting JME Images back to AWT Images… when they started as AWT images in the first place loaded from ImageIO.
http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html

use locators.

No, sorry : learn java, you have obviously a lack here (you extends something that is not meant to be extended and you override eveyr method with an empty body etc.)

1 Like

I am learning java, i am preparing SCJP exam, the reason of all that overrides is that were autogenerated and as i didn´t know how assetmanager works i didn´t do something. I wanted to use assetManager to have the possibility of preview dds files, but as you tell me i think the easiest way is going to be read dds files as binary to create an image and then convert it to a swing compatible format.

@jor1980 said: I am learning java, i am preparing SCJP exam, the reason of all that overrides is that were autogenerated and as i didn´t know how assetmanager works i didn´t do something. I wanted to use assetManager to have the possibility of preview dds files, but as you tell me i think the easiest way is going to be read dds files as binary to create an image and then convert it to a swing compatible format.

You really won’t be able to preview dds files anyway… you would require OpenGL for that. (I mean not with the standard AssetManager… dds is often in device-specific format that is sent straight to the GPU)

Finally i found a very easy way to preview dds textures in Swing, using DDSUtil to obtain a BufferedImage, and for non dds files using ImageIO:
[java]BufferedImage imageToDraw;
if(myFileChooser.getSelectedFile().getName().endsWith(".dds")){
imageToDraw= DDSUtil.read(myFileChooser.getSelectedFile());
}
else
{
imageToDraw=ImageIO.read(myFileChooser.getSelectedFile());
}[/java]

1 Like