From c67da2e5d8655704601d6d06e8bc60aabe212253 Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Sun, 23 Jun 2019 21:49:12 -0400
Subject: [PATCH] Compute shadow when live option.

---
 CameraPane.java |  323 ++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 254 insertions(+), 69 deletions(-)

diff --git a/CameraPane.java b/CameraPane.java
index 16d28d9..7afdef6 100644
--- a/CameraPane.java
+++ b/CameraPane.java
@@ -37,7 +37,6 @@
     static boolean[] selectedstack = new boolean[65536];
     static int materialdepth = 0;
 
-    static boolean DEBUG = false;
     static boolean FRUSTUM = false; // still bogus true; // frustum culling
 
     // camera change fix
@@ -149,6 +148,8 @@
         defaultcaps.setAccumBlueBits(16);
         defaultcaps.setAccumAlphaBits(16);
     }
+    
+    private File defaultDirectory = javax.swing.filechooser.FileSystemView.getFileSystemView().getDefaultDirectory();
     
     void SetAsGLRenderer(boolean b)
     {
@@ -325,7 +326,7 @@
                 cStatic.objectstack[materialdepth++] = obj;
                 //System.out.println("material " + material);
                 //Applet3D.tracein(this, selected);
-                display.vector2buffer = obj.projectedVertices;
+                //display.vector2buffer = obj.projectedVertices;
                 if (obj instanceof Camera)
                 {
                     display.options1[0] = material.shift;
@@ -357,7 +358,7 @@
                 /**/
                 } else
                 {
-                    DrawMaterial(material, selected);
+                    DrawMaterial(material, selected, obj.projectedVertices);
                 }
             } else
             {
@@ -381,8 +382,8 @@
             cStatic.objectstack[materialdepth++] = obj;
             //System.out.println("material " + material);
             //Applet3D.tracein("selected ", selected);
-            display.vector2buffer = obj.projectedVertices;
-            display.DrawMaterial(material, selected);
+            //display.vector2buffer = obj.projectedVertices;
+            display.DrawMaterial(material, selected, obj.projectedVertices);
         }
     }
     
@@ -399,8 +400,8 @@
                 materialdepth -= 1;
                 if (materialdepth > 0)
                 {
-                    display.vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
-                    display.DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1]);
+                    //display.vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
+                    display.DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1], cStatic.objectstack[materialdepth - 1].projectedVertices);
                 }
             //Applet3D.traceout("selected ", (stackdepth>0)?selectedstack[stackdepth-1]:"???");
             } else if (selected && CameraPane.flash && obj.GetMaterial() != null)
@@ -420,8 +421,8 @@
             materialdepth -= 1;
             if (materialdepth > 0)
             {
-                display.vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
-                display.DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1]);
+                //display.vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
+                display.DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1], cStatic.objectstack[materialdepth - 1].projectedVertices);
             }
         //Applet3D.traceout("selected ", (stackdepth>0)?selectedstack[stackdepth-1]:"???");
         //else
@@ -462,10 +463,12 @@
         if (!selectmode) // display.drawMode != display.SELECTION) // && display.drawMode != display.SHADOW) // (attributes & FILL) != 0)
         {
             //gl.glBegin(gl.GL_TRIANGLES);
-            boolean hasnorm = pv.norm != null; // && (pv.norm.x != 0 || pv.norm.y != 0 || pv.norm.z != 0);
+            boolean hasnorm = pv.norm != null && (pv.norm.x != 0 || pv.norm.y != 0 || pv.norm.z != 0)
+                    // TEST LIVE NORMALS && !obj.dontselect
+                    ;
             if (!hasnorm)
             {
-           //     System.out.println("FUCK!!");
+           //     System.out.println("Mesh normal");
                 LA.vecSub(pv/*.pos*/, qv/*.pos*/, obj.v0);
                 LA.vecSub(pv/*.pos*/, rv/*.pos*/, obj.v1);
                 LA.vecCross(obj.v0, obj.v1, obj.v2);
@@ -1190,10 +1193,12 @@
                                     gl.glColor4f(c[count3/3], c[count3/3 /* + 1*/], c[count3/3 /* + 2*/], 1);
                                 }
                             }
