aminal/vendor/github.com/go-gl/mathgl/mgl64/transform_test.go

184 lines
3.9 KiB
Go

// This file is generated from mgl32/transform_test.go; DO NOT EDIT
// Copyright 2014 The go-gl Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package mgl64
import (
"math"
"testing"
)
func TestHomogRotate3D(t *testing.T) {
tests := []struct {
Description string
Angle float64
Axis Vec3
Expected Mat4
}{
{
"forward",
0, Vec3{0, 0, 0},
Ident4(),
},
{
"heading 90 degree",
DegToRad(90), Vec3{0, 1, 0},
Mat4{
0, 0, -1, 0,
0, 1, 0, 0,
1, 0, 0, 0,
0, 0, 0, 1,
},
},
{
"heading 180 degree",
DegToRad(180), Vec3{0, 1, 0},
Mat4{
-1, 0, 0, 0,
0, 1, 0, 0,
0, 0, -1, 0,
0, 0, 0, 1,
},
},
{
"attitude 90 degree",
DegToRad(90), Vec3{0, 0, 1},
Mat4{
0, 1, 0, 0,
-1, 0, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1,
},
},
{
"bank 90 degree",
DegToRad(90), Vec3{1, 0, 0},
Mat4{
1, 0, 0, 0,
0, 0, 1, 0,
0, -1, 0, 0,
0, 0, 0, 1,
},
},
{
"heading and attitude 90 degree",
DegToRad(90), Vec3{0, 1, 1}.Normalize(),
Mat4{
0, 0.707107, -0.707107, 0,
-0.707107, 0.5, 0.5, 0,
0.707107, 0.5, 0.5, 0,
0, 0, 0, 1,
},
},
{
"bank, heading and attitude 180 degree",
DegToRad(180), Vec3{1, 1, 1}.Normalize(),
Mat4{
-1 / 3.0, 2 / 3.0, 2 / 3.0, 0,
2 / 3.0, -1 / 3.0, 2 / 3.0, 0,
2 / 3.0, 2 / 3.0, -1 / 3.0, 0,
0, 0, 0, 1,
},
},
}
threshold := float64(math.Pow(10, -2))
for _, c := range tests {
if r := HomogRotate3D(c.Angle, c.Axis); !r.ApproxEqualThreshold(c.Expected, threshold) {
t.Errorf("%v failed: HomogRotate3D(%v, %v) != %v (got %v)", c.Description, c.Angle, c.Axis, c.Expected, r)
}
}
}
func TestExtract3DScale(t *testing.T) {
tests := []struct {
M Mat4
X, Y, Z float64
}{
{
Ident4(),
1, 1, 1,
}, {
Scale3D(1, 2, 3),
1, 2, 3,
}, {
Translate3D(10, 12, -5).Mul4(HomogRotate3D(math.Pi/2, Vec3{1, 0, 0})).Mul4(Scale3D(2, 3, 4)),
2, 3, 4,
},
}
eq := FloatEqualFunc(1e-6)
for _, c := range tests {
if x, y, z := Extract3DScale(c.M); !eq(x, c.X) || !eq(y, c.Y) || !eq(z, c.Z) {
t.Errorf("ExtractScale(%v) != %v, %v, %v (got %v, %v, %v)", c.M, c.X, c.Y, c.Z, x, y, z)
}
}
}
func TestExtractMaxScale(t *testing.T) {
tests := []struct {
M Mat4
V float64
}{
{
Ident4(),
1,
}, {
Scale3D(1, 2, 3),
3,
}, {
Translate3D(10, 12, -5).Mul4(HomogRotate3D(math.Pi/2, Vec3{1, 0, 0})).Mul4(Scale3D(2, 3, 4)),
4,
},
}
eq := FloatEqualFunc(1e-6)
for _, c := range tests {
if r := ExtractMaxScale(c.M); !eq(r, c.V) {
t.Errorf("ExtractMaxScale(%v) != %v (got %v)", c.M, c.V, r)
}
}
}
func TestTransformCoordinate(t *testing.T) {
tests := [...]struct {
v Vec3
m Mat4
out Vec3
}{
{Vec3{1, 1, 1}, Ident4(), Vec3{1, 1, 1}},
{Vec3{1, 1, 1}, Translate3D(0, 1, 1).Mul4(Scale3D(2, 2, 2)), Vec3{2, 3, 3}},
{Vec3{1, 1, -1}, Perspective(DegToRad(90), 4/3, 0, 100), Vec3{1, 1, 1}},
{Vec3{0, 0, -100}, Perspective(DegToRad(45), 4/3, 0, 100), Vec3{0, 0, 1}},
{Vec3{2, 2, -2}, Perspective(DegToRad(45), 4/3, 0, 100), Vec3{2.4142, 2.4142, 1}}, // sqrt(1^2+1^2)+1
}
for _, test := range tests {
if v := TransformCoordinate(test.v, test.m); !test.out.ApproxEqualThreshold(v, 1e-4) {
t.Errorf("TransformCoordinate on vector %v and matrix %v fails to give result %v (got %v)", test.v, test.m, test.out, v)
}
}
}
func TestTransformNormal(t *testing.T) {
tests := [...]struct {
v Vec3
m Mat4
out Vec3
}{
{Vec3{1, 1, 1}, Ident4(), Vec3{1, 1, 1}},
{Vec3{1, 1, 1}, Translate3D(0, 1, 1).Mul4(Scale3D(2, 2, 2)), Vec3{2, 2, 2}},
}
for _, test := range tests {
if v := TransformNormal(test.v, test.m); !test.out.ApproxEqualThreshold(v, 1e-4) {
t.Errorf("TransformNormal on vector %v and matrix %v fails to give result %v (got %v)", test.v, test.m, test.out, v)
}
}
}