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
5 years ago
|
//========= 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;
|
||
|
}
|