mat4.monkey2 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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:AffineMat3<T> )
  22. i.x=m.i.x;i.y=m.i.y
  23. j.x=m.j.x;j.y=m.j.y
  24. k.z=1
  25. t.x=m.t.x;t.y=m.t.y;t.w=1
  26. End
  27. Operator*:Mat4( m:Mat4 )
  28. Local r:Mat4
  29. r.i.x=i.x*m.i.x + j.x*m.i.y + k.x*m.i.z + t.x*m.i.w
  30. r.i.y=i.y*m.i.x + j.y*m.i.y + k.y*m.i.z + t.y*m.i.w
  31. r.i.z=i.z*m.i.x + j.z*m.i.y + k.z*m.i.z + t.z*m.i.w
  32. r.i.w=i.w*m.i.x + j.w*m.i.y + k.w*m.i.z + t.w*m.i.w
  33. r.j.x=i.x*m.j.x + j.x*m.j.y + k.x*m.j.z + t.x*m.j.w
  34. r.j.y=i.y*m.j.x + j.y*m.j.y + k.y*m.j.z + t.y*m.j.w
  35. r.j.z=i.z*m.j.x + j.z*m.j.y + k.z*m.j.z + t.z*m.j.w
  36. r.j.w=i.w*m.j.x + j.w*m.j.y + k.w*m.j.z + t.w*m.j.w
  37. r.k.x=i.x*m.k.x + j.x*m.k.y + k.x*m.k.z + t.x*m.k.w
  38. r.k.y=i.y*m.k.x + j.y*m.k.y + k.y*m.k.z + t.y*m.k.w
  39. r.k.z=i.z*m.k.x + j.z*m.k.y + k.z*m.k.z + t.z*m.k.w
  40. r.k.w=i.w*m.k.x + j.w*m.k.y + k.w*m.k.z + t.w*m.k.w
  41. r.t.x=i.x*m.t.x + j.x*m.t.y + k.x*m.t.z + t.x*m.t.w
  42. r.t.y=i.y*m.t.x + j.y*m.t.y + k.y*m.t.z + t.y*m.t.w
  43. r.t.z=i.z*m.t.x + j.z*m.t.y + k.z*m.t.z + t.z*m.t.w
  44. r.t.w=i.w*m.t.x + j.w*m.t.y + k.w*m.t.z + t.w*m.t.w
  45. Return r
  46. End
  47. Function Translation:Mat4( tx:T,ty:T,tz:T )
  48. Local r:=New Mat4
  49. r.t.x=tx;r.t.y=ty;r.t.z=tz
  50. Return r
  51. End
  52. Function Scale:Mat4( sx:Float,sy:Float,sz:Float )
  53. Local r:Mat4
  54. r.i.x=sx;r.j.y=sy;r.k.z=sz;r.t.w=1
  55. Return r
  56. End
  57. Function Ortho:Mat4( left:Float,right:Float,bottom:Float,top:Float,near:Float,far:Float )
  58. Local w:=right-left,h:=top-bottom,d:=far-near
  59. Local r:Mat4
  60. r.i.x=2/w ; r.j.y=2/h ; r.k.z=2/d
  61. r.t=New Vec4<T>( -(right+left)/w,-(top+bottom)/h,-(far+near)/d,1 )
  62. Return r
  63. End
  64. End