You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.0 KiB
101 lines
2.0 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include <stdio.h> |
|
#include <string.h> |
|
#include "studio.h" |
|
|
|
int g_NumBonesInLOD[MAX_NUM_LODS]; |
|
|
|
void Usage( void ) |
|
{ |
|
fprintf( stderr, "Usage: printbones blah.mdl\n" ); |
|
exit( -1 ); |
|
} |
|
|
|
void PrintSpaces( int numSpaces ) |
|
{ |
|
int i; |
|
for( i = 0; i < numSpaces; i++ ) |
|
{ |
|
printf( " " ); |
|
} |
|
} |
|
|
|
void PrintBoneGraphRecursive( studiohdr_t *phdr, int boneIndex, int level ) |
|
{ |
|
int j; |
|
PrintSpaces( level ); |
|
printf( "%d \"%s\" ", boneIndex, phdr->pBone( boneIndex )->pszName() ); |
|
int i; |
|
for( i = 0; i < 8; i++ ) |
|
{ |
|
if( phdr->pBone( boneIndex )->flags & ( BONE_USED_BY_VERTEX_LOD0 << i ) ) |
|
{ |
|
printf( "lod%d ", i ); |
|
g_NumBonesInLOD[i]++; |
|
} |
|
} |
|
printf( "\n" ); |
|
for( j = 0; j < phdr->numbones; j++ ) |
|
{ |
|
mstudiobone_t *pBone = phdr->pBone( j ); |
|
if( pBone->parent == boneIndex ) |
|
{ |
|
PrintBoneGraphRecursive( phdr, j, level+1 ); |
|
} |
|
} |
|
} |
|
|
|
int main( int argc, char **argv ) |
|
{ |
|
if( argc != 2 ) |
|
{ |
|
Usage(); |
|
} |
|
|
|
memset( g_NumBonesInLOD, 0, sizeof( int ) * MAX_NUM_LODS ); |
|
|
|
FILE *fp; |
|
fp = fopen( argv[1], "rb" ); |
|
if( !fp ) |
|
{ |
|
fprintf( stderr, "Can't open: %s\n", argv[1] ); |
|
Usage(); |
|
} |
|
fseek( fp, 0, SEEK_END ); |
|
int len = ftell( fp ); |
|
rewind( fp ); |
|
|
|
studiohdr_t *pStudioHdr = ( studiohdr_t * )malloc( len ); |
|
fread( pStudioHdr, 1, len, fp ); |
|
Studio_ConvertStudioHdrToNewVersion( pStudioHdr ); |
|
if( pStudioHdr->version != STUDIO_VERSION ) |
|
{ |
|
fprintf( stderr, "Wrong version (%d != %d)\n", ( int )pStudioHdr->version, ( int )STUDIO_VERSION ); |
|
Usage(); |
|
} |
|
|
|
int i; |
|
for( i = 0; i < pStudioHdr->numbones; i++ ) |
|
{ |
|
mstudiobone_t *pBone = pStudioHdr->pBone( i ); |
|
if( pBone->parent == -1 ) |
|
{ |
|
PrintBoneGraphRecursive( pStudioHdr, i, 0 ); |
|
} |
|
} |
|
|
|
fclose( fp ); |
|
|
|
for( i = 0; i < MAX_NUM_LODS; i++ ) |
|
{ |
|
printf( "%d bones used in lod %d\n", g_NumBonesInLOD[i], i ); |
|
} |
|
|
|
return 0; |
|
} |