Ninjaライブラリ - モーション関数

njCnkGetShape

ノード・モーション情報関数(移動)

書式

Int  njCnkGetShape( *cnkobj, *buffer, spline_flag ) 
NJS_CNK_OBJECT *cnkobj 
Float *buffer 
Int spline_flag 

引数

*cnkobj   オブジェクト
*buffer   頂点リストの格納されるバッファ(ただし、モデルの頂点リストの最大サイズ)
spline_flag   スプライン属性フラグ(0:リニア、1:スプライン)

戻り値

 指定されたノードの頂点リスト情報がバッファに格納された
 指定されたノードに頂点リスト情報が無いので未格納

解説

ノード毎のチャンクモデルの頂点リスト情報を与えられた引数に格納します。 バッファは、引数がNULLのときにはnjInitShape関数で指定されたバッファを使用します。 使用前にはnjCnkSetCurrentShape関数を呼ぶ必要があります(用例参照)。

用例

extern NJS_MOTION MOTION[];
extern NJS_OBJECT OBJECT[];
Float ff = 0.f;
Int spline_flg = SPLINE;
/*このmdataはオブジェクト情報取得のため*/
NJS_MDATA3 *mdata;
	:
Sint32 njUserMain(void)
{
 	:
 mdata = MDATA3;
 njSetCurrentMotion(MOTION, ff );
 njCnkSetCurrentShape(shape, NJD_CV_VN, ff );
 PushPopMotion( OBJECT );
 ff+=0.2f;
 if( ff >= (MOTION->nbFrame-1) ) ff=0.f;
 	:
}
void
PushPopMotion( NJS_CNK_OBJECT *cnkobj )
{
    Float	pos[3], scl[3];
    Angle	ang[3];
    Sint32	*vlist;

    do {
        njPushMatrix( NULL );

        if (mdata->p[0] != NULL) {
    	    njGetMotionTranslate( pos, spline_flg );
        } else {
    	    pos[0] = cnkobj->pos[0];
    	    pos[1] = cnkobj->pos[1];
    	    pos[2] = cnkobj->pos[2];
        }

        if (mdata->p[1] != NULL) {
    	    njGetMotionRotate( ang, spline_flg );
        } else {
    	    ang[0] = cnkobj->ang[0];
    	    ang[1] = cnkobj->ang[1];
    	    ang[2] = cnkobj->ang[2];
        }

        if (mdata->p[2] != NULL) {
    	    njGetMotionScale( scl, spline_flg );
        } else {
    	    scl[0] = cnkobj->scl[0];
    	    scl[1] = cnkobj->scl[1];
    	    scl[2] = cnkobj->scl[2];
        }

        njTranslate( NULL, pos[0], pos[1], pos[2] );
        njRotateZXY( NULL, ang[0], ang[1], ang[2] );
        njScale( NULL, scl[0], scl[1], scl[2] );
        njSetNextMotionNode();
        mdata++;
        if ( cnkobj->model != NULL )
	    vlist = cnkobj->model->vlist;

        if ( !(cnkobj->evalflags & NJD_EVAL_SHAPE_SKIP)) {
    	    if (njCnkGetShape(cnkobj, NULL, spline_flg))
		cnkobj->model->vlist = (Sint32*)sbuf;
        }

        if( (cnkobj->model != NULL)
		&& (!(cnkobj->evalflags & NJD_EVAL_HIDE)) ) {
    	    njCnkEasyDrawModel( cnkobj->model );
    	    cnkobj->model->vlist = vlist;
        }

        if( cnkobj->child != NULL )
    	    PushPopMotion( (NJS_CNK_OBJECT*)cnkobj->child );

        njPopMatrix( 1 );

        cnkobj = cnkobj->sibling;
    } while( cnkobj != NULL );
}
	:

備考

この関数は、チャンクモデルの親子階層をたどる(プッシュ・ポップ)中で使用するための関数です。

参照

njCnkSetCurrentShape()

njCnkGetShape
COPYRIGHT © SEGA ENTERPRISES, LTD., 1998,1999