commit ada90d331a3d5602f602578ed5756ee10addf484
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Fri Jun 3 23:09:15 2016 +0100

    Make deep copying DistortedObjects (needed in DistortedNode) standard.

diff --git a/src/main/java/org/distorted/library/DistortedBitmap.java b/src/main/java/org/distorted/library/DistortedBitmap.java
index ba27713..8d4c947 100644
--- a/src/main/java/org/distorted/library/DistortedBitmap.java
+++ b/src/main/java/org/distorted/library/DistortedBitmap.java
@@ -81,19 +81,20 @@ public class DistortedBitmap extends DistortedObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
- * Copy constructor used to create a DistortedBitmap based on various parts of another object.
- * <p>
- * Whatever we do not clone gets created just like in the default constructor.
- *
- * @param db    Source object to create our object from
- * @param flags A bitmask of values specifying what to copy.
- *              For example, CLONE_BITMAP | CLONE_MATRIX.
+ * {@see DistortedObject#DistortedObject(DistortedObject,flags)}
  */
    public DistortedBitmap(DistortedBitmap db, int flags)
      {
      super(db,flags);
      }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   protected DistortedObject deepCopy(int flags)
+     {
+     return new DistortedBitmap(this,flags);
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 }
     
diff --git a/src/main/java/org/distorted/library/DistortedCubes.java b/src/main/java/org/distorted/library/DistortedCubes.java
index 66469df..3d3b966 100644
--- a/src/main/java/org/distorted/library/DistortedCubes.java
+++ b/src/main/java/org/distorted/library/DistortedCubes.java
@@ -67,7 +67,7 @@ public class DistortedCubes extends DistortedObject
        for(int i=reallen; i<len; i++) desc += "0";
        }
     
