package com.jogamp.opengl.test.junit.jogl.math;
import java.util.Arrays;
import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
import jogamp.opengl.ProjectFloat;
import com.jogamp.opengl.math.FloatUtil;
import com.jogamp.opengl.util.PMVMatrix;
import org.junit.Assert;
import org.junit.Test;
import org.junit.FixMethodOrder;
import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestPMVMatrix03NOUI {
static final float epsilon = 0.00001f;
// Simple 10 x 10 view port
static final int[] viewport = new int[] { 0,0,10,10};
@Test
public void test01() {
final float[] vec4Tmp1 = new float[4];
final float[] vec4Tmp2 = new float[4];
final float[] winA00 = new float[4];
final float[] winA01 = new float[4];
final float[] winA10 = new float[4];
final float[] winA11 = new float[4];
final float[] winB00 = new float[4];
final float[] winB01 = new float[4];
final float[] winB10 = new float[4];
final float[] winB11 = new float[4];
final PMVMatrix m = new PMVMatrix();
final float[] mat4PMv = new float[16];
m.multPMvMatrixf(mat4PMv, 0);
System.err.println(FloatUtil.matrixToString(null, "mat4PMv", "%10.5f", mat4PMv, 0, 4, 4, false /* rowMajorOrder */));
m.gluProject(1f, 0f, 0f, viewport, 0, winA00, 0);
System.err.println("A.0.0 - Project 1,0 -->" + Arrays.toString(winA00));
FloatUtil.mapObjToWinCoords(1f, 0f, 0f, mat4PMv, viewport, 0, winB00, 0, vec4Tmp1, vec4Tmp2);
System.err.println("B.0.0 - Project 1,0 -->" + Arrays.toString(winB00));
m.gluProject(0f, 0f, 0f, viewport, 0, winA01, 0);
System.err.println("A.0.1 - Project 0,0 -->" + Arrays.toString(winA01));
FloatUtil.mapObjToWinCoords(0f, 0f, 0f, mat4PMv, viewport, 0, winB01, 0, vec4Tmp1, vec4Tmp2);
System.err.println("B.0.1 - Project 0,0 -->" + Arrays.toString(winB01));
m.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
m.glOrthof(0, 10, 0, 10, 1, -1);
System.err.println("MATRIX - Ortho 0,0,10,10 - Locate the origin in the bottom left and scale");
System.err.println(m);
m.multPMvMatrixf(mat4PMv, 0);
System.err.println(FloatUtil.matrixToString(null, "mat4PMv", "%10.5f", mat4PMv, 0, 4, 4, false /* rowMajorOrder */));
m.gluProject(1f, 0f, 0f, viewport, 0, winA10, 0);
System.err.println("A.1.0 - Project 1,0 -->" +Arrays.toString(winA10));
FloatUtil.mapObjToWinCoords(1f, 0f, 0f, mat4PMv, viewport, 0, winB10, 0, vec4Tmp1, vec4Tmp2);
System.err.println("B.1.0 - Project 1,0 -->" +Arrays.toString(winB10));
m.gluProject(0f, 0f, 0f, viewport, 0, winA11, 0);
System.err.println("A.1.1 - Project 0,0 -->" +Arrays.toString(winA11));
FloatUtil.mapObjToWinCoords(0f, 0f, 0f, mat4PMv, viewport, 0, winB11, 0, vec4Tmp1, vec4Tmp2);
System.err.println("B.1.1 - Project 0,0 -->" +Arrays.toString(winB11));
Assert.assertArrayEquals("A/B 0.0 Project 1,0 failure", winB00, winA00, epsilon);
Assert.assertArrayEquals("A/B 0.1 Project 0,0 failure", winB01, winA01, epsilon);
Assert.assertArrayEquals("A/B 1.0 Project 1,0 failure", winB10, winA10, epsilon);
Assert.assertArrayEquals("A/B 1.1 Project 0,0 failure", winB11, winA11, epsilon);
////////////////////
/////////////////////
final float[] winC00 = new float[4];
final float[] winC01 = new float[4];
final float[] winC10 = new float[4];
final float[] winC11 = new float[4];
final float[] projMatrixC = new float[16];
final float[] modelMatrixC = new float[16];
FloatUtil.makeIdentity(projMatrixC);
FloatUtil.makeIdentity(modelMatrixC);
final ProjectFloat projectFloat = new ProjectFloat();
projectFloat.gluProject(1f, 0f, 0f, modelMatrixC, 0, projMatrixC, 0, viewport, 0, winC00, 0);
System.err.println("C.0.0 - Project 1,0 -->" +Arrays.toString(winC00));
projectFloat.gluProject(0f, 0f, 0f, modelMatrixC, 0, projMatrixC, 0, viewport, 0, winC01, 0);
System.err.println("C.0.1 - Project 0,0 -->" +Arrays.toString(winC01));
glOrthof(projMatrixC, 0, 10, 0, 10, 1, -1);
System.err.println("FloatUtil - Ortho 0,0,10,10 - Locate the origin in the bottom left and scale");
System.err.println("Projection");
System.err.println(FloatUtil.matrixToString(null, null, "%10.5f", projMatrixC, 0, 4, 4, false /* rowMajorOrder */));
System.err.println("Modelview");
System.err.println(FloatUtil.matrixToString(null, null, "%10.5f", modelMatrixC, 0, 4, 4, false /* rowMajorOrder */));
projectFloat.gluProject(1f, 0f, 0f, modelMatrixC, 0, projMatrixC, 0, viewport, 0, winC10, 0);
System.err.println("C.1.0 - Project 1,0 -->" +Arrays.toString(winC10));
projectFloat.gluProject(0f, 0f, 0f, modelMatrixC, 0, projMatrixC, 0, viewport, 0, winC11, 0);
System.err.println("B.1.1 - Project 0,0 -->" +Arrays.toString(winC11));
Assert.assertArrayEquals("A/C 0.0 Project 1,0 failure", winC00, winA00, epsilon);
Assert.assertArrayEquals("A/C 0.1 Project 0,0 failure", winC01, winA01, epsilon);
Assert.assertArrayEquals("A/C 1.0 Project 1,0 failure", winC10, winA10, epsilon);
Assert.assertArrayEquals("A/C 1.1 Project 0,0 failure", winC11, winA11, epsilon);
Assert.assertEquals("A 0.0 Project 1,0 failure X", 10.0, winA00[0], epsilon);
Assert.assertEquals("A 0.0 Project 1,0 failure Y", 5.0, winA00[1], epsilon);
Assert.assertEquals("A.0.1 Project 0,0 failure X", 5.0, winA01[0], epsilon);
Assert.assertEquals("A.0.1 Project 0,0 failure Y", 5.0, winA01[1], epsilon);
Assert.assertEquals("A 1.0 Project 1,0 failure X", 1.0, winA10[0], epsilon);
Assert.assertEquals("A 1.0 Project 1,0 failure Y", 0.0, winA10[1], epsilon);
Assert.assertEquals("A.1.1 Project 0,0 failure X", 0.0, winA11[0], epsilon);
Assert.assertEquals("A.1.1 Project 0,0 failure Y", 0.0, winA11[1], epsilon);
}
public final void glOrthof(final float[] m, final float left, final float right, final float bottom, final float top, final float zNear, final float zFar) {
// Ortho matrix:
// 2/dx 0 0 tx
// 0 2/dy 0 ty
// 0 0 2/dz tz
// 0 0 0 1
final float dx=right-left;
final float dy=top-bottom;
final float dz=zFar-zNear;
final float tx=-1.0f*(right+left)/dx;
final float ty=-1.0f*(top+bottom)/dy;
final float tz=-1.0f*(zFar+zNear)/dz;
final float[] matrixOrtho = new float[16];
FloatUtil.makeIdentity(matrixOrtho);
matrixOrtho[0+4*0] = 2.0f/dx;
matrixOrtho[1+4*1] = 2.0f/dy;
matrixOrtho[2+4*2] = -2.0f/dz;
matrixOrtho[0+4*3] = tx;
matrixOrtho[1+4*3] = ty;
matrixOrtho[2+4*3] = tz;
FloatUtil.multMatrix(m, 0, matrixOrtho, 0);
}
public static void main(final String args[]) {
org.junit.runner.JUnitCore.main(TestPMVMatrix03NOUI.class.getName());
}
}