diff --git a/pkg/MeshTypes/matrix.go b/pkg/MeshTypes/matrix.go index 5ffa456..67c64ba 100644 --- a/pkg/MeshTypes/matrix.go +++ b/pkg/MeshTypes/matrix.go @@ -37,6 +37,15 @@ func (a Matrix) Mul(b Matrix) Matrix { return m } +func (a Matrix) MulScalar(b float64) Matrix { + return Matrix{ + a.X00 * b, a.X01 * b, a.X02 * b, a.X03 * b, + a.X10 * b, a.X11 * b, a.X12 * b, a.X13 * b, + a.X20 * b, a.X21 * b, a.X22 * b, a.X23 * b, + a.X30 * b, a.X31 * b, a.X32 * b, a.X33 * b, + } +} + func (a Matrix) MulPosition(b Vector) Vector { x := a.X00*b.X + a.X01*b.Y + a.X02*b.Z + a.X03 y := a.X10*b.X + a.X11*b.Y + a.X12*b.Z + a.X13 diff --git a/pkg/MeshTypes/mesh.go b/pkg/MeshTypes/mesh.go index a5d4d96..4d9b287 100644 --- a/pkg/MeshTypes/mesh.go +++ b/pkg/MeshTypes/mesh.go @@ -5,19 +5,16 @@ import ( ) type Mesh struct { - Triangles []*Triangle + Triangles []Triangle } -func (obj *Mesh) AddTriangle(triangle *Triangle) { +func (obj *Mesh) AddTriangle(triangle Triangle) { obj.Triangles = append(obj.Triangles, triangle) } func (obj *Mesh) Copy() Mesh { - triangles := make([]*Triangle, len(obj.Triangles)) - for index, triangle := range obj.Triangles { - temp := triangle.Copy() - triangles[index] = &temp - } + triangles := make([]Triangle, len(obj.Triangles)) + copy(triangles, obj.Triangles) return Mesh{Triangles: triangles} } @@ -31,42 +28,42 @@ func (obj *Mesh) Add(mesh ...*Mesh) *Mesh { } func (obj *Mesh) RotateAndTranslate(translationMatrix Matrix) { - for _, triangle := range obj.Triangles { - triangle.V0.Position = translationMatrix.MulPosition(triangle.V0.Position) - triangle.V1.Position = translationMatrix.MulPosition(triangle.V1.Position) - triangle.V2.Position = translationMatrix.MulPosition(triangle.V2.Position) - if triangle.V0.Normal != nil { - n0 := translationMatrix.MulDirection(*triangle.V0.Normal) - triangle.V0.Normal = &n0 + for triangle_id := range obj.Triangles { + obj.Triangles[triangle_id].V0.Position = translationMatrix.MulPosition(obj.Triangles[triangle_id].V0.Position) + obj.Triangles[triangle_id].V1.Position = translationMatrix.MulPosition(obj.Triangles[triangle_id].V1.Position) + obj.Triangles[triangle_id].V2.Position = translationMatrix.MulPosition(obj.Triangles[triangle_id].V2.Position) + if obj.Triangles[triangle_id].V0.Normal != nil { + n0 := translationMatrix.MulDirection(*obj.Triangles[triangle_id].V0.Normal) + obj.Triangles[triangle_id].V0.Normal = &n0 } - if triangle.V1.Normal != nil { - n1 := translationMatrix.MulDirection(*triangle.V1.Normal) - triangle.V1.Normal = &n1 + if obj.Triangles[triangle_id].V1.Normal != nil { + n1 := translationMatrix.MulDirection(*obj.Triangles[triangle_id].V1.Normal) + obj.Triangles[triangle_id].V1.Normal = &n1 } - if triangle.V2.Normal != nil { - n2 := translationMatrix.MulDirection(*triangle.V2.Normal) - triangle.V2.Normal = &n2 + if obj.Triangles[triangle_id].V2.Normal != nil { + n2 := translationMatrix.MulDirection(*obj.Triangles[triangle_id].V2.Normal) + obj.Triangles[triangle_id].V2.Normal = &n2 } } } -func (obj *Mesh) calculateBoundingBox() Vector { +func (obj *Mesh) CalculateBoundingBox() Vector { // init with first triangle to prohibit 0 values being min or max - if len(obj.Triangles) == 0 || obj.Triangles[0] == nil || obj.Triangles[0].V0 == nil { + if len(obj.Triangles) == 0 { return Vector{} } min := obj.Triangles[0].V0.Position max := obj.Triangles[0].V0.Position for _, triangle := range obj.Triangles { - min = triangle.V0.Position.Min(&min) - max = triangle.V0.Position.Max(&max) + min = triangle.V0.Position.Min(min) + max = triangle.V0.Position.Max(max) - min = triangle.V1.Position.Min(&min) - max = triangle.V1.Position.Max(&max) + min = triangle.V1.Position.Min(min) + max = triangle.V1.Position.Max(max) - min = triangle.V2.Position.Min(&min) - max = triangle.V2.Position.Max(&max) + min = triangle.V2.Position.Min(min) + max = triangle.V2.Position.Max(max) } return Vector{ X: max.X - min.X, @@ -76,26 +73,26 @@ func (obj *Mesh) calculateBoundingBox() Vector { } func (obj *Mesh) Scale(scaling Vector) error { - scaledVectors := make(map[*Vertex]struct{}) - for _, triangle := range obj.Triangles { + scaledVectors := make(map[Vertex]struct{}) + for triangle_id, triangle := range obj.Triangles { if _, exists := scaledVectors[triangle.V0]; !exists { - triangle.V0.Position = triangle.V0.Position.Mult(scaling) - scaledVectors[triangle.V0] = struct{}{} + obj.Triangles[triangle_id].V0.Position = triangle.V0.Position.Mult(scaling) + scaledVectors[obj.Triangles[triangle_id].V0] = struct{}{} } if _, exists := scaledVectors[triangle.V1]; !exists { - triangle.V1.Position = triangle.V1.Position.Mult(scaling) - scaledVectors[triangle.V1] = struct{}{} + obj.Triangles[triangle_id].V1.Position = triangle.V1.Position.Mult(scaling) + scaledVectors[obj.Triangles[triangle_id].V1] = struct{}{} } if _, exists := scaledVectors[triangle.V2]; !exists { - triangle.V2.Position = triangle.V2.Position.Mult(scaling) - scaledVectors[triangle.V2] = struct{}{} + obj.Triangles[triangle_id].V2.Position = triangle.V2.Position.Mult(scaling) + scaledVectors[obj.Triangles[triangle_id].V2] = struct{}{} } } return nil } func (obj *Mesh) ScaleToDimensions(desiredSize *Vector) error { - actual := obj.calculateBoundingBox() + actual := obj.CalculateBoundingBox() if actual.X == 0 && actual.Y == 0 && actual.Z == 0 { return fmt.Errorf("invalid Mesh with 0 dimension") } diff --git a/pkg/MeshTypes/triangle.go b/pkg/MeshTypes/triangle.go index 7f6c81c..681f4e3 100644 --- a/pkg/MeshTypes/triangle.go +++ b/pkg/MeshTypes/triangle.go @@ -1,9 +1,9 @@ package MeshTypes type Triangle struct { - V0 *Vertex - V1 *Vertex - V2 *Vertex + V0 Vertex + V1 Vertex + V2 Vertex } func (t *Triangle) Normal() Vector { @@ -13,8 +13,5 @@ func (t *Triangle) Normal() Vector { } func (obj *Triangle) Copy() Triangle { - V0 := obj.V0.Copy() - V1 := obj.V1.Copy() - V2 := obj.V2.Copy() - return Triangle{V0: &V0, V1: &V1, V2: &V2} + return Triangle{V0: obj.V0.Copy(), V1: obj.V1.Copy(), V2: obj.V2.Copy()} } diff --git a/pkg/MeshTypes/vector.go b/pkg/MeshTypes/vector.go index 41f54cd..fe9ad49 100644 --- a/pkg/MeshTypes/vector.go +++ b/pkg/MeshTypes/vector.go @@ -53,14 +53,14 @@ func (a Vector) Normalize() Vector { return Vector{a.X * r, a.Y * r, a.Z * r} } -func (obj Vector) ToVertex(normal *Vector) *Vertex { - return &Vertex{ +func (obj Vector) ToVertex(normal *Vector) Vertex { + return Vertex{ Position: obj, Normal: normal, } } -func (a Vector) Min(b *Vector) Vector { +func (a Vector) Min(b Vector) Vector { return Vector{ math.Min(a.X, b.X), math.Min(a.Y, b.Y), @@ -68,7 +68,7 @@ func (a Vector) Min(b *Vector) Vector { } } -func (a Vector) Max(b *Vector) Vector { +func (a Vector) Max(b Vector) Vector { return Vector{ math.Max(a.X, b.X), math.Max(a.Y, b.Y), diff --git a/pkg/file_handlers/3ds.go b/pkg/file_handlers/3ds.go index 3e3bc48..9e03e7a 100644 --- a/pkg/file_handlers/3ds.go +++ b/pkg/file_handlers/3ds.go @@ -37,9 +37,9 @@ func Load3DS(fileData *[]byte, desiredSize *MeshTypes.Vector) (*MeshTypes.Mesh, file := bytes.NewReader(*fileData) - var vertices []*MeshTypes.Vertex - var faces []*MeshTypes.Triangle - var triangles []*MeshTypes.Triangle + var vertices []MeshTypes.Vertex + var faces []MeshTypes.Triangle + var triangles []MeshTypes.Triangle for { header := ChunkHeader{} if err := binary.Read(file, binary.LittleEndian, &header); err != nil { @@ -100,7 +100,7 @@ func Load3DS(fileData *[]byte, desiredSize *MeshTypes.Vector) (*MeshTypes.Mesh, return mesh, nil } -func readSmoothingGroups(file *bytes.Reader, triangles []*MeshTypes.Triangle) error { +func readSmoothingGroups(file *bytes.Reader, triangles []MeshTypes.Triangle) error { groups := make([]uint32, len(triangles)) if err := binary.Read(file, binary.LittleEndian, &groups); err != nil { return err @@ -162,36 +162,36 @@ func readSmoothingGroups(file *bytes.Reader, triangles []*MeshTypes.Triangle) er // return matrix, nil // } -func readVertexList(file *bytes.Reader) ([]*MeshTypes.Vertex, error) { +func readVertexList(file *bytes.Reader) ([]MeshTypes.Vertex, error) { var count uint16 if err := binary.Read(file, binary.LittleEndian, &count); err != nil { return nil, err } - result := make([]*MeshTypes.Vertex, count) + result := make([]MeshTypes.Vertex, count) for i := range result { var v [3]float32 if err := binary.Read(file, binary.LittleEndian, &v); err != nil { return nil, err } - result[i] = &MeshTypes.Vertex{ + result[i] = MeshTypes.Vertex{ Position: MeshTypes.Vector{X: float64(v[0]), Y: float64(v[1]), Z: float64(v[2])}, } } return result, nil } -func readFaceList(file *bytes.Reader, vertices []*MeshTypes.Vertex) ([]*MeshTypes.Triangle, error) { +func readFaceList(file *bytes.Reader, vertices []MeshTypes.Vertex) ([]MeshTypes.Triangle, error) { var count uint16 if err := binary.Read(file, binary.LittleEndian, &count); err != nil { return nil, err } - result := make([]*MeshTypes.Triangle, count) + result := make([]MeshTypes.Triangle, count) for i := range result { var v [4]uint16 if err := binary.Read(file, binary.LittleEndian, &v); err != nil { return nil, err } - result[i] = &MeshTypes.Triangle{ + result[i] = MeshTypes.Triangle{ V0: vertices[v[0]], V1: vertices[v[1]], V2: vertices[v[2]], } } diff --git a/pkg/file_handlers/gltf.go b/pkg/file_handlers/gltf.go index d5c846e..5aad96c 100644 --- a/pkg/file_handlers/gltf.go +++ b/pkg/file_handlers/gltf.go @@ -49,8 +49,8 @@ func LoadGLTF(file io.Reader, desiredSize *Types.Vector) (*Types.Mesh, error) { Y: posAccessor.Max[2], Z: posAccessor.Max[1], }) - min = min.Min(&tempMin) - max = max.Max(&tempMax) + min = min.Min(tempMin) + max = max.Max(tempMax) } } @@ -98,7 +98,7 @@ func LoadGLTF(file io.Reader, desiredSize *Types.Vector) (*Types.Mesh, error) { v1 := positions[indices[i+1]].ToVertex(n1) v2 := positions[indices[i+2]].ToVertex(n2) - mesh.AddTriangle(&Types.Triangle{V0: v0, V1: v1, V2: v2}) + mesh.AddTriangle(Types.Triangle{V0: v0, V1: v1, V2: v2}) } meshes.Add(&mesh) diff --git a/pkg/primitives/cube.go b/pkg/primitives/cube.go index 2369b06..ef33f04 100644 --- a/pkg/primitives/cube.go +++ b/pkg/primitives/cube.go @@ -8,72 +8,72 @@ func NewCube() Types.Mesh { {X: -1, Y: -1, Z: -1}, {X: -1, Y: -1, Z: 1}, {X: 1, Y: -1, Z: 1}, {X: 1, Y: -1, Z: -1}, } mesh := Types.Mesh{ - Triangles: []*Types.Triangle{ + Triangles: []Types.Triangle{ // top { - V0: &Types.Vertex{Position: v[1], Normal: nil}, - V1: &Types.Vertex{Position: v[2], Normal: nil}, - V2: &Types.Vertex{Position: v[3], Normal: nil}, + V0: Types.Vertex{Position: v[1], Normal: nil}, + V1: Types.Vertex{Position: v[2], Normal: nil}, + V2: Types.Vertex{Position: v[3], Normal: nil}, }, { - V0: &Types.Vertex{Position: v[0], Normal: nil}, - V1: &Types.Vertex{Position: v[1], Normal: nil}, - V2: &Types.Vertex{Position: v[3], Normal: nil}, + V0: Types.Vertex{Position: v[0], Normal: nil}, + V1: Types.Vertex{Position: v[1], Normal: nil}, + V2: Types.Vertex{Position: v[3], Normal: nil}, }, // left { - V0: &Types.Vertex{Position: v[4], Normal: nil}, - V1: &Types.Vertex{Position: v[1], Normal: nil}, - V2: &Types.Vertex{Position: v[0], Normal: nil}, + V0: Types.Vertex{Position: v[4], Normal: nil}, + V1: Types.Vertex{Position: v[1], Normal: nil}, + V2: Types.Vertex{Position: v[0], Normal: nil}, }, { - V0: &Types.Vertex{Position: v[4], Normal: nil}, - V1: &Types.Vertex{Position: v[5], Normal: nil}, - V2: &Types.Vertex{Position: v[1], Normal: nil}, + V0: Types.Vertex{Position: v[4], Normal: nil}, + V1: Types.Vertex{Position: v[5], Normal: nil}, + V2: Types.Vertex{Position: v[1], Normal: nil}, }, // front { - V0: &Types.Vertex{Position: v[5], Normal: nil}, - V1: &Types.Vertex{Position: v[2], Normal: nil}, - V2: &Types.Vertex{Position: v[1], Normal: nil}, + V0: Types.Vertex{Position: v[5], Normal: nil}, + V1: Types.Vertex{Position: v[2], Normal: nil}, + V2: Types.Vertex{Position: v[1], Normal: nil}, }, { - V0: &Types.Vertex{Position: v[5], Normal: nil}, - V1: &Types.Vertex{Position: v[6], Normal: nil}, - V2: &Types.Vertex{Position: v[2], Normal: nil}, + V0: Types.Vertex{Position: v[5], Normal: nil}, + V1: Types.Vertex{Position: v[6], Normal: nil}, + V2: Types.Vertex{Position: v[2], Normal: nil}, }, // right { - V0: &Types.Vertex{Position: v[7], Normal: nil}, - V1: &Types.Vertex{Position: v[3], Normal: nil}, - V2: &Types.Vertex{Position: v[2], Normal: nil}, + V0: Types.Vertex{Position: v[7], Normal: nil}, + V1: Types.Vertex{Position: v[3], Normal: nil}, + V2: Types.Vertex{Position: v[2], Normal: nil}, }, { - V0: &Types.Vertex{Position: v[7], Normal: nil}, - V1: &Types.Vertex{Position: v[2], Normal: nil}, - V2: &Types.Vertex{Position: v[6], Normal: nil}, + V0: Types.Vertex{Position: v[7], Normal: nil}, + V1: Types.Vertex{Position: v[2], Normal: nil}, + V2: Types.Vertex{Position: v[6], Normal: nil}, }, // back { - V0: &Types.Vertex{Position: v[0], Normal: nil}, - V1: &Types.Vertex{Position: v[3], Normal: nil}, - V2: &Types.Vertex{Position: v[4], Normal: nil}, + V0: Types.Vertex{Position: v[0], Normal: nil}, + V1: Types.Vertex{Position: v[3], Normal: nil}, + V2: Types.Vertex{Position: v[4], Normal: nil}, }, { - V0: &Types.Vertex{Position: v[7], Normal: nil}, - V1: &Types.Vertex{Position: v[4], Normal: nil}, - V2: &Types.Vertex{Position: v[3], Normal: nil}, + V0: Types.Vertex{Position: v[7], Normal: nil}, + V1: Types.Vertex{Position: v[4], Normal: nil}, + V2: Types.Vertex{Position: v[3], Normal: nil}, }, // bottom { - V0: &Types.Vertex{Position: v[6], Normal: nil}, - V1: &Types.Vertex{Position: v[5], Normal: nil}, - V2: &Types.Vertex{Position: v[4], Normal: nil}, + V0: Types.Vertex{Position: v[6], Normal: nil}, + V1: Types.Vertex{Position: v[5], Normal: nil}, + V2: Types.Vertex{Position: v[4], Normal: nil}, }, { - V0: &Types.Vertex{Position: v[7], Normal: nil}, - V1: &Types.Vertex{Position: v[6], Normal: nil}, - V2: &Types.Vertex{Position: v[4], Normal: nil}, + V0: Types.Vertex{Position: v[7], Normal: nil}, + V1: Types.Vertex{Position: v[6], Normal: nil}, + V2: Types.Vertex{Position: v[4], Normal: nil}, }, }, } diff --git a/pkg/primitives/cylinder.go b/pkg/primitives/cylinder.go index 5347ae1..baf5618 100644 --- a/pkg/primitives/cylinder.go +++ b/pkg/primitives/cylinder.go @@ -32,7 +32,7 @@ func radians(degrees float64) float64 { } func NewCylinder(step int, capped bool) Types.Mesh { - var triangles []*Types.Triangle + var triangles []Types.Triangle for a0 := 0; a0 < 360; a0 += step { a1 := (a0 + step) % 360 r0 := radians(float64(a0)) @@ -45,15 +45,15 @@ func NewCylinder(step int, capped bool) Types.Mesh { p10 := Types.Vector{X: x1, Y: y1, Z: -0.5} p11 := Types.Vector{X: x1, Y: y1, Z: 0.5} p01 := Types.Vector{X: x0, Y: y0, Z: 0.5} - t1 := &Types.Triangle{V0: p00.ToVertex(nil), V1: p10.ToVertex(nil), V2: p11.ToVertex(nil)} - t2 := &Types.Triangle{V0: p00.ToVertex(nil), V1: p11.ToVertex(nil), V2: p01.ToVertex(nil)} + t1 := Types.Triangle{V0: p00.ToVertex(nil), V1: p10.ToVertex(nil), V2: p11.ToVertex(nil)} + t2 := Types.Triangle{V0: p00.ToVertex(nil), V1: p11.ToVertex(nil), V2: p01.ToVertex(nil)} triangles = append(triangles, t1) triangles = append(triangles, t2) if capped { p0 := Types.Vector{X: 0, Y: 0, Z: -0.5} p1 := Types.Vector{X: 0, Y: 0, Z: 0.5} - t3 := &Types.Triangle{V0: p0.ToVertex(nil), V1: p10.ToVertex(nil), V2: p00.ToVertex(nil)} - t4 := &Types.Triangle{V0: p1.ToVertex(nil), V1: p01.ToVertex(nil), V2: p11.ToVertex(nil)} + t3 := Types.Triangle{V0: p0.ToVertex(nil), V1: p10.ToVertex(nil), V2: p00.ToVertex(nil)} + t4 := Types.Triangle{V0: p1.ToVertex(nil), V1: p01.ToVertex(nil), V2: p11.ToVertex(nil)} triangles = append(triangles, t3) triangles = append(triangles, t4) } diff --git a/pkg/primitives/sphere.go b/pkg/primitives/sphere.go index bf283e7..e1658da 100644 --- a/pkg/primitives/sphere.go +++ b/pkg/primitives/sphere.go @@ -24,7 +24,7 @@ package Primitives import Types "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" func NewSphere(detail int) Types.Mesh { - var triangles []*Types.Triangle + var triangles []Types.Triangle ico := NewIcosahedron() for _, t := range ico.Triangles { v1 := t.V0.Position @@ -35,16 +35,16 @@ func NewSphere(detail int) Types.Mesh { return Types.Mesh{Triangles: triangles} } -func newSphereHelper(detail int, v1, v2, v3 Types.Vector) []*Types.Triangle { +func newSphereHelper(detail int, v1, v2, v3 Types.Vector) []Types.Triangle { if detail == 0 { - t := &Types.Triangle{ + t := Types.Triangle{ V0: v1.ToVertex(nil), V1: v2.ToVertex(nil), V2: v3.ToVertex(nil), } - return []*Types.Triangle{t} + return []Types.Triangle{t} } - var triangles []*Types.Triangle + var triangles []Types.Triangle v12 := v1.Add(v2).DivScalar(2).Normalize() v13 := v1.Add(v3).DivScalar(2).Normalize() v23 := v2.Add(v3).DivScalar(2).Normalize() @@ -94,12 +94,12 @@ func NewIcosahedron() *Types.Mesh { {11, 7, 9}, {11, 9, 10}, } - triangles := make([]*Types.Triangle, len(indices)) + triangles := make([]Types.Triangle, len(indices)) for i, idx := range indices { p1 := vertices[idx[0]] p2 := vertices[idx[1]] p3 := vertices[idx[2]] - triangles[i] = &Types.Triangle{ + triangles[i] = Types.Triangle{ V0: p1.ToVertex(nil), V1: p2.ToVertex(nil), V2: p3.ToVertex(nil), diff --git a/tests/MeshTypes/matrix_test.go b/tests/MeshTypes/matrix_test.go index 3a3362b..4d1e4a0 100644 --- a/tests/MeshTypes/matrix_test.go +++ b/tests/MeshTypes/matrix_test.go @@ -19,6 +19,25 @@ func TestIdentityMatrix(t *testing.T) { } } +func TestMulScalar(t *testing.T) { + a := MeshTypes.Matrix{ + X00: 1, X01: 2, X02: 3, X03: 4, + X10: 5, X11: 6, X12: 7, X13: 8, + X20: 9, X21: 10, X22: 11, X23: 12, + X30: 13, X31: 14, X32: 15, X33: 16, + } + want := MeshTypes.Matrix{ + X00: 3, X01: 6, X02: 9, X03: 12, + X10: 15, X11: 18, X12: 21, X13: 24, + X20: 27, X21: 30, X22: 33, X23: 36, + X30: 39, X31: 42, X32: 45, X33: 48, + } + result := a.MulScalar(3) + if !reflect.DeepEqual(result, want) { + t.Errorf(`Matrix Scalar Multiplication Output does not match`) + } +} + func TestMatrixMul(t *testing.T) { a := MeshTypes.Matrix{ X00: 1, X01: 2, X02: 3, X03: 4, diff --git a/tests/MeshTypes/mesh_test.go b/tests/MeshTypes/mesh_test.go index 509b7f9..f6c6a83 100644 --- a/tests/MeshTypes/mesh_test.go +++ b/tests/MeshTypes/mesh_test.go @@ -8,17 +8,17 @@ import ( "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" ) -func RandomTriangle() *MeshTypes.Triangle { - return &MeshTypes.Triangle{ +func RandomTriangle() MeshTypes.Triangle { + return MeshTypes.Triangle{ V0: RandomVertex(), V1: RandomVertex(), V2: RandomVertex(), } } -func RandomVertex() *MeshTypes.Vertex { +func RandomVertex() MeshTypes.Vertex { normal := RandomVector() - return &MeshTypes.Vertex{ + return MeshTypes.Vertex{ Position: RandomVector(), Normal: &normal, } @@ -34,19 +34,19 @@ func RandomVector() MeshTypes.Vector { func TestAddTriangle(t *testing.T) { a := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{RandomTriangle()}, + Triangles: []MeshTypes.Triangle{RandomTriangle()}, } b := RandomTriangle() copy := a.Copy() copy.AddTriangle(b) - if !reflect.DeepEqual(copy, MeshTypes.Mesh{Triangles: []*MeshTypes.Triangle{a.Triangles[0], b}}) { + if !reflect.DeepEqual(copy, MeshTypes.Mesh{Triangles: []MeshTypes.Triangle{a.Triangles[0], b}}) { t.Errorf("Mesh AddTriangle() Output does not match expected") } } func TestMeshCopy(t *testing.T) { a := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{RandomTriangle()}, + Triangles: []MeshTypes.Triangle{RandomTriangle()}, } copy := a.Copy() if !(reflect.DeepEqual(a, copy) && &a != ©) { @@ -56,21 +56,21 @@ func TestMeshCopy(t *testing.T) { func TestAddMesh(t *testing.T) { a := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{RandomTriangle()}, + Triangles: []MeshTypes.Triangle{RandomTriangle()}, } b := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{RandomTriangle()}, + Triangles: []MeshTypes.Triangle{RandomTriangle()}, } copy := a.Copy() result := copy.Add(&b) - if !reflect.DeepEqual(*result, MeshTypes.Mesh{Triangles: []*MeshTypes.Triangle{a.Triangles[0], b.Triangles[0]}}) { + if !reflect.DeepEqual(*result, MeshTypes.Mesh{Triangles: []MeshTypes.Triangle{a.Triangles[0], b.Triangles[0]}}) { t.Errorf("Mesh Add() Output does not match expected") } } func TestRotateAndTranslate(t *testing.T) { a := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{RandomTriangle()}, + Triangles: []MeshTypes.Triangle{RandomTriangle()}, } translationMatrix := MeshTypes.Matrix{ X00: 1, X01: -1, X02: 5, X03: -20, @@ -81,7 +81,8 @@ func TestRotateAndTranslate(t *testing.T) { result := a.Copy() result.RotateAndTranslate(translationMatrix) want := a.Copy() - for _, triangle := range want.Triangles { + for triangle_id := range want.Triangles { + triangle := &want.Triangles[triangle_id] triangle.V0.Position = translationMatrix.MulPosition(triangle.V0.Position) // safe to use as func is tested in another place triangle.V1.Position = translationMatrix.MulPosition(triangle.V1.Position) triangle.V2.Position = translationMatrix.MulPosition(triangle.V2.Position) @@ -105,11 +106,11 @@ func TestRotateAndTranslate(t *testing.T) { func TestScaleToDimensions(t *testing.T) { a := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{ + Triangles: []MeshTypes.Triangle{ { - V0: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: -1, Y: 1, Z: -1}}, - V1: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 1, Y: -3, Z: 1}}, - V2: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 1, Y: 1, Z: 0}}, + V0: MeshTypes.Vertex{Position: MeshTypes.Vector{X: -1, Y: 1, Z: -1}}, + V1: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 1, Y: -3, Z: 1}}, + V2: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 1, Y: 1, Z: 0}}, }, }, } @@ -119,11 +120,11 @@ func TestScaleToDimensions(t *testing.T) { result := a.Copy() result.ScaleToDimensions(&desiredSize) want := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{ + Triangles: []MeshTypes.Triangle{ { - V0: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: -2, Y: 1, Z: -4}}, - V1: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 2, Y: -3, Z: 4}}, - V2: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 2, Y: 1, Z: 0}}, + V0: MeshTypes.Vertex{Position: MeshTypes.Vector{X: -2, Y: 1, Z: -4}}, + V1: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 2, Y: -3, Z: 4}}, + V2: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 2, Y: 1, Z: 0}}, }, }, } @@ -134,39 +135,7 @@ func TestScaleToDimensions(t *testing.T) { func TestScaleToDimensionsEmptyMesh(t *testing.T) { a := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{}, - } - desiredSize := MeshTypes.Vector{ - X: 4, Y: 4, Z: 8, - } - err := a.ScaleToDimensions(&desiredSize) - if err == nil { - t.Errorf("Mesh ScaleToDimensions() did not return error on faulty mesh") - } -} - -func TestScaleToDimensionsNullTriangle(t *testing.T) { - a := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{nil}, - } - desiredSize := MeshTypes.Vector{ - X: 4, Y: 4, Z: 8, - } - err := a.ScaleToDimensions(&desiredSize) - if err == nil { - t.Errorf("Mesh ScaleToDimensions() did not return error on faulty mesh") - } -} - -func TestScaleToDimensionsNullVertex(t *testing.T) { - a := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{ - { - V0: nil, - V1: nil, - V2: nil, - }, - }, + Triangles: []MeshTypes.Triangle{}, } desiredSize := MeshTypes.Vector{ X: 4, Y: 4, Z: 8, @@ -179,11 +148,11 @@ func TestScaleToDimensionsNullVertex(t *testing.T) { func TestScaleToDimensions0Size(t *testing.T) { a := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{ + Triangles: []MeshTypes.Triangle{ { - V0: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, - V1: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, - V2: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, + V0: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, + V1: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, + V2: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, }, }, } @@ -198,13 +167,13 @@ func TestScaleToDimensions0Size(t *testing.T) { func TestScaleToDimensionsSameVertex(t *testing.T) { triangle := MeshTypes.Triangle{ - V0: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, - V1: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, - V2: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, + V0: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, + V1: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, + V2: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 0, Y: 0, Z: 0}}, } a := MeshTypes.Mesh{ - Triangles: []*MeshTypes.Triangle{ - &triangle, + Triangles: []MeshTypes.Triangle{ + triangle, { V0: triangle.V0, V1: triangle.V1, diff --git a/tests/MeshTypes/triangle_test.go b/tests/MeshTypes/triangle_test.go index 4791777..a7e1b52 100644 --- a/tests/MeshTypes/triangle_test.go +++ b/tests/MeshTypes/triangle_test.go @@ -9,9 +9,9 @@ import ( func TestTriangleNormal(t *testing.T) { a := MeshTypes.Triangle{ - V0: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 1, Y: 4, Z: 3}, Normal: &MeshTypes.Vector{X: 4, Y: 5, Z: 6}}, - V1: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 4, Y: 8, Z: 10}, Normal: &MeshTypes.Vector{X: 10, Y: 11, Z: 12}}, - V2: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 13, Y: 14, Z: 15}, Normal: &MeshTypes.Vector{X: 16, Y: 17, Z: 18}}, + V0: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 1, Y: 4, Z: 3}, Normal: &MeshTypes.Vector{X: 4, Y: 5, Z: 6}}, + V1: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 4, Y: 8, Z: 10}, Normal: &MeshTypes.Vector{X: 10, Y: 11, Z: 12}}, + V2: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 13, Y: 14, Z: 15}, Normal: &MeshTypes.Vector{X: 16, Y: 17, Z: 18}}, } want := MeshTypes.Vector{X: -0.39436910666014113, Y: 0.8604416872584897, Z: -0.3226656327219336} result := a.Normal() @@ -22,12 +22,12 @@ func TestTriangleNormal(t *testing.T) { func TestTriangleCopy(t *testing.T) { a := MeshTypes.Triangle{ - V0: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 1, Y: 2, Z: 3}, Normal: &MeshTypes.Vector{X: 4, Y: 5, Z: 6}}, - V1: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 7, Y: 8, Z: 9}, Normal: &MeshTypes.Vector{X: 10, Y: 11, Z: 12}}, - V2: &MeshTypes.Vertex{Position: MeshTypes.Vector{X: 13, Y: 14, Z: 15}, Normal: &MeshTypes.Vector{X: 16, Y: 17, Z: 18}}, + V0: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 1, Y: 2, Z: 3}, Normal: &MeshTypes.Vector{X: 4, Y: 5, Z: 6}}, + V1: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 7, Y: 8, Z: 9}, Normal: &MeshTypes.Vector{X: 10, Y: 11, Z: 12}}, + V2: MeshTypes.Vertex{Position: MeshTypes.Vector{X: 13, Y: 14, Z: 15}, Normal: &MeshTypes.Vector{X: 16, Y: 17, Z: 18}}, } copy := a.Copy() - if !(reflect.DeepEqual(copy, a) && a.V0 != copy.V0 && a.V1 != copy.V1 && a.V2 != copy.V2) { + if !(reflect.DeepEqual(copy, a) && a.V0.Normal != copy.V0.Normal && a.V1.Normal != copy.V1.Normal && a.V2.Normal != copy.V2.Normal) { t.Error("Triangle Copy() returned value does not match expected value") } } diff --git a/tests/MeshTypes/vector_test.go b/tests/MeshTypes/vector_test.go index b8b2306..3d21f99 100644 --- a/tests/MeshTypes/vector_test.go +++ b/tests/MeshTypes/vector_test.go @@ -89,14 +89,14 @@ func TestToVertex(t *testing.T) { Position: a, Normal: nil, } - if !reflect.DeepEqual(*a.ToVertex(nil), wantFirst) { + if !reflect.DeepEqual(a.ToVertex(nil), wantFirst) { t.Error("Vector To Vertex returned value with nil Normal does not match expected value") } wantSecond := MeshTypes.Vertex{ Position: a, Normal: &b, } - if !reflect.DeepEqual(*a.ToVertex(&b), wantSecond) || &b != wantSecond.Normal { + if !reflect.DeepEqual(a.ToVertex(&b), wantSecond) || &b != wantSecond.Normal { t.Error("Vector To Vertex returned value with Normal does not match expected value") } } @@ -111,7 +111,7 @@ func TestMin(t *testing.T) { want := MeshTypes.Vector{ X: 1, Y: 2, Z: 3, } - if !reflect.DeepEqual(a.Min(&b), want) { + if !reflect.DeepEqual(a.Min(b), want) { t.Error("Vector Min() returned value does not match expected value") } } @@ -126,7 +126,7 @@ func TestMax(t *testing.T) { want := MeshTypes.Vector{ X: 3, Y: 4, Z: 6, } - if !reflect.DeepEqual(a.Max(&b), want) { + if !reflect.DeepEqual(a.Max(b), want) { t.Error("Vector Max() returned value does not match expected value") } }