From 15e60161787224e85172685f74dc0ac195969b51 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Wed, 5 Apr 2023 09:42:28 +0200
Subject: Math: Complete Matrix4f w/ Vec[234]f and adopt it throughout
 Quaternion, Ray, AABBox, Frustum, Stereo*, ... adding hook to PMVMatrix

Motivation was to simplify matrix + vector math usage, ease review and avoid usage bugs.

Matrix4f implementation uses dedicated float fields instead of an array.

Performance didn't increase much,
as JVM >= 11(?) has some optimizations to drop the array bounds check.

AMD64 + OpenJDK17
- Matrix4f.mul(a, b) got a roughly ~10% enhancement over FloatUtil.multMatrix(a, b, dest)
- Matrix4f.mul(b) roughly ~3% slower than FloatUtil.multMatrix(a, b, dest)
- FloatUtil.multMatrix(a, a_off, b, b_off, dest) is considerable slower than all
- Matrix4f.invert(..) roughly ~3% slower than FloatUtil.invertMatrix(..)

RaspberryPi 4b aarch64 + OpenJDK17
- Matrix4f.mul(a, b) got a roughly ~10% enhancement over FloatUtil.multMatrix(a, b, dest)
- Matrix4f.mul(b) roughly ~20% slower than FloatUtil.multMatrix(a, b)
- FloatUtil.multMatrix(a, a_off, b, b_off, dest) is considerable slower than all
- Matrix4f.invert(..) roughly ~4% slower than FloatUtil.invertMatrix(..)

Conclusion
- Matrix4f.mul(b) needs to be revised (esp for aarch64)
- Matrix4f.invert(..) should also not be slower ..
---
 .../jogamp/opengl/util/stereo/GenericStereoDevice.java        | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

(limited to 'src/jogl/classes/jogamp/opengl/util/stereo/GenericStereoDevice.java')

diff --git a/src/jogl/classes/jogamp/opengl/util/stereo/GenericStereoDevice.java b/src/jogl/classes/jogamp/opengl/util/stereo/GenericStereoDevice.java
index bfe93b59c..60adc7d74 100644
--- a/src/jogl/classes/jogamp/opengl/util/stereo/GenericStereoDevice.java
+++ b/src/jogl/classes/jogamp/opengl/util/stereo/GenericStereoDevice.java
@@ -34,6 +34,7 @@ import com.jogamp.nativewindow.util.PointImmutable;
 import com.jogamp.nativewindow.util.Rectangle;
 import com.jogamp.nativewindow.util.RectangleImmutable;
 import com.jogamp.opengl.math.FovHVHalves;
+import com.jogamp.opengl.math.Vec3f;
 import com.jogamp.opengl.util.stereo.StereoDeviceConfig;
 import com.jogamp.opengl.util.stereo.EyeParameter;
 import com.jogamp.opengl.util.stereo.LocationSensorParameter;
@@ -63,9 +64,9 @@ public class GenericStereoDevice implements StereoDevice {
     private static final GenericStereoDeviceConfig[] configs;
 
     static {
-        final float[] DEFAULT_EYE_POSITION_OFFSET_STEREO_LENSES = { 0.0f, 1.6f, -5.0f };  // 1.6 up, 5 forward
-        final float[] DEFAULT_EYE_POSITION_OFFSET_STEREO        = { 0.0f, 0.3f,  3.0f };  // 0.3 up, 3 back
-        final float[] DEFAULT_EYE_POSITION_OFFSET_MONO          = { 0.0f, 0.0f,  3.0f };  //         3 back
+        final Vec3f DEFAULT_EYE_POSITION_OFFSET_STEREO_LENSES = new Vec3f( 0.0f, 1.6f, -5.0f );  // 1.6 up, 5 forward
+        final Vec3f DEFAULT_EYE_POSITION_OFFSET_STEREO        = new Vec3f( 0.0f, 0.3f,  3.0f );  // 0.3 up, 3 back
+        final Vec3f DEFAULT_EYE_POSITION_OFFSET_MONO          = new Vec3f( 0.0f, 0.0f,  3.0f );  //         3 back
 
         final DimensionImmutable surfaceSizeInPixelDK1 = new Dimension(1280, 800);
         final float[] screenSizeInMetersDK1 = new float[] { 0.14976f, 0.0936f };
@@ -175,7 +176,7 @@ public class GenericStereoDevice implements StereoDevice {
     public int getRequiredRotation() { return 0; }
 
     @Override
-    public float[] getDefaultEyePositionOffset() { return config.defaultEyeParam[0].positionOffset; }
+    public Vec3f getDefaultEyePositionOffset() { return config.defaultEyeParam[0].positionOffset; }
 
     @Override
     public final FovHVHalves[] getDefaultFOV() { return defaultEyeFov; }
@@ -264,7 +265,7 @@ public class GenericStereoDevice implements StereoDevice {
 
     @Override
     public final StereoDeviceRenderer createRenderer(final int distortionBits,
-                                                     final int textureCount, final float[] eyePositionOffset,
+                                                     final int textureCount, final Vec3f eyePositionOffset,
                                                      final FovHVHalves[] eyeFov, final float pixelsPerDisplayPixel,
                                                      final int textureUnit) {
        final EyeParameter[] eyeParam = new EyeParameter[eyeFov.length];
-- 
cgit v1.2.3