package net.sf.openrocket.gui.figure3d.photo.sky; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; import javax.imageio.ImageIO; import javax.media.opengl.GL; import javax.media.opengl.GL2; import javax.media.opengl.GLProfile; import net.sf.openrocket.gui.figure3d.TextureCache; import com.jogamp.opengl.util.texture.Texture; import com.jogamp.opengl.util.texture.awt.AWTTextureIO; public class SkyBoxCross extends Sky { private final URL imageURL; Texture north, east, south, west, up, down; public SkyBoxCross(final URL imageURL) { this.imageURL = imageURL; } private static BufferedImage fixBug(BufferedImage i) { BufferedImage d2 = new BufferedImage(i.getWidth(), i.getHeight(), i.getType()); d2.getGraphics().drawImage(i, 0, 0, null); return d2; } private void loadTextures(GL2 gl) { try { BufferedImage i = ImageIO.read(imageURL); int dy = i.getHeight() / 3; int dx = i.getWidth() / 4; west = AWTTextureIO.newTexture(GLProfile.getDefault(), fixBug(i.getSubimage(0, dy, dx, dy)), true); north = AWTTextureIO.newTexture(GLProfile.getDefault(), fixBug(i.getSubimage(dx, dy, dx, dy)), true); east = AWTTextureIO.newTexture(GLProfile.getDefault(), fixBug(i.getSubimage(dx * 2, dy, dx, dy)), true); south = AWTTextureIO.newTexture(GLProfile.getDefault(), fixBug(i.getSubimage(dx * 3, dy, dx, dy)), true); up = AWTTextureIO.newTexture(GLProfile.getDefault(), fixBug(i.getSubimage(dx, 0, dx, dy)), true); down = AWTTextureIO.newTexture(GLProfile.getDefault(), fixBug(i.getSubimage(dx, 2 * dy, dx, dy)), true); } catch (IOException e) { throw new Error(e); } } @Override public void draw(GL2 gl, final TextureCache cache) { if (north == null) { loadTextures(gl); } gl.glPushMatrix(); gl.glColor3d(1, 1, 1); square(gl, north); gl.glRotatef(90, 0, 1, 0); square(gl, east); gl.glRotatef(90, 0, 1, 0); square(gl, south); gl.glRotatef(90, 0, 1, 0); square(gl, west); gl.glRotatef(-90, 1, 0, 0); gl.glRotatef(90, 0, 0, 1); square(gl, up); gl.glRotatef(180, 1, 0, 0); square(gl, down); gl.glPopMatrix(); } private static final void square(GL2 gl, Texture t) { t.bind(gl); t.enable(gl); gl.glBegin(GL.GL_TRIANGLE_STRIP); gl.glNormal3f(0, 0, -1); gl.glTexCoord2f(1, 1); gl.glVertex3f(-1, -1, 1); gl.glTexCoord2f(1, 0); gl.glVertex3f(-1, 1, 1); gl.glTexCoord2f(0, 1); gl.glVertex3f(1, -1, 1); gl.glTexCoord2f(0, 0); gl.glVertex3f(1, 1, 1); gl.glEnd(); t.disable(gl); } }