commit 0e1d3d2e080694b090f3414e1f77cf6cdf721338
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun Jan 2 23:06:50 2022 +0100

    Extra API for QuatHelper.

diff --git a/src/main/java/org/distorted/library/effect/FragmentEffectAlpha.java b/src/main/java/org/distorted/library/effect/FragmentEffectAlpha.java
index 5ac47ac..b370e65 100644
--- a/src/main/java/org/distorted/library/effect/FragmentEffectAlpha.java
+++ b/src/main/java/org/distorted/library/effect/FragmentEffectAlpha.java
@@ -29,9 +29,9 @@ import org.distorted.library.type.Static3D;
  */
 public class FragmentEffectAlpha extends FragmentEffect
   {
-  private Data1D mAlpha;
-  private Data3D mCenter;
-  private Data3D mRegion;
+  private final Data1D mAlpha;
+  private final Data3D mCenter;
+  private final Data3D mRegion;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/FragmentEffectBrightness.java b/src/main/java/org/distorted/library/effect/FragmentEffectBrightness.java
index 7d19b4f..bbec84a 100644
--- a/src/main/java/org/distorted/library/effect/FragmentEffectBrightness.java
+++ b/src/main/java/org/distorted/library/effect/FragmentEffectBrightness.java
@@ -29,9 +29,9 @@ import org.distorted.library.type.Static3D;
  */
 public class FragmentEffectBrightness extends FragmentEffect
   {
-  private Data1D mBrightness;
-  private Data3D mCenter;
-  private Data3D mRegion;
+  private final Data1D mBrightness;
+  private final Data3D mCenter;
+  private final Data3D mRegion;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/FragmentEffectChroma.java b/src/main/java/org/distorted/library/effect/FragmentEffectChroma.java
index 5d55643..9523317 100644
--- a/src/main/java/org/distorted/library/effect/FragmentEffectChroma.java
+++ b/src/main/java/org/distorted/library/effect/FragmentEffectChroma.java
@@ -29,10 +29,10 @@ import org.distorted.library.type.Static3D;
  */
 public class FragmentEffectChroma extends FragmentEffect
   {
-  private Data1D mBlend;
-  private Data3D mColor;
-  private Data3D mCenter;
-  private Data3D mRegion;
+  private final Data1D mBlend;
+  private final Data3D mColor;
+  private final Data3D mCenter;
+  private final Data3D mRegion;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/FragmentEffectContrast.java b/src/main/java/org/distorted/library/effect/FragmentEffectContrast.java
index 9f5e445..abe6b29 100644
--- a/src/main/java/org/distorted/library/effect/FragmentEffectContrast.java
+++ b/src/main/java/org/distorted/library/effect/FragmentEffectContrast.java
@@ -29,9 +29,9 @@ import org.distorted.library.type.Static3D;
  */
 public class FragmentEffectContrast extends FragmentEffect
   {
-  private Data1D mContrast;
-  private Data3D mCenter;
-  private Data3D mRegion;
+  private final Data1D mContrast;
+  private final Data3D mCenter;
+  private final Data3D mRegion;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/FragmentEffectSaturation.java b/src/main/java/org/distorted/library/effect/FragmentEffectSaturation.java
index f7fe107..184a475 100644
--- a/src/main/java/org/distorted/library/effect/FragmentEffectSaturation.java
+++ b/src/main/java/org/distorted/library/effect/FragmentEffectSaturation.java
@@ -29,9 +29,9 @@ import org.distorted.library.type.Static3D;
  */
 public class FragmentEffectSaturation extends FragmentEffect
   {
-  private Data1D mSaturation;
-  private Data3D mCenter;
-  private Data3D mRegion;
+  private final Data1D mSaturation;
+  private final Data3D mCenter;
+  private final Data3D mRegion;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectMove.java b/src/main/java/org/distorted/library/effect/MatrixEffectMove.java
index a3da6c4..815becd 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectMove.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectMove.java
@@ -29,7 +29,7 @@ import org.distorted.library.type.Data3D;
  */
 public class MatrixEffectMove extends MatrixEffect
   {
-  private Data3D mVector;
+  private final Data3D mVector;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java b/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java
index 2c8d4ab..ced4e01 100644
--- a/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java
+++ b/src/main/java/org/distorted/library/effect/MatrixEffectRotate.java
@@ -30,8 +30,8 @@ import org.distorted.library.type.Data3D;
  */
 public class MatrixEffectRotate extends MatrixEffect
   {
-  private Data1D mAngle;
-  private Data3D mAxis, mCenter;
+  private final Data1D mAngle;
+  private final Data3D mAxis, mCenter;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/VertexEffectDeform.java b/src/main/java/org/distorted/library/effect/VertexEffectDeform.java
index e8ca991..52f1235 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectDeform.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectDeform.java
@@ -31,9 +31,9 @@ public class VertexEffectDeform extends VertexEffect
   {
   private static final EffectName NAME = EffectName.DEFORM;
 
-  private Data3D mVector, mCenter;
-  private Data1D mRadius;
-  private Data4D mRegion;
+  private final Data3D mVector, mCenter;
+  private final Data1D mRadius;
+  private final Data4D mRegion;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/VertexEffectDistort.java b/src/main/java/org/distorted/library/effect/VertexEffectDistort.java
index 37ddbe2..02e5c3f 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectDistort.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectDistort.java
@@ -30,8 +30,8 @@ public class VertexEffectDistort extends VertexEffect
   {
   private static final EffectName NAME = EffectName.DISTORT;
 
-  private Data3D mVector, mCenter;
-  private Data4D mRegion;
+  private final Data3D mVector, mCenter;
+  private final Data4D mRegion;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/VertexEffectMove.java b/src/main/java/org/distorted/library/effect/VertexEffectMove.java
index 00f89c4..b3e58c8 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectMove.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectMove.java
@@ -30,7 +30,7 @@ public class VertexEffectMove extends VertexEffect
   {
   private static final EffectName NAME = EffectName.VERTEX_MOVE;
 
-  private Data3D mVector;
+  private final Data3D mVector;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/VertexEffectPinch.java b/src/main/java/org/distorted/library/effect/VertexEffectPinch.java
index ac010c4..adb36bf 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectPinch.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectPinch.java
@@ -36,9 +36,9 @@ public class VertexEffectPinch extends VertexEffect
   {
   private static final EffectName NAME = EffectName.PINCH;
 
-  private Data3D mPinch;
-  private Data3D mCenter;
-  private Data4D mRegion;
+  private final Data3D mPinch;
+  private final Data3D mCenter;
+  private final Data4D mRegion;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/VertexEffectQuaternion.java b/src/main/java/org/distorted/library/effect/VertexEffectQuaternion.java
index a2a3355..b27d92d 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectQuaternion.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectQuaternion.java
@@ -31,8 +31,8 @@ public class VertexEffectQuaternion extends VertexEffect
   {
   private static final EffectName NAME = EffectName.VERTEX_QUATERNION;
 
-  private Data4D mQuaternion;
-  private Data3D mCenter;
+  private final Data4D mQuaternion;
+  private final Data3D mCenter;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/VertexEffectScale.java b/src/main/java/org/distorted/library/effect/VertexEffectScale.java
index 5b1c654..e70dc41 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectScale.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectScale.java
@@ -30,7 +30,7 @@ public class VertexEffectScale extends VertexEffect
   {
   private static final EffectName NAME = EffectName.VERTEX_SCALE;
 
-  private Data3D mScale;
+  private final Data3D mScale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/VertexEffectSink.java b/src/main/java/org/distorted/library/effect/VertexEffectSink.java
index dec5a61..a9bd596 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectSink.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectSink.java
@@ -32,9 +32,9 @@ public class VertexEffectSink extends VertexEffect
   {
   private static final EffectName NAME = EffectName.SINK;
 
-  private Data1D mSink;
-  private Data3D mCenter;
-  private Data4D mRegion;
+  private final Data1D mSink;
+  private final Data3D mCenter;
+  private final Data4D mRegion;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/VertexEffectSwirl.java b/src/main/java/org/distorted/library/effect/VertexEffectSwirl.java
index 4581eae..8b99230 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectSwirl.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectSwirl.java
@@ -36,9 +36,9 @@ public class VertexEffectSwirl extends VertexEffect
   {
   private static final EffectName NAME = EffectName.SWIRL;
 
-  private Data1D mSwirl;
-  private Data3D mCenter;
-  private Data4D mRegion;
+  private final Data1D mSwirl;
+  private final Data3D mCenter;
+  private final Data4D mRegion;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/effect/VertexEffectWave.java b/src/main/java/org/distorted/library/effect/VertexEffectWave.java
index 74ffc82..b139845 100644
--- a/src/main/java/org/distorted/library/effect/VertexEffectWave.java
+++ b/src/main/java/org/distorted/library/effect/VertexEffectWave.java
@@ -35,9 +35,9 @@ public class VertexEffectWave extends VertexEffect
   {
   private static final EffectName NAME = EffectName.WAVE;
 
-  private Data5D mWave;
-  private Data3D mCenter;
-  private Data4D mRegion;
+  private final Data5D mWave;
+  private final Data3D mCenter;
+  private final Data4D mRegion;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
diff --git a/src/main/java/org/distorted/library/main/QuatHelper.java b/src/main/java/org/distorted/library/main/QuatHelper.java
index 9f3a25b..080a87c 100644
--- a/src/main/java/org/distorted/library/main/QuatHelper.java
+++ b/src/main/java/org/distorted/library/main/QuatHelper.java
@@ -108,6 +108,17 @@ public class QuatHelper
     ret[3] = r[3]*q[3] - r[2]*q[2] - r[1]*q[1] - r[0]*q[0];
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// ret = (qx,qy,qz,qw)*(rx,ry,rz,rw)
+
+  public static void quatMultiply( float[] ret, float qx, float qy, float qz, float qw, float rx, float ry, float rz, float rw )
+    {
+    ret[0] = rw*qx - rz*qy + ry*qz + rx*qw;
+    ret[1] = rw*qy + rz*qx + ry*qw - rx*qz;
+    ret[2] = rw*qz + rz*qw - ry*qx + rx*qy;
+    ret[3] = rw*qw - rz*qz - ry*qy - rx*qx;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // rotate 'vector' by quat  ( i.e. return quat*vector*(quat^-1) )
 
@@ -138,6 +149,22 @@ public class QuatHelper
     return quatMultiply(tmp,-qx,-qy,-qz,qw);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// rotate (x1,x2,x3,x4) by quat  ( i.e. return quat*vector*(quat^-1) )
+
+  public static void rotateVectorByQuat(float[] output, float x, float y, float z, float w, Static4D quat)
+    {
+    float[] tmp = new float[4];
+
+    float qx = quat.get0();
+    float qy = quat.get1();
+    float qz = quat.get2();
+    float qw = quat.get3();
+
+    quatMultiply(tmp,qx,qy,qz,qw,x,y,z,w);
+    quatMultiply(output,tmp[0],tmp[1],tmp[2],tmp[3],-qx,-qy,-qz,qw);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // rotate vec by quat ( i.e. return quat*vector*(quat^-1) )
 
