	@Test
	public void modelViewMatrixTransposeAndRoll() throws Exception {

		MatrixBasedCamera camera = new MatrixBasedCamera(new CameraPerspective(45, 4.0f/3.0f, 1, 1000));
		ShaderProgram shaderProgram = MockUtil.deepMock(ShaderProgram.class);
		Matrix4 model = new Matrix4(1, 0, 0, 3,
				0, 1, 0, 2,
				0, 0, 1, -1,
				0, 0, 0, 1);

		camera.translate(new Vector3(5, -1, 10));
		Quaternion orientation = Quaternion.fromAngleAxis(Math.PI/4, Vector3.UNIT_Z);
		camera.setOrientation(orientation);

		shaderPopulator.pushTransforms(model, shaderProgram, camera);

		ArgumentCatcher<FloatBuffer> catcher = ArgumentCatcher.create(mAny(FloatBuffer.class));
		verifyOnce().on(shaderProgram.uniform(ShaderUniform.MODEL_VIEW_MATRIX)).setMatrix4(match(catcher));
		FloatBuffer matrix = catcher.getValue();

		assertEquals(0.7071067690849304f, matrix.get(0), EPSILON);
		assertEquals(0.7071067690849304f, matrix.get(1), EPSILON);
		assertEquals(0f, matrix.get(2), EPSILON);
		assertEquals(-1.4644660949707031f, matrix.get(3), EPSILON);

		assertEquals(-0.7071067690849304f, matrix.get(4), EPSILON);
		assertEquals(0.7071067690849304f, matrix.get(5), EPSILON);
		assertEquals(0f, matrix.get(6), EPSILON);
		assertEquals(0.2928932309150696f, matrix.get(7), EPSILON);

		assertEquals(0f, matrix.get(8), EPSILON);
		assertEquals(0f, matrix.get(9), EPSILON);
		assertEquals(1f, matrix.get(10), EPSILON);
		assertEquals(-11f, matrix.get(11), EPSILON);

		assertEquals(0f, matrix.get(12), EPSILON);
		assertEquals(0f, matrix.get(13), EPSILON);
		assertEquals(0f, matrix.get(14), EPSILON);
		assertEquals(1f, matrix.get(15), EPSILON);
	}