2 * Mathematical operations specific to D3DX9.
4 * Copyright (C) 2008 Philip Nilsson
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #define NONAMELESSUNION
26 #include "wine/debug.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(d3dx
);
31 /*************************************************************************
34 HRESULT WINAPI
D3DXMatrixDecompose(D3DXVECTOR3
*poutscale
, D3DXQUATERNION
*poutrotation
, D3DXVECTOR3
*pouttranslation
, D3DXMATRIX
*pm
)
36 D3DXMATRIX normalized
;
41 return D3DERR_INVALIDCALL
;
44 /*Compute the scaling part.*/
48 poutscale
->x
=D3DXVec3Length(&vec
);
53 poutscale
->y
=D3DXVec3Length(&vec
);
58 poutscale
->z
=D3DXVec3Length(&vec
);
60 /*Compute the translation part.*/
61 pouttranslation
->x
=pm
->u
.m
[3][0];
62 pouttranslation
->y
=pm
->u
.m
[3][1];
63 pouttranslation
->z
=pm
->u
.m
[3][2];
65 /*Let's calculate the rotation now*/
66 if ( (poutscale
->x
== 0.0f
) || (poutscale
->y
== 0.0f
) || (poutscale
->z
== 0.0f
) )
68 return D3DERR_INVALIDCALL
;
71 normalized
.u
.m
[0][0]=pm
->u
.m
[0][0]/poutscale
->x
;
72 normalized
.u
.m
[0][1]=pm
->u
.m
[0][1]/poutscale
->x
;
73 normalized
.u
.m
[0][2]=pm
->u
.m
[0][2]/poutscale
->x
;
74 normalized
.u
.m
[1][0]=pm
->u
.m
[1][0]/poutscale
->y
;
75 normalized
.u
.m
[1][1]=pm
->u
.m
[1][1]/poutscale
->y
;
76 normalized
.u
.m
[1][2]=pm
->u
.m
[1][2]/poutscale
->y
;
77 normalized
.u
.m
[2][0]=pm
->u
.m
[2][0]/poutscale
->z
;
78 normalized
.u
.m
[2][1]=pm
->u
.m
[2][1]/poutscale
->z
;
79 normalized
.u
.m
[2][2]=pm
->u
.m
[2][2]/poutscale
->z
;
81 D3DXQuaternionRotationMatrix(poutrotation
,&normalized
);
85 /*************************************************************************
86 * D3DXPlaneTransformArray
88 D3DXPLANE
* WINAPI
D3DXPlaneTransformArray(
89 D3DXPLANE
* out
, UINT outstride
, CONST D3DXPLANE
* in
, UINT instride
,
90 CONST D3DXMATRIX
* matrix
, UINT elements
)
94 for (i
= 0; i
< elements
; ++i
) {
96 (D3DXPLANE
*)((char*)out
+ outstride
* i
),
97 (CONST D3DXPLANE
*)((const char*)in
+ instride
* i
),
103 /*************************************************************************
104 * D3DXVec2TransformArray
106 * Transform an array of vectors by a matrix.
108 D3DXVECTOR4
* WINAPI
D3DXVec2TransformArray(
109 D3DXVECTOR4
* out
, UINT outstride
, CONST D3DXVECTOR2
* in
, UINT instride
,
110 CONST D3DXMATRIX
* matrix
, UINT elements
)
114 for (i
= 0; i
< elements
; ++i
) {
116 (D3DXVECTOR4
*)((char*)out
+ outstride
* i
),
117 (CONST D3DXVECTOR2
*)((const char*)in
+ instride
* i
),
123 /*************************************************************************
124 * D3DXVec2TransformCoordArray
126 D3DXVECTOR2
* WINAPI
D3DXVec2TransformCoordArray(
127 D3DXVECTOR2
* out
, UINT outstride
, CONST D3DXVECTOR2
* in
, UINT instride
,
128 CONST D3DXMATRIX
* matrix
, UINT elements
)
132 for (i
= 0; i
< elements
; ++i
) {
133 D3DXVec2TransformCoord(
134 (D3DXVECTOR2
*)((char*)out
+ outstride
* i
),
135 (CONST D3DXVECTOR2
*)((const char*)in
+ instride
* i
),
141 /*************************************************************************
142 * D3DXVec2TransformNormalArray
144 D3DXVECTOR2
* WINAPI
D3DXVec2TransformNormalArray(
145 D3DXVECTOR2
* out
, UINT outstride
, CONST D3DXVECTOR2
*in
, UINT instride
,
146 CONST D3DXMATRIX
*matrix
, UINT elements
)
150 for (i
= 0; i
< elements
; ++i
) {
151 D3DXVec2TransformNormal(
152 (D3DXVECTOR2
*)((char*)out
+ outstride
* i
),
153 (CONST D3DXVECTOR2
*)((const char*)in
+ instride
* i
),
159 /*************************************************************************
160 * D3DXVec3ProjectArray
162 * Projects an array of vectors to the screen.
164 D3DXVECTOR3
* WINAPI
D3DXVec3ProjectArray(
165 D3DXVECTOR3
* out
, UINT outstride
, CONST D3DXVECTOR3
* in
, UINT instride
,
166 CONST D3DVIEWPORT9
* viewport
, CONST D3DXMATRIX
* projection
,
167 CONST D3DXMATRIX
* view
, CONST D3DXMATRIX
* world
, UINT elements
)
171 for (i
= 0; i
< elements
; ++i
) {
173 (D3DXVECTOR3
*)((char*)out
+ outstride
* i
),
174 (CONST D3DXVECTOR3
*)((const char*)in
+ instride
* i
),
175 viewport
, projection
, view
, world
);
180 /*************************************************************************
181 * D3DXVec3TransformArray
183 D3DXVECTOR4
* WINAPI
D3DXVec3TransformArray(
184 D3DXVECTOR4
* out
, UINT outstride
, CONST D3DXVECTOR3
* in
, UINT instride
,
185 CONST D3DXMATRIX
* matrix
, UINT elements
)
189 for (i
= 0; i
< elements
; ++i
) {
191 (D3DXVECTOR4
*)((char*)out
+ outstride
* i
),
192 (CONST D3DXVECTOR3
*)((const char*)in
+ instride
* i
),
198 /*************************************************************************
199 * D3DXVec3TransformCoordArray
201 D3DXVECTOR3
* WINAPI
D3DXVec3TransformCoordArray(
202 D3DXVECTOR3
* out
, UINT outstride
, CONST D3DXVECTOR3
* in
, UINT instride
,
203 CONST D3DXMATRIX
* matrix
, UINT elements
)
207 for (i
= 0; i
< elements
; ++i
) {
208 D3DXVec3TransformCoord(
209 (D3DXVECTOR3
*)((char*)out
+ outstride
* i
),
210 (CONST D3DXVECTOR3
*)((const char*)in
+ instride
* i
),
216 /*************************************************************************
217 * D3DXVec3TransformNormalArray
219 D3DXVECTOR3
* WINAPI
D3DXVec3TransformNormalArray(
220 D3DXVECTOR3
* out
, UINT outstride
, CONST D3DXVECTOR3
* in
, UINT instride
,
221 CONST D3DXMATRIX
* matrix
, UINT elements
)
225 for (i
= 0; i
< elements
; ++i
) {
226 D3DXVec3TransformNormal(
227 (D3DXVECTOR3
*)((char*)out
+ outstride
* i
),
228 (CONST D3DXVECTOR3
*)((const char*)in
+ instride
* i
),
234 /*************************************************************************
235 * D3DXVec3UnprojectArray
237 D3DXVECTOR3
* WINAPI
D3DXVec3UnprojectArray(
238 D3DXVECTOR3
* out
, UINT outstride
, CONST D3DXVECTOR3
* in
, UINT instride
,
239 CONST D3DVIEWPORT9
* viewport
, CONST D3DXMATRIX
* projection
,
240 CONST D3DXMATRIX
* view
, CONST D3DXMATRIX
* world
, UINT elements
)
244 for (i
= 0; i
< elements
; ++i
) {
246 (D3DXVECTOR3
*)((char*)out
+ outstride
* i
),
247 (CONST D3DXVECTOR3
*)((const char*)in
+ instride
* i
),
248 viewport
, projection
, view
, world
);
253 /*************************************************************************
254 * D3DXVec4TransformArray
256 D3DXVECTOR4
* WINAPI
D3DXVec4TransformArray(
257 D3DXVECTOR4
* out
, UINT outstride
, CONST D3DXVECTOR4
* in
, UINT instride
,
258 CONST D3DXMATRIX
* matrix
, UINT elements
)
262 for (i
= 0; i
< elements
; ++i
) {
264 (D3DXVECTOR4
*)((char*)out
+ outstride
* i
),
265 (CONST D3DXVECTOR4
*)((const char*)in
+ instride
* i
),