# NNSG3dRenderObj

## 構造体の定義

    #include <nnsys/g3d/kernel.h>

    typedef struct NNSG3dRenderObj_
    {
        u32 flag; // NNSG3dRenderObjFlag

        NNSG3dResMdl*         resMdl;
        NNSG3dAnmObj*         anmMat;
        NNSG3dFuncAnmBlendMat funcBlendMat;
        NNSG3dAnmObj*         anmJnt;
        NNSG3dFuncAnmBlendJnt funcBlendJnt;
        NNSG3dAnmObj*         anmVis;
        NNSG3dFuncAnmBlendVis funcBlendVis;

        // コールバック用情報
        NNSG3dSbcCallBackFunc cbFunc;              // NULLならばコールバックはない。
        u8                    cbCmd;               // 停止位置をコマンドで指定。NNS_G3D_SBC_*****(res_struct.hで定義)
        u8                    cbTiming;            // NNSG3dSbcCallBackTiming(sbc.hで定義)
        u16                   dummy_;

        // レンダリング開始直前に呼ばれる。一般的にNNS_G3dRSの
        // コールバックベクタを設定するために使われる。
        NNSG3dSbcCallBackFunc cbInitFunc;

        // ユーザーが管理する領域へのポインタ
        // あらかじめポインタを設定しておけばコールバックでの使用が可能.
        void*                 ptrUser;

        u8*                   ptrUserSbc;

        struct NNSG3dJntAnmResult_*   recJntAnm;
        struct NNSG3dMatAnmResult_*   recMatAnm;

        u32 hintMatAnmExist[NNS_G3D_SIZE_MAT_MAX / 32];
        u32 hintJntAnmExist[NNS_G3D_SIZE_JNT_MAX / 32];
        u32 hintVisAnmExist[NNS_G3D_SIZE_JNT_MAX / 32];
    }
    NNSG3dRenderObj;

## 構造体の解説

`NNSG3dRenderObj`構造体は、モデルの描画に際して必要なデータをまとめた構造体です。`NNSG3dRenderObj`構造体は、以下のようなデータを保持しています。

- モデルリソース(`NNSG3dResMdl`)へのポインタ
- アニメーションオブジェクト(`NNSG3dAnmObj`)へのポインタ
- アニメーションブレンド関数へのポインタ
- コールバックの設定
- イニシャライズ関数へのポインタ
- アニメーション計算格納のためのバッファ(`NNSG3dJntAnmResult`, `NNSG3dMatAnmResult`)へのポインタ
- 動作の最適化やカスタマイズのためのフラグ群

`NNSG3dRenderObj`構造体を利用してモデルを描画するためには、以下のような処理が必要となります。

1. `NNS_G3dAllocRenderObj`関数を使用して（利用せずにスタックに確保しても可）、構造体の領域を確保します。
2. `NNS_G3dRenderObjInit`関数を使用して、構造体を初期化します。
3. アニメーションさせる場合には、`NNS_G3dRenderObjAddAnmObj`関数でアニメーションオブジェクトを追加します。
4. コールバック処理が必要な場合は、`NNS_G3dRenderObjSetCallBack`関数や`NNS_G3dRenderObjSetInitFunc`関数でコールバック関数を登録します。
5. ジョイントやマテリアル計算の結果を再利用する場合には、`NNS_G3dRenderObjSetJntAnmBuffer`関数や `NNS_G3dRenderObjSetMatAnmBuffer`関数を使用してバッファを`NNSG3dRenderObj`構造体に登録します。
6. `NNS_G3dDraw`関数を使用して描画します。
7. 必要なくなったら、`NNS_G3dFreeRenderObj`関数を使用して、確保した領域を解放します。

なお、`NNS_G3dDraw1Mat1Shp`関数を使用して描画する場合には`NNSG3dRenderObj`構造体を用意する必要はありません。

## 参照

カーネル

## 履歴

2007/05/17 構造体の定義を追加
2004/10/12 初版