-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvertex.go
101 lines (79 loc) · 2.13 KB
/
vertex.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
package main
import ( "math" )
// Vector
type Vec2 struct {
X, Y float32
}
// Vec3
type Vec3 struct {
X, Y, Z float32
}
func (v Vec3) Add( n Vec3 ) Vec3 {
return Vec3{ v.X + n.X, v.Y + n.Y, v.Z + n.Z }
}
func (v Vec3) Sub( n Vec3 ) Vec3 {
return Vec3{ v.X - n.X, v.Y - n.Y, v.Z - n.Z }
}
func (v Vec3) Len() float32 {
return float32(math.Sqrt( float64(v.X * v.X + v.Y * v.Y + v.Z * v.Z) ))
}
func (v Vec3) Cross( n Vec3 ) Vec3 {
return Vec3{ v.Y * n.Z - v.Z * n.Y, v.Z * n.X - v.X * n.Z, v.X * n.Y - v.Y * n.X }
}
func (v Vec3) Normalize() Vec3 {
l := 1.0 / v.Len()
return Vec3{ v.X * l, v.Y * l, v.Z * l }
}
// Vec4
type Vec4 struct {
X, Y, Z, W float32
}
func (v Vec4) Add( n Vec4 ) Vec4 {
return Vec4{ v.X + n.X, v.Y + n.Y, v.Z + n.Z, v.W + n.W }
}
func (v Vec4) Sub( n Vec4 ) Vec4 {
return Vec4{ v.X - n.X, v.Y - n.Y, v.Z - n.Z, v.W - n.W }
}
func (v Vec4) Mul( f float32 ) Vec4 {
return Vec4{ v.X * f, v.Y * f, v.Z * f, v.W * f }
}
func (v Vec4) Lerp( to Vec4, amt float32 ) Vec4 {
return v.Add( to.Sub( v ).Mul( amt ) )
}
// Vertex
type Vertex struct {
Pos Vec4
//Col Vec4
TexCoord Vec4
}
func (v Vertex) Transform( mat Mat4 ) Vertex {
return Vertex{ mat.Transform( v.Pos ), /*v.Col,*/ v.TexCoord }
}
func (v Vertex) PerspectiveDivide() Vertex {
return Vertex{ Vec4{ v.Pos.X / v.Pos.W,
v.Pos.Y / v.Pos.W, v.Pos.Z / v.Pos.W, v.Pos.W }, /*v.Col,*/ v.TexCoord }
}
func (v Vertex) IsInViewFrustum() bool {
return math.Abs( float64(v.Pos.X) ) <= math.Abs( float64(v.Pos.W) ) &&
math.Abs( float64(v.Pos.Y) ) <= math.Abs( float64(v.Pos.W) ) &&
math.Abs( float64(v.Pos.Z) ) <= math.Abs( float64(v.Pos.W) )
}
func (v Vertex) TriangleArea2( b, c Vertex ) float32 {
x1 := b.Pos.X - v.Pos.X
y1 := b.Pos.Y - v.Pos.Y
x2 := c.Pos.X - v.Pos.X
y2 := c.Pos.Y - v.Pos.Y
return x1 * y2 - x2 * y1
}
func (v Vertex) Lerp( other Vertex, amt float32 ) Vertex {
return Vertex{ v.Pos.Lerp( other.Pos, amt ), v.TexCoord.Lerp( other.TexCoord, amt ) }
}
func (v Vertex) GetPosI( i int ) float32 {
switch i {
case 0: return v.Pos.X
case 1: return v.Pos.Y
case 2: return v.Pos.Z
case 3: return v.Pos.W
default: panic( "GetPosI invalid index" )
}
}