commit 12ecac18f9df950cbd0fe5188134b790db0cfd22
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Jul 16 22:42:54 2019 +0100

    Add the 'convexity' param to Dynamics and the Dynamic app.

diff --git a/src/main/java/org/distorted/library/type/Dynamic.java b/src/main/java/org/distorted/library/type/Dynamic.java
index 627b105..14a4e88 100644
--- a/src/main/java/org/distorted/library/type/Dynamic.java
+++ b/src/main/java/org/distorted/library/type/Dynamic.java
@@ -150,6 +150,7 @@ public abstract class Dynamic
 
   protected Vector<VectorCache> vc;
   protected VectorCache tmp1, tmp2;
+  protected float mConvexity;
 
   private float[] buf;
   private float[] old;
@@ -181,10 +182,11 @@ public abstract class Dynamic
     mDimension = dimension;
     mSegment   = -1;
     mLastPos   = -1;
-    mAccessType = ACCESS_TYPE_RANDOM;
+    mAccessType= ACCESS_TYPE_RANDOM;
+    mConvexity = 1.0f;
 
-    mTimeOffset = 0;
-    mSetOffset  = true;
+    mTimeOffset= 0;
+    mSetOffset = true;
 
     baseV      = new float[mDimension][mDimension];
     buf        = new float[mDimension];
@@ -588,6 +590,35 @@ public abstract class Dynamic
     return mDuration;
     }
 
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * @param convexity If set to the default (1.0f) then interpolation between 4 points
+ *                  (1,0) (0,1) (-1,0) (0,-1) will be the natural circle centered at (0,0) with radius 1.
+ *                  The less it is, the less convex the circle becomes, ultimately when convexity=0.0f
+ *                  then the interpolation shape will be straight lines connecting the four points.
+ *                  Further setting this to negative values will make the shape concave.
+ *                  Valid values: all floats. (although probably only something around (0,2) actually
+ *                  makes sense)
+ */
+  public void setConvexity(float convexity)
+    {
+    if( mConvexity!=convexity )
+      {
+      mConvexity = convexity;
+      cacheDirty = true;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/**
+ * @return See {@link Dynamic#setConvexity(float)}
+ */
+  public float getConvexity()
+    {
+    return mConvexity;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Sets the access type this Dynamic will be working in.
diff --git a/src/main/java/org/distorted/library/type/Dynamic1D.java b/src/main/java/org/distorted/library/type/Dynamic1D.java
index 96cc89c..6f929ac 100644
--- a/src/main/java/org/distorted/library/type/Dynamic1D.java
+++ b/src/main/java/org/distorted/library/type/Dynamic1D.java
@@ -57,11 +57,11 @@ public class Dynamic1D extends Dynamic implements Data1D
       
       if( q>1 )
         {
-        tmp1.tangent[0] = nx+px/q;
+        tmp1.tangent[0] = mConvexity*(nx+px/q);
         }
       else
         {
-        tmp1.tangent[0] = px+nx*q;
+        tmp1.tangent[0] = mConvexity*(px+nx*q);
         }
       }
     else
diff --git a/src/main/java/org/distorted/library/type/Dynamic2D.java b/src/main/java/org/distorted/library/type/Dynamic2D.java
index 1193923..efc7ab2 100644
--- a/src/main/java/org/distorted/library/type/Dynamic2D.java
+++ b/src/main/java/org/distorted/library/type/Dynamic2D.java
@@ -59,13 +59,13 @@ public class Dynamic2D extends Dynamic implements Data2D
       
       if( q>1 )
         {
-        tmp1.tangent[0] = nx+px/q;
-        tmp1.tangent[1] = ny+py/q;
+        tmp1.tangent[0] = mConvexity*(nx+px/q);
+        tmp1.tangent[1] = mConvexity*(ny+py/q);
         }
       else
         {
-        tmp1.tangent[0] = px+nx*q;
-        tmp1.tangent[1] = py+ny*q;
+        tmp1.tangent[0] = mConvexity*(px+nx*q);
+        tmp1.tangent[1] = mConvexity*(py+ny*q);
         }
       }
     else
diff --git a/src/main/java/org/distorted/library/type/Dynamic3D.java b/src/main/java/org/distorted/library/type/Dynamic3D.java
index 993ec42..e98571b 100644
--- a/src/main/java/org/distorted/library/type/Dynamic3D.java
+++ b/src/main/java/org/distorted/library/type/Dynamic3D.java
@@ -61,15 +61,15 @@ public class Dynamic3D extends Dynamic implements Data3D
       
       if( q>1 )
         {
-        tmp1.tangent[0] = nx+px/q;
-        tmp1.tangent[1] = ny+py/q;
-        tmp1.tangent[2] = nz+pz/q;
+        tmp1.tangent[0] = mConvexity*(nx+px/q);
+        tmp1.tangent[1] = mConvexity*(ny+py/q);
+        tmp1.tangent[2] = mConvexity*(nz+pz/q);
         }
       else
         {
-        tmp1.tangent[0] = px+nx*q;
-        tmp1.tangent[1] = py+ny*q;
-        tmp1.tangent[2] = pz+nz*q;
+        tmp1.tangent[0] = mConvexity*(px+nx*q);
+        tmp1.tangent[1] = mConvexity*(py+ny*q);
+        tmp1.tangent[2] = mConvexity*(pz+nz*q);
         }
       }
     else
