179 lines
4.5 KiB
C
179 lines
4.5 KiB
C
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
// PARTICULAR PURPOSE.
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved
|
|
|
|
|
|
|
|
/******************************************************************
|
|
* *
|
|
* d3dmath.h *
|
|
* *
|
|
* 3D utilities *
|
|
* *
|
|
******************************************************************/
|
|
|
|
#pragma once
|
|
|
|
inline D3DXMATRIX* D3DMatrixIdentity(D3DXMATRIX *pOut)
|
|
{
|
|
pOut->m[0][1] = pOut->m[0][2] = pOut->m[0][3] =
|
|
pOut->m[1][0] = pOut->m[1][2] = pOut->m[1][3] =
|
|
pOut->m[2][0] = pOut->m[2][1] = pOut->m[2][3] =
|
|
pOut->m[3][0] = pOut->m[3][1] = pOut->m[3][2] = 0.0f;
|
|
|
|
pOut->m[0][0] = pOut->m[1][1] = pOut->m[2][2] = pOut->m[3][3] = 1.0f;
|
|
return pOut;
|
|
}
|
|
|
|
static inline void sincosf(float angle, float *psin, float *pcos)
|
|
{
|
|
*psin = sinf(angle);
|
|
*pcos = cosf(angle);
|
|
}
|
|
|
|
inline D3DXMATRIX* D3DMatrixRotationY(D3DXMATRIX* pOut, float angle)
|
|
{
|
|
float s, c;
|
|
sincosf(angle, &s, &c);
|
|
|
|
pOut->_11 = c; pOut->_12 = 0.0f; pOut->_13 = -s; pOut->_14 = 0.0f;
|
|
pOut->_21 = 0.0f; pOut->_22 = 1.0f; pOut->_23 = 0.0f; pOut->_24 = 0.0f;
|
|
pOut->_31 = s; pOut->_32 = 0.0f; pOut->_33 = c; pOut->_34 = 0.0f;
|
|
pOut->_41 = 0.0f; pOut->_42 = 0.0f; pOut->_43 = 0.0f; pOut->_44 = 1.0f;
|
|
|
|
return pOut;
|
|
}
|
|
|
|
inline D3DXVECTOR3* D3DVec3Subtract(D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2)
|
|
{
|
|
pOut->x = pV1->x - pV2->x;
|
|
pOut->y = pV1->y - pV2->y;
|
|
pOut->z = pV1->z - pV2->z;
|
|
return pOut;
|
|
}
|
|
|
|
inline FLOAT D3DVec3LengthSq(CONST D3DXVECTOR3 *pV)
|
|
{
|
|
return pV->x * pV->x + pV->y * pV->y + pV->z * pV->z;
|
|
}
|
|
|
|
|
|
static inline BOOL WithinEpsilon(float a, float b)
|
|
{
|
|
float f = a - b;
|
|
return -FLT_EPSILON <= f && f <= FLT_EPSILON;
|
|
}
|
|
|
|
|
|
inline D3DXVECTOR3* D3DVec3Normalize(D3DXVECTOR3* pOut, const D3DXVECTOR3* pV)
|
|
{
|
|
float f = D3DVec3LengthSq(pV);
|
|
|
|
if(WithinEpsilon(f, 1.0f))
|
|
{
|
|
if(pOut != pV)
|
|
*pOut = *pV;
|
|
}
|
|
else if(f > FLT_MIN)
|
|
{
|
|
*pOut = *pV / sqrtf(f);
|
|
}
|
|
else
|
|
{
|
|
pOut->x = 0.0f;
|
|
pOut->y = 0.0f;
|
|
pOut->z = 0.0f;
|
|
}
|
|
|
|
return pOut;
|
|
}
|
|
|
|
|
|
inline D3DXVECTOR3* D3DVec3Cross(D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2)
|
|
{
|
|
D3DXVECTOR3 v;
|
|
|
|
v.x = pV1->y * pV2->z - pV1->z * pV2->y;
|
|
v.y = pV1->z * pV2->x - pV1->x * pV2->z;
|
|
v.z = pV1->x * pV2->y - pV1->y * pV2->x;
|
|
|
|
*pOut = v;
|
|
return pOut;
|
|
}
|
|
|
|
inline FLOAT D3DVec3Dot(CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2)
|
|
{
|
|
return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z;
|
|
}
|
|
|
|
inline D3DXMATRIX* D3DMatrixLookAtLH(D3DXMATRIX *pOut, const D3DXVECTOR3 *pEye, const D3DXVECTOR3 *pAt, const D3DXVECTOR3 *pUp)
|
|
{
|
|
D3DXVECTOR3 XAxis, YAxis, ZAxis;
|
|
|
|
// Compute direction of gaze. (+Z)
|
|
D3DVec3Subtract(&ZAxis, pAt, pEye);
|
|
D3DVec3Normalize(&ZAxis, &ZAxis);
|
|
|
|
// Compute orthogonal axes from cross product of gaze and pUp vector.
|
|
D3DVec3Cross(&XAxis, pUp, &ZAxis);
|
|
D3DVec3Normalize(&XAxis, &XAxis);
|
|
D3DVec3Cross(&YAxis, &ZAxis, &XAxis);
|
|
|
|
// Set rotation and translate by pEye
|
|
pOut->_11 = XAxis.x;
|
|
pOut->_21 = XAxis.y;
|
|
pOut->_31 = XAxis.z;
|
|
pOut->_41 = -D3DVec3Dot(&XAxis, pEye);
|
|
|
|
pOut->_12 = YAxis.x;
|
|
pOut->_22 = YAxis.y;
|
|
pOut->_32 = YAxis.z;
|
|
pOut->_42 = -D3DVec3Dot(&YAxis, pEye);
|
|
|
|
pOut->_13 = ZAxis.x;
|
|
pOut->_23 = ZAxis.y;
|
|
pOut->_33 = ZAxis.z;
|
|
pOut->_43 = -D3DVec3Dot(&ZAxis, pEye);
|
|
|
|
pOut->_14 = 0.0f;
|
|
pOut->_24 = 0.0f;
|
|
pOut->_34 = 0.0f;
|
|
pOut->_44 = 1.0f;
|
|
|
|
return pOut;
|
|
}
|
|
|
|
inline D3DXMATRIX* D3DMatrixPerspectiveFovLH(D3DXMATRIX *pOut, float fovy, float aspect, float zn, float zf)
|
|
{
|
|
float s, c;
|
|
sincosf(0.5f * fovy, &s, &c);
|
|
|
|
float h = c / s;
|
|
float w = h / aspect;
|
|
|
|
pOut->_11 = w;
|
|
pOut->_12 = 0.0f;
|
|
pOut->_13 = 0.0f;
|
|
pOut->_14 = 0.0f;
|
|
|
|
pOut->_21 = 0.0f;
|
|
pOut->_22 = h;
|
|
pOut->_23 = 0.0f;
|
|
pOut->_24 = 0.0f;
|
|
|
|
pOut->_31 = 0.0f;
|
|
pOut->_32 = 0.0f;
|
|
pOut->_33 = zf / (zf - zn);
|
|
pOut->_34 = 1.0f;
|
|
|
|
pOut->_41 = 0.0f;
|
|
pOut->_42 = 0.0f;
|
|
pOut->_43 = -pOut->_33 * zn;
|
|
pOut->_44 = 0.0f;
|
|
|
|
return pOut;
|
|
}
|