matrix.pp 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  1. unit matrix;
  2. {
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 2004 by Daniel Mantione
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {This unit provides some common matrix and vector operations on vectors and
  12. matrixes with dimensions of 2, 3 and 4 which are the most common ones in
  13. computer graphics, and all routines provided in variations with single,
  14. double and extended precision.
  15. The goal of this unit is also to invite some standardisation
  16. between libraries, i.e. a vector from library x can be passed to library y
  17. without conversion routines in between.
  18. It would be nice to have some diehard assembler optimized versions of
  19. these routines, however the Free Pascal team wishes to concentrate on the
  20. compiler. Contributions from the community are very welcome.}
  21. {*****************************************************************************}
  22. interface
  23. {*****************************************************************************}
  24. {$mode fpc}
  25. {$ifndef FPUNONE}
  26. {$MACRO on}
  27. type Tvector2_single_data=array[0..1] of single;
  28. Tvector2_double_data=array[0..1] of double;
  29. Tvector2_extended_data=array[0..1] of extended;
  30. Tvector3_single_data=array[0..2] of single;
  31. Tvector3_double_data=array[0..2] of double;
  32. Tvector3_extended_data=array[0..2] of extended;
  33. Tvector4_single_data=array[0..3] of single;
  34. Tvector4_double_data=array[0..3] of double;
  35. Tvector4_extended_data=array[0..3] of extended;
  36. Tmatrix2_single_data=array[0..1,0..1] of single;
  37. Tmatrix2_double_data=array[0..1,0..1] of double;
  38. Tmatrix2_extended_data=array[0..1,0..1] of extended;
  39. Tmatrix3_single_data=array[0..2,0..2] of single;
  40. Tmatrix3_double_data=array[0..2,0..2] of double;
  41. Tmatrix3_extended_data=array[0..2,0..2] of extended;
  42. Tmatrix4_single_data=array[0..3,0..3] of single;
  43. Tmatrix4_double_data=array[0..3,0..3] of double;
  44. Tmatrix4_extended_data=array[0..3,0..3] of extended;
  45. Tvector2_single=object
  46. data:Tvector2_single_data;
  47. constructor init_zero;
  48. constructor init_one;
  49. constructor init(a,b:single);
  50. function length:single;
  51. function squared_length:single;
  52. end;
  53. Tvector2_double=object
  54. data:Tvector2_double_data;
  55. constructor init_zero;
  56. constructor init_one;
  57. constructor init(a,b:double);
  58. function length:double;
  59. function squared_length:double;
  60. end;
  61. Tvector2_extended=object
  62. data:Tvector2_extended_data;
  63. constructor init_zero;
  64. constructor init_one;
  65. constructor init(a,b:extended);
  66. function length:extended;
  67. function squared_length:extended;
  68. end;
  69. Tvector3_single=object
  70. data:Tvector3_single_data;
  71. constructor init_zero;
  72. constructor init_one;
  73. constructor init(a,b,c:single);
  74. function length:single;
  75. function squared_length:single;
  76. end;
  77. Tvector3_double=object
  78. data:Tvector3_double_data;
  79. constructor init_zero;
  80. constructor init_one;
  81. constructor init(a,b,c:double);
  82. function length:double;
  83. function squared_length:double;
  84. end;
  85. Tvector3_extended=object
  86. data:Tvector3_extended_data;
  87. constructor init_zero;
  88. constructor init_one;
  89. constructor init(a,b,c:extended);
  90. function length:extended;
  91. function squared_length:extended;
  92. end;
  93. Tvector4_single=object
  94. data:Tvector4_single_data;
  95. constructor init_zero;
  96. constructor init_one;
  97. constructor init(a,b,c,d:single);
  98. function length:single;
  99. function squared_length:single;
  100. end;
  101. Tvector4_double=object
  102. data:Tvector4_double_data;
  103. constructor init_zero;
  104. constructor init_one;
  105. constructor init(a,b,c,d:double);
  106. function length:double;
  107. function squared_length:double;
  108. end;
  109. Tvector4_extended=object
  110. data:Tvector4_extended_data;
  111. constructor init_zero;
  112. constructor init_one;
  113. constructor init(a,b,c,d:extended);
  114. function length:extended;
  115. function squared_length:extended;
  116. end;
  117. Tmatrix2_single=object
  118. data:Tmatrix2_single_data;
  119. constructor init_zero;
  120. constructor init_identity;
  121. constructor init(aa,ab,ba,bb:single);
  122. function get_column(c:byte):Tvector2_single;
  123. function get_row(r:byte):Tvector2_single;
  124. procedure set_column(c:byte;const v:Tvector2_single);
  125. procedure set_row(r:byte;const v:Tvector2_single);
  126. function determinant:single;
  127. function inverse(Adeterminant:single):Tmatrix2_single;
  128. function transpose:Tmatrix2_single;
  129. end;
  130. Tmatrix2_double=object
  131. data:Tmatrix2_double_data;
  132. constructor init_zero;
  133. constructor init_identity;
  134. constructor init(aa,ab,ba,bb:double);
  135. function get_column(c:byte):Tvector2_double;
  136. function get_row(r:byte):Tvector2_double;
  137. procedure set_column(c:byte;const v:Tvector2_double);
  138. procedure set_row(r:byte;const v:Tvector2_double);
  139. function determinant:double;
  140. function inverse(Adeterminant:double):Tmatrix2_double;
  141. function transpose:Tmatrix2_double;
  142. end;
  143. Tmatrix2_extended=object
  144. data:Tmatrix2_extended_data;
  145. constructor init_zero;
  146. constructor init_identity;
  147. constructor init(aa,ab,ba,bb:extended);
  148. function get_column(c:byte):Tvector2_extended;
  149. function get_row(r:byte):Tvector2_extended;
  150. procedure set_column(c:byte;const v:Tvector2_extended);
  151. procedure set_row(r:byte;const v:Tvector2_extended);
  152. function determinant:extended;
  153. function inverse(Adeterminant:extended):Tmatrix2_extended;
  154. function transpose:Tmatrix2_extended;
  155. end;
  156. Tmatrix3_single=object
  157. data:Tmatrix3_single_data;
  158. constructor init_zero;
  159. constructor init_identity;
  160. constructor init(aa,ab,ac,ba,bb,bc,ca,cb,cc:single);
  161. function get_column(c:byte):Tvector3_single;
  162. function get_row(r:byte):Tvector3_single;
  163. procedure set_column(c:byte;const v:Tvector3_single);
  164. procedure set_row(r:byte;const v:Tvector3_single);
  165. function determinant:single;
  166. function inverse(Adeterminant:single):Tmatrix3_single;
  167. function transpose:Tmatrix3_single;
  168. end;
  169. Tmatrix3_double=object
  170. data:Tmatrix3_double_data;
  171. constructor init_zero;
  172. constructor init_identity;
  173. constructor init(aa,ab,ac,ba,bb,bc,ca,cb,cc:double);
  174. function get_column(c:byte):Tvector3_double;
  175. function get_row(r:byte):Tvector3_double;
  176. procedure set_column(c:byte;const v:Tvector3_double);
  177. procedure set_row(r:byte;const v:Tvector3_double);
  178. function determinant:double;
  179. function inverse(Adeterminant:double):Tmatrix3_double;
  180. function transpose:Tmatrix3_double;
  181. end;
  182. Tmatrix3_extended=object
  183. data:Tmatrix3_extended_data;
  184. constructor init_zero;
  185. constructor init_identity;
  186. constructor init(aa,ab,ac,ba,bb,bc,ca,cb,cc:extended);
  187. function get_column(c:byte):Tvector3_extended;
  188. function get_row(r:byte):Tvector3_extended;
  189. procedure set_column(c:byte;const v:Tvector3_extended);
  190. procedure set_row(r:byte;const v:Tvector3_extended);
  191. function determinant:extended;
  192. function inverse(Adeterminant:extended):Tmatrix3_extended;
  193. function transpose:Tmatrix3_extended;
  194. end;
  195. Tmatrix4_single=object
  196. data:Tmatrix4_single_data;
  197. constructor init_zero;
  198. constructor init_identity;
  199. constructor init(aa,ab,ac,ad,ba,bb,bc,bd,ca,cb,cc,cd,da,db,dc,dd:single);
  200. function get_column(c:byte):Tvector4_single;
  201. function get_row(r:byte):Tvector4_single;
  202. procedure set_column(c:byte;const v:Tvector4_single);
  203. procedure set_row(r:byte;const v:Tvector4_single);
  204. function determinant:single;
  205. function inverse(Adeterminant:single):Tmatrix4_single;
  206. function transpose:Tmatrix4_single;
  207. end;
  208. Tmatrix4_double=object
  209. data:Tmatrix4_double_data;
  210. constructor init_zero;
  211. constructor init_identity;
  212. constructor init(aa,ab,ac,ad,ba,bb,bc,bd,ca,cb,cc,cd,da,db,dc,dd:double);
  213. function get_column(c:byte):Tvector4_double;
  214. function get_row(r:byte):Tvector4_double;
  215. procedure set_column(c:byte;const v:Tvector4_double);
  216. procedure set_row(r:byte;const v:Tvector4_double);
  217. function determinant:double;
  218. function inverse(Adeterminant:double):Tmatrix4_double;
  219. function transpose:Tmatrix4_double;
  220. end;
  221. Tmatrix4_extended=object
  222. data:Tmatrix4_extended_data;
  223. constructor init_zero;
  224. constructor init_identity;
  225. constructor init(aa,ab,ac,ad,ba,bb,bc,bd,ca,cb,cc,cd,da,db,dc,dd:extended);
  226. function get_column(c:byte):Tvector4_extended;
  227. function get_row(r:byte):Tvector4_extended;
  228. procedure set_column(c:byte;const v:Tvector4_extended);
  229. procedure set_row(r:byte;const v:Tvector4_extended);
  230. function determinant:extended;
  231. function inverse(Adeterminant:extended):Tmatrix4_extended;
  232. function transpose:Tmatrix4_extended;
  233. end;
  234. {Operators to make different vectors assignable to each other}
  235. operator := (const v:Tvector2_single) result:Tvector2_double;
  236. operator := (const v:Tvector2_single) result:Tvector2_extended;
  237. operator := (const v:Tvector2_double) result:Tvector2_single;
  238. operator := (const v:Tvector2_double) result:Tvector2_extended;
  239. operator := (const v:Tvector2_extended) result:Tvector2_single;
  240. operator := (const v:Tvector2_extended) result:Tvector2_double;
  241. operator := (const v:Tvector2_single) result:Tvector3_single;
  242. operator := (const v:Tvector2_single) result:Tvector3_double;
  243. operator := (const v:Tvector2_single) result:Tvector3_extended;
  244. operator := (const v:Tvector2_double) result:Tvector3_single;
  245. operator := (const v:Tvector2_double) result:Tvector3_double;
  246. operator := (const v:Tvector2_double) result:Tvector3_extended;
  247. operator := (const v:Tvector2_extended) result:Tvector3_single;
  248. operator := (const v:Tvector2_extended) result:Tvector3_double;
  249. operator := (const v:Tvector2_extended) result:Tvector3_extended;
  250. operator := (const v:Tvector2_single) result:Tvector4_single;
  251. operator := (const v:Tvector2_single) result:Tvector4_double;
  252. operator := (const v:Tvector2_single) result:Tvector4_extended;
  253. operator := (const v:Tvector2_double) result:Tvector4_single;
  254. operator := (const v:Tvector2_double) result:Tvector4_double;
  255. operator := (const v:Tvector2_double) result:Tvector4_extended;
  256. operator := (const v:Tvector2_extended) result:Tvector4_single;
  257. operator := (const v:Tvector2_extended) result:Tvector4_double;
  258. operator := (const v:Tvector2_extended) result:Tvector4_extended;
  259. operator := (const v:Tvector3_single) result:Tvector2_single;
  260. operator := (const v:Tvector3_single) result:Tvector2_double;
  261. operator := (const v:Tvector3_single) result:Tvector2_extended;
  262. operator := (const v:Tvector3_double) result:Tvector2_single;
  263. operator := (const v:Tvector3_double) result:Tvector2_double;
  264. operator := (const v:Tvector3_double) result:Tvector2_extended;
  265. operator := (const v:Tvector3_extended) result:Tvector2_single;
  266. operator := (const v:Tvector3_extended) result:Tvector2_double;
  267. operator := (const v:Tvector3_extended) result:Tvector2_extended;
  268. operator := (const v:Tvector3_single) result:Tvector3_double;
  269. operator := (const v:Tvector3_single) result:Tvector3_extended;
  270. operator := (const v:Tvector3_double) result:Tvector3_single;
  271. operator := (const v:Tvector3_double) result:Tvector3_extended;
  272. operator := (const v:Tvector3_extended) result:Tvector3_single;
  273. operator := (const v:Tvector3_extended) result:Tvector3_double;
  274. operator := (const v:Tvector3_single) result:Tvector4_single;
  275. operator := (const v:Tvector3_single) result:Tvector4_double;
  276. operator := (const v:Tvector3_single) result:Tvector4_extended;
  277. operator := (const v:Tvector3_double) result:Tvector4_single;
  278. operator := (const v:Tvector3_double) result:Tvector4_double;
  279. operator := (const v:Tvector3_double) result:Tvector4_extended;
  280. operator := (const v:Tvector3_extended) result:Tvector4_single;
  281. operator := (const v:Tvector3_extended) result:Tvector4_double;
  282. operator := (const v:Tvector3_extended) result:Tvector4_extended;
  283. operator := (const v:Tvector4_single) result:Tvector2_single;
  284. operator := (const v:Tvector4_single) result:Tvector2_double;
  285. operator := (const v:Tvector4_single) result:Tvector2_extended;
  286. operator := (const v:Tvector4_double) result:Tvector2_single;
  287. operator := (const v:Tvector4_double) result:Tvector2_double;
  288. operator := (const v:Tvector4_double) result:Tvector2_extended;
  289. operator := (const v:Tvector4_extended) result:Tvector2_single;
  290. operator := (const v:Tvector4_extended) result:Tvector2_double;
  291. operator := (const v:Tvector4_extended) result:Tvector2_extended;
  292. operator := (const v:Tvector4_single) result:Tvector3_single;
  293. operator := (const v:Tvector4_single) result:Tvector3_double;
  294. operator := (const v:Tvector4_single) result:Tvector3_extended;
  295. operator := (const v:Tvector4_double) result:Tvector3_single;
  296. operator := (const v:Tvector4_double) result:Tvector3_double;
  297. operator := (const v:Tvector4_double) result:Tvector3_extended;
  298. operator := (const v:Tvector4_extended) result:Tvector3_single;
  299. operator := (const v:Tvector4_extended) result:Tvector3_double;
  300. operator := (const v:Tvector4_extended) result:Tvector3_extended;
  301. operator := (const v:Tvector4_single) result:Tvector4_double;
  302. operator := (const v:Tvector4_single) result:Tvector4_extended;
  303. operator := (const v:Tvector4_double) result:Tvector4_single;
  304. operator := (const v:Tvector4_double) result:Tvector4_extended;
  305. operator := (const v:Tvector4_extended) result:Tvector4_single;
  306. operator := (const v:Tvector4_extended) result:Tvector4_double;
  307. {Vector to vector operations.}
  308. operator + (const x,y:Tvector2_single) result:Tvector2_single;
  309. operator + (const x,y:Tvector2_double) result:Tvector2_double;
  310. operator + (const x,y:Tvector2_extended) result:Tvector2_extended;
  311. operator + (const x,y:Tvector3_single) result:Tvector3_single;
  312. operator + (const x,y:Tvector3_double) result:Tvector3_double;
  313. operator + (const x,y:Tvector3_extended) result:Tvector3_extended;
  314. operator + (const x,y:Tvector4_single) result:Tvector4_single;
  315. operator + (const x,y:Tvector4_double) result:Tvector4_double;
  316. operator + (const x,y:Tvector4_extended) result:Tvector4_extended;
  317. operator - (const x,y:Tvector2_single) result:Tvector2_single;
  318. operator - (const x,y:Tvector2_double) result:Tvector2_double;
  319. operator - (const x,y:Tvector2_extended) result:Tvector2_extended;
  320. operator - (const x,y:Tvector3_single) result:Tvector3_single;
  321. operator - (const x,y:Tvector3_double) result:Tvector3_double;
  322. operator - (const x,y:Tvector3_extended) result:Tvector3_extended;
  323. operator - (const x,y:Tvector4_single) result:Tvector4_single;
  324. operator - (const x,y:Tvector4_double) result:Tvector4_double;
  325. operator - (const x,y:Tvector4_extended) result:Tvector4_extended;
  326. operator - (const x:Tvector2_single) result:Tvector2_single;
  327. operator - (const x:Tvector2_double) result:Tvector2_double;
  328. operator - (const x:Tvector2_extended) result:Tvector2_extended;
  329. operator - (const x:Tvector3_single) result:Tvector3_single;
  330. operator - (const x:Tvector3_double) result:Tvector3_double;
  331. operator - (const x:Tvector3_extended) result:Tvector3_extended;
  332. operator - (const x:Tvector4_single) result:Tvector4_single;
  333. operator - (const x:Tvector4_double) result:Tvector4_double;
  334. operator - (const x:Tvector4_extended) result:Tvector4_extended;
  335. operator * (const x,y:Tvector2_single) result:Tvector2_single;
  336. operator * (const x,y:Tvector2_double) result:Tvector2_double;
  337. operator * (const x,y:Tvector2_extended) result:Tvector2_extended;
  338. operator * (const x,y:Tvector3_single) result:Tvector3_single;
  339. operator * (const x,y:Tvector3_double) result:Tvector3_double;
  340. operator * (const x,y:Tvector3_extended) result:Tvector3_extended;
  341. operator * (const x,y:Tvector4_single) result:Tvector4_single;
  342. operator * (const x,y:Tvector4_double) result:Tvector4_double;
  343. operator * (const x,y:Tvector4_extended) result:Tvector4_extended;
  344. operator ** (const x,y:Tvector2_single) result:single;
  345. operator ** (const x,y:Tvector2_double) result:double;
  346. operator ** (const x,y:Tvector2_extended) result:extended;
  347. operator ** (const x,y:Tvector3_single) result:single;
  348. operator ** (const x,y:Tvector3_double) result:double;
  349. operator ** (const x,y:Tvector3_extended) result:extended;
  350. operator ** (const x,y:Tvector4_single) result:single;
  351. operator ** (const x,y:Tvector4_double) result:double;
  352. operator ** (const x,y:Tvector4_extended) result:extended;
  353. operator >< (const x,y:Tvector3_single) result:Tvector3_single;
  354. operator >< (const x,y:Tvector3_double) result:Tvector3_double;
  355. operator >< (const x,y:Tvector3_extended) result:Tvector3_extended;
  356. {Vector/scalar operations.}
  357. operator + (const x:Tvector2_single;y:single) result:Tvector2_single;
  358. operator + (const x:Tvector2_double;y:double) result:Tvector2_double;
  359. operator + (const x:Tvector2_extended;y:extended) result:Tvector2_extended;
  360. operator + (const x:Tvector3_single;y:single) result:Tvector3_single;
  361. operator + (const x:Tvector3_double;y:double) result:Tvector3_double;
  362. operator + (const x:Tvector3_extended;y:extended) result:Tvector3_extended;
  363. operator + (const x:Tvector4_single;y:single) result:Tvector4_single;
  364. operator + (const x:Tvector4_double;y:double) result:Tvector4_double;
  365. operator + (const x:Tvector4_extended;y:extended) result:Tvector4_extended;
  366. operator - (const x:Tvector2_single;y:single) result:Tvector2_single;
  367. operator - (const x:Tvector2_double;y:double) result:Tvector2_double;
  368. operator - (const x:Tvector2_extended;y:extended) result:Tvector2_extended;
  369. operator - (const x:Tvector3_single;y:single) result:Tvector3_single;
  370. operator - (const x:Tvector3_double;y:double) result:Tvector3_double;
  371. operator - (const x:Tvector3_extended;y:extended) result:Tvector3_extended;
  372. operator - (const x:Tvector4_single;y:single) result:Tvector4_single;
  373. operator - (const x:Tvector4_double;y:double) result:Tvector4_double;
  374. operator - (const x:Tvector4_extended;y:extended) result:Tvector4_extended;
  375. operator * (const x:Tvector2_single;y:single) result:Tvector2_single;
  376. operator * (const x:Tvector2_double;y:double) result:Tvector2_double;
  377. operator * (const x:Tvector2_extended;y:extended) result:Tvector2_extended;
  378. operator * (const x:Tvector3_single;y:single) result:Tvector3_single;
  379. operator * (const x:Tvector3_double;y:double) result:Tvector3_double;
  380. operator * (const x:Tvector3_extended;y:extended) result:Tvector3_extended;
  381. operator * (const x:Tvector4_single;y:single) result:Tvector4_single;
  382. operator * (const x:Tvector4_double;y:double) result:Tvector4_double;
  383. operator * (const x:Tvector4_extended;y:extended) result:Tvector4_extended;
  384. operator / (const x:Tvector2_single;y:single) result:Tvector2_single;
  385. operator / (const x:Tvector2_double;y:double) result:Tvector2_double;
  386. operator / (const x:Tvector2_extended;y:extended) result:Tvector2_extended;
  387. operator / (const x:Tvector3_single;y:single) result:Tvector3_single;
  388. operator / (const x:Tvector3_double;y:double) result:Tvector3_double;
  389. operator / (const x:Tvector3_extended;y:extended) result:Tvector3_extended;
  390. operator / (const x:Tvector4_single;y:single) result:Tvector4_single;
  391. operator / (const x:Tvector4_double;y:double) result:Tvector4_double;
  392. operator / (const x:Tvector4_extended;y:extended) result:Tvector4_extended;
  393. {Operators to make different matrixes assignable to each other}
  394. operator := (const v:Tmatrix2_single) result:Tmatrix2_double;
  395. operator := (const v:Tmatrix2_single) result:Tmatrix2_extended;
  396. operator := (const v:Tmatrix2_double) result:Tmatrix2_single;
  397. operator := (const v:Tmatrix2_double) result:Tmatrix2_extended;
  398. operator := (const v:Tmatrix2_extended) result:Tmatrix2_single;
  399. operator := (const v:Tmatrix2_extended) result:Tmatrix2_double;
  400. operator := (const v:Tmatrix2_single) result:Tmatrix3_single;
  401. operator := (const v:Tmatrix2_single) result:Tmatrix3_double;
  402. operator := (const v:Tmatrix2_single) result:Tmatrix3_extended;
  403. operator := (const v:Tmatrix2_double) result:Tmatrix3_single;
  404. operator := (const v:Tmatrix2_double) result:Tmatrix3_double;
  405. operator := (const v:Tmatrix2_double) result:Tmatrix3_extended;
  406. operator := (const v:Tmatrix2_extended) result:Tmatrix3_single;
  407. operator := (const v:Tmatrix2_extended) result:Tmatrix3_double;
  408. operator := (const v:Tmatrix2_extended) result:Tmatrix3_extended;
  409. operator := (const v:Tmatrix2_single) result:Tmatrix4_single;
  410. operator := (const v:Tmatrix2_single) result:Tmatrix4_double;
  411. operator := (const v:Tmatrix2_single) result:Tmatrix4_extended;
  412. operator := (const v:Tmatrix2_double) result:Tmatrix4_single;
  413. operator := (const v:Tmatrix2_double) result:Tmatrix4_double;
  414. operator := (const v:Tmatrix2_double) result:Tmatrix4_extended;
  415. operator := (const v:Tmatrix2_extended) result:Tmatrix4_single;
  416. operator := (const v:Tmatrix2_extended) result:Tmatrix4_double;
  417. operator := (const v:Tmatrix2_extended) result:Tmatrix4_extended;
  418. operator := (const v:Tmatrix3_single) result:Tmatrix2_single;
  419. operator := (const v:Tmatrix3_single) result:Tmatrix2_double;
  420. operator := (const v:Tmatrix3_single) result:Tmatrix2_extended;
  421. operator := (const v:Tmatrix3_double) result:Tmatrix2_single;
  422. operator := (const v:Tmatrix3_double) result:Tmatrix2_double;
  423. operator := (const v:Tmatrix3_double) result:Tmatrix2_extended;
  424. operator := (const v:Tmatrix3_extended) result:Tmatrix2_single;
  425. operator := (const v:Tmatrix3_extended) result:Tmatrix2_double;
  426. operator := (const v:Tmatrix3_extended) result:Tmatrix2_extended;
  427. operator := (const v:Tmatrix3_single) result:Tmatrix3_double;
  428. operator := (const v:Tmatrix3_single) result:Tmatrix3_extended;
  429. operator := (const v:Tmatrix3_double) result:Tmatrix3_single;
  430. operator := (const v:Tmatrix3_double) result:Tmatrix3_extended;
  431. operator := (const v:Tmatrix3_extended) result:Tmatrix3_single;
  432. operator := (const v:Tmatrix3_extended) result:Tmatrix3_double;
  433. operator := (const v:Tmatrix3_single) result:Tmatrix4_single;
  434. operator := (const v:Tmatrix3_single) result:Tmatrix4_double;
  435. operator := (const v:Tmatrix3_single) result:Tmatrix4_extended;
  436. operator := (const v:Tmatrix3_double) result:Tmatrix4_single;
  437. operator := (const v:Tmatrix3_double) result:Tmatrix4_double;
  438. operator := (const v:Tmatrix3_double) result:Tmatrix4_extended;
  439. operator := (const v:Tmatrix3_extended) result:Tmatrix4_single;
  440. operator := (const v:Tmatrix3_extended) result:Tmatrix4_double;
  441. operator := (const v:Tmatrix3_extended) result:Tmatrix4_extended;
  442. operator := (const v:Tmatrix4_single) result:Tmatrix2_single;
  443. operator := (const v:Tmatrix4_single) result:Tmatrix2_double;
  444. operator := (const v:Tmatrix4_single) result:Tmatrix2_extended;
  445. operator := (const v:Tmatrix4_double) result:Tmatrix2_single;
  446. operator := (const v:Tmatrix4_double) result:Tmatrix2_double;
  447. operator := (const v:Tmatrix4_double) result:Tmatrix2_extended;
  448. operator := (const v:Tmatrix4_extended) result:Tmatrix2_single;
  449. operator := (const v:Tmatrix4_extended) result:Tmatrix2_double;
  450. operator := (const v:Tmatrix4_extended) result:Tmatrix2_extended;
  451. operator := (const v:Tmatrix4_single) result:Tmatrix3_single;
  452. operator := (const v:Tmatrix4_single) result:Tmatrix3_double;
  453. operator := (const v:Tmatrix4_single) result:Tmatrix3_extended;
  454. operator := (const v:Tmatrix4_double) result:Tmatrix3_single;
  455. operator := (const v:Tmatrix4_double) result:Tmatrix3_double;
  456. operator := (const v:Tmatrix4_double) result:Tmatrix3_extended;
  457. operator := (const v:Tmatrix4_extended) result:Tmatrix3_single;
  458. operator := (const v:Tmatrix4_extended) result:Tmatrix3_double;
  459. operator := (const v:Tmatrix4_extended) result:Tmatrix3_extended;
  460. operator := (const v:Tmatrix4_single) result:Tmatrix4_double;
  461. operator := (const v:Tmatrix4_single) result:Tmatrix4_extended;
  462. operator := (const v:Tmatrix4_double) result:Tmatrix4_single;
  463. operator := (const v:Tmatrix4_double) result:Tmatrix4_extended;
  464. operator := (const v:Tmatrix4_extended) result:Tmatrix4_single;
  465. operator := (const v:Tmatrix4_extended) result:Tmatrix4_double;
  466. {Matrix to matrix operatons.}
  467. operator + (const m1,m2:Tmatrix2_single) result:Tmatrix2_single;
  468. operator + (const m1,m2:Tmatrix2_double) result:Tmatrix2_double;
  469. operator + (const m1,m2:Tmatrix2_extended) result:Tmatrix2_extended;
  470. operator + (const m1,m2:Tmatrix3_single) result:Tmatrix3_single;
  471. operator + (const m1,m2:Tmatrix3_double) result:Tmatrix3_double;
  472. operator + (const m1,m2:Tmatrix3_extended) result:Tmatrix3_extended;
  473. operator + (const m1,m2:Tmatrix4_single) result:Tmatrix4_single;
  474. operator + (const m1,m2:Tmatrix4_double) result:Tmatrix4_double;
  475. operator + (const m1,m2:Tmatrix4_extended) result:Tmatrix4_extended;
  476. operator - (const m1,m2:Tmatrix2_single) result:Tmatrix2_single;
  477. operator - (const m1,m2:Tmatrix2_double) result:Tmatrix2_double;
  478. operator - (const m1,m2:Tmatrix2_extended) result:Tmatrix2_extended;
  479. operator - (const m1,m2:Tmatrix3_single) result:Tmatrix3_single;
  480. operator - (const m1,m2:Tmatrix3_double) result:Tmatrix3_double;
  481. operator - (const m1,m2:Tmatrix3_extended) result:Tmatrix3_extended;
  482. operator - (const m1,m2:Tmatrix4_single) result:Tmatrix4_single;
  483. operator - (const m1,m2:Tmatrix4_double) result:Tmatrix4_double;
  484. operator - (const m1,m2:Tmatrix4_extended) result:Tmatrix4_extended;
  485. operator - (const m1:Tmatrix2_single) result:Tmatrix2_single;
  486. operator - (const m1:Tmatrix2_double) result:Tmatrix2_double;
  487. operator - (const m1:Tmatrix2_extended) result:Tmatrix2_extended;
  488. operator - (const m1:Tmatrix3_single) result:Tmatrix3_single;
  489. operator - (const m1:Tmatrix3_double) result:Tmatrix3_double;
  490. operator - (const m1:Tmatrix3_extended) result:Tmatrix3_extended;
  491. operator - (const m1:Tmatrix4_single) result:Tmatrix4_single;
  492. operator - (const m1:Tmatrix4_double) result:Tmatrix4_double;
  493. operator - (const m1:Tmatrix4_extended) result:Tmatrix4_extended;
  494. operator * (const m1,m2:Tmatrix2_single) result:Tmatrix2_single;
  495. operator * (const m1,m2:Tmatrix2_double) result:Tmatrix2_double;
  496. operator * (const m1,m2:Tmatrix2_extended) result:Tmatrix2_extended;
  497. operator * (const m1,m2:Tmatrix3_single) result:Tmatrix3_single;
  498. operator * (const m1,m2:Tmatrix3_double) result:Tmatrix3_double;
  499. operator * (const m1,m2:Tmatrix3_extended) result:Tmatrix3_extended;
  500. operator * (const m1,m2:Tmatrix4_single) result:Tmatrix4_single;
  501. operator * (const m1,m2:Tmatrix4_double) result:Tmatrix4_double;
  502. operator * (const m1,m2:Tmatrix4_extended) result:Tmatrix4_extended;
  503. {Matrix/vector operations}
  504. operator * (const m:Tmatrix2_single;const v:Tvector2_single) result:Tvector2_single;
  505. operator * (const m:Tmatrix2_double;const v:Tvector2_double) result:Tvector2_double;
  506. operator * (const m:Tmatrix2_extended;const v:Tvector2_extended) result:Tvector2_extended;
  507. operator * (const m:Tmatrix3_single;const v:Tvector3_single) result:Tvector3_single;
  508. operator * (const m:Tmatrix3_double;const v:Tvector3_double) result:Tvector3_double;
  509. operator * (const m:Tmatrix3_extended;const v:Tvector3_extended) result:Tvector3_extended;
  510. operator * (const m:Tmatrix4_single;const v:Tvector4_single) result:Tvector4_single;
  511. operator * (const m:Tmatrix4_double;const v:Tvector4_double) result:Tvector4_double;
  512. operator * (const m:Tmatrix4_extended;const v:Tvector4_extended) result:Tvector4_extended;
  513. {Matrix/scalar operations}
  514. operator + (const m:Tmatrix2_single;const x:single) result:Tmatrix2_single;
  515. operator + (const m:Tmatrix2_double;const x:double) result:Tmatrix2_double;
  516. operator + (const m:Tmatrix2_extended;const x:extended) result:Tmatrix2_extended;
  517. operator + (const m:Tmatrix3_single;const x:single) result:Tmatrix3_single;
  518. operator + (const m:Tmatrix3_double;const x:double) result:Tmatrix3_double;
  519. operator + (const m:Tmatrix3_extended;const x:extended) result:Tmatrix3_extended;
  520. operator + (const m:Tmatrix4_single;const x:single) result:Tmatrix4_single;
  521. operator + (const m:Tmatrix4_double;const x:double) result:Tmatrix4_double;
  522. operator + (const m:Tmatrix4_extended;const x:extended) result:Tmatrix4_extended;
  523. operator - (const m:Tmatrix2_single;const x:single) result:Tmatrix2_single;
  524. operator - (const m:Tmatrix2_double;const x:double) result:Tmatrix2_double;
  525. operator - (const m:Tmatrix2_extended;const x:extended) result:Tmatrix2_extended;
  526. operator - (const m:Tmatrix3_single;const x:single) result:Tmatrix3_single;
  527. operator - (const m:Tmatrix3_double;const x:double) result:Tmatrix3_double;
  528. operator - (const m:Tmatrix3_extended;const x:extended) result:Tmatrix3_extended;
  529. operator - (const m:Tmatrix4_single;const x:single) result:Tmatrix4_single;
  530. operator - (const m:Tmatrix4_double;const x:double) result:Tmatrix4_double;
  531. operator - (const m:Tmatrix4_extended;const x:extended) result:Tmatrix4_extended;
  532. operator * (const m:Tmatrix2_single;const x:single) result:Tmatrix2_single;
  533. operator * (const m:Tmatrix2_double;const x:double) result:Tmatrix2_double;
  534. operator * (const m:Tmatrix2_extended;const x:extended) result:Tmatrix2_extended;
  535. operator * (const m:Tmatrix3_single;const x:single) result:Tmatrix3_single;
  536. operator * (const m:Tmatrix3_double;const x:double) result:Tmatrix3_double;
  537. operator * (const m:Tmatrix3_extended;const x:extended) result:Tmatrix3_extended;
  538. operator * (const m:Tmatrix4_single;const x:single) result:Tmatrix4_single;
  539. operator * (const m:Tmatrix4_double;const x:double) result:Tmatrix4_double;
  540. operator * (const m:Tmatrix4_extended;const x:extended) result:Tmatrix4_extended;
  541. operator / (const m:Tmatrix2_single;const x:single) result:Tmatrix2_single;
  542. operator / (const m:Tmatrix2_double;const x:double) result:Tmatrix2_double;
  543. operator / (const m:Tmatrix2_extended;const x:extended) result:Tmatrix2_extended;
  544. operator / (const m:Tmatrix3_single;const x:single) result:Tmatrix3_single;
  545. operator / (const m:Tmatrix3_double;const x:double) result:Tmatrix3_double;
  546. operator / (const m:Tmatrix3_extended;const x:extended) result:Tmatrix3_extended;
  547. operator / (const m:Tmatrix4_single;const x:single) result:Tmatrix4_single;
  548. operator / (const m:Tmatrix4_double;const x:double) result:Tmatrix4_double;
  549. operator / (const m:Tmatrix4_extended;const x:extended) result:Tmatrix4_extended;
  550. {*****************************************************************************}
  551. implementation
  552. {*****************************************************************************}
  553. {******************************************************************************
  554. Tvector2_single
  555. ******************************************************************************}
  556. {Need to use capitals due to bug in FPC. Bug was fixed in FPC 1.9.3 on
  557. 10 Feb. 2004}
  558. {$DEFINE datatype:=SINGLE}
  559. {$DEFINE objectname:=Tvector2_single}
  560. {$DEFINE vecsize:=2}
  561. {$INFO Compile mvecimp.inc for Tvector2_single}
  562. {$i mvecimp.inc}
  563. {******************************************************************************
  564. Tvector2_double
  565. ******************************************************************************}
  566. {$DEFINE datatype:=DOUBLE}
  567. {$DEFINE objectname:=Tvector2_double}
  568. {$DEFINE vecsize:=2}
  569. {$INFO Compile mvecimp.inc for Tvector2_double}
  570. {$i mvecimp.inc}
  571. {******************************************************************************
  572. Tvector2_extended
  573. ******************************************************************************}
  574. {$DEFINE datatype:=EXTENDED}
  575. {$DEFINE objectname:=Tvector2_extended}
  576. {$DEFINE vecsize:=2}
  577. {$INFO Compile mvecimp.inc for Tvector2_extended}
  578. {$i mvecimp.inc}
  579. {******************************************************************************
  580. Tvector3_single
  581. ******************************************************************************}
  582. {Need to use capitals due to bug in FPC. Bug was fixed in FPC 1.9.3 on
  583. 10 Feb. 2004}
  584. {$DEFINE datatype:=SINGLE}
  585. {$DEFINE objectname:=Tvector3_single}
  586. {$DEFINE vecsize:=3}
  587. {$INFO Compile mvecimp.inc for Tvector3_single}
  588. {$i mvecimp.inc}
  589. {******************************************************************************
  590. Tvector3_double
  591. ******************************************************************************}
  592. {$DEFINE datatype:=DOUBLE}
  593. {$DEFINE objectname:=Tvector3_double}
  594. {$DEFINE vecsize:=3}
  595. {$INFO Compile mvecimp.inc for Tvector3_double}
  596. {$i mvecimp.inc}
  597. {******************************************************************************
  598. Tvector3_extended
  599. ******************************************************************************}
  600. {$DEFINE datatype:=EXTENDED}
  601. {$DEFINE objectname:=Tvector3_extended}
  602. {$DEFINE vecsize:=3}
  603. {$INFO Compile mvecimp.inc for Tvector3_extended}
  604. {$i mvecimp.inc}
  605. {******************************************************************************
  606. Tvector4_single
  607. ******************************************************************************}
  608. {Need to use capitals due to bug in FPC. Bug was fixed in FPC 1.9.3 on
  609. 10 Feb. 2004}
  610. {$DEFINE datatype:=SINGLE}
  611. {$DEFINE objectname:=Tvector4_single}
  612. {$DEFINE vecsize:=4}
  613. {$INFO Compile mvecimp.inc for Tvector4_single}
  614. {$i mvecimp.inc}
  615. {******************************************************************************
  616. Tvector4_double
  617. ******************************************************************************}
  618. {$DEFINE datatype:=DOUBLE}
  619. {$DEFINE objectname:=Tvector4_double}
  620. {$DEFINE vecsize:=4}
  621. {$INFO Compile mvecimp.inc for Tvector4_double}
  622. {$i mvecimp.inc}
  623. {******************************************************************************
  624. Tvector4_extended
  625. ******************************************************************************}
  626. {$DEFINE datatype:=EXTENDED}
  627. {$DEFINE objectname:=Tvector4_extended}
  628. {$DEFINE vecsize:=4}
  629. {$INFO Compile mvecimp.inc for Tvector4_extended}
  630. {$i mvecimp.inc}
  631. {******************************************************************************
  632. Tmatrix2_single
  633. ******************************************************************************}
  634. {$DEFINE datatype:=SINGLE}
  635. {$DEFINE objectname:=Tmatrix2_single}
  636. {$DEFINE vectorcompanion:=Tvector2_single}
  637. {$DEFINE matsize:=2}
  638. {$INFO Compile mmatimp.inc for Tmatrix2_single}
  639. {$i mmatimp.inc}
  640. {******************************************************************************
  641. Tmatrix2_double
  642. ******************************************************************************}
  643. {$DEFINE datatype:=DOUBLE}
  644. {$DEFINE objectname:=Tmatrix2_double}
  645. {$DEFINE vectorcompanion:=Tvector2_double}
  646. {$DEFINE matsize:=2}
  647. {$INFO Compile mmatimp.inc for Tmatrix2_double}
  648. {$i mmatimp.inc}
  649. {******************************************************************************
  650. Tmatrix2_extended
  651. ******************************************************************************}
  652. {$DEFINE datatype:=EXTENDED}
  653. {$DEFINE objectname:=Tmatrix2_extended}
  654. {$DEFINE vectorcompanion:=Tvector2_extended}
  655. {$DEFINE matsize:=2}
  656. {$INFO Compile mmatimp.inc for Tmatrix2_extended}
  657. {$i mmatimp.inc}
  658. {******************************************************************************
  659. Tmatrix3_single
  660. ******************************************************************************}
  661. {$DEFINE datatype:=SINGLE}
  662. {$DEFINE objectname:=Tmatrix3_single}
  663. {$DEFINE vectorcompanion:=Tvector3_single}
  664. {$DEFINE matsize:=3}
  665. {$INFO Compile mmatimp.inc for Tmatrix3_single}
  666. {$i mmatimp.inc}
  667. {******************************************************************************
  668. Tmatrix3_double
  669. ******************************************************************************}
  670. {$DEFINE datatype:=DOUBLE}
  671. {$DEFINE objectname:=Tmatrix3_double}
  672. {$DEFINE vectorcompanion:=Tvector3_double}
  673. {$DEFINE matsize:=3}
  674. {$INFO Compile mmatimp.inc for Tmatrix3_double}
  675. {$i mmatimp.inc}
  676. {******************************************************************************
  677. Tmatrix3_extended
  678. ******************************************************************************}
  679. {$DEFINE datatype:=EXTENDED}
  680. {$DEFINE objectname:=Tmatrix3_extended}
  681. {$DEFINE vectorcompanion:=Tvector3_extended}
  682. {$DEFINE matsize:=3}
  683. {$INFO Compile mmatimp.inc for Tmatrix3_extended}
  684. {$i mmatimp.inc}
  685. {******************************************************************************
  686. Tmatrix4_single
  687. ******************************************************************************}
  688. {$DEFINE datatype:=SINGLE}
  689. {$DEFINE objectname:=Tmatrix4_single}
  690. {$DEFINE vectorcompanion:=Tvector4_single}
  691. {$DEFINE matsize:=4}
  692. {$INFO Compile mmatimp.inc for Tmatrix4_single}
  693. {$i mmatimp.inc}
  694. {******************************************************************************
  695. Tmatrix4_double
  696. ******************************************************************************}
  697. {$DEFINE datatype:=DOUBLE}
  698. {$DEFINE objectname:=Tmatrix4_double}
  699. {$DEFINE vectorcompanion:=Tvector4_double}
  700. {$DEFINE matsize:=4}
  701. {$INFO Compile mmatimp.inc for Tmatrix4_double}
  702. {$i mmatimp.inc}
  703. {******************************************************************************
  704. Tmatrix4_extended
  705. ******************************************************************************}
  706. {$DEFINE datatype:=EXTENDED}
  707. {$DEFINE objectname:=Tmatrix4_extended}
  708. {$DEFINE vectorcompanion:=Tvector4_extended}
  709. {$DEFINE matsize:=4}
  710. {$INFO Compile mmatimp.inc for Tmatrix4_extended}
  711. {$i mmatimp.inc}
  712. {$else}
  713. implementation
  714. {$endif FPUNONE}
  715. end.