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  }