summaryrefslogtreecommitdiff
path: root/utils/printbones
diff options
context:
space:
mode:
Diffstat (limited to 'utils/printbones')
-rw-r--r--utils/printbones/printbones.cpp101
-rw-r--r--utils/printbones/printbones.vpc18
2 files changed, 119 insertions, 0 deletions
diff --git a/utils/printbones/printbones.cpp b/utils/printbones/printbones.cpp
new file mode 100644
index 0000000..1ab4d67
--- /dev/null
+++ b/utils/printbones/printbones.cpp
@@ -0,0 +1,101 @@
+//========= 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;
+} \ No newline at end of file
diff --git a/utils/printbones/printbones.vpc b/utils/printbones/printbones.vpc
new file mode 100644
index 0000000..95b6293
--- /dev/null
+++ b/utils/printbones/printbones.vpc
@@ -0,0 +1,18 @@
+//-----------------------------------------------------------------------------
+// PRINTBONES.VPC
+//
+// Project Script
+//-----------------------------------------------------------------------------
+
+$Macro SRCDIR "..\.."
+$Macro OUTBINDIR "$SRCDIR\..\game\bin"
+
+$Include "$SRCDIR\vpc_scripts\source_exe_con_win32_base.vpc"
+
+$Project "Printbones"
+{
+ $Folder "Source Files"
+ {
+ $File "printbones.cpp"
+ }
+}