-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtriangle.go
109 lines (85 loc) · 3.23 KB
/
triangle.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package ghetty
import (
"math"
)
const (
XMax = 0
YMax = 1
XMin = 2
YMin = 3
)
type Triangle struct {
UV [3]Vertex
Vertices [3]Vertex
Color [3]Vertex
Normals [3]Vertex
Texture *Texture
Shader *Shader
}
func (triangle *Triangle) Transform(m2 *Matrix) {
for index := range triangle.Vertices {
triangle.Vertices[index].Transform(m2)
}
}
func (triangle *Triangle) ScreenSpace() {
for index := range triangle.Vertices {
triangle.Vertices[index].ScreenSpace()
}
}
func (triangle *Triangle) Normalize() {
for index := range triangle.Vertices {
triangle.Vertices[index].Normalize()
}
}
func (triangle *Triangle) Sort() {
for i := range triangle.Vertices {
for j := i + 1; j < len(triangle.Vertices); j++ {
if triangle.Vertices[i][Y] > triangle.Vertices[j][Y] {
triangle.Vertices[i].Swap(&triangle.Vertices[j])
triangle.Normals[i].Swap(&triangle.Normals[j])
triangle.UV[i].Swap(&triangle.UV[j])
triangle.Color[i].Swap(&triangle.Color[j])
}
}
}
}
func (triangle *Triangle) Interpolate(w, s, t float32) (float32, float32, float32) {
return w*triangle.Color[0][R] + s*triangle.Color[1][R] + t*triangle.Color[2][R],
w*triangle.Color[0][G] + s*triangle.Color[1][G] + t*triangle.Color[2][G],
w*triangle.Color[0][B] + s*triangle.Color[1][B] + t*triangle.Color[2][B]
}
func (triangle *Triangle) Bounds() Vertex {
return Vertex{
float32(math.Max(float64(triangle.Vertices[0][X]),
math.Max(float64(triangle.Vertices[1][X]), float64(triangle.Vertices[2][X])))) + 1,
float32(math.Max(float64(triangle.Vertices[0][Y]),
math.Max(float64(triangle.Vertices[1][Y]), float64(triangle.Vertices[2][Y])))) + 1,
float32(math.Min(float64(triangle.Vertices[0][X]),
math.Min(float64(triangle.Vertices[1][X]), float64(triangle.Vertices[2][X])))),
float32(math.Min(float64(triangle.Vertices[0][Y]),
math.Min(float64(triangle.Vertices[1][Y]), float64(triangle.Vertices[2][Y])))),
}
}
func (triangle *Triangle) EdgeSpan(x, y int) (float32, float32, float32) {
return (triangle.Vertices[2][Y]-triangle.Vertices[1][Y])*(float32(x)-triangle.Vertices[1][X]) -
(triangle.Vertices[2][X]-triangle.Vertices[1][X])*(float32(y)-triangle.Vertices[1][Y]),
(triangle.Vertices[0][Y]-triangle.Vertices[2][Y])*(float32(x)-triangle.Vertices[2][X]) -
(triangle.Vertices[0][X]-triangle.Vertices[2][X])*(float32(y)-triangle.Vertices[2][Y]),
(triangle.Vertices[1][Y]-triangle.Vertices[0][Y])*(float32(x)-triangle.Vertices[0][X]) -
(triangle.Vertices[1][X]-triangle.Vertices[0][X])*(float32(y)-triangle.Vertices[0][Y])
}
func (triangle *Triangle) Span() (Vertex, Vertex) {
return Vertex{triangle.Vertices[1][X] - triangle.Vertices[0][X], triangle.Vertices[1][Y] - triangle.Vertices[0][Y]},
Vertex{triangle.Vertices[2][X] - triangle.Vertices[0][X], triangle.Vertices[2][Y] - triangle.Vertices[0][Y]}
}
func (triangle *Triangle) Copy() (copiedTriangle Triangle) {
for index := range triangle.Vertices {
copiedTriangle.UV[index] = triangle.UV[index].Copy()
copiedTriangle.Vertices[index] = triangle.Vertices[index].Copy()
copiedTriangle.Color[index] = triangle.Color[index].Copy()
copiedTriangle.Normals[index] = triangle.Normals[index].Copy()
copiedTriangle.Texture = triangle.Texture
}
copiedTriangle.Shader = triangle.Shader
return
}