-     if( desc.indexOf("1")>=0 )
+     if( desc.contains("1") )
        {
        Cs = cols;
        Rs = len/cols;
@@ -92,18 +92,19 @@ public class DistortedCubes extends DistortedObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
- * Copy constructor used to create a DistortedCubes based on various parts of another object.
- * <p>
- * Whatever we do not clone gets created just like in the default constructor.
- *
- * @param dc    Source object to create our object from
- * @param flags A bitmask of values specifying what to copy.
- *              For example, CLONE_BITMAP | CLONE_MATRIX.
+ * {@see DistortedObject#DistortedObject(DistortedObject,flags)}
  */
  public DistortedCubes(DistortedCubes dc, int flags)
    {
    super(dc,flags);
    }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   protected DistortedObject deepCopy(int flags)
+     {
+     return new DistortedCubes(this,flags);
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////   
  }
diff --git a/src/main/java/org/distorted/library/DistortedNode.java b/src/main/java/org/distorted/library/DistortedNode.java
index 570261a..79b8f83 100644
--- a/src/main/java/org/distorted/library/DistortedNode.java
+++ b/src/main/java/org/distorted/library/DistortedNode.java
@@ -299,13 +299,7 @@ public class DistortedNode
   public DistortedNode(DistortedNode node, int flags)
     {
     mParent = null;
-
-    if( node.mObject instanceof DistortedBitmap)
-      mObject = new DistortedBitmap( (DistortedBitmap)node.mObject, flags);
-    else if( node.mObject instanceof DistortedCubes)
-      mObject = new DistortedCubes( (DistortedCubes)node.mObject, flags);
-    else
-      throw new RuntimeException("unsupported type of object!");
+    mObject = node.mObject.deepCopy(flags);
 
     if( (flags & Distorted.CLONE_CHILDREN) != 0 )
       {
diff --git a/src/main/java/org/distorted/library/DistortedObject.java b/src/main/java/org/distorted/library/DistortedObject.java
index 44ba10f..e5332bd 100644
--- a/src/main/java/org/distorted/library/DistortedObject.java
+++ b/src/main/java/org/distorted/library/DistortedObject.java
@@ -30,54 +30,7 @@ public abstract class DistortedObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  /**
-   * Default empty constructor so that derived classes can call it
-   */
-    public DistortedObject()
-      {
-
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-  /**
-   * Copy constructor used to create a DistortedObject based on various parts of another object.
-   * <p>
-   * Whatever we do not clone gets created just like in the default constructor.
-   *
-   * @param dc    Source object to create our object from
-   * @param flags A bitmask of values specifying what to copy.
-   *              For example, CLONE_BITMAP | CLONE_MATRIX.
-   */
-    public DistortedObject(DistortedObject dc, int flags)
-      {
-      initializeEffectLists(dc,flags);
-
-      mID = DistortedObjectList.add(this);
-
-      mSizeX = dc.mSizeX;
-      mSizeY = dc.mSizeY;
-      mSizeZ = dc.mSizeZ;
-      mSize  = dc.mSize;
-      mGrid  = dc.mGrid;
-
-      if( (flags & Distorted.CLONE_BITMAP) != 0 )
-        {
-        mTextureDataH = dc.mTextureDataH;
-        mBmp          = dc.mBmp;
-        mBitmapSet    = dc.mBitmapSet;
-        }
-      else
-        {
-        mTextureDataH   = new int[1];
-        mTextureDataH[0]= 0;
-        mBitmapSet      = new boolean[1];
-        mBitmapSet[0]   = false;
-        mBmp            = new Bitmap[1];
-        mBmp[0]         = null;
-
-        if( Distorted.isInitialized() ) resetTexture();
-        }
-      }
+    protected abstract DistortedObject deepCopy(int flags);
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -213,6 +166,57 @@ public abstract class DistortedObject
       return mBmp==null ? 0 : mBmp.hashCode();
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  /**
+   * Default empty constructor so that derived classes can call it
+   */
+    public DistortedObject()
+      {
+
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+  /**
+   * Copy constructor used to create a DistortedObject based on various parts of another object.
+   * <p>
+   * Whatever we do not clone gets created just like in the default constructor.
+   *
+   * @param dc    Source object to create our object from
+   * @param flags A bitmask of values specifying what to copy.
+   *              For example, CLONE_BITMAP | CLONE_MATRIX.
+   */
+    public DistortedObject(DistortedObject dc, int flags)
+      {
+      initializeEffectLists(dc,flags);
+
+      mID = DistortedObjectList.add(this);
+
+      mSizeX = dc.mSizeX;
+      mSizeY = dc.mSizeY;
+      mSizeZ = dc.mSizeZ;
+      mSize  = dc.mSize;
+      mGrid  = dc.mGrid;
+
+      if( (flags & Distorted.CLONE_BITMAP) != 0 )
+        {
+        mTextureDataH = dc.mTextureDataH;
+        mBmp          = dc.mBmp;
+        mBitmapSet    = dc.mBitmapSet;
+        }
+      else
+        {
+        mTextureDataH   = new int[1];
+        mTextureDataH[0]= 0;
+        mBitmapSet      = new boolean[1];
+        mBitmapSet[0]   = false;
+        mBmp            = new Bitmap[1];
+        mBmp[0]         = null;
+
+        if( Distorted.isInitialized() ) resetTexture();
+        }
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Draw the DistortedObject to the location specified by current Matrix effects.    
diff --git a/src/main/java/org/distorted/library/DistortedObjectList.java b/src/main/java/org/distorted/library/DistortedObjectList.java
index d0eae7a..cdf315b 100644
--- a/src/main/java/org/distorted/library/DistortedObjectList.java
+++ b/src/main/java/org/distorted/library/DistortedObjectList.java
@@ -10,36 +10,36 @@ import java.util.HashMap;
 final class DistortedObjectList 
   {
   private static long id =0;  
-  private static HashMap<Long,DistortedObject> mBitmaps = new HashMap<>();
+  private static HashMap<Long,DistortedObject> mObjects = new HashMap<>();
   
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static synchronized long add(DistortedObject dBmp)
+  static synchronized long add(DistortedObject obj)
     {
     long ret = id++;  
-    mBitmaps.put(ret,dBmp);
+    mObjects.put(ret,obj);
     return ret;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  static synchronized void remove(DistortedObject dBmp)
+  static synchronized void remove(DistortedObject obj)
     {
-    mBitmaps.remove(dBmp);
+    mObjects.remove(obj);
     }
   
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   static DistortedObject get(long id)
     {
-    return mBitmaps.get(id);  
+    return mObjects.get(id);
     }
   
 ///////////////////////////////////////////////////////////////////////////////////////////////////
   
   static synchronized void reset()
     {
-    for(long id: mBitmaps.keySet()) 
+    for(long id: mObjects.keySet())
       {
       get(id).resetTexture();  
       }
@@ -49,12 +49,12 @@ final class DistortedObjectList
 
   static synchronized void release()
     {
-    for(long id: mBitmaps.keySet()) 
+    for(long id: mObjects.keySet())
       {
       get(id).releasePriv();  
       }
    
-    mBitmaps.clear();
+    mObjects.clear();
     id = 0;
     }
   
