From 8f03c113140abae9dd45c43949cf1f30a48d2248 Mon Sep 17 00:00:00 2001 From: bloeys Date: Fri, 5 Nov 2021 03:37:54 +0400 Subject: [PATCH] Remove dependence on gonum --- README.md | 2 +- gglm/geometric.go | 24 +---- gglm/mat2.go | 98 ++++++++---------- gglm/mat3.go | 165 +++++++++++++----------------- gglm/mat4.go | 249 ++++++++++++++++++++-------------------------- gglm/vec2.go | 66 ++++-------- gglm/vec3.go | 82 ++++++--------- go.mod | 2 - go.sum | 65 ------------ main.go | 30 ++---- main_test.go | 27 +++++ 11 files changed, 308 insertions(+), 502 deletions(-) create mode 100755 main_test.go diff --git a/README.md b/README.md index 0571095..b525534 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ # gglm -Go implementation of the C++ glm (OpenGL Mathematics) library +An OpenGL focused Go mathematics inspired by the C++ glm (OpenGL Mathematics) library diff --git a/gglm/geometric.go b/gglm/geometric.go index 9316f60..890330f 100755 --- a/gglm/geometric.go +++ b/gglm/geometric.go @@ -1,7 +1,5 @@ package gglm -import "gonum.org/v1/gonum/blas/blas32" - func DotVec2(v1, v2 *Vec2) float32 { return v1.X()*v2.X() + v1.Y()*v2.Y() } @@ -11,25 +9,11 @@ func DotVec3(v1, v2 *Vec3) float32 { } 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[:], + Data: [3]float32{ + v1.Data[1]*v2.Data[2] - v1.Data[2]*v2.Data[1], + v1.Data[2]*v2.Data[0] - v1.Data[0]*v2.Data[2], + v1.Data[0]*v2.Data[1] - v1.Data[1]*v2.Data[0], }, } } diff --git a/gglm/mat2.go b/gglm/mat2.go index 7b83ea5..019712d 100755 --- a/gglm/mat2.go +++ b/gglm/mat2.go @@ -2,24 +2,21 @@ package gglm import ( "fmt" - - "gonum.org/v1/gonum/blas/blas32" ) var _ Mat = &Mat2{} var _ fmt.Stringer = &Mat2{} type Mat2 struct { - Arr [4]float32 - *blas32.General + Data [4]float32 } func (m *Mat2) At(row, col int) float32 { - return m.Arr[row*2+col] + return m.Data[row*2+col] } func (m *Mat2) Set(row, col int, val float32) { - m.Arr[row*2+col] = val + m.Data[row*2+col] = val } func (m *Mat2) Size() MatSize { @@ -28,80 +25,63 @@ func (m *Mat2) Size() MatSize { func (m *Mat2) String() string { //+ always shows +/- sign; - means pad to the right; 9 means total of 9 digits (or padding if less); .3 means 3 decimals - return fmt.Sprintf("\n| %+-9.3f %+-9.3f |\n| %+-9.3f %+-9.3f |\n", m.Arr[0], m.Arr[1], m.Arr[2], m.Arr[3]) + return fmt.Sprintf("\n| %+-9.3f %+-9.3f |\n| %+-9.3f %+-9.3f |\n", m.Data[0], m.Data[1], m.Data[2], m.Data[3]) } //Add m += m2 func (m *Mat2) Add(m2 *Mat2) { - m.Arr[0] += m2.Arr[0] - m.Arr[1] += m2.Arr[1] - m.Arr[2] += m2.Arr[2] - m.Arr[3] += m2.Arr[3] + m.Data[0] += m2.Data[0] + m.Data[1] += m2.Data[1] + m.Data[2] += m2.Data[2] + m.Data[3] += m2.Data[3] } //Add m -= m2 func (m *Mat2) Sub(m2 *Mat2) { - m.Arr[0] -= m2.Arr[0] - m.Arr[1] -= m2.Arr[1] - m.Arr[2] -= m2.Arr[2] - m.Arr[3] -= m2.Arr[3] + m.Data[0] -= m2.Data[0] + m.Data[1] -= m2.Data[1] + m.Data[2] -= m2.Data[2] + m.Data[3] -= m2.Data[3] } //Scale m *= x (element wise multiplication) func (m *Mat2) Scale(x float32) { - m.Arr[0] *= x - m.Arr[1] *= x - m.Arr[2] *= x - m.Arr[3] *= x + m.Data[0] *= x + m.Data[1] *= x + m.Data[2] *= x + m.Data[3] *= x } //AddMat2 m3 = m1 + m2 func AddMat2(m1, m2 *Mat2) *Mat2 { - return NewMat2([]float32{ - m1.Arr[0] + m2.Arr[0], - m1.Arr[1] + m2.Arr[1], - m1.Arr[2] + m2.Arr[2], - m1.Arr[3] + m2.Arr[3], - }) + return &Mat2{ + Data: [4]float32{ + m1.Data[0] + m2.Data[0], + m1.Data[1] + m2.Data[1], + m1.Data[2] + m2.Data[2], + m1.Data[3] + m2.Data[3], + }, + } } //SubMat2 m3 = m1 - m2 func SubMat2(m1, m2 *Mat2) *Mat2 { - return NewMat2([]float32{ - m1.Arr[0] - m2.Arr[0], - m1.Arr[1] - m2.Arr[1], - m1.Arr[2] - m2.Arr[2], - m1.Arr[3] - m2.Arr[3], - }) -} - -//NewMat2 returns the identity matrix if data is nil, otherwise data is copied. -// -//Note: data must be row major -func NewMat2(data []float32) *Mat2 { - - arr := [4]float32{ - 1, 0, - 0, 1, - } - if data != nil { - if len(data) != 4 { - panic("Data must be nil or size 4") - } - - arr[0] = data[0] - arr[1] = data[1] - arr[2] = data[2] - arr[3] = data[3] - } - return &Mat2{ - Arr: arr, - General: &blas32.General{ - Rows: 2, - Cols: 2, - Stride: 2, - Data: arr[:], + Data: [4]float32{ + m1.Data[0] - m2.Data[0], + m1.Data[1] - m2.Data[1], + m1.Data[2] - m2.Data[2], + m1.Data[3] - m2.Data[3], + }, + } +} + +//NewMat2Id returns the 2x2 identity matrix +func NewMat2Id() *Mat2 { + return &Mat2{ + Data: [4]float32{ + 1, 0, + 0, 1, }, } } diff --git a/gglm/mat3.go b/gglm/mat3.go index 8bea75d..150c24e 100755 --- a/gglm/mat3.go +++ b/gglm/mat3.go @@ -2,24 +2,21 @@ package gglm import ( "fmt" - - "gonum.org/v1/gonum/blas/blas32" ) var _ Mat = &Mat3{} var _ fmt.Stringer = &Mat3{} type Mat3 struct { - Arr [9]float32 - *blas32.General + Data [9]float32 } func (m *Mat3) At(row, col int) float32 { - return m.Arr[row*3+col] + return m.Data[row*3+col] } func (m *Mat3) Set(row, col int, val float32) { - m.Arr[row*3+col] = val + m.Data[row*3+col] = val } func (m *Mat3) Size() MatSize { @@ -28,129 +25,105 @@ func (m *Mat3) Size() MatSize { func (m *Mat3) String() string { return fmt.Sprintf("\n| %+-9.3f %+-9.3f %+-9.3f |\n| %+-9.3f %+-9.3f %+-9.3f |\n| %+-9.3f %+-9.3f %+-9.3f |\n", - m.Arr[0], m.Arr[1], m.Arr[2], - m.Arr[3], m.Arr[4], m.Arr[5], - m.Arr[6], m.Arr[7], m.Arr[8], + m.Data[0], m.Data[1], m.Data[2], + m.Data[3], m.Data[4], m.Data[5], + m.Data[6], m.Data[7], m.Data[8], ) } //Add m += m2 func (m *Mat3) Add(m2 *Mat3) { - m.Arr[0] += m2.Arr[0] - m.Arr[1] += m2.Arr[1] - m.Arr[2] += m2.Arr[2] + m.Data[0] += m2.Data[0] + m.Data[1] += m2.Data[1] + m.Data[2] += m2.Data[2] - m.Arr[3] += m2.Arr[3] - m.Arr[4] += m2.Arr[4] - m.Arr[5] += m2.Arr[5] + m.Data[3] += m2.Data[3] + m.Data[4] += m2.Data[4] + m.Data[5] += m2.Data[5] - m.Arr[6] += m2.Arr[6] - m.Arr[7] += m2.Arr[7] - m.Arr[8] += m2.Arr[8] + m.Data[6] += m2.Data[6] + m.Data[7] += m2.Data[7] + m.Data[8] += m2.Data[8] } //Add m -= m2 func (m *Mat3) Sub(m2 *Mat3) { - m.Arr[0] -= m2.Arr[0] - m.Arr[1] -= m2.Arr[1] - m.Arr[2] -= m2.Arr[2] + m.Data[0] -= m2.Data[0] + m.Data[1] -= m2.Data[1] + m.Data[2] -= m2.Data[2] - m.Arr[3] -= m2.Arr[3] - m.Arr[4] -= m2.Arr[4] - m.Arr[5] -= m2.Arr[5] + m.Data[3] -= m2.Data[3] + m.Data[4] -= m2.Data[4] + m.Data[5] -= m2.Data[5] - m.Arr[6] -= m2.Arr[6] - m.Arr[7] -= m2.Arr[7] - m.Arr[8] -= m2.Arr[8] + m.Data[6] -= m2.Data[6] + m.Data[7] -= m2.Data[7] + m.Data[8] -= m2.Data[8] } //Scale m *= x (element wise multiplication) func (m *Mat3) Scale(x float32) { - m.Arr[0] *= x - m.Arr[1] *= x - m.Arr[2] *= x + m.Data[0] *= x + m.Data[1] *= x + m.Data[2] *= x - m.Arr[3] *= x - m.Arr[4] *= x - m.Arr[5] *= x + m.Data[3] *= x + m.Data[4] *= x + m.Data[5] *= x - m.Arr[6] *= x - m.Arr[7] *= x - m.Arr[8] *= x + m.Data[6] *= x + m.Data[7] *= x + m.Data[8] *= x } //AddMat3 m3 = m1 + m2 func AddMat3(m1, m2 *Mat3) *Mat3 { - return NewMat3([]float32{ - m1.Arr[0] + m2.Arr[0], - m1.Arr[1] + m2.Arr[1], - m1.Arr[2] + m2.Arr[2], + return &Mat3{ + Data: [9]float32{ + m1.Data[0] + m2.Data[0], + m1.Data[1] + m2.Data[1], + m1.Data[2] + m2.Data[2], - m1.Arr[3] + m2.Arr[3], - m1.Arr[4] + m2.Arr[4], - m1.Arr[5] + m2.Arr[5], + m1.Data[3] + m2.Data[3], + m1.Data[4] + m2.Data[4], + m1.Data[5] + m2.Data[5], - m1.Arr[6] + m2.Arr[6], - m1.Arr[7] + m2.Arr[7], - m1.Arr[8] + m2.Arr[8], - }) + m1.Data[6] + m2.Data[6], + m1.Data[7] + m2.Data[7], + m1.Data[8] + m2.Data[8], + }, + } } //SubMat3 m3 = m1 - m2 func SubMat3(m1, m2 *Mat3) *Mat3 { - return NewMat3([]float32{ - m1.Arr[0] - m2.Arr[0], - m1.Arr[1] - m2.Arr[1], - m1.Arr[2] - m2.Arr[2], - - m1.Arr[3] - m2.Arr[3], - m1.Arr[4] - m2.Arr[4], - m1.Arr[5] - m2.Arr[5], - - m1.Arr[6] - m2.Arr[6], - m1.Arr[7] - m2.Arr[7], - m1.Arr[8] - m2.Arr[8], - }) -} - -//NewMat3 returns the identity matrix if data is nil, otherwise data is copied. -// -//Note: data must be row major -func NewMat3(data []float32) *Mat3 { - - arr := [9]float32{ - 1, 0, 0, - 0, 1, 0, - 0, 0, 1, - } - if data != nil { - if len(data) != 9 { - panic("Data must be nil or size 9") - } - - arr[0] = data[0] - arr[1] = data[1] - arr[2] = data[2] - - arr[3] = data[3] - arr[4] = data[4] - arr[5] = data[5] - - arr[6] = data[6] - arr[7] = data[7] - arr[8] = data[8] - } - return &Mat3{ - Arr: arr, - General: &blas32.General{ - Rows: 3, - Cols: 3, - Stride: 3, - Data: arr[:], + Data: [9]float32{ + m1.Data[0] - m2.Data[0], + m1.Data[1] - m2.Data[1], + m1.Data[2] - m2.Data[2], + + m1.Data[3] - m2.Data[3], + m1.Data[4] - m2.Data[4], + m1.Data[5] - m2.Data[5], + + m1.Data[6] - m2.Data[6], + m1.Data[7] - m2.Data[7], + m1.Data[8] - m2.Data[8], + }, + } +} + +//NewMat3Id returns the 3x3 identity matrix +func NewMat3Id() *Mat3 { + return &Mat3{ + Data: [9]float32{ + 1, 0, 0, + 0, 1, 0, + 0, 0, 1, }, } } diff --git a/gglm/mat4.go b/gglm/mat4.go index 173fba4..1fefcbc 100755 --- a/gglm/mat4.go +++ b/gglm/mat4.go @@ -2,24 +2,21 @@ package gglm import ( "fmt" - - "gonum.org/v1/gonum/blas/blas32" ) var _ Mat = &Mat4{} var _ fmt.Stringer = &Mat4{} type Mat4 struct { - Arr [16]float32 - *blas32.General + Data [16]float32 } func (m *Mat4) At(row, col int) float32 { - return m.Arr[row*4+col] + return m.Data[row*4+col] } func (m *Mat4) Set(row, col int, val float32) { - m.Arr[row*4+col] = val + m.Data[row*4+col] = val } func (m *Mat4) Size() MatSize { @@ -28,179 +25,147 @@ func (m *Mat4) Size() MatSize { func (m *Mat4) String() string { return fmt.Sprintf("\n| %+-9.3f %+-9.3f %+-9.3f %+-9.3f |\n| %+-9.3f %+-9.3f %+-9.3f %+-9.3f |\n| %+-9.3f %+-9.3f %+-9.3f %+-9.3f |\n| %+-9.3f %+-9.3f %+-9.3f %+-9.3f |\n", - m.Arr[0], m.Arr[1], m.Arr[2], m.Arr[3], - m.Arr[4], m.Arr[5], m.Arr[6], m.Arr[7], - m.Arr[8], m.Arr[9], m.Arr[10], m.Arr[11], - m.Arr[12], m.Arr[13], m.Arr[14], m.Arr[15], + m.Data[0], m.Data[1], m.Data[2], m.Data[3], + m.Data[4], m.Data[5], m.Data[6], m.Data[7], + m.Data[8], m.Data[9], m.Data[10], m.Data[11], + m.Data[12], m.Data[13], m.Data[14], m.Data[15], ) } //Add m += m2 func (m *Mat4) Add(m2 *Mat4) { - m.Arr[0] += m2.Arr[0] - m.Arr[1] += m2.Arr[1] - m.Arr[2] += m2.Arr[2] - m.Arr[3] += m2.Arr[3] + m.Data[0] += m2.Data[0] + m.Data[1] += m2.Data[1] + m.Data[2] += m2.Data[2] + m.Data[3] += m2.Data[3] - m.Arr[4] += m2.Arr[4] - m.Arr[5] += m2.Arr[5] - m.Arr[6] += m2.Arr[6] - m.Arr[7] += m2.Arr[7] + m.Data[4] += m2.Data[4] + m.Data[5] += m2.Data[5] + m.Data[6] += m2.Data[6] + m.Data[7] += m2.Data[7] - m.Arr[8] += m2.Arr[8] - m.Arr[9] += m2.Arr[9] - m.Arr[10] += m2.Arr[10] - m.Arr[11] += m2.Arr[11] + m.Data[8] += m2.Data[8] + m.Data[9] += m2.Data[9] + m.Data[10] += m2.Data[10] + m.Data[11] += m2.Data[11] - m.Arr[12] += m2.Arr[12] - m.Arr[13] += m2.Arr[13] - m.Arr[14] += m2.Arr[14] - m.Arr[15] += m2.Arr[15] + m.Data[12] += m2.Data[12] + m.Data[13] += m2.Data[13] + m.Data[14] += m2.Data[14] + m.Data[15] += m2.Data[15] } //Add m -= m2 func (m *Mat4) Sub(m2 *Mat4) { - m.Arr[0] -= m2.Arr[0] - m.Arr[1] -= m2.Arr[1] - m.Arr[2] -= m2.Arr[2] - m.Arr[3] -= m2.Arr[3] + m.Data[0] -= m2.Data[0] + m.Data[1] -= m2.Data[1] + m.Data[2] -= m2.Data[2] + m.Data[3] -= m2.Data[3] - m.Arr[4] -= m2.Arr[4] - m.Arr[5] -= m2.Arr[5] - m.Arr[6] -= m2.Arr[6] - m.Arr[7] -= m2.Arr[7] + m.Data[4] -= m2.Data[4] + m.Data[5] -= m2.Data[5] + m.Data[6] -= m2.Data[6] + m.Data[7] -= m2.Data[7] - m.Arr[8] -= m2.Arr[8] - m.Arr[9] -= m2.Arr[9] - m.Arr[10] -= m2.Arr[10] - m.Arr[11] -= m2.Arr[11] + m.Data[8] -= m2.Data[8] + m.Data[9] -= m2.Data[9] + m.Data[10] -= m2.Data[10] + m.Data[11] -= m2.Data[11] - m.Arr[12] -= m2.Arr[12] - m.Arr[13] -= m2.Arr[13] - m.Arr[14] -= m2.Arr[14] - m.Arr[15] -= m2.Arr[15] + m.Data[12] -= m2.Data[12] + m.Data[13] -= m2.Data[13] + m.Data[14] -= m2.Data[14] + m.Data[15] -= m2.Data[15] } //Scale m *= x (element wise multiplication) func (m *Mat4) Scale(x float32) { - m.Arr[0] *= x - m.Arr[1] *= x - m.Arr[2] *= x - m.Arr[3] *= x + m.Data[0] *= x + m.Data[1] *= x + m.Data[2] *= x + m.Data[3] *= x - m.Arr[4] *= x - m.Arr[5] *= x - m.Arr[6] *= x - m.Arr[7] *= x + m.Data[4] *= x + m.Data[5] *= x + m.Data[6] *= x + m.Data[7] *= x - m.Arr[8] *= x - m.Arr[9] *= x - m.Arr[10] *= x - m.Arr[11] *= x + m.Data[8] *= x + m.Data[9] *= x + m.Data[10] *= x + m.Data[11] *= x - m.Arr[12] *= x - m.Arr[13] *= x - m.Arr[14] *= x - m.Arr[15] *= x + m.Data[12] *= x + m.Data[13] *= x + m.Data[14] *= x + m.Data[15] *= x } //AddMat4 m3 = m1 + m2 func AddMat4(m1, m2 *Mat4) *Mat4 { - return NewMat4([]float32{ - m1.Arr[0] + m2.Arr[0], - m1.Arr[1] + m2.Arr[1], - m1.Arr[2] + m2.Arr[2], - m1.Arr[3] + m2.Arr[3], + return &Mat4{ + Data: [16]float32{ + m1.Data[0] + m2.Data[0], + m1.Data[1] + m2.Data[1], + m1.Data[2] + m2.Data[2], + m1.Data[3] + m2.Data[3], - m1.Arr[4] + m2.Arr[4], - m1.Arr[5] + m2.Arr[5], - m1.Arr[6] + m2.Arr[6], - m1.Arr[7] + m2.Arr[7], + m1.Data[4] + m2.Data[4], + m1.Data[5] + m2.Data[5], + m1.Data[6] + m2.Data[6], + m1.Data[7] + m2.Data[7], - m1.Arr[8] + m2.Arr[8], - m1.Arr[9] + m2.Arr[9], - m1.Arr[10] + m2.Arr[10], - m1.Arr[11] + m2.Arr[11], + m1.Data[8] + m2.Data[8], + m1.Data[9] + m2.Data[9], + m1.Data[10] + m2.Data[10], + m1.Data[11] + m2.Data[11], - m1.Arr[12] + m2.Arr[12], - m1.Arr[13] + m2.Arr[13], - m1.Arr[14] + m2.Arr[14], - m1.Arr[15] + m2.Arr[15], - }) + m1.Data[12] + m2.Data[12], + m1.Data[13] + m2.Data[13], + m1.Data[14] + m2.Data[14], + m1.Data[15] + m2.Data[15], + }, + } } //SubMat4 m3 = m1 - m2 func SubMat4(m1, m2 *Mat4) *Mat4 { - return NewMat4([]float32{ - m1.Arr[0] - m2.Arr[0], - m1.Arr[1] - m2.Arr[1], - m1.Arr[2] - m2.Arr[2], - m1.Arr[3] - m2.Arr[3], - - m1.Arr[4] - m2.Arr[4], - m1.Arr[5] - m2.Arr[5], - m1.Arr[6] - m2.Arr[6], - m1.Arr[7] - m2.Arr[7], - - m1.Arr[8] - m2.Arr[8], - m1.Arr[9] - m2.Arr[9], - m1.Arr[10] - m2.Arr[10], - m1.Arr[11] - m2.Arr[11], - - m1.Arr[12] - m2.Arr[12], - m1.Arr[13] - m2.Arr[13], - m1.Arr[14] - m2.Arr[14], - m1.Arr[15] - m2.Arr[15], - }) -} - -//NewMat4 returns the identity matrix if data is nil, otherwise data is copied. -// -//Note: data must be row major -func NewMat4(data []float32) *Mat4 { - - arr := [16]float32{ - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1, - } - if data != nil { - if len(data) != 16 { - panic("Data must be nil or size 16") - } - - arr[0] = data[0] - arr[1] = data[1] - arr[2] = data[2] - arr[3] = data[3] - - arr[4] = data[4] - arr[5] = data[5] - arr[6] = data[6] - arr[7] = data[7] - - arr[8] = data[8] - arr[9] = data[9] - arr[10] = data[10] - arr[11] = data[11] - - arr[12] = data[12] - arr[13] = data[13] - arr[14] = data[14] - arr[15] = data[15] - } - return &Mat4{ - Arr: arr, - General: &blas32.General{ - Rows: 4, - Cols: 4, - Stride: 4, - Data: arr[:], + Data: [16]float32{ + m1.Data[0] - m2.Data[0], + m1.Data[1] - m2.Data[1], + m1.Data[2] - m2.Data[2], + m1.Data[3] - m2.Data[3], + + m1.Data[4] - m2.Data[4], + m1.Data[5] - m2.Data[5], + m1.Data[6] - m2.Data[6], + m1.Data[7] - m2.Data[7], + + m1.Data[8] - m2.Data[8], + m1.Data[9] - m2.Data[9], + m1.Data[10] - m2.Data[10], + m1.Data[11] - m2.Data[11], + + m1.Data[12] - m2.Data[12], + m1.Data[13] - m2.Data[13], + m1.Data[14] - m2.Data[14], + m1.Data[15] - m2.Data[15], + }, + } +} + +//NewMat4Id returns the 4x4 identity matrix +func NewMat4Id() *Mat4 { + return &Mat4{ + Data: [16]float32{ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1, }, } } diff --git a/gglm/vec2.go b/gglm/vec2.go index 082d7ac..5a4a7be 100755 --- a/gglm/vec2.go +++ b/gglm/vec2.go @@ -4,32 +4,30 @@ package gglm import ( "fmt" - - "gonum.org/v1/gonum/blas/blas32" + "math" ) var _ Swizzle2 = &Vec2{} var _ fmt.Stringer = &Vec2{} type Vec2 struct { - Arr [2]float32 - *blas32.Vector + Data [2]float32 } func (v *Vec2) X() float32 { - return v.Arr[0] + return v.Data[0] } func (v *Vec2) Y() float32 { - return v.Arr[1] + return v.Data[1] } func (v *Vec2) R() float32 { - return v.Arr[0] + return v.Data[0] } func (v *Vec2) G() float32 { - return v.Arr[1] + return v.Data[1] } func (v *Vec2) String() string { @@ -38,25 +36,25 @@ func (v *Vec2) String() string { //Scale v *= x (element wise multiplication) func (v *Vec2) Scale(x float32) { - v.Arr[0] *= x - v.Arr[1] *= x + v.Data[0] *= x + v.Data[1] *= x } //Add v += v2 func (v *Vec2) Add(v2 *Vec2) { - v.Arr[0] += v2.X() - v.Arr[1] += v2.Y() + v.Data[0] += v2.X() + v.Data[1] += v2.Y() } //SubVec2 v -= v2 func (v *Vec2) Sub(v2 *Vec2) { - v.Arr[0] -= v2.X() - v.Arr[1] -= v2.Y() + v.Data[0] -= v2.X() + v.Data[1] -= v2.Y() } //Mag returns the magnitude of the vector func (v *Vec2) Mag() float32 { - return blas32.Nrm2(*v.Vector) + return float32(math.Sqrt(float64(v.X()*v.X() + v.Y()*v.Y()))) } //Mag returns the squared magnitude of the vector @@ -66,40 +64,20 @@ func (v *Vec2) SqrMag() float32 { //AddVec2 v3 = v1 + v2 func AddVec2(v1, v2 *Vec2) *Vec2 { - return NewVec2([]float32{ - v1.X() + v2.X(), - v1.Y() + v2.Y(), - }) + return &Vec2{ + Data: [2]float32{ + v1.X() + v2.X(), + v1.Y() + v2.Y(), + }, + } } //SubVec2 v3 = v1 - v2 func SubVec2(v1, v2 *Vec2) *Vec2 { - return NewVec2([]float32{ - v1.X() - v2.X(), - v1.Y() - v2.Y(), - }) -} - -//NewVec2 copies data if its not nil -func NewVec2(data []float32) *Vec2 { - - arr := [2]float32{} - if data != nil { - - if len(data) != 2 { - panic("Data must be nil or size 2") - } - - arr[0] = data[0] - arr[1] = data[1] - } - return &Vec2{ - Arr: arr, - Vector: &blas32.Vector{ - N: 2, - Inc: 1, - Data: arr[:], + Data: [2]float32{ + v1.X() - v2.X(), + v1.Y() - v2.Y(), }, } } diff --git a/gglm/vec3.go b/gglm/vec3.go index 96effbc..56e3849 100755 --- a/gglm/vec3.go +++ b/gglm/vec3.go @@ -2,40 +2,38 @@ package gglm import ( "fmt" - - "gonum.org/v1/gonum/blas/blas32" + "math" ) var _ Swizzle3 = &Vec3{} var _ fmt.Stringer = &Vec3{} type Vec3 struct { - Arr [3]float32 - *blas32.Vector + Data [3]float32 } func (v *Vec3) X() float32 { - return v.Arr[0] + return v.Data[0] } func (v *Vec3) Y() float32 { - return v.Arr[1] + return v.Data[1] } func (v *Vec3) Z() float32 { - return v.Arr[2] + return v.Data[2] } func (v *Vec3) R() float32 { - return v.Arr[0] + return v.Data[0] } func (v *Vec3) G() float32 { - return v.Arr[1] + return v.Data[1] } func (v *Vec3) B() float32 { - return v.Arr[2] + return v.Data[2] } func (v *Vec3) String() string { @@ -44,27 +42,28 @@ func (v *Vec3) String() string { //Scale v *= x (element wise multiplication) func (v *Vec3) Scale(x float32) { - v.Arr[0] *= x - v.Arr[1] *= x - v.Arr[2] *= x + v.Data[0] *= x + v.Data[1] *= x + v.Data[2] *= x } func (v *Vec3) Add(v2 *Vec3) { - v.Arr[0] += v2.X() - v.Arr[1] += v2.Y() - v.Arr[2] += v2.Z() + + v.Data[0] += v2.X() + v.Data[1] += v2.Y() + v.Data[2] += v2.Z() } //SubVec3 v -= v2 func (v *Vec3) Sub(v2 *Vec3) { - v.Arr[0] -= v2.X() - v.Arr[1] -= v2.Y() - v.Arr[2] -= v2.Z() + v.Data[0] -= v2.X() + v.Data[1] -= v2.Y() + v.Data[2] -= v2.Z() } //Mag returns the magnitude of the vector func (v *Vec3) Mag() float32 { - return blas32.Nrm2(*v.Vector) + return float32(math.Sqrt(float64(v.X()*v.X() + v.Y()*v.Y() + v.Z()*v.Z()))) } //Mag returns the squared magnitude of the vector @@ -74,43 +73,22 @@ func (v *Vec3) SqrMag() float32 { //AddVec3 v3 = v1 + v2 func AddVec3(v1, v2 *Vec3) *Vec3 { - return NewVec3([]float32{ - v1.X() + v2.X(), - v1.Y() + v2.Y(), - v1.Z() + v2.Z(), - }) + return &Vec3{ + Data: [3]float32{ + v1.X() + v2.X(), + v1.Y() + v2.Y(), + v1.Z() + v2.Z(), + }, + } } //SubVec3 v3 = v1 - v2 func SubVec3(v1, v2 *Vec3) *Vec3 { - return NewVec3([]float32{ - v1.X() - v2.X(), - v1.Y() - v2.Y(), - v1.Z() - v2.Z(), - }) -} - -//NewVec3 copies data if its not nil -func NewVec3(data []float32) *Vec3 { - - arr := [3]float32{} - if data != nil { - - if len(data) != 3 { - panic("Data must be nil or size 3") - } - - arr[0] = data[0] - arr[1] = data[1] - arr[2] = data[2] - } - return &Vec3{ - Arr: arr, - Vector: &blas32.Vector{ - N: 3, - Inc: 1, - Data: arr[:], + Data: [3]float32{ + v1.X() - v2.X(), + v1.Y() - v2.Y(), + v1.Z() - v2.Z(), }, } } diff --git a/go.mod b/go.mod index 7ff278f..f1c57fc 100755 --- a/go.mod +++ b/go.mod @@ -1,5 +1,3 @@ module github.com/bloeys/gglm go 1.17 - -require gonum.org/v1/gonum v0.9.3 diff --git a/go.sum b/go.sum index babdcb8..e69de29 100755 --- a/go.sum +++ b/go.sum @@ -1,65 +0,0 @@ -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3 h1:n9HxLrNxWWtEb1cA950nuEEj3QnKbtsCJ6KjcgisNUs= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3 h1:DnoIG+QAMaF5NvxnGe/oKsgKcAc6PcUyl8q0VetfQ8s= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/main.go b/main.go index c8f7fd3..0555771 100755 --- a/main.go +++ b/main.go @@ -14,28 +14,16 @@ func main() { // v2 := gglm.NewVec2(nil) // v1.Add(v2) - m1 := gglm.NewMat4(nil) - - f := []float32{ - -10, 0, 100, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, + m1 := &gglm.Mat4{} + m2 := &gglm.Mat4{ + Data: [16]float32{ + -10, 0, 100, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + }, } - m2 := gglm.NewMat4(f) + 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) - } diff --git a/main_test.go b/main_test.go new file mode 100755 index 0000000..bdc0376 --- /dev/null +++ b/main_test.go @@ -0,0 +1,27 @@ +package main + +import ( + "testing" + + "github.com/bloeys/gglm/gglm" +) + +func BenchmarkVec3Add(b *testing.B) { + + v1 := gglm.NewMat4Id() + v2 := gglm.NewMat4Id() + + for i := 0; i < b.N; i++ { + gglm.AddMat4(v1, v2) + } +} + +func BenchmarkVec3Add2(b *testing.B) { + + v1 := gglm.NewMat4Id() + v2 := gglm.NewMat4Id() + + for i := 0; i < b.N; i++ { + v1.Add(v2) + } +}