From 92406ae9a2153c1b6a74c29d9939a021d898dcf1 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Mon, 12 Nov 2012 07:13:45 +0100 Subject: Frustum: Cleanup / update; PMVMatrix: Fix mulPMV Frustum: Cleanup / update - Remove ctor w/ PMV, use update(..) instead - avoid API explosion - Add update(Plane[]) to copy existing Frustum planes - Mention world-coordinates in update(PMV) PMVMatrix: Fix mulPMV - P*Mv in column major order is correct for Frustum --- .../com/jogamp/opengl/math/geom/Frustum.java | 35 ++++++++++++++-------- .../classes/com/jogamp/opengl/util/PMVMatrix.java | 2 +- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/jogl/classes/com/jogamp/opengl/math/geom/Frustum.java b/src/jogl/classes/com/jogamp/opengl/math/geom/Frustum.java index fd370dfba..c18740b66 100644 --- a/src/jogl/classes/com/jogamp/opengl/math/geom/Frustum.java +++ b/src/jogl/classes/com/jogamp/opengl/math/geom/Frustum.java @@ -57,6 +57,11 @@ public class Frustum { /** * Creates an undefined instance w/o calculating the frustum. + *

+ * Use one of the update(..) methods to set the {@link #getPlanes() planes}. + *

+ * @see #update(Plane[]) + * @see #update(float[], int) */ public Frustum() { for (int i = 0; i < 6; ++i) { @@ -64,17 +69,6 @@ public class Frustum { } } - /** - * Creates a defined instance w/ calculating the frustum - * using the passed float[16] as premultiplied P*MV (column major order) - */ - public Frustum(float[] pmv, int pmv_off) { - for (int i = 0; i < 6; ++i) { - planes[i] = new Plane(); - } - update(pmv, pmv_off); - } - /** Plane equation := dot(n, x - p) = 0 -> ax + bc + cx + d == 0 */ public static class Plane { /** Normal of the plane */ @@ -142,7 +136,24 @@ public class Frustum { public final Plane[] getPlanes() { return planes; } /** - * Re-calculate the frustum + * Copy the given src planes into this this instance's planes. + * @param src the 6 source planes + */ + public final void update(Plane[] src) { + for (int i = 0; i < 6; ++i) { + final Plane p0 = planes[i]; + final float[] p0_n = p0.n; + final Plane p1 = src[i]; + final float[] p1_n = p1.n; + p0_n[0] = p1_n[0]; + p0_n[1] = p1_n[1]; + p0_n[2] = p1_n[2]; + p0.d = p1.d; + } + } + + /** + * Calculate the frustum planes in world coordinates * using the passed float[16] as premultiplied P*MV (column major order). */ public void update(float[] pmv, int pmv_off) { diff --git a/src/jogl/classes/com/jogamp/opengl/util/PMVMatrix.java b/src/jogl/classes/com/jogamp/opengl/util/PMVMatrix.java index 19d877bab..18129ba09 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/PMVMatrix.java +++ b/src/jogl/classes/com/jogamp/opengl/util/PMVMatrix.java @@ -1042,7 +1042,7 @@ public class PMVMatrix implements GLMatrixFunc { frustum = new Frustum(); mulPMV = new float[16]; } - FloatUtil.multMatrixf(matrixMv, matrixP, mulPMV, 0); + FloatUtil.multMatrixf(matrixP, matrixMv, mulPMV, 0); frustum.update(mulPMV, 0); dirtyBits &= ~DIRTY_FRUSTUM; mod = true; -- cgit v1.2.3