/dlls/d3dx9_36/math.c

https://github.com/devyn/wine · C · 401 lines · 298 code · 37 blank · 66 comment · 22 complexity · c531d1078ebcfd43456cfc22b6451ac8 MD5 · raw file

  1. /*
  2. * Mathematical operations specific to D3DX9.
  3. *
  4. * Copyright (C) 2008 David Adam
  5. * Copyright (C) 2008 Philip Nilsson
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  20. */
  21. #define NONAMELESSUNION
  22. #include "config.h"
  23. #include "windef.h"
  24. #include "wingdi.h"
  25. #include "wine/debug.h"
  26. #include "d3dx9.h"
  27. WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
  28. /*************************************************************************
  29. * D3DXMatrixAffineTransformation2D
  30. */
  31. D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation2D(
  32. D3DXMATRIX *pout, FLOAT scaling,
  33. CONST D3DXVECTOR2 *protationcenter, FLOAT rotation,
  34. CONST D3DXVECTOR2 *ptranslation)
  35. {
  36. D3DXMATRIX m1, m2, m3, m4, m5;
  37. D3DXQUATERNION rot;
  38. D3DXVECTOR3 rot_center, trans;
  39. rot.w=cos(rotation/2.0f);
  40. rot.x=0.0f;
  41. rot.y=0.0f;
  42. rot.z=sin(rotation/2.0f);
  43. if ( protationcenter )
  44. {
  45. rot_center.x=protationcenter->x;
  46. rot_center.y=protationcenter->y;
  47. rot_center.z=0.0f;
  48. }
  49. else
  50. {
  51. rot_center.x=0.0f;
  52. rot_center.y=0.0f;
  53. rot_center.z=0.0f;
  54. }
  55. if ( ptranslation )
  56. {
  57. trans.x=ptranslation->x;
  58. trans.y=ptranslation->y;
  59. trans.z=0.0f;
  60. }
  61. else
  62. {
  63. trans.x=0.0f;
  64. trans.y=0.0f;
  65. trans.z=0.0f;
  66. }
  67. D3DXMatrixScaling(&m1, scaling, scaling, 1.0f);
  68. D3DXMatrixTranslation(&m2, -rot_center.x, -rot_center.y, -rot_center.z);
  69. D3DXMatrixTranslation(&m4, rot_center.x, rot_center.y, rot_center.z);
  70. D3DXMatrixRotationQuaternion(&m3, &rot);
  71. D3DXMatrixTranslation(&m5, trans.x, trans.y, trans.z);
  72. D3DXMatrixMultiply(&m1, &m1, &m2);
  73. D3DXMatrixMultiply(&m1, &m1, &m3);
  74. D3DXMatrixMultiply(&m1, &m1, &m4);
  75. D3DXMatrixMultiply(pout, &m1, &m5);
  76. return pout;
  77. }
  78. /*************************************************************************
  79. * D3DXMatrixDecompose
  80. */
  81. HRESULT WINAPI D3DXMatrixDecompose(D3DXVECTOR3 *poutscale, D3DXQUATERNION *poutrotation, D3DXVECTOR3 *pouttranslation, D3DXMATRIX *pm)
  82. {
  83. D3DXMATRIX normalized;
  84. D3DXVECTOR3 vec;
  85. /*Compute the scaling part.*/
  86. vec.x=pm->u.m[0][0];
  87. vec.y=pm->u.m[0][1];
  88. vec.z=pm->u.m[0][2];
  89. poutscale->x=D3DXVec3Length(&vec);
  90. vec.x=pm->u.m[1][0];
  91. vec.y=pm->u.m[1][1];
  92. vec.z=pm->u.m[1][2];
  93. poutscale->y=D3DXVec3Length(&vec);
  94. vec.x=pm->u.m[2][0];
  95. vec.y=pm->u.m[2][1];
  96. vec.z=pm->u.m[2][2];
  97. poutscale->z=D3DXVec3Length(&vec);
  98. /*Compute the translation part.*/
  99. pouttranslation->x=pm->u.m[3][0];
  100. pouttranslation->y=pm->u.m[3][1];
  101. pouttranslation->z=pm->u.m[3][2];
  102. /*Let's calculate the rotation now*/
  103. if ( (poutscale->x == 0.0f) || (poutscale->y == 0.0f) || (poutscale->z == 0.0f) )
  104. {
  105. return D3DERR_INVALIDCALL;
  106. }
  107. normalized.u.m[0][0]=pm->u.m[0][0]/poutscale->x;
  108. normalized.u.m[0][1]=pm->u.m[0][1]/poutscale->x;
  109. normalized.u.m[0][2]=pm->u.m[0][2]/poutscale->x;
  110. normalized.u.m[1][0]=pm->u.m[1][0]/poutscale->y;
  111. normalized.u.m[1][1]=pm->u.m[1][1]/poutscale->y;
  112. normalized.u.m[1][2]=pm->u.m[1][2]/poutscale->y;
  113. normalized.u.m[2][0]=pm->u.m[2][0]/poutscale->z;
  114. normalized.u.m[2][1]=pm->u.m[2][1]/poutscale->z;
  115. normalized.u.m[2][2]=pm->u.m[2][2]/poutscale->z;
  116. D3DXQuaternionRotationMatrix(poutrotation,&normalized);
  117. return S_OK;
  118. }
  119. /*************************************************************************
  120. * D3DXMatrixTransformation2D
  121. */
  122. D3DXMATRIX* WINAPI D3DXMatrixTransformation2D(
  123. D3DXMATRIX *pout, CONST D3DXVECTOR2 *pscalingcenter,
  124. FLOAT scalingrotation, CONST D3DXVECTOR2 *pscaling,
  125. CONST D3DXVECTOR2 *protationcenter, FLOAT rotation,
  126. CONST D3DXVECTOR2 *ptranslation)
  127. {
  128. D3DXQUATERNION rot, sca_rot;
  129. D3DXVECTOR3 rot_center, sca, sca_center, trans;
  130. if ( pscalingcenter )
  131. {
  132. sca_center.x=pscalingcenter->x;
  133. sca_center.y=pscalingcenter->y;
  134. sca_center.z=0.0f;
  135. }
  136. else
  137. {
  138. sca_center.x=0.0f;
  139. sca_center.y=0.0f;
  140. sca_center.z=0.0f;
  141. }
  142. if ( pscaling )
  143. {
  144. sca.x=pscaling->x;
  145. sca.y=pscaling->y;
  146. sca.z=0.0f;
  147. }
  148. else
  149. {
  150. sca.x=0.0f;
  151. sca.y=0.0f;
  152. sca.z=0.0f;
  153. }
  154. if ( protationcenter )
  155. {
  156. rot_center.x=protationcenter->x;
  157. rot_center.y=protationcenter->y;
  158. rot_center.z=0.0f;
  159. }
  160. else
  161. {
  162. rot_center.x=0.0f;
  163. rot_center.y=0.0f;
  164. rot_center.z=0.0f;
  165. }
  166. if ( ptranslation )
  167. {
  168. trans.x=ptranslation->x;
  169. trans.y=ptranslation->y;
  170. trans.z=0.0f;
  171. }
  172. else
  173. {
  174. trans.x=0.0f;
  175. trans.y=0.0f;
  176. trans.z=0.0f;
  177. }
  178. rot.w=cos(rotation/2.0f);
  179. rot.x=0.0f;
  180. rot.y=0.0f;
  181. rot.z=sin(rotation/2.0f);
  182. sca_rot.w=cos(scalingrotation/2.0f);
  183. sca_rot.x=0.0f;
  184. sca_rot.y=0.0f;
  185. sca_rot.z=sin(scalingrotation/2.0f);
  186. D3DXMatrixTransformation(pout, &sca_center, &sca_rot, &sca, &rot_center, &rot, &trans);
  187. return pout;
  188. }
  189. /*************************************************************************
  190. * D3DXPlaneTransformArray
  191. */
  192. D3DXPLANE* WINAPI D3DXPlaneTransformArray(
  193. D3DXPLANE* out, UINT outstride, CONST D3DXPLANE* in, UINT instride,
  194. CONST D3DXMATRIX* matrix, UINT elements)
  195. {
  196. UINT i;
  197. TRACE("\n");
  198. for (i = 0; i < elements; ++i) {
  199. D3DXPlaneTransform(
  200. (D3DXPLANE*)((char*)out + outstride * i),
  201. (CONST D3DXPLANE*)((const char*)in + instride * i),
  202. matrix);
  203. }
  204. return out;
  205. }
  206. /*************************************************************************
  207. * D3DXVec2TransformArray
  208. *
  209. * Transform an array of vectors by a matrix.
  210. */
  211. D3DXVECTOR4* WINAPI D3DXVec2TransformArray(
  212. D3DXVECTOR4* out, UINT outstride, CONST D3DXVECTOR2* in, UINT instride,
  213. CONST D3DXMATRIX* matrix, UINT elements)
  214. {
  215. UINT i;
  216. TRACE("\n");
  217. for (i = 0; i < elements; ++i) {
  218. D3DXVec2Transform(
  219. (D3DXVECTOR4*)((char*)out + outstride * i),
  220. (CONST D3DXVECTOR2*)((const char*)in + instride * i),
  221. matrix);
  222. }
  223. return out;
  224. }
  225. /*************************************************************************
  226. * D3DXVec2TransformCoordArray
  227. */
  228. D3DXVECTOR2* WINAPI D3DXVec2TransformCoordArray(
  229. D3DXVECTOR2* out, UINT outstride, CONST D3DXVECTOR2* in, UINT instride,
  230. CONST D3DXMATRIX* matrix, UINT elements)
  231. {
  232. UINT i;
  233. TRACE("\n");
  234. for (i = 0; i < elements; ++i) {
  235. D3DXVec2TransformCoord(
  236. (D3DXVECTOR2*)((char*)out + outstride * i),
  237. (CONST D3DXVECTOR2*)((const char*)in + instride * i),
  238. matrix);
  239. }
  240. return out;
  241. }
  242. /*************************************************************************
  243. * D3DXVec2TransformNormalArray
  244. */
  245. D3DXVECTOR2* WINAPI D3DXVec2TransformNormalArray(
  246. D3DXVECTOR2* out, UINT outstride, CONST D3DXVECTOR2 *in, UINT instride,
  247. CONST D3DXMATRIX *matrix, UINT elements)
  248. {
  249. UINT i;
  250. TRACE("\n");
  251. for (i = 0; i < elements; ++i) {
  252. D3DXVec2TransformNormal(
  253. (D3DXVECTOR2*)((char*)out + outstride * i),
  254. (CONST D3DXVECTOR2*)((const char*)in + instride * i),
  255. matrix);
  256. }
  257. return out;
  258. }
  259. /*************************************************************************
  260. * D3DXVec3ProjectArray
  261. *
  262. * Projects an array of vectors to the screen.
  263. */
  264. D3DXVECTOR3* WINAPI D3DXVec3ProjectArray(
  265. D3DXVECTOR3* out, UINT outstride, CONST D3DXVECTOR3* in, UINT instride,
  266. CONST D3DVIEWPORT9* viewport, CONST D3DXMATRIX* projection,
  267. CONST D3DXMATRIX* view, CONST D3DXMATRIX* world, UINT elements)
  268. {
  269. UINT i;
  270. TRACE("\n");
  271. for (i = 0; i < elements; ++i) {
  272. D3DXVec3Project(
  273. (D3DXVECTOR3*)((char*)out + outstride * i),
  274. (CONST D3DXVECTOR3*)((const char*)in + instride * i),
  275. viewport, projection, view, world);
  276. }
  277. return out;
  278. }
  279. /*************************************************************************
  280. * D3DXVec3TransformArray
  281. */
  282. D3DXVECTOR4* WINAPI D3DXVec3TransformArray(
  283. D3DXVECTOR4* out, UINT outstride, CONST D3DXVECTOR3* in, UINT instride,
  284. CONST D3DXMATRIX* matrix, UINT elements)
  285. {
  286. UINT i;
  287. TRACE("\n");
  288. for (i = 0; i < elements; ++i) {
  289. D3DXVec3Transform(
  290. (D3DXVECTOR4*)((char*)out + outstride * i),
  291. (CONST D3DXVECTOR3*)((const char*)in + instride * i),
  292. matrix);
  293. }
  294. return out;
  295. }
  296. /*************************************************************************
  297. * D3DXVec3TransformCoordArray
  298. */
  299. D3DXVECTOR3* WINAPI D3DXVec3TransformCoordArray(
  300. D3DXVECTOR3* out, UINT outstride, CONST D3DXVECTOR3* in, UINT instride,
  301. CONST D3DXMATRIX* matrix, UINT elements)
  302. {
  303. UINT i;
  304. TRACE("\n");
  305. for (i = 0; i < elements; ++i) {
  306. D3DXVec3TransformCoord(
  307. (D3DXVECTOR3*)((char*)out + outstride * i),
  308. (CONST D3DXVECTOR3*)((const char*)in + instride * i),
  309. matrix);
  310. }
  311. return out;
  312. }
  313. /*************************************************************************
  314. * D3DXVec3TransformNormalArray
  315. */
  316. D3DXVECTOR3* WINAPI D3DXVec3TransformNormalArray(
  317. D3DXVECTOR3* out, UINT outstride, CONST D3DXVECTOR3* in, UINT instride,
  318. CONST D3DXMATRIX* matrix, UINT elements)
  319. {
  320. UINT i;
  321. TRACE("\n");
  322. for (i = 0; i < elements; ++i) {
  323. D3DXVec3TransformNormal(
  324. (D3DXVECTOR3*)((char*)out + outstride * i),
  325. (CONST D3DXVECTOR3*)((const char*)in + instride * i),
  326. matrix);
  327. }
  328. return out;
  329. }
  330. /*************************************************************************
  331. * D3DXVec3UnprojectArray
  332. */
  333. D3DXVECTOR3* WINAPI D3DXVec3UnprojectArray(
  334. D3DXVECTOR3* out, UINT outstride, CONST D3DXVECTOR3* in, UINT instride,
  335. CONST D3DVIEWPORT9* viewport, CONST D3DXMATRIX* projection,
  336. CONST D3DXMATRIX* view, CONST D3DXMATRIX* world, UINT elements)
  337. {
  338. UINT i;
  339. TRACE("\n");
  340. for (i = 0; i < elements; ++i) {
  341. D3DXVec3Unproject(
  342. (D3DXVECTOR3*)((char*)out + outstride * i),
  343. (CONST D3DXVECTOR3*)((const char*)in + instride * i),
  344. viewport, projection, view, world);
  345. }
  346. return out;
  347. }
  348. /*************************************************************************
  349. * D3DXVec4TransformArray
  350. */
  351. D3DXVECTOR4* WINAPI D3DXVec4TransformArray(
  352. D3DXVECTOR4* out, UINT outstride, CONST D3DXVECTOR4* in, UINT instride,
  353. CONST D3DXMATRIX* matrix, UINT elements)
  354. {
  355. UINT i;
  356. TRACE("\n");
  357. for (i = 0; i < elements; ++i) {
  358. D3DXVec4Transform(
  359. (D3DXVECTOR4*)((char*)out + outstride * i),
  360. (CONST D3DXVECTOR4*)((const char*)in + instride * i),
  361. matrix);
  362. }
  363. return out;
  364. }