diff options
Diffstat (limited to 'src/jogl/classes/com/jogamp/opengl/util')
16 files changed, 98 insertions, 1557 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/util/PMVMatrix.java b/src/jogl/classes/com/jogamp/opengl/util/PMVMatrix.java index ebb164912..3350b30a7 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/PMVMatrix.java +++ b/src/jogl/classes/com/jogamp/opengl/util/PMVMatrix.java @@ -27,38 +27,27 @@ */ package com.jogamp.opengl.util; -import java.nio.Buffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; import com.jogamp.opengl.GL; import com.jogamp.opengl.GLException; import com.jogamp.opengl.fixedfunc.GLMatrixFunc; -import com.jogamp.opengl.GLUniformData; -import com.jogamp.common.nio.Buffers; -import com.jogamp.opengl.math.FloatUtil; -import com.jogamp.opengl.math.Matrix4f; -import com.jogamp.opengl.math.Quaternion; -import com.jogamp.opengl.math.Ray; -import com.jogamp.opengl.math.Recti; -import com.jogamp.opengl.math.Vec3f; -import com.jogamp.opengl.math.Vec4f; -import com.jogamp.opengl.math.geom.AABBox; -import com.jogamp.opengl.math.geom.Frustum; +import com.jogamp.math.FloatUtil; +import com.jogamp.math.Matrix4f; +import com.jogamp.math.Quaternion; +import com.jogamp.math.Recti; +import com.jogamp.math.Vec3f; +import com.jogamp.math.geom.Frustum; +import com.jogamp.math.util.PMVMatrix4f; /** - * PMVMatrix implements a subset of the fixed function pipeline - * regarding the projection (P), modelview (Mv) and texture (T) matrix operations, - * which is specified in {@link GLMatrixFunc}. + * PMVMatrix implements a subset of the fixed function pipeline {@link GLMatrixFunc} + * using {@link PMVMatrix4f}. * <p> - * This is the second implementation of `PMVMatrix` using - * direct {@link Matrix4f}, {@link Vec4f} and {@link Vec3f} math operations instead of `float[]` - * via {@link com.jogamp.opengl.math.FloatUtil FloatUtil}. - * </p> - * <p> - * PMVMatrix provides the {@link #getMviMat() inverse modelview matrix (Mvi)} and - * {@link #getMvitMat() inverse transposed modelview matrix (Mvit)}. + * PMVMatrix provides the {@link #getMvi() inverse modelview matrix (Mvi)} and + * {@link #getMvit() inverse transposed modelview matrix (Mvit)}. * {@link Frustum} is also provided by {@link #getFrustum()}. * * To keep these derived values synchronized after mutable Mv operations like {@link #glRotatef(float, float, float, float) glRotatef(..)} @@ -66,68 +55,11 @@ import com.jogamp.opengl.math.geom.Frustum; * users have to call {@link #update()} before using Mvi and Mvit. * </p> * <p> - * All matrices are provided in column-major order, - * as specified in the OpenGL fixed function pipeline, i.e. compatibility profile. - * See {@link Matrix4f}. - * </p> - * <p> - * PMVMatrix can supplement {@link GL2ES2} applications w/ the + * PMVMatrix can supplement {@link com.jogamp.opengl.GL2ES2 GL2ES2} applications w/ the * lack of the described matrix functionality. * </p> - * <a name="storageDetails"><h5>Matrix storage details</h5></a> - * <p> - * The {@link SyncBuffer} abstraction is provided, e.g. {@link #getSyncPMvMviMat()}, - * to synchronize the respective {@link Matrix4f matrices} with the `float[]` backing store. - * The latter is represents the data to {@link GLUniformData} via its {@link FloatBuffer}s, see {@link SyncBuffer#getBuffer()}, - * and is pushed to the GPU eventually. - * - * {@link SyncBuffer}'s {@link SyncAction} is called by {@link GLUniformData#getBuffer()}, - * i.e. before the data is pushed to the GPU. - * - * The provided {@link SyncAction} ensures that the {@link Matrix4f matrices data} - * gets copied into the `float[]` backing store. - * - * PMVMatrix provides two specializations of {@link SyncBuffer}, {@link SyncMatrix4f} for single {@link Matrix4f} mappings - * and {@link SyncMatrices4f} for multiple {@link Matrix4f} mappings. - * - * They can be feed directly to instantiate a {@link GLUniformData} object via e.g. {@link GLUniformData#GLUniformData(String, int, int, SyncBuffer)}. - * </p> - * <p> - * All matrices are backed up by a common primitive float-array for performance considerations - * and are a {@link Buffers#slice2Float(float[], int, int) sliced} representation of it. - * </p> - * <p> - * <b>Note:</b> - * <ul> - * <li>The matrix is a {@link Buffers#slice2Float(float[], int, int) sliced part } of a host matrix and it's start position has been {@link FloatBuffer#mark() marked}.</li> - * <li>Use {@link FloatBuffer#reset() reset()} to rewind it to it's start position after relative operations, like {@link FloatBuffer#get() get()}.</li> - * <li>If using absolute operations like {@link FloatBuffer#get(int) get(int)}, use it's {@link FloatBuffer#reset() reset} {@link FloatBuffer#position() position} as it's offset.</li> - * </ul> - * </p> */ -public final class PMVMatrix implements GLMatrixFunc { - - /** Bit value stating a modified {@link #getPMat() projection matrix (P)}, since last {@link #update()} call. */ - public static final int MODIFIED_PROJECTION = 1 << 0; - /** Bit value stating a modified {@link #getMvMat() modelview matrix (Mv)}, since last {@link #update()} call. */ - public static final int MODIFIED_MODELVIEW = 1 << 1; - /** Bit value stating a modified {@link #getTMat() texture matrix (T)}, since last {@link #update()} call. */ - public static final int MODIFIED_TEXTURE = 1 << 2; - /** Bit value stating all is modified */ - public static final int MODIFIED_ALL = MODIFIED_PROJECTION | MODIFIED_MODELVIEW | MODIFIED_TEXTURE ; - - /** Bit value for {@link #getMviMat() inverse modelview matrix (Mvi)}, updated via {@link #update()}. */ - public static final int INVERSE_MODELVIEW = 1 << 1; - /** Bit value for {@link #getMvitMat() inverse transposed modelview matrix (Mvit)}, updated via {@link #update()}. */ - public static final int INVERSE_TRANSPOSED_MODELVIEW = 1 << 2; - /** Bit value for {@link #getFrustum() frustum} and updated by {@link #getFrustum()}. */ - public static final int FRUSTUM = 1 << 3; - /** Bit value for {@link #getPMvMat() pre-multiplied P * Mv}, updated by {@link #getPMvMat()}. */ - public static final int PREMUL_PMV = 1 << 4; - /** Bit value for {@link #getPMviMat() pre-multiplied invert(P * Mv)}, updated by {@link #getPMviMat()}. */ - public static final int PREMUL_PMVI = 1 << 5; - /** Manual bits not covered by {@link #update()} but {@link #getFrustum()}, {@link #FRUSTUM}, {@link #getPMvMat()}, {@link #PREMUL_PMV}, {@link #getPMviMat()}, {@link #PREMUL_PMVI}, etc. */ - public static final int MANUAL_BITS = FRUSTUM | PREMUL_PMV | PREMUL_PMVI; +public final class PMVMatrix extends PMVMatrix4f implements GLMatrixFunc { /** * @param matrixModeName One of {@link GLMatrixFunc#GL_MODELVIEW GL_MODELVIEW}, {@link GLMatrixFunc#GL_PROJECTION GL_PROJECTION} or {@link GL#GL_TEXTURE GL_TEXTURE} @@ -227,297 +159,29 @@ public final class PMVMatrix implements GLMatrixFunc { * @see #update() */ public PMVMatrix(final int derivedMatrices) { - // I Identity - // T Texture - // P Projection - // Mv ModelView - // Mvi Modelview-Inverse - // Mvit Modelview-Inverse-Transpose - { - int mask = 0; - if( 0 != ( derivedMatrices & ( INVERSE_MODELVIEW | INVERSE_TRANSPOSED_MODELVIEW ) ) ) { - mask |= INVERSE_MODELVIEW; - } - if( 0 != ( derivedMatrices & INVERSE_TRANSPOSED_MODELVIEW ) ) { - mask |= INVERSE_TRANSPOSED_MODELVIEW; - } - requestBits = mask; - } - - // actual underlying Matrix4f count - int mcount = 3; - - // actual underlying Matrix4f data - matP = new Matrix4f(); - matMv = new Matrix4f(); - matTex = new Matrix4f(); - - if( 0 != ( requestBits & INVERSE_MODELVIEW ) ) { - matMvi = new Matrix4f(); - mMvi_offset = 2*16; - ++mcount; - } else { - matMvi = null; - mMvi_offset = -1; - } - if( 0 != ( requestBits & INVERSE_TRANSPOSED_MODELVIEW ) ) { - matMvit = new Matrix4f(); - mMvit_offset = 3*16; - ++mcount; - } else { - matMvit = null; - mMvit_offset = -1; - } - mTex_offset = (mcount-1)*16; // last one - - // float back buffer for GPU, Matrix4f -> matrixStore via SyncedBuffer - matrixStore = new float[mcount*16]; - - // FloatBuffer for single Matrix4f back-buffer - bufP = Buffers.slice2Float(matrixStore, mP_offset, 1*16); // P - syncP = new SyncBuffer0(matP, bufP); // mP_offset - - bufMv = Buffers.slice2Float(matrixStore, mMv_offset, 1*16); // Mv - syncMv = new SyncBuffer1(matMv, bufMv, mMv_offset); - - bufP_Mv = Buffers.slice2Float(matrixStore, mP_offset, 2*16); // P + Mv - syncP_Mv = new SyncBufferN(new Matrix4f[] { matP, matMv }, bufP_Mv, mP_offset); - - bufTex = Buffers.slice2Float(matrixStore, mTex_offset, 1*16); // T - syncT = new SyncBuffer1(matTex, bufTex, mTex_offset); - - if( null != matMvi ) { - bufMvi = Buffers.slice2Float(matrixStore, mMvi_offset, 1*16); // Mvi - bufP_Mv_Mvi = Buffers.slice2Float(matrixStore, mP_offset, 3*16); // P + Mv + Mvi - syncMvi = new SyncBuffer1U(matMvi, bufMvi, mMvi_offset); - syncP_Mv_Mvi = new SyncBufferNU(new Matrix4f[] { matP, matMv, matMvi }, bufP_Mv_Mvi, mP_offset); - } else { - bufMvi = null; - bufP_Mv_Mvi = null; - syncMvi = null; - syncP_Mv_Mvi = null; - } - if( null != matMvit ) { - bufMvit = Buffers.slice2Float(matrixStore, mMvit_offset, 1*16); // Mvit - bufP_Mv_Mvi_Mvit = Buffers.slice2Float(matrixStore, mP_offset, 4*16); // P + Mv + Mvi + Mvit - syncMvit = new SyncBuffer1U(matMvit, bufMvit, mMvit_offset); - syncP_Mv_Mvi_Mvit = new SyncBufferNU(new Matrix4f[] { matP, matMv, matMvi, matMvit }, bufP_Mv_Mvi_Mvit, mP_offset); - } else { - bufMvit = null; - bufP_Mv_Mvi_Mvit = null; - syncMvit = null; - syncP_Mv_Mvi_Mvit = null; - } - - mat4Tmp1 = new Matrix4f(); - - mat4Tmp2 = null; // on demand - matPMv = null; // on demand - matPMvi = null; // on demand - matPMviOK = false; - frustum = null; // on demand - - reset(); - } - - /** - * Issues {@link #glLoadIdentity()} on all matrices, - * i.e. {@link GLMatrixFunc#GL_MODELVIEW GL_MODELVIEW}, {@link GLMatrixFunc#GL_PROJECTION GL_PROJECTION} or {@link GL#GL_TEXTURE GL_TEXTURE} - * and resets all internal states. - * - * Leaves {@link GLMatrixFunc#GL_MODELVIEW GL_MODELVIEW} the active matrix mode. - */ - public final void reset() { - matP.loadIdentity(); - matMv.loadIdentity(); - matTex.loadIdentity(); - - modifiedBits = MODIFIED_ALL; - dirtyBits = requestBits | MANUAL_BITS; - matrixMode = GL_MODELVIEW; - } - - /** Returns the current matrix-mode, one of {@link GLMatrixFunc#GL_MODELVIEW GL_MODELVIEW}, {@link GLMatrixFunc#GL_PROJECTION GL_PROJECTION} or {@link GL#GL_TEXTURE GL_TEXTURE}. */ - public final int glGetMatrixMode() { - return matrixMode; + super(derivedMatrices); } - // - // Temporary storage access for efficiency - // /** - * Return the second temporary Matrix4f exposed to be reused for efficiency. + * {@inheritDoc} * <p> - * Temporary storage is only used by this class within single method calls, - * hence has no side-effects. + * Leaves {@link GLMatrixFunc#GL_MODELVIEW GL_MODELVIEW} the active matrix mode. * </p> */ - private final Matrix4f getTmp2Mat() { - if( null == mat4Tmp2 ) { - mat4Tmp2 = new Matrix4f(); - } - return mat4Tmp2; + @Override + public void reset() { + super.reset(); + matrixMode = GL_MODELVIEW; } // - // Regular Matrix4f access as well as their SyncedBuffer counterpart SyncedMatrix and SyncedMatrices + // GLMatrixFunc implementation // - /** - * Returns the {@link GLMatrixFunc#GL_TEXTURE_MATRIX texture matrix} (T). - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - */ - public final Matrix4f getTMat() { - return matTex; - } - - /** - * Returns the {@link SyncMatrix} of {@link GLMatrixFunc#GL_TEXTURE_MATRIX texture matrix} (T). - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - */ - public final SyncMatrix4f getSyncTMat() { - return syncT; - } - - /** - * Returns the {@link GLMatrixFunc#GL_PROJECTION_MATRIX projection matrix} (P). - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - */ - public final Matrix4f getPMat() { - return matP; - } - - /** - * Returns the {@link SyncMatrix} of {@link GLMatrixFunc#GL_PROJECTION_MATRIX projection matrix} (P). - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - */ - public final SyncMatrix4f getSyncPMat() { - return syncP; - } - - /** - * Returns the {@link GLMatrixFunc#GL_MODELVIEW_MATRIX modelview matrix} (Mv). - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - */ - public final Matrix4f getMvMat() { - return matMv; - } - - /** - * Returns the {@link SyncMatrix} of {@link GLMatrixFunc#GL_MODELVIEW_MATRIX modelview matrix} (Mv). - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - */ - public final SyncMatrix4f getSyncMvMat() { - return syncMv; - } - - /** - * Returns {@link SyncMatrices4f} of 2 matrices within one FloatBuffer: {@link #getPMat() P} and {@link #getMvMat() Mv}. - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - */ - public final SyncMatrices4f getSyncPMvMat() { - return syncP_Mv; - } - - /** - * Returns the inverse {@link GLMatrixFunc#GL_MODELVIEW_MATRIX modelview matrix} (Mvi) if requested. - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - * @throws IllegalArgumentException if {@link #INVERSE_MODELVIEW} has not been requested in ctor {@link #PMVMatrix(int)}. - */ - public final Matrix4f getMviMat() { - if( 0 == ( INVERSE_MODELVIEW & requestBits ) ) { - throw new IllegalArgumentException("Not requested in ctor"); - } - updateImpl(false); - return matMvi; - } - - /** - * Returns the {@link SyncMatrix} of inverse {@link GLMatrixFunc#GL_MODELVIEW_MATRIX modelview matrix} (Mvi) if requested. - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - * @throws IllegalArgumentException if {@link #INVERSE_MODELVIEW} has not been requested in ctor {@link #PMVMatrix(int)}. - */ - public final SyncMatrix4f getSyncMviMat() { - if( 0 == ( INVERSE_MODELVIEW & requestBits ) ) { - throw new IllegalArgumentException("Not requested in ctor"); - } - return syncMvi; - } - - /** - * Returns the inverse transposed {@link GLMatrixFunc#GL_MODELVIEW_MATRIX modelview matrix} (Mvit) if requested. - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - * @throws IllegalArgumentException if {@link #INVERSE_TRANSPOSED_MODELVIEW} has not been requested in ctor {@link #PMVMatrix(int)}. - */ - public final Matrix4f getMvitMat() { - if( 0 == ( INVERSE_TRANSPOSED_MODELVIEW & requestBits ) ) { - throw new IllegalArgumentException("Not requested in ctor"); - } - updateImpl(false); - return matMvit; - } - - /** - * Returns the {@link SyncMatrix} of inverse transposed {@link GLMatrixFunc#GL_MODELVIEW_MATRIX modelview matrix} (Mvit) if requested. - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - * @throws IllegalArgumentException if {@link #INVERSE_TRANSPOSED_MODELVIEW} has not been requested in ctor {@link #PMVMatrix(int)}. - */ - public final SyncMatrix4f getSyncMvitMat() { - if( 0 == ( INVERSE_TRANSPOSED_MODELVIEW & requestBits ) ) { - throw new IllegalArgumentException("Not requested in ctor"); - } - return syncMvit; - } - - /** - * Returns {@link SyncMatrices4f} of 3 matrices within one FloatBuffer: {@link #getPMat() P}, {@link #getMvMat() Mv} and {@link #getMviMat() Mvi} if requested. - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - * @throws IllegalArgumentException if {@link #INVERSE_MODELVIEW} has not been requested in ctor {@link #PMVMatrix(int)}. - */ - public final SyncMatrices4f getSyncPMvMviMat() { - if( 0 == ( INVERSE_MODELVIEW & requestBits ) ) { - throw new IllegalArgumentException("Not requested in ctor"); - } - return syncP_Mv_Mvi; - } - - /** - * Returns {@link SyncMatrices4f} of 4 matrices within one FloatBuffer: {@link #getPMat() P}, {@link #getMvMat() Mv}, {@link #getMviMat() Mvi} and {@link #getMvitMat() Mvit} if requested. - * <p> - * See <a href="#storageDetails"> matrix storage details</a>. - * </p> - * @throws IllegalArgumentException if {@link #INVERSE_TRANSPOSED_MODELVIEW} has not been requested in ctor {@link #PMVMatrix(int)}. - */ - public final SyncMatrices4f getSyncPMvMviMvitMat() { - if( 0 == ( INVERSE_TRANSPOSED_MODELVIEW & requestBits ) ) { - throw new IllegalArgumentException("Not requested in ctor"); - } - return syncP_Mv_Mvi_Mvit; + /** Returns the current matrix-mode, one of {@link GLMatrixFunc#GL_MODELVIEW GL_MODELVIEW}, {@link GLMatrixFunc#GL_PROJECTION GL_PROJECTION} or {@link GL#GL_TEXTURE GL_TEXTURE}. */ + public final int glGetMatrixMode() { + return matrixMode; } /** @@ -550,172 +214,6 @@ public final class PMVMatrix implements GLMatrixFunc { } } - // - // Basic Matrix4f, Vec3f and Vec4f operations similar to GLMatrixFunc - // - - /** - * Multiplies the {@link #getPMat() P} and {@link #getMvMat() Mv} matrix, i.e. - * <pre> - * result = P x Mv - * </pre> - * @param result 4x4 matrix storage for result - * @return given result matrix for chaining - */ - public final Matrix4f mulPMvMat(final Matrix4f result) { - return result.mul(matP, matMv); - } - - /** - * Multiplies the {@link #getMvMat() Mv} and {@link #getPMat() P} matrix, i.e. - * <pre> - * result = Mv x P - * </pre> - * @param result 4x4 matrix storage for result - * @return given result matrix for chaining - */ - public final Matrix4f mulMvPMat(final Matrix4f result) { - return result.mul(matMv, matP); - } - - /** - * v_out = Mv * v_in - * @param v_in input vector, can be v_out for in-place transformation - * @param v_out output vector - * @returns v_out for chaining - */ - public final Vec4f mulMvMatVec4f(final Vec4f v_in, final Vec4f v_out) { - return matMv.mulVec4f(v_in, v_out); - } - - /** - * v_inout = Mv * v_inout - * @param v_inout input and output vector, i.e. in-place transformation - * @returns v_inout for chaining - */ - public final Vec4f mulMvMatVec4f(final Vec4f v_inout) { - return matMv.mulVec4f(v_inout); - } - - /** - * v_out = Mv * v_in - * - * Affine 3f-vector transformation by 4x4 matrix, see {@link Matrix4f#mulVec3f(Vec3f, Vec3f)}. - * - * @param v_in input vector, can be v_out for in-place transformation - * @param v_out output vector - * @returns v_out for chaining - */ - public final Vec3f mulMvMatVec3f(final Vec3f v_in, final Vec3f v_out) { - return matMv.mulVec3f(v_in, v_out); - } - - /** - * v_inout = Mv * v_inout - * - * Affine 3f-vector transformation by 4x4 matrix, see {@link Matrix4f#mulVec3f(Vec3f, Vec3f)}. - * - * @param v_inout input and output vector, i.e. in-place transformation - * @returns v_inout for chaining - */ - public final Vec3f mulMvMatVec3f(final Vec3f v_inout) { - return matMv.mulVec3f(v_inout); - } - - /** - * v_out = P * v_in - * @param v_in input vector, can be v_out for in-place transformation - * @param v_out output vector - * @return given result vector for chaining - * @returns v_out for chaining - */ - public final Vec4f mulPMatVec4f(final Vec4f v_in, final Vec4f v_out) { - return matP.mulVec4f(v_in, v_out); - } - - /** - * v_inout = P * v_inout - * @param v_inout input and output vector, i.e. in-place transformation - * @return given result vector for chaining - * @returns v_inout for chaining - */ - public final Vec4f mulPMatVec4f(final Vec4f v_inout) { - return matP.mulVec4f(v_inout); - } - - /** - * v_out = P * v_in - * - * Affine 3f-vector transformation by 4x4 matrix, see {@link Matrix4f#mulVec3f(Vec3f, Vec3f)}. - * - * @param v_in float[3] input vector, can be v_out for in-place transformation - * @param v_out float[3] output vector - * @returns v_out for chaining - */ - public final Vec3f mulPMatVec3f(final Vec3f v_in, final Vec3f v_out) { - return matP.mulVec3f(v_in, v_out); - } - - /** - * v_inout = P * v_inout - * - * Affine 3f-vector transformation by 4x4 matrix, see {@link Matrix4f#mulVec3f(Vec3f, Vec3f)}. - * - * @param v_inout input and output vector, i.e. in-place transformation - * @returns v_inout for chaining - */ - public final Vec3f mulPMatVec3f(final Vec3f v_inout) { - return matP.mulVec3f(v_inout); - } - - /** - * v_out = P * Mv * v_in - * @param v_in float[4] input vector, can be v_out for in-place transformation - * @param v_out float[4] output vector - * @returns v_out for chaining - */ - public final Vec4f mulPMvMatVec4f(final Vec4f v_in, final Vec4f v_out) { - return matP.mulVec4f( matMv.mulVec4f( v_in, v_out ) ); - } - - /** - * v_inout = P * Mv * v_inout - * @param v_inout input and output vector, i.e. in-place transformation - * @returns v_inout for chaining - */ - public final Vec4f mulPMvMatVec4f(final Vec4f v_inout) { - return matP.mulVec4f( matMv.mulVec4f( v_inout ) ); - } - - /** - * v_out = P * Mv * v_in - * - * Affine 3f-vector transformation by 4x4 matrix, see {@link Matrix4f#mulVec3f(Vec3f, Vec3f)}. - * - * @param v_in float[3] input vector, can be v_out for in-place transformation - * @param v_out float[3] output vector - * @returns v_out for chaining - */ - public final Vec3f mulPMvMatVec3f(final Vec3f v_in, final Vec3f v_out) { - return matP.mulVec3f( matMv.mulVec3f( v_in, v_out ) ); - } - - /** - * v_inout = P * Mv * v_inout - * - * Affine 3f-vector transformation by 4x4 matrix, see {@link Matrix4f#mulVec3f(Vec3f, Vec3f)}. - * - * @param v_inout float[3] input and output vector, i.e. in-place transformation - * @returns v_inout for chaining - */ - public final Vec3f mulPMvMatVec3f(final Vec3f v_inout) { - return matP.mulVec3f( matMv.mulVec3f( v_inout ) ); - } - - // - // GLMatrixFunc implementation - // - @Override public final void glMatrixMode(final int matrixName) { switch(matrixName) { @@ -772,35 +270,23 @@ public final class PMVMatrix implements GLMatrixFunc { @Override public final void glLoadMatrixf(final float[] values, final int offset) { if(matrixMode==GL_MODELVIEW) { - matMv.load(values, offset); - dirtyBits |= requestBits | MANUAL_BITS ; - modifiedBits |= MODIFIED_MODELVIEW; + loadMv(values, offset); } else if(matrixMode==GL_PROJECTION) { - matP.load(values, offset); - dirtyBits |= MANUAL_BITS ; - modifiedBits |= MODIFIED_PROJECTION; + loadP(values, offset); } else if(matrixMode==GL.GL_TEXTURE) { - matTex.load(values, offset); - modifiedBits |= MODIFIED_TEXTURE; + loadT(values, offset); } } @Override public final void glLoadMatrixf(final java.nio.FloatBuffer m) { - final int spos = m.position(); if(matrixMode==GL_MODELVIEW) { - matMv.load(m); - dirtyBits |= requestBits | MANUAL_BITS ; - modifiedBits |= MODIFIED_MODELVIEW; + loadMv(m); } else if(matrixMode==GL_PROJECTION) { - matP.load(m); - dirtyBits |= MANUAL_BITS ; - modifiedBits |= MODIFIED_PROJECTION; + loadP(m); } else if(matrixMode==GL.GL_TEXTURE) { - matTex.load(m); - modifiedBits |= MODIFIED_TEXTURE; + loadT(m); } - m.position(spos); } /** @@ -811,16 +297,11 @@ public final class PMVMatrix implements GLMatrixFunc { */ public final void glLoadMatrixf(final Matrix4f m) { if(matrixMode==GL_MODELVIEW) { - matMv.load(m); - dirtyBits |= requestBits | MANUAL_BITS ; - modifiedBits |= MODIFIED_MODELVIEW; + loadMv(m); } else if(matrixMode==GL_PROJECTION) { - matP.load(m); - dirtyBits |= MANUAL_BITS ; - modifiedBits |= MODIFIED_PROJECTION; + loadP(m); } else if(matrixMode==GL.GL_TEXTURE) { - matTex.load(m); - modifiedBits |= MODIFIED_TEXTURE; + loadT(m); } } @@ -832,59 +313,22 @@ public final class PMVMatrix implements GLMatrixFunc { */ public final void glLoadMatrix(final Quaternion quat) { if(matrixMode==GL_MODELVIEW) { - matMv.setToRotation(quat); - dirtyBits |= requestBits | MANUAL_BITS ; - modifiedBits |= MODIFIED_MODELVIEW; + loadMv(quat); } else if(matrixMode==GL_PROJECTION) { - matP.setToRotation(quat); - dirtyBits |= MANUAL_BITS ; - modifiedBits |= MODIFIED_PROJECTION; + loadP(quat); } else if(matrixMode==GL.GL_TEXTURE) { - matTex.setToRotation(quat); - modifiedBits |= MODIFIED_TEXTURE; - } - } - - @Override - public final void glPopMatrix() { - if(matrixMode==GL_MODELVIEW) { - matMv.pop(); - dirtyBits |= requestBits | MANUAL_BITS ; - modifiedBits |= MODIFIED_MODELVIEW; - } else if(matrixMode==GL_PROJECTION) { - matP.pop(); - dirtyBits |= MANUAL_BITS ; - modifiedBits |= MODIFIED_PROJECTION; - } else if(matrixMode==GL.GL_TEXTURE) { - matTex.pop(); - modifiedBits |= MODIFIED_TEXTURE; - } - } - - @Override - public final void glPushMatrix() { - if(matrixMode==GL_MODELVIEW) { - matMv.push(); - } else if(matrixMode==GL_PROJECTION) { - matP.push(); - } else if(matrixMode==GL.GL_TEXTURE) { - matTex.push(); + loadT(quat); } } @Override public final void glLoadIdentity() { if(matrixMode==GL_MODELVIEW) { - matMv.loadIdentity(); - dirtyBits |= requestBits | MANUAL_BITS ; - modifiedBits |= MODIFIED_MODELVIEW; + loadMvIdentity(); } else if(matrixMode==GL_PROJECTION) { - matP.loadIdentity(); - dirtyBits |= MANUAL_BITS ; - modifiedBits |= MODIFIED_PROJECTION; + loadPIdentity(); } else if(matrixMode==GL.GL_TEXTURE) { - matTex.loadIdentity(); - modifiedBits |= MODIFIED_TEXTURE; + loadTIdentity(); } } @@ -892,16 +336,11 @@ public final class PMVMatrix implements GLMatrixFunc { public final void glMultMatrixf(final FloatBuffer m) { final int spos = m.position(); if(matrixMode==GL_MODELVIEW) { - matMv.mul( mat4Tmp1.load( m ) ); - dirtyBits |= requestBits | MANUAL_BITS ; - modifiedBits |= MODIFIED_MODELVIEW; + mulMv( mat4Tmp1.load( m ) ); } else if(matrixMode==GL_PROJECTION) { - matP.mul( mat4Tmp1.load( m ) ); - dirtyBits |= MANUAL_BITS ; - modifiedBits |= MODIFIED_PROJECTION; + mulP( mat4Tmp1.load( m ) ); } else if(matrixMode==GL.GL_TEXTURE) { - matTex.mul( mat4Tmp1.load( m ) ); - modifiedBits |= MODIFIED_TEXTURE; + mulT( mat4Tmp1.load( m ) ); } m.position(spos); } @@ -909,16 +348,11 @@ public final class PMVMatrix implements GLMatrixFunc { @Override public final void glMultMatrixf(final float[] m, final int m_offset) { if(matrixMode==GL_MODELVIEW) { - matMv.mul( mat4Tmp1.load( m, m_offset ) ); - dirtyBits |= requestBits | MANUAL_BITS ; - modifiedBits |= MODIFIED_MODELVIEW; + mulMv( mat4Tmp1.load( m, m_offset ) ); } else if(matrixMode==GL_PROJECTION) { - matP.mul( mat4Tmp1.load( m, m_offset ) ); - dirtyBits |= MANUAL_BITS ; - modifiedBits |= MODIFIED_PROJECTION; + mulP( mat4Tmp1.load( m, m_offset ) ); } else if(matrixMode==GL.GL_TEXTURE) { - matTex.mul( mat4Tmp1.load( m, m_offset ) ); - modifiedBits |= MODIFIED_TEXTURE; + mulT( mat4Tmp1.load( m, m_offset ) ); } } @@ -932,16 +366,11 @@ public final class PMVMatrix implements GLMatrixFunc { */ public final PMVMatrix glMultMatrixf(final Matrix4f m) { if(matrixMode==GL_MODELVIEW) { - matMv.mul( m ); - dirtyBits |= requestBits | MANUAL_BITS ; - modifiedBits |= MODIFIED_MODELVIEW; + mulMv(m); } else if(matrixMode==GL_PROJECTION) { - matP.mul( m ); - dirtyBits |= MANUAL_BITS ; - modifiedBits |= MODIFIED_PROJECTION; + mulP(m); } else if(matrixMode==GL.GL_TEXTURE) { - matTex.mul( m ); - modifiedBits |= MODIFIED_TEXTURE; + mulT(m); } return this; } @@ -1015,6 +444,28 @@ public final class PMVMatrix implements GLMatrixFunc { } @Override + public final void glPopMatrix() { + if(matrixMode==GL_MODELVIEW) { + popMv(); + } else if(matrixMode==GL_PROJECTION) { + popP(); + } else if(matrixMode==GL.GL_TEXTURE) { + popT(); + } + } + + @Override + public final void glPushMatrix() { + if(matrixMode==GL_MODELVIEW) { + pushMv(); + } else if(matrixMode==GL_PROJECTION) { + pushP(); + } else if(matrixMode==GL.GL_TEXTURE) { + pushT(); + } + } + + @Override public final void glOrthof(final float left, final float right, final float bottom, final float top, final float zNear, final float zFar) { glMultMatrixf( mat4Tmp1.setToOrtho(left, right, bottom, top, zNear, zFar) ); } @@ -1022,12 +473,12 @@ public final class PMVMatrix implements GLMatrixFunc { /** * {@inheritDoc} * - * @throws GLException if {@code zNear <= 0} or {@code zFar <= zNear} - * or {@code left == right}, or {@code bottom == top}. + * @throws IllegalArgumentException if {@code zNear <= 0} or {@code zFar <= zNear} + * or {@code left == right}, or {@code bottom == top}. * @see Matrix4f#setToFrustum(float, float, float, float, float, float) */ @Override - public final void glFrustumf(final float left, final float right, final float bottom, final float top, final float zNear, final float zFar) throws GLException { + public final void glFrustumf(final float left, final float right, final float bottom, final float top, final float zNear, final float zFar) throws IllegalArgumentException { glMultMatrixf( mat4Tmp1.setToFrustum(left, right, bottom, top, zNear, zFar) ); } @@ -1042,111 +493,22 @@ public final class PMVMatrix implements GLMatrixFunc { * @param aspect aspect ratio width / height * @param zNear * @param zFar - * @throws GLException if {@code zNear <= 0} or {@code zFar <= zNear} + * @throws IllegalArgumentException if {@code zNear <= 0} or {@code zFar <= zNear} * @see Matrix4f#setToPerspective(float, float, float, float) */ - public final void gluPerspective(final float fovy_rad, final float aspect, final float zNear, final float zFar) throws GLException { + public final void gluPerspective(final float fovy_rad, final float aspect, final float zNear, final float zFar) throws IllegalArgumentException { glMultMatrixf( mat4Tmp1.setToPerspective(fovy_rad, aspect, zNear, zFar) ); } /** - * {@link #glMultMatrixf(FloatBuffer) Multiply} and {@link #glTranslatef(float, float, float) translate} the {@link #glGetMatrixMode() current matrix} - * with the eye, object and orientation. + * {@link #glMultMatrixf(FloatBuffer) Multiply} the {@link #glGetMatrixMode() current matrix} + * with the eye, object and orientation, i.e. {@link Matrix4f#setToLookAt(Vec3f, Vec3f, Vec3f, Matrix4f)}. */ public final void gluLookAt(final Vec3f eye, final Vec3f center, final Vec3f up) { glMultMatrixf( mat4Tmp1.setToLookAt(eye, center, up, getTmp2Mat()) ); } /** - * Map object coordinates to window coordinates. - * <p> - * Traditional <code>gluProject</code> implementation. - * </p> - * - * @param objPos 3 component object coordinate - * @param viewport Rect4i viewport - * @param winPos 3 component window coordinate, the result - * @return true if successful, otherwise false (z is 1) - */ - public final boolean gluProject(final Vec3f objPos, final Recti viewport, final Vec3f winPos ) { - return Matrix4f.mapObjToWin(objPos, matMv, matP, viewport, winPos); - } - - /** - * Map window coordinates to object coordinates. - * <p> - * Traditional <code>gluUnProject</code> implementation. - * </p> - * - * @param winx - * @param winy - * @param winz - * @param viewport Rect4i viewport - * @param objPos 3 component object coordinate, the result - * @return true if successful, otherwise false (failed to invert matrix, or becomes infinity due to zero z) - */ - public final boolean gluUnProject(final float winx, final float winy, final float winz, - final Recti viewport, final Vec3f objPos) { - if( Matrix4f.mapWinToObj(winx, winy, winz, getPMviMat(), viewport, objPos) ) { - return true; - } else { - return false; - } - } - - /** - * Map window coordinates to object coordinates. - * <p> - * Traditional <code>gluUnProject4</code> implementation. - * </p> - * - * @param winx - * @param winy - * @param winz - * @param clipw - * @param viewport Rect4i viewport - * @param near - * @param far - * @param objPos 4 component object coordinate, the result - * @return true if successful, otherwise false (failed to invert matrix, or becomes infinity due to zero z) - */ - public boolean gluUnProject4(final float winx, final float winy, final float winz, final float clipw, - final Recti viewport, - final float near, final float far, - final Vec4f objPos) { - if( Matrix4f.mapWinToObj4(winx, winy, winz, clipw, getPMviMat(), viewport, near, far, objPos) ) { - return true; - } else { - return false; - } - } - - /** - * Map two window coordinates w/ shared X/Y and distinctive Z - * to a {@link Ray}. The resulting {@link Ray} maybe used for <i>picking</i> - * using a {@link AABBox#getRayIntersection(Vec3f, Ray, float, boolean) bounding box}. - * <p> - * Notes for picking <i>winz0</i> and <i>winz1</i>: - * <ul> - * <li>see {@link FloatUtil#getZBufferEpsilon(int, float, float)}</li> - * <li>see {@link FloatUtil#getZBufferValue(int, float, float, float)}</li> - * <li>see {@link FloatUtil#getOrthoWinZ(float, float, float)}</li> - * </ul> - * </p> - * @param winx - * @param winy - * @param winz0 - * @param winz1 - * @param viewport - * @param ray storage for the resulting {@link Ray} - * @return true if successful, otherwise false (failed to invert matrix, or becomes z is infinity) - */ - public final boolean gluUnProjectRay(final float winx, final float winy, final float winz0, final float winz1, - final Recti viewport, final Ray ray) { - return Matrix4f.mapWinToRay(winx, winy, winz0, winz1, getPMviMat(), viewport, ray); - } - - /** * Make given matrix the <i>pick</i> matrix based on given parameters. * <p> * Traditional <code>gluPickMatrix</code> implementation. @@ -1160,495 +522,15 @@ public final class PMVMatrix implements GLMatrixFunc { * @param deltaY the height of the picking region in window coordinates. * @param viewport Rect4i viewport vector */ - public final void gluPickMatrix(final float x, final float y, - final float deltaX, final float deltaY, final Recti viewport) { + public final void gluPickMatrix(final float x, final float y, final float deltaX, final float deltaY, final Recti viewport) { if( null != mat4Tmp1.setToPick(x, y, deltaX, deltaY, viewport, getTmp2Mat()) ) { glMultMatrixf( mat4Tmp1 ); } } - public StringBuilder toString(StringBuilder sb, final String f) { - if(null == sb) { - sb = new StringBuilder(); - } - final boolean pmvDirty = 0 != (PREMUL_PMV & dirtyBits); - final boolean pmvUsed = null != matPMv; - - final boolean pmviDirty = 0 != (PREMUL_PMVI & dirtyBits); - final boolean pmviUsed = null != matPMvi; - - final boolean frustumDirty = 0 != (FRUSTUM & dirtyBits); - final boolean frustumUsed = null != frustum; - - final boolean mviDirty = 0 != (INVERSE_MODELVIEW & dirtyBits); - final boolean mviReq = 0 != (INVERSE_MODELVIEW & requestBits); - - final boolean mvitDirty = 0 != (INVERSE_TRANSPOSED_MODELVIEW & dirtyBits); - final boolean mvitReq = 0 != (INVERSE_TRANSPOSED_MODELVIEW & requestBits); - - final boolean modP = 0 != ( MODIFIED_PROJECTION & modifiedBits ); - final boolean modMv = 0 != ( MODIFIED_MODELVIEW & modifiedBits ); - final boolean modT = 0 != ( MODIFIED_TEXTURE & modifiedBits ); - int count = 3; // P, Mv, T - - sb.append("PMVMatrix[modified[P ").append(modP).append(", Mv ").append(modMv).append(", T ").append(modT); - sb.append("], dirty/used[PMv ").append(pmvDirty).append("/").append(pmvUsed).append(", Pmvi ").append(pmviDirty).append("/").append(pmviUsed).append(", Frustum ").append(frustumDirty).append("/").append(frustumUsed); - sb.append("], dirty/req[Mvi ").append(mviDirty).append("/").append(mviReq).append(", Mvit ").append(mvitDirty).append("/").append(mvitReq).append("]").append(System.lineSeparator()); - sb.append(", Projection").append(System.lineSeparator()); - matP.toString(sb, null, f); - sb.append(", Modelview").append(System.lineSeparator()); - matMv.toString(sb, null, f); - sb.append(", Texture").append(System.lineSeparator()); - matTex.toString(sb, null, f); - if( null != matPMv ) { - sb.append(", P * Mv").append(System.lineSeparator()); - matPMv.toString(sb, null, f); - ++count; - } - if( null != matPMvi ) { - sb.append(", P * Mv").append(System.lineSeparator()); - matPMvi.toString(sb, null, f); - ++count; - } - if( mviReq ) { - sb.append(", Inverse Modelview").append(System.lineSeparator()); - matMvi.toString(sb, null, f); - ++count; - } - if( mvitReq ) { - sb.append(", Inverse Transposed Modelview").append(System.lineSeparator()); - matMvit.toString(sb, null, f); - ++count; - } - int tmpCount = 1; - if( null != mat4Tmp2 ) { - ++tmpCount; - } - sb.append(", matrices "+count+" + "+tmpCount+" temp = "+(count+tmpCount)+"]"); - return sb; - } - - @Override - public String toString() { - return toString(null, "%10.5f").toString(); - } - - /** - * Returns the modified bits due to mutable operations.. - * <p> - * A modified bit is set, if the corresponding matrix had been modified by a mutable operation - * since last {@link #update()} or {@link #getModifiedBits(boolean) getModifiedBits(true)} call. - * </p> - * @param clear if true, clears the modified bits, otherwise leaves them untouched. - * - * @see #MODIFIED_PROJECTION - * @see #MODIFIED_MODELVIEW - * @see #MODIFIED_TEXTURE - * @see #getDirtyBits() - * @see #isReqDirty() - */ - public final int getModifiedBits(final boolean clear) { - final int r = modifiedBits; - if(clear) { - modifiedBits = 0; - } - return r; - } - - /** - * Returns the dirty bits due to mutable operations, - * i.e. - * - {@link #INVERSE_MODELVIEW} (if requested) - * - {@link #INVERSE_TRANSPOSED_MODELVIEW} (if requested) - * - {@link #FRUSTUM} (always, cleared via {@link #getFrustum()} - * <p> - * A dirty bit is set, if the corresponding matrix had been modified by a mutable operation - * since last {@link #update()} call and requested in the constructor {@link #PMVMatrix(int)}. - * </p> - * <p> - * {@link #update()} clears the dirty state for the matrices and {@link #getFrustum()} for {@link #FRUSTUM}. - * </p> - * - * @see #isReqDirty() - * @see #INVERSE_MODELVIEW - * @see #INVERSE_TRANSPOSED_MODELVIEW - * @see #FRUSTUM - * @see #PMVMatrix(int) - * @see #getMviMat() - * @see #getMvitMat() - * @see #getSyncPMvMviMat() - * @see #getSyncPMvMviMvitMat() - * @see #getFrustum() - */ - public final int getDirtyBits() { - return dirtyBits; - } - - /** - * Returns true if the one of the {@link #getReqBits() requested bits} are are set dirty due to mutable operations, - * i.e. at least one of - * - {@link #INVERSE_MODELVIEW} - * - {@link #INVERSE_TRANSPOSED_MODELVIEW} - * <p> - * A dirty bit is set, if the corresponding matrix had been modified by a mutable operation - * since last {@link #update()} call and requested in the constructor {@link #PMVMatrix(int)}. - * </p> - * <p> - * {@link #update()} clears the dirty state for the matrices and {@link #getFrustum()} for {@link #FRUSTUM}. - * </p> - * - * @see #INVERSE_MODELVIEW - * @see #INVERSE_TRANSPOSED_MODELVIEW - * @see #PMVMatrix(int) - * @see #getMviMat() - * @see #getMvitMat() - * @see #getSyncPMvMviMat() - * @see #getSyncPMvMviMvitMat() - */ - public final boolean isReqDirty() { - return 0 != ( requestBits & dirtyBits ); - } - - /** - * Returns the request bit mask, which uses bit values equal to the dirty mask - * and may contain - * - {@link #INVERSE_MODELVIEW} - * - {@link #INVERSE_TRANSPOSED_MODELVIEW} - * <p> - * The request bit mask is set by in the constructor {@link #PMVMatrix(int)}. - * </p> - * - * @see #INVERSE_MODELVIEW - * @see #INVERSE_TRANSPOSED_MODELVIEW - * @see #PMVMatrix(int) - * @see #getMviMat() - * @see #getMvitMat() - * @see #getSyncPMvMviMat() - * @see #getSyncPMvMviMvitMat() - * @see #getFrustum() - */ - public final int getReqBits() { - return requestBits; - } - - /** - * Returns the pre-multiplied projection x modelview, P x Mv. - * <p> - * This {@link Matrix4f} instance should be re-fetched via this method and not locally stored - * to have it updated from a potential modification of underlying projection and/or modelview matrix. - * {@link #update()} has no effect on this {@link Matrix4f}. - * </p> - * <p> - * This pre-multipled P x Mv is considered dirty, if its corresponding - * {@link #getPMat() P matrix} or {@link #getMvMat() Mv matrix} has been modified since its last update. - * </p> - * @see #update() - */ - public final Matrix4f getPMvMat() { - if( 0 != ( dirtyBits & PREMUL_PMV ) ) { - if( null == matPMv ) { - matPMv = new Matrix4f(); - } - matPMv.mul(matP, matMv); - dirtyBits &= ~PREMUL_PMV; - } - return matPMv; - } - - /** - * Returns the pre-multiplied inverse projection x modelview, - * if {@link Matrix4f#invert(Matrix4f)} succeeded, otherwise `null`. - * <p> - * This {@link Matrix4f} instance should be re-fetched via this method and not locally stored - * to have it updated from a potential modification of underlying projection and/or modelview matrix. - * {@link #update()} has no effect on this {@link Matrix4f}. - * </p> - * <p> - * This pre-multipled invert(P x Mv) is considered dirty, if its corresponding - * {@link #getPMat() P matrix} or {@link #getMvMat() Mv matrix} has been modified since its last update. - * </p> - * @see #update() - */ - public final Matrix4f getPMviMat() { - if( 0 != ( dirtyBits & PREMUL_PMVI ) ) { - if( null == matPMvi ) { - matPMvi = new Matrix4f(); - } - final Matrix4f mPMv = getPMvMat(); - matPMviOK = matPMvi.invert(mPMv); - dirtyBits &= ~PREMUL_PMVI; - } - return matPMviOK ? matPMvi : null; - } - - /** - * Returns the frustum, derived from projection x modelview. - * <p> - * This {@link Frustum} instance should be re-fetched via this method and not locally stored - * to have it updated from a potential modification of underlying projection and/or modelview matrix. - * {@link #update()} has no effect on this {@link Frustum}. - * </p> - * <p> - * The {@link Frustum} is considered dirty, if its corresponding - * {@link #getPMat() P matrix} or {@link #getMvMat() Mv matrix} has been modified since its last update. - * </p> - * @see #update() - */ - public final Frustum getFrustum() { - if( 0 != ( dirtyBits & FRUSTUM ) ) { - if( null == frustum ) { - frustum = new Frustum(); - } - final Matrix4f mPMv = getPMvMat(); - frustum.updateFrustumPlanes(mPMv); - dirtyBits &= ~FRUSTUM; - } - return frustum; - } - - /** - * Update the derived {@link #getMviMat() inverse modelview (Mvi)}, - * {@link #getMvitMat() inverse transposed modelview (Mvit)} matrices - * <b>if</b> they {@link #isReqDirty() are dirty} <b>and</b> - * requested via the constructor {@link #PMVMatrix(int)}.<br/> - * Hence updates the following dirty bits. - * - {@link #INVERSE_MODELVIEW} - * - {@link #INVERSE_TRANSPOSED_MODELVIEW} - * <p> - * The {@link Frustum} is updated only via {@link #getFrustum()} separately. - * </p> - * <p> - * The Mvi and Mvit matrices are considered dirty, if their corresponding - * {@link #getMvMat() Mv matrix} has been modified since their last update. - * </p> - * <p> - * Method is automatically called by {@link SyncMatrix4f} and {@link SyncMatrices4f} - * instances {@link SyncAction} as retrieved by e.g. {@link #getSyncMvitMat()}. - * This ensures an automatic update cycle if used with {@link GLUniformData}. - * </p> - * <p> - * Method may be called manually in case mutable operations has been called - * and caller operates on already fetched references, i.e. not calling - * {@link #getMviMat()}, {@link #getMvitMat()} anymore. - * </p> - * <p> - * Method clears the modified bits like {@link #getModifiedBits(boolean) getModifiedBits(true)}, - * which are set by any mutable operation. The modified bits have no impact - * on this method, but the return value. - * </p> - * - * @return true if any matrix has been modified since last update call or - * if the derived matrices Mvi and Mvit were updated, otherwise false. - * In other words, method returns true if any matrix used by the caller must be updated, - * e.g. uniforms in a shader program. - * - * @see #getModifiedBits(boolean) - * @see #isReqDirty() - * @see #INVERSE_MODELVIEW - * @see #INVERSE_TRANSPOSED_MODELVIEW - * @see #PMVMatrix(int) - * @see #getMviMat() - * @see #getMvitMat() - * @see #getSyncPMvMviMat() - * @see #getSyncPMvMviMvitMat() - */ - public final boolean update() { - return updateImpl(true); - } - // // private // - private final boolean updateImpl(final boolean clearModBits) { - boolean mod = 0 != modifiedBits; - if( clearModBits ) { - modifiedBits = 0; - } - if( 0 != ( requestBits & ( ( dirtyBits & ( INVERSE_MODELVIEW | INVERSE_TRANSPOSED_MODELVIEW ) ) ) ) ) { // only if dirt requested & dirty - if( !matMvi.invert(matMv) ) { - throw new GLException(msgCantComputeInverse); - } - dirtyBits &= ~INVERSE_MODELVIEW; - mod = true; - } - if( 0 != ( requestBits & ( dirtyBits & INVERSE_TRANSPOSED_MODELVIEW ) ) ) { // only if requested & dirty - matMvit.transpose(matMvi); - dirtyBits &= ~INVERSE_TRANSPOSED_MODELVIEW; - mod = true; - } - return mod; - } - private static final String msgCantComputeInverse = "Invalid source Mv matrix, can't compute inverse"; - - private final Matrix4f matP; - private final Matrix4f matMv; - private final Matrix4f matTex; - - private final Matrix4f matMvi; - private final Matrix4f matMvit; - - private static final int mP_offset = 0*16; - private static final int mMv_offset = 1*16; - private final int mMvi_offset; - private final int mMvit_offset; - private final int mTex_offset; - - private final float[] matrixStore; - - private final FloatBuffer bufP, bufMv, bufTex; - private final FloatBuffer bufMvi, bufMvit; - private final FloatBuffer bufP_Mv, bufP_Mv_Mvi, bufP_Mv_Mvi_Mvit; - - private final SyncMatrix4f syncP, syncMv, syncT; - private final SyncMatrix4f syncMvi, syncMvit; - private final SyncMatrices4f syncP_Mv, syncP_Mv_Mvi, syncP_Mv_Mvi_Mvit; - - private final Matrix4f mat4Tmp1; - private int matrixMode = GL_MODELVIEW; - private int modifiedBits = MODIFIED_ALL; - private int dirtyBits = 0; // contains the dirty bits, i.e. hinting for update operation - private final int requestBits; // may contain the requested bits: INVERSE_MODELVIEW | INVERSE_TRANSPOSED_MODELVIEW - private Matrix4f mat4Tmp2; - private Matrix4f matPMv; - private Matrix4f matPMvi; - private boolean matPMviOK; - private Frustum frustum; - - private abstract class PMVSyncBuffer implements SyncMatrix4f { - protected final Matrix4f mat; - private final FloatBuffer fbuf; - - public PMVSyncBuffer(final Matrix4f m, final FloatBuffer fbuf) { - this.mat = m; - this.fbuf = fbuf; - } - - @Override - public final Buffer getBuffer() { return fbuf; } - - @Override - public final SyncBuffer sync() { getAction().sync(); return this; } - - @Override - public final Buffer getSyncBuffer() { getAction().sync(); return fbuf; } - - @Override - public final Matrix4f getMatrix() { return mat; } - - @Override - public final FloatBuffer getSyncFloats() { getAction().sync(); return fbuf; } - } - private final class SyncBuffer0 extends PMVSyncBuffer { - private final SyncAction action = new SyncAction() { - @Override - public void sync() { mat.get(matrixStore); } - }; - - public SyncBuffer0(final Matrix4f m, final FloatBuffer fbuf) { super(m, fbuf); } - - @Override - public SyncAction getAction() { return action; } - - } - private final class SyncBuffer1 extends PMVSyncBuffer { - private final int offset; - private final SyncAction action = new SyncAction() { - @Override - public void sync() { mat.get(matrixStore, offset); } - }; - - public SyncBuffer1(final Matrix4f m, final FloatBuffer fbuf, final int offset) { - super(m, fbuf); - this.offset = offset; - } - - @Override - public SyncAction getAction() { return action; } - } - private final class SyncBuffer1U extends PMVSyncBuffer { - private final int offset; - private final SyncAction action = new SyncAction() { - @Override - public void sync() { - updateImpl(true); - mat.get(matrixStore, offset); - } - }; - - public SyncBuffer1U(final Matrix4f m, final FloatBuffer fbuf, final int offset) { - super(m, fbuf); - this.offset = offset; - } - - @Override - public SyncAction getAction() { return action; } - } - - private abstract class PMVSyncBufferN implements SyncMatrices4f { - protected final Matrix4f[] mats; - private final FloatBuffer fbuf; - - public PMVSyncBufferN(final Matrix4f[] ms, final FloatBuffer fbuf) { - this.mats = ms; - this.fbuf = fbuf; - } - - @Override - public final Buffer getBuffer() { return fbuf; } - - @Override - public final SyncBuffer sync() { getAction().sync(); return this; } - - @Override - public final Buffer getSyncBuffer() { getAction().sync(); return fbuf; } - - @Override - public Matrix4f[] getMatrices() { return mats; } - - @Override - public final FloatBuffer getSyncFloats() { getAction().sync(); return fbuf; } - } - private final class SyncBufferN extends PMVSyncBufferN { - private final int offset; - private final SyncAction action = new SyncAction() { - @Override - public void sync() { - int ioff = offset; - for(int i=0; i<mats.length; ++i, ioff+=16) { - mats[i].get(matrixStore, ioff); - } - } - }; - - public SyncBufferN(final Matrix4f[] ms, final FloatBuffer fbuf, final int offset) { - super(ms, fbuf); - this.offset = offset; - } - - @Override - public SyncAction getAction() { return action; } - } - private final class SyncBufferNU extends PMVSyncBufferN { - private final int offset; - private final SyncAction action = new SyncAction() { - @Override - public void sync() { - updateImpl(true); - int ioff = offset; - for(int i=0; i<mats.length; ++i, ioff+=16) { - mats[i].get(matrixStore, ioff); - } - } - }; - - public SyncBufferNU(final Matrix4f[] ms, final FloatBuffer fbuf, final int offset) { - super(ms, fbuf); - this.offset = offset; - } - - @Override - public SyncAction getAction() { return action; } - } } diff --git a/src/jogl/classes/com/jogamp/opengl/util/SyncAction.java b/src/jogl/classes/com/jogamp/opengl/util/SyncAction.java deleted file mode 100644 index fbf55e683..000000000 --- a/src/jogl/classes/com/jogamp/opengl/util/SyncAction.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright 2023 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; - -/** - * Specific data synchronization action implemented by the data provider - * to update the buffer with the underlying data before usage, e.g. uploading the {@link com.jogamp.opengl.GLUniformData GLUniformData} data to the GPU. - * <p> - * Example: Invoked before delivering {@link com.jogamp.opengl.GLUniformData GLUniformData}'s data via {@link com.jogamp.opengl.GLUniformData#getObject() getObject()} - * or {@link com.jogamp.opengl.GLUniformData#getBuffer() getBuffer()}. - * </p> - */ -public interface SyncAction { - /** - * Synchronizes the buffer with the underlying data before usage. - * <p> - * Example: {@link com.jogamp.opengl.GLUniformData GLUniformData} issues this method before delivering data via {@link com.jogamp.opengl.GLUniformData#getObject() getObject()} - * or {@link com.jogamp.opengl.GLUniformData#getBuffer() getBuffer()}. - * </p> - */ - void sync(); -}
\ No newline at end of file diff --git a/src/jogl/classes/com/jogamp/opengl/util/SyncBuffer.java b/src/jogl/classes/com/jogamp/opengl/util/SyncBuffer.java deleted file mode 100644 index 27bdb5dfb..000000000 --- a/src/jogl/classes/com/jogamp/opengl/util/SyncBuffer.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright 2023 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; - -import java.nio.Buffer; - -/** - * Convenient tuple of a {@link SyncAction} and {@link Buffer}. - * <p> - * {@link SyncAction#sync()} is used to update the {@link Buffer} with the underlying data - * known to the data provider. - * </p> - * @see SyncAction - */ -public interface SyncBuffer { - /** - * Return the {@link SyncAction}. - * @see SyncAction - */ - SyncAction getAction(); - - /** Return the {@link Buffer}, i.e. underlying data. */ - Buffer getBuffer(); - - /** - * Synchronizes the underlying data before usage. - * <p> - * Convenient shortcut for {@link #getAction()}.{@link SyncAction#sync() sync()} plus chaining. - * </p> - */ - SyncBuffer sync(); - - /** Return the {@link Buffer} after {@link SyncAction#sync() synchronizing} it. */ - Buffer getSyncBuffer(); - -}
\ No newline at end of file diff --git a/src/jogl/classes/com/jogamp/opengl/util/SyncMatrices4f.java b/src/jogl/classes/com/jogamp/opengl/util/SyncMatrices4f.java deleted file mode 100644 index 055345d65..000000000 --- a/src/jogl/classes/com/jogamp/opengl/util/SyncMatrices4f.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright 2023 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; - -import java.nio.FloatBuffer; - -import com.jogamp.opengl.math.Matrix4f; - -/** {@link SyncBuffer} with a multiple underlying {@link Matrix4f}, used in {@link SyncMatrices4f16} and {@link PMVMatrix} */ -public interface SyncMatrices4f extends SyncBuffer { - /** Return the underlying multiple {@link Matrix4f}, used to {@link SyncAction#sync() synchronize} to the {@link #getBuffer()}. */ - Matrix4f[] getMatrices(); - - /** Return the {@link FloatBuffer} after {@link SyncAction#sync() synchronizing} it w/ the underlying {@link #getMatrices()}. */ - FloatBuffer getSyncFloats(); -}
\ No newline at end of file diff --git a/src/jogl/classes/com/jogamp/opengl/util/SyncMatrices4f16.java b/src/jogl/classes/com/jogamp/opengl/util/SyncMatrices4f16.java deleted file mode 100644 index bca827b9f..000000000 --- a/src/jogl/classes/com/jogamp/opengl/util/SyncMatrices4f16.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright 2023 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; - -import java.nio.Buffer; -import java.nio.FloatBuffer; - -import com.jogamp.opengl.math.Matrix4f; - -/** {@link SyncBuffer} {@link SyncMatrices4f16} implementation for multiple underlying {@link Matrix4f} instances using one {@code float[16*n]} backing array. */ -public final class SyncMatrices4f16 implements SyncMatrices4f { - private final Matrix4f[] mats; - private final float[] f16s; - private final FloatBuffer fbuf; - private final SyncAction action = new SyncAction() { - @Override - public void sync() { - int ioff = 0; - for(int i=0; i<mats.length; ++i, ioff+=16) { - mats[i].get(f16s, ioff); - } - } - }; - - public SyncMatrices4f16(final Matrix4f[] mats) { - this.mats = mats; - this.f16s = new float[16*mats.length]; - this.fbuf = FloatBuffer.wrap(f16s); - } - - @Override - public SyncAction getAction() { return action; } - - @Override - public Buffer getBuffer() { return fbuf; } - - @Override - public SyncBuffer sync() { getAction().sync(); return this; } - - @Override - public Buffer getSyncBuffer() { getAction().sync(); return fbuf; } - - @Override - public Matrix4f[] getMatrices() { return mats; } - - @Override - public FloatBuffer getSyncFloats() { getAction().sync(); return fbuf; } - -}
\ No newline at end of file diff --git a/src/jogl/classes/com/jogamp/opengl/util/SyncMatrix4f.java b/src/jogl/classes/com/jogamp/opengl/util/SyncMatrix4f.java deleted file mode 100644 index 6ab473771..000000000 --- a/src/jogl/classes/com/jogamp/opengl/util/SyncMatrix4f.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright 2023 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; - -import java.nio.FloatBuffer; - -import com.jogamp.opengl.math.Matrix4f; - -/** {@link SyncBuffer} interface with a single underlying {@link Matrix4f}, used in {@link SyncMatrix4f16} and {@link PMVMatrix}. */ -public interface SyncMatrix4f extends SyncBuffer { - /** Return the underlying {@link Matrix4f}, used to {@link SyncAction#sync() synchronize} to the {@link #getBuffer()}. */ - Matrix4f getMatrix(); - - /** Return the {@link FloatBuffer} after {@link SyncAction#sync() synchronizing} it w/ the underlying {@link #getMatrix()}. */ - FloatBuffer getSyncFloats(); - -} diff --git a/src/jogl/classes/com/jogamp/opengl/util/SyncMatrix4f16.java b/src/jogl/classes/com/jogamp/opengl/util/SyncMatrix4f16.java deleted file mode 100644 index 03a4b64fa..000000000 --- a/src/jogl/classes/com/jogamp/opengl/util/SyncMatrix4f16.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright 2023 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; - -import java.nio.Buffer; -import java.nio.FloatBuffer; - -import com.jogamp.opengl.math.Matrix4f; - -/** {@link SyncBuffer} {@link SyncMatrix4f} implementation for a single underlying {@link Matrix4f} using one {@code float[16]} backing array. */ -public final class SyncMatrix4f16 implements SyncMatrix4f { - private final Matrix4f mat; - private final float[] f16; - private final FloatBuffer fbuf; - private final SyncAction action = new SyncAction() { - @Override - public void sync() { mat.get(f16); } - }; - - public SyncMatrix4f16() { - this.mat = new Matrix4f(); - this.f16 = new float[16]; - this.fbuf = FloatBuffer.wrap(f16); - } - - public SyncMatrix4f16(final Matrix4f m) { - this.mat = m; - this.f16 = new float[16]; - this.fbuf = FloatBuffer.wrap(f16); - } - - @Override - public SyncAction getAction() { return action; } - - @Override - public Buffer getBuffer() { return fbuf; } - - @Override - public SyncBuffer sync() { getAction().sync(); return this; } - - @Override - public Buffer getSyncBuffer() { getAction().sync(); return fbuf; } - - @Override - public Matrix4f getMatrix() { return mat; } - - @Override - public FloatBuffer getSyncFloats() { getAction().sync(); return fbuf; } -}
\ No newline at end of file diff --git a/src/jogl/classes/com/jogamp/opengl/util/glsl/fixedfunc/FixedFuncUtil.java b/src/jogl/classes/com/jogamp/opengl/util/glsl/fixedfunc/FixedFuncUtil.java index 37bca895a..e6549baba 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/glsl/fixedfunc/FixedFuncUtil.java +++ b/src/jogl/classes/com/jogamp/opengl/util/glsl/fixedfunc/FixedFuncUtil.java @@ -4,6 +4,7 @@ package com.jogamp.opengl.util.glsl.fixedfunc; +import com.jogamp.math.util.PMVMatrix4f; import com.jogamp.opengl.GL; import com.jogamp.opengl.GL2ES1; import com.jogamp.opengl.GL2ES2; @@ -66,7 +67,7 @@ public class FixedFuncUtil { * @see ShaderSelectionMode#COLOR_TEXTURE * @see ShaderSelectionMode#COLOR_TEXTURE_LIGHT_PER_VERTEX */ - public static final GL2ES1 wrapFixedFuncEmul(final GL gl, final ShaderSelectionMode mode, final PMVMatrix pmvMatrix) { + public static final GL2ES1 wrapFixedFuncEmul(final GL gl, final ShaderSelectionMode mode, final PMVMatrix4f pmvMatrix) { return wrapFixedFuncEmul(gl, mode, null, false, false); } diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/EyeParameter.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/EyeParameter.java index e0f465da7..c6c968415 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/stereo/EyeParameter.java +++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/EyeParameter.java @@ -27,8 +27,8 @@ */ package com.jogamp.opengl.util.stereo; -import com.jogamp.opengl.math.FovHVHalves; -import com.jogamp.opengl.math.Vec3f; +import com.jogamp.math.FovHVHalves; +import com.jogamp.math.Vec3f; /** * Constant single eye parameter of the viewer, relative to its {@link ViewerPose}. diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/LocationSensorParameter.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/LocationSensorParameter.java index 6294adee1..2634535aa 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/stereo/LocationSensorParameter.java +++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/LocationSensorParameter.java @@ -27,8 +27,8 @@ */ package com.jogamp.opengl.util.stereo; -import com.jogamp.opengl.math.Matrix4f; -import com.jogamp.opengl.math.geom.Frustum; +import com.jogamp.math.Matrix4f; +import com.jogamp.math.geom.Frustum; /** * Constant parameter of the positioning sensor to locate the {@link ViewerPose}. diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoDevice.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoDevice.java index 85e752302..538152f7a 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoDevice.java +++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoDevice.java @@ -27,14 +27,13 @@ */ package com.jogamp.opengl.util.stereo; +import com.jogamp.math.FovHVHalves; +import com.jogamp.math.Vec3f; import com.jogamp.nativewindow.util.DimensionImmutable; import com.jogamp.nativewindow.util.PointImmutable; import jogamp.opengl.Debug; -import com.jogamp.opengl.math.FovHVHalves; -import com.jogamp.opengl.math.Vec3f; - /** * Interface describing a native stereoscopic device */ diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoDeviceRenderer.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoDeviceRenderer.java index 0d6539634..624a1984c 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoDeviceRenderer.java +++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoDeviceRenderer.java @@ -27,12 +27,11 @@ */ package com.jogamp.opengl.util.stereo; +import com.jogamp.math.FovHVHalves; import com.jogamp.nativewindow.util.DimensionImmutable; import com.jogamp.nativewindow.util.RectangleImmutable; import com.jogamp.opengl.GL; -import com.jogamp.opengl.math.FovHVHalves; - /** * Stereoscopic device rendering interface. * <p> @@ -175,7 +174,7 @@ public interface StereoDeviceRenderer { * <p> * In case the renderer does not support multiple textures for post-processing, * or no post-processing at all, method returns zero despite the request - * from {@link StereoDevice#createRenderer(int, int, float[], com.jogamp.opengl.math.FovHVHalves[], float)}. + * from {@link StereoDevice#createRenderer(int, int, float[], com.jogamp.math.FovHVHalves[], float)}. * </p> */ public int getTextureCount(); diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoGLEventListener.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoGLEventListener.java index 59f38f2af..9108a0723 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoGLEventListener.java +++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoGLEventListener.java @@ -27,10 +27,9 @@ */ package com.jogamp.opengl.util.stereo; +import com.jogamp.math.FloatUtil; import com.jogamp.opengl.GLAutoDrawable; import com.jogamp.opengl.GLEventListener; - -import com.jogamp.opengl.math.FloatUtil; import com.jogamp.opengl.util.CustomGLEventListener; /** @@ -65,7 +64,7 @@ public interface StereoGLEventListener extends CustomGLEventListener { * @param height viewport height in pixel units * @param eyeParam constant eye parameter, i.e. FOV and IPD * @param viewerPose current viewer position and orientation - * @see FloatUtil#makePerspective(float[], int, boolean, com.jogamp.opengl.math.FloatUtil.FovHVHalves, float, float) + * @see FloatUtil#makePerspective(float[], int, boolean, com.jogamp.math.FloatUtil.FovHVHalves, float, float) */ public void reshapeForEye(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height, final EyeParameter eyeParam, final ViewerPose viewerPose); diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoUtil.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoUtil.java index 63cb3e1e7..404c80d23 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoUtil.java +++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/StereoUtil.java @@ -27,9 +27,9 @@ */ package com.jogamp.opengl.util.stereo; -import com.jogamp.opengl.math.Matrix4f; -import com.jogamp.opengl.math.Quaternion; -import com.jogamp.opengl.math.Vec3f; +import com.jogamp.math.Matrix4f; +import com.jogamp.math.Quaternion; +import com.jogamp.math.Vec3f; import com.jogamp.opengl.util.CustomGLEventListener; import com.jogamp.opengl.util.stereo.StereoDeviceRenderer.Eye; diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/ViewerPose.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/ViewerPose.java index 5d2cf925c..7c116a019 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/stereo/ViewerPose.java +++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/ViewerPose.java @@ -27,8 +27,8 @@ */ package com.jogamp.opengl.util.stereo; -import com.jogamp.opengl.math.Quaternion; -import com.jogamp.opengl.math.Vec3f; +import com.jogamp.math.Quaternion; +import com.jogamp.math.Vec3f; /** * {@link #position} and {@link #orientation} of viewer. diff --git a/src/jogl/classes/com/jogamp/opengl/util/stereo/generic/GenericStereoDeviceFactory.java b/src/jogl/classes/com/jogamp/opengl/util/stereo/generic/GenericStereoDeviceFactory.java index 0cdef8770..a25e923dc 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/stereo/generic/GenericStereoDeviceFactory.java +++ b/src/jogl/classes/com/jogamp/opengl/util/stereo/generic/GenericStereoDeviceFactory.java @@ -31,11 +31,11 @@ import jogamp.opengl.util.stereo.DistortionMesh; import jogamp.opengl.util.stereo.GenericStereoDevice; import com.jogamp.common.util.ReflectionUtil; +import com.jogamp.math.FloatUtil; +import com.jogamp.math.FovHVHalves; +import com.jogamp.math.Vec3f; import com.jogamp.nativewindow.util.Dimension; import com.jogamp.nativewindow.util.DimensionImmutable; -import com.jogamp.opengl.math.FloatUtil; -import com.jogamp.opengl.math.FovHVHalves; -import com.jogamp.opengl.math.Vec3f; import com.jogamp.opengl.util.stereo.EyeParameter; import com.jogamp.opengl.util.stereo.StereoDevice; import com.jogamp.opengl.util.stereo.StereoDeviceConfig; |