익명의 공용체에 익명 구조체를 쓰는것은 대부분의 C++ 컴파일러가 지원하는 확장이지만 표준은 아니다. 꼴에 표준을 좋아해서 DX에서 쓰이는 아래의 행렬은 새로 작성하고 있는 end 의 행렬객체로는 부적격.
typedef struct _D3DMATRIX {
union {
struct {
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
float m[4][4];
};
} D3DMATRIX;
현재는 이런식으로 행렬 클래스를 설계하고 있다.
namespace end
{
class Matrix4
{
public:
enum ENTRIES
{
_11=0, _12, _13, _14,
_21, _22, _23, _24,
_31, _32, _33, _34,
_41, _42, _43, _44
};
//////////////////////////////////////////////////////////////////////
// 단위행렬 / 영행렬 ---
//
void makeIdentity();
void makeZero();
//////////////////////////////////////////////////////////////////////
// 주어진 행렬로부터 행렬을 만드는 경우 ---
//
void makeFromInverse( const Matrix4& _rMatToGetInvers );
void makeFromMultiply(
const Matrix4* _pMat1,
const Matrix4* _pMat2,
const Matrix4* _pMat3NullIfNotUse = 0,
const Matrix4* _pMat4NullIfNotUse = 0,
const Matrix4* _pMat5NullIfNotUse = 0 );
//////////////////////////////////////////////////////////////////////
// 변환의 용도로 쓰일 행렬을 만드는 경우 ---
//
void makeTransform( const Matrix4& _rMat );
void makeTransformPerspectiveProjectionLH(
float _fFieldOfViewRadians = END_PI/4.f,
float _fAspectRatio = 4.f/3.f,
float _fZNear = 1.0f, float _fZFar = 1000.0f );
void makeTransformPerspectiveProjectionRH(
float _fFieldOfViewRadians = END_PI/4.f,
float _fAspectRatio = 4.f/3.f,
float _fZNear = 1.0f, float _fZFar = 1000.0f );
void makeTransformOrthogonalProjectionLH(
float _fWidth = 800.0f, float _fHeight = 600.0f,
float _fZNear = 0.0f, float _fZFar = 1.0f );
void makeTransformOrthogonalProjectionRH(
float _fWidth = 800.0f, float _fHeight = 600.0f,
float _fZNear = 0.0f, float _fZFar = 1.0f );
void makeTransformViewLH(
const Vector3& _rPosition,
const Vector3& _rDir,
const Vector3& _rUp );
void makeTransformViewRH(
const Vector3& _rPosition,
const Vector3& _rDir,
const Vector3& _rUp );
void makeTransformCoordinateSystem(
const Vector3& _rOrigin,
const Vector3& _rX,
const Vector3& _rY,
const Vector3& _rZ );
//////////////////////////////////////////////////////////////////////
// 행렬연산 ---
//
void multiply( const Matrix4& _rMatToMultiply );
void transformVector3( Vector3& _rOutVecToTransform );
void transformVector4( Vector4& _rOutVecToTransform );
/* 00, 01, 02, 03 = 11, 12, 13, 14
04, 05, 06, 07 = 21, 22, 23, 24
08, 09, 10, 11 = 31, 32, 33, 34
12, 13, 14, 15 = 41, 42, 43, 44 */
float Entries[16];
};
}
음… 나름 괜찮다고 생각중.. 특히 저 makeFromMultiply는 최적화를 잘해줘서 불필요한 임시객체 생성을 막을수 있을듯.