From d44e8ada30d62149c5d4d4b8fdba7cc33f8c765b Mon Sep 17 00:00:00 2001
From: Sven Gothel
* All matrix fields are only set if
+ * All matrix fields are only set if
@@ -1034,7 +1102,7 @@ public final class FloatUtil {
final float[] modelMatrix, final int modelMatrix_offset,
final float[] projMatrix, final int projMatrix_offset,
final int[] viewport, final int viewport_offset,
- final float[] win_pos, int win_pos_offset,
+ final float[] win_pos, final int win_pos_offset,
final float[/*4*/] vec4Tmp1, final float[/*4*/] vec4Tmp2) {
vec4Tmp1[0] = objx;
vec4Tmp1[1] = objy;
@@ -1088,7 +1156,7 @@ public final class FloatUtil {
public static boolean mapObjToWinCoords(final float objx, final float objy, final float objz,
final float[/*16*/] mat4PMv,
final int[] viewport, final int viewport_offset,
- final float[] win_pos, int win_pos_offset,
+ final float[] win_pos, final int win_pos_offset,
final float[/*4*/] vec4Tmp1, final float[/*4*/] vec4Tmp2) {
vec4Tmp2[0] = objx;
vec4Tmp2[1] = objy;
@@ -1338,11 +1406,11 @@ public final class FloatUtil {
* @return true if successful, otherwise false (failed to invert matrix, or becomes infinity due to zero z)
*/
public static boolean mapWinToObjCoords(final float winx, final float winy, final float winz, final float clipw,
- float[] modelMatrix, int modelMatrix_offset,
- float[] projMatrix, int projMatrix_offset,
- int[] viewport, int viewport_offset,
- float near, float far,
- float[] obj_pos, int obj_pos_offset,
+ final float[] modelMatrix, final int modelMatrix_offset,
+ final float[] projMatrix, final int projMatrix_offset,
+ final int[] viewport, final int viewport_offset,
+ final float near, final float far,
+ final float[] obj_pos, final int obj_pos_offset,
final float[/*16*/] mat4Tmp1, final float[/*16*/] mat4Tmp2) {
// mat4Tmp1 = P x Mv
multMatrix(projMatrix, projMatrix_offset, modelMatrix, modelMatrix_offset, mat4Tmp1, 0);
@@ -1445,7 +1513,7 @@ public final class FloatUtil {
* @param d result a*b in column-major order
* @return given result matrix d for chaining
*/
- public static float[] multMatrix(final float[] a, final int a_off, final float[] b, final int b_off, float[] d, final int d_off) {
+ public static float[] multMatrix(final float[] a, final int a_off, final float[] b, final int b_off, final float[] d, final int d_off) {
final float b00 = b[b_off+0+0*4];
final float b10 = b[b_off+1+0*4];
final float b20 = b[b_off+2+0*4];
@@ -1509,7 +1577,7 @@ public final class FloatUtil {
* @param d result a*b in column-major order
* @return given result matrix d for chaining
*/
- public static float[] multMatrix(final float[] a, final float[] b, float[] d) {
+ public static float[] multMatrix(final float[] a, final float[] b, final float[] d) {
final float b00 = b[0+0*4];
final float b10 = b[1+0*4];
final float b20 = b[2+0*4];
diff --git a/src/jogl/classes/com/jogamp/opengl/math/FovHVHalves.java b/src/jogl/classes/com/jogamp/opengl/math/FovHVHalves.java
new file mode 100644
index 000000000..18bba8c45
--- /dev/null
+++ b/src/jogl/classes/com/jogamp/opengl/math/FovHVHalves.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright 2014 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package com.jogamp.opengl.math;
+
+/**
+ * Horizontal and vertical field of view (FOV) halves,
+ * allowing a non-centered projection.
+ *
+ * The values might be either in tangent or radians.
+ * initM
is true
.
* initM
is true
.
+ *
+ final float halfHorizFovTan = (float)Math.tan(horizontalFov/2f);
+ final float halfVertFovTan = (float)Math.tan(verticalFov/2f);
+ *
+ * @param horizontalFov whole horizontal FOV in radians
+ * @param verticalFov whole vertical FOV in radians
+ */
+ public static FovHVHalves createByRadians(final float horizontalFov, final float verticalFov) {
+ final float halfHorizFovTan = (float)Math.tan(horizontalFov/2f);
+ final float halfVertFovTan = (float)Math.tan(verticalFov/2f);
+ return new FovHVHalves(halfHorizFovTan, halfHorizFovTan, halfVertFovTan, halfVertFovTan, true);
+ }
+
+ /** Returns the full horizontal FOV, i.e. {@link #left} + {@link #right}. */
+ public final float horzFov() { return left+right; }
+
+ /** Returns the full vertical FOV, i.e. {@link #top} + {@link #bottom}. */
+ public final float vertFov() { return top+bottom; }
+
+ public final String toString() {
+ return "FovHVHalves["+(inTangents?"tangents":"radians")+": "+left+" l, "+right+" r, "+top+" t, "+bottom+" b]";
+ }
+}
diff --git a/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java b/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java
index 607d8ef9d..c11c2bd2b 100644
--- a/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java
+++ b/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java
@@ -33,13 +33,17 @@ public final class VectorUtil {
public static final float[] VEC3_ONE = { 1f, 1f, 1f };
public static final float[] VEC3_ZERO = { 0f, 0f, 0f };
+ public static final float[] VEC3_UNIT_Y = { 0f, 1f, 0f };
+ public static final float[] VEC3_UNIT_Y_NEG = { 0f, -1f, 0f };
+ public static final float[] VEC3_UNIT_Z = { 0f, 0f, 1f };
+ public static final float[] VEC3_UNIT_Z_NEG = { 0f, 0f, -1f };
public enum Winding {
CW(-1), CCW(1);
public final int dir;
- Winding(int dir) {
+ Winding(final int dir) {
this.dir = dir;
}
}
@@ -52,7 +56,7 @@ public final class VectorUtil {
* @param srcOffset offset of src in array
* @return copied output vector for chaining
*/
- public static float[] copyVec2(final float[] dst, int dstOffset, final float[] src, int srcOffset)
+ public static float[] copyVec2(final float[] dst, final int dstOffset, final float[] src, final int srcOffset)
{
System.arraycopy(src, srcOffset, dst, dstOffset, 2);
return dst;
@@ -66,7 +70,7 @@ public final class VectorUtil {
* @param srcOffset offset of src in array
* @return copied output vector for chaining
*/
- public static float[] copyVec3(final float[] dst, int dstOffset, final float[] src, int srcOffset)
+ public static float[] copyVec3(final float[] dst, final int dstOffset, final float[] src, final int srcOffset)
{
System.arraycopy(src, srcOffset, dst, dstOffset, 3);
return dst;
@@ -80,7 +84,7 @@ public final class VectorUtil {
* @param srcOffset offset of src in array
* @return copied output vector for chaining
*/
- public static float[] copyVec4(final float[] dst, int dstOffset, final float[] src, int srcOffset)
+ public static float[] copyVec4(final float[] dst, final int dstOffset, final float[] src, final int srcOffset)
{
System.arraycopy(src, srcOffset, dst, dstOffset, 4);
return dst;
@@ -92,7 +96,7 @@ public final class VectorUtil {
* Implementation uses {@link FloatUtil#isEqual(float, float)}, see API doc for details.
*
+ * While a repeated frame shall produce the same artifacts as the last display
call,
+ * e.g. not change animated objects, it shall reflect the {@link #setProjectionModelview(GLAutoDrawable, float[], float[]) current matrix}.
+ *
+ * Method is usually called by a custom rendering loop, + * e.g. for manual stereo rendering or the like. + *
+ * @param drawable + * @param flags + */ + public void display(final GLAutoDrawable drawable, final int flags); +} diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/EyeParameter.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/EyeParameter.java new file mode 100644 index 000000000..7774d67e2 --- /dev/null +++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/EyeParameter.java @@ -0,0 +1,68 @@ +/** + * Copyright 2014 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ +package com.jogamp.opengl.util.stereo; + +import com.jogamp.opengl.math.FovHVHalves; + +/** + * Constant parameter for one eye. + */ +public final class EyeParameter { + /** Eye number,0
for the left eye and 1
for the right eye. */
+ public final int number;
+
+ /** float[3] eye position vector used to define eye height in meter relative to actor. */
+ public final float[] positionOffset;
+
+ /** Field of view in both directions, may not be centered, either in radians or tangent. */
+ public final FovHVHalves fovhv;
+
+ /** IPD related horizontal distance from nose to pupil in meter. */
+ public final float distNoseToPupilX;
+
+ /** Vertical distance from middle-line to pupil in meter. */
+ public final float distMiddleToPupilY;
+
+ /** Z-axis eye relief in meter. */
+ public final float eyeReliefZ;
+
+ public EyeParameter(final int number, final float[] positionOffset, final FovHVHalves fovhv,
+ final float distNoseToPupil, final float verticalDelta, final float eyeRelief) {
+ this.number = number;
+ this.positionOffset = new float[3];
+ System.arraycopy(positionOffset, 0, this.positionOffset, 0, 3);
+ this.fovhv = fovhv;
+ this.distNoseToPupilX = distNoseToPupil;
+ this.distMiddleToPupilY = verticalDelta;
+ this.eyeReliefZ = eyeRelief;
+ }
+ public final String toString() {
+ return "EyeParam[num"+number+", posOff["+positionOffset[0]+", "+positionOffset[1]+", "+positionOffset[2]+"], "+fovhv+
+ ", distPupil[noseX "+distNoseToPupilX+", middleY "+distMiddleToPupilY+", reliefZ "+eyeReliefZ+"]]";
+ }
+}
\ No newline at end of file
diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/EyePose.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/EyePose.java
new file mode 100644
index 000000000..2690097f1
--- /dev/null
+++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/EyePose.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright 2014 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package com.jogamp.opengl.util.stereo;
+
+import com.jogamp.opengl.math.Quaternion;
+
+/**
+ * Position and orientation of one eye.
+ */
+public final class EyePose {
+ /** Eye number, 0
for the left eye and 1
for the right eye. */
+ public final int number;
+
+ /** float[3] eye position vector. */
+ public final float[] position;
+
+ /** Eye orientation */
+ public final Quaternion orientation;
+
+ public EyePose(final int number) {
+ this.number = number;
+ this.position = new float[3];
+ this.orientation = new Quaternion();
+ }
+ public EyePose(final int number, final float[] position, final Quaternion orientation) {
+ this(number);
+ set(position, orientation);
+ }
+
+ /** Set position and orientation of this instance. */
+ public final void set(final float[] position, final Quaternion orientation) {
+ System.arraycopy(position, 0, this.position, 0, 3);
+ this.orientation.set(orientation);
+ }
+ /** Set position and orientation of this instance. */
+ public final void setPosition(final float posX, final float posY, final float posZ) {
+ position[0] = posX;
+ position[1] = posY;
+ position[2] = posZ;
+ }
+ public final String toString() {
+ return "EyePose[num"+number+", pos["+position[0]+", "+position[1]+", "+position[2]+"], "+orientation+"]";
+ }
+}
\ No newline at end of file
diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoRendererListener.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoRendererListener.java
new file mode 100644
index 000000000..5e6e40a08
--- /dev/null
+++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoRendererListener.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright 2014 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+package com.jogamp.opengl.util.stereo;
+
+import javax.media.opengl.GLAutoDrawable;
+import javax.media.opengl.GLEventListener;
+
+import com.jogamp.opengl.math.FloatUtil;
+import com.jogamp.opengl.util.CustomRendererListener;
+
+/**
+ * Extended {@link GLEventListener} and {@link CustomRendererListener} interface
+ * supporting stereoscopic client rendering.
+ */
+public interface StereoRendererListener extends CustomRendererListener {
+ /**
+ * Stereo capable specialization of {@link #reshape(GLAutoDrawable, int, int, int, int)}.
+ * + * Called by the stereo renderer before each {@link #display(GLAutoDrawable)} + * or {@link #display(GLAutoDrawable, int)} call. + *
+ *+ * The client can update it's viewport associated data + * and view volume of the window appropriately. + *
+ *+ * The client shall also update it's projection- and modelview matrices according + * to the given {@link EyeParameter} and {@link EyePose}. + *
+ *
+ * For efficiency the GL viewport has already been updated
+ * via glViewport(x, y, width, height)
when this method is called.
+ *