package org.osm2world.core.target.jogl; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.imageio.ImageIO; import javax.media.opengl.GL; import com.jogamp.opengl.util.awt.ImageUtil; import com.jogamp.opengl.util.texture.Texture; import com.jogamp.opengl.util.texture.TextureIO; import com.jogamp.opengl.util.texture.awt.AWTTextureIO; /** * loads textures from files to JOGL and keeps them available for future use */ public class JOGLTextureManager { private final GL gl; private final Map<File, Texture> availableTextures = new HashMap<File, Texture>(); public JOGLTextureManager(GL gl) { this.gl = gl; } public Texture getTextureForFile(File file) { return getTextureForFile(file, true); } public Texture getTextureForFile(File file, boolean createMipmaps) { Texture result = availableTextures.get(file); if (result == null) { synchronized (this) { //try again if (availableTextures.containsKey(file)) { return availableTextures.get(file); } try { if (!file.getName().toLowerCase().endsWith("png")) { //flip to ensure consistent tex coords with png images BufferedImage bufferedImage = ImageIO.read(file); ImageUtil.flipImageVertically(bufferedImage); result = AWTTextureIO.newTexture( gl.getGLProfile(), bufferedImage, createMipmaps); } else { result = TextureIO.newTexture(file, createMipmaps); } /* workaround for OpenGL 3: call to glGenerateMipmap is missing in [AWT]TextureIO.newTexture() * May be fixed in new versions of JOGL. */ if (createMipmaps && gl.isGL3()) { gl.glGenerateMipmap(result.getTarget()); } availableTextures.put(file, result); } catch (IOException exc) { exc.printStackTrace(); System.exit(2); //TODO error handling } } } return result; } public void releaseAll() { for (Texture texture : availableTextures.values()) { texture.destroy(gl); } availableTextures.clear(); } }