Matrix.hx 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. package h3d;
  2. import hxd.Math;
  3. class Matrix {
  4. static var tmp = new Matrix();
  5. public var _11 : Float;
  6. public var _12 : Float;
  7. public var _13 : Float;
  8. public var _14 : Float;
  9. public var _21 : Float;
  10. public var _22 : Float;
  11. public var _23 : Float;
  12. public var _24 : Float;
  13. public var _31 : Float;
  14. public var _32 : Float;
  15. public var _33 : Float;
  16. public var _34 : Float;
  17. public var _41 : Float;
  18. public var _42 : Float;
  19. public var _43 : Float;
  20. public var _44 : Float;
  21. public function new() {
  22. }
  23. public function zero() {
  24. _11 = 0.0; _12 = 0.0; _13 = 0.0; _14 = 0.0;
  25. _21 = 0.0; _22 = 0.0; _23 = 0.0; _24 = 0.0;
  26. _31 = 0.0; _32 = 0.0; _33 = 0.0; _34 = 0.0;
  27. _41 = 0.0; _42 = 0.0; _43 = 0.0; _44 = 0.0;
  28. }
  29. public function identity() {
  30. _11 = 1.0; _12 = 0.0; _13 = 0.0; _14 = 0.0;
  31. _21 = 0.0; _22 = 1.0; _23 = 0.0; _24 = 0.0;
  32. _31 = 0.0; _32 = 0.0; _33 = 1.0; _34 = 0.0;
  33. _41 = 0.0; _42 = 0.0; _43 = 0.0; _44 = 1.0;
  34. }
  35. public function initRotateX( a : Float ) {
  36. var cos = Math.cos(a);
  37. var sin = Math.sin(a);
  38. _11 = 1.0; _12 = 0.0; _13 = 0.0; _14 = 0.0;
  39. _21 = 0.0; _22 = cos; _23 = sin; _24 = 0.0;
  40. _31 = 0.0; _32 = -sin; _33 = cos; _34 = 0.0;
  41. _41 = 0.0; _42 = 0.0; _43 = 0.0; _44 = 1.0;
  42. }
  43. public function initRotateY( a : Float ) {
  44. var cos = Math.cos(a);
  45. var sin = Math.sin(a);
  46. _11 = cos; _12 = 0.0; _13 = -sin; _14 = 0.0;
  47. _21 = 0.0; _22 = 1.0; _23 = 0.0; _24 = 0.0;
  48. _31 = sin; _32 = 0.0; _33 = cos; _34 = 0.0;
  49. _41 = 0.0; _42 = 0.0; _43 = 0.0; _44 = 1.0;
  50. }
  51. public function initRotateZ( a : Float ) {
  52. var cos = Math.cos(a);
  53. var sin = Math.sin(a);
  54. _11 = cos; _12 = sin; _13 = 0.0; _14 = 0.0;
  55. _21 = -sin; _22 = cos; _23 = 0.0; _24 = 0.0;
  56. _31 = 0.0; _32 = 0.0; _33 = 1.0; _34 = 0.0;
  57. _41 = 0.0; _42 = 0.0; _43 = 0.0; _44 = 1.0;
  58. }
  59. public function initTranslate( x = 0., y = 0., z = 0. ) {
  60. _11 = 1.0; _12 = 0.0; _13 = 0.0; _14 = 0.0;
  61. _21 = 0.0; _22 = 1.0; _23 = 0.0; _24 = 0.0;
  62. _31 = 0.0; _32 = 0.0; _33 = 1.0; _34 = 0.0;
  63. _41 = x; _42 = y; _43 = z; _44 = 1.0;
  64. }
  65. public function initScale( x = 1., y = 1., z = 1. ) {
  66. _11 = x; _12 = 0.0; _13 = 0.0; _14 = 0.0;
  67. _21 = 0.0; _22 = y; _23 = 0.0; _24 = 0.0;
  68. _31 = 0.0; _32 = 0.0; _33 = z; _34 = 0.0;
  69. _41 = 0.0; _42 = 0.0; _43 = 0.0; _44 = 1.0;
  70. }
  71. public function initRotateAxis( axis : Vector, angle : Float ) {
  72. var cos = Math.cos(angle), sin = Math.sin(angle);
  73. var cos1 = 1 - cos;
  74. var x = -axis.x, y = -axis.y, z = -axis.z;
  75. var xx = x * x, yy = y * y, zz = z * z;
  76. var len = Math.invSqrt(xx + yy + zz);
  77. x *= len;
  78. y *= len;
  79. z *= len;
  80. var xcos1 = x * cos1, zcos1 = z * cos1;
  81. _11 = cos + x * xcos1;
  82. _12 = y * xcos1 - z * sin;
  83. _13 = x * zcos1 + y * sin;
  84. _14 = 0.;
  85. _21 = y * xcos1 + z * sin;
  86. _22 = cos + y * y * cos1;
  87. _23 = y * zcos1 - x * sin;
  88. _24 = 0.;
  89. _31 = x * zcos1 - y * sin;
  90. _32 = y * zcos1 + x * sin;
  91. _33 = cos + z * zcos1;
  92. _34 = 0.;
  93. _41 = 0.; _42 = 0.; _43 = 0.; _44 = 1.;
  94. }
  95. public function initRotate( x : Float, y : Float, z : Float ) {
  96. var cx = Math.cos(x);
  97. var sx = Math.sin(x);
  98. var cy = Math.cos(y);
  99. var sy = Math.sin(y);
  100. var cz = Math.cos(z);
  101. var sz = Math.sin(z);
  102. var cxsy = cx * sy;
  103. var sxsy = sx * sy;
  104. _11 = cy * cz;
  105. _12 = cy * sz;
  106. _13 = -sy;
  107. _14 = 0;
  108. _21 = sxsy * cz - cx * sz;
  109. _22 = sxsy * sz + cx * cz;
  110. _23 = sx * cy;
  111. _24 = 0;
  112. _31 = cxsy * cz + sx * sz;
  113. _32 = cxsy * sz - sx * cz;
  114. _33 = cx * cy;
  115. _34 = 0;
  116. _41 = 0;
  117. _42 = 0;
  118. _43 = 0;
  119. _44 = 1;
  120. }
  121. public function translate( x = 0., y = 0., z = 0. ) {
  122. _11 += x * _14;
  123. _12 += y * _14;
  124. _13 += z * _14;
  125. _21 += x * _24;
  126. _22 += y * _24;
  127. _23 += z * _24;
  128. _31 += x * _34;
  129. _32 += y * _34;
  130. _33 += z * _34;
  131. _41 += x * _44;
  132. _42 += y * _44;
  133. _43 += z * _44;
  134. }
  135. public function scale( x = 1., y = 1., z = 1. ) {
  136. _11 *= x;
  137. _21 *= x;
  138. _31 *= x;
  139. _41 *= x;
  140. _12 *= y;
  141. _22 *= y;
  142. _32 *= y;
  143. _42 *= y;
  144. _13 *= z;
  145. _23 *= z;
  146. _33 *= z;
  147. _43 *= z;
  148. }
  149. public function rotate( x, y, z ) {
  150. var tmp = tmp;
  151. tmp.initRotate(x,y,z);
  152. multiply(this, tmp);
  153. }
  154. public function rotateAxis( axis, angle ) {
  155. var tmp = tmp;
  156. tmp.initRotateAxis(axis, angle);
  157. multiply(this, tmp);
  158. }
  159. public inline function pos( ?v : Vector ) {
  160. if( v == null )
  161. return new Vector( _41, _42 , _43 , _44 );
  162. v.x = _41;
  163. v.y = _42;
  164. v.z = _43;
  165. v.w = _44;
  166. return v;
  167. }
  168. public function prependTranslate( x = 0., y = 0., z = 0. ) {
  169. var vx = _11 * x + _21 * y + _31 * z + _41;
  170. var vy = _12 * x + _22 * y + _32 * z + _42;
  171. var vz = _13 * x + _23 * y + _33 * z + _43;
  172. var vw = _14 * x + _24 * y + _34 * z + _44;
  173. _41 = vx;
  174. _42 = vy;
  175. _43 = vz;
  176. _44 = vw;
  177. }
  178. public function prependRotate( x, y, z ) {
  179. var tmp = tmp;
  180. tmp.initRotate(x,y,z);
  181. multiply(tmp, this);
  182. }
  183. public function prependRotateAxis( axis, angle ) {
  184. var tmp = tmp;
  185. tmp.initRotateAxis(axis, angle);
  186. multiply(tmp, this);
  187. }
  188. public function prependScale( sx = 1., sy = 1., sz = 1. ) {
  189. var tmp = tmp;
  190. tmp.initScale(sx,sy,sz);
  191. multiply(tmp, this);
  192. }
  193. public function multiply3x4( a : Matrix, b : Matrix ) {
  194. var m11 = a._11; var m12 = a._12; var m13 = a._13;
  195. var m21 = a._21; var m22 = a._22; var m23 = a._23;
  196. var a31 = a._31; var a32 = a._32; var a33 = a._33;
  197. var a41 = a._41; var a42 = a._42; var a43 = a._43;
  198. var b11 = b._11; var b12 = b._12; var b13 = b._13;
  199. var b21 = b._21; var b22 = b._22; var b23 = b._23;
  200. var b31 = b._31; var b32 = b._32; var b33 = b._33;
  201. var b41 = b._41; var b42 = b._42; var b43 = b._43;
  202. _11 = m11 * b11 + m12 * b21 + m13 * b31;
  203. _12 = m11 * b12 + m12 * b22 + m13 * b32;
  204. _13 = m11 * b13 + m12 * b23 + m13 * b33;
  205. _14 = 0;
  206. _21 = m21 * b11 + m22 * b21 + m23 * b31;
  207. _22 = m21 * b12 + m22 * b22 + m23 * b32;
  208. _23 = m21 * b13 + m22 * b23 + m23 * b33;
  209. _24 = 0;
  210. _31 = a31 * b11 + a32 * b21 + a33 * b31;
  211. _32 = a31 * b12 + a32 * b22 + a33 * b32;
  212. _33 = a31 * b13 + a32 * b23 + a33 * b33;
  213. _34 = 0;
  214. _41 = a41 * b11 + a42 * b21 + a43 * b31 + b41;
  215. _42 = a41 * b12 + a42 * b22 + a43 * b32 + b42;
  216. _43 = a41 * b13 + a42 * b23 + a43 * b33 + b43;
  217. _44 = 1;
  218. }
  219. public function multiply( a : Matrix, b : Matrix ) {
  220. var a11 = a._11; var a12 = a._12; var a13 = a._13; var a14 = a._14;
  221. var a21 = a._21; var a22 = a._22; var a23 = a._23; var a24 = a._24;
  222. var a31 = a._31; var a32 = a._32; var a33 = a._33; var a34 = a._34;
  223. var a41 = a._41; var a42 = a._42; var a43 = a._43; var a44 = a._44;
  224. var b11 = b._11; var b12 = b._12; var b13 = b._13; var b14 = b._14;
  225. var b21 = b._21; var b22 = b._22; var b23 = b._23; var b24 = b._24;
  226. var b31 = b._31; var b32 = b._32; var b33 = b._33; var b34 = b._34;
  227. var b41 = b._41; var b42 = b._42; var b43 = b._43; var b44 = b._44;
  228. _11 = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
  229. _12 = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
  230. _13 = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
  231. _14 = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
  232. _21 = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
  233. _22 = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
  234. _23 = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
  235. _24 = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
  236. _31 = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
  237. _32 = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
  238. _33 = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
  239. _34 = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
  240. _41 = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
  241. _42 = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
  242. _43 = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
  243. _44 = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
  244. }
  245. public inline function invert() {
  246. inverse(this);
  247. }
  248. public function inverse3x4( m : Matrix ) {
  249. var m11 = m._11, m12 = m._12, m13 = m._13;
  250. var m21 = m._21, m22 = m._22, m23 = m._23;
  251. var m31 = m._31, m32 = m._32, m33 = m._33;
  252. var m41 = m._41, m42 = m._42, m43 = m._43;
  253. _11 = m22*m33 - m23*m32;
  254. _12 = m13*m32 - m12*m33;
  255. _13 = m12*m23 - m13*m22;
  256. _14 = 0;
  257. _21 = m23*m31 - m21*m33;
  258. _22 = m11*m33 - m13*m31;
  259. _23 = m13*m21 - m11*m23;
  260. _24 = 0;
  261. _31 = m21*m32 - m22*m31;
  262. _32 = m12*m31 - m11*m32;
  263. _33 = m11*m22 - m12*m21;
  264. _34 = 0;
  265. _41 = -m21 * m32 * m43 + m21 * m33 * m42 + m31 * m22 * m43 - m31 * m23 * m42 - m41 * m22 * m33 + m41 * m23 * m32;
  266. _42 = m11 * m32 * m43 - m11 * m33 * m42 - m31 * m12 * m43 + m31 * m13 * m42 + m41 * m12 * m33 - m41 * m13 * m32;
  267. _43 = -m11 * m22 * m43 + m11 * m23 * m42 + m21 * m12 * m43 - m21 * m13 * m42 - m41 * m12 * m23 + m41 * m13 * m22;
  268. _44 = m11 * m22 * m33 - m11 * m23 * m32 - m21 * m12 * m33 + m21 * m13 * m32 + m31 * m12 * m23 - m31 * m13 * m22;
  269. _44 = 1;
  270. var det = m11 * _11 + m12 * _21 + m13 * _31;
  271. if( Math.abs(det) < Math.EPSILON ) {
  272. zero();
  273. return;
  274. }
  275. var invDet = 1.0 / det;
  276. _11 *= invDet; _12 *= invDet; _13 *= invDet;
  277. _21 *= invDet; _22 *= invDet; _23 *= invDet;
  278. _31 *= invDet; _32 *= invDet; _33 *= invDet;
  279. _41 *= invDet; _42 *= invDet; _43 *= invDet;
  280. }
  281. public function inverse( m : Matrix ) {
  282. var m11 = m._11; var m12 = m._12; var m13 = m._13; var m14 = m._14;
  283. var m21 = m._21; var m22 = m._22; var m23 = m._23; var m24 = m._24;
  284. var m31 = m._31; var m32 = m._32; var m33 = m._33; var m34 = m._34;
  285. var m41 = m._41; var m42 = m._42; var m43 = m._43; var m44 = m._44;
  286. _11 = m22 * m33 * m44 - m22 * m34 * m43 - m32 * m23 * m44 + m32 * m24 * m43 + m42 * m23 * m34 - m42 * m24 * m33;
  287. _12 = -m12 * m33 * m44 + m12 * m34 * m43 + m32 * m13 * m44 - m32 * m14 * m43 - m42 * m13 * m34 + m42 * m14 * m33;
  288. _13 = m12 * m23 * m44 - m12 * m24 * m43 - m22 * m13 * m44 + m22 * m14 * m43 + m42 * m13 * m24 - m42 * m14 * m23;
  289. _14 = -m12 * m23 * m34 + m12 * m24 * m33 + m22 * m13 * m34 - m22 * m14 * m33 - m32 * m13 * m24 + m32 * m14 * m23;
  290. _21 = -m21 * m33 * m44 + m21 * m34 * m43 + m31 * m23 * m44 - m31 * m24 * m43 - m41 * m23 * m34 + m41 * m24 * m33;
  291. _22 = m11 * m33 * m44 - m11 * m34 * m43 - m31 * m13 * m44 + m31 * m14 * m43 + m41 * m13 * m34 - m41 * m14 * m33;
  292. _23 = -m11 * m23 * m44 + m11 * m24 * m43 + m21 * m13 * m44 - m21 * m14 * m43 - m41 * m13 * m24 + m41 * m14 * m23;
  293. _24 = m11 * m23 * m34 - m11 * m24 * m33 - m21 * m13 * m34 + m21 * m14 * m33 + m31 * m13 * m24 - m31 * m14 * m23;
  294. _31 = m21 * m32 * m44 - m21 * m34 * m42 - m31 * m22 * m44 + m31 * m24 * m42 + m41 * m22 * m34 - m41 * m24 * m32;
  295. _32 = -m11 * m32 * m44 + m11 * m34 * m42 + m31 * m12 * m44 - m31 * m14 * m42 - m41 * m12 * m34 + m41 * m14 * m32;
  296. _33 = m11 * m22 * m44 - m11 * m24 * m42 - m21 * m12 * m44 + m21 * m14 * m42 + m41 * m12 * m24 - m41 * m14 * m22;
  297. _34 = -m11 * m22 * m34 + m11 * m24 * m32 + m21 * m12 * m34 - m21 * m14 * m32 - m31 * m12 * m24 + m31 * m14 * m22;
  298. _41 = -m21 * m32 * m43 + m21 * m33 * m42 + m31 * m22 * m43 - m31 * m23 * m42 - m41 * m22 * m33 + m41 * m23 * m32;
  299. _42 = m11 * m32 * m43 - m11 * m33 * m42 - m31 * m12 * m43 + m31 * m13 * m42 + m41 * m12 * m33 - m41 * m13 * m32;
  300. _43 = -m11 * m22 * m43 + m11 * m23 * m42 + m21 * m12 * m43 - m21 * m13 * m42 - m41 * m12 * m23 + m41 * m13 * m22;
  301. _44 = m11 * m22 * m33 - m11 * m23 * m32 - m21 * m12 * m33 + m21 * m13 * m32 + m31 * m12 * m23 - m31 * m13 * m22;
  302. var det = m11 * _11 + m12 * _21 + m13 * _31 + m14 * _41;
  303. if( Math.abs(det) < Math.EPSILON ) {
  304. zero();
  305. return;
  306. }
  307. det = 1.0 / det;
  308. _11 *= det;
  309. _12 *= det;
  310. _13 *= det;
  311. _14 *= det;
  312. _21 *= det;
  313. _22 *= det;
  314. _23 *= det;
  315. _24 *= det;
  316. _31 *= det;
  317. _32 *= det;
  318. _33 *= det;
  319. _34 *= det;
  320. _41 *= det;
  321. _42 *= det;
  322. _43 *= det;
  323. _44 *= det;
  324. }
  325. public function transpose() {
  326. var tmp;
  327. tmp = _12; _12 = _21; _21 = tmp;
  328. tmp = _13; _13 = _31; _31 = tmp;
  329. tmp = _14; _14 = _41; _41 = tmp;
  330. tmp = _23; _23 = _32; _32 = tmp;
  331. tmp = _24; _24 = _42; _42 = tmp;
  332. tmp = _34; _34 = _43; _43 = tmp;
  333. }
  334. public function clone() {
  335. var m = new Matrix();
  336. m._11 = _11; m._12 = _12; m._13 = _13; m._14 = _14;
  337. m._21 = _21; m._22 = _22; m._23 = _23; m._24 = _24;
  338. m._31 = _31; m._32 = _32; m._33 = _33; m._34 = _34;
  339. m._41 = _41; m._42 = _42; m._43 = _43; m._44 = _44;
  340. return m;
  341. }
  342. public function loadFrom( m : Matrix ) {
  343. _11 = m._11; _12 = m._12; _13 = m._13; _14 = m._14;
  344. _21 = m._21; _22 = m._22; _23 = m._23; _24 = m._24;
  345. _31 = m._31; _32 = m._32; _33 = m._33; _34 = m._34;
  346. _41 = m._41; _42 = m._42; _43 = m._43; _44 = m._44;
  347. }
  348. public function load( a : Array<Float> ) {
  349. _11 = a[0]; _12 = a[1]; _13 = a[2]; _14 = a[3];
  350. _21 = a[4]; _22 = a[5]; _23 = a[6]; _24 = a[7];
  351. _31 = a[8]; _32 = a[9]; _33 = a[10]; _34 = a[11];
  352. _41 = a[12]; _42 = a[13]; _43 = a[14]; _44 = a[15];
  353. }
  354. public function getFloats() {
  355. return [_11, _12, _13, _14, _21, _22, _23, _24, _31, _32, _33, _34, _41, _42, _43, _44];
  356. }
  357. public function toString() {
  358. return "MAT=[\n" +
  359. " [ " + Math.fmt(_11) + ", " + Math.fmt(_12) + ", " + Math.fmt(_13) + ", " + Math.fmt(_14) + " ]\n" +
  360. " [ " + Math.fmt(_21) + ", " + Math.fmt(_22) + ", " + Math.fmt(_23) + ", " + Math.fmt(_24) + " ]\n" +
  361. " [ " + Math.fmt(_31) + ", " + Math.fmt(_32) + ", " + Math.fmt(_33) + ", " + Math.fmt(_34) + " ]\n" +
  362. " [ " + Math.fmt(_41) + ", " + Math.fmt(_42) + ", " + Math.fmt(_43) + ", " + Math.fmt(_44) + " ]\n" +
  363. "]";
  364. }
  365. // ---- COLOR MATRIX FUNCTIONS -------
  366. static inline var lumR = 0.212671;
  367. static inline var lumG = 0.71516;
  368. static inline var lumB = 0.072169;
  369. public function colorHue( hue : Float ) {
  370. if( hue == 0. )
  371. return;
  372. var cv = Math.cos(hue);
  373. var sv = Math.sin(hue);
  374. tmp._11 = lumR + cv * (1 - lumR) - sv * lumR;
  375. tmp._12 = lumR - cv * lumR + sv * 0.143;
  376. tmp._13 = lumR - cv * lumR - sv * (1 - lumR);
  377. tmp._21 = lumG - cv * lumG - sv * lumG;
  378. tmp._22 = lumG + cv * (1 - lumG) + sv * 0.140;
  379. tmp._23 = lumG - cv * lumG + sv * lumG;
  380. tmp._31 = lumB - cv * lumB - sv * lumB;
  381. tmp._32 = lumB - cv * lumB - sv * 0.283;
  382. tmp._33 = lumB + cv * (1 - lumB) + sv * lumB;
  383. tmp._34 = 0;
  384. tmp._41 = 0;
  385. tmp._42 = 0;
  386. tmp._43 = 0;
  387. multiply3x4(this, tmp);
  388. }
  389. public function colorSaturation( sat : Float ) {
  390. var is = 1 - sat;
  391. var r = is * lumR;
  392. var g = is * lumG;
  393. var b = is * lumB;
  394. tmp._11 = r + sat;
  395. tmp._12 = r;
  396. tmp._13 = r;
  397. tmp._21 = g;
  398. tmp._22 = g + sat;
  399. tmp._23 = g;
  400. tmp._31 = b;
  401. tmp._32 = b;
  402. tmp._33 = b + sat;
  403. tmp._41 = 0;
  404. tmp._42 = 0;
  405. tmp._43 = 0;
  406. multiply3x4(this, tmp);
  407. }
  408. public function colorContrast( contrast : Float ) {
  409. var v = contrast + 1;
  410. tmp._11 = v;
  411. tmp._12 = 0;
  412. tmp._13 = 0;
  413. tmp._21 = 0;
  414. tmp._22 = v;
  415. tmp._23 = 0;
  416. tmp._31 = 0;
  417. tmp._32 = 0;
  418. tmp._33 = v;
  419. tmp._41 = -contrast*0.5;
  420. tmp._42 = -contrast*0.5;
  421. tmp._43 = -contrast*0.5;
  422. multiply3x4(this, tmp);
  423. }
  424. public function colorBrightness( brightness : Float ) {
  425. _41 += brightness;
  426. _42 += brightness;
  427. _43 += brightness;
  428. }
  429. // STATICS
  430. public static function I() {
  431. var m = new Matrix();
  432. m.identity();
  433. return m;
  434. }
  435. public static function L( a : Array<Float> ) {
  436. var m = new Matrix();
  437. m.load(a);
  438. return m;
  439. }
  440. public static function T( x = 0., y = 0., z = 0. ) {
  441. var m = new Matrix();
  442. m.initTranslate(x, y, z);
  443. return m;
  444. }
  445. public static function R(x,y,z) {
  446. var m = new Matrix();
  447. m.initRotate(x,y,z);
  448. return m;
  449. }
  450. public static function S( x = 1., y = 1., z = 1.0 ) {
  451. var m = new Matrix();
  452. m.initScale(x, y, z);
  453. return m;
  454. }
  455. /**
  456. Build a rotation Matrix so the X axis will look at the given direction, and the Z axis will be the Up vector ([0,0,1] by default)
  457. **/
  458. public static function lookAtX( dir : Vector, ?up : Vector, ?m : Matrix ) {
  459. if( up == null ) up = new Vector(0, 0, 1);
  460. if( m == null ) m = new Matrix();
  461. var ax = dir.getNormalized();
  462. var ay = up.cross(ax).getNormalized();
  463. if( ay.lengthSq() < Math.EPSILON ) {
  464. ay.x = ax.y;
  465. ay.y = ax.z;
  466. ay.z = ax.x;
  467. }
  468. var az = ax.cross(ay);
  469. m._11 = ax.x;
  470. m._12 = ax.y;
  471. m._13 = ax.z;
  472. m._14 = 0;
  473. m._21 = ay.x;
  474. m._22 = ay.y;
  475. m._23 = ay.z;
  476. m._24 = 0;
  477. m._31 = az.x;
  478. m._32 = az.y;
  479. m._33 = az.z;
  480. m._34 = 0;
  481. m._41 = 0;
  482. m._42 = 0;
  483. m._43 = 0;
  484. m._44 = 1;
  485. return m;
  486. }
  487. }