-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvec4.go
97 lines (81 loc) · 1.46 KB
/
vec4.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
package glx
import (
"fmt"
"unsafe"
)
// SizeOfVec4 its size for low precision memory data dump (float32)
// dump have size of 16 bytes (x=4 + y=4 + z=4 + a=4)
const SizeOfVec4 = SizeOfVec1 * 4
type Vec4 struct {
X, Y, Z, W float32
}
func (v *Vec4) String() string {
return fmt.Sprintf("V4[%.3f, %.3f, %.3f, %.3f]", v.X, v.Y, v.Z, v.W)
}
// Data dump for low precision memory representation (GPU, shaders, etc..)
func (v *Vec4) Data() []byte {
return (*(*[SizeOfVec4]byte)(unsafe.Pointer(v)))[:]
}
// Basic Math
// -----------------------------------------
func (v Vec4) Add(n Vec4) Vec4 {
return Vec4{
X: v.X + n.X,
Y: v.Y + n.Y,
Z: v.Z + n.Z,
W: v.W + n.W,
}
}
func (v Vec4) Sub(n Vec4) Vec4 {
return Vec4{
X: v.X - n.X,
Y: v.Y - n.Y,
Z: v.Z - n.Z,
W: v.W - n.W,
}
}
func (v Vec4) Mul(n Vec4) Vec4 {
return Vec4{
X: v.X * n.X,
Y: v.Y * n.Y,
Z: v.Z * n.Z,
W: v.W * n.W,
}
}
func (v Vec4) Div(n Vec4) Vec4 {
if n.X == 0 || n.Y == 0 || n.Z == 0 || n.W == 0 {
var resX, resY, resZ, resR float32
if n.X == 0 {
resX = InfPositive()
} else {
resX = v.X / n.X
}
if n.Y == 0 {
resY = InfPositive()
} else {
resY = v.Y / n.Y
}
if n.Z == 0 {
resZ = InfPositive()
} else {
resZ = v.Z / n.Z
}
if n.W == 0 {
resR = InfPositive()
} else {
resR = v.W / n.W
}
return Vec4{
X: resX,
Y: resY,
Z: resZ,
W: resR,
}
}
return Vec4{
X: v.X / n.X,
Y: v.Y / n.Y,
Z: v.Z / n.Z,
W: v.W / n.W,
}
}