From 2648dc910c01989600d047b380cf6f10b1a32121 Mon Sep 17 00:00:00 2001 From: bloeys Date: Sun, 22 May 2022 19:41:43 +0400 Subject: [PATCH] 'Add' functions to swizzle interfaces+vec tests --- gglm/swizzle.go | 21 ++ gglm/vec2.go | 42 +++- gglm/vec3.go | 46 +++++ gglm/vec4.go | 68 +++++++ gglm/vec_test.go | 491 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 660 insertions(+), 8 deletions(-) create mode 100755 gglm/vec_test.go diff --git a/gglm/swizzle.go b/gglm/swizzle.go index 2879729..34ac10f 100755 --- a/gglm/swizzle.go +++ b/gglm/swizzle.go @@ -6,6 +6,9 @@ type Swizzle1 interface { SetX(float32) SetR(float32) + + AddX(float32) + AddR(float32) } type Swizzle2 interface { @@ -15,6 +18,12 @@ type Swizzle2 interface { SetY(float32) SetG(float32) + + AddY(float32) + AddG(float32) + + AddXY(float32, float32) + AddRG(float32, float32) } type Swizzle3 interface { @@ -24,6 +33,12 @@ type Swizzle3 interface { SetZ(float32) SetB(float32) + + AddZ(float32) + AddB(float32) + + AddXYZ(float32, float32, float32) + AddRGB(float32, float32, float32) } type Swizzle4 interface { @@ -33,4 +48,10 @@ type Swizzle4 interface { SetW(float32) SetA(float32) + + AddW(float32) + AddA(float32) + + AddXYZW(float32, float32, float32, float32) + AddRGBA(float32, float32, float32, float32) } diff --git a/gglm/vec2.go b/gglm/vec2.go index 4684572..826ba10 100755 --- a/gglm/vec2.go +++ b/gglm/vec2.go @@ -30,20 +30,46 @@ func (v *Vec2) G() float32 { return v.Data[1] } -func (v *Vec2) SetX(f float32) { - v.Data[0] = f +func (v *Vec2) SetX(x float32) { + v.Data[0] = x } -func (v *Vec2) SetR(f float32) { - v.Data[0] = f +func (v *Vec2) SetR(r float32) { + v.Data[0] = r } -func (v *Vec2) SetY(f float32) { - v.Data[1] = f +func (v *Vec2) SetY(y float32) { + v.Data[1] = y } -func (v *Vec2) SetG(f float32) { - v.Data[1] = f +func (v *Vec2) SetG(g float32) { + v.Data[1] = g +} + +func (v *Vec2) AddX(x float32) { + v.Data[0] += x +} + +func (v *Vec2) AddY(y float32) { + v.Data[1] += y +} + +func (v *Vec2) AddR(r float32) { + v.Data[0] += r +} + +func (v *Vec2) AddG(g float32) { + v.Data[1] += g +} + +func (v *Vec2) AddXY(x, y float32) { + v.Data[0] += x + v.Data[1] += y +} + +func (v *Vec2) AddRG(r, g float32) { + v.Data[0] += r + v.Data[1] += g } func (v *Vec2) String() string { diff --git a/gglm/vec3.go b/gglm/vec3.go index 6161b37..711903f 100755 --- a/gglm/vec3.go +++ b/gglm/vec3.go @@ -60,6 +60,52 @@ func (v *Vec3) SetB(f float32) { v.Data[2] = f } +func (v *Vec3) AddX(x float32) { + v.Data[0] += x +} + +func (v *Vec3) AddY(y float32) { + v.Data[1] += y +} + +func (v *Vec3) AddZ(z float32) { + v.Data[2] += z +} + +func (v *Vec3) AddR(r float32) { + v.Data[0] += r +} + +func (v *Vec3) AddG(g float32) { + v.Data[1] += g +} + +func (v *Vec3) AddB(b float32) { + v.Data[2] += b +} + +func (v *Vec3) AddXY(x, y float32) { + v.Data[0] += x + v.Data[1] += y +} + +func (v *Vec3) AddRG(r, g float32) { + v.Data[0] += r + v.Data[1] += g +} + +func (v *Vec3) AddXYZ(x, y, z float32) { + v.Data[0] += x + v.Data[1] += y + v.Data[2] += z +} + +func (v *Vec3) AddRGB(r, g, b float32) { + v.Data[0] += r + v.Data[1] += g + v.Data[2] += b +} + func (v *Vec3) String() string { return fmt.Sprintf("(%f, %f, %f)", v.X(), v.Y(), v.Z()) } diff --git a/gglm/vec4.go b/gglm/vec4.go index e505730..928e361 100755 --- a/gglm/vec4.go +++ b/gglm/vec4.go @@ -76,6 +76,74 @@ func (v *Vec4) SetA(f float32) { v.Data[3] = f } +func (v *Vec4) AddX(x float32) { + v.Data[0] += x +} + +func (v *Vec4) AddY(y float32) { + v.Data[1] += y +} + +func (v *Vec4) AddZ(z float32) { + v.Data[2] += z +} + +func (v *Vec4) AddW(w float32) { + v.Data[3] += w +} + +func (v *Vec4) AddR(r float32) { + v.Data[0] += r +} + +func (v *Vec4) AddG(g float32) { + v.Data[1] += g +} + +func (v *Vec4) AddB(b float32) { + v.Data[2] += b +} + +func (v *Vec4) AddA(a float32) { + v.Data[3] += a +} + +func (v *Vec4) AddXY(x, y float32) { + v.Data[0] += x + v.Data[1] += y +} + +func (v *Vec4) AddRG(r, g float32) { + v.Data[0] += r + v.Data[1] += g +} + +func (v *Vec4) AddXYZ(x, y, z float32) { + v.Data[0] += x + v.Data[1] += y + v.Data[2] += z +} + +func (v *Vec4) AddRGB(r, g, b float32) { + v.Data[0] += r + v.Data[1] += g + v.Data[2] += b +} + +func (v *Vec4) AddXYZW(x, y, z, w float32) { + v.Data[0] += x + v.Data[1] += y + v.Data[2] += z + v.Data[3] += w +} + +func (v *Vec4) AddRGBA(r, g, b, a float32) { + v.Data[0] += r + v.Data[1] += g + v.Data[2] += b + v.Data[3] += a +} + func (v *Vec4) String() string { return fmt.Sprintf("(%f, %f, %f, %f)", v.X(), v.Y(), v.Z(), v.W()) } diff --git a/gglm/vec_test.go b/gglm/vec_test.go new file mode 100755 index 0000000..ba5308c --- /dev/null +++ b/gglm/vec_test.go @@ -0,0 +1,491 @@ +package gglm_test + +import ( + "testing" + + "github.com/bloeys/gglm/gglm" +) + +func TestVecSwizzleGet(t *testing.T) { + + //Vec2 + v2 := gglm.NewVec2(1, 2) + var ans2X float32 = 1 + var ans2Y float32 = 2 + + if v2.X() != ans2X { + t.Errorf("Got: %v; Expected: %v", v2.X(), ans2X) + } + + if v2.Y() != ans2Y { + t.Errorf("Got: %v; Expected: %v", v2.Y(), ans2Y) + } + + if v2.R() != ans2X { + t.Errorf("Got: %v; Expected: %v", v2.R(), ans2X) + } + + if v2.G() != ans2Y { + t.Errorf("Got: %v; Expected: %v", v2.G(), ans2Y) + } + + //Vec3 + v3 := gglm.NewVec3(1, 2, 3) + var ans3X float32 = 1 + var ans3Y float32 = 2 + var ans3Z float32 = 3 + + if v3.X() != ans3X { + t.Errorf("Got: %v; Expected: %v", v3.X(), ans3X) + } + + if v3.Y() != ans3Y { + t.Errorf("Got: %v; Expected: %v", v3.Y(), ans3Y) + } + + if v3.Z() != ans3Z { + t.Errorf("Got: %v; Expected: %v", v3.Z(), ans3Z) + } + + if v3.R() != ans3X { + t.Errorf("Got: %v; Expected: %v", v3.R(), ans3X) + } + + if v3.G() != ans3Y { + t.Errorf("Got: %v; Expected: %v", v3.G(), ans3Y) + } + + if v3.B() != ans3Z { + t.Errorf("Got: %v; Expected: %v", v3.B(), ans3Z) + } + + //Vec4 + v4 := gglm.NewVec4(1, 2, 3, 4) + var ans4X float32 = 1 + var ans4Y float32 = 2 + var ans4Z float32 = 3 + var ans4W float32 = 4 + + if v4.X() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.X(), ans4X) + } + + if v4.Y() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.Y(), ans4Y) + } + + if v4.Z() != ans4Z { + t.Errorf("Got: %v; Expected: %v", v4.Z(), ans4Z) + } + + if v4.W() != ans4W { + t.Errorf("Got: %v; Expected: %v", v4.W(), ans4W) + } + + if v4.R() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.R(), ans4X) + } + + if v4.G() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.G(), ans4Y) + } + + if v4.B() != ans4Z { + t.Errorf("Got: %v; Expected: %v", v4.B(), ans4Z) + } + + if v4.A() != ans4W { + t.Errorf("Got: %v; Expected: %v", v4.A(), ans4W) + } +} + +func TestVecSwizzleSet(t *testing.T) { + + //Vec2 + v2 := gglm.NewVec2(0, 0) + var ans2X float32 = 1 + var ans2Y float32 = 2 + + v2.SetX(1) + v2.SetY(2) + + if v2.X() != ans2X { + t.Errorf("Got: %v; Expected: %v", v2.X(), ans2X) + } + + if v2.Y() != ans2Y { + t.Errorf("Got: %v; Expected: %v", v2.Y(), ans2Y) + } + + ans2X = 11 + ans2Y = 22 + v2.SetR(11) + v2.SetG(22) + + if v2.X() != ans2X { + t.Errorf("Got: %v; Expected: %v", v2.X(), ans2X) + } + + if v2.Y() != ans2Y { + t.Errorf("Got: %v; Expected: %v", v2.Y(), ans2Y) + } + + //Vec3 + v3 := gglm.NewVec3(0, 0, 0) + var ans3X float32 = 1 + var ans3Y float32 = 2 + var ans3Z float32 = 3 + + v3.SetX(1) + v3.SetY(2) + v3.SetZ(3) + + if v3.X() != ans3X { + t.Errorf("Got: %v; Expected: %v", v3.X(), ans3X) + } + + if v3.Y() != ans3Y { + t.Errorf("Got: %v; Expected: %v", v3.Y(), ans3Y) + } + + if v3.Z() != ans3Z { + t.Errorf("Got: %v; Expected: %v", v3.Z(), ans3Z) + } + + ans3X = 11 + ans3Y = 22 + ans3Z = 33 + + v3.SetR(11) + v3.SetG(22) + v3.SetB(33) + + if v3.X() != ans3X { + t.Errorf("Got: %v; Expected: %v", v3.X(), ans3X) + } + + if v3.Y() != ans3Y { + t.Errorf("Got: %v; Expected: %v", v3.Y(), ans3Y) + } + + if v3.Z() != ans3Z { + t.Errorf("Got: %v; Expected: %v", v3.Z(), ans3Z) + } + + //Vec4 + v4 := gglm.NewVec4(0, 0, 0, 0) + var ans4X float32 = 1 + var ans4Y float32 = 2 + var ans4Z float32 = 3 + var ans4W float32 = 4 + + v4.SetX(1) + v4.SetY(2) + v4.SetZ(3) + v4.SetW(4) + + if v4.X() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.X(), ans4X) + } + + if v4.Y() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.Y(), ans4Y) + } + + if v4.Z() != ans4Z { + t.Errorf("Got: %v; Expected: %v", v4.Z(), ans4Z) + } + + if v4.W() != ans4W { + t.Errorf("Got: %v; Expected: %v", v4.W(), ans4W) + } + + ans4X = 11 + ans4Y = 22 + ans4Z = 33 + ans4W = 44 + + v4.SetR(11) + v4.SetG(22) + v4.SetB(33) + v4.SetA(44) + + if v4.X() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.X(), ans4X) + } + + if v4.Y() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.Y(), ans4Y) + } + + if v4.Z() != ans4Z { + t.Errorf("Got: %v; Expected: %v", v4.Z(), ans4Z) + } + + if v4.W() != ans4W { + t.Errorf("Got: %v; Expected: %v", v4.W(), ans4W) + } +} + +func TestVecSwizzleAdd(t *testing.T) { + + //Vec2 + v2 := gglm.NewVec2(0, 0) + var ans2X float32 = 1 + var ans2Y float32 = 2 + v2.AddX(1) + v2.AddY(2) + if v2.X() != ans2X { + t.Errorf("Got: %v; Expected: %v", v2.X(), ans2X) + } + + if v2.Y() != ans2Y { + t.Errorf("Got: %v; Expected: %v", v2.Y(), ans2Y) + } + + v2 = gglm.NewVec2(0, 0) + v2.AddR(1) + v2.AddG(2) + if v2.X() != ans2X { + t.Errorf("Got: %v; Expected: %v", v2.X(), ans2X) + } + + if v2.Y() != ans2Y { + t.Errorf("Got: %v; Expected: %v", v2.Y(), ans2Y) + } + + v2 = gglm.NewVec2(0, 0) + v2.AddXY(1, 2) + if v2.X() != ans2X { + t.Errorf("Got: %v; Expected: %v", v2.X(), ans2X) + } + + if v2.Y() != ans2Y { + t.Errorf("Got: %v; Expected: %v", v2.Y(), ans2Y) + } + + v2 = gglm.NewVec2(0, 0) + v2.AddRG(1, 2) + if v2.X() != ans2X { + t.Errorf("Got: %v; Expected: %v", v2.X(), ans2X) + } + + if v2.Y() != ans2Y { + t.Errorf("Got: %v; Expected: %v", v2.Y(), ans2Y) + } + + //Vec3 + v3 := gglm.NewVec3(0, 0, 0) + var ans3X float32 = 1 + var ans3Y float32 = 2 + var ans3Z float32 = 3 + v3.AddX(1) + v3.AddY(2) + v3.AddZ(3) + if v3.X() != ans3X { + t.Errorf("Got: %v; Expected: %v", v3.X(), ans3X) + } + + if v3.Y() != ans3Y { + t.Errorf("Got: %v; Expected: %v", v3.Y(), ans3Y) + } + + if v3.Z() != ans3Z { + t.Errorf("Got: %v; Expected: %v", v3.Z(), ans3Z) + } + + v3 = gglm.NewVec3(0, 0, 0) + v3.AddR(1) + v3.AddG(2) + v3.AddB(3) + if v3.X() != ans3X { + t.Errorf("Got: %v; Expected: %v", v3.X(), ans3X) + } + + if v3.Y() != ans3Y { + t.Errorf("Got: %v; Expected: %v", v3.Y(), ans3Y) + } + + if v3.Z() != ans3Z { + t.Errorf("Got: %v; Expected: %v", v3.Z(), ans3Z) + } + + v3 = gglm.NewVec3(0, 0, 0) + v3.AddXY(1, 2) + if v3.X() != ans3X { + t.Errorf("Got: %v; Expected: %v", v3.X(), ans3X) + } + + if v3.Y() != ans3Y { + t.Errorf("Got: %v; Expected: %v", v3.Y(), ans3Y) + } + + v3 = gglm.NewVec3(0, 0, 0) + v3.AddRG(1, 2) + if v3.X() != ans3X { + t.Errorf("Got: %v; Expected: %v", v3.X(), ans3X) + } + + if v3.Y() != ans3Y { + t.Errorf("Got: %v; Expected: %v", v3.Y(), ans3Y) + } + + v3 = gglm.NewVec3(0, 0, 0) + v3.AddXYZ(1, 2, 3) + if v3.X() != ans3X { + t.Errorf("Got: %v; Expected: %v", v3.X(), ans3X) + } + + if v3.Y() != ans3Y { + t.Errorf("Got: %v; Expected: %v", v3.Y(), ans3Y) + } + + if v3.Z() != ans3Z { + t.Errorf("Got: %v; Expected: %v", v3.Z(), ans3Z) + } + + v3 = gglm.NewVec3(0, 0, 0) + v3.AddRGB(1, 2, 3) + if v3.X() != ans3X { + t.Errorf("Got: %v; Expected: %v", v3.X(), ans3X) + } + + if v3.Y() != ans3Y { + t.Errorf("Got: %v; Expected: %v", v3.Y(), ans3Y) + } + + if v3.Z() != ans3Z { + t.Errorf("Got: %v; Expected: %v", v3.Z(), ans3Z) + } + + //Vec4 + v4 := gglm.NewVec4(1, 1, 1, 1) + var ans4X float32 = 2 + var ans4Y float32 = 3 + var ans4Z float32 = 4 + var ans4W float32 = 5 + v4.AddX(1) + v4.AddY(2) + v4.AddZ(3) + v4.AddW(4) + if v4.X() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.X(), ans4X) + } + + if v4.Y() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.Y(), ans4Y) + } + + if v4.Z() != ans4Z { + t.Errorf("Got: %v; Expected: %v", v4.Z(), ans4Z) + } + + if v4.W() != ans4W { + t.Errorf("Got: %v; Expected: %v", v4.W(), ans4W) + } + + v4 = gglm.NewVec4(1, 1, 1, 1) + v4.AddR(1) + v4.AddG(2) + v4.AddB(3) + v4.AddA(4) + if v4.X() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.X(), ans4X) + } + + if v4.Y() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.Y(), ans4Y) + } + + if v4.Z() != ans4Z { + t.Errorf("Got: %v; Expected: %v", v4.Z(), ans4Z) + } + + if v4.W() != ans4W { + t.Errorf("Got: %v; Expected: %v", v4.W(), ans4W) + } + + v4 = gglm.NewVec4(1, 1, 1, 1) + v4.AddXY(1, 2) + if v4.X() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.X(), ans4X) + } + + if v4.Y() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.Y(), ans4Y) + } + + v4 = gglm.NewVec4(1, 1, 1, 1) + v4.AddRG(1, 2) + if v4.X() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.X(), ans4X) + } + + if v4.Y() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.Y(), ans4Y) + } + + v4 = gglm.NewVec4(1, 1, 1, 1) + v4.AddXYZ(1, 2, 3) + if v4.X() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.X(), ans4X) + } + + if v4.Y() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.Y(), ans4Y) + } + + if v4.Z() != ans4Z { + t.Errorf("Got: %v; Expected: %v", v4.Z(), ans4Z) + } + + v4 = gglm.NewVec4(1, 1, 1, 1) + v4.AddRGB(1, 2, 3) + if v4.X() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.X(), ans4X) + } + + if v4.Y() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.Y(), ans4Y) + } + + if v4.Z() != ans4Z { + t.Errorf("Got: %v; Expected: %v", v4.Z(), ans4Z) + } + + v4 = gglm.NewVec4(1, 1, 1, 1) + v4.AddXYZW(1, 2, 3, 4) + if v4.X() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.X(), ans4X) + } + + if v4.Y() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.Y(), ans4Y) + } + + if v4.Z() != ans4Z { + t.Errorf("Got: %v; Expected: %v", v4.Z(), ans4Z) + } + + if v4.W() != ans4W { + t.Errorf("Got: %v; Expected: %v", v4.W(), ans4W) + } + + v4 = gglm.NewVec4(1, 1, 1, 1) + v4.AddRGBA(1, 2, 3, 4) + if v4.X() != ans4X { + t.Errorf("Got: %v; Expected: %v", v4.X(), ans4X) + } + + if v4.Y() != ans4Y { + t.Errorf("Got: %v; Expected: %v", v4.Y(), ans4Y) + } + + if v4.Z() != ans4Z { + t.Errorf("Got: %v; Expected: %v", v4.Z(), ans4Z) + } + + if v4.W() != ans4W { + t.Errorf("Got: %v; Expected: %v", v4.W(), ans4W) + } +}