2
0

Mat4.pas 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. {$mode objfpc}
  2. unit Mat4;
  3. interface
  4. uses
  5. BrowserConsole, JS;
  6. type
  7. TScalar = double;
  8. TScalarArray = array of TScalar;
  9. type
  10. TMat4 = class
  11. public
  12. constructor Identity;
  13. constructor Translate(const tx,ty,tz: TScalar);
  14. constructor RotateZ(const Angle:TScalar);
  15. constructor RotateY(const Angle:TScalar);
  16. constructor RotateX(const Angle:TScalar);
  17. constructor Scale (const x, y, z: TScalar);
  18. constructor Ortho(const Left,Right,Bottom,Top,zNear,zFar:TScalar);
  19. constructor Perspective(const fovy,Aspect,zNear,zFar:TScalar);
  20. function Multiply (m: TMat4): TMat4;
  21. function Inverse: TMat4;
  22. function CopyList: TScalarArray;
  23. // property Values[const key:TDictionaryKey]:T read GetValue write SetValue; default;
  24. procedure Show;
  25. public
  26. // TODO: multi dimensional arrays aren't going to work
  27. // for webgl so replace this with something else
  28. RawComponents:array[0..3, 0..3] of TScalar;
  29. end;
  30. procedure SinCos (angle: TScalar; var sinus: TScalar; var cosinus: TScalar);
  31. implementation
  32. const
  33. PI = 3.14159265359;
  34. DEG2RAD = PI/180.0;
  35. //RAD2DEG = 180.0/PI;
  36. //HalfPI = PI*0.5;
  37. var
  38. Matrix4x4Identity: TMat4;
  39. // TODO: this should be in math
  40. procedure SinCos (angle: TScalar; var sinus: TScalar; var cosinus: TScalar);
  41. begin
  42. sinus := sin(angle);
  43. cosinus := cos(angle);
  44. end;
  45. // NOTE: [][] doesn't typecast to array of syntax so we need this
  46. function TMat4.CopyList: TScalarArray;
  47. var
  48. x, y: integer;
  49. list: TJSArray;
  50. begin
  51. list := TJSArray.new;
  52. for x := 0 to 3 do
  53. for y := 0 to 3 do
  54. list.push(RawComponents[x,y]);
  55. result := TScalarArray(list);
  56. end;
  57. function TMat4.Inverse:TMat4;
  58. var
  59. t0,t4,t8,t12,d:TScalar;
  60. begin
  61. t0:=(((RawComponents[1,1]*RawComponents[2,2]*RawComponents[3,3])-(RawComponents[1,1]*RawComponents[2,3]*RawComponents[3,2]))-(RawComponents[2,1]*RawComponents[1,2]*RawComponents[3,3])+(RawComponents[2,1]*RawComponents[1,3]*RawComponents[3,2])+(RawComponents[3,1]*RawComponents[1,2]*RawComponents[2,3]))-(RawComponents[3,1]*RawComponents[1,3]*RawComponents[2,2]);
  62. t4:=((((-(RawComponents[1,0]*RawComponents[2,2]*RawComponents[3,3]))+(RawComponents[1,0]*RawComponents[2,3]*RawComponents[3,2])+(RawComponents[2,0]*RawComponents[1,2]*RawComponents[3,3]))-(RawComponents[2,0]*RawComponents[1,3]*RawComponents[3,2]))-(RawComponents[3,0]*RawComponents[1,2]*RawComponents[2,3]))+(RawComponents[3,0]*RawComponents[1,3]*RawComponents[2,2]);
  63. t8:=((((RawComponents[1,0]*RawComponents[2,1]*RawComponents[3,3])-(RawComponents[1,0]*RawComponents[2,3]*RawComponents[3,1]))-(RawComponents[2,0]*RawComponents[1,1]*RawComponents[3,3]))+(RawComponents[2,0]*RawComponents[1,3]*RawComponents[3,1])+(RawComponents[3,0]*RawComponents[1,1]*RawComponents[2,3]))-(RawComponents[3,0]*RawComponents[1,3]*RawComponents[2,1]);
  64. t12:=((((-(RawComponents[1,0]*RawComponents[2,1]*RawComponents[3,2]))+(RawComponents[1,0]*RawComponents[2,2]*RawComponents[3,1])+(RawComponents[2,0]*RawComponents[1,1]*RawComponents[3,2]))-(RawComponents[2,0]*RawComponents[1,2]*RawComponents[3,1]))-(RawComponents[3,0]*RawComponents[1,1]*RawComponents[2,2]))+(RawComponents[3,0]*RawComponents[1,2]*RawComponents[2,1]);
  65. d:=(RawComponents[0,0]*t0)+(RawComponents[0,1]*t4)+(RawComponents[0,2]*t8)+(RawComponents[0,3]*t12);
  66. result := TMat4.Identity;
  67. if d<>0.0 then begin
  68. d:=1.0/d;
  69. result.RawComponents[0,0]:=t0*d;
  70. result.RawComponents[0,1]:=(((((-(RawComponents[0,1]*RawComponents[2,2]*RawComponents[3,3]))+(RawComponents[0,1]*RawComponents[2,3]*RawComponents[3,2])+(RawComponents[2,1]*RawComponents[0,2]*RawComponents[3,3]))-(RawComponents[2,1]*RawComponents[0,3]*RawComponents[3,2]))-(RawComponents[3,1]*RawComponents[0,2]*RawComponents[2,3]))+(RawComponents[3,1]*RawComponents[0,3]*RawComponents[2,2]))*d;
  71. result.RawComponents[0,2]:=(((((RawComponents[0,1]*RawComponents[1,2]*RawComponents[3,3])-(RawComponents[0,1]*RawComponents[1,3]*RawComponents[3,2]))-(RawComponents[1,1]*RawComponents[0,2]*RawComponents[3,3]))+(RawComponents[1,1]*RawComponents[0,3]*RawComponents[3,2])+(RawComponents[3,1]*RawComponents[0,2]*RawComponents[1,3]))-(RawComponents[3,1]*RawComponents[0,3]*RawComponents[1,2]))*d;
  72. result.RawComponents[0,3]:=(((((-(RawComponents[0,1]*RawComponents[1,2]*RawComponents[2,3]))+(RawComponents[0,1]*RawComponents[1,3]*RawComponents[2,2])+(RawComponents[1,1]*RawComponents[0,2]*RawComponents[2,3]))-(RawComponents[1,1]*RawComponents[0,3]*RawComponents[2,2]))-(RawComponents[2,1]*RawComponents[0,2]*RawComponents[1,3]))+(RawComponents[2,1]*RawComponents[0,3]*RawComponents[1,2]))*d;
  73. result.RawComponents[1,0]:=t4*d;
  74. result.RawComponents[1,1]:=((((RawComponents[0,0]*RawComponents[2,2]*RawComponents[3,3])-(RawComponents[0,0]*RawComponents[2,3]*RawComponents[3,2]))-(RawComponents[2,0]*RawComponents[0,2]*RawComponents[3,3])+(RawComponents[2,0]*RawComponents[0,3]*RawComponents[3,2])+(RawComponents[3,0]*RawComponents[0,2]*RawComponents[2,3]))-(RawComponents[3,0]*RawComponents[0,3]*RawComponents[2,2]))*d;
  75. result.RawComponents[1,2]:=(((((-(RawComponents[0,0]*RawComponents[1,2]*RawComponents[3,3]))+(RawComponents[0,0]*RawComponents[1,3]*RawComponents[3,2])+(RawComponents[1,0]*RawComponents[0,2]*RawComponents[3,3]))-(RawComponents[1,0]*RawComponents[0,3]*RawComponents[3,2]))-(RawComponents[3,0]*RawComponents[0,2]*RawComponents[1,3]))+(RawComponents[3,0]*RawComponents[0,3]*RawComponents[1,2]))*d;
  76. result.RawComponents[1,3]:=(((((RawComponents[0,0]*RawComponents[1,2]*RawComponents[2,3])-(RawComponents[0,0]*RawComponents[1,3]*RawComponents[2,2]))-(RawComponents[1,0]*RawComponents[0,2]*RawComponents[2,3]))+(RawComponents[1,0]*RawComponents[0,3]*RawComponents[2,2])+(RawComponents[2,0]*RawComponents[0,2]*RawComponents[1,3]))-(RawComponents[2,0]*RawComponents[0,3]*RawComponents[1,2]))*d;
  77. result.RawComponents[2,0]:=t8*d;
  78. result.RawComponents[2,1]:=(((((-(RawComponents[0,0]*RawComponents[2,1]*RawComponents[3,3]))+(RawComponents[0,0]*RawComponents[2,3]*RawComponents[3,1])+(RawComponents[2,0]*RawComponents[0,1]*RawComponents[3,3]))-(RawComponents[2,0]*RawComponents[0,3]*RawComponents[3,1]))-(RawComponents[3,0]*RawComponents[0,1]*RawComponents[2,3]))+(RawComponents[3,0]*RawComponents[0,3]*RawComponents[2,1]))*d;
  79. result.RawComponents[2,2]:=(((((RawComponents[0,0]*RawComponents[1,1]*RawComponents[3,3])-(RawComponents[0,0]*RawComponents[1,3]*RawComponents[3,1]))-(RawComponents[1,0]*RawComponents[0,1]*RawComponents[3,3]))+(RawComponents[1,0]*RawComponents[0,3]*RawComponents[3,1])+(RawComponents[3,0]*RawComponents[0,1]*RawComponents[1,3]))-(RawComponents[3,0]*RawComponents[0,3]*RawComponents[1,1]))*d;
  80. result.RawComponents[2,3]:=(((((-(RawComponents[0,0]*RawComponents[1,1]*RawComponents[2,3]))+(RawComponents[0,0]*RawComponents[1,3]*RawComponents[2,1])+(RawComponents[1,0]*RawComponents[0,1]*RawComponents[2,3]))-(RawComponents[1,0]*RawComponents[0,3]*RawComponents[2,1]))-(RawComponents[2,0]*RawComponents[0,1]*RawComponents[1,3]))+(RawComponents[2,0]*RawComponents[0,3]*RawComponents[1,1]))*d;
  81. result.RawComponents[3,0]:=t12*d;
  82. result.RawComponents[3,1]:=(((((RawComponents[0,0]*RawComponents[2,1]*RawComponents[3,2])-(RawComponents[0,0]*RawComponents[2,2]*RawComponents[3,1]))-(RawComponents[2,0]*RawComponents[0,1]*RawComponents[3,2]))+(RawComponents[2,0]*RawComponents[0,2]*RawComponents[3,1])+(RawComponents[3,0]*RawComponents[0,1]*RawComponents[2,2]))-(RawComponents[3,0]*RawComponents[0,2]*RawComponents[2,1]))*d;
  83. result.RawComponents[3,2]:=(((((-(RawComponents[0,0]*RawComponents[1,1]*RawComponents[3,2]))+(RawComponents[0,0]*RawComponents[1,2]*RawComponents[3,1])+(RawComponents[1,0]*RawComponents[0,1]*RawComponents[3,2]))-(RawComponents[1,0]*RawComponents[0,2]*RawComponents[3,1]))-(RawComponents[3,0]*RawComponents[0,1]*RawComponents[1,2]))+(RawComponents[3,0]*RawComponents[0,2]*RawComponents[1,1]))*d;
  84. result.RawComponents[3,3]:=(((((RawComponents[0,0]*RawComponents[1,1]*RawComponents[2,2])-(RawComponents[0,0]*RawComponents[1,2]*RawComponents[2,1]))-(RawComponents[1,0]*RawComponents[0,1]*RawComponents[2,2]))+(RawComponents[1,0]*RawComponents[0,2]*RawComponents[2,1])+(RawComponents[2,0]*RawComponents[0,1]*RawComponents[1,2]))-(RawComponents[2,0]*RawComponents[0,2]*RawComponents[1,1]))*d;
  85. end;
  86. end;
  87. function TMat4.Multiply (m: TMat4): TMat4;
  88. begin
  89. result := TMat4.Identity;
  90. result.RawComponents[0,0]:=(m.RawComponents[0,0]*self.RawComponents[0,0])+(m.RawComponents[0,1]*self.RawComponents[1,0])+(m.RawComponents[0,2]*self.RawComponents[2,0])+(m.RawComponents[0,3]*self.RawComponents[3,0]);
  91. result.RawComponents[0,1]:=(m.RawComponents[0,0]*self.RawComponents[0,1])+(m.RawComponents[0,1]*self.RawComponents[1,1])+(m.RawComponents[0,2]*self.RawComponents[2,1])+(m.RawComponents[0,3]*self.RawComponents[3,1]);
  92. result.RawComponents[0,2]:=(m.RawComponents[0,0]*self.RawComponents[0,2])+(m.RawComponents[0,1]*self.RawComponents[1,2])+(m.RawComponents[0,2]*self.RawComponents[2,2])+(m.RawComponents[0,3]*self.RawComponents[3,2]);
  93. result.RawComponents[0,3]:=(m.RawComponents[0,0]*self.RawComponents[0,3])+(m.RawComponents[0,1]*self.RawComponents[1,3])+(m.RawComponents[0,2]*self.RawComponents[2,3])+(m.RawComponents[0,3]*self.RawComponents[3,3]);
  94. result.RawComponents[1,0]:=(m.RawComponents[1,0]*self.RawComponents[0,0])+(m.RawComponents[1,1]*self.RawComponents[1,0])+(m.RawComponents[1,2]*self.RawComponents[2,0])+(m.RawComponents[1,3]*self.RawComponents[3,0]);
  95. result.RawComponents[1,1]:=(m.RawComponents[1,0]*self.RawComponents[0,1])+(m.RawComponents[1,1]*self.RawComponents[1,1])+(m.RawComponents[1,2]*self.RawComponents[2,1])+(m.RawComponents[1,3]*self.RawComponents[3,1]);
  96. result.RawComponents[1,2]:=(m.RawComponents[1,0]*self.RawComponents[0,2])+(m.RawComponents[1,1]*self.RawComponents[1,2])+(m.RawComponents[1,2]*self.RawComponents[2,2])+(m.RawComponents[1,3]*self.RawComponents[3,2]);
  97. result.RawComponents[1,3]:=(m.RawComponents[1,0]*self.RawComponents[0,3])+(m.RawComponents[1,1]*self.RawComponents[1,3])+(m.RawComponents[1,2]*self.RawComponents[2,3])+(m.RawComponents[1,3]*self.RawComponents[3,3]);
  98. result.RawComponents[2,0]:=(m.RawComponents[2,0]*self.RawComponents[0,0])+(m.RawComponents[2,1]*self.RawComponents[1,0])+(m.RawComponents[2,2]*self.RawComponents[2,0])+(m.RawComponents[2,3]*self.RawComponents[3,0]);
  99. result.RawComponents[2,1]:=(m.RawComponents[2,0]*self.RawComponents[0,1])+(m.RawComponents[2,1]*self.RawComponents[1,1])+(m.RawComponents[2,2]*self.RawComponents[2,1])+(m.RawComponents[2,3]*self.RawComponents[3,1]);
  100. result.RawComponents[2,2]:=(m.RawComponents[2,0]*self.RawComponents[0,2])+(m.RawComponents[2,1]*self.RawComponents[1,2])+(m.RawComponents[2,2]*self.RawComponents[2,2])+(m.RawComponents[2,3]*self.RawComponents[3,2]);
  101. result.RawComponents[2,3]:=(m.RawComponents[2,0]*self.RawComponents[0,3])+(m.RawComponents[2,1]*self.RawComponents[1,3])+(m.RawComponents[2,2]*self.RawComponents[2,3])+(m.RawComponents[2,3]*self.RawComponents[3,3]);
  102. result.RawComponents[3,0]:=(m.RawComponents[3,0]*self.RawComponents[0,0])+(m.RawComponents[3,1]*self.RawComponents[1,0])+(m.RawComponents[3,2]*self.RawComponents[2,0])+(m.RawComponents[3,3]*self.RawComponents[3,0]);
  103. result.RawComponents[3,1]:=(m.RawComponents[3,0]*self.RawComponents[0,1])+(m.RawComponents[3,1]*self.RawComponents[1,1])+(m.RawComponents[3,2]*self.RawComponents[2,1])+(m.RawComponents[3,3]*self.RawComponents[3,1]);
  104. result.RawComponents[3,2]:=(m.RawComponents[3,0]*self.RawComponents[0,2])+(m.RawComponents[3,1]*self.RawComponents[1,2])+(m.RawComponents[3,2]*self.RawComponents[2,2])+(m.RawComponents[3,3]*self.RawComponents[3,2]);
  105. result.RawComponents[3,3]:=(m.RawComponents[3,0]*self.RawComponents[0,3])+(m.RawComponents[3,1]*self.RawComponents[1,3])+(m.RawComponents[3,2]*self.RawComponents[2,3])+(m.RawComponents[3,3]*self.RawComponents[3,3]);
  106. end;
  107. constructor TMat4.Scale (const x, y, z: TScalar);
  108. begin
  109. RawComponents[0,0] := x;
  110. RawComponents[0,1] := 0;
  111. RawComponents[0,2] := 0;
  112. RawComponents[0,3] := 0;
  113. RawComponents[1,0] := 0;
  114. RawComponents[1,1] := y;
  115. RawComponents[1,2] := 0;
  116. RawComponents[1,3] := 0;
  117. RawComponents[2,0] := 0;
  118. RawComponents[2,1] := 0;
  119. RawComponents[2,2] := z;
  120. RawComponents[2,3] := 0;
  121. RawComponents[3,0] := 0;
  122. RawComponents[3,1] := 0;
  123. RawComponents[3,2] := 0;
  124. RawComponents[3,3] := 1;
  125. end;
  126. constructor TMat4.RotateX(const Angle:TScalar);
  127. begin
  128. RawComponents[0,0]:=1.0;
  129. RawComponents[0,1]:=0.0;
  130. RawComponents[0,2]:=0.0;
  131. RawComponents[0,3]:=0.0;
  132. RawComponents[1,0]:=0.0;
  133. SinCos(Angle,RawComponents[1,2],RawComponents[1,1]);
  134. RawComponents[1,3]:=0.0;
  135. RawComponents[2,0]:=0.0;
  136. RawComponents[2,1]:=-RawComponents[1,2];
  137. RawComponents[2,2]:=RawComponents[1,1];
  138. RawComponents[2,3]:=0.0;
  139. RawComponents[3,0]:=0.0;
  140. RawComponents[3,1]:=0.0;
  141. RawComponents[3,2]:=0.0;
  142. RawComponents[3,3]:=1.0;
  143. end;
  144. constructor TMat4.RotateY(const Angle:TScalar);
  145. begin
  146. SinCos(Angle,RawComponents[2,0],RawComponents[0,0]);
  147. RawComponents[0,1]:=0.0;
  148. RawComponents[0,2]:=-RawComponents[2,0];
  149. RawComponents[0,3]:=0.0;
  150. RawComponents[1,0]:=0.0;
  151. RawComponents[1,1]:=1.0;
  152. RawComponents[1,2]:=0.0;
  153. RawComponents[1,3]:=0.0;
  154. RawComponents[2,1]:=0.0;
  155. RawComponents[2,2]:=RawComponents[0,0];
  156. RawComponents[2,3]:=0.0;
  157. RawComponents[3,0]:=0.0;
  158. RawComponents[3,1]:=0.0;
  159. RawComponents[3,2]:=0.0;
  160. RawComponents[3,3]:=1.0;
  161. end;
  162. constructor TMat4.RotateZ(const Angle:TScalar);
  163. begin
  164. SinCos(Angle,RawComponents[0,1],RawComponents[0,0]);
  165. RawComponents[0,2]:=0.0;
  166. RawComponents[0,3]:=0.0;
  167. RawComponents[1,0]:=-RawComponents[0,1];
  168. RawComponents[1,1]:=RawComponents[0,0];
  169. RawComponents[1,2]:=0.0;
  170. RawComponents[1,3]:=0.0;
  171. RawComponents[2,0]:=0.0;
  172. RawComponents[2,1]:=0.0;
  173. RawComponents[2,2]:=1.0;
  174. RawComponents[2,3]:=0.0;
  175. RawComponents[3,0]:=0.0;
  176. RawComponents[3,1]:=0.0;
  177. RawComponents[3,2]:=0.0;
  178. RawComponents[3,3]:=1.0;
  179. end;
  180. constructor TMat4.Translate(const tx,ty,tz: TScalar);
  181. begin
  182. RawComponents[0,0]:=1.0;
  183. RawComponents[0,1]:=0.0;
  184. RawComponents[0,2]:=0.0;
  185. RawComponents[0,3]:=0.0;
  186. RawComponents[1,0]:=0.0;
  187. RawComponents[1,1]:=1.0;
  188. RawComponents[1,2]:=0.0;
  189. RawComponents[1,3]:=0.0;
  190. RawComponents[2,0]:=0.0;
  191. RawComponents[2,1]:=0.0;
  192. RawComponents[2,2]:=1.0;
  193. RawComponents[2,3]:=0.0;
  194. RawComponents[3,0]:=tx;
  195. RawComponents[3,1]:=ty;
  196. RawComponents[3,2]:=tz;
  197. RawComponents[3,3]:=1.0;
  198. end;
  199. constructor TMat4.Ortho(const Left,Right,Bottom,Top,zNear,zFar:TScalar);
  200. var
  201. rml,tmb,fmn:TScalar;
  202. begin
  203. rml:=Right-Left;
  204. tmb:=Top-Bottom;
  205. fmn:=zFar-zNear;
  206. RawComponents[0,0]:=2.0/rml;
  207. RawComponents[0,1]:=0.0;
  208. RawComponents[0,2]:=0.0;
  209. RawComponents[0,3]:=0.0;
  210. RawComponents[1,0]:=0.0;
  211. RawComponents[1,1]:=2.0/tmb;
  212. RawComponents[1,2]:=0.0;
  213. RawComponents[1,3]:=0.0;
  214. RawComponents[2,0]:=0.0;
  215. RawComponents[2,1]:=0.0;
  216. RawComponents[2,2]:=(-2.0)/fmn;
  217. RawComponents[2,3]:=0.0;
  218. RawComponents[3,0]:=(-(Right+Left))/rml;
  219. RawComponents[3,1]:=(-(Top+Bottom))/tmb;
  220. RawComponents[3,2]:=(-(zFar+zNear))/fmn;
  221. RawComponents[3,3]:=1.0;
  222. end;
  223. constructor TMat4.Perspective(const fovy,Aspect,zNear,zFar:TScalar);
  224. var
  225. Sine,Cotangent,ZDelta,Radians:TScalar;
  226. begin
  227. Radians:=(fovy*0.5)*DEG2RAD;
  228. ZDelta:=zFar-zNear;
  229. Sine:=sin(Radians);
  230. if not ((ZDelta=0) or (Sine=0) or (aspect=0)) then begin
  231. Cotangent:=cos(Radians)/Sine;
  232. // NOTE: What happens on copy?
  233. RawComponents:=Matrix4x4Identity.RawComponents;
  234. RawComponents[0,0]:=Cotangent/aspect;
  235. RawComponents[1,1]:=Cotangent;
  236. RawComponents[2,2]:=(-(zFar+zNear))/ZDelta;
  237. RawComponents[2,3]:=-1-0;
  238. RawComponents[3,2]:=(-(2.0*zNear*zFar))/ZDelta;
  239. RawComponents[3,3]:=0.0;
  240. end;
  241. end;
  242. constructor TMat4.Identity;
  243. begin
  244. RawComponents[0,0]:=1.0;
  245. RawComponents[0,1]:=0.0;
  246. RawComponents[0,2]:=0.0;
  247. RawComponents[0,3]:=0.0;
  248. RawComponents[1,0]:=0.0;
  249. RawComponents[1,1]:=1.0;
  250. RawComponents[1,2]:=0.0;
  251. RawComponents[1,3]:=0.0;
  252. RawComponents[2,0]:=0.0;
  253. RawComponents[2,1]:=0.0;
  254. RawComponents[2,2]:=1.0;
  255. RawComponents[2,3]:=0.0;
  256. RawComponents[3,0]:=0.0;
  257. RawComponents[3,1]:=0.0;
  258. RawComponents[3,2]:=0.0;
  259. RawComponents[3,3]:=1.0;
  260. end;
  261. procedure TMat4.Show;
  262. var
  263. x, y: integer;
  264. begin
  265. for y := 0 to 3 do
  266. begin
  267. write('[');
  268. for x := 0 to 3 do
  269. begin
  270. if x < 3 then
  271. write(RawComponents[x, y], ',')
  272. else
  273. write(RawComponents[x, y]);
  274. end;
  275. write(']');
  276. end;
  277. end;
  278. begin
  279. Matrix4x4Identity := TMat4.Identity;
  280. end.