2025-11-28 00:35:46 +09:00

177 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;
}