github.com/xlab/linmath@v0.0.0-20220922225318-40b6290c3b40/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  }