How D3DXMATRIX Variables work?

Started by
1 comment, last by Zao 16 years, 4 months ago
Just wondering how its done: D3DXMATRIX structure allow user to manipulate its matrix by: e,g Matrix._11, Matrix._34 and Matrix.m[0][0], Matrix.m[2][3], in a array format How is it that if i set Matrix._11 = 10.0f, Matrix.m[0][0] also get updated by itself? Thanks
Advertisement
D3DXMATRIX publicly inherits from D3DMATRIX, to add a variety of operations.

The answer to your question is that D3DMATRIX uses a union to define a struct of sixteen floats that occupies the same space as a four-by-four array of floats.

// D3DMATRIXtypedef 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;// D3DXMATRIXtypedef struct D3DXMATRIX : public D3DMATRIX{public:    D3DXMATRIX() {};    D3DXMATRIX( CONST FLOAT * );    D3DXMATRIX( CONST D3DMATRIX& );    D3DXMATRIX( CONST D3DXFLOAT16 * );    D3DXMATRIX( FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14,                FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24,                FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34,                FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 );    // access grants    FLOAT& operator () ( UINT Row, UINT Col );    FLOAT  operator () ( UINT Row, UINT Col ) const;    // casting operators    operator FLOAT* ();    operator CONST FLOAT* () const;    // assignment operators    D3DXMATRIX& operator *= ( CONST D3DXMATRIX& );    D3DXMATRIX& operator += ( CONST D3DXMATRIX& );    D3DXMATRIX& operator -= ( CONST D3DXMATRIX& );    D3DXMATRIX& operator *= ( FLOAT );    D3DXMATRIX& operator /= ( FLOAT );    // unary operators    D3DXMATRIX operator + () const;    D3DXMATRIX operator - () const;    // binary operators    D3DXMATRIX operator * ( CONST D3DXMATRIX& ) const;    D3DXMATRIX operator + ( CONST D3DXMATRIX& ) const;    D3DXMATRIX operator - ( CONST D3DXMATRIX& ) const;    D3DXMATRIX operator * ( FLOAT ) const;    D3DXMATRIX operator / ( FLOAT ) const;    friend D3DXMATRIX operator * ( FLOAT, CONST D3DXMATRIX& );    BOOL operator == ( CONST D3DXMATRIX& ) const;    BOOL operator != ( CONST D3DXMATRIX& ) const;} D3DXMATRIX, *LPD3DXMATRIX;
Ring3 Circus - Diary of a programmer, journal of a hacker.
All the magic is in the base of D3DXMATRIX which is D3DMATRIX.
If you look in d3d9types.h, you'll see that D3DMATRIX is defined like this:
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;

To make it is hell. To fail is divine.

This topic is closed to new replies.

Advertisement