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

njCnkGetShape

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

書式

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

引数

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

戻値

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

解説

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

用例

#include <Shinobi.h>
#define OBJECT  object_sample
#define MOTION  motion_sample
#define MDATA3  ((NJS_MDATA3 *) MOTION->mdata)
#define LINEAR  0
#define SPLINE  1
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