package net.sf.openrocket.gui.figure3d.photo.sky;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import net.sf.openrocket.gui.figure3d.TextureCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jogamp.opengl.util.texture.Texture;
public class SkyBox extends Sky {
private static final Logger log = LoggerFactory.getLogger(SkyBox.class);
private static final String NAME[][] = {
{ "North", "East", "South", "West", "Up", "Down" },
{ "posz", "posx", "negz", "negx", "posy", "negy" },
{ "pos_z", "pos_x", "neg_z", "neg_x", "pos_y", "neg_y" },
//{ "ft", "rt", "bk", "lf", "up", "dn" }
//
{ "rt", "ft", "lf", "bk", "up", "dn" }
};
private static final String[] TYPE = { ".jpg", ".jpeg", ".png" };
private final String prefix;
private String suffix;
private String[] dir;
public SkyBox(final String prefix) {
this.prefix = prefix;
this.suffix = ".jpg";
found: for (String trySuf : TYPE) {
suffix = trySuf;
for (String[] tryDir : NAME) {
dir = tryDir;
try {
URL u = url(dir[0]);
log.debug("Trying URL {}", u);
InputStream is = u.openStream();
is.close();
break found;
} catch (IOException e) {
log.debug("Nope, {}", e.getMessage());
}
}
}
}
private URL url(String s) {
try {
return new URL(prefix + s + suffix);
} catch (MalformedURLException e) {
throw new Error(e);
}
}
@Override
public void draw(GL2 gl, final TextureCache cache) {
gl.glPushMatrix();
gl.glColor3d(1, 1, 1);
square(gl, cache.getTexture(url(dir[0])));
gl.glRotatef(90, 0, 1, 0);
square(gl, cache.getTexture(url(dir[1])));
gl.glRotatef(90, 0, 1, 0);
square(gl, cache.getTexture(url(dir[2])));
gl.glRotatef(90, 0, 1, 0);
square(gl, cache.getTexture(url(dir[3])));
gl.glRotatef(-90, 1, 0, 0);
gl.glRotatef(90, 0, 0, 1);
square(gl, cache.getTexture(url(dir[4])));
gl.glRotatef(180, 1, 0, 0);
square(gl, cache.getTexture(url(dir[5])));
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);
}
}