math3d.bmx 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. '
  2. ' BlitzMax port, 2015 Bruce A Henderson
  3. '
  4. ' Copyright (c) 2015 Mark Sibly
  5. '
  6. ' This software is provided 'as-is', without any express or implied
  7. ' warranty. In no event will the authors be held liable for any damages
  8. ' arising from the use of this software.
  9. '
  10. ' Permission is granted to anyone to use this software for any purpose,
  11. ' including commercial applications, and to alter it and redistribute it
  12. ' freely, subject to the following restrictions:
  13. '
  14. ' 1. The origin of this software must not be misrepresented; you must not
  15. ' claim that you wrote the original software. If you use this software
  16. ' in a product, an acknowledgement in the product documentation would be
  17. ' appreciated but is not required.
  18. ' 2. Altered source versions must be plainly marked as such, and must not be
  19. ' misrepresented as being the original software.
  20. ' 3. This notice may not be removed or altered from any source distribution.
  21. '
  22. SuperStrict
  23. Import brl.standardio
  24. Global Mat4Identity:Float[] = [1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.0,0.0,0.0,1.0]
  25. Function Vec4Init( x:Float,y:Float,z:Float,w:Float,r:Float Ptr )
  26. r[0]=x
  27. r[1]=y
  28. r[2]=z
  29. r[3]=w
  30. End Function
  31. Function Vec4Copy( v:Float Ptr,r:Float Ptr )
  32. r[0]=v[0]
  33. r[1]=v[1]
  34. r[2]=v[2]
  35. r[3]=v[3]
  36. End Function
  37. Function Vec4CopySrcDst( v:Float Ptr,r:Float Ptr,src:Int,dst:Int )
  38. r[0+dst]=v[0+src]
  39. r[1+dst]=v[1+src]
  40. r[2+dst]=v[2+src]
  41. r[3+dst]=v[3+src]
  42. End Function
  43. Function Mat4New:Float[]()
  44. Return [1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.0,0.0,0.0,1.0]
  45. End Function
  46. Function Mat4Init( ix:Float,jy:Float,kz:Float,tw:Float,r:Float Ptr )
  47. r[0]= ix; r[1]= 0; r[2]= 0; r[3]= 0
  48. r[4]= 0; r[5]= jy; r[6]= 0; r[7]= 0
  49. r[8]= 0; r[9]= 0; r[10]=kz; r[11]= 0
  50. r[12]= 0; r[13]= 0; r[14]= 0; r[15]=tw
  51. End Function
  52. Function Mat4InitFull( ix:Float,iy:Float,iz:Float,iw:Float,jx:Float,jy:Float,jz:Float,jw:Float,kx:Float,ky:Float,kz:Float,kw:Float,tx:Float,ty:Float,tz:Float,tw:Float,r:Float Ptr )
  53. r[0]= ix;r[1]= iy;r[2]= iz;r[3]= iw
  54. r[4]= jx;r[5]= jy;r[6]= jz;r[7]= jw
  55. r[8]= kx;r[9]= ky;r[10]=kz;r[11]=kw
  56. r[12]=tx;r[13]=ty;r[14]=tz;r[15]=tw
  57. End Function
  58. Function Mat4InitArray( r:Float Ptr )
  59. Mat4Init 1,1,1,1,r
  60. End Function
  61. Function Mat4Copy( m:Float Ptr,r:Float Ptr )
  62. r[0]=m[0]
  63. r[1]=m[1]
  64. r[2]=m[2]
  65. r[3]=m[3]
  66. r[4]=m[4]
  67. r[5]=m[5]
  68. r[6]=m[6]
  69. r[7]=m[7]
  70. r[8]=m[8]
  71. r[9]=m[9]
  72. r[10]=m[10]
  73. r[11]=m[11]
  74. r[12]=m[12]
  75. r[13]=m[13]
  76. r[14]=m[14]
  77. r[15]=m[15]
  78. End Function
  79. Function Mat4Ortho( Left:Float,Right:Float,bottom:Float,top:Float,znear:Float,zfar:Float,r:Float Ptr )
  80. Local w:Float=Right-Left
  81. Local h:Float=top-bottom
  82. Local d:Float=zfar-znear
  83. Mat4InitFull 2.0/w,0,0,0, 0,2.0/h,0,0, 0,0,2.0/d,0, -(Right+Left)/w,-(top+bottom)/h,-(zfar+znear)/d,1,r
  84. End Function
  85. Function Mat4Frustum( Left:Float,Right:Float,bottom:Float,top:Float,znear:Float,zfar:Float,r:Float Ptr )
  86. Local w:Float=Right-Left
  87. Local h:Float=top-bottom
  88. Local d:Float=zfar-znear
  89. Local znear2:Float=znear*2
  90. Mat4InitFull znear2/w,0,0,0, 0,znear2/h,0,0, (Right+Left)/w,(top+bottom)/h,(zfar+znear)/d,1, 0,0,-(zfar*znear2)/d,0, r
  91. End Function
  92. Function Mat4Transpose( m:Float Ptr,r:Float Ptr )
  93. Mat4InitFull m[0],m[4],m[8],m[12], m[1],m[5],m[9],m[13], m[2],m[6],m[10],m[14], m[3],m[7],m[11],m[15],r
  94. End Function
  95. Function Mat4Inverse( m:Float Ptr,r:Float Ptr )
  96. r[0] = m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] + m[9] * m[7] * m[14] + m[13] * m[6] * m[11] - m[13] * m[7] * m[10]
  97. r[4] =-m[4] * m[10] * m[15] + m[4] * m[11] * m[14] + m[8] * m[6] * m[15] - m[8] * m[7] * m[14] - m[12] * m[6] * m[11] + m[12] * m[7] * m[10]
  98. r[8] = m[4] * m[9] * m[15] - m[4] * m[11] * m[13] - m[8] * m[5] * m[15] + m[8] * m[7] * m[13] + m[12] * m[5] * m[11] - m[12] * m[7] * m[9]
  99. r[12]=-m[4] * m[9] * m[14] + m[4] * m[10] * m[13] + m[8] * m[5] * m[14] - m[8] * m[6] * m[13] - m[12] * m[5] * m[10] + m[12] * m[6] * m[9]
  100. r[1] =-m[1] * m[10] * m[15] + m[1] * m[11] * m[14] + m[9] * m[2] * m[15] - m[9] * m[3] * m[14] - m[13] * m[2] * m[11] + m[13] * m[3] * m[10]
  101. r[5] = m[0] * m[10] * m[15] - m[0] * m[11] * m[14] - m[8] * m[2] * m[15] + m[8] * m[3] * m[14] + m[12] * m[2] * m[11] - m[12] * m[3] * m[10]
  102. r[9] =-m[0] * m[9] * m[15] + m[0] * m[11] * m[13] + m[8] * m[1] * m[15] - m[8] * m[3] * m[13] - m[12] * m[1] * m[11] + m[12] * m[3] * m[9]
  103. r[13]= m[0] * m[9] * m[14] - m[0] * m[10] * m[13] - m[8] * m[1] * m[14] + m[8] * m[2] * m[13] + m[12] * m[1] * m[10] - m[12] * m[2] * m[9]
  104. r[2] = m[1] * m[6] * m[15] - m[1] * m[7] * m[14] - m[5] * m[2] * m[15] + m[5] * m[3] * m[14] + m[13] * m[2] * m[7] - m[13] * m[3] * m[6]
  105. r[6] =-m[0] * m[6] * m[15] + m[0] * m[7] * m[14] + m[4] * m[2] * m[15] - m[4] * m[3] * m[14] - m[12] * m[2] * m[7] + m[12] * m[3] * m[6]
  106. r[10]= m[0] * m[5] * m[15] - m[0] * m[7] * m[13] - m[4] * m[1] * m[15] + m[4] * m[3] * m[13] + m[12] * m[1] * m[7] - m[12] * m[3] * m[5]
  107. r[14]=-m[0] * m[5] * m[14] + m[0] * m[6] * m[13] + m[4] * m[1] * m[14] - m[4] * m[2] * m[13] - m[12] * m[1] * m[6] + m[12] * m[2] * m[5]
  108. r[3] =-m[1] * m[6] * m[11] + m[1] * m[7] * m[10] + m[5] * m[2] * m[11] - m[5] * m[3] * m[10] - m[9] * m[2] * m[7] + m[9] * m[3] * m[6]
  109. r[7] = m[0] * m[6] * m[11] - m[0] * m[7] * m[10] - m[4] * m[2] * m[11] + m[4] * m[3] * m[10] + m[8] * m[2] * m[7] - m[8] * m[3] * m[6]
  110. r[11]=-m[0] * m[5] * m[11] + m[0] * m[7] * m[9] + m[4] * m[1] * m[11] - m[4] * m[3] * m[9] - m[8] * m[1] * m[7] + m[8] * m[3] * m[5]
  111. r[15]= m[0] * m[5] * m[10] - m[0] * m[6] * m[9] - m[4] * m[1] * m[10] + m[4] * m[2] * m[9] + m[8] * m[1] * m[6] - m[8] * m[2] * m[5]
  112. Local c:Float=1.0 / (m[0] * r[0] + m[1] * r[4] + m[2] * r[8] + m[3] * r[12])
  113. For Local i:Int = 0 Until 16
  114. r[i]:*c
  115. Next
  116. End Function
  117. Function Mat4Multiply( m:Float Ptr,n:Float Ptr,r:Float Ptr )
  118. Mat4InitFull( ..
  119. m[0]*n[0] + m[4]*n[1] + m[8]*n[2] + m[12]*n[3], m[1]*n[0] + m[5]*n[1] + m[9]*n[2] + m[13]*n[3], m[2]*n[0] + m[6]*n[1] + m[10]*n[2] + m[14]*n[3], m[3]*n[0] + m[7]*n[1] + m[11]*n[2] + m[15]*n[3], ..
  120. m[0]*n[4] + m[4]*n[5] + m[8]*n[6] + m[12]*n[7], m[1]*n[4] + m[5]*n[5] + m[9]*n[6] + m[13]*n[7], m[2]*n[4] + m[6]*n[5] + m[10]*n[6] + m[14]*n[7], m[3]*n[4] + m[7]*n[5] + m[11]*n[6] + m[15]*n[7], ..
  121. m[0]*n[8] + m[4]*n[9] + m[8]*n[10] + m[12]*n[11], m[1]*n[8] + m[5]*n[9] + m[9]*n[10] + m[13]*n[11], m[2]*n[8] + m[6]*n[9] + m[10]*n[10] + m[14]*n[11], m[3]*n[8] + m[7]*n[9] + m[11]*n[10] + m[15]*n[11], ..
  122. m[0]*n[12] + m[4]*n[13] + m[8]*n[14] + m[12]*n[15], m[1]*n[12] + m[5]*n[13] + m[9]*n[14] + m[13]*n[15], m[2]*n[12] + m[6]*n[13] + m[10]*n[14] + m[14]*n[15], m[3]*n[12] + m[7]*n[13] + m[11]*n[14] + m[15]*n[15],r )
  123. End Function
  124. Function Mat4Transform( m:Float Ptr,v:Float Ptr,r:Float Ptr )
  125. Vec4Init( ..
  126. m[0]*v[0] + m[4]*v[1] + m[8] *v[2] + m[12]*v[3],..
  127. m[1]*v[0] + m[5]*v[1] + m[9] *v[2] + m[13]*v[3], ..
  128. m[2]*v[0] + m[6]*v[1] + m[10]*v[2] + m[14]*v[3], ..
  129. m[3]*v[0] + m[7]*v[1] + m[11]*v[2] + m[15]*v[3],r )
  130. End Function
  131. Function Mat4Project( m:Float Ptr,v:Float Ptr,r:Float Ptr )
  132. Vec4Init( ..
  133. m[0]*v[0] + m[4]*v[1] + m[8] *v[2] + m[12]*v[3], ..
  134. m[1]*v[0] + m[5]*v[1] + m[9] *v[2] + m[13]*v[3], ..
  135. m[2]*v[0] + m[6]*v[1] + m[10]*v[2] + m[14]*v[3], ..
  136. m[3]*v[0] + m[7]*v[1] + m[11]*v[2] + m[15]*v[3],r )
  137. r[0] :/ r[3]
  138. r[1] :/ r[3]
  139. r[2] :/ r[3]
  140. r[3]=1
  141. End Function
  142. Function Mat4Roll( rz:Float,m:Float[] )
  143. End Function
  144. Function Mat4Scale( x:Float,y:Float,z:Float,m:Float Ptr )
  145. m[0]=x;m[1]=0;m[2]=0;m[3]=0
  146. m[4]=0;m[5]=y;m[6]=0;m[7]=0
  147. m[8]=0;m[9]=0;m[10]=1;m[11]=0
  148. m[12]=0;m[13]=0;m[14]=0;m[15]=1
  149. End Function