David Adam : d3dx8: Allow output pointer to be equal to input pointer.
Alexandre Julliard
julliard at winehq.org
Mon Feb 2 09:01:20 CST 2009
Module: wine
Branch: master
Commit: 77c857d8885e94452854c2c03f401405e3815189
URL: http://source.winehq.org/git/wine.git/?a=commit;h=77c857d8885e94452854c2c03f401405e3815189
Author: David Adam <david.adam.cnrs at gmail.com>
Date: Sat Jan 31 11:17:45 2009 +0100
d3dx8: Allow output pointer to be equal to input pointer.
---
dlls/d3dx8/math.c | 116 ++++++++++++++++++++++++++++++-----------------------
1 files changed, 66 insertions(+), 50 deletions(-)
diff --git a/dlls/d3dx8/math.c b/dlls/d3dx8/math.c
index bcab3b4..8dda418 100644
--- a/dlls/d3dx8/math.c
+++ b/dlls/d3dx8/math.c
@@ -114,6 +114,7 @@ FLOAT WINAPI D3DXMatrixfDeterminant(CONST D3DXMATRIX *pm)
D3DXMATRIX* WINAPI D3DXMatrixInverse(D3DXMATRIX *pout, FLOAT *pdeterminant, CONST D3DXMATRIX *pm)
{
int a, i, j;
+ D3DXMATRIX out;
D3DXVECTOR4 v, vec[3];
FLOAT det;
@@ -135,11 +136,12 @@ D3DXMATRIX* WINAPI D3DXMatrixInverse(D3DXMATRIX *pout, FLOAT *pdeterminant, CONS
}
}
D3DXVec4Cross(&v, &vec[0], &vec[1], &vec[2]);
- pout->u.m[0][i] = pow(-1.0f, i) * v.x / det;
- pout->u.m[1][i] = pow(-1.0f, i) * v.y / det;
- pout->u.m[2][i] = pow(-1.0f, i) * v.z / det;
- pout->u.m[3][i] = pow(-1.0f, i) * v.w / det;
+ out.u.m[0][i] = pow(-1.0f, i) * v.x / det;
+ out.u.m[1][i] = pow(-1.0f, i) * v.y / det;
+ out.u.m[2][i] = pow(-1.0f, i) * v.z / det;
+ out.u.m[3][i] = pow(-1.0f, i) * v.w / det;
}
+ *pout = out;
return pout;
}
@@ -938,23 +940,25 @@ D3DXVECTOR3* WINAPI D3DXPlaneIntersectLine(D3DXVECTOR3 *pout, CONST D3DXPLANE *p
D3DXPLANE* WINAPI D3DXPlaneNormalize(D3DXPLANE *pout, CONST D3DXPLANE *pp)
{
+ D3DXPLANE out;
FLOAT norm;
norm = sqrt(pp->a * pp->a + pp->b * pp->b + pp->c * pp->c);
if ( norm )
{
- pout->a = pp->a / norm;
- pout->b = pp->b / norm;
- pout->c = pp->c / norm;
- pout->d = pp->d / norm;
+ out.a = pp->a / norm;
+ out.b = pp->b / norm;
+ out.c = pp->c / norm;
+ out.d = pp->d / norm;
}
else
{
- pout->a = 0.0f;
- pout->b = 0.0f;
- pout->c = 0.0f;
- pout->d = 0.0f;
+ out.a = 0.0f;
+ out.b = 0.0f;
+ out.c = 0.0f;
+ out.d = 0.0f;
}
+ *pout = out;
return pout;
}
@@ -1062,23 +1066,25 @@ D3DXQUATERNION* WINAPI D3DXQuaternionMultiply(D3DXQUATERNION *pout, CONST D3DXQU
D3DXQUATERNION* WINAPI D3DXQuaternionNormalize(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq)
{
+ D3DXQUATERNION out;
FLOAT norm;
norm = D3DXQuaternionLength(pq);
if ( !norm )
{
- pout->x = 0.0f;
- pout->y = 0.0f;
- pout->z = 0.0f;
- pout->w = 0.0f;
+ out.x = 0.0f;
+ out.y = 0.0f;
+ out.z = 0.0f;
+ out.w = 0.0f;
}
else
{
- pout->x = pq->x / norm;
- pout->y = pq->y / norm;
- pout->z = pq->z / norm;
- pout->w = pq->w / norm;
+ out.x = pq->x / norm;
+ out.y = pq->y / norm;
+ out.z = pq->z / norm;
+ out.w = pq->w / norm;
}
+ *pout=out;
return pout;
}
@@ -1229,19 +1235,21 @@ D3DXVECTOR2* WINAPI D3DXVec2Hermite(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, C
D3DXVECTOR2* WINAPI D3DXVec2Normalize(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv)
{
+ D3DXVECTOR2 out;
FLOAT norm;
norm = D3DXVec2Length(pv);
if ( !norm )
{
- pout->x = 0.0f;
- pout->y = 0.0f;
+ out.x = 0.0f;
+ out.y = 0.0f;
}
else
{
- pout->x = pv->x / norm;
- pout->y = pv->y / norm;
+ out.x = pv->x / norm;
+ out.y = pv->y / norm;
}
+ *pout=out;
return pout;
}
@@ -1316,35 +1324,38 @@ D3DXVECTOR3* WINAPI D3DXVec3Hermite(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, C
D3DXVECTOR3* WINAPI D3DXVec3Normalize(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv)
{
+ D3DXVECTOR3 out;
FLOAT norm;
norm = D3DXVec3Length(pv);
if ( !norm )
{
- pout->x = 0.0f;
- pout->y = 0.0f;
- pout->z = 0.0f;
+ out.x = 0.0f;
+ out.y = 0.0f;
+ out.z = 0.0f;
}
else
{
- pout->x = pv->x / norm;
- pout->y = pv->y / norm;
- pout->z = pv->z / norm;
+ out.x = pv->x / norm;
+ out.y = pv->y / norm;
+ out.z = pv->z / norm;
}
+ *pout = out;
return pout;
}
D3DXVECTOR3* WINAPI D3DXVec3Project(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, CONST D3DVIEWPORT8 *pviewport, CONST D3DXMATRIX *pprojection, CONST D3DXMATRIX *pview, CONST D3DXMATRIX *pworld)
{
D3DXMATRIX m1, m2;
- D3DXVECTOR3 vec;
+ D3DXVECTOR3 out, vec;
D3DXMatrixMultiply(&m1, pworld, pview);
D3DXMatrixMultiply(&m2, &m1, pprojection);
D3DXVec3TransformCoord(&vec, pv, &m2);
- pout->x = pviewport->X + ( 1.0f + vec.x ) * pviewport->Width / 2.0f;
- pout->y = pviewport->Y + ( 1.0f - vec.y ) * pviewport->Height / 2.0f;
- pout->z = pviewport->MinZ + vec.z * ( pviewport->MaxZ - pviewport->MinZ );
+ out.x = pviewport->X + ( 1.0f + vec.x ) * pviewport->Width / 2.0f;
+ out.y = pviewport->Y + ( 1.0f - vec.y ) * pviewport->Height / 2.0f;
+ out.z = pviewport->MinZ + vec.z * ( pviewport->MaxZ - pviewport->MinZ );
+ *pout = out;
return pout;
}
@@ -1359,6 +1370,7 @@ D3DXVECTOR4* WINAPI D3DXVec3Transform(D3DXVECTOR4 *pout, CONST D3DXVECTOR3 *pv,
D3DXVECTOR3* WINAPI D3DXVec3TransformCoord(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, CONST D3DXMATRIX *pm)
{
+ D3DXVECTOR3 out;
FLOAT norm;
norm = pm->u.m[0][3] * pv->x + pm->u.m[1][3] * pv->y + pm->u.m[2][3] *pv->z + pm->u.m[3][3];
@@ -1366,16 +1378,17 @@ D3DXVECTOR3* WINAPI D3DXVec3TransformCoord(D3DXVECTOR3 *pout, CONST D3DXVECTOR3
if ( norm )
{
CONST D3DXVECTOR3 v = *pv;
- pout->x = (pm->u.m[0][0] * v.x + pm->u.m[1][0] * v.y + pm->u.m[2][0] * v.z + pm->u.m[3][0]) / norm;
- pout->y = (pm->u.m[0][1] * v.x + pm->u.m[1][1] * v.y + pm->u.m[2][1] * v.z + pm->u.m[3][1]) / norm;
- pout->z = (pm->u.m[0][2] * v.x + pm->u.m[1][2] * v.y + pm->u.m[2][2] * v.z + pm->u.m[3][2]) / norm;
+ out.x = (pm->u.m[0][0] * v.x + pm->u.m[1][0] * v.y + pm->u.m[2][0] * v.z + pm->u.m[3][0]) / norm;
+ out.y = (pm->u.m[0][1] * v.x + pm->u.m[1][1] * v.y + pm->u.m[2][1] * v.z + pm->u.m[3][1]) / norm;
+ out.z = (pm->u.m[0][2] * v.x + pm->u.m[1][2] * v.y + pm->u.m[2][2] * v.z + pm->u.m[3][2]) / norm;
}
else
{
- pout->x = 0.0f;
- pout->y = 0.0f;
- pout->z = 0.0f;
+ out.x = 0.0f;
+ out.y = 0.0f;
+ out.z = 0.0f;
}
+ *pout = out;
return pout;
}
@@ -1392,7 +1405,7 @@ D3DXVECTOR3* WINAPI D3DXVec3TransformNormal(D3DXVECTOR3 *pout, CONST D3DXVECTOR3
D3DXVECTOR3* WINAPI D3DXVec3Unproject(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, CONST D3DVIEWPORT8 *pviewport, CONST D3DXMATRIX *pprojection, CONST D3DXMATRIX *pview, CONST D3DXMATRIX *pworld)
{
D3DXMATRIX m1, m2, m3;
- D3DXVECTOR3 vec;
+ D3DXVECTOR3 out, vec;
D3DXMatrixMultiply(&m1, pworld, pview);
D3DXMatrixMultiply(&m2, &m1, pprojection);
@@ -1400,7 +1413,8 @@ D3DXVECTOR3* WINAPI D3DXVec3Unproject(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv,
vec.x = 2.0f * ( pv->x - pviewport->X ) / pviewport->Width - 1.0f;
vec.y = 1.0f - 2.0f * ( pv->y - pviewport->Y ) / pviewport->Height;
vec.z = ( pv->z - pviewport->MinZ) / ( pviewport->MaxZ - pviewport->MinZ );
- D3DXVec3TransformCoord(pout, &vec, &m3);
+ D3DXVec3TransformCoord(&out, &vec, &m3);
+ *pout = out;
return pout;
}
@@ -1453,23 +1467,25 @@ D3DXVECTOR4* WINAPI D3DXVec4Hermite(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, C
D3DXVECTOR4* WINAPI D3DXVec4Normalize(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv)
{
+ D3DXVECTOR4 out;
FLOAT norm;
norm = D3DXVec4Length(pv);
if ( !norm )
{
- pout->x = 0.0f;
- pout->y = 0.0f;
- pout->z = 0.0f;
- pout->w = 0.0f;
+ out.x = 0.0f;
+ out.y = 0.0f;
+ out.z = 0.0f;
+ out.w = 0.0f;
}
else
{
- pout->x = pv->x / norm;
- pout->y = pv->y / norm;
- pout->z = pv->z / norm;
- pout->w = pv->w / norm;
+ out.x = pv->x / norm;
+ out.y = pv->y / norm;
+ out.z = pv->z / norm;
+ out.w = pv->w / norm;
}
+ *pout = out;
return pout;
}
More information about the wine-cvs
mailing list