+                            
                             if (flipV)
                                 gl.glTexCoord2f(uv[count2], 1-uv[count2 + 1]);
                             else
                                 gl.glTexCoord2f(uv[count2], uv[count2 + 1]);
+                            
                             //System.out.println("vertex1 = " + v[count3] + ", " + v[count3+1] + ", " + v[count3+2]);
                             gl.glVertex3f(v[count3], v[count3 + 1], v[count3 + 2]);
 
@@ -1213,10 +1218,12 @@
                                     gl.glColor4f(c[count3/3], c[count3/3 /* + 1*/], c[count3/3 /* + 2*/], 1);
                                 }
                             }
+                            
                             if (flipV)
                                 gl.glTexCoord2f(uv[count2], 1-uv[count2 + 1]);
                             else
                                 gl.glTexCoord2f(uv[count2], uv[count2 + 1]);
+                            
                             //System.out.println("vertex2 = " + v[count3] + ", " + v[count3+1] + ", " + v[count3+2]);
                             gl.glVertex3f(v[count3], v[count3 + 1], v[count3 + 2]);
 
@@ -1244,8 +1251,10 @@
                                     gl.glTexCoord2f(uv[count2], 1-uv[count2 + 1]);
                                 else
                                     gl.glTexCoord2f(uv[count2], uv[count2 + 1]);
+                                
                                 //System.out.println("coord3 = " + uv[count2] + ", " + uv[count2+1]);
                                 gl.glVertex3f(v[count3], v[count3 + 1], v[count3 + 2]);
+                                
                                 count2 += 2;
                                 count3 += 3;
                             }
@@ -1601,7 +1610,7 @@
 //        gl.glMaterialfv(gl.GL_BACK, gl.GL_DIFFUSE, colorV, 0);
     }
     
