commit f42f2a92a0b77210ad05733f3eac98629870dcb5
Author: leszek <leszek@koltunski.pl>
Date:   Fri Aug 4 00:45:07 2023 +0200

    New 'PIPE' vertex effect.

diff --git a/src/main/java/org/distorted/examples/generic/GenericEffect.java b/src/main/java/org/distorted/examples/generic/GenericEffect.java
index 2399950..1f7f5c2 100644
--- a/src/main/java/org/distorted/examples/generic/GenericEffect.java
+++ b/src/main/java/org/distorted/examples/generic/GenericEffect.java
@@ -91,6 +91,7 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
       case SWIRL            : effect = new VertexEffectSwirl       (mDyn1, mCenterDyn, mRegion4Dyn)              ; break;
       case WAVE             : effect = new VertexEffectWave        (mDyn5, mCenterDyn, mRegion4Dyn)              ; break;
       case DISAPPEAR        : effect = new VertexEffectDisappear   ()                                            ; break;
+      case PIPE             : effect = new VertexEffectPipe        (mDyn5, mCenterDyn)                           ; break;
 
       case VERTEX_MOVE      : effect = new VertexEffectMove        (mDyn3)                                       ; break;
       case VERTEX_QUATERNION: effect = new VertexEffectQuaternion  (mDyn4, mCenterDyn)                           ; break;
@@ -205,6 +206,19 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
                               mSta3.set(dp,ap,bp);
                               break;
       case DISAPPEAR        : break;
+      case PIPE             : float strength = (mInter[0] > 50 ? 50.0f/(100.01f-mInter[0]) : mInter[0] / 50.0f);
+                              float px = mInter[1];
+                              float py = mInter[2];
+                              float pz = mInter[3];
+                              float radius = mInter[4]/10.0f;
+
+                              float plen = (float)Math.sqrt(px*px + py*py + pz*pz);
+                              px /= plen;
+                              py /= plen;
+                              pz /= plen;
+
+                              mSta5.set(strength,px,py,pz,radius);
+                              break;
 
       ///////////////////////////////////////////////////////////////////////////////////////
       // FRAGMENT
@@ -492,7 +506,7 @@ class GenericEffect implements SeekBar.OnSeekBarChangeListener
                  mDyn1.add(mSta1);
                  }
                break;
-      case 5 : if( mName == EffectName.WAVE )
+      case 5 : if( mName == EffectName.WAVE || mName == EffectName.PIPE )
                  {
                  mDyn5 = new Dynamic5D();
                  mSta5 = new Static5D(0, 0, 0, 0, 0);
