/* * CG_AddEntityToScene */ void CG_AddEntityToScene( entity_t *ent ) { if( ent->model && ( !ent->boneposes || !ent->oldboneposes ) ) { if( trap_R_SkeletalGetNumBones( ent->model, NULL ) ) CG_SetBoneposesForTemporaryEntity( ent ); } trap_R_AddEntityToScene( ent ); }
/* * CG_SkeletonForModel */ cgs_skeleton_t *CG_SkeletonForModel( struct model_s *model ) { int i, j; cgs_skeleton_t *skel; qbyte *buffer; cgs_bone_t *bone; bonepose_t *bonePose; int numBones, numFrames; if( !model ) return NULL; numBones = trap_R_SkeletalGetNumBones( model, &numFrames ); if( !numBones || !numFrames ) return NULL; // no bones or frames for( skel = skel_headnode; skel; skel = skel->next ) { if( skel->model == model ) return skel; } // allocate one huge array to hold our data buffer = CG_Malloc( sizeof( cgs_skeleton_t ) + numBones * sizeof( cgs_bone_t ) + numFrames * ( sizeof( bonepose_t * ) + numBones * sizeof( bonepose_t ) ) ); skel = ( cgs_skeleton_t * )buffer; buffer += sizeof( cgs_skeleton_t ); skel->bones = ( cgs_bone_t * )buffer; buffer += numBones * sizeof( cgs_bone_t ); skel->numBones = numBones; skel->bonePoses = ( bonepose_t ** )buffer; buffer += numFrames * sizeof( bonepose_t * ); skel->numFrames = numFrames; // register bones for( i = 0, bone = skel->bones; i < numBones; i++, bone++ ) bone->parent = trap_R_SkeletalGetBoneInfo( model, i, bone->name, sizeof( bone->name ), &bone->flags ); // register poses for all frames for all bones for( i = 0; i < numFrames; i++ ) { skel->bonePoses[i] = ( bonepose_t * )buffer; buffer += numBones * sizeof( bonepose_t ); for( j = 0, bonePose = skel->bonePoses[i]; j < numBones; j++, bonePose++ ) trap_R_SkeletalGetBonePose( model, j, i, bonePose ); } skel->next = skel_headnode; skel_headnode = skel; skel->model = model; // create a bones tree that can be run from parent to children skel->bonetree = CG_CreateBonesTreeNode( skel, -1 ); #ifdef SKEL_PRINTBONETREE CG_PrintBoneTree( skel, skel->bonetree, 1 ); #endif return skel; }
/* * CG_RegisterModel */ struct model_s *CG_RegisterModel( const char *name ) { struct model_s *model; model = trap_R_RegisterModel( name ); // precache bones if( trap_R_SkeletalGetNumBones( model, NULL ) ) CG_SkeletonForModel( model ); return model; }