matrix3.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // Copyright 2016 The G3N Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package math32
  5. type Matrix3 [9]float32
  6. func NewMatrix3() *Matrix3 {
  7. var m Matrix3
  8. m.Identity()
  9. return &m
  10. }
  11. func (m *Matrix3) Set(n11, n12, n13, n21, n22, n23, n31, n32, n33 float32) *Matrix3 {
  12. m[0] = n11
  13. m[3] = n12
  14. m[6] = n13
  15. m[1] = n21
  16. m[4] = n22
  17. m[7] = n23
  18. m[2] = n31
  19. m[5] = n32
  20. m[8] = n33
  21. return m
  22. }
  23. func (m *Matrix3) Identity() *Matrix3 {
  24. m.Set(
  25. 1, 0, 0,
  26. 0, 1, 0,
  27. 0, 0, 1,
  28. )
  29. return m
  30. }
  31. func (m *Matrix3) Copy(src *Matrix3) *Matrix3 {
  32. *m = *src
  33. return m
  34. }
  35. func (m *Matrix3) ApplyToVector3Array(array []float32, offset int, length int) []float32 {
  36. var v1 Vector3
  37. j := offset
  38. for i := 0; i < length; i += 3 {
  39. v1.X = array[j]
  40. v1.Y = array[j+1]
  41. v1.Z = array[j+2]
  42. v1.ApplyMatrix3(m)
  43. array[j] = v1.X
  44. array[j+1] = v1.Y
  45. array[j+2] = v1.Z
  46. }
  47. return array
  48. }
  49. func (m *Matrix3) MultiplyScalar(s float32) *Matrix3 {
  50. m[0] *= s
  51. m[3] *= s
  52. m[6] *= s
  53. m[1] *= s
  54. m[4] *= s
  55. m[7] *= s
  56. m[2] *= s
  57. m[5] *= s
  58. m[8] *= s
  59. return m
  60. }
  61. func (m *Matrix3) Determinant() float32 {
  62. return m[0]*m[4]*m[8] -
  63. m[0]*m[5]*m[7] -
  64. m[1]*m[3]*m[8] +
  65. m[1]*m[5]*m[6] +
  66. m[2]*m[3]*m[7] -
  67. m[2]*m[4]*m[6]
  68. }
  69. func (m *Matrix3) GetInverse(src *Matrix4, throwOnInvertible bool) *Matrix3 {
  70. m[0] = src[10]*src[5] - src[6]*src[9]
  71. m[1] = -src[10]*src[1] + src[2]*src[9]
  72. m[2] = src[6]*src[1] - src[2]*src[5]
  73. m[3] = -src[10]*src[4] + src[6]*src[8]
  74. m[4] = src[10]*src[0] - src[2]*src[8]
  75. m[5] = -src[6]*src[0] + src[2]*src[4]
  76. m[6] = src[9]*src[4] - src[5]*src[8]
  77. m[7] = -src[9]*src[0] + src[1]*src[8]
  78. m[8] = src[5]*src[0] - src[1]*src[4]
  79. det := src[0]*m[0] + src[1]*m[3] + src[2]*m[6]
  80. // no inverse
  81. if det == 0 {
  82. if throwOnInvertible {
  83. panic("Matrix3.getInverse(): can't invert matrix, determinant is 0")
  84. }
  85. m.Identity()
  86. return m
  87. }
  88. m.MultiplyScalar(1.0 / det)
  89. return m
  90. }
  91. func (m *Matrix3) Transpose() *Matrix3 {
  92. var tmp float32
  93. tmp = m[1]
  94. m[1] = m[3]
  95. m[3] = tmp
  96. tmp = m[2]
  97. m[2] = m[6]
  98. m[6] = tmp
  99. tmp = m[5]
  100. m[5] = m[7]
  101. m[7] = tmp
  102. return m
  103. }
  104. func (m *Matrix3) FlattenToArrayOffset(array []float32, offset int) []float32 {
  105. copy(array[offset:], m[:])
  106. return array
  107. }
  108. func (m *Matrix3) GetNormalMatrix(src *Matrix4) *Matrix3 {
  109. m.GetInverse(src, true).Transpose()
  110. return m
  111. }
  112. func (m *Matrix3) TransposeIntoArray(r []float32) *Matrix3 {
  113. r[0] = m[0]
  114. r[1] = m[3]
  115. r[2] = m[6]
  116. r[3] = m[1]
  117. r[4] = m[4]
  118. r[5] = m[7]
  119. r[6] = m[2]
  120. r[7] = m[5]
  121. r[8] = m[8]
  122. return m
  123. }
  124. func (m *Matrix3) FromArray(array []float32) *Matrix3 {
  125. copy(m[:], array[:9])
  126. return m
  127. }
  128. func (m *Matrix3) ToArray() []float32 {
  129. var dst = make([]float32, 9)
  130. copy(dst, m[:])
  131. return dst
  132. }
  133. func (m *Matrix3) Clone() *Matrix3 {
  134. var cloned Matrix3
  135. cloned = *m
  136. return &cloned
  137. }