2
0

matrix.pp 38 KB

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