mat4.monkey2 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. Namespace std.geom
  2. #rem monkeydoc @hidden
  3. #end
  4. Alias Mat4f:Mat4<Float>
  5. #rem monkeydoc @hidden
  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( m:Mat4 )
  37. Local r:Mat4
  38. r.i.x=i.x*m.i.x + j.x*m.i.y + k.x*m.i.z + t.x*m.i.w
  39. r.i.y=i.y*m.i.x + j.y*m.i.y + k.y*m.i.z + t.y*m.i.w
  40. r.i.z=i.z*m.i.x + j.z*m.i.y + k.z*m.i.z + t.z*m.i.w
  41. r.i.w=i.w*m.i.x + j.w*m.i.y + k.w*m.i.z + t.w*m.i.w
  42. r.j.x=i.x*m.j.x + j.x*m.j.y + k.x*m.j.z + t.x*m.j.w
  43. r.j.y=i.y*m.j.x + j.y*m.j.y + k.y*m.j.z + t.y*m.j.w
  44. r.j.z=i.z*m.j.x + j.z*m.j.y + k.z*m.j.z + t.z*m.j.w
  45. r.j.w=i.w*m.j.x + j.w*m.j.y + k.w*m.j.z + t.w*m.j.w
  46. r.k.x=i.x*m.k.x + j.x*m.k.y + k.x*m.k.z + t.x*m.k.w
  47. r.k.y=i.y*m.k.x + j.y*m.k.y + k.y*m.k.z + t.y*m.k.w
  48. r.k.z=i.z*m.k.x + j.z*m.k.y + k.z*m.k.z + t.z*m.k.w
  49. r.k.w=i.w*m.k.x + j.w*m.k.y + k.w*m.k.z + t.w*m.k.w
  50. r.t.x=i.x*m.t.x + j.x*m.t.y + k.x*m.t.z + t.x*m.t.w
  51. r.t.y=i.y*m.t.x + j.y*m.t.y + k.y*m.t.z + t.y*m.t.w
  52. r.t.z=i.z*m.t.x + j.z*m.t.y + k.z*m.t.z + t.z*m.t.w
  53. r.t.w=i.w*m.t.x + j.w*m.t.y + k.w*m.t.z + t.w*m.t.w
  54. Return r
  55. End
  56. Operator*:Mat4( m:AffineMat4<T> )
  57. Local r:Mat4
  58. r.i.x=i.x*m.m.i.x + j.x*m.m.i.y + k.x*m.m.i.z
  59. r.i.y=i.y*m.m.i.x + j.y*m.m.i.y + k.y*m.m.i.z
  60. r.i.z=i.z*m.m.i.x + j.z*m.m.i.y + k.z*m.m.i.z
  61. r.i.w=i.w*m.m.i.x + j.w*m.m.i.y + k.w*m.m.i.z
  62. r.j.x=i.x*m.m.j.x + j.x*m.m.j.y + k.x*m.m.j.z
  63. r.j.y=i.y*m.m.j.x + j.y*m.m.j.y + k.y*m.m.j.z
  64. r.j.z=i.z*m.m.j.x + j.z*m.m.j.y + k.z*m.m.j.z
  65. r.j.w=i.w*m.m.j.x + j.w*m.m.j.y + k.w*m.m.j.z
  66. r.k.x=i.x*m.m.k.x + j.x*m.m.k.y + k.x*m.m.k.z
  67. r.k.y=i.y*m.m.k.x + j.y*m.m.k.y + k.y*m.m.k.z
  68. r.k.z=i.z*m.m.k.x + j.z*m.m.k.y + k.z*m.m.k.z
  69. r.k.w=i.w*m.m.k.x + j.w*m.m.k.y + k.w*m.m.k.z
  70. r.t.x=i.x*m.t.x + j.x*m.t.y + k.x*m.t.z + t.x
  71. r.t.y=i.y*m.t.x + j.y*m.t.y + k.y*m.t.z + t.y
  72. r.t.z=i.z*m.t.x + j.z*m.t.y + k.z*m.t.z + t.z
  73. r.t.w=i.w*m.t.x + j.w*m.t.y + k.w*m.t.z + t.w
  74. Return r
  75. End
  76. Operator*:Mat4( m:Mat3<T> )
  77. Local r:Mat4
  78. r.i.x=i.x*m.i.x + j.x*m.i.y + k.x*m.i.z
  79. r.i.y=i.y*m.i.x + j.y*m.i.y + k.y*m.i.z
  80. r.i.z=i.z*m.i.x + j.z*m.i.y + k.z*m.i.z
  81. r.i.w=i.w*m.i.x + j.w*m.i.y + k.w*m.i.z
  82. r.j.x=i.x*m.j.x + j.x*m.j.y + k.x*m.j.z
  83. r.j.y=i.y*m.j.x + j.y*m.j.y + k.y*m.j.z
  84. r.j.z=i.z*m.j.x + j.z*m.j.y + k.z*m.j.z
  85. r.j.w=i.w*m.j.x + j.w*m.j.y + k.w*m.j.z
  86. r.k.x=i.x*m.k.x + j.x*m.k.y + k.x*m.k.z
  87. r.k.y=i.y*m.k.x + j.y*m.k.y + k.y*m.k.z
  88. r.k.z=i.z*m.k.x + j.z*m.k.y + k.z*m.k.z
  89. r.k.w=i.w*m.k.x + j.w*m.k.y + k.w*m.k.z
  90. r.t.x=t.x
  91. r.t.y=t.y
  92. r.t.z=t.z
  93. r.t.w=t.w
  94. Return r
  95. End
  96. #rem monkeydoc Creates a translation matrix.
  97. #end
  98. Function Translation:Mat4( tv:Vec3<T> )
  99. Return Translation( tv.x,tv.y,tv.z )
  100. End
  101. Function Translation:Mat4( tx:T,ty:T,tz:T )
  102. Local r:=New Mat4
  103. r.t.x=tx;r.t.y=ty;r.t.z=tz;r.t.w=1
  104. Return r
  105. End
  106. #rem monkeydoc Creates a rotation matrix.
  107. #end
  108. Function Rotation:Mat4( rv:Vec3<Double> )
  109. Return Rotation( rv.x,rv.y,rv.z )
  110. End
  111. Function Rotation:Mat4( rx:Double,ry:Double,rz:Double )
  112. Return New Mat4( Mat3<T>.Rotation( rx,ry,rz ) )
  113. End
  114. #rem monkeydoc Creates a scaling matrix.
  115. #end
  116. Function Scaling:Mat4( sx:T,sy:T,sz:T )
  117. Return New Mat4( sx,sy,sz,1 )
  118. End
  119. Function Scaling:Mat4( sv:Vec3<T> )
  120. Return Scaling( sv.x,sv.y,sv.z )
  121. End
  122. Function Scaling:Mat4( t:T )
  123. Return Scaling( t,t,t )
  124. End
  125. #rem monkeydoc Creates an orthographic projection matrix.
  126. #End
  127. Function Ortho:Mat4( left:Double,right:Double,bottom:Double,top:Double,near:Double,far:Double )
  128. Local w:=right-left,h:=top-bottom,d:=far-near,r:Mat4
  129. r.i.x=2/w
  130. r.j.y=2/h
  131. r.k.z=2/d
  132. r.t.x=-(right+left)/w
  133. r.t.y=-(top+bottom)/h
  134. r.t.z=-(far+near)/d
  135. r.t.w=1
  136. Return r
  137. End
  138. Function Frustum:Mat4( left:Double,right:Double,bottom:Double,top:Double,near:Double,far:Double )
  139. Local w:=right-left,h:=top-bottom,d:=far-near,near2:=near*2,r:Mat4
  140. r.i.x=near2/w
  141. r.j.y=near2/h
  142. r.k.x=(right+left)/w
  143. r.k.y=(top+bottom)/h
  144. r.k.z=(far+near)/d
  145. r.k.w=1
  146. r.t.z=-(far*near2)/d
  147. Return r
  148. End
  149. End