From c570e1e38f2ff8622a71f81436654bad01cfdd5b Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Sun, 21 Jul 2019 23:12:19 -0400
Subject: [PATCH] Raw embed texture (too big).
---
ObjEditor.java | 1
iCameraPane.java | 2
CameraPane.java | 266 ++++++++++++++++++++++++++-----------------
GroupEditor.java | 34 +++++
cTexture.java | 8 +
Object3D.java | 17 ++
6 files changed, 216 insertions(+), 112 deletions(-)
diff --git a/CameraPane.java b/CameraPane.java
index acc49b8..cef7cdb 100644
--- a/CameraPane.java
+++ b/CameraPane.java
@@ -45,6 +45,39 @@
static int STEP = 1;
+ private static BufferedImage CreateBim(byte[] bytes, int width, int height)
+ {
+ int[] pixels = new int[bytes.length/3];
+ for (int i=pixels.length; --i>=0;)
+ {
+ int i3 = i*3;
+ pixels[i] = 0xFF;
+ pixels[i] <<= 8;
+ pixels[i] |= bytes[i3+2] & 0xFF;
+ pixels[i] <<= 8;
+ pixels[i] |= bytes[i3+1] & 0xFF;
+ pixels[i] <<= 8;
+ pixels[i] |= bytes[i3] & 0xFF;
+ }
+ /*
+ int r=0,g=0,b=0,a=0;
+ for (int i=0; i<width; i++)
+ for (int j=0; j<height; j++)
+ {
+ int index = j*width+i;
+ int p = pixels[index];
+ a = ((p>>24) & 0xFF);
+ r = ((p>>16) & 0xFF);
+ g = ((p>>8) & 0xFF);
+ b = (p & 0xFF);
+ pixels[index] = (a<<24) | (b<<16) | (g<<8) | r;
+ }
+ /**/
+ BufferedImage rendImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // ImageIO.read(infile);
+ rendImage.setRGB(0,0,width,height,pixels,width*(height-1),-width);
+ return rendImage;
+ }
+
/*static*/ private boolean CULLFACE = false; // true;
/*static*/ boolean NEAREST = false; // true;
/*static*/ boolean WIREFRAME = false; // true;
@@ -2405,43 +2438,19 @@
return currentGL;
}
- private BufferedImage CreateBim(TextureData texturedata)
+ static private BufferedImage CreateBim(TextureData texturedata)
{
- // cache to disk
- Buffer buffer = texturedata.getBuffer(); // getMipmapData();
- //buffers[0].
- ByteBuffer bytebuf = (ByteBuffer)buffer; // ).asIntBuffer();
- int[] pixels = new int[bytebuf.capacity()/3];
- int width = texturedata.getWidth(); //(int)Math.sqrt(pixels.length); // squared
- int height = width;
- for (int i=pixels.length; --i>=0;)
- {
- int i3 = i*3;
- pixels[i] = 0xFF;
- pixels[i] <<= 8;
- pixels[i] |= bytebuf.get(i3+2) & 0xFF;
- pixels[i] <<= 8;
- pixels[i] |= bytebuf.get(i3+1) & 0xFF;
- pixels[i] <<= 8;
- pixels[i] |= bytebuf.get(i3) & 0xFF;
- }
- /*
- int r=0,g=0,b=0,a=0;
- for (int i=0; i<width; i++)
- for (int j=0; j<height; j++)
- {
- int index = j*width+i;
- int p = pixels[index];
- a = ((p>>24) & 0xFF);
- r = ((p>>16) & 0xFF);
- g = ((p>>8) & 0xFF);
- b = (p & 0xFF);
- pixels[index] = (a<<24) | (b<<16) | (g<<8) | r;
- }
- /**/
- BufferedImage rendImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // ImageIO.read(infile);
- rendImage.setRGB(0,0,width,height,pixels,width*(height-1),-width);
- return rendImage;
+ Grafreed.Assert(texturedata != null);
+
+ int width = texturedata.getWidth();
+ int height = texturedata.getHeight();
+
+ Buffer buffer = texturedata.getBuffer();
+ ByteBuffer bytebuf = (ByteBuffer)buffer;
+
+ byte[] bytes = bytebuf.array();
+
+ return CreateBim(bytes, width, height);
}
/**/
@@ -2452,18 +2461,20 @@
int resolution;
- CacheTexture(com.sun.opengl.util.texture.Texture tex, int res)
+ CacheTexture(com.sun.opengl.util.texture.TextureData texdata, int res)
{
- texture = tex;
+ texture = com.sun.opengl.util.texture.TextureIO.newTexture(texdata);
+ texturedata = texdata;
resolution = res;
}
}
/**/
// TEXTURE static Texture texture;
- static public java.util.Hashtable<String, CacheTexture> textures = new java.util.Hashtable<String, CacheTexture>();
- static public java.util.Hashtable<BufferedImage, CacheTexture> bimtextures = new java.util.Hashtable<BufferedImage, CacheTexture>();
- static public java.util.HashSet<String> usedtextures = new java.util.HashSet<String>();
+ static public Hashtable<cTexture, CacheTexture> texturepigment = new Hashtable<cTexture, CacheTexture>();
+ static public Hashtable<cTexture, CacheTexture> texturebump = new Hashtable<cTexture, CacheTexture>();
+ static public Hashtable<byte[], CacheTexture> bimtextures = new Hashtable<byte[], CacheTexture>();
+ static public java.util.HashSet<cTexture> usedtextures = new java.util.HashSet<cTexture>();
int pigmentdepth = 0;
public com.sun.opengl.util.texture.Texture[] pigmentstack = new com.sun.opengl.util.texture.Texture[65536];
@@ -2471,10 +2482,10 @@
public com.sun.opengl.util.texture.Texture[] bumpstack = new com.sun.opengl.util.texture.Texture[65536];
//public static String DEFAULT_TEXTURE = "DEFAULT_TEXTURE";
public static cTexture DEFAULT_TEXTURES = new cTexture("DEFAULT_TEXTURE" + ":" + "DEFAULT_TEXTURE_BUMP");
- public static String NOISE_TEXTURE = "WHITE_NOISE";
+ public static cTexture NOISE_TEXTURE = new cTexture("WHITE_NOISE:");
// public static cTexture IMMORTAL_TEXTURE = new cTexture("IMMORTAL");
- com.sun.opengl.util.texture.Texture GetResourceTexture(String name, boolean bump)
+ com.sun.opengl.util.texture.TextureData GetResourceTexture(String name, boolean bump)
{
TextureData texturedata = null;
@@ -2493,16 +2504,16 @@
if (bump)
texturedata = ConvertBump(texturedata, false);
- com.sun.opengl.util.texture.Texture texture =
- com.sun.opengl.util.texture.TextureIO.newTexture(texturedata);
+// com.sun.opengl.util.texture.Texture texture =
+// com.sun.opengl.util.texture.TextureIO.newTexture(texturedata);
- texture.setTexParameteri(javax.media.opengl.GL.GL_TEXTURE_WRAP_S, javax.media.opengl.GL.GL_REPEAT);
- texture.setTexParameteri(javax.media.opengl.GL.GL_TEXTURE_WRAP_T, javax.media.opengl.GL.GL_REPEAT);
+ //texture.setTexParameteri(javax.media.opengl.GL.GL_TEXTURE_WRAP_S, javax.media.opengl.GL.GL_REPEAT);
+ //texture.setTexParameteri(javax.media.opengl.GL.GL_TEXTURE_WRAP_T, javax.media.opengl.GL.GL_REPEAT);
- return texture;
+ return texturedata;
}
- com.sun.opengl.util.texture.Texture GetBimTexture(BufferedImage name, boolean bump)
+ com.sun.opengl.util.texture.TextureData GetBimTexture(BufferedImage bim, boolean bump)
{
TextureData texturedata = null;
@@ -2510,7 +2521,7 @@
{
texturedata =
com.sun.opengl.util.texture.TextureIO.newTextureData(
- name,
+ bim,
true);
} catch (Exception e)
{
@@ -2519,14 +2530,8 @@
if (bump)
texturedata = ConvertBump(texturedata, false);
-
- com.sun.opengl.util.texture.Texture texture =
- com.sun.opengl.util.texture.TextureIO.newTexture(texturedata);
-
- texture.setTexParameteri(javax.media.opengl.GL.GL_TEXTURE_WRAP_S, javax.media.opengl.GL.GL_REPEAT);
- texture.setTexParameteri(javax.media.opengl.GL.GL_TEXTURE_WRAP_T, javax.media.opengl.GL.GL_REPEAT);
-
- return texture;
+
+ return texturedata;
}
boolean HUESMOOTH = true; // wrap around bug... true;
@@ -8014,8 +8019,8 @@
pigment = null;
}
- ReleaseTexture(bump, true);
- ReleaseTexture(pigment, false);
+ ReleaseTexture(tex, true);
+ ReleaseTexture(tex, false);
}
public void ReleasePigmentTexture(cTexture tex) // INTERFACE
@@ -8044,7 +8049,7 @@
pigment = null;
}
- ReleaseTexture(pigment, false);
+ ReleaseTexture(tex, false);
}
public void ReleaseBumpTexture(cTexture tex) // INTERFACE
@@ -8073,10 +8078,10 @@
bump = null;
}
- ReleaseTexture(bump, true);
+ ReleaseTexture(tex, true);
}
- void ReleaseTexture(String tex, boolean bump)
+ void ReleaseTexture(cTexture tex, boolean bump)
{
if (// DrawMode() != 0 || /*tex == null ||*/
ambientOcclusion ) // || !textureon)
@@ -8087,7 +8092,7 @@
CacheTexture/*com.sun.opengl.util.texture.Texture*/ texture = null;
if (tex != null)
- texture = textures.get(tex);
+ texture = bump ? texturebump.get(tex) : texturepigment.get(tex);
// //assert( texture != null );
// if (texture == null)
@@ -8237,13 +8242,13 @@
if (tex == null)
{
- BindTexture(null, null,false,resolution);
+ BindTexture(null,false,resolution);
return;
}
String pigment = Object3D.GetPigment(tex);
- usedtextures.add(pigment);
+ usedtextures.add(tex);
//if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
{
@@ -8257,7 +8262,7 @@
}
GetGL().glActiveTexture(GetGL().GL_TEXTURE0);
- BindTexture(tex.pigmenttexture, pigment, false, resolution);
+ BindTexture(tex, false, resolution);
}
/*boolean*/ public void BindBumpTexture(cTexture tex, int resolution) throws Exception // INTERFACE
@@ -8270,13 +8275,13 @@
if (tex == null)
{
- BindTexture(null, null,true,resolution);
+ BindTexture(null,true,resolution);
return;
}
String bump = Object3D.GetBump(tex);
- usedtextures.add(bump);
+ usedtextures.add(tex);
//if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
{
@@ -8290,7 +8295,7 @@
}
GetGL().glActiveTexture(GetGL().GL_TEXTURE2);
- BindTexture(tex.bumptexture, bump, true, resolution);
+ BindTexture(tex, true, resolution);
GetGL().glActiveTexture(GetGL().GL_TEXTURE0);
}
@@ -8314,13 +8319,19 @@
return fileExists;
}
- CacheTexture GetCacheTexture(java.awt.image.BufferedImage bim, String tex, boolean bump, int resolution) throws Exception
+ CacheTexture GetCacheTexture(cTexture tex, boolean bump, int resolution) throws Exception
{
CacheTexture texturecache = null;
if (tex != null)
{
- String texname = tex;
+ String texname = bump ? Object3D.GetBump(tex) : Object3D.GetPigment(tex);
+ byte[] texdata = bump ? tex.bumpdata : tex.pigmentdata;
+
+ if (texname.equals("") && texdata == null)
+ {
+ return null;
+ }
String fallbackTextureName = defaultDirectory + "/Textures/" + texname;
@@ -8330,29 +8341,34 @@
// else
// if (!texname.startsWith("/"))
// texname = "/Users/nbriere/Textures/" + texname;
- if (!FileExists(tex))
+ if (!FileExists(texname))
{
texname = fallbackTextureName;
}
if (CACHETEXTURE)
{
- if (bim == null)
- texturecache = textures.get(texname); // TEXTURE CACHE
+ if (texdata == null)
+ texturecache = bump ? texturebump.get(tex) : texturepigment.get(tex);
else
- texturecache = bimtextures.get(bim); // TEXTURE CACHE
+ texturecache = bimtextures.get(texdata);
}
- if (texturecache == null || texturecache.resolution < resolution)
+ if (texturecache == null || texturecache.resolution != -1 && texturecache.resolution < resolution)
{
TextureData texturedata = null;
- if (bim != null)
+ if (texdata != null)
{
+ BufferedImage bim = //new BufferedImage(bump?tex.bw:tex.pw, bump?tex.bh:tex.ph, BufferedImage.TYPE_INT_RGB);
+
+ CreateBim(texdata, bump?tex.bw:tex.pw, bump?tex.bh:tex.ph);
+
texturecache = new CacheTexture(GetBimTexture(bim, bump), -1);
+ bimtextures.put(texdata, texturecache);
}
else
- if (tex.equals("DEFAULT_TEXTURE")) // ||*/ tex.equals(""))
+ if (texname.endsWith("DEFAULT_TEXTURE")) // ||*/ tex.equals(""))
{
assert(!bump);
// if (bump)
@@ -8363,7 +8379,7 @@
// }
// else
// {
- texturecache = textures.get(tex);
+ // texturecache = textures.get(texname); // suspicious
if (texturecache == null)
{
texturecache = new CacheTexture(GetResourceTexture("default.png", bump),resolution);
@@ -8372,10 +8388,10 @@
new Exception().printStackTrace();
// }
} else
- if (tex.equals("DEFAULT_TEXTURE_BUMP")) // ||*/ tex.equals(""))
+ if (texname.endsWith("DEFAULT_TEXTURE_BUMP")) // ||*/ tex.equals(""))
{
assert(bump);
- texturecache = textures.get(tex);
+ // texturecache = textures.get(texname); // suspicious
if (texturecache == null)
texturecache = new CacheTexture(GetResourceTexture("default.png", bump),resolution);
else
@@ -8387,9 +8403,9 @@
// texture = GetResourceTexture("default.png");
//} else
//{
- if (tex.equals("WHITE_NOISE"))
+ if (texname.endsWith("WHITE_NOISE"))
{
- texturecache = textures.get(tex);
+ // texturecache = textures.get(texname); // suspicious
if (texturecache == null)
texturecache = new CacheTexture(GetResourceTexture("whitenoise.png", bump),resolution);
else
@@ -8452,17 +8468,16 @@
if (texturedata == null)
throw new Exception();
- texturecache = new CacheTexture(com.sun.opengl.util.texture.TextureIO.newTexture(texturedata),resolution);
+ texturecache = new CacheTexture(texturedata,resolution);
//texture = GetTexture(tex, bump);
}
}
//}
}
- if (/*CACHETEXTURE &&*/ texturecache != null && textureon)
+ if (texdata == null && /*CACHETEXTURE &&*/ texturecache != null && textureon)
{
//return false;
- assert(bim == null);
// System.out.println("CACHE +++++++++++++++ TEXTURE : " + texname + " (" + texture.getEstimatedMemorySize() + ")");
if (texturedata != null && texname.toLowerCase().endsWith(".jpg"))
@@ -8509,18 +8524,20 @@
}
}
}
-
+
+ Hashtable<cTexture, CacheTexture> textures = bump ? texturebump : texturepigment;
+
//System.out.println("Texture = " + tex);
- if (textures.containsKey(texname))
+ if (textures.containsKey(tex))
{
- CacheTexture thetex = textures.get(texname);
+ CacheTexture thetex = textures.get(tex);
thetex.texture.disable();
thetex.texture.dispose();
- textures.remove(texname);
+ textures.remove(tex);
}
//texture.texturedata = texturedata;
- textures.put(texname, texturecache);
+ textures.put(tex, texturecache);
// newtex = true;
}
@@ -8541,12 +8558,38 @@
static void EmbedTextures(cTexture tex)
{
+ if (tex.pigmentdata == null)
+ {
+ String texname = Object3D.GetPigment(tex);
+
+ CacheTexture texturecache = texturepigment.get(tex);
+
+ if (texturecache != null)
+ {
+ tex.pigmentdata = ((ByteBuffer)texturecache.texturedata.getBuffer()).array();
+ tex.pw = texturecache.texturedata.getWidth();
+ tex.ph = texturecache.texturedata.getHeight();
+ }
+ }
+ if (tex.bumpdata == null)
+ {
+ String texname = Object3D.GetBump(tex);
+
+ CacheTexture texturecache = texturebump.get(tex);
+
+ if (texturecache != null)
+ {
+ tex.bumpdata = ((ByteBuffer)texturecache.texturedata.getBuffer()).array();
+ tex.bw = texturecache.texturedata.getWidth();
+ tex.bh = texturecache.texturedata.getHeight();
+ }
+ }
}
- com.sun.opengl.util.texture.Texture GetTexture(java.awt.image.BufferedImage stream, String tex, boolean bump, int resolution) throws Exception
+ com.sun.opengl.util.texture.Texture GetTexture(cTexture tex, boolean bump, int resolution) throws Exception
{
- CacheTexture texture = GetCacheTexture(stream, tex, bump, resolution);
+ CacheTexture texture = GetCacheTexture(tex, bump, resolution);
if (bump)
{
@@ -8562,14 +8605,14 @@
return texture!=null?texture.texture:null;
}
- public com.sun.opengl.util.texture.TextureData GetTextureData(java.awt.image.BufferedImage stream, String tex, boolean bump, int resolution) throws Exception
+ public com.sun.opengl.util.texture.TextureData GetTextureData(cTexture tex, boolean bump, int resolution) throws Exception
{
- CacheTexture texture = GetCacheTexture(stream, tex, bump, resolution);
+ CacheTexture texture = GetCacheTexture(tex, bump, resolution);
return texture!=null?texture.texturedata:null;
}
- boolean BindTexture(java.awt.image.BufferedImage stream, String tex, boolean bump, int resolution) throws Exception
+ boolean BindTexture(cTexture tex, boolean bump, int resolution) throws Exception
{
if (/*tex == null ||*/ ambientOcclusion ) // || !textureon)
{
@@ -8578,7 +8621,7 @@
//boolean newtex = false;
- com.sun.opengl.util.texture.Texture texture = GetTexture(stream, tex, bump, resolution);
+ com.sun.opengl.util.texture.Texture texture = GetTexture(tex, bump, resolution);
if (texture == null)
return false;
@@ -11065,7 +11108,7 @@
try
{
- BindTexture(null, NOISE_TEXTURE, false, 2);
+ BindTexture(NOISE_TEXTURE, false, 2);
}
catch (Exception e)
{
@@ -11721,20 +11764,32 @@
ReleaseTextures(DEFAULT_TEXTURES);
if (CLEANCACHE)
- for (java.util.Enumeration<String> e = textures.keys() ; e.hasMoreElements();)
+ for (java.util.Enumeration<cTexture> e = texturepigment.keys() ; e.hasMoreElements();)
{
- String tex = e.nextElement();
+ cTexture tex = e.nextElement();
// System.out.println("Texture --------- " + tex);
- if (tex.equals("WHITE_NOISE"))
+ if (tex.equals("WHITE_NOISE:"))
continue;
if (!usedtextures.contains(tex))
{
+ CacheTexture gettex = texturepigment.get(tex);
// System.out.println("DISPOSE +++++++++++++++ " + tex);
- textures.get(tex).texture.dispose();
- textures.remove(tex);
+ if (gettex != null)
+ {
+ gettex.texture.dispose();
+ texturepigment.remove(tex);
+ }
+
+ gettex = texturebump.get(tex);
+ // System.out.println("DISPOSE +++++++++++++++ " + tex);
+ if (gettex != null)
+ {
+ gettex.texture.dispose();
+ texturebump.remove(tex);
+ }
}
}
}
@@ -14927,7 +14982,8 @@
// break;
case 'T':
CACHETEXTURE ^= true;
- textures.clear();
+ texturepigment.clear();
+ texturebump.clear();
// repaint();
break;
case 'Y':
diff --git a/GroupEditor.java b/GroupEditor.java
index 0372f78..f4c7c39 100644
--- a/GroupEditor.java
+++ b/GroupEditor.java
@@ -528,10 +528,15 @@
attachBumpItem.addActionListener(this);
pigmentBumpItem = menu.add(new MenuItem("Pigment -> Bump"));
pigmentBumpItem.addActionListener(this);
+ //embedTexturesItem
detachPigmentItem = menu.add(new MenuItem("Detach Pigment"));
detachPigmentItem.addActionListener(this);
detachBumpItem = menu.add(new MenuItem("Detach Bump"));
detachBumpItem.addActionListener(this);
+ embedTexturesItem = menu.add(new MenuItem("Embed Textures"));
+ embedTexturesItem.addActionListener(this);
+ deEmbedTexturesItem = menu.add(new MenuItem("De-embed Textures"));
+ deEmbedTexturesItem.addActionListener(this);
menu.add("-");
sortbysizeItem = menu.add(new MenuItem("Sort by size"));
sortbysizeItem.addActionListener(this);
@@ -3169,6 +3174,31 @@
refreshContents();
} else
+ if (source == embedTexturesItem)
+ {
+ Object3D obj;
+ for (Enumeration e = group.selection.elements(); e.hasMoreElements();)
+ {
+ obj = (Object3D)e.nextElement();
+ obj.EmbedTextures(true);
+ }
+
+ refreshContents();
+ } else
+ if (source == deEmbedTexturesItem)
+ {
+ Object3D obj;
+ for (Enumeration e = group.selection.elements(); e.hasMoreElements();)
+ {
+ obj = (Object3D)e.nextElement();
+ obj.EmbedTextures(false);
+ }
+
+ CameraPane.texturepigment.clear();
+ CameraPane.texturebump.clear();
+
+ refreshContents();
+ } else
if (source == flashSelectionButton)
{
CameraPane.flash = true;
@@ -4163,7 +4193,7 @@
try
{
- texturedata = Globals.theRenderer.GetTextureData(tex.pigmenttexture, pigment, false, node.texres);
+ texturedata = Globals.theRenderer.GetTextureData(tex, false, node.texres);
}
catch (Exception e)
{
@@ -5793,6 +5823,8 @@
private MenuItem attachBumpItem;
private MenuItem detachBumpItem;
private MenuItem pigmentBumpItem;
+ private MenuItem embedTexturesItem;
+ private MenuItem deEmbedTexturesItem;
private MenuItem particleItem;
private MenuItem ragdollItem;
diff --git a/ObjEditor.java b/ObjEditor.java
index c6e6178..5b2dae6 100644
--- a/ObjEditor.java
+++ b/ObjEditor.java
@@ -5019,6 +5019,7 @@
//ps.print(buffer.toString());
} catch (IOException e)
{
+ e.printStackTrace();
}
}
diff --git a/Object3D.java b/Object3D.java
index 2ccc4c6..1b9b4c0 100644
--- a/Object3D.java
+++ b/Object3D.java
@@ -5775,12 +5775,23 @@
}
}
- void EmbedTextures()
+ void EmbedTextures(boolean embed)
{
if (blockloop)
return;
- CameraPane.EmbedTextures(texture);
+ //if (GetTextures() != null)
+ if (embed)
+ CameraPane.EmbedTextures(GetTextures());
+ else
+ {
+ GetTextures().pigmentdata = null;
+ GetTextures().bumpdata = null;
+ GetTextures().pw = 0;
+ GetTextures().ph = 0;
+ GetTextures().bw = 0;
+ GetTextures().bh = 0;
+ }
int nb = Size();
for (int i = 0; i < nb; i++)
@@ -5791,7 +5802,7 @@
continue;
blockloop = true;
- child.EmbedTextures();
+ child.EmbedTextures(embed);
blockloop = false;
}
}
diff --git a/cTexture.java b/cTexture.java
index a839d58..6c5d9f7 100644
--- a/cTexture.java
+++ b/cTexture.java
@@ -31,6 +31,10 @@
}
String name;
- BufferedImage pigmenttexture;
- BufferedImage bumptexture;
+
+ int pw, ph;
+ byte[] pigmentdata;
+
+ int bw, bh;
+ byte[] bumpdata;
}
diff --git a/iCameraPane.java b/iCameraPane.java
index d404e84..6f9063a 100644
--- a/iCameraPane.java
+++ b/iCameraPane.java
@@ -86,7 +86,7 @@
void setCursor(java.awt.Cursor cursor);
- com.sun.opengl.util.texture.TextureData GetTextureData(java.awt.image.BufferedImage stream, String tex, boolean bump, int resolution) throws Exception;
+ com.sun.opengl.util.texture.TextureData GetTextureData(cTexture tex, boolean bump, int resolution) throws Exception;
void repaint();
--
Gitblit v1.6.2