152 lines
3.2 KiB
V
152 lines
3.2 KiB
V
import math { tolerance }
|
|
import math.vec
|
|
|
|
fn test_vec4_int() {
|
|
mut v1 := vec.vec4(0, 0, 0, 0)
|
|
mut v2 := vec.vec4(0, 0, 0, 0)
|
|
assert v1 == v2
|
|
v1.one()
|
|
v2.one()
|
|
assert v1.x == 1
|
|
assert v1.y == 1
|
|
assert v1.z == 1
|
|
assert v1.w == 1
|
|
assert v1 == v2
|
|
|
|
v3 := v1 + v2
|
|
assert typeof(v3).name == 'vec.Vec4[int]'
|
|
assert v3.x == 2
|
|
assert v3.y == 2
|
|
assert v3.z == 2
|
|
assert v3.w == 2
|
|
}
|
|
|
|
fn test_vec4_f32() {
|
|
mut v1 := vec.vec4(f32(0), 0, 0, 0)
|
|
mut v2 := vec.vec4(f32(0), 0, 0, 0)
|
|
assert v1 == v2
|
|
v1.one()
|
|
v2.one()
|
|
assert v1.x == 1
|
|
assert v1.y == 1
|
|
assert v1.z == 1
|
|
assert v1.w == 1
|
|
assert v1 == v2
|
|
|
|
v3 := v1 + v2
|
|
assert typeof(v3).name == 'vec.Vec4[f32]'
|
|
assert v3.x == 2
|
|
assert v3.y == 2
|
|
assert v3.z == 2
|
|
assert v3.w == 2
|
|
}
|
|
|
|
fn test_vec4_f64() {
|
|
mut v1 := vec.vec4(0.0, 0, 0, 0)
|
|
mut v2 := vec.vec4(0.0, 0, 0, 0)
|
|
assert v1 == v2
|
|
v1.one()
|
|
v2.one()
|
|
assert v1.x == 1
|
|
assert v1.y == 1
|
|
assert v1.z == 1
|
|
assert v1.w == 1
|
|
assert v1 == v2
|
|
|
|
v3 := v1 + v2
|
|
assert typeof(v3).name == 'vec.Vec4[f64]'
|
|
assert v3.x == 2
|
|
assert v3.y == 2
|
|
assert v3.z == 2
|
|
assert v3.w == 2
|
|
}
|
|
|
|
fn test_vec4_f64_utils_1() {
|
|
mut v1 := vec.vec4(2.0, 3.0, 1.5, 3.0)
|
|
mut v2 := vec.vec4(1.0, 4.0, 1.5, 3.0)
|
|
|
|
mut zv := vec.vec4(5.0, 5.0, 5.0, 5.0)
|
|
zv.zero()
|
|
|
|
v3 := v1 + v2
|
|
assert v3.x == 3
|
|
assert v3.y == 7
|
|
assert v3.z == 3
|
|
assert v3.w == 6
|
|
|
|
assert v3.unit().magnitude() == 1
|
|
|
|
mut ctv1 := vec.vec4(0.000001, 0.000001, 0.000001, 0.000001)
|
|
ctv1.clean_tolerance(0.00001)
|
|
assert ctv1 == zv
|
|
}
|
|
|
|
fn test_vec4_f64_utils_2() {
|
|
mut v1 := vec.vec4(4.0, 4.0, 8.0, 2.0)
|
|
assert v1.unit().magnitude() == 1
|
|
|
|
v2 := v1.mul_scalar(0.5)
|
|
assert v2.x == 2
|
|
assert v2.y == 2
|
|
assert v2.z == 4
|
|
assert v2.w == 1
|
|
assert v2.unit().magnitude() == 1
|
|
|
|
invv2 := v2.inv()
|
|
assert invv2.x == 0.5
|
|
assert invv2.y == 0.5
|
|
assert invv2.z == 0.25
|
|
assert invv2.w == 1.0
|
|
}
|
|
|
|
// sample tests for vec4 projection
|
|
fn test_vec4_project_onto_basic() {
|
|
v := vec.vec4(5.0, 6.0, 0.0, 0.0) // magnitude ~7.81 vector
|
|
u := vec.vec4(3.0, 4.0, 0.0, 0.0) // magnitude 5 vector
|
|
// hand-computed:
|
|
// v·u = 5*3 + 6*4 + 0*0 + 0*0 = 39
|
|
// |u|^2 = 3^2 + 4^2 +0^2 +0^2 = 25
|
|
proj := v.project(u)
|
|
assert proj.x == 4.68
|
|
assert proj.y == 6.24
|
|
assert proj.z == 0.0
|
|
assert proj.w == 0.0
|
|
}
|
|
|
|
// Test for Vec4 projection onto zero vector
|
|
//
|
|
fn test_vec4_project_onto_zero() {
|
|
v := vec.vec4(0.0, 0.0, 0.0, 0.0)
|
|
u := vec.vec4(3.0, 4.0, 0.0, 0.0)
|
|
proj := v.project(u)
|
|
assert proj.x == 0.0
|
|
assert proj.y == 0.0
|
|
assert proj.z == 0.0
|
|
assert proj.w == 0.0
|
|
}
|
|
|
|
// Test for perpendicularity
|
|
// 'u' and 'v' are already perpendicular so it must return v
|
|
fn test_vec4_perpendicularity_angle() {
|
|
u := vec.vec4(1.0, 0.0, 0.0, 0.0)
|
|
v := vec.vec4(0.0, 3.0, 2.0, 0.0)
|
|
|
|
per := v.perpendicular(u)
|
|
assert tolerance(per.x, v.x, vec.vec_epsilon)
|
|
assert tolerance(per.y, v.y, vec.vec_epsilon)
|
|
assert tolerance(per.z, v.z, vec.vec_epsilon)
|
|
assert tolerance(per.w, v.w, vec.vec_epsilon)
|
|
}
|
|
|
|
// 'u' and 'v' are collinear so it must return the null vector
|
|
fn test_vec4_collinear() {
|
|
u := vec.vec4(1.0, 0.0, 0.0, 0.0)
|
|
v := vec.vec4(3.0, 0.0, 0.0, 0.0)
|
|
|
|
per := v.perpendicular(u)
|
|
assert tolerance(per.x, 0.0, vec.vec_epsilon)
|
|
assert tolerance(per.y, 0.0, vec.vec_epsilon)
|
|
assert tolerance(per.z, 0.0, vec.vec_epsilon)
|
|
assert tolerance(per.w, 0.0, vec.vec_epsilon)
|
|
}
|