-    void DrawMaterial(cMaterial material, boolean selected)
+    void DrawMaterial(cMaterial material, boolean selected, Object3D.cVector2[] others)
     {
             CameraPane display = this;
         //new Exception().printStackTrace();
@@ -1636,7 +1645,7 @@
             colorV[0] = display.modelParams0[0] * material.diffuse;
             colorV[1] = display.modelParams0[1] * material.diffuse;
             colorV[2] = display.modelParams0[2] * material.diffuse;
-            colorV[3] = material.opacity;
+            colorV[3] = 1; // material.opacity;
 
             gl.glColor4f(colorV[0], colorV[1], colorV[2], material.opacity);
             //System.out.println("Opacity = " + opacity);
@@ -1744,9 +1753,9 @@
         display.modelParams7[2] = 0;
         display.modelParams7[3] = 0;
 
-        display.modelParams6[0] = 100; // criss de bug de bump
+        //display.modelParams6[0] = 100; // criss de bug de bump
         
-        Object3D.cVector2[] extparams = display.vector2buffer;
+        Object3D.cVector2[] extparams = others; // display.vector2buffer;
         if (extparams != null && extparams.length > 0 && extparams[0] != null)
         {
             display.modelParams6[0] = extparams[0].x / 1000.0f; // bump
@@ -1888,7 +1897,7 @@
     void PushMatrix(double[][] matrix)
     {
     //    GrafreeD.tracein(matrix);
-        PushMatrix(matrix,1);
+        PushMatrix(matrix, 1);
     }
     
     void PushMatrix()
@@ -2257,7 +2266,7 @@
     
     void ToggleDebug()
     {
-        DEBUG ^= true;
+        Globals.DEBUG ^= true;
     }
 
     void ToggleLookAt()
@@ -2374,7 +2383,7 @@
     {
         return currentGL;
     }
-    
+
     /**/
     class CacheTexture
     {
@@ -7919,6 +7928,64 @@
         ReleaseTexture(pigment, false);
     }
     
+    public void ReleasePigmentTexture(cTexture tex) // INTERFACE
+    {
+        if (/*tex == null ||*/ ambientOcclusion ) // || !textureon)
+        {
+            return;
+        }
+
+        if (tex == null)
+        {
+            ReleaseTexture(null, false);
+            return;
+        }
+        
+        String pigment = Object3D.GetPigment(tex);
+
+        if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
+        {
+        //    System.out.print("RELEASE  +++++++++++++++  pigment = " + pigment);
+        //    System.out.println("; bump = " + bump);
+        }
+        
+        if (pigment.equals(""))
+        {
+            pigment = null;
+        }
+        
+        ReleaseTexture(pigment, false);
+    }
+    
+    public void ReleaseBumpTexture(cTexture tex) // INTERFACE
+    {
+        if (/*tex == null ||*/ ambientOcclusion ) // || !textureon)
+        {
+            return;
+        }
+
+        if (tex == null)
+        {
+            ReleaseTexture(null, true);
+            return;
+        }
+        
+        String bump = Object3D.GetBump(tex);
+
+        if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
+        {
+        //    System.out.print("RELEASE  +++++++++++++++  pigment = " + pigment);
+        //    System.out.println("; bump = " + bump);
+        }
+        
+        if (bump.equals(""))
+        {
+            bump = null;
+        }
+        
+        ReleaseTexture(bump, true);
+    }
+    
     void ReleaseTexture(String tex, boolean bump)
     {
         if (// DrawMode() != 0 || /*tex == null ||*/
@@ -8067,6 +8134,93 @@
         return; // true;
     }
     
+    /*boolean*/ public void BindPigmentTexture(cTexture tex, int resolution) throws Exception // INTERFACE
+    {
+        if (// DrawMode() != 0 || /*tex == null ||*/
+                ambientOcclusion ) // || !textureon)
+        {
+            return; // false;
+        }
+
+        if (tex == null)
+        {
+            BindTexture(null,false,resolution);
+            return;
+        }
+        
+        String pigment = Object3D.GetPigment(tex);
+
+        usedtextures.put(pigment, pigment);
+        
+        if (!tex.equals(":") && !tex.equals(DEFAULT_TEXTURES))
+        {
+        //    System.out.print("BIND  +++++++++++++++  pigment = " + pigment);
+        //    System.out.println("; bump = " + bump);
+        }
+        
+        if (pigment.equals(""))
+        {
+            pigment = null;
+        }
+        
+        GetGL().glActiveTexture(GetGL().GL_TEXTURE0);
+        BindTexture(pigment, false, resolution);
+    }
+    
+    /*boolean*/ public void BindBumpTexture(cTexture tex, int resolution) throws Exception // INTERFACE
+    {
+        if (// DrawMode() != 0 || /*tex == null ||*/
+                ambientOcclusion ) // || !textureon)
+        {
+            return; // false;
+        }
+
+        if (tex == null)
+        {
+            BindTexture(null,true,resolution);
+            return;
+        }
+        
+        String bump = Object3D.GetBump(tex);
+
+        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;
+        }
+        
+        GetGL().glActiveTexture(GetGL().GL_TEXTURE2);
+        BindTexture(bump, true, resolution);
+        GetGL().glActiveTexture(GetGL().GL_TEXTURE0);
+    }
+    
+    java.util.HashSet<String> missingTextures = new java.util.HashSet<String>();
+    
+    private boolean FileExists(String tex)
+    {
+        if (missingTextures.contains(tex))
+        {
+            return false;
+        }
+        
+        boolean fileExists = new File(tex).exists();
+        
+        if (!fileExists)
+        {
+            // If file exists, the "new File()" is not executed sgain
+            missingTextures.add(tex);
+        }
+        
+        return fileExists;
+    }
+    
     CacheTexture GetCacheTexture(String tex, boolean bump, int resolution) throws Exception
     {
         CacheTexture/*com.sun.opengl.util.texture.Texture*/ texture = null;
@@ -8075,15 +8229,17 @@
         {
             String texname = tex;
             
+            String fallbackTextureName = defaultDirectory + "/Textures/" + texname;
+                
 //            String[] split = tex.split("Textures");
 //            if (split.length > 1)
 //                texname = "/Users/nbriere/Textures" + split[split.length-1];
 //            else
 //                if (!texname.startsWith("/"))
 //                    texname = "/Users/nbriere/Textures/" + texname;
-            if (!new File(tex).exists())
+            if (!FileExists(tex))
             {
-                    texname = javax.swing.filechooser.FileSystemView.getFileSystemView().getDefaultDirectory() + "/Textures/" + texname;
+                    texname = fallbackTextureName;
             }
             
             if (CACHETEXTURE)
@@ -8153,7 +8309,7 @@
                                     }
                                 
                                     cachename = texname.substring(0, texname.length()-4)+ext+".jpg";
-                                    if (!new File(cachename).exists())
+                                    if (!FileExists(cachename))
                                         cachename = texname;
                                     else
                                         processbump = false; // don't process bump map again
@@ -8175,7 +8331,7 @@
                                     }
                                 
                                     cachename = texname.substring(0, texname.length()-4)+ext+".png";
-                                    if (!new File(cachename).exists())
+                                    if (!FileExists(cachename))
                                         cachename = texname;
                                     else
                                         processbump = false; // don't process bump map again
@@ -9310,8 +9466,8 @@
         assert (parentcam != renderCamera);
         
         if (renderCamera != lightCamera)
-        for (int count = parentcam.GetTransformCount(); --count>=0;)
-            LA.matConcat(matrix, parentcam.toParent, matrix);
+        //for (int count = parentcam.GetTransformCount(); --count>=0;)
+            LA.matConcat(matrix, parentcam.GlobalTransform(), matrix);
         
 //            LA.matConcat(renderCamera.toScreen, renderCamera.toParent, matrix);
             
@@ -9326,8 +9482,8 @@
             LA.matCopy(renderCamera.fromScreen, matrix);
             
         if (renderCamera != lightCamera)
-        for (int count = parentcam.GetTransformCount(); --count>=0;)
-            LA.matConcat(parentcam.fromParent, matrix, matrix);
+        //for (int count = parentcam.GetTransformCount(); --count>=0;)
+            LA.matConcat(parentcam.GlobalTransformInv(), matrix, matrix);
 
 //            LA.matConcat(renderCamera.fromParent, renderCamera.fromScreen, matrix);
             
@@ -10392,7 +10548,8 @@
             ambientOcclusion = false;
         }
 
-        if (Globals.lighttouched && DrawMode() == DEFAULT) // && !lightMode) // && !FROZEN)
+        if (//Globals.lighttouched &&
+                DrawMode() == DEFAULT) // && !lightMode) // && !FROZEN)
         {
             //if (RENDERSHADOW) // ?
             if (!IsFrozen())
@@ -10525,8 +10682,8 @@
             
 //        if (parentcam != renderCamera) // not a light
         if (cam != lightCamera)
-            for (int count = parentcam.GetTransformCount(); --count>=0;)
-                LA.matConcat(matrix, parentcam.toParent, matrix);
+            //for (int count = parentcam.GetTransformCount(); --count>=0;)
+                LA.matConcat(matrix, parentcam.GlobalTransform(), matrix);
             
             for (int j = 0; j < 4; j++)
             {
@@ -10540,8 +10697,8 @@
             
 //        if (parentcam != renderCamera) // not a light
         if (cam != lightCamera)
-            for (int count = parentcam.GetTransformCount(); --count>=0;)
-                LA.matConcat(parentcam.fromParent, matrix, matrix);
+            //for (int count = parentcam.GetTransformCount(); --count>=0;)
+                LA.matConcat(parentcam.GlobalTransformInv(), matrix, matrix);
         
             //LA.matConcat(cam.fromScreen, parentcam.fromParent, matrix);
             
@@ -10934,8 +11091,8 @@
                 System.err.println("parentcam != renderCamera");
 
 //            if (cam != lightCamera)
-            for (int count = parentcam.GetTransformCount(); --count>=0;)
-                LA.xformDir(lightposition, parentcam.toParent, lightposition); // may 2013
+            //for (int count = parentcam.GetTransformCount(); --count>=0;)
+                LA.xformDir(lightposition, parentcam.GlobalTransform(), lightposition); // may 2013
         }
         
         LA.xformDir(lightposition, cam.toScreen, lightposition);
@@ -10956,8 +11113,8 @@
             if (true) // TODO
             {
                 if (cam != lightCamera)
-                for (int count = parentcam.GetTransformCount(); --count>=0;)
-                   LA.xformDir(light0, parentcam.toParent, light0); // may 2013
+                //for (int count = parentcam.GetTransformCount(); --count>=0;)
+                   LA.xformDir(light0, parentcam.GlobalTransform(), light0); // may 2013
             }
             
             LA.xformPos(light0, cam.toScreen, light0);
@@ -11302,6 +11459,24 @@
 
     static boolean zoomonce = false;
     
+    void CreateSelectedPoint()
+    {
+        if (selectedpoint == null)
+        {
+            debugpointG = new Sphere();
+            debugpointP = new Sphere();
+            debugpointC = new Sphere();
+            debugpointR = new Sphere();
+            
+            selectedpoint = new Superellipsoid();
+            
+            for (int i=0; i<8; i++)
+            {
+                debugpoints[i] = new Sphere();
+            }
+        }
+    }
+    
     void DrawObject(GL gl, boolean draw)
     {
         //System.out.println("DRAW OBJECT " + mouseDown);
@@ -11382,8 +11557,9 @@
             
             if (DrawMode() == DEFAULT)
             {
-                if (DEBUG)
+                if (Globals.DEBUG)
                 {
+                    CreateSelectedPoint();
                     float radius = 0.05f;
                     if (selectedpoint.radius != radius)
                     {
@@ -11869,8 +12045,8 @@
             //obj.TransformToWorld(light, light);
             for (int i = tp.size(); --i >= 0;)
             {
-                for (int count = tp.get(i).GetTransformCount(); --count>=0;)
-                    LA.xformPos(light, tp.get(i).toParent, light);
+                //for (int count = tp.get(i).GetTransformCount(); --count>=0;)
+                    LA.xformPos(light, tp.get(i).GlobalTransform(), light);
             }
 
 
@@ -11887,8 +12063,8 @@
                 parentcam = cameras[0];
             }
             
-        for (int count = parentcam.GetTransformCount(); --count>=0;)
-            LA.xformPos(light, parentcam.toParent, light); // may 2013
+        //for (int count = parentcam.GetTransformCount(); --count>=0;)
+            LA.xformPos(light, parentcam.GlobalTransform(), light); // may 2013
 
             LA.xformPos(light, renderCamera.toScreen, light);
             
@@ -13140,7 +13316,8 @@
     /*static*/ float[] modelParams5 = new float[]{0, 0, 0, 0}; // texture, opacity, fakedepth, shadowbias
     /*static*/ float[] modelParams6 = new float[]{0, 0, 0, 0}; // bump, noise, borderfade, fog punchthrough
     /*static*/ float[] modelParams7 = new float[]{0, 0, 0, 0}; // noise power, opacity power
-    Object3D.cVector2[] vector2buffer;
+    
+    //Object3D.cVector2[] vector2buffer;
 
     // IN : ndotl, ndoth, xxx, NdotL //, snininess, lightarea
     // OUT : diff, spec
@@ -13809,9 +13986,12 @@
     
     public void mouseDragged(MouseEvent e)
     {
+        Globals.MOUSEDRAGGED = true;
+        
         //System.out.println("mouseDragged: " + e);
         if (isRenderer)
             movingcamera = true;
+        
         //if (drawing)
         //return;
         if ((e.getModifiersEx() & CTRL) != 0
@@ -14361,7 +14541,9 @@
         ci.camera = renderCamera;
         if (!isRenderer)
         {
-            if (object.editWindow.copy.doEditClick(ci, 0))
+            ObjEditor editWindow = object.editWindow;
+            Object3D copy = editWindow.copy;
+            if (copy.doEditClick(ci, 0))
             {
                 setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
             } else
@@ -14373,6 +14555,8 @@
 
     public void mouseReleased(MouseEvent e)
     {
+        Globals.MOUSEDRAGGED = false;
+        
         movingcamera = false;
         X = Y = 0;
         //System.out.println("mouseReleased: " + e);
@@ -14740,8 +14924,14 @@
                 RevertCamera();
                 repaint();
                 break;
-            case 'L':
             case 'l':
+                lightMode ^= true;
+                Globals.lighttouched = true;
+                manipCamera = renderCamera = lightMode ? lightCamera : eyeCamera;
+                targetLookAt.set(manipCamera.lookAt);
+                repaint();
+                break;
+            case 'L':
                 if (lightMode)
                 {
                     lightMode = false;
@@ -14888,16 +15078,14 @@
                 kompactbit = 6;
                 break;
             case ' ':
-                lightMode ^= true;
-                Globals.lighttouched = true;
-                manipCamera = renderCamera = lightMode ? lightCamera : eyeCamera;
-                targetLookAt.set(manipCamera.lookAt);
+                ObjEditor.theFrame.ToggleFullScreen();
                 repaint();
                 break;
             //case '`' :
             case ESC:
                 RENDERPROGRAM += 1;
                 RENDERPROGRAM %= 3;
+
                 repaint();
                 break;
             case 'Z':
@@ -15488,12 +15676,17 @@
                 {
                     switch (object.selection.get(0).hitSomething)
                     {
-                        case Object3D.hitCenter: gr.setColor(Color.pink); break;
-                        case Object3D.hitRotate: gr.setColor(Color.green); break;
-                        case Object3D.hitScale: gr.setColor(Color.cyan); break;
+                        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;
                     }
                     
-                    gr.drawLine(X, Y, info.bounds.width/2, info.bounds.height/2);
                 }
             }
         }
@@ -15911,7 +16104,7 @@
     Object3D object;
     static Object3D trackedobject;
     Camera renderCamera; // Light or Eye (or Occlusion)
-    /*static*/ Camera manipCamera; // Light or Eye
+    /*static*/ Camera manipCamera; // Light or Eye. Can be Light when Eye, not Eye when Light
 	/*static*/ Camera eyeCamera;
     /*static*/ Camera lightCamera;
     int cameracount;
@@ -16196,16 +16389,16 @@
                 cStatic.objectstack[materialdepth++] = checker;
                 //System.out.println("material " + material);
                 //Applet3D.tracein(this, selected);
-                vector2buffer = checker.projectedVertices;
+                //vector2buffer = checker.projectedVertices;
 
         //checker.GetMaterial().Draw(this, false); // true);
-        DrawMaterial(checker.GetMaterial(), false); // true);
+        DrawMaterial(checker.GetMaterial(), false, checker.projectedVertices); // true);
 
                 materialdepth -= 1;
                 if (materialdepth > 0)
                 {
-                    vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
-                    DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1]);
+                    //vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
+                    DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1], cStatic.objectstack[materialdepth - 1].projectedVertices);
                 }
         //checker.GetMaterial().opacity = 1f;
         ////checker.GetMaterial().ambient = 1f;
@@ -17068,23 +17261,15 @@
     int AAbuffersize = 0;
     
     //double[] selectedpoint = new double[3];
-    static Superellipsoid selectedpoint = new Superellipsoid();
+    static Superellipsoid selectedpoint;
     static Sphere previousselectedpoint = null;
-    static Sphere debugpointG = new Sphere();
-    static Sphere debugpointP = new Sphere();
-    static Sphere debugpointC = new Sphere();
-    static Sphere debugpointR = new Sphere();
+    static Sphere debugpointG;
+    static Sphere debugpointP;
+    static Sphere debugpointC;
+    static Sphere debugpointR;
     
     static Sphere debugpoints[] = new Sphere[8];
  
-    static
-    {
-        for (int i=0; i<8; i++)
-        {
-            debugpoints[i] = new Sphere();
-        }
-    }
-    
     static void InitPoints(float radius)
     {
         for (int i=0; i<8; i++)

--
Gitblit v1.6.2