mat4.monkey2 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. Namespace std.geom
  2. #rem monkeydoc Convenience type alias for Mat4\<Float\>.
  3. #end
  4. Alias Mat4f:Mat4<Float>
  5. #rem monkeydoc The generic Mat3 class provides support for 4x4 matrices.
  6. #end
  7. Struct Mat4<T>
  8. Field i:Vec4<T>
  9. Field j:Vec4<T>
  10. Field k:Vec4<T>
  11. Field t:Vec4<T>
  12. Method New()
  13. i.x=1;j.y=1;k.z=1;t.w=1
  14. End
  15. Method New( ix:T,jy:T,kz:T,tw:T )
  16. i.x=ix;j.y=jy;k.z=kz;t.w=tw
  17. End
  18. Method New( i:Vec4<T>,j:Vec4<T>,k:Vec4<T>,t:Vec4<T> )
  19. Self.i=i;Self.j=j;Self.k=k;Self.t=t
  20. End
  21. Method New( m:Mat3<T> )
  22. i.XYZ=m.i ; j.XYZ=m.j ; k.XYZ=m.k ; t.w=1
  23. End
  24. Method New( m:AffineMat3<T> )
  25. i.XY=m.i ; j.XY=m.j ; k.z=1 ; t.XY=m.t ; t.w=1
  26. End
  27. Method New( m:AffineMat4<T> )
  28. i.XYZ=m.m.i ; j.XYZ=m.m.j ; k.XYZ=m.m.k ; t.XYZ=m.t ; t.w=1
  29. End
  30. Operator To<C>:Mat4<C>()
  31. Return New Mat4<C>( i,j,k,t )
  32. End
  33. Operator To:String()
  34. Return "Mat4("+i+","+j+","+k+","+t+")"
  35. End
  36. Operator~:Mat4()
  37. Return New Mat4(
  38. New Vec4<T>( i.x,j.x,k.x,t.x ),
  39. New Vec4<T>( i.y,j.y,k.y,t.y ),
  40. New Vec4<T>( i.z,j.z,k.z,t.z ),
  41. New Vec4<T>( i.w,j.w,k.w,t.w ) )
  42. End
  43. Operator-:Mat4()
  44. Local ii:=New Vec4<T>(
  45. j.y * k.z * t.w - j.y * k.w * t.z - k.y * j.z * t.w + k.y * j.w * t.z + t.y * j.z * k.w - t.y * j.w * k.z,
  46. -i.y * k.z * t.w + i.y * k.w * t.z + k.y * i.z * t.w - k.y * i.w * t.z - t.y * i.z * k.w + t.y * i.w * k.z,
  47. i.y * j.z * t.w - i.y * j.w * t.z - j.y * i.z * t.w + j.y * i.w * t.z + t.y * i.z * j.w - t.y * i.w * j.z,
  48. -i.y * j.z * k.w + i.y * j.w * k.z + j.y * i.z * k.w - j.y * i.w * k.z - k.y * i.z * j.w + k.y * i.w * j.z )
  49. Local jj:=New Vec4<T>(
  50. -j.x * k.z * t.w + j.x * k.w * t.z + k.x * j.z * t.w - k.x * j.w * t.z - t.x * j.z * k.w + t.x * j.w * k.z,
  51. i.x * k.z * t.w - i.x * k.w * t.z - k.x * i.z * t.w + k.x * i.w * t.z + t.x * i.z * k.w - t.x * i.w * k.z,
  52. -i.x * j.z * t.w + i.x * j.w * t.z + j.x * i.z * t.w - j.x * i.w * t.z - t.x * i.z * j.w + t.x * i.w * j.z,
  53. i.x * j.z * k.w - i.x * j.w * k.z - j.x * i.z * k.w + j.x * i.w * k.z + k.x * i.z * j.w - k.x * i.w * j.z )
  54. Local kk:=New Vec4<T>(
  55. j.x * k.y * t.w - j.x * k.w * t.y - k.x * j.y * t.w + k.x * j.w * t.y + t.x * j.y * k.w - t.x * j.w * k.y,
  56. -i.x * k.y * t.w + i.x * k.w * t.y + k.x * i.y * t.w - k.x * i.w * t.y - t.x * i.y * k.w + t.x * i.w * k.y,
  57. i.x * j.y * t.w - i.x * j.w * t.y - j.x * i.y * t.w + j.x * i.w * t.y + t.x * i.y * j.w - t.x * i.w * j.y,
  58. -i.x * j.y * k.w + i.x * j.w * k.y + j.x * i.y * k.w - j.x * i.w * k.y - k.x * i.y * j.w + k.x * i.w * j.y )
  59. Local tt:=New Vec4<T>(
  60. -j.x * k.y * t.z + j.x * k.z * t.y + k.x * j.y * t.z - k.x * j.z * t.y - t.x * j.y * k.z + t.x * j.z * k.y,
  61. i.x * k.y * t.z - i.x * k.z * t.y - k.x * i.y * t.z + k.x * i.z * t.y + t.x * i.y * k.z - t.x * i.z * k.y,
  62. -i.x * j.y * t.z + i.x * j.z * t.y + j.x * i.y * t.z - j.x * i.z * t.y - t.x * i.y * j.z + t.x * i.z * j.y,
  63. i.x * j.y * k.z - i.x * j.z * k.y - j.x * i.y * k.z + j.x * i.z * k.y + k.x * i.y * j.z - k.x * i.z * j.y )
  64. Local c:T=1/(i.x*ii.x + i.y * jj.x + i.z * kk.x + i.w * tt.x)
  65. Return New Mat4( ii*c,jj*c,kk*c,tt*c )
  66. End
  67. Operator*:Mat4( m:Mat4 )
  68. Local r:Mat4
  69. r.i.x=i.x*m.i.x + j.x*m.i.y + k.x*m.i.z + t.x*m.i.w
  70. r.i.y=i.y*m.i.x + j.y*m.i.y + k.y*m.i.z + t.y*m.i.w
  71. r.i.z=i.z*m.i.x + j.z*m.i.y + k.z*m.i.z + t.z*m.i.w
  72. r.i.w=i.w*m.i.x + j.w*m.i.y + k.w*m.i.z + t.w*m.i.w
  73. r.j.x=i.x*m.j.x + j.x*m.j.y + k.x*m.j.z + t.x*m.j.w
  74. r.j.y=i.y*m.j.x + j.y*m.j.y + k.y*m.j.z + t.y*m.j.w
  75. r.j.z=i.z*m.j.x + j.z*m.j.y + k.z*m.j.z + t.z*m.j.w
  76. r.j.w=i.w*m.j.x + j.w*m.j.y + k.w*m.j.z + t.w*m.j.w
  77. r.k.x=i.x*m.k.x + j.x*m.k.y + k.x*m.k.z + t.x*m.k.w
  78. r.k.y=i.y*m.k.x + j.y*m.k.y + k.y*m.k.z + t.y*m.k.w
  79. r.k.z=i.z*m.k.x + j.z*m.k.y + k.z*m.k.z + t.z*m.k.w
  80. r.k.w=i.w*m.k.x + j.w*m.k.y + k.w*m.k.z + t.w*m.k.w
  81. r.t.x=i.x*m.t.x + j.x*m.t.y + k.x*m.t.z + t.x*m.t.w
  82. r.t.y=i.y*m.t.x + j.y*m.t.y + k.y*m.t.z + t.y*m.t.w
  83. r.t.z=i.z*m.t.x + j.z*m.t.y + k.z*m.t.z + t.z*m.t.w
  84. r.t.w=i.w*m.t.x + j.w*m.t.y + k.w*m.t.z + t.w*m.t.w
  85. Return r
  86. End
  87. Operator*:Mat4( m:AffineMat4<T> )
  88. Local r:Mat4
  89. r.i.x=i.x*m.m.i.x + j.x*m.m.i.y + k.x*m.m.i.z
  90. r.i.y=i.y*m.m.i.x + j.y*m.m.i.y + k.y*m.m.i.z
  91. r.i.z=i.z*m.m.i.x + j.z*m.m.i.y + k.z*m.m.i.z
  92. r.i.w=i.w*m.m.i.x + j.w*m.m.i.y + k.w*m.m.i.z
  93. r.j.x=i.x*m.m.j.x + j.x*m.m.j.y + k.x*m.m.j.z
  94. r.j.y=i.y*m.m.j.x + j.y*m.m.j.y + k.y*m.m.j.z
  95. r.j.z=i.z*m.m.j.x + j.z*m.m.j.y + k.z*m.m.j.z
  96. r.j.w=i.w*m.m.j.x + j.w*m.m.j.y + k.w*m.m.j.z
  97. r.k.x=i.x*m.m.k.x + j.x*m.m.k.y + k.x*m.m.k.z
  98. r.k.y=i.y*m.m.k.x + j.y*m.m.k.y + k.y*m.m.k.z
  99. r.k.z=i.z*m.m.k.x + j.z*m.m.k.y + k.z*m.m.k.z
  100. r.k.w=i.w*m.m.k.x + j.w*m.m.k.y + k.w*m.m.k.z
  101. r.t.x=i.x*m.t.x + j.x*m.t.y + k.x*m.t.z + t.x
  102. r.t.y=i.y*m.t.x + j.y*m.t.y + k.y*m.t.z + t.y
  103. r.t.z=i.z*m.t.x + j.z*m.t.y + k.z*m.t.z + t.z
  104. r.t.w=i.w*m.t.x + j.w*m.t.y + k.w*m.t.z + t.w
  105. Return r
  106. End
  107. Operator*:Mat4( m:Mat3<T> )
  108. Local r:Mat4
  109. r.i.x=i.x*m.i.x + j.x*m.i.y + k.x*m.i.z
  110. r.i.y=i.y*m.i.x + j.y*m.i.y + k.y*m.i.z
  111. r.i.z=i.z*m.i.x + j.z*m.i.y + k.z*m.i.z
  112. r.i.w=i.w*m.i.x + j.w*m.i.y + k.w*m.i.z
  113. r.j.x=i.x*m.j.x + j.x*m.j.y + k.x*m.j.z
  114. r.j.y=i.y*m.j.x + j.y*m.j.y + k.y*m.j.z
  115. r.j.z=i.z*m.j.x + j.z*m.j.y + k.z*m.j.z
  116. r.j.w=i.w*m.j.x + j.w*m.j.y + k.w*m.j.z
  117. r.k.x=i.x*m.k.x + j.x*m.k.y + k.x*m.k.z
  118. r.k.y=i.y*m.k.x + j.y*m.k.y + k.y*m.k.z
  119. r.k.z=i.z*m.k.x + j.z*m.k.y + k.z*m.k.z
  120. r.k.w=i.w*m.k.x + j.w*m.k.y + k.w*m.k.z
  121. r.t.x=t.x
  122. r.t.y=t.y
  123. r.t.z=t.z
  124. r.t.w=t.w
  125. Return r
  126. End
  127. Operator*:Vec4<T>( v:Vec4<T> )
  128. Return New Vec4<T>(
  129. i.x*v.x+j.x*v.y+k.x*v.z+t.x*v.w,
  130. i.y*v.x+j.y*v.y+k.y*v.z+t.y*v.w,
  131. i.z*v.x+j.z*v.y+k.z*v.z+t.z*v.w,
  132. i.w*v.x+j.w*v.y+k.w*v.z+t.w*v.w )
  133. End
  134. Operator*:Vec3<T>( v:Vec3<T> )
  135. Return New Vec3<T>(
  136. i.x*v.x+j.x*v.y+k.x*v.z+t.x,
  137. i.y*v.x+j.y*v.y+k.y*v.z+t.y,
  138. i.z*v.x+j.z*v.y+k.z*v.z+t.z ) / (i.w*v.x+j.w*v.y+k.w*v.z+t.w)
  139. End
  140. #rem monkeydoc Creates a translation matrix.
  141. #end
  142. Function Translation:Mat4( tv:Vec3<T> )
  143. Return Translation( tv.x,tv.y,tv.z )
  144. End
  145. Function Translation:Mat4( tx:T,ty:T,tz:T )
  146. Local r:=New Mat4
  147. r.t.x=tx;r.t.y=ty;r.t.z=tz;r.t.w=1
  148. Return r
  149. End
  150. #rem monkeydoc Creates a rotation matrix for euler angles or a quat.
  151. #end
  152. Function Rotation:Mat4( rv:Vec3<Double> )
  153. Return Rotation( rv.x,rv.y,rv.z )
  154. End
  155. Function Rotation:Mat4( rx:Double,ry:Double,rz:Double )
  156. Return New Mat4( Mat3<T>.Rotation( rx,ry,rz ) )
  157. End
  158. Function Rotation:Mat4( q:Quat<T> )
  159. Return New Mat4( q )
  160. End
  161. #rem monkeydoc Creates a scaling matrix.
  162. #end
  163. Function Scaling:Mat4( sx:T,sy:T,sz:T )
  164. Return New Mat4( sx,sy,sz,1 )
  165. End
  166. Function Scaling:Mat4( sv:Vec3<T> )
  167. Return Scaling( sv.x,sv.y,sv.z )
  168. End
  169. Function Scaling:Mat4( t:T )
  170. Return Scaling( t,t,t )
  171. End
  172. #rem monkeydoc Creates an orthographic projection matrix.
  173. #End
  174. Function Ortho:Mat4( left:T,right:T,bottom:T,top:T,near:T,far:T )
  175. Local w:=right-left,h:=top-bottom,d:=far-near,r:Mat4
  176. r.i.x=2/w
  177. r.j.y=2/h
  178. r.k.z=2/d
  179. r.t.x=-(right+left)/w
  180. r.t.y=-(top+bottom)/h
  181. r.t.z=-(far+near)/d
  182. r.t.w=1
  183. Return r
  184. End
  185. Function Frustum:Mat4( left:T,right:T,bottom:T,top:T,near:T,far:T )
  186. Local w:=right-left,h:=top-bottom,d:=far-near,near2:=near*2,r:Mat4
  187. r.i.x=near2/w
  188. r.j.y=near2/h
  189. r.k.x=(right+left)/w
  190. r.k.y=(top+bottom)/h
  191. r.k.z=(far+near)/d
  192. r.k.w=1
  193. r.t.z=-(far*near2)/d
  194. Return r
  195. End
  196. Function Perspective:Mat4( fovy:Double,aspect:T,znear:T,zfar:T )
  197. Local h:T=Tan(fovy * Pi / 360.0) * znear
  198. Local w:T=h * aspect
  199. Return Frustum( -w,w,-h,h,znear,zfar )
  200. End
  201. End