It's just like pok    version4


익명 공용체와 익명 구조체 ( anonymous union / anonymous structure )

 | 

익명의 공용체에 익명 구조체를 쓰는것은 대부분의 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는 최적화를 잘해줘서 불필요한 임시객체 생성을 막을수 있을듯.


프로그래밍 하드보일드