From d32f24f147068e6cbecb31c7f98047f68bc8b58a Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Sun, 21 Jul 2019 19:03:28 -0400
Subject: [PATCH] Embed texture.

---
 CameraPane.java |  533 ++++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 327 insertions(+), 206 deletions(-)

diff --git a/CameraPane.java b/CameraPane.java
index 0f77a95..acc49b8 100644
--- a/CameraPane.java
+++ b/CameraPane.java
@@ -60,7 +60,7 @@
     //boolean REDUCETEXTURE = true;
     boolean CACHETEXTURE = true;
     boolean CLEANCACHE = false; // true;
-    boolean MIPMAP = false; // true;
+    boolean MIPMAP = true; // false; // true;
     boolean COMPRESSTEXTURE = false;
     boolean KOMPACTTEXTURE = false; // true;
     boolean RESIZETEXTURE = false;
@@ -2065,7 +2065,7 @@
             //System.err.println("Oeil on");
             OEIL = true;
             if ((TRACK || SHADOWTRACK) && trackedobject != null && DrawMode() == SHADOW) // && !lightMode)
-                object.editWindow.ScreenFit(trackedobject, SHADOWTRACK && !TRACK);
+                object.GetWindow().ScreenFit(trackedobject, SHADOWTRACK && !TRACK);
             //pingthread.StepToTarget(true);
         }
         
@@ -2298,10 +2298,17 @@
         HANDLES ^= true;
     }
 
+    Object3D paintFolder;
+    
     void TogglePaint()
     {
         PAINTMODE ^= true;
         paintcount = 0;
+        
+        if (PAINTMODE)
+        {
+            paintFolder = GetFolder();
+        }
     }
 
     void SwapCamera(int a, int b)
@@ -2398,6 +2405,45 @@
         return currentGL;
     }
 
+    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;
+    }
+
     /**/
     class CacheTexture
     {
@@ -2415,9 +2461,10 @@
     /**/
     
 // TEXTURE	static Texture texture;
-    static public java.util.Hashtable<String, CacheTexture/*com.sun.opengl.util.texture.Texture*/> textures
-            = new java.util.Hashtable<String, CacheTexture/*com.sun.opengl.util.texture.Texture*/>();
-    static public java.util.Hashtable<String, String> usedtextures = new java.util.Hashtable<String, String>();
+    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>();
+    
     int pigmentdepth = 0;
     public com.sun.opengl.util.texture.Texture[] pigmentstack = new com.sun.opengl.util.texture.Texture[65536];
     int bumpdepth = 0;
@@ -2439,6 +2486,33 @@
                     true,
                     com.sun.opengl.util.texture.TextureIO.PNG);
         } catch (java.io.IOException e)
