2 * Copyright 2007 David Adam
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(d3dx8
);
32 /*_________________D3DXMatrix____________________*/
34 FLOAT WINAPI
D3DXMatrixfDeterminant(CONST D3DXMATRIX
*pm
)
36 D3DXVECTOR4 minor
, v1
, v2
, v3
;
39 v1
.x
= pm
->m
[0][0]; v1
.y
= pm
->m
[1][0]; v1
.z
= pm
->m
[2][0]; v1
.w
= pm
->m
[3][0];
40 v2
.x
= pm
->m
[0][1]; v2
.y
= pm
->m
[1][1]; v2
.z
= pm
->m
[2][1]; v2
.w
= pm
->m
[3][1];
41 v3
.x
= pm
->m
[0][2]; v3
.y
= pm
->m
[1][2]; v3
.z
= pm
->m
[2][2]; v3
.w
= pm
->m
[3][2];
42 D3DXVec4Cross(&minor
,&v1
,&v2
,&v3
);
43 det
= - (pm
->m
[0][3] * minor
.x
+ pm
->m
[1][3] * minor
.y
+ pm
->m
[2][3] * minor
.z
+ pm
->m
[3][3] * minor
.w
);
47 D3DXMATRIX
* WINAPI
D3DXMatrixLookAtLH(D3DXMATRIX
*pout
, CONST D3DXVECTOR3
*peye
, CONST D3DXVECTOR3
*pat
, CONST D3DXVECTOR3
*pup
)
49 D3DXVECTOR3 right
, rightn
, up
, upn
, vec
, vec2
;
51 D3DXVec3Subtract(&vec2
, pat
, peye
);
52 D3DXVec3Normalize(&vec
, &vec2
);
53 D3DXVec3Cross(&right
, pup
, &vec
);
54 D3DXVec3Cross(&up
, &vec
, &right
);
55 D3DXVec3Normalize(&rightn
, &right
);
56 D3DXVec3Normalize(&upn
, &up
);
57 pout
->m
[0][0] = rightn
.x
;
58 pout
->m
[1][0] = rightn
.y
;
59 pout
->m
[2][0] = rightn
.z
;
60 pout
->m
[3][0] = -D3DXVec3Dot(&rightn
,peye
);
61 pout
->m
[0][1] = upn
.x
;
62 pout
->m
[1][1] = upn
.y
;
63 pout
->m
[2][1] = upn
.z
;
64 pout
->m
[3][1] = -D3DXVec3Dot(&upn
, peye
);
65 pout
->m
[0][2] = vec
.x
;
66 pout
->m
[1][2] = vec
.y
;
67 pout
->m
[2][2] = vec
.z
;
68 pout
->m
[3][2] = -D3DXVec3Dot(&vec
, peye
);
76 D3DXMATRIX
* WINAPI
D3DXMatrixLookAtRH(D3DXMATRIX
*pout
, CONST D3DXVECTOR3
*peye
, CONST D3DXVECTOR3
*pat
, CONST D3DXVECTOR3
*pup
)
78 D3DXVECTOR3 right
, rightn
, up
, upn
, vec
, vec2
;
80 D3DXVec3Subtract(&vec2
, pat
, peye
);
81 D3DXVec3Normalize(&vec
, &vec2
);
82 D3DXVec3Cross(&right
, pup
, &vec
);
83 D3DXVec3Cross(&up
, &vec
, &right
);
84 D3DXVec3Normalize(&rightn
, &right
);
85 D3DXVec3Normalize(&upn
, &up
);
86 pout
->m
[0][0] = -rightn
.x
;
87 pout
->m
[1][0] = -rightn
.y
;
88 pout
->m
[2][0] = -rightn
.z
;
89 pout
->m
[3][0] = D3DXVec3Dot(&rightn
,peye
);
90 pout
->m
[0][1] = upn
.x
;
91 pout
->m
[1][1] = upn
.y
;
92 pout
->m
[2][1] = upn
.z
;
93 pout
->m
[3][1] = -D3DXVec3Dot(&upn
, peye
);
94 pout
->m
[0][2] = -vec
.x
;
95 pout
->m
[1][2] = -vec
.y
;
96 pout
->m
[2][2] = -vec
.z
;
97 pout
->m
[3][2] = D3DXVec3Dot(&vec
, peye
);
100 pout
->m
[2][3] = 0.0f
;
101 pout
->m
[3][3] = 1.0f
;
105 D3DXMATRIX
* WINAPI
D3DXMatrixMultiply(D3DXMATRIX
*pout
, CONST D3DXMATRIX
*pm1
, CONST D3DXMATRIX
*pm2
)
113 pout
->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
];
119 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveFovLH(D3DXMATRIX
*pout
, FLOAT fovy
, FLOAT aspect
, FLOAT zn
, FLOAT zf
)
121 D3DXMatrixIdentity(pout
);
122 pout
->m
[0][0] = 1.0f
/ (aspect
* tan(fovy
/2.0f
));
123 pout
->m
[1][1] = 1.0f
/ tan(fovy
/2.0f
);
124 pout
->m
[2][2] = zf
/ (zf
- zn
);
125 pout
->m
[2][3] = 1.0f
;
126 pout
->m
[3][2] = (zf
* zn
) / (zn
- zf
);
127 pout
->m
[3][3] = 0.0f
;
131 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveFovRH(D3DXMATRIX
*pout
, FLOAT fovy
, FLOAT aspect
, FLOAT zn
, FLOAT zf
)
133 D3DXMatrixIdentity(pout
);
134 pout
->m
[0][0] = 1.0f
/ (aspect
* tan(fovy
/2.0f
));
135 pout
->m
[1][1] = 1.0f
/ tan(fovy
/2.0f
);
136 pout
->m
[2][2] = zf
/ (zn
- zf
);
137 pout
->m
[2][3] = -1.0f
;
138 pout
->m
[3][2] = (zf
* zn
) / (zn
- zf
);
139 pout
->m
[3][3] = 0.0f
;
143 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveLH(D3DXMATRIX
*pout
, FLOAT w
, FLOAT h
, FLOAT zn
, FLOAT zf
)
145 D3DXMatrixIdentity(pout
);
146 pout
->m
[0][0] = 2.0f
* zn
/ w
;
147 pout
->m
[1][1] = 2.0f
* zn
/ h
;
148 pout
->m
[2][2] = zf
/ (zf
- zn
);
149 pout
->m
[3][2] = (zn
* zf
) / (zn
- zf
);
150 pout
->m
[2][3] = 1.0f
;
151 pout
->m
[3][3] = 0.0f
;
155 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveRH(D3DXMATRIX
*pout
, FLOAT w
, FLOAT h
, FLOAT zn
, FLOAT zf
)
157 D3DXMatrixIdentity(pout
);
158 pout
->m
[0][0] = 2.0f
* zn
/ w
;
159 pout
->m
[1][1] = 2.0f
* zn
/ h
;
160 pout
->m
[2][2] = zf
/ (zn
- zf
);
161 pout
->m
[3][2] = (zn
* zf
) / (zn
- zf
);
162 pout
->m
[2][3] = -1.0f
;
163 pout
->m
[3][3] = 0.0f
;
167 D3DXMATRIX
* WINAPI
D3DXMatrixRotationAxis(D3DXMATRIX
*pout
, CONST D3DXVECTOR3
*pv
, FLOAT angle
)
171 D3DXVec3Normalize(&v
,pv
);
172 D3DXMatrixIdentity(pout
);
173 pout
->m
[0][0] = (1.0f
- cos(angle
)) * v
.x
* v
.x
+ cos(angle
);
174 pout
->m
[1][0] = (1.0f
- cos(angle
)) * v
.x
* v
.y
- sin(angle
) * v
.z
;
175 pout
->m
[2][0] = (1.0f
- cos(angle
)) * v
.x
* v
.z
+ sin(angle
) * v
.y
;
176 pout
->m
[0][1] = (1.0f
- cos(angle
)) * v
.y
* v
.x
+ sin(angle
) * v
.z
;
177 pout
->m
[1][1] = (1.0f
- cos(angle
)) * v
.y
* v
.y
+ cos(angle
);
178 pout
->m
[2][1] = (1.0f
- cos(angle
)) * v
.y
* v
.z
- sin(angle
) * v
.x
;
179 pout
->m
[0][2] = (1.0f
- cos(angle
)) * v
.z
* v
.x
- sin(angle
) * v
.y
;
180 pout
->m
[1][2] = (1.0f
- cos(angle
)) * v
.z
* v
.y
+ sin(angle
) * v
.x
;
181 pout
->m
[2][2] = (1.0f
- cos(angle
)) * v
.z
* v
.z
+ cos(angle
);
185 D3DXMATRIX
* WINAPI
D3DXMatrixRotationQuaternion(D3DXMATRIX
*pout
, CONST D3DXQUATERNION
*pq
)
187 D3DXMatrixIdentity(pout
);
188 pout
->m
[0][0] = 1.0f
- 2.0f
* (pq
->y
* pq
->y
+ pq
->z
* pq
->z
);
189 pout
->m
[0][1] = 2.0f
* (pq
->x
*pq
->y
+ pq
->z
* pq
->w
);
190 pout
->m
[0][2] = 2.0f
* (pq
->x
* pq
->z
- pq
->y
* pq
->w
);
191 pout
->m
[1][0] = 2.0f
* (pq
->x
* pq
->y
- pq
->z
* pq
->w
);
192 pout
->m
[1][1] = 1.0f
- 2.0f
* (pq
->x
* pq
->x
+ pq
->z
* pq
->z
);
193 pout
->m
[1][2] = 2.0f
* (pq
->y
*pq
->z
+ pq
->x
*pq
->w
);
194 pout
->m
[2][0] = 2.0f
* (pq
->x
* pq
->z
+ pq
->y
* pq
->w
);
195 pout
->m
[2][1] = 2.0f
* (pq
->y
*pq
->z
- pq
->x
*pq
->w
);
196 pout
->m
[2][2] = 1.0f
- 2.0f
* (pq
->x
* pq
->x
+ pq
->y
* pq
->y
);
200 D3DXMATRIX
* WINAPI
D3DXMatrixRotationX(D3DXMATRIX
*pout
, FLOAT angle
)
202 D3DXMatrixIdentity(pout
);
203 pout
->m
[1][1] = cos(angle
);
204 pout
->m
[2][2] = cos(angle
);
205 pout
->m
[1][2] = sin(angle
);
206 pout
->m
[2][1] = -sin(angle
);
210 D3DXMATRIX
* WINAPI
D3DXMatrixRotationY(D3DXMATRIX
*pout
, FLOAT angle
)
212 D3DXMatrixIdentity(pout
);
213 pout
->m
[0][0] = cos(angle
);
214 pout
->m
[2][2] = cos(angle
);
215 pout
->m
[0][2] = -sin(angle
);
216 pout
->m
[2][0] = sin(angle
);
220 D3DXMATRIX
* WINAPI
D3DXMatrixRotationYawPitchRoll(D3DXMATRIX
*pout
, FLOAT yaw
, FLOAT pitch
, FLOAT roll
)
222 D3DXMATRIX m
, pout1
, pout2
, pout3
;
224 D3DXMatrixIdentity(&pout3
);
225 D3DXMatrixRotationZ(&m
,roll
);
226 D3DXMatrixMultiply(&pout2
,&pout3
,&m
);
227 D3DXMatrixRotationX(&m
,pitch
);
228 D3DXMatrixMultiply(&pout1
,&pout2
,&m
);
229 D3DXMatrixRotationY(&m
,yaw
);
230 D3DXMatrixMultiply(pout
,&pout1
,&m
);
233 D3DXMATRIX
* WINAPI
D3DXMatrixRotationZ(D3DXMATRIX
*pout
, FLOAT angle
)
235 D3DXMatrixIdentity(pout
);
236 pout
->m
[0][0] = cos(angle
);
237 pout
->m
[1][1] = cos(angle
);
238 pout
->m
[0][1] = sin(angle
);
239 pout
->m
[1][0] = -sin(angle
);
243 D3DXMATRIX
* WINAPI
D3DXMatrixScaling(D3DXMATRIX
*pout
, FLOAT sx
, FLOAT sy
, FLOAT sz
)
245 D3DXMatrixIdentity(pout
);
252 D3DXMATRIX
* WINAPI
D3DXMatrixTranslation(D3DXMATRIX
*pout
, FLOAT x
, FLOAT y
, FLOAT z
)
254 D3DXMatrixIdentity(pout
);
261 D3DXMATRIX
* WINAPI
D3DXMatrixTranspose(D3DXMATRIX
*pout
, CONST D3DXMATRIX
*pm
)
269 pout
->m
[i
][j
] = pm
->m
[j
][i
];
275 /*_________________D3DXQUATERNION________________*/
277 D3DXQUATERNION
* WINAPI
D3DXQuaternionNormalize(D3DXQUATERNION
*pout
, CONST D3DXQUATERNION
*pq
)
281 norm
= D3DXQuaternionLength(pq
);
291 pout
->x
= pq
->x
/ norm
;
292 pout
->y
= pq
->y
/ norm
;
293 pout
->z
= pq
->z
/ norm
;
294 pout
->w
= pq
->w
/ norm
;
298 /*_________________D3DXVec2_____________________*/
300 D3DXVECTOR2
* WINAPI
D3DXVec2BaryCentric(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv1
, CONST D3DXVECTOR2
*pv2
, CONST D3DXVECTOR2
*pv3
, FLOAT f
, FLOAT g
)
302 pout
->x
= (1.0f
-f
-g
) * (pv1
->x
) + f
* (pv2
->x
) + g
* (pv3
->x
);
303 pout
->y
= (1.0f
-f
-g
) * (pv1
->y
) + f
* (pv2
->y
) + g
* (pv3
->y
);
307 D3DXVECTOR2
* WINAPI
D3DXVec2CatmullRom(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv0
, CONST D3DXVECTOR2
*pv1
, CONST D3DXVECTOR2
*pv2
, CONST D3DXVECTOR2
*pv3
, FLOAT s
)
309 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
);
310 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
);
314 D3DXVECTOR2
* WINAPI
D3DXVec2Hermite(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv1
, CONST D3DXVECTOR2
*pt1
, CONST D3DXVECTOR2
*pv2
, CONST D3DXVECTOR2
*pt2
, FLOAT s
)
316 FLOAT h1
, h2
, h3
, h4
;
318 h1
= 2.0f
* s
* s
* s
- 3.0f
* s
* s
+ 1.0f
;
319 h2
= s
* s
* s
- 2.0f
* s
* s
+ s
;
320 h3
= -2.0f
* s
* s
* s
+ 3.0f
* s
* s
;
321 h4
= s
* s
* s
- s
* s
;
323 pout
->x
= h1
* (pv1
->x
) + h2
* (pt1
->x
) + h3
* (pv2
->x
) + h4
* (pt2
->x
);
324 pout
->y
= h1
* (pv1
->y
) + h2
* (pt1
->y
) + h3
* (pv2
->y
) + h4
* (pt2
->y
);
328 D3DXVECTOR2
* WINAPI
D3DXVec2Normalize(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv
)
332 norm
= D3DXVec2Length(pv
);
340 pout
->x
= pv
->x
/ norm
;
341 pout
->y
= pv
->y
/ norm
;
346 D3DXVECTOR4
* WINAPI
D3DXVec2Transform(D3DXVECTOR4
*pout
, CONST D3DXVECTOR2
*pv
, CONST D3DXMATRIX
*pm
)
348 pout
->x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[3][0];
349 pout
->y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[3][1];
350 pout
->z
= pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[3][2];
351 pout
->w
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[3][3];
355 D3DXVECTOR2
* WINAPI
D3DXVec2TransformCoord(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv
, CONST D3DXMATRIX
*pm
)
359 norm
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[3][3];
362 pout
->x
= (pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[3][0]) / norm
;
363 pout
->y
= (pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[3][1]) / norm
;
373 D3DXVECTOR2
* WINAPI
D3DXVec2TransformNormal(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv
, CONST D3DXMATRIX
*pm
)
375 pout
->x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
;
376 pout
->y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
;
380 /*_________________D3DXVec3_____________________*/
382 D3DXVECTOR3
* WINAPI
D3DXVec3BaryCentric(D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv1
, CONST D3DXVECTOR3
*pv2
, CONST D3DXVECTOR3
*pv3
, FLOAT f
, FLOAT g
)
384 pout
->x
= (1.0f
-f
-g
) * (pv1
->x
) + f
* (pv2
->x
) + g
* (pv3
->x
);
385 pout
->y
= (1.0f
-f
-g
) * (pv1
->y
) + f
* (pv2
->y
) + g
* (pv3
->y
);
386 pout
->z
= (1.0f
-f
-g
) * (pv1
->z
) + f
* (pv2
->z
) + g
* (pv3
->z
);
390 D3DXVECTOR3
* WINAPI
D3DXVec3CatmullRom( D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv0
, CONST D3DXVECTOR3
*pv1
, CONST D3DXVECTOR3
*pv2
, CONST D3DXVECTOR3
*pv3
, FLOAT s
)
392 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
);
393 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
);
394 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
);
398 D3DXVECTOR3
* WINAPI
D3DXVec3Hermite(D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv1
, CONST D3DXVECTOR3
*pt1
, CONST D3DXVECTOR3
*pv2
, CONST D3DXVECTOR3
*pt2
, FLOAT s
)
400 FLOAT h1
, h2
, h3
, h4
;
402 h1
= 2.0f
* s
* s
* s
- 3.0f
* s
* s
+ 1.0f
;
403 h2
= s
* s
* s
- 2.0f
* s
* s
+ s
;
404 h3
= -2.0f
* s
* s
* s
+ 3.0f
* s
* s
;
405 h4
= s
* s
* s
- s
* s
;
407 pout
->x
= h1
* (pv1
->x
) + h2
* (pt1
->x
) + h3
* (pv2
->x
) + h4
* (pt2
->x
);
408 pout
->y
= h1
* (pv1
->y
) + h2
* (pt1
->y
) + h3
* (pv2
->y
) + h4
* (pt2
->y
);
409 pout
->z
= h1
* (pv1
->z
) + h2
* (pt1
->z
) + h3
* (pv2
->z
) + h4
* (pt2
->z
);
413 D3DXVECTOR3
* WINAPI
D3DXVec3Normalize(D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv
)
417 norm
= D3DXVec3Length(pv
);
426 pout
->x
= pv
->x
/ norm
;
427 pout
->y
= pv
->y
/ norm
;
428 pout
->z
= pv
->z
/ norm
;
433 D3DXVECTOR4
* WINAPI
D3DXVec3Transform(D3DXVECTOR4
*pout
, CONST D3DXVECTOR3
*pv
, CONST D3DXMATRIX
*pm
)
435 pout
->x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[2][0] * pv
->z
+ pm
->m
[3][0];
436 pout
->y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[2][1] * pv
->z
+ pm
->m
[3][1];
437 pout
->z
= pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[2][2] * pv
->z
+ pm
->m
[3][2];
438 pout
->w
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[2][3] * pv
->z
+ pm
->m
[3][3];
442 D3DXVECTOR3
* WINAPI
D3DXVec3TransformCoord(D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv
, CONST D3DXMATRIX
*pm
)
446 norm
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[2][3] *pv
->z
+ pm
->m
[3][3];
450 pout
->x
= (pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[2][0] * pv
->z
+ pm
->m
[3][0]) / norm
;
451 pout
->y
= (pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[2][1] * pv
->z
+ pm
->m
[3][1]) / norm
;
452 pout
->z
= (pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[2][2] * pv
->z
+ pm
->m
[3][2]) / norm
;
463 D3DXVECTOR3
* WINAPI
D3DXVec3TransformNormal(D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv
, CONST D3DXMATRIX
*pm
)
465 pout
->x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[2][0] * pv
->z
;
466 pout
->y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[2][1] * pv
->z
;
467 pout
->z
= pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[2][2] * pv
->z
;
472 /*_________________D3DXVec4_____________________*/
474 D3DXVECTOR4
* WINAPI
D3DXVec4BaryCentric(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv1
, CONST D3DXVECTOR4
*pv2
, CONST D3DXVECTOR4
*pv3
, FLOAT f
, FLOAT g
)
476 pout
->x
= (1.0f
-f
-g
) * (pv1
->x
) + f
* (pv2
->x
) + g
* (pv3
->x
);
477 pout
->y
= (1.0f
-f
-g
) * (pv1
->y
) + f
* (pv2
->y
) + g
* (pv3
->y
);
478 pout
->z
= (1.0f
-f
-g
) * (pv1
->z
) + f
* (pv2
->z
) + g
* (pv3
->z
);
479 pout
->w
= (1.0f
-f
-g
) * (pv1
->w
) + f
* (pv2
->w
) + g
* (pv3
->w
);
483 D3DXVECTOR4
* WINAPI
D3DXVec4CatmullRom(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv0
, CONST D3DXVECTOR4
*pv1
, CONST D3DXVECTOR4
*pv2
, CONST D3DXVECTOR4
*pv3
, FLOAT s
)
485 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
);
486 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
);
487 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
);
488 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
);
492 D3DXVECTOR4
* WINAPI
D3DXVec4Cross(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv1
, CONST D3DXVECTOR4
*pv2
, CONST D3DXVECTOR4
*pv3
)
494 pout
->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
);
495 pout
->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
));
496 pout
->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
);
497 pout
->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
));
501 D3DXVECTOR4
* WINAPI
D3DXVec4Hermite(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv1
, CONST D3DXVECTOR4
*pt1
, CONST D3DXVECTOR4
*pv2
, CONST D3DXVECTOR4
*pt2
, FLOAT s
)
503 FLOAT h1
, h2
, h3
, h4
;
505 h1
= 2.0f
* s
* s
* s
- 3.0f
* s
* s
+ 1.0f
;
506 h2
= s
* s
* s
- 2.0f
* s
* s
+ s
;
507 h3
= -2.0f
* s
* s
* s
+ 3.0f
* s
* s
;
508 h4
= s
* s
* s
- s
* s
;
510 pout
->x
= h1
* (pv1
->x
) + h2
* (pt1
->x
) + h3
* (pv2
->x
) + h4
* (pt2
->x
);
511 pout
->y
= h1
* (pv1
->y
) + h2
* (pt1
->y
) + h3
* (pv2
->y
) + h4
* (pt2
->y
);
512 pout
->z
= h1
* (pv1
->z
) + h2
* (pt1
->z
) + h3
* (pv2
->z
) + h4
* (pt2
->z
);
513 pout
->w
= h1
* (pv1
->w
) + h2
* (pt1
->w
) + h3
* (pv2
->w
) + h4
* (pt2
->w
);
517 D3DXVECTOR4
* WINAPI
D3DXVec4Normalize(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv
)
521 norm
= D3DXVec4Length(pv
);
531 pout
->x
= pv
->x
/ norm
;
532 pout
->y
= pv
->y
/ norm
;
533 pout
->z
= pv
->z
/ norm
;
534 pout
->w
= pv
->w
/ norm
;
539 D3DXVECTOR4
* WINAPI
D3DXVec4Transform(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv
, CONST D3DXMATRIX
*pm
)
541 pout
->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
;
542 pout
->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
;
543 pout
->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
;
544 pout
->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
;