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