github.com/mojzesh/linmath@v0.0.0-20220615094601-759643be23c3/vec3.go (about) 1 package linmath 2 3 type Vec3 [3]float32 4 5 func (r *Vec3) Add(a, b *Vec3) { 6 for i := 0; i < 3; i++ { 7 r[i] = a[i] + b[i] 8 } 9 } 10 11 func (r *Vec3) Sub(a, b *Vec3) { 12 for i := 0; i < 3; i++ { 13 r[i] = a[i] - b[i] 14 } 15 } 16 17 func (r *Vec3) Scale(v *Vec3, s float32) { 18 for i := 0; i < 3; i++ { 19 r[i] = v[i] * s 20 } 21 } 22 23 func (r *Vec3) ScaleVec4(v *Vec4, s float32) { 24 for i := 0; i < 3; i++ { 25 r[i] = v[i] * s 26 } 27 } 28 29 func (r *Vec3) ScaleQuat(q *Quat, s float32) { 30 for i := 0; i < 3; i++ { 31 r[i] = q[i] * s 32 } 33 } 34 35 func (v *Vec3) Len() float32 { 36 return sqrtf(Vec3MultInner(v, v)) 37 } 38 39 func (r *Vec3) Norm(v *Vec3) { 40 var k float32 = 1.0 / v.Len() 41 r.Scale(v, k) 42 } 43 44 func (r *Vec3) Min(a, b *Vec3) { 45 for i := 0; i < 3; i++ { 46 if a[i] < b[i] { 47 r[i] = a[i] 48 } else { 49 r[i] = b[i] 50 } 51 } 52 } 53 54 func (r *Vec3) Max(a, b *Vec3) { 55 for i := 0; i < 3; i++ { 56 if a[i] > b[i] { 57 r[i] = a[i] 58 } else { 59 r[i] = b[i] 60 } 61 } 62 } 63 64 func Vec3MultInner(a, b *Vec3) (p float32) { 65 for i := 0; i < 3; i++ { 66 p += b[i] * a[i] 67 } 68 return p 69 } 70 71 func (r *Vec3) MultCross(a, b *Vec3) { 72 r[0] = a[1]*b[2] - a[2]*b[1] 73 r[1] = a[2]*b[0] - a[0]*b[2] 74 r[2] = a[0]*b[1] - a[1]*b[0] 75 } 76 77 func (r *Vec3) Reflect(v, n *Vec3) { 78 var p float32 = 2 * Vec3MultInner(v, n) 79 for i := 0; i < 3; i++ { 80 r[i] = v[i] - p*n[i] 81 } 82 }