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