Mercurial > games > semicongine
diff tests/test_matrix.nim @ 13:a571db114152
add: vector/matrix modules, tests, nim config script
author | Sam <sam@basx.dev> |
---|---|
date | Wed, 28 Dec 2022 11:42:21 +0700 |
parents | |
children | 617c6dcddbe2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test_matrix.nim Wed Dec 28 11:42:21 2022 +0700 @@ -0,0 +1,255 @@ +import random +import math + +import vector +import matrix + + +proc echoInfo(v: Vec) = + echo v + echo " Length: ", v.length + echo " Normlized: ", v.normalized + echo " negated: ", -v + +proc echoAdd[T, U](v1: T, v2: U) = + echo v1, " + ", v2, " = ", v1 + v2 +proc echoSub[T, U](v1: T, v2: U) = + echo v1, " - ", v2, " = ", v1 - v2 +proc echoMul[T, U](v1: T, v2: U) = + echo v1, " * ", v2, " = ", v1 * v2 +proc echoDiv[T, U](v1: T, v2: U) = + echo v1, " / ", v2, " = ", v1 / v2 +proc echoDot[T, U](v1: T, v2: U) = + echo v1, " o ", v2, " = ", v1.dot(v2) +proc echoCross[T, U](v1: T, v2: U) = + echo v1, " x ", v2, " = ", v1.cross(v2) + +proc randVec2I(): auto = newVec2(rand(1 .. 10), rand(1 .. 10)) +proc randVec2F(): auto = newVec2(rand(10'f) + 0.01, rand(10'f) + 0.01) +proc randVec3I(): auto = newVec3(rand(1 .. 10), rand(1 .. 10), rand(1 .. 10)) +proc randVec3F(): auto = newVec3(rand(10'f) + 0.01, rand(10'f) + 0.01, rand(10'f) + 0.01) +proc randVec4I(): auto = newVec4(rand(1 .. 10), rand(1 .. 10), rand(1 .. 10), rand(1 .. 10)) +proc randVec4F(): auto = newVec4(rand(10'f) + 0.01, rand(10'f) + 0.01, rand(10'f) + 0.01, rand(10'f) + 0.01) + + +proc testVector() = + echoInfo(randVec2I()) + echoInfo(randVec2F()) + echoInfo(randVec3I()) + echoInfo(randVec3F()) + echoInfo(randVec4I()) + echoInfo(randVec4F()) + + # test math operations vector-vector + echoAdd(randVec2I(), randVec2I()) + echoAdd(randVec2F(), randVec2F()) + echoAdd(randVec3I(), randVec3I()) + echoAdd(randVec3F(), randVec3F()) + echoAdd(randVec4I(), randVec4I()) + echoAdd(randVec4F(), randVec4F()) + echoSub(randVec2I(), randVec2I()) + echoSub(randVec2F(), randVec2F()) + echoSub(randVec3I(), randVec3I()) + echoSub(randVec3F(), randVec3F()) + echoSub(randVec4I(), randVec4I()) + echoSub(randVec4F(), randVec4F()) + echoMul(randVec2I(), randVec2I()) + echoMul(randVec2F(), randVec2F()) + echoMul(randVec3I(), randVec3I()) + echoMul(randVec3F(), randVec3F()) + echoMul(randVec4I(), randVec4I()) + echoMul(randVec4F(), randVec4F()) + echoDiv(randVec2I(), randVec2I()) + echoDiv(randVec2F(), randVec2F()) + echoDiv(randVec3I(), randVec3I()) + echoDiv(randVec3F(), randVec3F()) + echoDiv(randVec4I(), randVec4I()) + echoDiv(randVec4F(), randVec4F()) + echoDot(randVec2I(), randVec2I()) + echoDot(randVec2F(), randVec2F()) + echoDot(randVec3I(), randVec3I()) + echoDot(randVec3F(), randVec3F()) + echoDot(randVec4I(), randVec4I()) + echoDot(randVec4F(), randVec4F()) + echoCross(randVec3I(), randVec3I()) + echoCross(randVec3F(), randVec3F()) + + + # test math operations vector-scalar + echoAdd(randVec2I(), rand(1 .. 10)) + echoAdd(randVec2F(), rand(10'f)) + echoAdd(randVec3I(), rand(1 .. 10)) + echoAdd(randVec3F(), rand(10'f)) + echoAdd(randVec4I(), rand(1 .. 10)) + echoAdd(randVec4F(), rand(10'f)) + echoSub(randVec2I(), rand(1 .. 10)) + echoSub(randVec2F(), rand(10'f)) + echoSub(randVec3I(), rand(1 .. 10)) + echoSub(randVec3F(), rand(10'f)) + echoSub(randVec4I(), rand(1 .. 10)) + echoSub(randVec4F(), rand(10'f)) + echoMul(randVec2I(), rand(1 .. 10)) + echoMul(randVec2F(), rand(10'f)) + echoMul(randVec3I(), rand(1 .. 10)) + echoMul(randVec3F(), rand(10'f)) + echoMul(randVec4I(), rand(1 .. 10)) + echoMul(randVec4F(), rand(10'f)) + echoDiv(randVec2I(), rand(1 .. 10)) + echoDiv(randVec2F(), rand(10'f)) + echoDiv(randVec3I(), rand(1 .. 10)) + echoDiv(randVec3F(), rand(10'f)) + echoDiv(randVec4I(), rand(1 .. 10)) + echoDiv(randVec4F(), rand(10'f)) + + # test math operations scalar-vector + echoAdd(rand(1 .. 10), randVec2I()) + echoAdd(rand(10'f), randVec2F()) + echoAdd(rand(1 .. 10), randVec3I()) + echoAdd(rand(10'f), randVec3F()) + echoAdd(rand(1 .. 10), randVec4I()) + echoAdd(rand(10'f), randVec4F()) + echoSub(rand(1 .. 10), randVec2I()) + echoSub(rand(10'f), randVec2F()) + echoSub(rand(1 .. 10), randVec3I()) + echoSub(rand(10'f), randVec3F()) + echoSub(rand(1 .. 10), randVec4I()) + echoSub(rand(10'f), randVec4F()) + echoMul(rand(1 .. 10), randVec2I()) + echoMul(rand(10'f), randVec2F()) + echoMul(rand(1 .. 10), randVec3I()) + echoMul(rand(10'f), randVec3F()) + echoMul(rand(1 .. 10), randVec4I()) + echoMul(rand(10'f), randVec4F()) + echoDiv(rand(1 .. 10), randVec2I()) + echoDiv(rand(10'f), randVec2F()) + echoDiv(rand(1 .. 10), randVec3I()) + echoDiv(rand(10'f), randVec3F()) + echoDiv(rand(1 .. 10), randVec4I()) + echoDiv(rand(10'f), randVec4F()) + + # test attribute syntax sugar + echo "float2int ", to[int](randVec2F()) + echo "int2float ", to[float](randVec2I()) + echo "float2int ", to[int](randVec3F()) + echo "int2float ", to[float](randVec3I()) + echo "float2int ", to[int](randVec3F()) + echo "int2float ", to[float](randVec3I()) + + echo "V2I.xx: ", randVec2I().xx + echo "V2I.yx: ", randVec2I().xy + echo "V2F.xx: ", randVec2F().xx + echo "V2F.yx: ", randVec2F().yx + echo "V2I.rr: ", randVec2I().rr + echo "V2I.gr: ", randVec2I().gr + echo "V2F.rr: ", randVec2F().rr + echo "V2F.gr: ", randVec2F().gr + + echo "V3I.yyy: ", randVec3I().yyy + echo "V3I.yxz: ", randVec3I().xyz + echo "V3F.yyy: ", randVec3F().yyy + echo "V3F.yxz: ", randVec3F().yxz + echo "V3I.ggg: ", randVec3I().ggg + echo "V3I.grb: ", randVec3I().grb + echo "V3F.ggg: ", randVec3F().ggg + echo "V3F.grb: ", randVec3F().grb + + echo "V4I.zzzz: ", randVec4I().zzzz + echo "V4I.yxzw: ", randVec4I().xyzw + echo "V4F.zzzz: ", randVec4F().zzzz + echo "V4F.yxzw: ", randVec4F().yxzw + echo "V4I.bbbb: ", randVec4I().bbbb + echo "V4I.grba: ", randVec4I().grba + echo "V4F.bbbb: ", randVec4F().bbbb + echo "V4F.grba: ", randVec4F().grba + + echo "X: ", X + echo "Y: ", Y + echo "Z: ", Z + echo "X: ", Xi + echo "Y: ", Yi + echo "Z: ", Zi + + +template withAllIntegerMats(stuff: untyped) = + stuff(Mat22[int32]) + stuff(Mat23[int32]) + stuff(Mat32[int32]) + stuff(Mat33[int32]) + stuff(Mat34[int32]) + stuff(Mat43[int32]) + stuff(Mat44[int32]) + stuff(Mat22[int64]) + stuff(Mat23[int64]) + stuff(Mat32[int64]) + stuff(Mat33[int64]) + stuff(Mat34[int64]) + stuff(Mat43[int64]) + stuff(Mat44[int64]) + +template withAllFloatMats(stuff: untyped) = + stuff(Mat22[float32]) + stuff(Mat23[float32]) + stuff(Mat32[float32]) + stuff(Mat33[float32]) + stuff(Mat34[float32]) + stuff(Mat43[float32]) + stuff(Mat44[float32]) + stuff(Mat22[float64]) + stuff(Mat23[float64]) + stuff(Mat32[float64]) + stuff(Mat33[float64]) + stuff(Mat34[float64]) + stuff(Mat43[float64]) + stuff(Mat44[float64]) + +template withAllMats(stuff: untyped) = + stuff(Mat22[int]) + stuff(Mat23[int]) + stuff(Mat32[int]) + stuff(Mat33[int]) + stuff(Mat34[int]) + stuff(Mat43[int]) + stuff(Mat44[int]) + stuff(Mat22[float]) + stuff(Mat23[float]) + stuff(Mat32[float]) + stuff(Mat33[float]) + stuff(Mat34[float]) + stuff(Mat43[float]) + stuff(Mat44[float]) + +template testTranspose(t: typedesc) = + echo "testTranspose: ", t + let m = t().randomized() + assert m == m.transposed().transposed() + +template testAssignI(t: typedesc) = + echo "testAssignI: ", t + var m = t() + for i in 0 ..< t.data.len: + m[rand(0 ..< m.rowCount), rand(0 ..< m.columnCount)] = rand(0'i32 .. 100'i32) + +template testAssignF(t: typedesc) = + echo "testAssignF: ", t + var m = t() + for i in 0 ..< t.data.len: + m[rand(0 ..< m.rowCount), rand(0 ..< m.columnCount)] = rand(100'f) + +template testRowCols(t: typedesc) = + echo "testRowCols: ", t + var m = t().randomized() + for i in 0 ..< m.rowCount: + echo m.row(i) + for i in 0 ..< m.columnCount: + echo m.col(i) + + +proc testMatrix() = + withAllMats(testTranspose) + withAllIntegerMats(testAssignI) + withAllFloatMats(testAssignF) + withAllMats(testRowCols) + +randomize() +testVector() +testMatrix()