diff --git a/gglm/geometric.go b/gglm/geometric.go index e8aa8b7..9316f60 100755 --- a/gglm/geometric.go +++ b/gglm/geometric.go @@ -1,5 +1,35 @@ package gglm -func DotVec2(v1 *Vec2, v2 *Vec2) float32 { +import "gonum.org/v1/gonum/blas/blas32" + +func DotVec2(v1, v2 *Vec2) float32 { return v1.X()*v2.X() + v1.Y()*v2.Y() } + +func DotVec3(v1, v2 *Vec3) float32 { + return v1.X()*v2.X() + v1.Y()*v2.Y() + v1.Z()*v2.Z() +} + +func Cross(v1, v2 *Vec3) *Vec3 { + + // x = a[1]*b[2] - a[2]*b[1] + // y = a[2]*b[0] - a[0]*b[2] + // z = a[0]*b[1] - a[1]*b[0] + + //Note: It's done this way to get inlining. Any small changes + //break inlining so check before any changes. + f := [3]float32{ + v1.Arr[1]*v2.Arr[2] - v1.Arr[2]*v2.Arr[1], + v1.Arr[2]*v2.Arr[0] - v1.Arr[0]*v2.Arr[2], + v1.Arr[0]*v2.Arr[1] - v1.Arr[1]*v2.Arr[0], + } + + return &Vec3{ + Arr: f, + Vector: &blas32.Vector{ + N: 3, + Inc: 1, + Data: f[:], + }, + } +} diff --git a/main.go b/main.go index 045d475..c8f7fd3 100755 --- a/main.go +++ b/main.go @@ -23,12 +23,19 @@ func main() { 0, 0, 0, 0, } m2 := gglm.NewMat4(f) - - println("m1:", m1.String()) - println("m2:", m2.String()) - m3 := gglm.AddMat4(m1, m2) + + m2.Add(m3) + println("m1:", m1.String()) println("m2:", m2.String()) println("m3:", m3.String()) + + v1 := gglm.NewVec3([]float32{5, 4, 2}) + v2 := gglm.NewVec3([]float32{32, 10, 9}) + cp := gglm.Cross(v1, v2) + dp := gglm.DotVec3(v1, v2) + println(cp.String()) + println(dp) + }