matrix.pp 38 KB

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