2 * Mathematical operations specific to D3DX9.
4 * Copyright (C) 2008 David Adam
5 * Copyright (C) 2008 Luis Busquets
6 * Copyright (C) 2008 Jérôme Gardou
7 * Copyright (C) 2008 Philip Nilsson
8 * Copyright (C) 2008 Henri Verbeet
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "d3dx9_private.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(d3dx
);
32 struct ID3DXMatrixStackImpl
34 ID3DXMatrixStack ID3DXMatrixStack_iface
;
38 unsigned int stack_size
;
42 static const unsigned int INITIAL_STACK_SIZE
= 32;
44 /*_________________D3DXColor____________________*/
46 D3DXCOLOR
* WINAPI
D3DXColorAdjustContrast(D3DXCOLOR
*pout
, const D3DXCOLOR
*pc
, FLOAT s
)
48 TRACE("pout %p, pc %p, s %f\n", pout
, pc
, s
);
50 pout
->r
= 0.5f
+ s
* (pc
->r
- 0.5f
);
51 pout
->g
= 0.5f
+ s
* (pc
->g
- 0.5f
);
52 pout
->b
= 0.5f
+ s
* (pc
->b
- 0.5f
);
57 D3DXCOLOR
* WINAPI
D3DXColorAdjustSaturation(D3DXCOLOR
*pout
, const D3DXCOLOR
*pc
, FLOAT s
)
61 TRACE("pout %p, pc %p, s %f\n", pout
, pc
, s
);
63 grey
= pc
->r
* 0.2125f
+ pc
->g
* 0.7154f
+ pc
->b
* 0.0721f
;
64 pout
->r
= grey
+ s
* (pc
->r
- grey
);
65 pout
->g
= grey
+ s
* (pc
->g
- grey
);
66 pout
->b
= grey
+ s
* (pc
->b
- grey
);
71 /*_________________Misc__________________________*/
73 FLOAT WINAPI
D3DXFresnelTerm(FLOAT costheta
, FLOAT refractionindex
)
75 FLOAT a
, d
, g
, result
;
77 TRACE("costheta %f, refractionindex %f\n", costheta
, refractionindex
);
79 g
= sqrtf(refractionindex
* refractionindex
+ costheta
* costheta
- 1.0f
);
82 result
= (costheta
* a
- 1.0f
) * (costheta
* a
- 1.0f
) / ((costheta
* d
+ 1.0f
) * (costheta
* d
+ 1.0f
)) + 1.0f
;
83 result
*= 0.5f
* d
* d
/ (a
* a
);
88 /*_________________D3DXMatrix____________________*/
90 D3DXMATRIX
* WINAPI
D3DXMatrixAffineTransformation(D3DXMATRIX
*out
, FLOAT scaling
, const D3DXVECTOR3
*rotationcenter
,
91 const D3DXQUATERNION
*rotation
, const D3DXVECTOR3
*translation
)
93 TRACE("out %p, scaling %f, rotationcenter %p, rotation %p, translation %p\n",
94 out
, scaling
, rotationcenter
, rotation
, translation
);
96 D3DXMatrixIdentity(out
);
100 FLOAT temp00
, temp01
, temp02
, temp10
, temp11
, temp12
, temp20
, temp21
, temp22
;
102 temp00
= 1.0f
- 2.0f
* (rotation
->y
* rotation
->y
+ rotation
->z
* rotation
->z
);
103 temp01
= 2.0f
* (rotation
->x
* rotation
->y
+ rotation
->z
* rotation
->w
);
104 temp02
= 2.0f
* (rotation
->x
* rotation
->z
- rotation
->y
* rotation
->w
);
105 temp10
= 2.0f
* (rotation
->x
* rotation
->y
- rotation
->z
* rotation
->w
);
106 temp11
= 1.0f
- 2.0f
* (rotation
->x
* rotation
->x
+ rotation
->z
* rotation
->z
);
107 temp12
= 2.0f
* (rotation
->y
* rotation
->z
+ rotation
->x
* rotation
->w
);
108 temp20
= 2.0f
* (rotation
->x
* rotation
->z
+ rotation
->y
* rotation
->w
);
109 temp21
= 2.0f
* (rotation
->y
* rotation
->z
- rotation
->x
* rotation
->w
);
110 temp22
= 1.0f
- 2.0f
* (rotation
->x
* rotation
->x
+ rotation
->y
* rotation
->y
);
112 out
->m
[0][0] = scaling
* temp00
;
113 out
->m
[0][1] = scaling
* temp01
;
114 out
->m
[0][2] = scaling
* temp02
;
115 out
->m
[1][0] = scaling
* temp10
;
116 out
->m
[1][1] = scaling
* temp11
;
117 out
->m
[1][2] = scaling
* temp12
;
118 out
->m
[2][0] = scaling
* temp20
;
119 out
->m
[2][1] = scaling
* temp21
;
120 out
->m
[2][2] = scaling
* temp22
;
124 out
->m
[3][0] = rotationcenter
->x
* (1.0f
- temp00
) - rotationcenter
->y
* temp10
125 - rotationcenter
->z
* temp20
;
126 out
->m
[3][1] = rotationcenter
->y
* (1.0f
- temp11
) - rotationcenter
->x
* temp01
127 - rotationcenter
->z
* temp21
;
128 out
->m
[3][2] = rotationcenter
->z
* (1.0f
- temp22
) - rotationcenter
->x
* temp02
129 - rotationcenter
->y
* temp12
;
134 out
->m
[0][0] = scaling
;
135 out
->m
[1][1] = scaling
;
136 out
->m
[2][2] = scaling
;
141 out
->m
[3][0] += translation
->x
;
142 out
->m
[3][1] += translation
->y
;
143 out
->m
[3][2] += translation
->z
;
149 D3DXMATRIX
* WINAPI
D3DXMatrixAffineTransformation2D(D3DXMATRIX
*out
, FLOAT scaling
,
150 const D3DXVECTOR2
*rotationcenter
, FLOAT rotation
, const D3DXVECTOR2
*translation
)
154 TRACE("out %p, scaling %f, rotationcenter %p, rotation %f, translation %p\n",
155 out
, scaling
, rotationcenter
, rotation
, translation
);
157 s
= sinf(rotation
/ 2.0f
);
158 tmp1
= 1.0f
- 2.0f
* s
* s
;
159 tmp2
= 2.0f
* s
* cosf(rotation
/ 2.0f
);
161 D3DXMatrixIdentity(out
);
162 out
->m
[0][0] = scaling
* tmp1
;
163 out
->m
[0][1] = scaling
* tmp2
;
164 out
->m
[1][0] = -scaling
* tmp2
;
165 out
->m
[1][1] = scaling
* tmp1
;
171 x
= rotationcenter
->x
;
172 y
= rotationcenter
->y
;
174 out
->m
[3][0] = y
* tmp2
- x
* tmp1
+ x
;
175 out
->m
[3][1] = -x
* tmp2
- y
* tmp1
+ y
;
180 out
->m
[3][0] += translation
->x
;
181 out
->m
[3][1] += translation
->y
;
187 HRESULT WINAPI
D3DXMatrixDecompose(D3DXVECTOR3
*poutscale
, D3DXQUATERNION
*poutrotation
, D3DXVECTOR3
*pouttranslation
, const D3DXMATRIX
*pm
)
189 D3DXMATRIX normalized
;
192 TRACE("poutscale %p, poutrotation %p, pouttranslation %p, pm %p\n", poutscale
, poutrotation
, pouttranslation
, pm
);
194 /*Compute the scaling part.*/
198 poutscale
->x
= D3DXVec3Length(&vec
);
203 poutscale
->y
= D3DXVec3Length(&vec
);
208 poutscale
->z
= D3DXVec3Length(&vec
);
210 /*Compute the translation part.*/
211 pouttranslation
->x
= pm
->m
[3][0];
212 pouttranslation
->y
= pm
->m
[3][1];
213 pouttranslation
->z
= pm
->m
[3][2];
215 /*Let's calculate the rotation now*/
216 if ( (poutscale
->x
== 0.0f
) || (poutscale
->y
== 0.0f
) || (poutscale
->z
== 0.0f
) ) return D3DERR_INVALIDCALL
;
218 normalized
.m
[0][0] = pm
->m
[0][0]/poutscale
->x
;
219 normalized
.m
[0][1] = pm
->m
[0][1]/poutscale
->x
;
220 normalized
.m
[0][2] = pm
->m
[0][2]/poutscale
->x
;
221 normalized
.m
[1][0] = pm
->m
[1][0]/poutscale
->y
;
222 normalized
.m
[1][1] = pm
->m
[1][1]/poutscale
->y
;
223 normalized
.m
[1][2] = pm
->m
[1][2]/poutscale
->y
;
224 normalized
.m
[2][0] = pm
->m
[2][0]/poutscale
->z
;
225 normalized
.m
[2][1] = pm
->m
[2][1]/poutscale
->z
;
226 normalized
.m
[2][2] = pm
->m
[2][2]/poutscale
->z
;
228 D3DXQuaternionRotationMatrix(poutrotation
,&normalized
);
232 FLOAT WINAPI
D3DXMatrixDeterminant(const D3DXMATRIX
*pm
)
236 TRACE("pm %p\n", pm
);
238 t
[0] = pm
->m
[2][2] * pm
->m
[3][3] - pm
->m
[2][3] * pm
->m
[3][2];
239 t
[1] = pm
->m
[1][2] * pm
->m
[3][3] - pm
->m
[1][3] * pm
->m
[3][2];
240 t
[2] = pm
->m
[1][2] * pm
->m
[2][3] - pm
->m
[1][3] * pm
->m
[2][2];
241 v
[0] = pm
->m
[1][1] * t
[0] - pm
->m
[2][1] * t
[1] + pm
->m
[3][1] * t
[2];
242 v
[1] = -pm
->m
[1][0] * t
[0] + pm
->m
[2][0] * t
[1] - pm
->m
[3][0] * t
[2];
244 t
[0] = pm
->m
[1][0] * pm
->m
[2][1] - pm
->m
[2][0] * pm
->m
[1][1];
245 t
[1] = pm
->m
[1][0] * pm
->m
[3][1] - pm
->m
[3][0] * pm
->m
[1][1];
246 t
[2] = pm
->m
[2][0] * pm
->m
[3][1] - pm
->m
[3][0] * pm
->m
[2][1];
247 v
[2] = pm
->m
[3][3] * t
[0] - pm
->m
[2][3] * t
[1] + pm
->m
[1][3] * t
[2];
248 v
[3] = -pm
->m
[3][2] * t
[0] + pm
->m
[2][2] * t
[1] - pm
->m
[1][2] * t
[2];
250 return pm
->m
[0][0] * v
[0] + pm
->m
[0][1] * v
[1] +
251 pm
->m
[0][2] * v
[2] + pm
->m
[0][3] * v
[3];
254 D3DXMATRIX
* WINAPI
D3DXMatrixInverse(D3DXMATRIX
*pout
, FLOAT
*pdeterminant
, const D3DXMATRIX
*pm
)
256 FLOAT det
, t
[3], v
[16];
259 TRACE("pout %p, pdeterminant %p, pm %p\n", pout
, pdeterminant
, pm
);
261 t
[0] = pm
->m
[2][2] * pm
->m
[3][3] - pm
->m
[2][3] * pm
->m
[3][2];
262 t
[1] = pm
->m
[1][2] * pm
->m
[3][3] - pm
->m
[1][3] * pm
->m
[3][2];
263 t
[2] = pm
->m
[1][2] * pm
->m
[2][3] - pm
->m
[1][3] * pm
->m
[2][2];
264 v
[0] = pm
->m
[1][1] * t
[0] - pm
->m
[2][1] * t
[1] + pm
->m
[3][1] * t
[2];
265 v
[4] = -pm
->m
[1][0] * t
[0] + pm
->m
[2][0] * t
[1] - pm
->m
[3][0] * t
[2];
267 t
[0] = pm
->m
[1][0] * pm
->m
[2][1] - pm
->m
[2][0] * pm
->m
[1][1];
268 t
[1] = pm
->m
[1][0] * pm
->m
[3][1] - pm
->m
[3][0] * pm
->m
[1][1];
269 t
[2] = pm
->m
[2][0] * pm
->m
[3][1] - pm
->m
[3][0] * pm
->m
[2][1];
270 v
[8] = pm
->m
[3][3] * t
[0] - pm
->m
[2][3] * t
[1] + pm
->m
[1][3] * t
[2];
271 v
[12] = -pm
->m
[3][2] * t
[0] + pm
->m
[2][2] * t
[1] - pm
->m
[1][2] * t
[2];
273 det
= pm
->m
[0][0] * v
[0] + pm
->m
[0][1] * v
[4] +
274 pm
->m
[0][2] * v
[8] + pm
->m
[0][3] * v
[12];
280 t
[0] = pm
->m
[2][2] * pm
->m
[3][3] - pm
->m
[2][3] * pm
->m
[3][2];
281 t
[1] = pm
->m
[0][2] * pm
->m
[3][3] - pm
->m
[0][3] * pm
->m
[3][2];
282 t
[2] = pm
->m
[0][2] * pm
->m
[2][3] - pm
->m
[0][3] * pm
->m
[2][2];
283 v
[1] = -pm
->m
[0][1] * t
[0] + pm
->m
[2][1] * t
[1] - pm
->m
[3][1] * t
[2];
284 v
[5] = pm
->m
[0][0] * t
[0] - pm
->m
[2][0] * t
[1] + pm
->m
[3][0] * t
[2];
286 t
[0] = pm
->m
[0][0] * pm
->m
[2][1] - pm
->m
[2][0] * pm
->m
[0][1];
287 t
[1] = pm
->m
[3][0] * pm
->m
[0][1] - pm
->m
[0][0] * pm
->m
[3][1];
288 t
[2] = pm
->m
[2][0] * pm
->m
[3][1] - pm
->m
[3][0] * pm
->m
[2][1];
289 v
[9] = -pm
->m
[3][3] * t
[0] - pm
->m
[2][3] * t
[1]- pm
->m
[0][3] * t
[2];
290 v
[13] = pm
->m
[3][2] * t
[0] + pm
->m
[2][2] * t
[1] + pm
->m
[0][2] * t
[2];
292 t
[0] = pm
->m
[1][2] * pm
->m
[3][3] - pm
->m
[1][3] * pm
->m
[3][2];
293 t
[1] = pm
->m
[0][2] * pm
->m
[3][3] - pm
->m
[0][3] * pm
->m
[3][2];
294 t
[2] = pm
->m
[0][2] * pm
->m
[1][3] - pm
->m
[0][3] * pm
->m
[1][2];
295 v
[2] = pm
->m
[0][1] * t
[0] - pm
->m
[1][1] * t
[1] + pm
->m
[3][1] * t
[2];
296 v
[6] = -pm
->m
[0][0] * t
[0] + pm
->m
[1][0] * t
[1] - pm
->m
[3][0] * t
[2];
298 t
[0] = pm
->m
[0][0] * pm
->m
[1][1] - pm
->m
[1][0] * pm
->m
[0][1];
299 t
[1] = pm
->m
[3][0] * pm
->m
[0][1] - pm
->m
[0][0] * pm
->m
[3][1];
300 t
[2] = pm
->m
[1][0] * pm
->m
[3][1] - pm
->m
[3][0] * pm
->m
[1][1];
301 v
[10] = pm
->m
[3][3] * t
[0] + pm
->m
[1][3] * t
[1] + pm
->m
[0][3] * t
[2];
302 v
[14] = -pm
->m
[3][2] * t
[0] - pm
->m
[1][2] * t
[1] - pm
->m
[0][2] * t
[2];
304 t
[0] = pm
->m
[1][2] * pm
->m
[2][3] - pm
->m
[1][3] * pm
->m
[2][2];
305 t
[1] = pm
->m
[0][2] * pm
->m
[2][3] - pm
->m
[0][3] * pm
->m
[2][2];
306 t
[2] = pm
->m
[0][2] * pm
->m
[1][3] - pm
->m
[0][3] * pm
->m
[1][2];
307 v
[3] = -pm
->m
[0][1] * t
[0] + pm
->m
[1][1] * t
[1] - pm
->m
[2][1] * t
[2];
308 v
[7] = pm
->m
[0][0] * t
[0] - pm
->m
[1][0] * t
[1] + pm
->m
[2][0] * t
[2];
310 v
[11] = -pm
->m
[0][0] * (pm
->m
[1][1] * pm
->m
[2][3] - pm
->m
[1][3] * pm
->m
[2][1]) +
311 pm
->m
[1][0] * (pm
->m
[0][1] * pm
->m
[2][3] - pm
->m
[0][3] * pm
->m
[2][1]) -
312 pm
->m
[2][0] * (pm
->m
[0][1] * pm
->m
[1][3] - pm
->m
[0][3] * pm
->m
[1][1]);
314 v
[15] = pm
->m
[0][0] * (pm
->m
[1][1] * pm
->m
[2][2] - pm
->m
[1][2] * pm
->m
[2][1]) -
315 pm
->m
[1][0] * (pm
->m
[0][1] * pm
->m
[2][2] - pm
->m
[0][2] * pm
->m
[2][1]) +
316 pm
->m
[2][0] * (pm
->m
[0][1] * pm
->m
[1][2] - pm
->m
[0][2] * pm
->m
[1][1]);
320 for (i
= 0; i
< 4; i
++)
321 for (j
= 0; j
< 4; j
++)
322 pout
->m
[i
][j
] = v
[4 * i
+ j
] * det
;
327 D3DXMATRIX
* WINAPI
D3DXMatrixLookAtLH(D3DXMATRIX
*out
, const D3DXVECTOR3
*eye
, const D3DXVECTOR3
*at
,
328 const D3DXVECTOR3
*up
)
330 D3DXVECTOR3 right
, upn
, vec
;
332 TRACE("out %p, eye %p, at %p, up %p\n", out
, eye
, at
, up
);
334 D3DXVec3Subtract(&vec
, at
, eye
);
335 D3DXVec3Normalize(&vec
, &vec
);
336 D3DXVec3Cross(&right
, up
, &vec
);
337 D3DXVec3Cross(&upn
, &vec
, &right
);
338 D3DXVec3Normalize(&right
, &right
);
339 D3DXVec3Normalize(&upn
, &upn
);
340 out
->m
[0][0] = right
.x
;
341 out
->m
[1][0] = right
.y
;
342 out
->m
[2][0] = right
.z
;
343 out
->m
[3][0] = -D3DXVec3Dot(&right
, eye
);
344 out
->m
[0][1] = upn
.x
;
345 out
->m
[1][1] = upn
.y
;
346 out
->m
[2][1] = upn
.z
;
347 out
->m
[3][1] = -D3DXVec3Dot(&upn
, eye
);
348 out
->m
[0][2] = vec
.x
;
349 out
->m
[1][2] = vec
.y
;
350 out
->m
[2][2] = vec
.z
;
351 out
->m
[3][2] = -D3DXVec3Dot(&vec
, eye
);
360 D3DXMATRIX
* WINAPI
D3DXMatrixLookAtRH(D3DXMATRIX
*out
, const D3DXVECTOR3
*eye
, const D3DXVECTOR3
*at
,
361 const D3DXVECTOR3
*up
)
363 D3DXVECTOR3 right
, upn
, vec
;
365 TRACE("out %p, eye %p, at %p, up %p\n", out
, eye
, at
, up
);
367 D3DXVec3Subtract(&vec
, at
, eye
);
368 D3DXVec3Normalize(&vec
, &vec
);
369 D3DXVec3Cross(&right
, up
, &vec
);
370 D3DXVec3Cross(&upn
, &vec
, &right
);
371 D3DXVec3Normalize(&right
, &right
);
372 D3DXVec3Normalize(&upn
, &upn
);
373 out
->m
[0][0] = -right
.x
;
374 out
->m
[1][0] = -right
.y
;
375 out
->m
[2][0] = -right
.z
;
376 out
->m
[3][0] = D3DXVec3Dot(&right
, eye
);
377 out
->m
[0][1] = upn
.x
;
378 out
->m
[1][1] = upn
.y
;
379 out
->m
[2][1] = upn
.z
;
380 out
->m
[3][1] = -D3DXVec3Dot(&upn
, eye
);
381 out
->m
[0][2] = -vec
.x
;
382 out
->m
[1][2] = -vec
.y
;
383 out
->m
[2][2] = -vec
.z
;
384 out
->m
[3][2] = D3DXVec3Dot(&vec
, eye
);
393 D3DXMATRIX
* WINAPI
D3DXMatrixMultiply(D3DXMATRIX
*pout
, const D3DXMATRIX
*pm1
, const D3DXMATRIX
*pm2
)
398 TRACE("pout %p, pm1 %p, pm2 %p\n", pout
, pm1
, pm2
);
404 out
.m
[i
][j
] = pm1
->m
[i
][0] * pm2
->m
[0][j
] + pm1
->m
[i
][1] * pm2
->m
[1][j
] + pm1
->m
[i
][2] * pm2
->m
[2][j
] + pm1
->m
[i
][3] * pm2
->m
[3][j
];
412 D3DXMATRIX
* WINAPI
D3DXMatrixMultiplyTranspose(D3DXMATRIX
*pout
, const D3DXMATRIX
*pm1
, const D3DXMATRIX
*pm2
)
417 TRACE("pout %p, pm1 %p, pm2 %p\n", pout
, pm1
, pm2
);
419 for (i
= 0; i
< 4; i
++)
420 for (j
= 0; j
< 4; j
++)
421 temp
.m
[j
][i
] = pm1
->m
[i
][0] * pm2
->m
[0][j
] + pm1
->m
[i
][1] * pm2
->m
[1][j
] + pm1
->m
[i
][2] * pm2
->m
[2][j
] + pm1
->m
[i
][3] * pm2
->m
[3][j
];
427 D3DXMATRIX
* WINAPI
D3DXMatrixOrthoLH(D3DXMATRIX
*pout
, FLOAT w
, FLOAT h
, FLOAT zn
, FLOAT zf
)
429 TRACE("pout %p, w %f, h %f, zn %f, zf %f\n", pout
, w
, h
, zn
, zf
);
431 D3DXMatrixIdentity(pout
);
432 pout
->m
[0][0] = 2.0f
/ w
;
433 pout
->m
[1][1] = 2.0f
/ h
;
434 pout
->m
[2][2] = 1.0f
/ (zf
- zn
);
435 pout
->m
[3][2] = zn
/ (zn
- zf
);
439 D3DXMATRIX
* WINAPI
D3DXMatrixOrthoOffCenterLH(D3DXMATRIX
*pout
, FLOAT l
, FLOAT r
, FLOAT b
, FLOAT t
, FLOAT zn
, FLOAT zf
)
441 TRACE("pout %p, l %f, r %f, b %f, t %f, zn %f, zf %f\n", pout
, l
, r
, b
, t
, zn
, zf
);
443 D3DXMatrixIdentity(pout
);
444 pout
->m
[0][0] = 2.0f
/ (r
- l
);
445 pout
->m
[1][1] = 2.0f
/ (t
- b
);
446 pout
->m
[2][2] = 1.0f
/ (zf
-zn
);
447 pout
->m
[3][0] = -1.0f
-2.0f
*l
/ (r
- l
);
448 pout
->m
[3][1] = 1.0f
+ 2.0f
* t
/ (b
- t
);
449 pout
->m
[3][2] = zn
/ (zn
-zf
);
453 D3DXMATRIX
* WINAPI
D3DXMatrixOrthoOffCenterRH(D3DXMATRIX
*pout
, FLOAT l
, FLOAT r
, FLOAT b
, FLOAT t
, FLOAT zn
, FLOAT zf
)
455 TRACE("pout %p, l %f, r %f, b %f, t %f, zn %f, zf %f\n", pout
, l
, r
, b
, t
, zn
, zf
);
457 D3DXMatrixIdentity(pout
);
458 pout
->m
[0][0] = 2.0f
/ (r
- l
);
459 pout
->m
[1][1] = 2.0f
/ (t
- b
);
460 pout
->m
[2][2] = 1.0f
/ (zn
-zf
);
461 pout
->m
[3][0] = -1.0f
-2.0f
*l
/ (r
- l
);
462 pout
->m
[3][1] = 1.0f
+ 2.0f
* t
/ (b
- t
);
463 pout
->m
[3][2] = zn
/ (zn
-zf
);
467 D3DXMATRIX
* WINAPI
D3DXMatrixOrthoRH(D3DXMATRIX
*pout
, FLOAT w
, FLOAT h
, FLOAT zn
, FLOAT zf
)
469 TRACE("pout %p, w %f, h %f, zn %f, zf %f\n", pout
, w
, h
, zn
, zf
);
471 D3DXMatrixIdentity(pout
);
472 pout
->m
[0][0] = 2.0f
/ w
;
473 pout
->m
[1][1] = 2.0f
/ h
;
474 pout
->m
[2][2] = 1.0f
/ (zn
- zf
);
475 pout
->m
[3][2] = zn
/ (zn
- zf
);
479 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveFovLH(D3DXMATRIX
*pout
, FLOAT fovy
, FLOAT aspect
, FLOAT zn
, FLOAT zf
)
481 TRACE("pout %p, fovy %f, aspect %f, zn %f, zf %f\n", pout
, fovy
, aspect
, zn
, zf
);
483 D3DXMatrixIdentity(pout
);
484 pout
->m
[0][0] = 1.0f
/ (aspect
* tanf(fovy
/2.0f
));
485 pout
->m
[1][1] = 1.0f
/ tanf(fovy
/2.0f
);
486 pout
->m
[2][2] = zf
/ (zf
- zn
);
487 pout
->m
[2][3] = 1.0f
;
488 pout
->m
[3][2] = (zf
* zn
) / (zn
- zf
);
489 pout
->m
[3][3] = 0.0f
;
493 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveFovRH(D3DXMATRIX
*pout
, FLOAT fovy
, FLOAT aspect
, FLOAT zn
, FLOAT zf
)
495 TRACE("pout %p, fovy %f, aspect %f, zn %f, zf %f\n", pout
, fovy
, aspect
, zn
, zf
);
497 D3DXMatrixIdentity(pout
);
498 pout
->m
[0][0] = 1.0f
/ (aspect
* tanf(fovy
/2.0f
));
499 pout
->m
[1][1] = 1.0f
/ tanf(fovy
/2.0f
);
500 pout
->m
[2][2] = zf
/ (zn
- zf
);
501 pout
->m
[2][3] = -1.0f
;
502 pout
->m
[3][2] = (zf
* zn
) / (zn
- zf
);
503 pout
->m
[3][3] = 0.0f
;
507 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveLH(D3DXMATRIX
*pout
, FLOAT w
, FLOAT h
, FLOAT zn
, FLOAT zf
)
509 TRACE("pout %p, w %f, h %f, zn %f, zf %f\n", pout
, w
, h
, zn
, zf
);
511 D3DXMatrixIdentity(pout
);
512 pout
->m
[0][0] = 2.0f
* zn
/ w
;
513 pout
->m
[1][1] = 2.0f
* zn
/ h
;
514 pout
->m
[2][2] = zf
/ (zf
- zn
);
515 pout
->m
[3][2] = (zn
* zf
) / (zn
- zf
);
516 pout
->m
[2][3] = 1.0f
;
517 pout
->m
[3][3] = 0.0f
;
521 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveOffCenterLH(D3DXMATRIX
*pout
, FLOAT l
, FLOAT r
, FLOAT b
, FLOAT t
, FLOAT zn
, FLOAT zf
)
523 TRACE("pout %p, l %f, r %f, b %f, t %f, zn %f, zf %f\n", pout
, l
, r
, b
, t
, zn
, zf
);
525 D3DXMatrixIdentity(pout
);
526 pout
->m
[0][0] = 2.0f
* zn
/ (r
- l
);
527 pout
->m
[1][1] = -2.0f
* zn
/ (b
- t
);
528 pout
->m
[2][0] = -1.0f
- 2.0f
* l
/ (r
- l
);
529 pout
->m
[2][1] = 1.0f
+ 2.0f
* t
/ (b
- t
);
530 pout
->m
[2][2] = - zf
/ (zn
- zf
);
531 pout
->m
[3][2] = (zn
* zf
) / (zn
-zf
);
532 pout
->m
[2][3] = 1.0f
;
533 pout
->m
[3][3] = 0.0f
;
537 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveOffCenterRH(D3DXMATRIX
*pout
, FLOAT l
, FLOAT r
, FLOAT b
, FLOAT t
, FLOAT zn
, FLOAT zf
)
539 TRACE("pout %p, l %f, r %f, b %f, t %f, zn %f, zf %f\n", pout
, l
, r
, b
, t
, zn
, zf
);
541 D3DXMatrixIdentity(pout
);
542 pout
->m
[0][0] = 2.0f
* zn
/ (r
- l
);
543 pout
->m
[1][1] = -2.0f
* zn
/ (b
- t
);
544 pout
->m
[2][0] = 1.0f
+ 2.0f
* l
/ (r
- l
);
545 pout
->m
[2][1] = -1.0f
-2.0f
* t
/ (b
- t
);
546 pout
->m
[2][2] = zf
/ (zn
- zf
);
547 pout
->m
[3][2] = (zn
* zf
) / (zn
-zf
);
548 pout
->m
[2][3] = -1.0f
;
549 pout
->m
[3][3] = 0.0f
;
553 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveRH(D3DXMATRIX
*pout
, FLOAT w
, FLOAT h
, FLOAT zn
, FLOAT zf
)
555 TRACE("pout %p, w %f, h %f, zn %f, zf %f\n", pout
, w
, h
, zn
, zf
);
557 D3DXMatrixIdentity(pout
);
558 pout
->m
[0][0] = 2.0f
* zn
/ w
;
559 pout
->m
[1][1] = 2.0f
* zn
/ h
;
560 pout
->m
[2][2] = zf
/ (zn
- zf
);
561 pout
->m
[3][2] = (zn
* zf
) / (zn
- zf
);
562 pout
->m
[2][3] = -1.0f
;
563 pout
->m
[3][3] = 0.0f
;
567 D3DXMATRIX
* WINAPI
D3DXMatrixReflect(D3DXMATRIX
*pout
, const D3DXPLANE
*pplane
)
571 TRACE("pout %p, pplane %p\n", pout
, pplane
);
573 D3DXPlaneNormalize(&Nplane
, pplane
);
574 D3DXMatrixIdentity(pout
);
575 pout
->m
[0][0] = 1.0f
- 2.0f
* Nplane
.a
* Nplane
.a
;
576 pout
->m
[0][1] = -2.0f
* Nplane
.a
* Nplane
.b
;
577 pout
->m
[0][2] = -2.0f
* Nplane
.a
* Nplane
.c
;
578 pout
->m
[1][0] = -2.0f
* Nplane
.a
* Nplane
.b
;
579 pout
->m
[1][1] = 1.0f
- 2.0f
* Nplane
.b
* Nplane
.b
;
580 pout
->m
[1][2] = -2.0f
* Nplane
.b
* Nplane
.c
;
581 pout
->m
[2][0] = -2.0f
* Nplane
.c
* Nplane
.a
;
582 pout
->m
[2][1] = -2.0f
* Nplane
.c
* Nplane
.b
;
583 pout
->m
[2][2] = 1.0f
- 2.0f
* Nplane
.c
* Nplane
.c
;
584 pout
->m
[3][0] = -2.0f
* Nplane
.d
* Nplane
.a
;
585 pout
->m
[3][1] = -2.0f
* Nplane
.d
* Nplane
.b
;
586 pout
->m
[3][2] = -2.0f
* Nplane
.d
* Nplane
.c
;
590 D3DXMATRIX
* WINAPI
D3DXMatrixRotationAxis(D3DXMATRIX
*out
, const D3DXVECTOR3
*v
, FLOAT angle
)
593 FLOAT sangle
, cangle
, cdiff
;
595 TRACE("out %p, v %p, angle %f\n", out
, v
, angle
);
597 D3DXVec3Normalize(&nv
, v
);
598 sangle
= sinf(angle
);
599 cangle
= cosf(angle
);
600 cdiff
= 1.0f
- cangle
;
602 out
->m
[0][0] = cdiff
* nv
.x
* nv
.x
+ cangle
;
603 out
->m
[1][0] = cdiff
* nv
.x
* nv
.y
- sangle
* nv
.z
;
604 out
->m
[2][0] = cdiff
* nv
.x
* nv
.z
+ sangle
* nv
.y
;
606 out
->m
[0][1] = cdiff
* nv
.y
* nv
.x
+ sangle
* nv
.z
;
607 out
->m
[1][1] = cdiff
* nv
.y
* nv
.y
+ cangle
;
608 out
->m
[2][1] = cdiff
* nv
.y
* nv
.z
- sangle
* nv
.x
;
610 out
->m
[0][2] = cdiff
* nv
.z
* nv
.x
- sangle
* nv
.y
;
611 out
->m
[1][2] = cdiff
* nv
.z
* nv
.y
+ sangle
* nv
.x
;
612 out
->m
[2][2] = cdiff
* nv
.z
* nv
.z
+ cangle
;
622 D3DXMATRIX
* WINAPI
D3DXMatrixRotationQuaternion(D3DXMATRIX
*pout
, const D3DXQUATERNION
*pq
)
624 TRACE("pout %p, pq %p\n", pout
, pq
);
626 D3DXMatrixIdentity(pout
);
627 pout
->m
[0][0] = 1.0f
- 2.0f
* (pq
->y
* pq
->y
+ pq
->z
* pq
->z
);
628 pout
->m
[0][1] = 2.0f
* (pq
->x
*pq
->y
+ pq
->z
* pq
->w
);
629 pout
->m
[0][2] = 2.0f
* (pq
->x
* pq
->z
- pq
->y
* pq
->w
);
630 pout
->m
[1][0] = 2.0f
* (pq
->x
* pq
->y
- pq
->z
* pq
->w
);
631 pout
->m
[1][1] = 1.0f
- 2.0f
* (pq
->x
* pq
->x
+ pq
->z
* pq
->z
);
632 pout
->m
[1][2] = 2.0f
* (pq
->y
*pq
->z
+ pq
->x
*pq
->w
);
633 pout
->m
[2][0] = 2.0f
* (pq
->x
* pq
->z
+ pq
->y
* pq
->w
);
634 pout
->m
[2][1] = 2.0f
* (pq
->y
*pq
->z
- pq
->x
*pq
->w
);
635 pout
->m
[2][2] = 1.0f
- 2.0f
* (pq
->x
* pq
->x
+ pq
->y
* pq
->y
);
639 D3DXMATRIX
* WINAPI
D3DXMatrixRotationX(D3DXMATRIX
*pout
, FLOAT angle
)
641 TRACE("pout %p, angle %f\n", pout
, angle
);
643 D3DXMatrixIdentity(pout
);
644 pout
->m
[1][1] = cosf(angle
);
645 pout
->m
[2][2] = cosf(angle
);
646 pout
->m
[1][2] = sinf(angle
);
647 pout
->m
[2][1] = -sinf(angle
);
651 D3DXMATRIX
* WINAPI
D3DXMatrixRotationY(D3DXMATRIX
*pout
, FLOAT angle
)
653 TRACE("pout %p, angle %f\n", pout
, angle
);
655 D3DXMatrixIdentity(pout
);
656 pout
->m
[0][0] = cosf(angle
);
657 pout
->m
[2][2] = cosf(angle
);
658 pout
->m
[0][2] = -sinf(angle
);
659 pout
->m
[2][0] = sinf(angle
);
663 D3DXMATRIX
* WINAPI
D3DXMatrixRotationYawPitchRoll(D3DXMATRIX
*out
, FLOAT yaw
, FLOAT pitch
, FLOAT roll
)
665 FLOAT sroll
, croll
, spitch
, cpitch
, syaw
, cyaw
;
667 TRACE("out %p, yaw %f, pitch %f, roll %f\n", out
, yaw
, pitch
, roll
);
671 spitch
= sinf(pitch
);
672 cpitch
= cosf(pitch
);
676 out
->m
[0][0] = sroll
* spitch
* syaw
+ croll
* cyaw
;
677 out
->m
[0][1] = sroll
* cpitch
;
678 out
->m
[0][2] = sroll
* spitch
* cyaw
- croll
* syaw
;
680 out
->m
[1][0] = croll
* spitch
* syaw
- sroll
* cyaw
;
681 out
->m
[1][1] = croll
* cpitch
;
682 out
->m
[1][2] = croll
* spitch
* cyaw
+ sroll
* syaw
;
684 out
->m
[2][0] = cpitch
* syaw
;
685 out
->m
[2][1] = -spitch
;
686 out
->m
[2][2] = cpitch
* cyaw
;
696 D3DXMATRIX
* WINAPI
D3DXMatrixRotationZ(D3DXMATRIX
*pout
, FLOAT angle
)
698 TRACE("pout %p, angle %f\n", pout
, angle
);
700 D3DXMatrixIdentity(pout
);
701 pout
->m
[0][0] = cosf(angle
);
702 pout
->m
[1][1] = cosf(angle
);
703 pout
->m
[0][1] = sinf(angle
);
704 pout
->m
[1][0] = -sinf(angle
);
708 D3DXMATRIX
* WINAPI
D3DXMatrixScaling(D3DXMATRIX
*pout
, FLOAT sx
, FLOAT sy
, FLOAT sz
)
710 TRACE("pout %p, sx %f, sy %f, sz %f\n", pout
, sx
, sy
, sz
);
712 D3DXMatrixIdentity(pout
);
719 D3DXMATRIX
* WINAPI
D3DXMatrixShadow(D3DXMATRIX
*pout
, const D3DXVECTOR4
*plight
, const D3DXPLANE
*pplane
)
724 TRACE("pout %p, plight %p, pplane %p\n", pout
, plight
, pplane
);
726 D3DXPlaneNormalize(&Nplane
, pplane
);
727 dot
= D3DXPlaneDot(&Nplane
, plight
);
728 pout
->m
[0][0] = dot
- Nplane
.a
* plight
->x
;
729 pout
->m
[0][1] = -Nplane
.a
* plight
->y
;
730 pout
->m
[0][2] = -Nplane
.a
* plight
->z
;
731 pout
->m
[0][3] = -Nplane
.a
* plight
->w
;
732 pout
->m
[1][0] = -Nplane
.b
* plight
->x
;
733 pout
->m
[1][1] = dot
- Nplane
.b
* plight
->y
;
734 pout
->m
[1][2] = -Nplane
.b
* plight
->z
;
735 pout
->m
[1][3] = -Nplane
.b
* plight
->w
;
736 pout
->m
[2][0] = -Nplane
.c
* plight
->x
;
737 pout
->m
[2][1] = -Nplane
.c
* plight
->y
;
738 pout
->m
[2][2] = dot
- Nplane
.c
* plight
->z
;
739 pout
->m
[2][3] = -Nplane
.c
* plight
->w
;
740 pout
->m
[3][0] = -Nplane
.d
* plight
->x
;
741 pout
->m
[3][1] = -Nplane
.d
* plight
->y
;
742 pout
->m
[3][2] = -Nplane
.d
* plight
->z
;
743 pout
->m
[3][3] = dot
- Nplane
.d
* plight
->w
;
747 D3DXMATRIX
* WINAPI
D3DXMatrixTransformation(D3DXMATRIX
*out
, const D3DXVECTOR3
*scaling_center
,
748 const D3DXQUATERNION
*scaling_rotation
, const D3DXVECTOR3
*scaling
,
749 const D3DXVECTOR3
*rotation_center
, const D3DXQUATERNION
*rotation
,
750 const D3DXVECTOR3
*translation
)
752 static const D3DXVECTOR3 zero_vector
;
753 D3DXMATRIX m1
, msr1
, ms
, msr
, msc
, mrc1
, mr
, mrc
, mt
;
757 TRACE("out %p, scaling_center %p, scaling_rotation %p, scaling %p, rotation_center %p,"
758 " rotation %p, translation %p.\n",
759 out
, scaling_center
, scaling_rotation
, scaling
, rotation_center
, rotation
, translation
);
763 sc
= scaling_center
? *scaling_center
: zero_vector
;
764 D3DXMatrixTranslation(&m1
, -sc
.x
, -sc
.y
, -sc
.z
);
765 if (scaling_rotation
)
767 q
.x
= -scaling_rotation
->x
;
768 q
.y
= -scaling_rotation
->y
;
769 q
.z
= -scaling_rotation
->z
;
770 q
.w
= scaling_rotation
->w
;
771 D3DXMatrixRotationQuaternion(&msr1
, &q
);
772 D3DXMatrixMultiply(&m1
, &m1
, &msr1
);
774 D3DXMatrixScaling(&ms
, scaling
->x
, scaling
->y
, scaling
->z
);
775 D3DXMatrixMultiply(&m1
, &m1
, &ms
);
776 if (scaling_rotation
)
778 D3DXMatrixRotationQuaternion(&msr
, scaling_rotation
);
779 D3DXMatrixMultiply(&m1
, &m1
, &msr
);
781 D3DXMatrixTranslation(&msc
, sc
.x
, sc
.y
, sc
.z
);
782 D3DXMatrixMultiply(&m1
, &m1
, &msc
);
786 D3DXMatrixIdentity(&m1
);
791 rc
= rotation_center
? *rotation_center
: zero_vector
;
792 D3DXMatrixTranslation(&mrc1
, -rc
.x
, -rc
.y
, -rc
.z
);
793 D3DXMatrixMultiply(&m1
, &m1
, &mrc1
);
794 D3DXMatrixRotationQuaternion(&mr
, rotation
);
795 D3DXMatrixMultiply(&m1
, &m1
, &mr
);
796 D3DXMatrixTranslation(&mrc
, rc
.x
, rc
.y
, rc
.z
);
797 D3DXMatrixMultiply(&m1
, &m1
, &mrc
);
802 D3DXMatrixTranslation(&mt
, translation
->x
, translation
->y
, translation
->z
);
803 D3DXMatrixMultiply(out
, &m1
, &mt
);
813 static void vec3_from_vec2(D3DXVECTOR3
*v3
, const D3DXVECTOR2
*v2
)
823 D3DXMATRIX
* WINAPI
D3DXMatrixTransformation2D(D3DXMATRIX
*out
, const D3DXVECTOR2
*scaling_center
,
824 float scaling_rotation
, const D3DXVECTOR2
*scaling
, const D3DXVECTOR2
*rotation_center
,
825 float rotation
, const D3DXVECTOR2
*translation
)
827 D3DXVECTOR3 r_c
, s
, s_c
, t
;
828 D3DXQUATERNION r
, s_r
;
830 TRACE("out %p, scaling_center %p, scaling_rotation %.8e, scaling %p, rotation_center %p, "
831 "rotation %.8e, translation %p.\n",
832 out
, scaling_center
, scaling_rotation
, scaling
, rotation_center
, rotation
, translation
);
834 vec3_from_vec2(&s_c
, scaling_center
);
835 vec3_from_vec2(&s
, scaling
);
838 vec3_from_vec2(&r_c
, rotation_center
);
839 vec3_from_vec2(&t
, translation
);
843 r
.w
= cosf(rotation
/ 2.0f
);
846 r
.z
= sinf(rotation
/ 2.0f
);
849 if (scaling_rotation
)
851 s_r
.w
= cosf(scaling_rotation
/ 2.0f
);
854 s_r
.z
= sinf(scaling_rotation
/ 2.0f
);
857 return D3DXMatrixTransformation(out
, scaling_center
? &s_c
: NULL
,
858 scaling_rotation
? &s_r
: NULL
, scaling
? &s
: NULL
, rotation_center
? &r_c
: NULL
,
859 rotation
? &r
: NULL
, translation
? &t
: NULL
);
862 D3DXMATRIX
* WINAPI
D3DXMatrixTranslation(D3DXMATRIX
*pout
, FLOAT x
, FLOAT y
, FLOAT z
)
864 TRACE("pout %p, x %f, y %f, z %f\n", pout
, x
, y
, z
);
866 D3DXMatrixIdentity(pout
);
873 D3DXMATRIX
* WINAPI
D3DXMatrixTranspose(D3DXMATRIX
*out
, const D3DXMATRIX
*in
)
878 TRACE("out %p, in %p.\n", out
, in
);
882 for (i
= 0; i
< 4; ++i
)
883 for (j
= 0; j
< 4; ++j
) out
->m
[i
][j
] = m
.m
[j
][i
];
888 /*_________________D3DXMatrixStack____________________*/
891 static inline struct ID3DXMatrixStackImpl
*impl_from_ID3DXMatrixStack(ID3DXMatrixStack
*iface
)
893 return CONTAINING_RECORD(iface
, struct ID3DXMatrixStackImpl
, ID3DXMatrixStack_iface
);
896 static HRESULT WINAPI
ID3DXMatrixStackImpl_QueryInterface(ID3DXMatrixStack
*iface
, REFIID riid
, void **out
)
898 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
900 if (IsEqualGUID(riid
, &IID_ID3DXMatrixStack
)
901 || IsEqualGUID(riid
, &IID_IUnknown
))
903 ID3DXMatrixStack_AddRef(iface
);
908 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
911 return E_NOINTERFACE
;
914 static ULONG WINAPI
ID3DXMatrixStackImpl_AddRef(ID3DXMatrixStack
*iface
)
916 struct ID3DXMatrixStackImpl
*stack
= impl_from_ID3DXMatrixStack(iface
);
917 ULONG refcount
= InterlockedIncrement(&stack
->ref
);
919 TRACE("%p increasing refcount to %lu.\n", iface
, refcount
);
923 static ULONG WINAPI
ID3DXMatrixStackImpl_Release(ID3DXMatrixStack
*iface
)
925 struct ID3DXMatrixStackImpl
*stack
= impl_from_ID3DXMatrixStack(iface
);
926 ULONG refcount
= InterlockedDecrement(&stack
->ref
);
928 TRACE("%p decreasing refcount to %lu.\n", iface
, refcount
);
931 HeapFree(GetProcessHeap(), 0, stack
->stack
);
932 HeapFree(GetProcessHeap(), 0, stack
);
937 static D3DXMATRIX
* WINAPI
ID3DXMatrixStackImpl_GetTop(ID3DXMatrixStack
*iface
)
939 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
941 TRACE("iface %p\n", iface
);
943 return &This
->stack
[This
->current
];
946 static HRESULT WINAPI
ID3DXMatrixStackImpl_LoadIdentity(ID3DXMatrixStack
*iface
)
948 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
950 TRACE("iface %p\n", iface
);
952 D3DXMatrixIdentity(&This
->stack
[This
->current
]);
957 static HRESULT WINAPI
ID3DXMatrixStackImpl_LoadMatrix(ID3DXMatrixStack
*iface
, const D3DXMATRIX
*pm
)
959 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
961 TRACE("iface %p, pm %p\n", iface
, pm
);
963 This
->stack
[This
->current
] = *pm
;
968 static HRESULT WINAPI
ID3DXMatrixStackImpl_MultMatrix(ID3DXMatrixStack
*iface
, const D3DXMATRIX
*pm
)
970 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
972 TRACE("iface %p, pm %p\n", iface
, pm
);
974 D3DXMatrixMultiply(&This
->stack
[This
->current
], &This
->stack
[This
->current
], pm
);
979 static HRESULT WINAPI
ID3DXMatrixStackImpl_MultMatrixLocal(ID3DXMatrixStack
*iface
, const D3DXMATRIX
*pm
)
981 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
983 TRACE("iface %p, pm %p\n", iface
, pm
);
985 D3DXMatrixMultiply(&This
->stack
[This
->current
], pm
, &This
->stack
[This
->current
]);
990 static HRESULT WINAPI
ID3DXMatrixStackImpl_Pop(ID3DXMatrixStack
*iface
)
992 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
994 TRACE("iface %p\n", iface
);
996 /* Popping the last element on the stack returns D3D_OK, but does nothing. */
997 if (!This
->current
) return D3D_OK
;
999 if (This
->current
<= This
->stack_size
/ 4 && This
->stack_size
>= INITIAL_STACK_SIZE
* 2)
1001 unsigned int new_size
;
1002 D3DXMATRIX
*new_stack
;
1004 new_size
= This
->stack_size
/ 2;
1005 new_stack
= HeapReAlloc(GetProcessHeap(), 0, This
->stack
, new_size
* sizeof(*new_stack
));
1008 This
->stack_size
= new_size
;
1009 This
->stack
= new_stack
;
1018 static HRESULT WINAPI
ID3DXMatrixStackImpl_Push(ID3DXMatrixStack
*iface
)
1020 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
1022 TRACE("iface %p\n", iface
);
1024 if (This
->current
== This
->stack_size
- 1)
1026 unsigned int new_size
;
1027 D3DXMATRIX
*new_stack
;
1029 if (This
->stack_size
> UINT_MAX
/ 2) return E_OUTOFMEMORY
;
1031 new_size
= This
->stack_size
* 2;
1032 new_stack
= HeapReAlloc(GetProcessHeap(), 0, This
->stack
, new_size
* sizeof(*new_stack
));
1033 if (!new_stack
) return E_OUTOFMEMORY
;
1035 This
->stack_size
= new_size
;
1036 This
->stack
= new_stack
;
1040 This
->stack
[This
->current
] = This
->stack
[This
->current
- 1];
1045 static HRESULT WINAPI
ID3DXMatrixStackImpl_RotateAxis(ID3DXMatrixStack
*iface
, const D3DXVECTOR3
*pv
, FLOAT angle
)
1048 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
1050 TRACE("iface %p, pv %p, angle %f\n", iface
, pv
, angle
);
1052 D3DXMatrixRotationAxis(&temp
, pv
, angle
);
1053 D3DXMatrixMultiply(&This
->stack
[This
->current
], &This
->stack
[This
->current
], &temp
);
1058 static HRESULT WINAPI
ID3DXMatrixStackImpl_RotateAxisLocal(ID3DXMatrixStack
*iface
, const D3DXVECTOR3
*pv
, FLOAT angle
)
1061 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
1063 TRACE("iface %p, pv %p, angle %f\n", iface
, pv
, angle
);
1065 D3DXMatrixRotationAxis(&temp
, pv
, angle
);
1066 D3DXMatrixMultiply(&This
->stack
[This
->current
], &temp
, &This
->stack
[This
->current
]);
1071 static HRESULT WINAPI
ID3DXMatrixStackImpl_RotateYawPitchRoll(ID3DXMatrixStack
*iface
, FLOAT x
, FLOAT y
, FLOAT z
)
1074 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
1076 TRACE("iface %p, x %f, y %f, z %f\n", iface
, x
, y
, z
);
1078 D3DXMatrixRotationYawPitchRoll(&temp
, x
, y
, z
);
1079 D3DXMatrixMultiply(&This
->stack
[This
->current
], &This
->stack
[This
->current
], &temp
);
1084 static HRESULT WINAPI
ID3DXMatrixStackImpl_RotateYawPitchRollLocal(ID3DXMatrixStack
*iface
, FLOAT x
, FLOAT y
, FLOAT z
)
1087 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
1089 TRACE("iface %p, x %f, y %f, z %f\n", iface
, x
, y
, z
);
1091 D3DXMatrixRotationYawPitchRoll(&temp
, x
, y
, z
);
1092 D3DXMatrixMultiply(&This
->stack
[This
->current
], &temp
, &This
->stack
[This
->current
]);
1097 static HRESULT WINAPI
ID3DXMatrixStackImpl_Scale(ID3DXMatrixStack
*iface
, FLOAT x
, FLOAT y
, FLOAT z
)
1100 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
1102 TRACE("iface %p,x %f, y %f, z %f\n", iface
, x
, y
, z
);
1104 D3DXMatrixScaling(&temp
, x
, y
, z
);
1105 D3DXMatrixMultiply(&This
->stack
[This
->current
], &This
->stack
[This
->current
], &temp
);
1110 static HRESULT WINAPI
ID3DXMatrixStackImpl_ScaleLocal(ID3DXMatrixStack
*iface
, FLOAT x
, FLOAT y
, FLOAT z
)
1113 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
1115 TRACE("iface %p, x %f, y %f, z %f\n", iface
, x
, y
, z
);
1117 D3DXMatrixScaling(&temp
, x
, y
, z
);
1118 D3DXMatrixMultiply(&This
->stack
[This
->current
], &temp
, &This
->stack
[This
->current
]);
1123 static HRESULT WINAPI
ID3DXMatrixStackImpl_Translate(ID3DXMatrixStack
*iface
, FLOAT x
, FLOAT y
, FLOAT z
)
1126 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
1128 TRACE("iface %p, x %f, y %f, z %f\n", iface
, x
, y
, z
);
1130 D3DXMatrixTranslation(&temp
, x
, y
, z
);
1131 D3DXMatrixMultiply(&This
->stack
[This
->current
], &This
->stack
[This
->current
], &temp
);
1136 static HRESULT WINAPI
ID3DXMatrixStackImpl_TranslateLocal(ID3DXMatrixStack
*iface
, FLOAT x
, FLOAT y
, FLOAT z
)
1139 struct ID3DXMatrixStackImpl
*This
= impl_from_ID3DXMatrixStack(iface
);
1141 TRACE("iface %p, x %f, y %f, z %f\n", iface
, x
, y
, z
);
1143 D3DXMatrixTranslation(&temp
, x
, y
, z
);
1144 D3DXMatrixMultiply(&This
->stack
[This
->current
], &temp
,&This
->stack
[This
->current
]);
1149 static const ID3DXMatrixStackVtbl ID3DXMatrixStack_Vtbl
=
1151 ID3DXMatrixStackImpl_QueryInterface
,
1152 ID3DXMatrixStackImpl_AddRef
,
1153 ID3DXMatrixStackImpl_Release
,
1154 ID3DXMatrixStackImpl_Pop
,
1155 ID3DXMatrixStackImpl_Push
,
1156 ID3DXMatrixStackImpl_LoadIdentity
,
1157 ID3DXMatrixStackImpl_LoadMatrix
,
1158 ID3DXMatrixStackImpl_MultMatrix
,
1159 ID3DXMatrixStackImpl_MultMatrixLocal
,
1160 ID3DXMatrixStackImpl_RotateAxis
,
1161 ID3DXMatrixStackImpl_RotateAxisLocal
,
1162 ID3DXMatrixStackImpl_RotateYawPitchRoll
,
1163 ID3DXMatrixStackImpl_RotateYawPitchRollLocal
,
1164 ID3DXMatrixStackImpl_Scale
,
1165 ID3DXMatrixStackImpl_ScaleLocal
,
1166 ID3DXMatrixStackImpl_Translate
,
1167 ID3DXMatrixStackImpl_TranslateLocal
,
1168 ID3DXMatrixStackImpl_GetTop
1171 HRESULT WINAPI
D3DXCreateMatrixStack(DWORD flags
, ID3DXMatrixStack
**stack
)
1173 struct ID3DXMatrixStackImpl
*object
;
1175 TRACE("flags %#lx, stack %p.\n", flags
, stack
);
1177 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
1180 return E_OUTOFMEMORY
;
1182 object
->ID3DXMatrixStack_iface
.lpVtbl
= &ID3DXMatrixStack_Vtbl
;
1185 if (!(object
->stack
= HeapAlloc(GetProcessHeap(), 0, INITIAL_STACK_SIZE
* sizeof(*object
->stack
))))
1187 HeapFree(GetProcessHeap(), 0, object
);
1189 return E_OUTOFMEMORY
;
1192 object
->current
= 0;
1193 object
->stack_size
= INITIAL_STACK_SIZE
;
1194 D3DXMatrixIdentity(&object
->stack
[0]);
1196 TRACE("Created matrix stack %p.\n", object
);
1198 *stack
= &object
->ID3DXMatrixStack_iface
;
1202 /*_________________D3DXPLANE________________*/
1204 D3DXPLANE
* WINAPI
D3DXPlaneFromPointNormal(D3DXPLANE
*pout
, const D3DXVECTOR3
*pvpoint
, const D3DXVECTOR3
*pvnormal
)
1206 TRACE("pout %p, pvpoint %p, pvnormal %p\n", pout
, pvpoint
, pvnormal
);
1208 pout
->a
= pvnormal
->x
;
1209 pout
->b
= pvnormal
->y
;
1210 pout
->c
= pvnormal
->z
;
1211 pout
->d
= -D3DXVec3Dot(pvpoint
, pvnormal
);
1215 D3DXPLANE
* WINAPI
D3DXPlaneFromPoints(D3DXPLANE
*pout
, const D3DXVECTOR3
*pv1
, const D3DXVECTOR3
*pv2
, const D3DXVECTOR3
*pv3
)
1217 D3DXVECTOR3 edge1
, edge2
, normal
, Nnormal
;
1219 TRACE("pout %p, pv1 %p, pv2 %p, pv3 %p\n", pout
, pv1
, pv2
, pv3
);
1221 edge1
.x
= 0.0f
; edge1
.y
= 0.0f
; edge1
.z
= 0.0f
;
1222 edge2
.x
= 0.0f
; edge2
.y
= 0.0f
; edge2
.z
= 0.0f
;
1223 D3DXVec3Subtract(&edge1
, pv2
, pv1
);
1224 D3DXVec3Subtract(&edge2
, pv3
, pv1
);
1225 D3DXVec3Cross(&normal
, &edge1
, &edge2
);
1226 D3DXVec3Normalize(&Nnormal
, &normal
);
1227 D3DXPlaneFromPointNormal(pout
, pv1
, &Nnormal
);
1231 D3DXVECTOR3
* WINAPI
D3DXPlaneIntersectLine(D3DXVECTOR3
*pout
, const D3DXPLANE
*pp
, const D3DXVECTOR3
*pv1
, const D3DXVECTOR3
*pv2
)
1233 D3DXVECTOR3 direction
, normal
;
1236 TRACE("pout %p, pp %p, pv1 %p, pv2 %p\n", pout
, pp
, pv1
, pv2
);
1241 direction
.x
= pv2
->x
- pv1
->x
;
1242 direction
.y
= pv2
->y
- pv1
->y
;
1243 direction
.z
= pv2
->z
- pv1
->z
;
1244 dot
= D3DXVec3Dot(&normal
, &direction
);
1245 if ( !dot
) return NULL
;
1246 temp
= ( pp
->d
+ D3DXVec3Dot(&normal
, pv1
) ) / dot
;
1247 pout
->x
= pv1
->x
- temp
* direction
.x
;
1248 pout
->y
= pv1
->y
- temp
* direction
.y
;
1249 pout
->z
= pv1
->z
- temp
* direction
.z
;
1253 D3DXPLANE
* WINAPI
D3DXPlaneNormalize(D3DXPLANE
*out
, const D3DXPLANE
*p
)
1257 TRACE("out %p, p %p\n", out
, p
);
1259 norm
= sqrtf(p
->a
* p
->a
+ p
->b
* p
->b
+ p
->c
* p
->c
);
1262 out
->a
= p
->a
/ norm
;
1263 out
->b
= p
->b
/ norm
;
1264 out
->c
= p
->c
/ norm
;
1265 out
->d
= p
->d
/ norm
;
1278 D3DXPLANE
* WINAPI
D3DXPlaneTransform(D3DXPLANE
*pout
, const D3DXPLANE
*pplane
, const D3DXMATRIX
*pm
)
1280 const D3DXPLANE plane
= *pplane
;
1282 TRACE("pout %p, pplane %p, pm %p\n", pout
, pplane
, pm
);
1284 pout
->a
= pm
->m
[0][0] * plane
.a
+ pm
->m
[1][0] * plane
.b
+ pm
->m
[2][0] * plane
.c
+ pm
->m
[3][0] * plane
.d
;
1285 pout
->b
= pm
->m
[0][1] * plane
.a
+ pm
->m
[1][1] * plane
.b
+ pm
->m
[2][1] * plane
.c
+ pm
->m
[3][1] * plane
.d
;
1286 pout
->c
= pm
->m
[0][2] * plane
.a
+ pm
->m
[1][2] * plane
.b
+ pm
->m
[2][2] * plane
.c
+ pm
->m
[3][2] * plane
.d
;
1287 pout
->d
= pm
->m
[0][3] * plane
.a
+ pm
->m
[1][3] * plane
.b
+ pm
->m
[2][3] * plane
.c
+ pm
->m
[3][3] * plane
.d
;
1291 D3DXPLANE
* WINAPI
D3DXPlaneTransformArray(D3DXPLANE
* out
, UINT outstride
, const D3DXPLANE
* in
, UINT instride
, const D3DXMATRIX
* matrix
, UINT elements
)
1295 TRACE("out %p, outstride %u, in %p, instride %u, matrix %p, elements %u\n", out
, outstride
, in
, instride
, matrix
, elements
);
1297 for (i
= 0; i
< elements
; ++i
) {
1299 (D3DXPLANE
*)((char*)out
+ outstride
* i
),
1300 (const D3DXPLANE
*)((const char*)in
+ instride
* i
),
1306 /*_________________D3DXQUATERNION________________*/
1308 D3DXQUATERNION
* WINAPI
D3DXQuaternionBaryCentric(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq1
, const D3DXQUATERNION
*pq2
, const D3DXQUATERNION
*pq3
, FLOAT f
, FLOAT g
)
1310 D3DXQUATERNION temp1
, temp2
;
1312 TRACE("pout %p, pq1 %p, pq2 %p, pq3 %p, f %f, g %f\n", pout
, pq1
, pq2
, pq3
, f
, g
);
1314 D3DXQuaternionSlerp(pout
, D3DXQuaternionSlerp(&temp1
, pq1
, pq2
, f
+ g
), D3DXQuaternionSlerp(&temp2
, pq1
, pq3
, f
+g
), g
/ (f
+ g
));
1318 D3DXQUATERNION
* WINAPI
D3DXQuaternionExp(D3DXQUATERNION
*out
, const D3DXQUATERNION
*q
)
1322 TRACE("out %p, q %p\n", out
, q
);
1324 norm
= sqrtf(q
->x
* q
->x
+ q
->y
* q
->y
+ q
->z
* q
->z
);
1327 out
->x
= sinf(norm
) * q
->x
/ norm
;
1328 out
->y
= sinf(norm
) * q
->y
/ norm
;
1329 out
->z
= sinf(norm
) * q
->z
/ norm
;
1330 out
->w
= cosf(norm
);
1343 D3DXQUATERNION
* WINAPI
D3DXQuaternionInverse(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq
)
1347 TRACE("pout %p, pq %p\n", pout
, pq
);
1349 norm
= D3DXQuaternionLengthSq(pq
);
1351 pout
->x
= -pq
->x
/ norm
;
1352 pout
->y
= -pq
->y
/ norm
;
1353 pout
->z
= -pq
->z
/ norm
;
1354 pout
->w
= pq
->w
/ norm
;
1358 D3DXQUATERNION
* WINAPI
D3DXQuaternionLn(D3DXQUATERNION
*out
, const D3DXQUATERNION
*q
)
1362 TRACE("out %p, q %p\n", out
, q
);
1364 if ((q
->w
>= 1.0f
) || (q
->w
== -1.0f
))
1367 t
= acosf(q
->w
) / sqrtf(1.0f
- q
->w
* q
->w
);
1377 D3DXQUATERNION
* WINAPI
D3DXQuaternionMultiply(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq1
, const D3DXQUATERNION
*pq2
)
1381 TRACE("pout %p, pq1 %p, pq2 %p\n", pout
, pq1
, pq2
);
1383 out
.x
= pq2
->w
* pq1
->x
+ pq2
->x
* pq1
->w
+ pq2
->y
* pq1
->z
- pq2
->z
* pq1
->y
;
1384 out
.y
= pq2
->w
* pq1
->y
- pq2
->x
* pq1
->z
+ pq2
->y
* pq1
->w
+ pq2
->z
* pq1
->x
;
1385 out
.z
= pq2
->w
* pq1
->z
+ pq2
->x
* pq1
->y
- pq2
->y
* pq1
->x
+ pq2
->z
* pq1
->w
;
1386 out
.w
= pq2
->w
* pq1
->w
- pq2
->x
* pq1
->x
- pq2
->y
* pq1
->y
- pq2
->z
* pq1
->z
;
1391 D3DXQUATERNION
* WINAPI
D3DXQuaternionNormalize(D3DXQUATERNION
*out
, const D3DXQUATERNION
*q
)
1395 TRACE("out %p, q %p\n", out
, q
);
1397 norm
= D3DXQuaternionLength(q
);
1399 out
->x
= q
->x
/ norm
;
1400 out
->y
= q
->y
/ norm
;
1401 out
->z
= q
->z
/ norm
;
1402 out
->w
= q
->w
/ norm
;
1407 D3DXQUATERNION
* WINAPI
D3DXQuaternionRotationAxis(D3DXQUATERNION
*out
, const D3DXVECTOR3
*v
, FLOAT angle
)
1411 TRACE("out %p, v %p, angle %f\n", out
, v
, angle
);
1413 D3DXVec3Normalize(&temp
, v
);
1415 out
->x
= sinf(angle
/ 2.0f
) * temp
.x
;
1416 out
->y
= sinf(angle
/ 2.0f
) * temp
.y
;
1417 out
->z
= sinf(angle
/ 2.0f
) * temp
.z
;
1418 out
->w
= cosf(angle
/ 2.0f
);
1423 D3DXQUATERNION
* WINAPI
D3DXQuaternionRotationMatrix(D3DXQUATERNION
*out
, const D3DXMATRIX
*m
)
1427 TRACE("out %p, m %p\n", out
, m
);
1429 trace
= m
->m
[0][0] + m
->m
[1][1] + m
->m
[2][2] + 1.0f
;
1432 s
= 2.0f
* sqrtf(trace
);
1433 out
->x
= (m
->m
[1][2] - m
->m
[2][1]) / s
;
1434 out
->y
= (m
->m
[2][0] - m
->m
[0][2]) / s
;
1435 out
->z
= (m
->m
[0][1] - m
->m
[1][0]) / s
;
1442 for (i
= 1; i
< 3; i
++)
1444 if (m
->m
[i
][i
] > m
->m
[maxi
][maxi
])
1451 s
= 2.0f
* sqrtf(1.0f
+ m
->m
[0][0] - m
->m
[1][1] - m
->m
[2][2]);
1453 out
->y
= (m
->m
[0][1] + m
->m
[1][0]) / s
;
1454 out
->z
= (m
->m
[0][2] + m
->m
[2][0]) / s
;
1455 out
->w
= (m
->m
[1][2] - m
->m
[2][1]) / s
;
1459 s
= 2.0f
* sqrtf(1.0f
+ m
->m
[1][1] - m
->m
[0][0] - m
->m
[2][2]);
1460 out
->x
= (m
->m
[0][1] + m
->m
[1][0]) / s
;
1462 out
->z
= (m
->m
[1][2] + m
->m
[2][1]) / s
;
1463 out
->w
= (m
->m
[2][0] - m
->m
[0][2]) / s
;
1467 s
= 2.0f
* sqrtf(1.0f
+ m
->m
[2][2] - m
->m
[0][0] - m
->m
[1][1]);
1468 out
->x
= (m
->m
[0][2] + m
->m
[2][0]) / s
;
1469 out
->y
= (m
->m
[1][2] + m
->m
[2][1]) / s
;
1471 out
->w
= (m
->m
[0][1] - m
->m
[1][0]) / s
;
1479 D3DXQUATERNION
* WINAPI
D3DXQuaternionRotationYawPitchRoll(D3DXQUATERNION
*out
, FLOAT yaw
, FLOAT pitch
, FLOAT roll
)
1481 FLOAT syaw
, cyaw
, spitch
, cpitch
, sroll
, croll
;
1483 TRACE("out %p, yaw %f, pitch %f, roll %f\n", out
, yaw
, pitch
, roll
);
1485 syaw
= sinf(yaw
/ 2.0f
);
1486 cyaw
= cosf(yaw
/ 2.0f
);
1487 spitch
= sinf(pitch
/ 2.0f
);
1488 cpitch
= cosf(pitch
/ 2.0f
);
1489 sroll
= sinf(roll
/ 2.0f
);
1490 croll
= cosf(roll
/ 2.0f
);
1492 out
->x
= syaw
* cpitch
* sroll
+ cyaw
* spitch
* croll
;
1493 out
->y
= syaw
* cpitch
* croll
- cyaw
* spitch
* sroll
;
1494 out
->z
= cyaw
* cpitch
* sroll
- syaw
* spitch
* croll
;
1495 out
->w
= cyaw
* cpitch
* croll
+ syaw
* spitch
* sroll
;
1500 D3DXQUATERNION
* WINAPI
D3DXQuaternionSlerp(D3DXQUATERNION
*out
, const D3DXQUATERNION
*q1
,
1501 const D3DXQUATERNION
*q2
, FLOAT t
)
1505 TRACE("out %p, q1 %p, q2 %p, t %f\n", out
, q1
, q2
, t
);
1508 dot
= D3DXQuaternionDot(q1
, q2
);
1515 if (1.0f
- dot
> 0.001f
)
1517 FLOAT theta
= acosf(dot
);
1519 temp
= sinf(theta
* temp
) / sinf(theta
);
1520 t
= sinf(theta
* t
) / sinf(theta
);
1523 out
->x
= temp
* q1
->x
+ t
* q2
->x
;
1524 out
->y
= temp
* q1
->y
+ t
* q2
->y
;
1525 out
->z
= temp
* q1
->z
+ t
* q2
->z
;
1526 out
->w
= temp
* q1
->w
+ t
* q2
->w
;
1531 D3DXQUATERNION
* WINAPI
D3DXQuaternionSquad(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq1
, const D3DXQUATERNION
*pq2
, const D3DXQUATERNION
*pq3
, const D3DXQUATERNION
*pq4
, FLOAT t
)
1533 D3DXQUATERNION temp1
, temp2
;
1535 TRACE("pout %p, pq1 %p, pq2 %p, pq3 %p, pq4 %p, t %f\n", pout
, pq1
, pq2
, pq3
, pq4
, t
);
1537 D3DXQuaternionSlerp(pout
, D3DXQuaternionSlerp(&temp1
, pq1
, pq4
, t
), D3DXQuaternionSlerp(&temp2
, pq2
, pq3
, t
), 2.0f
* t
* (1.0f
- t
));
1541 static D3DXQUATERNION
add_diff(const D3DXQUATERNION
*q1
, const D3DXQUATERNION
*q2
, const FLOAT add
)
1543 D3DXQUATERNION temp
;
1545 temp
.x
= q1
->x
+ add
* q2
->x
;
1546 temp
.y
= q1
->y
+ add
* q2
->y
;
1547 temp
.z
= q1
->z
+ add
* q2
->z
;
1548 temp
.w
= q1
->w
+ add
* q2
->w
;
1553 void WINAPI
D3DXQuaternionSquadSetup(D3DXQUATERNION
*paout
, D3DXQUATERNION
*pbout
, D3DXQUATERNION
*pcout
, const D3DXQUATERNION
*pq0
, const D3DXQUATERNION
*pq1
, const D3DXQUATERNION
*pq2
, const D3DXQUATERNION
*pq3
)
1555 D3DXQUATERNION q
, temp1
, temp2
, temp3
, zero
;
1556 D3DXQUATERNION aout
, cout
;
1558 TRACE("paout %p, pbout %p, pcout %p, pq0 %p, pq1 %p, pq2 %p, pq3 %p\n", paout
, pbout
, pcout
, pq0
, pq1
, pq2
, pq3
);
1565 if (D3DXQuaternionDot(pq0
, pq1
) < 0.0f
)
1566 temp2
= add_diff(&zero
, pq0
, -1.0f
);
1570 if (D3DXQuaternionDot(pq1
, pq2
) < 0.0f
)
1571 cout
= add_diff(&zero
, pq2
, -1.0f
);
1575 if (D3DXQuaternionDot(&cout
, pq3
) < 0.0f
)
1576 temp3
= add_diff(&zero
, pq3
, -1.0f
);
1580 D3DXQuaternionInverse(&temp1
, pq1
);
1581 D3DXQuaternionMultiply(&temp2
, &temp1
, &temp2
);
1582 D3DXQuaternionLn(&temp2
, &temp2
);
1583 D3DXQuaternionMultiply(&q
, &temp1
, &cout
);
1584 D3DXQuaternionLn(&q
, &q
);
1585 temp1
= add_diff(&temp2
, &q
, 1.0f
);
1590 D3DXQuaternionExp(&temp1
, &temp1
);
1591 D3DXQuaternionMultiply(&aout
, pq1
, &temp1
);
1593 D3DXQuaternionInverse(&temp1
, &cout
);
1594 D3DXQuaternionMultiply(&temp2
, &temp1
, pq1
);
1595 D3DXQuaternionLn(&temp2
, &temp2
);
1596 D3DXQuaternionMultiply(&q
, &temp1
, &temp3
);
1597 D3DXQuaternionLn(&q
, &q
);
1598 temp1
= add_diff(&temp2
, &q
, 1.0f
);
1603 D3DXQuaternionExp(&temp1
, &temp1
);
1604 D3DXQuaternionMultiply(pbout
, &cout
, &temp1
);
1609 void WINAPI
D3DXQuaternionToAxisAngle(const D3DXQUATERNION
*pq
, D3DXVECTOR3
*paxis
, FLOAT
*pangle
)
1611 TRACE("pq %p, paxis %p, pangle %p\n", pq
, paxis
, pangle
);
1620 *pangle
= 2.0f
* acosf(pq
->w
);
1623 /*_________________D3DXVec2_____________________*/
1625 D3DXVECTOR2
* WINAPI
D3DXVec2BaryCentric(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv1
, const D3DXVECTOR2
*pv2
, const D3DXVECTOR2
*pv3
, FLOAT f
, FLOAT g
)
1627 TRACE("pout %p, pv1 %p, pv2 %p, pv3 %p, f %f, g %f\n", pout
, pv1
, pv2
, pv3
, f
, g
);
1629 pout
->x
= (1.0f
-f
-g
) * (pv1
->x
) + f
* (pv2
->x
) + g
* (pv3
->x
);
1630 pout
->y
= (1.0f
-f
-g
) * (pv1
->y
) + f
* (pv2
->y
) + g
* (pv3
->y
);
1634 D3DXVECTOR2
* WINAPI
D3DXVec2CatmullRom(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv0
, const D3DXVECTOR2
*pv1
, const D3DXVECTOR2
*pv2
, const D3DXVECTOR2
*pv3
, FLOAT s
)
1636 TRACE("pout %p, pv0 %p, pv1 %p, pv2 %p, pv3 %p, s %f\n", pout
, pv0
, pv1
, pv2
, pv3
, s
);
1638 pout
->x
= 0.5f
* (2.0f
* pv1
->x
+ (pv2
->x
- pv0
->x
) *s
+ (2.0f
*pv0
->x
- 5.0f
* pv1
->x
+ 4.0f
* pv2
->x
- pv3
->x
) * s
* s
+ (pv3
->x
-3.0f
* pv2
->x
+ 3.0f
* pv1
->x
- pv0
->x
) * s
* s
* s
);
1639 pout
->y
= 0.5f
* (2.0f
* pv1
->y
+ (pv2
->y
- pv0
->y
) *s
+ (2.0f
*pv0
->y
- 5.0f
* pv1
->y
+ 4.0f
* pv2
->y
- pv3
->y
) * s
* s
+ (pv3
->y
-3.0f
* pv2
->y
+ 3.0f
* pv1
->y
- pv0
->y
) * s
* s
* s
);
1643 D3DXVECTOR2
* WINAPI
D3DXVec2Hermite(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv1
, const D3DXVECTOR2
*pt1
, const D3DXVECTOR2
*pv2
, const D3DXVECTOR2
*pt2
, FLOAT s
)
1645 FLOAT h1
, h2
, h3
, h4
;
1647 TRACE("pout %p, pv1 %p, pt1 %p, pv2 %p, pt2 %p, s %f\n", pout
, pv1
, pt1
, pv2
, pt2
, s
);
1649 h1
= 2.0f
* s
* s
* s
- 3.0f
* s
* s
+ 1.0f
;
1650 h2
= s
* s
* s
- 2.0f
* s
* s
+ s
;
1651 h3
= -2.0f
* s
* s
* s
+ 3.0f
* s
* s
;
1652 h4
= s
* s
* s
- s
* s
;
1654 pout
->x
= h1
* (pv1
->x
) + h2
* (pt1
->x
) + h3
* (pv2
->x
) + h4
* (pt2
->x
);
1655 pout
->y
= h1
* (pv1
->y
) + h2
* (pt1
->y
) + h3
* (pv2
->y
) + h4
* (pt2
->y
);
1659 D3DXVECTOR2
* WINAPI
D3DXVec2Normalize(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv
)
1663 TRACE("pout %p, pv %p\n", pout
, pv
);
1665 norm
= D3DXVec2Length(pv
);
1673 pout
->x
= pv
->x
/ norm
;
1674 pout
->y
= pv
->y
/ norm
;
1680 D3DXVECTOR4
* WINAPI
D3DXVec2Transform(D3DXVECTOR4
*pout
, const D3DXVECTOR2
*pv
, const D3DXMATRIX
*pm
)
1684 TRACE("pout %p, pv %p, pm %p\n", pout
, pv
, pm
);
1686 out
.x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[3][0];
1687 out
.y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[3][1];
1688 out
.z
= pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[3][2];
1689 out
.w
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[3][3];
1694 D3DXVECTOR4
* WINAPI
D3DXVec2TransformArray(D3DXVECTOR4
* out
, UINT outstride
, const D3DXVECTOR2
* in
, UINT instride
, const D3DXMATRIX
* matrix
, UINT elements
)
1698 TRACE("out %p, outstride %u, in %p, instride %u, matrix %p, elements %u\n", out
, outstride
, in
, instride
, matrix
, elements
);
1700 for (i
= 0; i
< elements
; ++i
) {
1702 (D3DXVECTOR4
*)((char*)out
+ outstride
* i
),
1703 (const D3DXVECTOR2
*)((const char*)in
+ instride
* i
),
1709 D3DXVECTOR2
* WINAPI
D3DXVec2TransformCoord(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv
, const D3DXMATRIX
*pm
)
1714 TRACE("pout %p, pv %p, pm %p\n", pout
, pv
, pm
);
1717 norm
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[3][3];
1719 pout
->x
= (pm
->m
[0][0] * v
.x
+ pm
->m
[1][0] * v
.y
+ pm
->m
[3][0]) / norm
;
1720 pout
->y
= (pm
->m
[0][1] * v
.x
+ pm
->m
[1][1] * v
.y
+ pm
->m
[3][1]) / norm
;
1725 D3DXVECTOR2
* WINAPI
D3DXVec2TransformCoordArray(D3DXVECTOR2
* out
, UINT outstride
, const D3DXVECTOR2
* in
, UINT instride
, const D3DXMATRIX
* matrix
, UINT elements
)
1729 TRACE("out %p, outstride %u, in %p, instride %u, matrix %p, elements %u\n", out
, outstride
, in
, instride
, matrix
, elements
);
1731 for (i
= 0; i
< elements
; ++i
) {
1732 D3DXVec2TransformCoord(
1733 (D3DXVECTOR2
*)((char*)out
+ outstride
* i
),
1734 (const D3DXVECTOR2
*)((const char*)in
+ instride
* i
),
1740 D3DXVECTOR2
* WINAPI
D3DXVec2TransformNormal(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv
, const D3DXMATRIX
*pm
)
1742 const D3DXVECTOR2 v
= *pv
;
1744 TRACE("pout %p, pv %p, pm %p\n", pout
, pv
, pm
);
1746 pout
->x
= pm
->m
[0][0] * v
.x
+ pm
->m
[1][0] * v
.y
;
1747 pout
->y
= pm
->m
[0][1] * v
.x
+ pm
->m
[1][1] * v
.y
;
1751 D3DXVECTOR2
* WINAPI
D3DXVec2TransformNormalArray(D3DXVECTOR2
* out
, UINT outstride
, const D3DXVECTOR2
*in
, UINT instride
, const D3DXMATRIX
*matrix
, UINT elements
)
1755 TRACE("out %p, outstride %u, in %p, instride %u, matrix %p, elements %u\n", out
, outstride
, in
, instride
, matrix
, elements
);
1757 for (i
= 0; i
< elements
; ++i
) {
1758 D3DXVec2TransformNormal(
1759 (D3DXVECTOR2
*)((char*)out
+ outstride
* i
),
1760 (const D3DXVECTOR2
*)((const char*)in
+ instride
* i
),
1766 /*_________________D3DXVec3_____________________*/
1768 D3DXVECTOR3
* WINAPI
D3DXVec3BaryCentric(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv1
, const D3DXVECTOR3
*pv2
, const D3DXVECTOR3
*pv3
, FLOAT f
, FLOAT g
)
1770 TRACE("pout %p, pv1 %p, pv2 %p, pv3 %p, f %f, g %f\n", pout
, pv1
, pv2
, pv3
, f
, g
);
1772 pout
->x
= (1.0f
-f
-g
) * (pv1
->x
) + f
* (pv2
->x
) + g
* (pv3
->x
);
1773 pout
->y
= (1.0f
-f
-g
) * (pv1
->y
) + f
* (pv2
->y
) + g
* (pv3
->y
);
1774 pout
->z
= (1.0f
-f
-g
) * (pv1
->z
) + f
* (pv2
->z
) + g
* (pv3
->z
);
1778 D3DXVECTOR3
* WINAPI
D3DXVec3CatmullRom( D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv0
, const D3DXVECTOR3
*pv1
, const D3DXVECTOR3
*pv2
, const D3DXVECTOR3
*pv3
, FLOAT s
)
1780 TRACE("pout %p, pv0 %p, pv1 %p, pv2 %p, pv3 %p, s %f\n", pout
, pv0
, pv1
, pv2
, pv3
, s
);
1782 pout
->x
= 0.5f
* (2.0f
* pv1
->x
+ (pv2
->x
- pv0
->x
) *s
+ (2.0f
*pv0
->x
- 5.0f
* pv1
->x
+ 4.0f
* pv2
->x
- pv3
->x
) * s
* s
+ (pv3
->x
-3.0f
* pv2
->x
+ 3.0f
* pv1
->x
- pv0
->x
) * s
* s
* s
);
1783 pout
->y
= 0.5f
* (2.0f
* pv1
->y
+ (pv2
->y
- pv0
->y
) *s
+ (2.0f
*pv0
->y
- 5.0f
* pv1
->y
+ 4.0f
* pv2
->y
- pv3
->y
) * s
* s
+ (pv3
->y
-3.0f
* pv2
->y
+ 3.0f
* pv1
->y
- pv0
->y
) * s
* s
* s
);
1784 pout
->z
= 0.5f
* (2.0f
* pv1
->z
+ (pv2
->z
- pv0
->z
) *s
+ (2.0f
*pv0
->z
- 5.0f
* pv1
->z
+ 4.0f
* pv2
->z
- pv3
->z
) * s
* s
+ (pv3
->z
-3.0f
* pv2
->z
+ 3.0f
* pv1
->z
- pv0
->z
) * s
* s
* s
);
1788 D3DXVECTOR3
* WINAPI
D3DXVec3Hermite(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv1
, const D3DXVECTOR3
*pt1
, const D3DXVECTOR3
*pv2
, const D3DXVECTOR3
*pt2
, FLOAT s
)
1790 FLOAT h1
, h2
, h3
, h4
;
1792 TRACE("pout %p, pv1 %p, pt1 %p, pv2 %p, pt2 %p, s %f\n", pout
, pv1
, pt1
, pv2
, pt2
, s
);
1794 h1
= 2.0f
* s
* s
* s
- 3.0f
* s
* s
+ 1.0f
;
1795 h2
= s
* s
* s
- 2.0f
* s
* s
+ s
;
1796 h3
= -2.0f
* s
* s
* s
+ 3.0f
* s
* s
;
1797 h4
= s
* s
* s
- s
* s
;
1799 pout
->x
= h1
* (pv1
->x
) + h2
* (pt1
->x
) + h3
* (pv2
->x
) + h4
* (pt2
->x
);
1800 pout
->y
= h1
* (pv1
->y
) + h2
* (pt1
->y
) + h3
* (pv2
->y
) + h4
* (pt2
->y
);
1801 pout
->z
= h1
* (pv1
->z
) + h2
* (pt1
->z
) + h3
* (pv2
->z
) + h4
* (pt2
->z
);
1805 D3DXVECTOR3
* WINAPI
D3DXVec3Normalize(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv
)
1809 TRACE("pout %p, pv %p\n", pout
, pv
);
1811 norm
= D3DXVec3Length(pv
);
1820 pout
->x
= pv
->x
/ norm
;
1821 pout
->y
= pv
->y
/ norm
;
1822 pout
->z
= pv
->z
/ norm
;
1828 D3DXVECTOR3
* WINAPI
D3DXVec3Project(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv
, const D3DVIEWPORT9
*pviewport
, const D3DXMATRIX
*pprojection
, const D3DXMATRIX
*pview
, const D3DXMATRIX
*pworld
)
1832 TRACE("pout %p, pv %p, pviewport %p, pprojection %p, pview %p, pworld %p\n", pout
, pv
, pviewport
, pprojection
, pview
, pworld
);
1834 D3DXMatrixIdentity(&m
);
1835 if (pworld
) D3DXMatrixMultiply(&m
, &m
, pworld
);
1836 if (pview
) D3DXMatrixMultiply(&m
, &m
, pview
);
1837 if (pprojection
) D3DXMatrixMultiply(&m
, &m
, pprojection
);
1839 D3DXVec3TransformCoord(pout
, pv
, &m
);
1843 pout
->x
= pviewport
->X
+ ( 1.0f
+ pout
->x
) * pviewport
->Width
/ 2.0f
;
1844 pout
->y
= pviewport
->Y
+ ( 1.0f
- pout
->y
) * pviewport
->Height
/ 2.0f
;
1845 pout
->z
= pviewport
->MinZ
+ pout
->z
* ( pviewport
->MaxZ
- pviewport
->MinZ
);
1850 D3DXVECTOR3
* WINAPI
D3DXVec3ProjectArray(D3DXVECTOR3
* out
, UINT outstride
, const D3DXVECTOR3
* in
, UINT instride
, const D3DVIEWPORT9
* viewport
, const D3DXMATRIX
* projection
, const D3DXMATRIX
* view
, const D3DXMATRIX
* world
, UINT elements
)
1854 TRACE("out %p, outstride %u, in %p, instride %u, viewport %p, projection %p, view %p, world %p, elements %u\n",
1855 out
, outstride
, in
, instride
, viewport
, projection
, view
, world
, elements
);
1857 for (i
= 0; i
< elements
; ++i
) {
1859 (D3DXVECTOR3
*)((char*)out
+ outstride
* i
),
1860 (const D3DXVECTOR3
*)((const char*)in
+ instride
* i
),
1861 viewport
, projection
, view
, world
);
1866 D3DXVECTOR4
* WINAPI
D3DXVec3Transform(D3DXVECTOR4
*pout
, const D3DXVECTOR3
*pv
, const D3DXMATRIX
*pm
)
1870 TRACE("pout %p, pv %p, pm %p\n", pout
, pv
, pm
);
1872 out
.x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[2][0] * pv
->z
+ pm
->m
[3][0];
1873 out
.y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[2][1] * pv
->z
+ pm
->m
[3][1];
1874 out
.z
= pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[2][2] * pv
->z
+ pm
->m
[3][2];
1875 out
.w
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[2][3] * pv
->z
+ pm
->m
[3][3];
1880 D3DXVECTOR4
* WINAPI
D3DXVec3TransformArray(D3DXVECTOR4
* out
, UINT outstride
, const D3DXVECTOR3
* in
, UINT instride
, const D3DXMATRIX
* matrix
, UINT elements
)
1884 TRACE("out %p, outstride %u, in %p, instride %u, matrix %p, elements %u\n", out
, outstride
, in
, instride
, matrix
, elements
);
1886 for (i
= 0; i
< elements
; ++i
) {
1888 (D3DXVECTOR4
*)((char*)out
+ outstride
* i
),
1889 (const D3DXVECTOR3
*)((const char*)in
+ instride
* i
),
1895 D3DXVECTOR3
* WINAPI
D3DXVec3TransformCoord(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv
, const D3DXMATRIX
*pm
)
1900 TRACE("pout %p, pv %p, pm %p\n", pout
, pv
, pm
);
1902 norm
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[2][3] *pv
->z
+ pm
->m
[3][3];
1904 out
.x
= (pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[2][0] * pv
->z
+ pm
->m
[3][0]) / norm
;
1905 out
.y
= (pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[2][1] * pv
->z
+ pm
->m
[3][1]) / norm
;
1906 out
.z
= (pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[2][2] * pv
->z
+ pm
->m
[3][2]) / norm
;
1913 D3DXVECTOR3
* WINAPI
D3DXVec3TransformCoordArray(D3DXVECTOR3
* out
, UINT outstride
, const D3DXVECTOR3
* in
, UINT instride
, const D3DXMATRIX
* matrix
, UINT elements
)
1917 TRACE("out %p, outstride %u, in %p, instride %u, matrix %p, elements %u\n", out
, outstride
, in
, instride
, matrix
, elements
);
1919 for (i
= 0; i
< elements
; ++i
) {
1920 D3DXVec3TransformCoord(
1921 (D3DXVECTOR3
*)((char*)out
+ outstride
* i
),
1922 (const D3DXVECTOR3
*)((const char*)in
+ instride
* i
),
1928 D3DXVECTOR3
* WINAPI
D3DXVec3TransformNormal(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv
, const D3DXMATRIX
*pm
)
1930 const D3DXVECTOR3 v
= *pv
;
1932 TRACE("pout %p, pv %p, pm %p\n", pout
, pv
, pm
);
1934 pout
->x
= pm
->m
[0][0] * v
.x
+ pm
->m
[1][0] * v
.y
+ pm
->m
[2][0] * v
.z
;
1935 pout
->y
= pm
->m
[0][1] * v
.x
+ pm
->m
[1][1] * v
.y
+ pm
->m
[2][1] * v
.z
;
1936 pout
->z
= pm
->m
[0][2] * v
.x
+ pm
->m
[1][2] * v
.y
+ pm
->m
[2][2] * v
.z
;
1941 D3DXVECTOR3
* WINAPI
D3DXVec3TransformNormalArray(D3DXVECTOR3
* out
, UINT outstride
, const D3DXVECTOR3
* in
, UINT instride
, const D3DXMATRIX
* matrix
, UINT elements
)
1945 TRACE("out %p, outstride %u, in %p, instride %u, matrix %p, elements %u\n", out
, outstride
, in
, instride
, matrix
, elements
);
1947 for (i
= 0; i
< elements
; ++i
) {
1948 D3DXVec3TransformNormal(
1949 (D3DXVECTOR3
*)((char*)out
+ outstride
* i
),
1950 (const D3DXVECTOR3
*)((const char*)in
+ instride
* i
),
1956 D3DXVECTOR3
* WINAPI
D3DXVec3Unproject(D3DXVECTOR3
*out
, const D3DXVECTOR3
*v
,
1957 const D3DVIEWPORT9
*viewport
, const D3DXMATRIX
*projection
, const D3DXMATRIX
*view
,
1958 const D3DXMATRIX
*world
)
1962 TRACE("out %p, v %p, viewport %p, projection %p, view %p, world %p.\n",
1963 out
, v
, viewport
, projection
, view
, world
);
1965 D3DXMatrixIdentity(&m
);
1967 D3DXMatrixMultiply(&m
, &m
, world
);
1969 D3DXMatrixMultiply(&m
, &m
, view
);
1971 D3DXMatrixMultiply(&m
, &m
, projection
);
1972 D3DXMatrixInverse(&m
, NULL
, &m
);
1977 out
->x
= 2.0f
* (out
->x
- viewport
->X
) / viewport
->Width
- 1.0f
;
1978 out
->y
= 1.0f
- 2.0f
* (out
->y
- viewport
->Y
) / viewport
->Height
;
1979 out
->z
= (out
->z
- viewport
->MinZ
) / (viewport
->MaxZ
- viewport
->MinZ
);
1981 D3DXVec3TransformCoord(out
, out
, &m
);
1985 D3DXVECTOR3
* WINAPI
D3DXVec3UnprojectArray(D3DXVECTOR3
* out
, UINT outstride
, const D3DXVECTOR3
* in
, UINT instride
, const D3DVIEWPORT9
* viewport
, const D3DXMATRIX
* projection
, const D3DXMATRIX
* view
, const D3DXMATRIX
* world
, UINT elements
)
1989 TRACE("out %p, outstride %u, in %p, instride %u, viewport %p, projection %p, view %p, world %p, elements %u\n",
1990 out
, outstride
, in
, instride
, viewport
, projection
, view
, world
, elements
);
1992 for (i
= 0; i
< elements
; ++i
) {
1994 (D3DXVECTOR3
*)((char*)out
+ outstride
* i
),
1995 (const D3DXVECTOR3
*)((const char*)in
+ instride
* i
),
1996 viewport
, projection
, view
, world
);
2001 /*_________________D3DXVec4_____________________*/
2003 D3DXVECTOR4
* WINAPI
D3DXVec4BaryCentric(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv1
, const D3DXVECTOR4
*pv2
, const D3DXVECTOR4
*pv3
, FLOAT f
, FLOAT g
)
2005 TRACE("pout %p, pv1 %p, pv2 %p, pv3 %p, f %f, g %f\n", pout
, pv1
, pv2
, pv3
, f
, g
);
2007 pout
->x
= (1.0f
-f
-g
) * (pv1
->x
) + f
* (pv2
->x
) + g
* (pv3
->x
);
2008 pout
->y
= (1.0f
-f
-g
) * (pv1
->y
) + f
* (pv2
->y
) + g
* (pv3
->y
);
2009 pout
->z
= (1.0f
-f
-g
) * (pv1
->z
) + f
* (pv2
->z
) + g
* (pv3
->z
);
2010 pout
->w
= (1.0f
-f
-g
) * (pv1
->w
) + f
* (pv2
->w
) + g
* (pv3
->w
);
2014 D3DXVECTOR4
* WINAPI
D3DXVec4CatmullRom(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv0
, const D3DXVECTOR4
*pv1
, const D3DXVECTOR4
*pv2
, const D3DXVECTOR4
*pv3
, FLOAT s
)
2016 TRACE("pout %p, pv0 %p, pv1 %p, pv2 %p, pv3 %p, s %f\n", pout
, pv0
, pv1
, pv2
, pv3
, s
);
2018 pout
->x
= 0.5f
* (2.0f
* pv1
->x
+ (pv2
->x
- pv0
->x
) *s
+ (2.0f
*pv0
->x
- 5.0f
* pv1
->x
+ 4.0f
* pv2
->x
- pv3
->x
) * s
* s
+ (pv3
->x
-3.0f
* pv2
->x
+ 3.0f
* pv1
->x
- pv0
->x
) * s
* s
* s
);
2019 pout
->y
= 0.5f
* (2.0f
* pv1
->y
+ (pv2
->y
- pv0
->y
) *s
+ (2.0f
*pv0
->y
- 5.0f
* pv1
->y
+ 4.0f
* pv2
->y
- pv3
->y
) * s
* s
+ (pv3
->y
-3.0f
* pv2
->y
+ 3.0f
* pv1
->y
- pv0
->y
) * s
* s
* s
);
2020 pout
->z
= 0.5f
* (2.0f
* pv1
->z
+ (pv2
->z
- pv0
->z
) *s
+ (2.0f
*pv0
->z
- 5.0f
* pv1
->z
+ 4.0f
* pv2
->z
- pv3
->z
) * s
* s
+ (pv3
->z
-3.0f
* pv2
->z
+ 3.0f
* pv1
->z
- pv0
->z
) * s
* s
* s
);
2021 pout
->w
= 0.5f
* (2.0f
* pv1
->w
+ (pv2
->w
- pv0
->w
) *s
+ (2.0f
*pv0
->w
- 5.0f
* pv1
->w
+ 4.0f
* pv2
->w
- pv3
->w
) * s
* s
+ (pv3
->w
-3.0f
* pv2
->w
+ 3.0f
* pv1
->w
- pv0
->w
) * s
* s
* s
);
2025 D3DXVECTOR4
* WINAPI
D3DXVec4Cross(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv1
, const D3DXVECTOR4
*pv2
, const D3DXVECTOR4
*pv3
)
2029 TRACE("pout %p, pv1 %p, pv2 %p, pv3 %p\n", pout
, pv1
, pv2
, pv3
);
2031 out
.x
= pv1
->y
* (pv2
->z
* pv3
->w
- pv3
->z
* pv2
->w
) - pv1
->z
* (pv2
->y
* pv3
->w
- pv3
->y
* pv2
->w
) + pv1
->w
* (pv2
->y
* pv3
->z
- pv2
->z
*pv3
->y
);
2032 out
.y
= -(pv1
->x
* (pv2
->z
* pv3
->w
- pv3
->z
* pv2
->w
) - pv1
->z
* (pv2
->x
* pv3
->w
- pv3
->x
* pv2
->w
) + pv1
->w
* (pv2
->x
* pv3
->z
- pv3
->x
* pv2
->z
));
2033 out
.z
= pv1
->x
* (pv2
->y
* pv3
->w
- pv3
->y
* pv2
->w
) - pv1
->y
* (pv2
->x
*pv3
->w
- pv3
->x
* pv2
->w
) + pv1
->w
* (pv2
->x
* pv3
->y
- pv3
->x
* pv2
->y
);
2034 out
.w
= -(pv1
->x
* (pv2
->y
* pv3
->z
- pv3
->y
* pv2
->z
) - pv1
->y
* (pv2
->x
* pv3
->z
- pv3
->x
*pv2
->z
) + pv1
->z
* (pv2
->x
* pv3
->y
- pv3
->x
* pv2
->y
));
2039 D3DXVECTOR4
* WINAPI
D3DXVec4Hermite(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv1
, const D3DXVECTOR4
*pt1
, const D3DXVECTOR4
*pv2
, const D3DXVECTOR4
*pt2
, FLOAT s
)
2041 FLOAT h1
, h2
, h3
, h4
;
2043 TRACE("pout %p, pv1 %p, pt1 %p, pv2 %p, pt2 %p, s %f\n", pout
, pv1
, pt1
, pv2
, pt2
, s
);
2045 h1
= 2.0f
* s
* s
* s
- 3.0f
* s
* s
+ 1.0f
;
2046 h2
= s
* s
* s
- 2.0f
* s
* s
+ s
;
2047 h3
= -2.0f
* s
* s
* s
+ 3.0f
* s
* s
;
2048 h4
= s
* s
* s
- s
* s
;
2050 pout
->x
= h1
* (pv1
->x
) + h2
* (pt1
->x
) + h3
* (pv2
->x
) + h4
* (pt2
->x
);
2051 pout
->y
= h1
* (pv1
->y
) + h2
* (pt1
->y
) + h3
* (pv2
->y
) + h4
* (pt2
->y
);
2052 pout
->z
= h1
* (pv1
->z
) + h2
* (pt1
->z
) + h3
* (pv2
->z
) + h4
* (pt2
->z
);
2053 pout
->w
= h1
* (pv1
->w
) + h2
* (pt1
->w
) + h3
* (pv2
->w
) + h4
* (pt2
->w
);
2057 D3DXVECTOR4
* WINAPI
D3DXVec4Normalize(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv
)
2061 TRACE("pout %p, pv %p\n", pout
, pv
);
2063 norm
= D3DXVec4Length(pv
);
2065 pout
->x
= pv
->x
/ norm
;
2066 pout
->y
= pv
->y
/ norm
;
2067 pout
->z
= pv
->z
/ norm
;
2068 pout
->w
= pv
->w
/ norm
;
2073 D3DXVECTOR4
* WINAPI
D3DXVec4Transform(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv
, const D3DXMATRIX
*pm
)
2077 TRACE("pout %p, pv %p, pm %p\n", pout
, pv
, pm
);
2079 out
.x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[2][0] * pv
->z
+ pm
->m
[3][0] * pv
->w
;
2080 out
.y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[2][1] * pv
->z
+ pm
->m
[3][1] * pv
->w
;
2081 out
.z
= pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[2][2] * pv
->z
+ pm
->m
[3][2] * pv
->w
;
2082 out
.w
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[2][3] * pv
->z
+ pm
->m
[3][3] * pv
->w
;
2087 D3DXVECTOR4
* WINAPI
D3DXVec4TransformArray(D3DXVECTOR4
* out
, UINT outstride
, const D3DXVECTOR4
* in
, UINT instride
, const D3DXMATRIX
* matrix
, UINT elements
)
2091 TRACE("out %p, outstride %u, in %p, instride %u, matrix %p, elements %u\n", out
, outstride
, in
, instride
, matrix
, elements
);
2093 for (i
= 0; i
< elements
; ++i
) {
2095 (D3DXVECTOR4
*)((char*)out
+ outstride
* i
),
2096 (const D3DXVECTOR4
*)((const char*)in
+ instride
* i
),
2102 unsigned short float_32_to_16(const float in
)
2104 int exp
= 0, origexp
;
2105 float tmp
= fabsf(in
);
2106 int sign
= (copysignf(1, in
) < 0);
2107 unsigned int mantissa
;
2110 /* Deal with special numbers */
2111 if (isinf(in
)) return (sign
? 0xffff : 0x7fff);
2112 if (isnan(in
)) return (sign
? 0xffff : 0x7fff);
2113 if (in
== 0.0f
) return (sign
? 0x8000 : 0x0000);
2115 if (tmp
< (float)(1u << 10))
2121 } while (tmp
< (float)(1u << 10));
2123 else if (tmp
>= (float)(1u << 11))
2129 } while (tmp
>= (float)(1u << 11));
2132 exp
+= 10; /* Normalize the mantissa */
2133 exp
+= 15; /* Exponent is encoded with excess 15 */
2137 mantissa
= (unsigned int) tmp
;
2138 if ((tmp
- mantissa
== 0.5f
&& mantissa
% 2 == 1) || /* round half to even */
2139 (tmp
- mantissa
> 0.5f
))
2141 mantissa
++; /* round to nearest, away from zero */
2143 if (mantissa
== 2048)
2152 ret
= 0x7fff; /* INF */
2156 unsigned int rounding
= 0;
2158 /* Denormalized half float */
2160 /* return 0x0000 (=0.0) for numbers too small to represent in half floats */
2162 return (sign
? 0x8000 : 0x0000);
2166 /* the 13 extra bits from single precision are used for rounding */
2167 mantissa
= (unsigned int)(tmp
* (1u << 13));
2168 mantissa
>>= 1 - exp
; /* denormalize */
2170 mantissa
-= ~(mantissa
>> 13) & 1; /* round half to even */
2171 /* remove 13 least significant bits to get half float precision */
2173 rounding
= mantissa
& 1;
2176 ret
= mantissa
+ rounding
;
2180 ret
= (exp
<< 10) | (mantissa
& 0x3ff);
2183 ret
|= ((sign
? 1 : 0) << 15); /* Add the sign */
2187 D3DXFLOAT16
*WINAPI
D3DXFloat32To16Array(D3DXFLOAT16
*pout
, const FLOAT
*pin
, UINT n
)
2191 TRACE("pout %p, pin %p, n %u\n", pout
, pin
, n
);
2193 for (i
= 0; i
< n
; ++i
)
2195 pout
[i
].value
= float_32_to_16(pin
[i
]);
2201 /* Native d3dx9's D3DXFloat16to32Array lacks support for NaN and Inf. Specifically, e = 16 is treated as a
2202 * regular number - e.g., 0x7fff is converted to 131008.0 and 0xffff to -131008.0. */
2203 float float_16_to_32(const unsigned short in
)
2205 const unsigned short s
= (in
& 0x8000);
2206 const unsigned short e
= (in
& 0x7C00) >> 10;
2207 const unsigned short m
= in
& 0x3FF;
2208 const float sgn
= (s
? -1.0f
: 1.0f
);
2212 if (m
== 0) return sgn
* 0.0f
; /* +0.0 or -0.0 */
2213 else return sgn
* powf(2, -14.0f
) * (m
/ 1024.0f
);
2217 return sgn
* powf(2, e
- 15.0f
) * (1.0f
+ (m
/ 1024.0f
));
2221 FLOAT
*WINAPI
D3DXFloat16To32Array(FLOAT
*pout
, const D3DXFLOAT16
*pin
, UINT n
)
2225 TRACE("pout %p, pin %p, n %u\n", pout
, pin
, n
);
2227 for (i
= 0; i
< n
; ++i
)
2229 pout
[i
] = float_16_to_32(pin
[i
].value
);
2235 /*_________________D3DXSH________________*/
2237 FLOAT
* WINAPI
D3DXSHAdd(FLOAT
*out
, UINT order
, const FLOAT
*a
, const FLOAT
*b
)
2241 TRACE("out %p, order %u, a %p, b %p\n", out
, order
, a
, b
);
2243 for (i
= 0; i
< order
* order
; i
++)
2244 out
[i
] = a
[i
] + b
[i
];
2249 FLOAT WINAPI
D3DXSHDot(UINT order
, const FLOAT
*a
, const FLOAT
*b
)
2254 TRACE("order %u, a %p, b %p\n", order
, a
, b
);
2257 for (i
= 1; i
< order
* order
; i
++)
2263 static void weightedcapintegrale(FLOAT
*out
, UINT order
, FLOAT angle
)
2267 coeff
[0] = cosf(angle
);
2269 out
[0] = 2.0f
* D3DX_PI
* (1.0f
- coeff
[0]);
2270 out
[1] = D3DX_PI
* sinf(angle
) * sinf(angle
);
2274 out
[2] = coeff
[0] * out
[1];
2278 coeff
[1] = coeff
[0] * coeff
[0];
2279 coeff
[2] = coeff
[1] * coeff
[1];
2281 out
[3] = D3DX_PI
* (-1.25f
* coeff
[2] + 1.5f
* coeff
[1] - 0.25f
);
2285 out
[4] = -0.25f
* D3DX_PI
* coeff
[0] * (7.0f
* coeff
[2] - 10.0f
* coeff
[1] + 3.0f
);
2289 out
[5] = D3DX_PI
* (-2.625f
* coeff
[2] * coeff
[1] + 4.375f
* coeff
[2] - 1.875f
* coeff
[1] + 0.125f
);
2292 HRESULT WINAPI
D3DXSHEvalConeLight(UINT order
, const D3DXVECTOR3
*dir
, FLOAT radius
,
2293 FLOAT Rintensity
, FLOAT Gintensity
, FLOAT Bintensity
, FLOAT
*rout
, FLOAT
*gout
, FLOAT
*bout
)
2295 FLOAT cap
[6], clamped_angle
, norm
, scale
, temp
;
2298 TRACE("order %u, dir %p, radius %f, red %f, green %f, blue %f, rout %p, gout %p, bout %p\n",
2299 order
, dir
, radius
, Rintensity
, Gintensity
, Bintensity
, rout
, gout
, bout
);
2302 return D3DXSHEvalDirectionalLight(order
, dir
, Rintensity
, Gintensity
, Bintensity
, rout
, gout
, bout
);
2304 clamped_angle
= (radius
> D3DX_PI
/ 2.0f
) ? (D3DX_PI
/ 2.0f
) : radius
;
2305 norm
= sinf(clamped_angle
) * sinf(clamped_angle
);
2307 if (order
> D3DXSH_MAXORDER
)
2309 WARN("Order clamped at D3DXSH_MAXORDER\n");
2310 order
= D3DXSH_MAXORDER
;
2313 weightedcapintegrale(cap
, order
, radius
);
2314 D3DXSHEvalDirection(rout
, order
, dir
);
2316 for (i
= 0; i
< order
; i
++)
2318 scale
= cap
[i
] / norm
;
2320 for (j
= 0; j
< 2 * i
+ 1; j
++)
2323 temp
= rout
[index
] * scale
;
2325 rout
[index
] = temp
* Rintensity
;
2327 gout
[index
] = temp
* Gintensity
;
2329 bout
[index
] = temp
* Bintensity
;
2336 FLOAT
* WINAPI
D3DXSHEvalDirection(FLOAT
*out
, UINT order
, const D3DXVECTOR3
*dir
)
2338 const FLOAT dirxx
= dir
->x
* dir
->x
;
2339 const FLOAT dirxy
= dir
->x
* dir
->y
;
2340 const FLOAT dirxz
= dir
->x
* dir
->z
;
2341 const FLOAT diryy
= dir
->y
* dir
->y
;
2342 const FLOAT diryz
= dir
->y
* dir
->z
;
2343 const FLOAT dirzz
= dir
->z
* dir
->z
;
2344 const FLOAT dirxxxx
= dirxx
* dirxx
;
2345 const FLOAT diryyyy
= diryy
* diryy
;
2346 const FLOAT dirzzzz
= dirzz
* dirzz
;
2347 const FLOAT dirxyxy
= dirxy
* dirxy
;
2349 TRACE("out %p, order %u, dir %p\n", out
, order
, dir
);
2351 if ((order
< D3DXSH_MINORDER
) || (order
> D3DXSH_MAXORDER
))
2354 out
[0] = 0.5f
/ sqrtf(D3DX_PI
);
2355 out
[1] = -0.5f
/ sqrtf(D3DX_PI
/ 3.0f
) * dir
->y
;
2356 out
[2] = 0.5f
/ sqrtf(D3DX_PI
/ 3.0f
) * dir
->z
;
2357 out
[3] = -0.5f
/ sqrtf(D3DX_PI
/ 3.0f
) * dir
->x
;
2361 out
[4] = 0.5f
/ sqrtf(D3DX_PI
/ 15.0f
) * dirxy
;
2362 out
[5] = -0.5f
/ sqrtf(D3DX_PI
/ 15.0f
) * diryz
;
2363 out
[6] = 0.25f
/ sqrtf(D3DX_PI
/ 5.0f
) * (3.0f
* dirzz
- 1.0f
);
2364 out
[7] = -0.5f
/ sqrtf(D3DX_PI
/ 15.0f
) * dirxz
;
2365 out
[8] = 0.25f
/ sqrtf(D3DX_PI
/ 15.0f
) * (dirxx
- diryy
);
2369 out
[9] = -sqrtf(70.0f
/ D3DX_PI
) / 8.0f
* dir
->y
* (3.0f
* dirxx
- diryy
);
2370 out
[10] = sqrtf(105.0f
/ D3DX_PI
) / 2.0f
* dirxy
* dir
->z
;
2371 out
[11] = -sqrtf(42.0f
/ D3DX_PI
) / 8.0f
* dir
->y
* (-1.0f
+ 5.0f
* dirzz
);
2372 out
[12] = sqrtf(7.0f
/ D3DX_PI
) / 4.0f
* dir
->z
* (5.0f
* dirzz
- 3.0f
);
2373 out
[13] = sqrtf(42.0f
/ D3DX_PI
) / 8.0f
* dir
->x
* (1.0f
- 5.0f
* dirzz
);
2374 out
[14] = sqrtf(105.0f
/ D3DX_PI
) / 4.0f
* dir
->z
* (dirxx
- diryy
);
2375 out
[15] = -sqrtf(70.0f
/ D3DX_PI
) / 8.0f
* dir
->x
* (dirxx
- 3.0f
* diryy
);
2379 out
[16] = 0.75f
* sqrtf(35.0f
/ D3DX_PI
) * dirxy
* (dirxx
- diryy
);
2380 out
[17] = 3.0f
* dir
->z
* out
[9];
2381 out
[18] = 0.75f
* sqrtf(5.0f
/ D3DX_PI
) * dirxy
* (7.0f
* dirzz
- 1.0f
);
2382 out
[19] = 0.375f
* sqrtf(10.0f
/ D3DX_PI
) * diryz
* (3.0f
- 7.0f
* dirzz
);
2383 out
[20] = 3.0f
/ (16.0f
* sqrtf(D3DX_PI
)) * (35.0f
* dirzzzz
- 30.f
* dirzz
+ 3.0f
);
2384 out
[21] = 0.375f
* sqrtf(10.0f
/ D3DX_PI
) * dirxz
* (3.0f
- 7.0f
* dirzz
);
2385 out
[22] = 0.375f
* sqrtf(5.0f
/ D3DX_PI
) * (dirxx
- diryy
) * (7.0f
* dirzz
- 1.0f
);
2386 out
[23] = 3.0f
* dir
->z
* out
[15];
2387 out
[24] = 3.0f
/ 16.0f
* sqrtf(35.0f
/ D3DX_PI
) * (dirxxxx
- 6.0f
* dirxyxy
+ diryyyy
);
2391 out
[25] = -3.0f
/ 32.0f
* sqrtf(154.0f
/ D3DX_PI
) * dir
->y
* (5.0f
* dirxxxx
- 10.0f
* dirxyxy
+ diryyyy
);
2392 out
[26] = 0.75f
* sqrtf(385.0f
/ D3DX_PI
) * dirxy
* dir
->z
* (dirxx
- diryy
);
2393 out
[27] = sqrtf(770.0f
/ D3DX_PI
) / 32.0f
* dir
->y
* (3.0f
* dirxx
- diryy
) * (1.0f
- 9.0f
* dirzz
);
2394 out
[28] = sqrtf(1155.0f
/ D3DX_PI
) / 4.0f
* dirxy
* dir
->z
* (3.0f
* dirzz
- 1.0f
);
2395 out
[29] = sqrtf(165.0f
/ D3DX_PI
) / 16.0f
* dir
->y
* (14.0f
* dirzz
- 21.0f
* dirzzzz
- 1.0f
);
2396 out
[30] = sqrtf(11.0f
/ D3DX_PI
) / 16.0f
* dir
->z
* (63.0f
* dirzzzz
- 70.0f
* dirzz
+ 15.0f
);
2397 out
[31] = sqrtf(165.0f
/ D3DX_PI
) / 16.0f
* dir
->x
* (14.0f
* dirzz
- 21.0f
* dirzzzz
- 1.0f
);
2398 out
[32] = sqrtf(1155.0f
/ D3DX_PI
) / 8.0f
* dir
->z
* (dirxx
- diryy
) * (3.0f
* dirzz
- 1.0f
);
2399 out
[33] = sqrtf(770.0f
/ D3DX_PI
) / 32.0f
* dir
->x
* (dirxx
- 3.0f
* diryy
) * (1.0f
- 9.0f
* dirzz
);
2400 out
[34] = 3.0f
/ 16.0f
* sqrtf(385.0f
/ D3DX_PI
) * dir
->z
* (dirxxxx
- 6.0f
* dirxyxy
+ diryyyy
);
2401 out
[35] = -3.0f
/ 32.0f
* sqrtf(154.0f
/ D3DX_PI
) * dir
->x
* (dirxxxx
- 10.0f
* dirxyxy
+ 5.0f
* diryyyy
);
2406 HRESULT WINAPI
D3DXSHEvalDirectionalLight(UINT order
, const D3DXVECTOR3
*dir
, FLOAT Rintensity
, FLOAT Gintensity
, FLOAT Bintensity
, FLOAT
*Rout
, FLOAT
*Gout
, FLOAT
*Bout
)
2411 TRACE("Order %u, Vector %p, Red %f, Green %f, Blue %f, Rout %p, Gout %p, Bout %p\n", order
, dir
, Rintensity
, Gintensity
, Bintensity
, Rout
, Gout
, Bout
);
2420 D3DXSHEvalDirection(Rout
, order
, dir
);
2421 for (j
= 0; j
< order
* order
; j
++)
2425 Rout
[j
] = Rintensity
* temp
;
2427 Gout
[j
] = Gintensity
* temp
;
2429 Bout
[j
] = Bintensity
* temp
;
2435 HRESULT WINAPI
D3DXSHEvalHemisphereLight(UINT order
, const D3DXVECTOR3
*dir
, D3DXCOLOR top
, D3DXCOLOR bottom
,
2436 FLOAT
*rout
, FLOAT
*gout
, FLOAT
*bout
)
2438 FLOAT a
[2], temp
[4];
2441 TRACE("order %u, dir %p, rout %p, gout %p, bout %p\n", order
, dir
, rout
, gout
, bout
);
2443 D3DXSHEvalDirection(temp
, 2, dir
);
2445 a
[0] = (top
.r
+ bottom
.r
) * 3.0f
* D3DX_PI
;
2446 a
[1] = (top
.r
- bottom
.r
) * D3DX_PI
;
2447 for (i
= 0; i
< order
; i
++)
2448 for (j
= 0; j
< 2 * i
+ 1; j
++)
2450 rout
[i
* i
+ j
] = temp
[i
* i
+ j
] * a
[i
];
2452 rout
[i
* i
+ j
] = 0.0f
;
2456 a
[0] = (top
.g
+ bottom
.g
) * 3.0f
* D3DX_PI
;
2457 a
[1] = (top
.g
- bottom
.g
) * D3DX_PI
;
2458 for (i
= 0; i
< order
; i
++)
2459 for (j
= 0; j
< 2 * i
+ 1; j
++)
2461 gout
[i
* i
+ j
] = temp
[i
* i
+ j
] * a
[i
];
2463 gout
[i
* i
+ j
] = 0.0f
;
2468 a
[0] = (top
.b
+ bottom
.b
) * 3.0f
* D3DX_PI
;
2469 a
[1] = (top
.b
- bottom
.b
) * D3DX_PI
;
2470 for (i
= 0; i
< order
; i
++)
2471 for (j
= 0; j
< 2 * i
+ 1; j
++)
2473 bout
[i
* i
+ j
] = temp
[i
* i
+ j
] * a
[i
];
2475 bout
[i
* i
+ j
] = 0.0f
;
2481 HRESULT WINAPI
D3DXSHEvalSphericalLight(UINT order
, const D3DXVECTOR3
*dir
, FLOAT radius
,
2482 FLOAT Rintensity
, FLOAT Gintensity
, FLOAT Bintensity
, FLOAT
*rout
, FLOAT
*gout
, FLOAT
*bout
)
2485 FLOAT cap
[6], clamped_angle
, dist
, temp
;
2488 TRACE("order %u, dir %p, radius %f, red %f, green %f, blue %f, rout %p, gout %p, bout %p\n",
2489 order
, dir
, radius
, Rintensity
, Gintensity
, Bintensity
, rout
, gout
, bout
);
2491 if (order
> D3DXSH_MAXORDER
)
2493 WARN("Order clamped at D3DXSH_MAXORDER\n");
2494 order
= D3DXSH_MAXORDER
;
2500 dist
= D3DXVec3Length(dir
);
2501 clamped_angle
= (dist
<= radius
) ? D3DX_PI
/ 2.0f
: asinf(radius
/ dist
);
2503 weightedcapintegrale(cap
, order
, clamped_angle
);
2504 D3DXVec3Normalize(&normal
, dir
);
2505 D3DXSHEvalDirection(rout
, order
, &normal
);
2507 for (i
= 0; i
< order
; i
++)
2508 for (j
= 0; j
< 2 * i
+ 1; j
++)
2511 temp
= rout
[index
] * cap
[i
];
2513 rout
[index
] = temp
* Rintensity
;
2515 gout
[index
] = temp
* Gintensity
;
2517 bout
[index
] = temp
* Bintensity
;
2523 FLOAT
* WINAPI
D3DXSHMultiply2(FLOAT
*out
, const FLOAT
*a
, const FLOAT
*b
)
2527 TRACE("out %p, a %p, b %p\n", out
, a
, b
);
2529 ta
= 0.28209479f
* a
[0];
2530 tb
= 0.28209479f
* b
[0];
2532 out
[0] = 0.28209479f
* D3DXSHDot(2, a
, b
);
2533 out
[1] = ta
* b
[1] + tb
* a
[1];
2534 out
[2] = ta
* b
[2] + tb
* a
[2];
2535 out
[3] = ta
* b
[3] + tb
* a
[3];
2540 FLOAT
* WINAPI
D3DXSHMultiply3(FLOAT
*out
, const FLOAT
*a
, const FLOAT
*b
)
2544 TRACE("out %p, a %p, b %p\n", out
, a
, b
);
2546 out
[0] = 0.28209479f
* a
[0] * b
[0];
2548 ta
= 0.28209479f
* a
[0] - 0.12615663f
* a
[6] - 0.21850969f
* a
[8];
2549 tb
= 0.28209479f
* b
[0] - 0.12615663f
* b
[6] - 0.21850969f
* b
[8];
2550 out
[1] = ta
* b
[1] + tb
* a
[1];
2552 out
[0] += 0.28209479f
* t
;
2553 out
[6] = -0.12615663f
* t
;
2554 out
[8] = -0.21850969f
* t
;
2556 ta
= 0.21850969f
* a
[5];
2557 tb
= 0.21850969f
* b
[5];
2558 out
[1] += ta
* b
[2] + tb
* a
[2];
2559 out
[2] = ta
* b
[1] + tb
* a
[1];
2560 t
= a
[1] * b
[2] +a
[2] * b
[1];
2561 out
[5] = 0.21850969f
* t
;
2563 ta
= 0.21850969f
* a
[4];
2564 tb
= 0.21850969f
* b
[4];
2565 out
[1] += ta
* b
[3] + tb
* a
[3];
2566 out
[3] = ta
* b
[1] + tb
* a
[1];
2567 t
= a
[1] * b
[3] + a
[3] * b
[1];
2568 out
[4] = 0.21850969f
* t
;
2570 ta
= 0.28209480f
* a
[0] + 0.25231326f
* a
[6];
2571 tb
= 0.28209480f
* b
[0] + 0.25231326f
* b
[6];
2572 out
[2] += ta
* b
[2] + tb
* a
[2];
2574 out
[0] += 0.28209480f
* t
;
2575 out
[6] += 0.25231326f
* t
;
2577 ta
= 0.21850969f
* a
[7];
2578 tb
= 0.21850969f
* b
[7];
2579 out
[2] += ta
* b
[3] + tb
* a
[3];
2580 out
[3] += ta
* b
[2] + tb
* a
[2];
2581 t
= a
[2] * b
[3] + a
[3] * b
[2];
2582 out
[7] = 0.21850969f
* t
;
2584 ta
= 0.28209479f
* a
[0] - 0.12615663f
* a
[6] + 0.21850969f
* a
[8];
2585 tb
= 0.28209479f
* b
[0] - 0.12615663f
* b
[6] + 0.21850969f
* b
[8];
2586 out
[3] += ta
* b
[3] + tb
* a
[3];
2588 out
[0] += 0.28209479f
* t
;
2589 out
[6] -= 0.12615663f
* t
;
2590 out
[8] += 0.21850969f
* t
;
2592 ta
= 0.28209479f
* a
[0] - 0.18022375f
* a
[6];
2593 tb
= 0.28209479f
* b
[0] - 0.18022375f
* b
[6];
2594 out
[4] += ta
* b
[4] + tb
* a
[4];
2596 out
[0] += 0.28209479f
* t
;
2597 out
[6] -= 0.18022375f
* t
;
2599 ta
= 0.15607835f
* a
[7];
2600 tb
= 0.15607835f
* b
[7];
2601 out
[4] += ta
* b
[5] + tb
* a
[5];
2602 out
[5] += ta
* b
[4] + tb
* a
[4];
2603 t
= a
[4] * b
[5] + a
[5] * b
[4];
2604 out
[7] += 0.15607835f
* t
;
2606 ta
= 0.28209479f
* a
[0] + 0.09011188f
* a
[6] - 0.15607835f
* a
[8];
2607 tb
= 0.28209479f
* b
[0] + 0.09011188f
* b
[6] - 0.15607835f
* b
[8];
2608 out
[5] += ta
* b
[5] + tb
* a
[5];
2610 out
[0] += 0.28209479f
* t
;
2611 out
[6] += 0.09011188f
* t
;
2612 out
[8] -= 0.15607835f
* t
;
2614 ta
= 0.28209480f
* a
[0];
2615 tb
= 0.28209480f
* b
[0];
2616 out
[6] += ta
* b
[6] + tb
* a
[6];
2618 out
[0] += 0.28209480f
* t
;
2619 out
[6] += 0.18022376f
* t
;
2621 ta
= 0.28209479f
* a
[0] + 0.09011188f
* a
[6] + 0.15607835f
* a
[8];
2622 tb
= 0.28209479f
* b
[0] + 0.09011188f
* b
[6] + 0.15607835f
* b
[8];
2623 out
[7] += ta
* b
[7] + tb
* a
[7];
2625 out
[0] += 0.28209479f
* t
;
2626 out
[6] += 0.09011188f
* t
;
2627 out
[8] += 0.15607835f
* t
;
2629 ta
= 0.28209479f
* a
[0] - 0.18022375f
* a
[6];
2630 tb
= 0.28209479f
* b
[0] - 0.18022375f
* b
[6];
2631 out
[8] += ta
* b
[8] + tb
* a
[8];
2633 out
[0] += 0.28209479f
* t
;
2634 out
[6] -= 0.18022375f
* t
;
2639 FLOAT
* WINAPI
D3DXSHMultiply4(FLOAT
*out
, const FLOAT
*a
, const FLOAT
*b
)
2643 TRACE("out %p, a %p, b %p\n", out
, a
, b
);
2645 out
[0] = 0.28209479f
* a
[0] * b
[0];
2647 ta
= 0.28209479f
* a
[0] - 0.12615663f
* a
[6] - 0.21850969f
* a
[8];
2648 tb
= 0.28209479f
* b
[0] - 0.12615663f
* b
[6] - 0.21850969f
* b
[8];
2649 out
[1] = ta
* b
[1] + tb
* a
[1];
2651 out
[0] += 0.28209479f
* t
;
2652 out
[6] = -0.12615663f
* t
;
2653 out
[8] = -0.21850969f
* t
;
2655 ta
= 0.21850969f
* a
[3] - 0.05839917f
* a
[13] - 0.22617901f
* a
[15];
2656 tb
= 0.21850969f
* b
[3] - 0.05839917f
* b
[13] - 0.22617901f
* b
[15];
2657 out
[1] += ta
* b
[4] + tb
* a
[4];
2658 out
[4] = ta
* b
[1] + tb
* a
[1];
2659 t
= a
[1] * b
[4] + a
[4] * b
[1];
2660 out
[3] = 0.21850969f
* t
;
2661 out
[13] = -0.05839917f
* t
;
2662 out
[15] = -0.22617901f
* t
;
2664 ta
= 0.21850969f
* a
[2] - 0.14304817f
* a
[12] - 0.18467439f
* a
[14];
2665 tb
= 0.21850969f
* b
[2] - 0.14304817f
* b
[12] - 0.18467439f
* b
[14];
2666 out
[1] += ta
* b
[5] + tb
* a
[5];
2667 out
[5] = ta
* b
[1] + tb
* a
[1];
2668 t
= a
[1] * b
[5] + a
[5] * b
[1];
2669 out
[2] = 0.21850969f
* t
;
2670 out
[12] = -0.14304817f
* t
;
2671 out
[14] = -0.18467439f
* t
;
2673 ta
= 0.20230066f
* a
[11];
2674 tb
= 0.20230066f
* b
[11];
2675 out
[1] += ta
* b
[6] + tb
* a
[6];
2676 out
[6] += ta
* b
[1] + tb
* a
[1];
2677 t
= a
[1] * b
[6] + a
[6] * b
[1];
2678 out
[11] = 0.20230066f
* t
;
2680 ta
= 0.22617901f
* a
[9] + 0.05839917f
* a
[11];
2681 tb
= 0.22617901f
* b
[9] + 0.05839917f
* b
[11];
2682 out
[1] += ta
* b
[8] + tb
* a
[8];
2683 out
[8] += ta
* b
[1] + tb
* a
[1];
2684 t
= a
[1] * b
[8] + a
[8] * b
[1];
2685 out
[9] = 0.22617901f
* t
;
2686 out
[11] += 0.05839917f
* t
;
2688 ta
= 0.28209480f
* a
[0] + 0.25231326f
* a
[6];
2689 tb
= 0.28209480f
* b
[0] + 0.25231326f
* b
[6];
2690 out
[2] += ta
* b
[2] + tb
* a
[2];
2692 out
[0] += 0.28209480f
* t
;
2693 out
[6] += 0.25231326f
* t
;
2695 ta
= 0.24776671f
* a
[12];
2696 tb
= 0.24776671f
* b
[12];
2697 out
[2] += ta
* b
[6] + tb
* a
[6];
2698 out
[6] += ta
* b
[2] + tb
* a
[2];
2699 t
= a
[2] * b
[6] + a
[6] * b
[2];
2700 out
[12] += 0.24776671f
* t
;
2702 ta
= 0.28209480f
* a
[0] - 0.12615663f
* a
[6] + 0.21850969f
* a
[8];
2703 tb
= 0.28209480f
* b
[0] - 0.12615663f
* b
[6] + 0.21850969f
* b
[8];
2704 out
[3] += ta
* b
[3] + tb
* a
[3];
2706 out
[0] += 0.28209480f
* t
;
2707 out
[6] -= 0.12615663f
* t
;
2708 out
[8] += 0.21850969f
* t
;
2710 ta
= 0.20230066f
* a
[13];
2711 tb
= 0.20230066f
* b
[13];
2712 out
[3] += ta
* b
[6] + tb
* a
[6];
2713 out
[6] += ta
* b
[3] + tb
* a
[3];
2714 t
= a
[3] * b
[6] + a
[6] * b
[3];
2715 out
[13] += 0.20230066f
* t
;
2717 ta
= 0.21850969f
* a
[2] - 0.14304817f
* a
[12] + 0.18467439f
* a
[14];
2718 tb
= 0.21850969f
* b
[2] - 0.14304817f
* b
[12] + 0.18467439f
* b
[14];
2719 out
[3] += ta
* b
[7] + tb
* a
[7];
2720 out
[7] = ta
* b
[3] + tb
* a
[3];
2721 t
= a
[3] * b
[7] + a
[7] * b
[3];
2722 out
[2] += 0.21850969f
* t
;
2723 out
[12] -= 0.14304817f
* t
;
2724 out
[14] += 0.18467439f
* t
;
2726 ta
= -0.05839917f
* a
[13] + 0.22617901f
* a
[15];
2727 tb
= -0.05839917f
* b
[13] + 0.22617901f
* b
[15];
2728 out
[3] += ta
* b
[8] + tb
* a
[8];
2729 out
[8] += ta
* b
[3] + tb
* a
[3];
2730 t
= a
[3] * b
[8] + a
[8] * b
[3];
2731 out
[13] -= 0.05839917f
* t
;
2732 out
[15] += 0.22617901f
* t
;
2734 ta
= 0.28209479f
* a
[0] - 0.18022375f
* a
[6];
2735 tb
= 0.28209479f
* b
[0] - 0.18022375f
* b
[6];
2736 out
[4] += ta
* b
[4] + tb
* a
[4];
2738 out
[0] += 0.28209479f
* t
;
2739 out
[6] -= 0.18022375f
* t
;
2741 ta
= 0.15607835f
* a
[7];
2742 tb
= 0.15607835f
* b
[7];
2743 out
[4] += ta
* b
[5] + tb
* a
[5];
2744 out
[5] += ta
* b
[4] + tb
* a
[4];
2745 t
= a
[4] * b
[5] + a
[5] * b
[4];
2746 out
[7] += 0.15607835f
* t
;
2748 ta
= 0.22617901f
* a
[3] - 0.09403160f
* a
[13];
2749 tb
= 0.22617901f
* b
[3] - 0.09403160f
* b
[13];
2750 out
[4] += ta
* b
[9] + tb
* a
[9];
2751 out
[9] += ta
* b
[4] + tb
* a
[4];
2752 t
= a
[4] * b
[9] + a
[9] * b
[4];
2753 out
[3] += 0.22617901f
* t
;
2754 out
[13] -= 0.09403160f
* t
;
2756 ta
= 0.18467439f
* a
[2] - 0.18806319f
* a
[12];
2757 tb
= 0.18467439f
* b
[2] - 0.18806319f
* b
[12];
2758 out
[4] += ta
* b
[10] + tb
* a
[10];
2759 out
[10] = ta
* b
[4] + tb
* a
[4];
2760 t
= a
[4] * b
[10] + a
[10] * b
[4];
2761 out
[2] += 0.18467439f
* t
;
2762 out
[12] -= 0.18806319f
* t
;
2764 ta
= -0.05839917f
* a
[3] + 0.14567312f
* a
[13] + 0.09403160f
* a
[15];
2765 tb
= -0.05839917f
* b
[3] + 0.14567312f
* b
[13] + 0.09403160f
* b
[15];
2766 out
[4] += ta
* b
[11] + tb
* a
[11];
2767 out
[11] += ta
* b
[4] + tb
* a
[4];
2768 t
= a
[4] * b
[11] + a
[11] * b
[4];
2769 out
[3] -= 0.05839917f
* t
;
2770 out
[13] += 0.14567312f
* t
;
2771 out
[15] += 0.09403160f
* t
;
2773 ta
= 0.28209479f
* a
[0] + 0.09011186f
* a
[6] - 0.15607835f
* a
[8];
2774 tb
= 0.28209479f
* b
[0] + 0.09011186f
* b
[6] - 0.15607835f
* b
[8];
2775 out
[5] += ta
* b
[5] + tb
* a
[5];
2777 out
[0] += 0.28209479f
* t
;
2778 out
[6] += 0.09011186f
* t
;
2779 out
[8] -= 0.15607835f
* t
;
2781 ta
= 0.14867701f
* a
[14];
2782 tb
= 0.14867701f
* b
[14];
2783 out
[5] += ta
* b
[9] + tb
* a
[9];
2784 out
[9] += ta
* b
[5] + tb
* a
[5];
2785 t
= a
[5] * b
[9] + a
[9] * b
[5];
2786 out
[14] += 0.14867701f
* t
;
2788 ta
= 0.18467439f
* a
[3] + 0.11516472f
* a
[13] - 0.14867701f
* a
[15];
2789 tb
= 0.18467439f
* b
[3] + 0.11516472f
* b
[13] - 0.14867701f
* b
[15];
2790 out
[5] += ta
* b
[10] + tb
* a
[10];
2791 out
[10] += ta
* b
[5] + tb
* a
[5];
2792 t
= a
[5] * b
[10] + a
[10] * b
[5];
2793 out
[3] += 0.18467439f
* t
;
2794 out
[13] += 0.11516472f
* t
;
2795 out
[15] -= 0.14867701f
* t
;
2797 ta
= 0.23359668f
* a
[2] + 0.05947080f
* a
[12] - 0.11516472f
* a
[14];
2798 tb
= 0.23359668f
* b
[2] + 0.05947080f
* b
[12] - 0.11516472f
* b
[14];
2799 out
[5] += ta
* b
[11] + tb
* a
[11];
2800 out
[11] += ta
* b
[5] + tb
* a
[5];
2801 t
= a
[5] * b
[11] + a
[11] * b
[5];
2802 out
[2] += 0.23359668f
* t
;
2803 out
[12] += 0.05947080f
* t
;
2804 out
[14] -= 0.11516472f
* t
;
2806 ta
= 0.28209479f
* a
[0];
2807 tb
= 0.28209479f
* b
[0];
2808 out
[6] += ta
* b
[6] + tb
* a
[6];
2810 out
[0] += 0.28209479f
* t
;
2811 out
[6] += 0.18022376f
* t
;
2813 ta
= 0.09011186f
* a
[6] + 0.28209479f
* a
[0] + 0.15607835f
* a
[8];
2814 tb
= 0.09011186f
* b
[6] + 0.28209479f
* b
[0] + 0.15607835f
* b
[8];
2815 out
[7] += ta
* b
[7] + tb
* a
[7];
2817 out
[6] += 0.09011186f
* t
;
2818 out
[0] += 0.28209479f
* t
;
2819 out
[8] += 0.15607835f
* t
;
2821 ta
= 0.14867701f
* a
[9] + 0.18467439f
* a
[1] + 0.11516472f
* a
[11];
2822 tb
= 0.14867701f
* b
[9] + 0.18467439f
* b
[1] + 0.11516472f
* b
[11];
2823 out
[7] += ta
* b
[10] + tb
* a
[10];
2824 out
[10] += ta
* b
[7] + tb
* a
[7];
2825 t
= a
[7] * b
[10] + a
[10] * b
[7];
2826 out
[9] += 0.14867701f
* t
;
2827 out
[1] += 0.18467439f
* t
;
2828 out
[11] += 0.11516472f
* t
;
2830 ta
= 0.05947080f
* a
[12] + 0.23359668f
* a
[2] + 0.11516472f
* a
[14];
2831 tb
= 0.05947080f
* b
[12] + 0.23359668f
* b
[2] + 0.11516472f
* b
[14];
2832 out
[7] += ta
* b
[13] + tb
* a
[13];
2833 out
[13] += ta
* b
[7]+ tb
* a
[7];
2834 t
= a
[7] * b
[13] + a
[13] * b
[7];
2835 out
[12] += 0.05947080f
* t
;
2836 out
[2] += 0.23359668f
* t
;
2837 out
[14] += 0.11516472f
* t
;
2839 ta
= 0.14867701f
* a
[15];
2840 tb
= 0.14867701f
* b
[15];
2841 out
[7] += ta
* b
[14] + tb
* a
[14];
2842 out
[14] += ta
* b
[7] + tb
* a
[7];
2843 t
= a
[7] * b
[14] + a
[14] * b
[7];
2844 out
[15] += 0.14867701f
* t
;
2846 ta
= 0.28209479f
* a
[0] - 0.18022375f
* a
[6];
2847 tb
= 0.28209479f
* b
[0] - 0.18022375f
* b
[6];
2848 out
[8] += ta
* b
[8] + tb
* a
[8];
2850 out
[0] += 0.28209479f
* t
;
2851 out
[6] -= 0.18022375f
* t
;
2853 ta
= -0.09403160f
* a
[11];
2854 tb
= -0.09403160f
* b
[11];
2855 out
[8] += ta
* b
[9] + tb
* a
[9];
2856 out
[9] += ta
* b
[8] + tb
* a
[8];
2857 t
= a
[8] * b
[9] + a
[9] * b
[8];
2858 out
[11] -= 0.09403160f
* t
;
2860 ta
= -0.09403160f
* a
[15];
2861 tb
= -0.09403160f
* b
[15];
2862 out
[8] += ta
* b
[13] + tb
* a
[13];
2863 out
[13] += ta
* b
[8] + tb
* a
[8];
2864 t
= a
[8] * b
[13] + a
[13] * b
[8];
2865 out
[15] -= 0.09403160f
* t
;
2867 ta
= 0.18467439f
* a
[2] - 0.18806319f
* a
[12];
2868 tb
= 0.18467439f
* b
[2] - 0.18806319f
* b
[12];
2869 out
[8] += ta
* b
[14] + tb
* a
[14];
2870 out
[14] += ta
* b
[8] + tb
* a
[8];
2871 t
= a
[8] * b
[14] + a
[14] * b
[8];
2872 out
[2] += 0.18467439f
* t
;
2873 out
[12] -= 0.18806319f
* t
;
2875 ta
= -0.21026104f
* a
[6] + 0.28209479f
* a
[0];
2876 tb
= -0.21026104f
* b
[6] + 0.28209479f
* b
[0];
2877 out
[9] += ta
* b
[9] + tb
* a
[9];
2879 out
[6] -= 0.21026104f
* t
;
2880 out
[0] += 0.28209479f
* t
;
2882 ta
= 0.28209479f
* a
[0];
2883 tb
= 0.28209479f
* b
[0];
2884 out
[10] += ta
* b
[10] + tb
* a
[10];
2886 out
[0] += 0.28209479f
* t
;
2888 ta
= 0.28209479f
* a
[0] + 0.12615663f
* a
[6] - 0.14567312f
* a
[8];
2889 tb
= 0.28209479f
* b
[0] + 0.12615663f
* b
[6] - 0.14567312f
* b
[8];
2890 out
[11] += ta
* b
[11] + tb
* a
[11];
2892 out
[0] += 0.28209479f
* t
;
2893 out
[6] += 0.12615663f
* t
;
2894 out
[8] -= 0.14567312f
* t
;
2896 ta
= 0.28209479f
* a
[0] + 0.16820885f
* a
[6];
2897 tb
= 0.28209479f
* b
[0] + 0.16820885f
* b
[6];
2898 out
[12] += ta
* b
[12] + tb
* a
[12];
2900 out
[0] += 0.28209479f
* t
;
2901 out
[6] += 0.16820885f
* t
;
2903 ta
=0.28209479f
* a
[0] + 0.14567312f
* a
[8] + 0.12615663f
* a
[6];
2904 tb
=0.28209479f
* b
[0] + 0.14567312f
* b
[8] + 0.12615663f
* b
[6];
2905 out
[13] += ta
* b
[13] + tb
* a
[13];
2907 out
[0] += 0.28209479f
* t
;
2908 out
[8] += 0.14567312f
* t
;
2909 out
[6] += 0.12615663f
* t
;
2911 ta
= 0.28209479f
* a
[0];
2912 tb
= 0.28209479f
* b
[0];
2913 out
[14] += ta
* b
[14] + tb
* a
[14];
2915 out
[0] += 0.28209479f
* t
;
2917 ta
= 0.28209479f
* a
[0] - 0.21026104f
* a
[6];
2918 tb
= 0.28209479f
* b
[0] - 0.21026104f
* b
[6];
2919 out
[15] += ta
* b
[15] + tb
* a
[15];
2921 out
[0] += 0.28209479f
* t
;
2922 out
[6] -= 0.21026104f
* t
;
2927 static void rotate_X(FLOAT
*out
, UINT order
, FLOAT a
, FLOAT
*in
)
2932 out
[2] = -a
* in
[1];
2937 out
[6] = -0.5f
* in
[6] - 0.8660253882f
* in
[8];
2938 out
[7] = -a
* in
[4];
2939 out
[8] = -0.8660253882f
* in
[6] + 0.5f
* in
[8];
2940 out
[9] = -a
* 0.7905694842f
* in
[12] + a
* 0.6123724580f
* in
[14];
2943 out
[11] = -a
* 0.6123724580f
* in
[12] - a
* 0.7905694842f
* in
[14];
2944 out
[12] = a
* 0.7905694842f
* in
[9] + a
* 0.6123724580f
* in
[11];
2945 out
[13] = -0.25f
* in
[13] - 0.9682458639f
* in
[15];
2946 out
[14] = -a
* 0.6123724580f
* in
[9] + a
* 0.7905694842f
* in
[11];
2947 out
[15] = -0.9682458639f
* in
[13] + 0.25f
* in
[15];
2951 out
[16] = -a
* 0.9354143739f
* in
[21] + a
* 0.3535533845f
* in
[23];
2952 out
[17] = -0.75f
* in
[17] + 0.6614378095f
* in
[19];
2953 out
[18] = -a
* 0.3535533845f
* in
[21] - a
* 0.9354143739f
* in
[23];
2954 out
[19] = 0.6614378095f
* in
[17] + 0.75f
* in
[19];
2955 out
[20] = 0.375f
* in
[20] + 0.5590170026f
* in
[22] + 0.7395099998f
* in
[24];
2956 out
[21] = a
* 0.9354143739f
* in
[16] + a
* 0.3535533845f
* in
[18];
2957 out
[22] = 0.5590170026f
* in
[20] + 0.5f
* in
[22] - 0.6614378691f
* in
[24];
2958 out
[23] = -a
* 0.3535533845f
* in
[16] + a
* 0.9354143739f
* in
[18];
2959 out
[24] = 0.7395099998f
* in
[20] - 0.6614378691f
* in
[22] + 0.125f
* in
[24];
2963 out
[25] = a
* 0.7015607357f
* in
[30] - a
* 0.6846531630f
* in
[32] + a
* 0.1976423711f
* in
[34];
2964 out
[26] = -0.5f
* in
[26] + 0.8660253882f
* in
[28];
2965 out
[27] = a
* 0.5229125023f
* in
[30] + a
* 0.3061861992f
* in
[32] - a
* 0.7954951525f
* in
[34];
2966 out
[28] = 0.8660253882f
* in
[26] + 0.5f
* in
[28];
2967 out
[29] = a
* 0.4841229022f
* in
[30] + a
* 0.6614378691f
* in
[32] + a
* 0.5728219748f
* in
[34];
2968 out
[30] = -a
* 0.7015607357f
* in
[25] - a
* 0.5229125023f
* in
[27] - a
* 0.4841229022f
* in
[29];
2969 out
[31] = 0.125f
* in
[31] + 0.4050463140f
* in
[33] + 0.9057110548f
* in
[35];
2970 out
[32] = a
* 0.6846531630f
* in
[25] - a
* 0.3061861992f
* in
[27] - a
* 0.6614378691f
* in
[29];
2971 out
[33] = 0.4050463140f
* in
[31] + 0.8125f
* in
[33] - 0.4192627370f
* in
[35];
2972 out
[34] = -a
* 0.1976423711f
* in
[25] + a
* 0.7954951525f
* in
[27] - a
* 0.5728219748f
* in
[29];
2973 out
[35] = 0.9057110548f
* in
[31] - 0.4192627370f
* in
[33] + 0.0624999329f
* in
[35];
2976 static void set_vec3(D3DXVECTOR3
*v
, float x
, float y
, float z
)
2984 * The following implementation of D3DXSHProjectCubeMap is based on the
2985 * SHProjectCubeMap() implementation from Microsoft's DirectXMath library,
2986 * covered under the following copyright:
2988 * Copyright (c) Microsoft Corporation.
2989 * Licensed under the MIT License.
2991 HRESULT WINAPI
D3DXSHProjectCubeMap(unsigned int order
, IDirect3DCubeTexture9
*texture
, float *red
, float *green
, float *blue
)
2993 const unsigned int order_square
= order
* order
;
2994 const struct pixel_format_desc
*format
;
2995 unsigned int x
, y
, i
, face
;
2996 float B
, S
, proj_normal
;
2997 D3DSURFACE_DESC desc
;
3002 TRACE("order %u, texture %p, red %p, green %p, blue %p.\n", order
, texture
, red
, green
, blue
);
3004 if (!texture
|| !red
|| order
< D3DXSH_MINORDER
|| order
> D3DXSH_MAXORDER
)
3005 return D3DERR_INVALIDCALL
;
3007 memset(red
, 0, order_square
* sizeof(float));
3009 memset(green
, 0, order_square
* sizeof(float));
3011 memset(blue
, 0, order_square
* sizeof(float));
3013 if (FAILED(hr
= IDirect3DCubeTexture9_GetLevelDesc(texture
, 0, &desc
)))
3015 ERR("Failed to get level desc, hr %#lx.\n", hr
);
3019 format
= get_format_info(desc
.Format
);
3020 if (format
->type
!= FORMAT_ARGB
&& format
->type
!= FORMAT_ARGBF16
&& format
->type
!= FORMAT_ARGBF
)
3022 FIXME("Unsupported texture format %#x.\n", desc
.Format
);
3023 return D3DERR_INVALIDCALL
;
3026 if (!(temp
= malloc(order_square
* sizeof(*temp
))))
3027 return E_OUTOFMEMORY
;
3029 B
= -1.0f
+ 1.0f
/ desc
.Width
;
3031 S
= 2.0f
* (1.0f
- 1.0f
/ desc
.Width
) / (desc
.Width
- 1.0f
);
3035 for (face
= 0; face
< 6; ++face
)
3037 D3DLOCKED_RECT map_desc
;
3039 if (FAILED(hr
= IDirect3DCubeTexture9_LockRect(texture
, face
, 0, &map_desc
, NULL
, D3DLOCK_READONLY
)))
3041 ERR("Failed to map texture, hr %#lx.\n", hr
);
3046 for (y
= 0; y
< desc
.Height
; ++y
)
3048 const BYTE
*row
= (const BYTE
*)map_desc
.pBits
+ y
* map_desc
.Pitch
;
3050 for (x
= 0; x
< desc
.Width
; ++x
)
3052 float diff_solid
, x_3d
, y_3d
;
3053 const float u
= x
* S
+ B
;
3054 const float v
= y
* S
+ B
;
3058 x_3d
= (x
* 2.0f
+ 1.0f
) / desc
.Width
- 1.0f
;
3059 y_3d
= (y
* 2.0f
+ 1.0f
) / desc
.Width
- 1.0f
;
3063 case D3DCUBEMAP_FACE_POSITIVE_X
:
3064 set_vec3(&dir
, 1.0f
, -y_3d
, -x_3d
);
3067 case D3DCUBEMAP_FACE_NEGATIVE_X
:
3068 set_vec3(&dir
, -1.0f
, -y_3d
, x_3d
);
3071 case D3DCUBEMAP_FACE_POSITIVE_Y
:
3072 set_vec3(&dir
, x_3d
, 1.0f
, y_3d
);
3075 case D3DCUBEMAP_FACE_NEGATIVE_Y
:
3076 set_vec3(&dir
, x_3d
, -1.0f
, -y_3d
);
3079 case D3DCUBEMAP_FACE_POSITIVE_Z
:
3080 set_vec3(&dir
, x_3d
, -y_3d
, 1.0f
);
3083 case D3DCUBEMAP_FACE_NEGATIVE_Z
:
3084 set_vec3(&dir
, -x_3d
, -y_3d
, -1.0f
);
3088 /* This is more complex than powf(..., 1.5f), but also happens
3089 * to be slightly more accurate, and slightly faster as well. */
3090 diff_solid
= 4.0f
/ ((1.0f
+ u
* u
+ v
* v
) * sqrtf(1.0f
+ u
* u
+ v
* v
));
3093 D3DXVec3Normalize(&dir
, &dir
);
3094 D3DXSHEvalDirection(temp
, order
, &dir
);
3096 format_to_vec4(format
, &row
[x
* format
->block_byte_count
], &colour
);
3098 for (i
= 0; i
< order_square
; ++i
)
3100 red
[i
] += temp
[i
] * colour
.x
* diff_solid
;
3102 green
[i
] += temp
[i
] * colour
.y
* diff_solid
;
3104 blue
[i
] += temp
[i
] * colour
.z
* diff_solid
;
3109 IDirect3DCubeTexture9_UnlockRect(texture
, face
, 0);
3112 proj_normal
= (4.0f
* M_PI
) / Wt
;
3113 D3DXSHScale(red
, order
, red
, proj_normal
);
3115 D3DXSHScale(green
, order
, green
, proj_normal
);
3117 D3DXSHScale(blue
, order
, blue
, proj_normal
);
3123 FLOAT
* WINAPI
D3DXSHRotate(FLOAT
*out
, UINT order
, const D3DXMATRIX
*matrix
, const FLOAT
*in
)
3125 FLOAT alpha
, beta
, gamma
, sinb
, temp
[36], temp1
[36];
3127 TRACE("out %p, order %u, matrix %p, in %p\n", out
, order
, matrix
, in
);
3131 if ((order
> D3DXSH_MAXORDER
) || (order
< D3DXSH_MINORDER
))
3136 out
[1] = matrix
->m
[1][1] * in
[1] - matrix
->m
[2][1] * in
[2] + matrix
->m
[0][1] * in
[3];
3137 out
[2] = -matrix
->m
[1][2] * in
[1] + matrix
->m
[2][2] * in
[2] - matrix
->m
[0][2] * in
[3];
3138 out
[3] = matrix
->m
[1][0] * in
[1] - matrix
->m
[2][0] * in
[2] + matrix
->m
[0][0] * in
[3];
3144 matrix
->m
[1][0] * matrix
->m
[0][0], matrix
->m
[1][1] * matrix
->m
[0][1],
3145 matrix
->m
[1][1] * matrix
->m
[2][1], matrix
->m
[1][0] * matrix
->m
[2][0],
3146 matrix
->m
[2][0] * matrix
->m
[2][0], matrix
->m
[2][1] * matrix
->m
[2][1],
3147 matrix
->m
[0][0] * matrix
->m
[2][0], matrix
->m
[0][1] * matrix
->m
[2][1],
3148 matrix
->m
[0][1] * matrix
->m
[0][1], matrix
->m
[1][0] * matrix
->m
[1][0],
3149 matrix
->m
[1][1] * matrix
->m
[1][1], matrix
->m
[0][0] * matrix
->m
[0][0],
3152 out
[4] = (matrix
->m
[1][1] * matrix
->m
[0][0] + matrix
->m
[0][1] * matrix
->m
[1][0]) * in
[4];
3153 out
[4] -= (matrix
->m
[1][0] * matrix
->m
[2][1] + matrix
->m
[1][1] * matrix
->m
[2][0]) * in
[5];
3154 out
[4] += 1.7320508076f
* matrix
->m
[2][0] * matrix
->m
[2][1] * in
[6];
3155 out
[4] -= (matrix
->m
[0][1] * matrix
->m
[2][0] + matrix
->m
[0][0] * matrix
->m
[2][1]) * in
[7];
3156 out
[4] += (matrix
->m
[0][0] * matrix
->m
[0][1] - matrix
->m
[1][0] * matrix
->m
[1][1]) * in
[8];
3158 out
[5] = (matrix
->m
[1][1] * matrix
->m
[2][2] + matrix
->m
[1][2] * matrix
->m
[2][1]) * in
[5];
3159 out
[5] -= (matrix
->m
[1][1] * matrix
->m
[0][2] + matrix
->m
[1][2] * matrix
->m
[0][1]) * in
[4];
3160 out
[5] -= 1.7320508076f
* matrix
->m
[2][2] * matrix
->m
[2][1] * in
[6];
3161 out
[5] += (matrix
->m
[0][2] * matrix
->m
[2][1] + matrix
->m
[0][1] * matrix
->m
[2][2]) * in
[7];
3162 out
[5] -= (matrix
->m
[0][1] * matrix
->m
[0][2] - matrix
->m
[1][1] * matrix
->m
[1][2]) * in
[8];
3164 out
[6] = (matrix
->m
[2][2] * matrix
->m
[2][2] - 0.5f
* (coeff
[4] + coeff
[5])) * in
[6];
3165 out
[6] -= (0.5773502692f
* (coeff
[0] + coeff
[1]) - 1.1547005384f
* matrix
->m
[1][2] * matrix
->m
[0][2]) * in
[4];
3166 out
[6] += (0.5773502692f
* (coeff
[2] + coeff
[3]) - 1.1547005384f
* matrix
->m
[1][2] * matrix
->m
[2][2]) * in
[5];
3167 out
[6] += (0.5773502692f
* (coeff
[6] + coeff
[7]) - 1.1547005384f
* matrix
->m
[0][2] * matrix
->m
[2][2]) * in
[7];
3168 out
[6] += (0.2886751347f
* (coeff
[9] - coeff
[8] + coeff
[10] - coeff
[11]) - 0.5773502692f
*
3169 (matrix
->m
[1][2] * matrix
->m
[1][2] - matrix
->m
[0][2] * matrix
->m
[0][2])) * in
[8];
3171 out
[7] = (matrix
->m
[0][0] * matrix
->m
[2][2] + matrix
->m
[0][2] * matrix
->m
[2][0]) * in
[7];
3172 out
[7] -= (matrix
->m
[1][0] * matrix
->m
[0][2] + matrix
->m
[1][2] * matrix
->m
[0][0]) * in
[4];
3173 out
[7] += (matrix
->m
[1][0] * matrix
->m
[2][2] + matrix
->m
[1][2] * matrix
->m
[2][0]) * in
[5];
3174 out
[7] -= 1.7320508076f
* matrix
->m
[2][2] * matrix
->m
[2][0] * in
[6];
3175 out
[7] -= (matrix
->m
[0][0] * matrix
->m
[0][2] - matrix
->m
[1][0] * matrix
->m
[1][2]) * in
[8];
3177 out
[8] = 0.5f
* (coeff
[11] - coeff
[8] - coeff
[9] + coeff
[10]) * in
[8];
3178 out
[8] += (coeff
[0] - coeff
[1]) * in
[4];
3179 out
[8] += (coeff
[2] - coeff
[3]) * in
[5];
3180 out
[8] += 0.86602540f
* (coeff
[4] - coeff
[5]) * in
[6];
3181 out
[8] += (coeff
[7] - coeff
[6]) * in
[7];
3187 if (fabsf(matrix
->m
[2][2]) != 1.0f
)
3189 sinb
= sqrtf(1.0f
- matrix
->m
[2][2] * matrix
->m
[2][2]);
3190 alpha
= atan2f(matrix
->m
[2][1] / sinb
, matrix
->m
[2][0] / sinb
);
3191 beta
= atan2f(sinb
, matrix
->m
[2][2]);
3192 gamma
= atan2f(matrix
->m
[1][2] / sinb
, -matrix
->m
[0][2] / sinb
);
3196 alpha
= atan2f(matrix
->m
[0][1], matrix
->m
[0][0]);
3201 D3DXSHRotateZ(temp
, order
, gamma
, in
);
3202 rotate_X(temp1
, order
, 1.0f
, temp
);
3203 D3DXSHRotateZ(temp
, order
, beta
, temp1
);
3204 rotate_X(temp1
, order
, -1.0f
, temp
);
3205 D3DXSHRotateZ(out
, order
, alpha
, temp1
);
3210 FLOAT
* WINAPI
D3DXSHRotateZ(FLOAT
*out
, UINT order
, FLOAT angle
, const FLOAT
*in
)
3215 TRACE("out %p, order %u, angle %f, in %p\n", out
, order
, angle
, in
);
3217 order
= min(max(order
, D3DXSH_MINORDER
), D3DXSH_MAXORDER
);
3221 for (i
= 1; i
< order
; i
++)
3225 c
[i
- 1] = cosf(i
* angle
);
3226 s
[i
- 1] = sinf(i
* angle
);
3229 out
[sum
- i
] = c
[i
- 1] * in
[sum
- i
];
3230 out
[sum
- i
] += s
[i
- 1] * in
[sum
+ i
];
3231 for (j
= i
- 1; j
> 0; j
--)
3233 out
[sum
- j
] = 0.0f
;
3234 out
[sum
- j
] = c
[j
- 1] * in
[sum
- j
];
3235 out
[sum
- j
] += s
[j
- 1] * in
[sum
+ j
];
3243 for (j
= 1; j
< i
; j
++)
3245 out
[sum
+ j
] = 0.0f
;
3246 out
[sum
+ j
] = -s
[j
- 1] * in
[sum
- j
];
3247 out
[sum
+ j
] += c
[j
- 1] * in
[sum
+ j
];
3249 out
[sum
+ i
] = -s
[i
- 1] * in
[sum
- i
];
3250 out
[sum
+ i
] += c
[i
- 1] * in
[sum
+ i
];
3256 FLOAT
* WINAPI
D3DXSHScale(FLOAT
*out
, UINT order
, const FLOAT
*a
, const FLOAT scale
)
3260 TRACE("out %p, order %u, a %p, scale %f\n", out
, order
, a
, scale
);
3262 for (i
= 0; i
< order
* order
; i
++)
3263 out
[i
] = a
[i
] * scale
;