This script first tests the internal PMatrix3D class. If all tests
pass, it renders a box. The rendering of the box tests the other functions for my
0.5 release including uniformMatrix, uniformf and vertexAttribPointer
which are called in the box() function.
//Test written by Andor Salga
void setup()
{
size(500,500,OPENGL);
if(testPMatrix3D())
{
translate(250,250,430);
box(1,1,1);
}
}
// -----------
p.testPMatrix3D = function()
{
//Test written by Andor Salga
// starts off as identity matrix
var mat = new PMatrix3D();
if(!ArraysEqual(mat.array(), [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1])) return false;
// set to identity
mat.reset();
if(!ArraysEqual(mat.array(), [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1])) return false;
// set to some matrix using array
mat.set([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]);
if(!ArraysEqual(mat.array(), [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])) return false;
// set using 16 values
mat.set(2,4,6,8,1,3,5,7,9,11,12,34,65,12,87,101);
if(!ArraysEqual(mat.array(), [2,4,6,8,1,3,5,7,9,11,12,34,65,12,87,101])) return false;
// set using pmatrix
var matrix2 = new PMatrix3D();
matrix2.set(4,5,6,7,8,9,2,3,4,5,1,1,1,2,3,4);
mat.set(matrix2);
if(!ArraysEqual(mat.array(), [4,5,6,7,8,9,2,3,4,5,1,1,1,2,3,4])) return false;
// multiply with identity using matrix
mat.set([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);
mat.apply(new PMatrix3D());
if(!ArraysEqual(mat.array(), [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])) return false;
// multiply with identity using array
mat.reset();
mat.apply(matrix2.array());
if(!ArraysEqual(mat.array(), matrix2.array())) return false;
// INVERT
var invTest = new PMatrix3D();
invTest.set(1,4,3,2,0,2,0,3,2,1,0,4,5,0,3,4);
var res = invTest.invert();
var invExpected = [0.4167, -1.5000, 1.3333, -0.4167,
0.5000, -1.0000, 1.0000, -0.5000,
-0.2500, 1.1667, -1.3333, 0.5833,
-0.3333, 1.0000, -0.6667, 0.3333];
if(!ArraysEqual(invTest.array(), invExpected)) return false;
if(res == false) return false;
// Failed Invert
var invTest = new PMatrix3D();
invTest.set(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);
var res = invTest.invert();
if(!ArraysEqual(invTest,[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])) return false;
if(res == true) return false;
// multiply 2 matrices using 2nd matrix array()
var mat1 = new PMatrix3D();
var mat2 = new PMatrix3D();
var res = new PMatrix3D();
res.set(39,61,37,52,63,92,49,59,53,51,71,45,41,72,47,60);
mat1.set([1,2,4,4,1,7,3,4,8,2,3,0,2,1,6,4]);
mat2.set([5,1,7,4,5,8,3,2,1,9,3,3,5,2,3,8]);
mat1.apply(mat2.array());
if(!ArraysEqual(mat1.array(), res.array())) return false;
///////////
/// SCALE
///////////
// scale by uniform 5
res.set([5,10,20,4,5,35,15,4,40,10,15,0,10,5,30,4]);
mat1.set([1,2,4,4,1,7,3,4,8,2,3,0,2,1,6,4]);
mat1.scale(5);
if(!ArraysEqual(mat1.array(), res.array())) return false;
// same thing, but specify x,y,z
res.set([5,10,20,4,5,35,15,4,40,10,15,0,10,5,30,4]);
mat1.set([1,2,4,4,1,7,3,4,8,2,3,0,2,1,6,4]);
mat1.scale(5,5,5);
if(!ArraysEqual(mat1.array(), res.array())) return false;
// non uniform scale
res.set(1,6,15,4,5,18,35,8,9,30,55,12,13,42,75,16);
mat1.set(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);
mat1.scale(1,3,5);
if(!ArraysEqual(mat1.array(), res.array())) return false;
// scale by 1
mat1.scale(1);
if(!ArraysEqual(mat1.array(), res.array())) return false;
//////////////
/// TRANSPOSE
//////////////
var tmat1 = new PMatrix3D();
tmat1.transpose();
if(!ArraysEqual(tmat1.array(), [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1] )) return false;
tmat1.set([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]);
tmat1.transpose();
if(!ArraysEqual(tmat1.array(), [0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15] )) return false;
tmat1.set(6,2,5,9,13,22,0,0,3,4,1,7,8,9,3,4);
tmat1.transpose();
if(!ArraysEqual(tmat1.array(), [6,13,3,8,2,22,4,9,5,0,1,3,9,0,7,4] )) return false;
///////////////
/// TRANSLATE
//////////////
var res = [1,0,0,5, 0,1,0,0, 0,0,1,0, 0,0,0,1];
var trMat = new PMatrix3D();
trMat.translate(5,0,0);
if(!ArraysEqual(trMat.array(), res)) return false;
/*
01.0000 02.0000 03.0000 22.0000
05.0000 06.0000 07.0000 38.0000
09.0000 10.0000 11.0000 54.0000
13.0000 14.0000 15.0000 70.0000*/
trMat.set([
1,2,3,4,
5,6,7,8,
9,10,11,12,
13,14,15,16]);
res = [
1,2,3,22,
5,6,7,38,
9,10,11,54,
13,14,15,70];
trMat.translate(-5,1,7);
if(!ArraysEqual(trMat.array(), res)) return false;
///////////
// PREAPPLY
///////////
// preapply with array
var preMat1 = new PMatrix3D();
res = [
6,3,5,9,
7,2,6,0,
4,3,7,1,
5,4,8,9];
preMat1.preApply(res);
if(!ArraysEqual(preMat1.array(), res)) return false;
// preapply with numbers
var preMat2 = new PMatrix3D();
preMat2.set([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);
preMat2.preApply(6,7,4,5,3,2,3,4,5,6,7,8,9,0,1,9);
var res = [142,164,186,208,
92,104,116,128,
202,228,254,280,
135,154,173,192];
if(!ArraysEqual(preMat2.array(), res)) return false;
// preAppy with matrix
preMat2.set([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);
var tempMat = new PMatrix3D();
tempMat.set(6,7,4,5,3,2,3,4,5,6,7,8,9,0,1,9);
preMat2.preApply(tempMat);
var res = [142,164,186,208,
92,104,116,128,
202,228,254,280,
135,154,173,192];
if(!ArraysEqual(preMat2.array(), res)) return false;
///////////
// MULT
///////////
var mMat = new PMatrix3D();
var exp = [36,29,32];
var res = mMat.mult(exp);
if( exp[0] !== res[0] || exp[1] !== res[1] ||
exp[2] !== res[2])
{
return false;
}
mMat = new PMatrix3D();
mMat.set(6,7,4,5,
3,2,3,4,
5,6,7,8,
9,0,1,9);
exp = [82,41,95,42];
var res = [0,0,0,0];
mMat.mult([3,5,6,1],res);
if( exp[0] !== res[0] || exp[1] !== res[1] ||
exp[2] !== res[2] || exp[3] !== res[3])
{
return false;
}
exp = [82,41,95];
var res = [0,0,0];
mMat.mult([3,5,6,1],res);
if( exp[0] !== res[0] || exp[1] !== res[1] ||
exp[2] !== res[2])
{
return false;
}
var mMat = new PMatrix3D();
mMat.set(6,7,4,5,
3,2,3,4,
5,6,7,8,
9,0,1,9);
var s = new PVector(3,5,6,1);
var res = [82,41,95]
var d = new PVector(0,0,0);
mMat.mult(s,d);
if( d.x !== res[0] || d.y !== res[1] ||
d.z !== res[2])
{
return false;
}
////////
// GET
///////
var gMat1 = new PMatrix3D();
var gMat2 = gMat1.get();
if(!ArraysEqual(gMat1.array(), gMat2.array())) return false;
gMat1.set([1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4]);
// they shouldn't be still equal
if(ArraysEqual(gMat1.array(), gMat2.array())) return false;
// if we got to this point, all tests passed
return true;
}