matrix.pp 38 KB

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