package javaforce.gl;
import java.io.*;
import javaforce.*;
import static javaforce.gl.GL.*;
/** Stores a texture (image).
* Textures are usually loaded after a new model is loaded.
* All model's share the same set of textures. */
public class GLTexture {
public JFImage bitmap;
public int refcnt;
public int glid;
public boolean loaded;
public int idx; //GL texture unit
public String name;
private static boolean mipmaps = false;
public GLTexture(int idx) {
refcnt = 0;
glid = -1;
bitmap = new JFImage();
loaded = false;
this.idx = idx;
}
public void set(int pixels[], int x, int y) {
bitmap.setSize(x,y);
bitmap.putPixels(pixels, 0, 0, x, y, 0);
}
public boolean load(String filename) {
JFLog.log("Loading Texture:" + filename.toString());
try {
return load(new FileInputStream(filename));
} catch (FileNotFoundException e) {
JFLog.log("File not found:" + filename);
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public boolean load(InputStream is) {
if (!bitmap.load(is)) {
return false;
}
/* //test
int px[] = bitmap.getBuffer();
java.util.Random r = new java.util.Random();
for(int p=0;p<px.length;p++) {
px[p] = r.nextInt() | 0xff000000;
}
*/
return true;
}
public boolean load() {
if (glid == -1) {
int id[] = new int[1];
id[0] = -1;
glGenTextures(1, id);
if (id[0] == -1) {
JFLog.log("glGenTextures failed:Error=0x" + Integer.toString(glGetError(), 16));
return false;
}
glid = id[0];
}
if (loaded) {
return true;
}
glActiveTexture(GL.GL_TEXTURE0 + idx);
glBindTexture(GL.GL_TEXTURE_2D, glid);
glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);
if (mipmaps) {
glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST_MIPMAP_NEAREST);
glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST_MIPMAP_NEAREST);
} else {
glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
}
glTexImage2D(GL.GL_TEXTURE_2D, 0, 4, bitmap.getWidth(), bitmap.getHeight(), 0, GL.GL_BGRA
, GL.GL_UNSIGNED_BYTE, bitmap.getPixels());
loaded = true;
return true;
}
public void bind() {
glActiveTexture(GL.GL_TEXTURE0 + idx);
glBindTexture(GL.GL_TEXTURE_2D, glid);
}
}