diff --git a/src/main/java/org/distorted/library/type/Dynamic4D.java b/src/main/java/org/distorted/library/type/Dynamic4D.java
index 922fcf2..fbb64f5 100644
--- a/src/main/java/org/distorted/library/type/Dynamic4D.java
+++ b/src/main/java/org/distorted/library/type/Dynamic4D.java
@@ -63,17 +63,17 @@ public class Dynamic4D extends Dynamic implements Data4D
       
       if( q>1 )
         {
-        tmp1.tangent[0] = nx+px/q;
-        tmp1.tangent[1] = ny+py/q;
-        tmp1.tangent[2] = nz+pz/q;
-        tmp1.tangent[3] = nw+pw/q;
+        tmp1.tangent[0] = mConvexity*(nx+px/q);
+        tmp1.tangent[1] = mConvexity*(ny+py/q);
+        tmp1.tangent[2] = mConvexity*(nz+pz/q);
+        tmp1.tangent[3] = mConvexity*(nw+pw/q);
         }
       else
         {
-        tmp1.tangent[0] = px+nx*q;
-        tmp1.tangent[1] = py+ny*q;
-        tmp1.tangent[2] = pz+nz*q;
-        tmp1.tangent[3] = pw+nw*q;
+        tmp1.tangent[0] = mConvexity*(px+nx*q);
+        tmp1.tangent[1] = mConvexity*(py+ny*q);
+        tmp1.tangent[2] = mConvexity*(pz+nz*q);
+        tmp1.tangent[3] = mConvexity*(pw+nw*q);
         }
       }
     else
diff --git a/src/main/java/org/distorted/library/type/Dynamic5D.java b/src/main/java/org/distorted/library/type/Dynamic5D.java
index 254f259..4b799b8 100644
--- a/src/main/java/org/distorted/library/type/Dynamic5D.java
+++ b/src/main/java/org/distorted/library/type/Dynamic5D.java
@@ -65,19 +65,19 @@ public class Dynamic5D extends Dynamic implements Data5D
       
       if( q>1 )
         {
-        tmp1.tangent[0] = nx+px/q;
-        tmp1.tangent[1] = ny+py/q;
-        tmp1.tangent[2] = nz+pz/q;
-        tmp1.tangent[3] = nw+pw/q;
-        tmp1.tangent[4] = nv+pv/q;
+        tmp1.tangent[0] = mConvexity*(nx+px/q);
+        tmp1.tangent[1] = mConvexity*(ny+py/q);
+        tmp1.tangent[2] = mConvexity*(nz+pz/q);
+        tmp1.tangent[3] = mConvexity*(nw+pw/q);
+        tmp1.tangent[4] = mConvexity*(nv+pv/q);
         }
       else
         {
-        tmp1.tangent[0] = px+nx*q;
-        tmp1.tangent[1] = py+ny*q;
-        tmp1.tangent[2] = pz+nz*q;
-        tmp1.tangent[3] = pw+nw*q;
-        tmp1.tangent[4] = pv+nv*q;
+        tmp1.tangent[0] = mConvexity*(px+nx*q);
+        tmp1.tangent[1] = mConvexity*(py+ny*q);
+        tmp1.tangent[2] = mConvexity*(pz+nz*q);
+        tmp1.tangent[3] = mConvexity*(pw+nw*q);
+        tmp1.tangent[4] = mConvexity*(pv+nv*q);
         }
       }
     else