+        {
+            throw new javax.media.opengl.GLException(e);
+        }
+
+        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;
+    }
+    
+    com.sun.opengl.util.texture.Texture GetBimTexture(BufferedImage name, boolean bump)
+    {
+        TextureData texturedata = null;
+
+        try
+        {
+            texturedata =
+                    com.sun.opengl.util.texture.TextureIO.newTextureData(
+                    name,
+                    true);
+        } catch (Exception e)
         {
             throw new javax.media.opengl.GLException(e);
         }
@@ -3525,6 +3599,8 @@
 
             System.out.println("LOADING TEXTURE : " + name);
 
+            Object x = texturedata.getMipmapData(); // .getBuffer();
+            
         // 
         if (false) // compressbit > 0)
         {
@@ -7923,7 +7999,7 @@
         String pigment = Object3D.GetPigment(tex);
         String bump = Object3D.GetBump(tex);
 
-        if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
+        //if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
         {
         //    System.out.print("RELEASE  +++++++++++++++  pigment = " + pigment);
         //    System.out.println("; bump = " + bump);
@@ -7957,7 +8033,7 @@
         
         String pigment = Object3D.GetPigment(tex);
 
-        if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
+        //if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
         {
         //    System.out.print("RELEASE  +++++++++++++++  pigment = " + pigment);
         //    System.out.println("; bump = " + bump);
@@ -7986,7 +8062,7 @@
         
         String bump = Object3D.GetBump(tex);
 
-        if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
+        //if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
         {
         //    System.out.print("RELEASE  +++++++++++++++  pigment = " + pigment);
         //    System.out.println("; bump = " + bump);
@@ -8105,47 +8181,50 @@
 
     /*boolean*/ public void BindTextures(cTexture tex, int resolution) throws Exception // INTERFACE
     {
-        if (// DrawMode() != 0 || /*tex == null ||*/
-                ambientOcclusion ) // || !textureon)
-        {
-            return; // false;
-        }
-
-        if (tex == null)
-        {
-            BindTexture(null,false,resolution);
-            BindTexture(null,true,resolution);
-            return;
-        }
+//        if (// DrawMode() != 0 || /*tex == null ||*/
+//                ambientOcclusion ) // || !textureon)
+//        {
+//            return; // false;
+//        }
+//
+//        if (tex == null)
+//        {
+//            BindTexture(null,false,resolution);
+//            BindTexture(null,true,resolution);
+//            return;
+//        }
+//        
+//        String pigment = Object3D.GetPigment(tex);
+//        String bump = Object3D.GetBump(tex);
+//
+//        usedtextures.add(pigment);
+//        usedtextures.add(bump);
+//        
+//        //if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
+//        {
+//        //    System.out.print("BIND  +++++++++++++++  pigment = " + pigment);
+//        //    System.out.println("; bump = " + bump);
+//        }
+//        
+//        if (bump.equals(""))
+//        {
+//            bump = null;
+//        }
+//        if (pigment.equals(""))
+//        {
+//            pigment = null;
+//        }
+//        
+//        GetGL().glActiveTexture(GetGL().GL_TEXTURE0);
+//        BindTexture(pigment, false, resolution);
+//        GetGL().glActiveTexture(GetGL().GL_TEXTURE2);
+//        BindTexture(bump, true, resolution);
+//        GetGL().glActiveTexture(GetGL().GL_TEXTURE0);
+//            
+//        return; // true;
         
-        String pigment = Object3D.GetPigment(tex);
-        String bump = Object3D.GetBump(tex);
-
-        usedtextures.put(pigment, pigment);
-        usedtextures.put(bump, bump);
-        
-        if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
-        {
-        //    System.out.print("BIND  +++++++++++++++  pigment = " + pigment);
-        //    System.out.println("; bump = " + bump);
-        }
-        
-        if (bump.equals(""))
-        {
-            bump = null;
-        }
-        if (pigment.equals(""))
-        {
-            pigment = null;
-        }
-        
-        GetGL().glActiveTexture(GetGL().GL_TEXTURE0);
-        BindTexture(pigment, false, resolution);
-        GetGL().glActiveTexture(GetGL().GL_TEXTURE2);
-        BindTexture(bump, true, resolution);
-        GetGL().glActiveTexture(GetGL().GL_TEXTURE0);
-            
-        return; // true;
+        BindPigmentTexture(tex, resolution);
+        BindBumpTexture(tex, resolution);
     }
     
     /*boolean*/ public void BindPigmentTexture(cTexture tex, int resolution) throws Exception // INTERFACE
@@ -8158,15 +8237,15 @@
 
         if (tex == null)
         {
-            BindTexture(null,false,resolution);
+            BindTexture(null, null,false,resolution);
             return;
         }
         
         String pigment = Object3D.GetPigment(tex);
 
-        usedtextures.put(pigment, pigment);
+        usedtextures.add(pigment);
         
-        if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
+        //if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
         {
         //    System.out.print("BIND  +++++++++++++++  pigment = " + pigment);
         //    System.out.println("; bump = " + bump);
@@ -8178,7 +8257,7 @@
         }
         
         GetGL().glActiveTexture(GetGL().GL_TEXTURE0);
-        BindTexture(pigment, false, resolution);
+        BindTexture(tex.pigmenttexture, pigment, false, resolution);
     }
     
     /*boolean*/ public void BindBumpTexture(cTexture tex, int resolution) throws Exception // INTERFACE
@@ -8191,15 +8270,15 @@
 
         if (tex == null)
         {
-            BindTexture(null,true,resolution);
+            BindTexture(null, null,true,resolution);
             return;
         }
         
         String bump = Object3D.GetBump(tex);
 
-        usedtextures.put(bump, bump);
+        usedtextures.add(bump);
         
-        if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
+        //if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
         {
         //    System.out.print("BIND  +++++++++++++++  pigment = " + pigment);
         //    System.out.println("; bump = " + bump);
@@ -8211,7 +8290,7 @@
         }
         
         GetGL().glActiveTexture(GetGL().GL_TEXTURE2);
-        BindTexture(bump, true, resolution);
+        BindTexture(tex.bumptexture, bump, true, resolution);
         GetGL().glActiveTexture(GetGL().GL_TEXTURE0);
     }
     
@@ -8235,9 +8314,9 @@
         return fileExists;
     }
     
-    CacheTexture GetCacheTexture(String tex, boolean bump, int resolution) throws Exception
+    CacheTexture GetCacheTexture(java.awt.image.BufferedImage bim, String tex, boolean bump, int resolution) throws Exception
     {
-        CacheTexture/*com.sun.opengl.util.texture.Texture*/ texture = null;
+        CacheTexture texturecache = null;
         
         if (tex != null)
         {
@@ -8257,12 +8336,22 @@
             }
             
             if (CACHETEXTURE)
-                texture = textures.get(texname); // TEXTURE CACHE
-
-            TextureData texturedata = null;
-            
-            if (texture == null || texture.resolution < resolution)
             {
+                if (bim == null)
+                    texturecache = textures.get(texname); // TEXTURE CACHE
+                else
+                    texturecache = bimtextures.get(bim); // TEXTURE CACHE
+            }
+
+            if (texturecache == null || texturecache.resolution < resolution)
+            {
+                TextureData texturedata = null;
+            
+                if (bim != null)
+                {
+                    texturecache = new CacheTexture(GetBimTexture(bim, bump), -1);
+                }
+                else
                 if (tex.equals("DEFAULT_TEXTURE")) // ||*/ tex.equals(""))
                 {
                     assert(!bump);
@@ -8274,19 +8363,23 @@
 //                    }
 //                    else
 //                    {
-                        texture = textures.get(tex);
-                        if (texture == null)
+                        texturecache = textures.get(tex);
+                        if (texturecache == null)
                         {
-                            texture = new CacheTexture(GetResourceTexture("default.png", bump),resolution);
+                            texturecache = new CacheTexture(GetResourceTexture("default.png", bump),resolution);
                         }
+                        else
+                            new Exception().printStackTrace();
 //                    }
                 } else
                 if (tex.equals("DEFAULT_TEXTURE_BUMP")) // ||*/ tex.equals(""))
                 {
                     assert(bump);
-                    texture = textures.get(tex);
-                    if (texture == null)
-                        texture = new CacheTexture(GetResourceTexture("default.png", bump),resolution);
+                    texturecache = textures.get(tex);
+                    if (texturecache == null)
+                        texturecache = new CacheTexture(GetResourceTexture("default.png", bump),resolution);
+                    else
+                        new Exception().printStackTrace();
                 } else
                 {
                     //if (tex.equals("IMMORTAL"))
@@ -8296,9 +8389,11 @@
                     //{
                         if (tex.equals("WHITE_NOISE"))
                         {
-                            texture = textures.get(tex);
-                            if (texture == null)
-                                texture = new CacheTexture(GetResourceTexture("whitenoise.png", bump),resolution);
+                            texturecache = textures.get(tex);
+                            if (texturecache == null)
+                                texturecache = new CacheTexture(GetResourceTexture("whitenoise.png", bump),resolution);
+                            else
+                                new Exception().printStackTrace();
                         } else
                         {
                             if (textureon)
@@ -8357,19 +8452,20 @@
                                 if (texturedata == null)
                                     throw new Exception();
                                     
-                                    texture = new CacheTexture(com.sun.opengl.util.texture.TextureIO.newTexture(texturedata),resolution);
+                                    texturecache = new CacheTexture(com.sun.opengl.util.texture.TextureIO.newTexture(texturedata),resolution);
         //texture = GetTexture(tex, bump);
                             }
                         }
                     //}
                 }
 
-                if (/*CACHETEXTURE &&*/ texture != null && textureon)
+                if (/*CACHETEXTURE &&*/ texturecache != null && textureon)
                 {
                     //return false;
+                    assert(bim == null);
 
              //       System.out.println("CACHE  +++++++++++++++  TEXTURE : " + texname + " (" + texture.getEstimatedMemorySize() + ")");
-                    if (texturedata != null && (texname.endsWith(".jpg") || texname.endsWith(".JPG")))
+                    if (texturedata != null && texname.toLowerCase().endsWith(".jpg"))
                     {
 //                        String ext = "_highres";
 //                        if (REDUCETEXTURE)
@@ -8386,52 +8482,17 @@
                         File cachefile = new File(texname.substring(0, texname.length()-4)+ext+".jpg");
                         if (!cachefile.exists())
                         {
-                            // cache to disk
-                            Buffer buffer = texturedata.getBuffer(); // getMipmapData();
-                        //buffers[0].
-
-                            ByteBuffer bytebuf = (ByteBuffer)buffer; // ).asIntBuffer();
-                            int[] pixels = new int[bytebuf.capacity()/3];
-                            
-                            // squared size heuristic...
-                            if ((int)Math.sqrt(pixels.length) == Math.sqrt(pixels.length))
+                            //if (texturedata.getWidth() == texturedata.getHeight())
                             {
-                                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;
-                }
-                /**/
-                                int width = (int)Math.sqrt(pixels.length); // squared
-                                int height = width;
-                                BufferedImage rendImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // ImageIO.read(infile);
-                                rendImage.setRGB(0,0,width,height,pixels,width*(height-1),-width);
+                                BufferedImage rendImage = CreateBim(texturedata);
+                                
                                 ImageWriter writer = null;
                                 Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
                                 if (iter.hasNext()) {
                                     writer = (ImageWriter)iter.next();
                                 }
-                                float compressionQuality = 0.9f;
+                                
+                                float compressionQuality = 0.85f;
                                 try
                                 {
                                     ImageOutputStream ios = ImageIO.createImageOutputStream(cachefile);
@@ -8458,8 +8519,8 @@
                         textures.remove(texname);
                     }
                     
-                    texture.texturedata = texturedata;
-                    textures.put(texname, texture);
+                    //texture.texturedata = texturedata;
+                    textures.put(texname, texturecache);
 
            //         newtex = true;
                 }
@@ -8475,12 +8536,17 @@
             }
         }
         
-        return texture;
+        return texturecache;
     }
     
-    com.sun.opengl.util.texture.Texture GetTexture(String tex, boolean bump, int resolution) throws Exception
+    static void EmbedTextures(cTexture tex)
     {
-        CacheTexture texture = GetCacheTexture(tex, bump, resolution);
+        
+    }
+    
+    com.sun.opengl.util.texture.Texture GetTexture(java.awt.image.BufferedImage stream, String tex, boolean bump, int resolution) throws Exception
+    {
+        CacheTexture texture = GetCacheTexture(stream, tex, bump, resolution);
                 
         if (bump)
         {
@@ -8496,23 +8562,23 @@
         return texture!=null?texture.texture:null;
     }
     
-    public com.sun.opengl.util.texture.TextureData GetTextureData(String tex, boolean bump, int resolution) throws Exception
+    public com.sun.opengl.util.texture.TextureData GetTextureData(java.awt.image.BufferedImage stream, String tex, boolean bump, int resolution) throws Exception
     {
-        CacheTexture texture = GetCacheTexture(tex, bump, resolution);
+        CacheTexture texture = GetCacheTexture(stream, tex, bump, resolution);
                 
         return texture!=null?texture.texturedata:null;
     }
     
-    boolean BindTexture(String tex, boolean bump, int resolution) throws Exception
+    boolean BindTexture(java.awt.image.BufferedImage stream, String tex, boolean bump, int resolution) throws Exception
     {
         if (/*tex == null ||*/ ambientOcclusion ) // || !textureon)
         {
             return false;
         }
 
-        boolean newtex = false;
+        //boolean newtex = false;
 
-        com.sun.opengl.util.texture.Texture texture = GetTexture(tex, bump, resolution);
+        com.sun.opengl.util.texture.Texture texture = GetTexture(stream, tex, bump, resolution);
 
         if (texture == null)
             return false;
@@ -8542,7 +8608,7 @@
         texture.setTexParameteri(GetGL().GL_TEXTURE_WRAP_S, GetGL().GL_REPEAT);
         texture.setTexParameteri(GetGL().GL_TEXTURE_WRAP_T, GetGL().GL_REPEAT);
         
-        return newtex;
+        return true; // Warning: not used.
     }
     
     ShadowBuffer shadowPBuf;
@@ -10999,7 +11065,7 @@
             
     try
     {
-        BindTexture(NOISE_TEXTURE, false, 2);
+        BindTexture(null, NOISE_TEXTURE, false, 2);
     }
     catch (Exception e)
     {
@@ -11028,9 +11094,9 @@
 
             gl.glMatrixMode(GL.GL_MODELVIEW);
 
-//gl.glHint(gl.GL_POLYGON_SMOOTH_HINT, gl.GL_NICEST);
-//gl.glEnable(gl.GL_POLYGON_SMOOTH);
-//gl.glEnable(gl.GL_MULTISAMPLE);
+gl.glEnable(gl.GL_POLYGON_SMOOTH);
+gl.glHint(gl.GL_POLYGON_SMOOTH_HINT, gl.GL_NICEST);
+gl.glEnable(gl.GL_MULTISAMPLE);
         } else
         {
             //gl.glDisable(GL.GL_TEXTURE_2D);
@@ -11041,7 +11107,7 @@
         //System.out.println("BLENDING ON");
         gl.glEnable(GL.GL_BLEND);
         gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
-
+//        gl.glBlendFunc(GL.GL_SRC_ALPHA_SATURATE, GL.GL_ONE);
         gl.glMatrixMode(gl.GL_PROJECTION);
         gl.glLoadIdentity();
 
@@ -11527,7 +11593,7 @@
         if ((TRACK || SHADOWTRACK) || zoomonce)
         {
             if ((TRACK || SHADOWTRACK) && trackedobject != null && DrawMode() == SHADOW) // && !lightMode)
-                object.editWindow.ScreenFit(trackedobject, SHADOWTRACK && !TRACK);
+                object.GetWindow().ScreenFit(trackedobject, SHADOWTRACK && !TRACK);
             pingthread.StepToTarget(true); // true);
        //     zoomonce = false;
         }
@@ -11664,7 +11730,7 @@
                     if (tex.equals("WHITE_NOISE"))
                         continue;
 
-                    if (!usedtextures.containsKey(tex))
+                    if (!usedtextures.contains(tex))
                     {
                //         System.out.println("DISPOSE  +++++++++++++++  " + tex);
                         textures.get(tex).texture.dispose();
@@ -13943,7 +14009,7 @@
             
 // fev 2014???
             if ((TRACK || SHADOWTRACK) && trackedobject != null) // && DrawMode() == SHADOW) // && !lightMode)
-                object.editWindow.ScreenFit(trackedobject, SHADOWTRACK && !TRACK);
+                object.GetWindow().ScreenFit(trackedobject, SHADOWTRACK && !TRACK);
             pingthread.StepToTarget(true); // true);
         }
     //    if (!LIVE)
@@ -14297,12 +14363,12 @@
     void GoDown(int mod)
     {
         MODIFIERS |= COMMAND;
-        /*
+        /**/
         if((mod&SHIFT) == SHIFT)
         manipCamera.RotatePosition(0, -speed);
         else
-        manipCamera.BackForth(0, -speed*delta, getWidth());
-         */
+        manipCamera.BackForth(0, -speed*delta, 0); // getWidth());
+        /**/
         if ((mod & SHIFT) == SHIFT)
         {
             mouseMode = mouseMode; // VR??
@@ -14318,12 +14384,12 @@
     void GoUp(int mod)
     {
         MODIFIERS |= COMMAND;
-        /*
+        /**/
         if((mod&SHIFT) == SHIFT)
         manipCamera.RotatePosition(0, speed);
         else
-        manipCamera.BackForth(0, speed*delta, getWidth());
-         */
+        manipCamera.BackForth(0, speed*delta, 0); // getWidth());
+        /**/
         if ((mod & SHIFT) == SHIFT)
         {
             mouseMode = mouseMode;
@@ -14339,12 +14405,12 @@
     void GoLeft(int mod)
     {
         MODIFIERS |= COMMAND;
-        /*
+        /**/
         if((mod&SHIFT) == SHIFT)
-        manipCamera.RotatePosition(speed, 0);
-        else
         manipCamera.Translate(speed*delta, 0, getWidth());
-         */
+        else
+        manipCamera.RotatePosition(speed, 0);
+        /**/
         if ((mod & SHIFT) == SHIFT)
         {
             mouseMode = mouseMode;
@@ -14360,12 +14426,12 @@
     void GoRight(int mod)
     {
         MODIFIERS |= COMMAND;
-        /*
+        /**/
         if((mod&SHIFT) == SHIFT)
-        manipCamera.RotatePosition(-speed, 0);
-        else
         manipCamera.Translate(-speed*delta, 0, getWidth());
-         */
+        else
+        manipCamera.RotatePosition(-speed, 0);
+        /**/
         if ((mod & SHIFT) == SHIFT)
         {
             mouseMode = mouseMode;
@@ -14604,7 +14670,8 @@
         Globals.MOUSEDRAGGED = false;
         
         movingcamera = false;
-        X = Y = 0;
+        X = 0; // getBounds().width/2;
+        Y = 0; // getBounds().height/2;
         //System.out.println("mouseReleased: " + e);
         clickEnd(e.getX(), e.getY(), e.getModifiersEx());
     }
@@ -14945,7 +15012,9 @@
             case 'E' : COMPACT ^= true;
                 repaint();
                 break;
-            case 'W' : DEBUGHSB ^= true;
+            case 'W' : // Wide Window (fullscreen)
+                //DEBUGHSB ^= true;
+                ObjEditor.theFrame.ToggleFullScreen();
                 repaint();
                 break;
             case 'u' : Udebug ^= true; Vdebug = false; NORMALdebug = false; programInitialized = false; repaint(); break;
@@ -14971,13 +15040,7 @@
                 repaint();
                 break;
             case 'l':
-                lightMode ^= true;
-                Globals.lighttouched = true;
-                manipCamera = renderCamera = lightMode ? lightCamera : eyeCamera;
-                targetLookAt.set(manipCamera.lookAt);
-                repaint();
-                break;
-            case 'L':
+            //case 'L':
                 if (lightMode)
                 {
                     lightMode = false;
@@ -15124,7 +15187,10 @@
 //                kompactbit = 6;
 //                break;
             case ' ':
-                ObjEditor.theFrame.ToggleFullScreen();
+                lightMode ^= true;
+                Globals.lighttouched = true;
+                manipCamera = renderCamera = lightMode ? lightCamera : eyeCamera;
+                targetLookAt.set(manipCamera.lookAt);
                 repaint();
                 break;
             //case '`' :
@@ -15172,6 +15238,7 @@
                 ClearSelection();
                 break;
             case '+':
+                
                 /*
                 //fontsize += 1;
                 bbzoom *= 2;
@@ -15189,17 +15256,17 @@
             case '=':
                 IncDepth();
                 //fontsize += 1;
-                object.editWindow.refreshContents(true);
+                object.GetWindow().refreshContents(true);
                 maskbit = 6;
                 break;
             case '-': //if (PixelThreshold>1) PixelThreshold /= 2;
                 DecDepth();
                 maskbit = 5;
                 //if(fontsize > 1) fontsize -= 1;
-                if (object.editWindow == null)
-                    new Exception().printStackTrace();
-                else
-                    object.editWindow.refreshContents(true);
+//                if (object.editWindow == null)
+//                    new Exception().printStackTrace();
+//                else
+                    object.GetWindow().refreshContents(true);
                 break;
             case '{':
                 manipCamera.shaper_fovy /= 1.1;
@@ -15423,7 +15490,7 @@
         }
          */
 
-        object.editWindow.EditSelection(false);
+        object.GetWindow().EditSelection(false);
     }
 
     void SelectParent()
@@ -15440,10 +15507,10 @@
             {
                 //selectees.remove(i);
                 System.out.println("select parent of " + elem);
-                group.editWindow.Select(elem.parent.GetTreePath(), first, true);
+                group.GetWindow().Select(elem.parent.GetTreePath(), first, true);
             } else
             {
-                group.editWindow.Select(elem.GetTreePath(), first, true);
+                group.GetWindow().Select(elem.GetTreePath(), first, true);
             }
 
             first = false;
@@ -15485,12 +15552,12 @@
                 for (int j = 0; j < group.children.size(); j++)
                 {
                     elem = (Object3D) group.children.elementAt(j);
-                    object.editWindow.Select(elem.GetTreePath(), first, true);
+                    object.GetWindow().Select(elem.GetTreePath(), first, true);
                     first = false;
                 }
             } else
             {
-                object.editWindow.Select(elem.GetTreePath(), first, true);
+                object.GetWindow().Select(elem.GetTreePath(), first, true);
             }
 
             first = false;
@@ -15501,21 +15568,21 @@
     {
         //Composite group = (Composite) object;
         Object3D group = object;
-        group.editWindow.loadClipboard(true); // ClearSelection(false);
+        group.GetWindow().loadClipboard(true); // ClearSelection(false);
     }
 
     void ResetTransform(int mask)
     {
         //Composite group = (Composite) object;
         Object3D group = object;
-        group.editWindow.ResetTransform(mask);
+        group.GetWindow().ResetTransform(mask);
     }
 
     void FlipTransform()
     {
         //Composite group = (Composite) object;
         Object3D group = object;
-        group.editWindow.FlipTransform();
+        group.GetWindow().FlipTransform();
 //        group.editWindow.ReduceMesh(true);
     }
 
@@ -15523,7 +15590,7 @@
     {
         //Composite group = (Composite) object;
         Object3D group = object;
-        group.editWindow.PrintMemory();
+        group.GetWindow().PrintMemory();
 //        group.editWindow.ReduceMesh(true);
     }
     
@@ -15531,7 +15598,7 @@
     {
         //Composite group = (Composite) object;
         Object3D group = object;
-        group.editWindow.ResetCentroid();
+        group.GetWindow().ResetCentroid();
     }
 
     void IncDepth()
@@ -15707,6 +15774,7 @@
                     info.bounds.y += (height - desired) / 2;
                 }
             }
+            
             info.g = gr;
             info.camera = renderCamera;
             /* 
@@ -15716,23 +15784,44 @@
              */
             if (!isRenderer)
             {
-                object.drawEditHandles(info, 0);
-                
-                if (drag && (X != 0 || Y != 0) && object.selection.Size() > 0)
+                Grafreed.Assert(object != null);
+                Grafreed.Assert(object.selection != null);
+                if (object.selection.Size() > 0)
                 {
-                    switch (object.selection.get(0).hitSomething)
+                    int hitSomething = object.selection.get(0).hitSomething;
+
+                    info.DX = 0;
+                    info.DY = 0;
+                    info.W = 1;
+                    if (hitSomething == Object3D.hitCenter)
                     {
-                        case Object3D.hitCenter: gr.setColor(Color.pink);
-                            gr.drawLine(X, Y, info.bounds.width/2, info.bounds.height/2);
-                            break;
-                        case Object3D.hitRotate: gr.setColor(Color.yellow);
-                            gr.drawLine(X, Y, info.bounds.width/2, info.bounds.height/2);
-                        break;
-                        case Object3D.hitScale: gr.setColor(Color.cyan);
-                            gr.drawLine(X, Y, info.bounds.width/2, info.bounds.height/2);
-                        break;
+                        info.DX = X;
+                        if (X != 0)
+                            info.DX -= info.bounds.width/2;
+
+                        info.DY = Y;
+                        if (Y != 0)
+                            info.DY -= info.bounds.height/2;
                     }
-                    
+
+                    object.drawEditHandles(info, 0);
+
+                    if (drag && (X != 0 || Y != 0))
+                    {
+                        switch (hitSomething)
+                        {
+                            case Object3D.hitCenter: gr.setColor(Color.pink);
+                                gr.drawLine(X, Y, info.bounds.width/2, info.bounds.height/2);
+                                break;
+                            case Object3D.hitRotate: gr.setColor(Color.yellow);
+                                gr.drawLine(X, Y, info.bounds.width/2, info.bounds.height/2);
+                            break;
+                            case Object3D.hitScale: gr.setColor(Color.cyan);
+                                gr.drawLine(X, Y, info.bounds.width/2, info.bounds.height/2);
+                            break;
+                        }
+
+                    }
                 }
             }
         }
@@ -16530,6 +16619,14 @@
         }
     }
     
+    private Object3D GetFolder()
+    {
+        Object3D folder = object.GetWindow().copy;
+        if (object.GetWindow().copy.selection.Size() > 0)
+            folder = object.GetWindow().copy.selection.elementAt(0);
+        return folder;
+    }
+
     class SelectBuffer implements GLEventListener
     {
 
@@ -16609,6 +16706,17 @@
 
             //gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
 
+                if (PAINTMODE)
+                {
+                    if (object.GetWindow().copy.selection.Size() > 0)
+                    {
+                        Object3D paintobj = object.GetWindow().copy.selection.elementAt(0);
+
+                        // Make what you paint not selectable.
+                        paintobj.ResetSelectable();
+                    }
+                }
+                
             //int tmp = selection_view;
             //selection_view = -1;
             int temp = DrawMode();
@@ -16620,6 +16728,17 @@
             //    temp = DEFAULT; // patch for selection debug
             Globals.drawMode = temp; // WARNING
 
+                if (PAINTMODE)
+                {
+                    if (object.GetWindow().copy.selection.Size() > 0)
+                    {
+                        Object3D paintobj = object.GetWindow().copy.selection.elementAt(0);
+
+                        // Revert.
+                        paintobj.RestoreSelectable();
+                    }
+                }
+                
             //gl.glBindTexture(GL.GL_TEXTURE_2D, selection_view);
 
             // trying different ways of getting the depth info over
@@ -16723,29 +16842,31 @@
                 }
                 
                 if (!movingcamera && !PAINTMODE)
-                    object.editWindow.ScreenFitPoint(); // fev 2014
+                    object.GetWindow().ScreenFitPoint(); // fev 2014
                 
-                if (PAINTMODE && Grafreed.clipboard.size() == 1) // object.editWindow.copy.selection.Size() > 0)
+                if (PAINTMODE) // && Grafreed.clipboard.size() == 1) // object.editWindow.copy.selection.Size() > 0)
                 {
-                    Object3D paintobj = Grafreed.clipboard.get(0); // object.editWindow.copy.selection.elementAt(0);
+                    //Object3D paintobj; // = Grafreed.clipboard.get(0); // object.editWindow.copy.selection.elementAt(0);
                     
-                    Object3D group = new Object3D("inst" + paintcount++);
+                    if (object.GetWindow().copy.selection.Size() > 0)
+                    {
+                        Object3D paintobj = object.GetWindow().copy.selection.elementAt(0);
                     
-                    group.CreateMaterial(); // use a void leaf to select instances
-                    
-                    group.add(paintobj); // link
-                    
-                    object.editWindow.SnapObject(group);
-                    
-                    Object3D folder = object.editWindow.copy;
-                    
-                    if (object.editWindow.copy.selection.Size() > 0)
-                        folder = object.editWindow.copy.selection.elementAt(0);
-                    
-                    folder.add(group);
-                    
-                    object.editWindow.ResetModel();
-                    object.editWindow.refreshContents();
+                        Object3D inst = new Object3D("inst" + paintcount++);
+
+                        inst.CreateMaterial(); // use a void leaf to select instances
+
+                        inst.add(paintobj); // link
+
+                        object.GetWindow().SnapObject(inst);
+
+                        Object3D folder = paintFolder; // GetFolder();
+
+                        folder.add(inst);
+
+                        object.GetWindow().ResetModel();
+                        object.GetWindow().refreshContents();
+                    }
                 }
                 else
                     paintcount = 0;

--
Gitblit v1.6.2