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