diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/mdlinfo/main.cpp | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'utils/mdlinfo/main.cpp')
| -rw-r--r-- | utils/mdlinfo/main.cpp | 886 |
1 files changed, 886 insertions, 0 deletions
diff --git a/utils/mdlinfo/main.cpp b/utils/mdlinfo/main.cpp new file mode 100644 index 0000000..877b988 --- /dev/null +++ b/utils/mdlinfo/main.cpp @@ -0,0 +1,886 @@ +//============ Copyright (c) Valve Corporation, All rights reserved. ==========++; +// +//============================================================================= + + +// Valve includes +#include "appframework/appframework.h" +#include "appframework/tier3app.h" +#include "filesystem.h" +#include "icommandline.h" +#include "mathlib/mathlib.h" +#include "tier1/tier1.h" +#include "tier2/tier2.h" +#include "tier3/tier3.h" +#include "tier1/utlbuffer.h" +#include "tier1/fmtstr.h" +#include "studio.h" +#include "datacache/idatacache.h" +#include "datacache/imdlcache.h" +#include "vphysics_interface.h" +#include "materialsystem/imaterialsystem.h" +#include "istudiorender.h" +#include "vstdlib/iprocessutils.h" +#include "tier2/fileutils.h" + + +// Last include +#include "tier0/memdbgon.h" + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +static CFmtStr PrettyPrintFloat( const float &flVal, float flEps = 0.000005f ) +{ + if ( FloatMakePositive( flVal ) <= flEps ) + { + return CFmtStr( "%.6f", 0.0f ); + } + + return CFmtStr( "%.6f", flVal ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +static CFmtStr PrettyPrintVector( const Vector &v ) +{ + return CFmtStr( "%s %s %s", + PrettyPrintFloat( v.x ).Get(), + PrettyPrintFloat( v.y ).Get(), + PrettyPrintFloat( v.z ).Get() ); +} + + +//----------------------------------------------------------------------------- +// A src bone transform transforms pre-compiled data (.dmx or .smd files, for example) +// into post-compiled data (.mdl or .ani files) +//----------------------------------------------------------------------------- +static const mstudiosrcbonetransform_t *GetSrcBoneTransform( const studiohdr_t *pStudioHdr, int nBoneIndex ) +{ + if ( !pStudioHdr || nBoneIndex < 0 || nBoneIndex >= pStudioHdr->numbones ) + return false; + + const char *pszBoneName = pStudioHdr->pBone( nBoneIndex )->pszName(); + const int nSrcBoneTransformCount = pStudioHdr->NumSrcBoneTransforms(); + for ( int i = 0; i < nSrcBoneTransformCount; ++i ) + { + const mstudiosrcbonetransform_t *pSrcBoneTransform = pStudioHdr->SrcBoneTransform( i ); + if ( pSrcBoneTransform && !Q_stricmp( pSrcBoneTransform->pszName(), pszBoneName ) ) + return pSrcBoneTransform; + } + + return NULL; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +struct CommandLineBinaryOpt_t +{ + const char *m_pszShortName; + const char *m_pszLongName; + const char *m_pszDoc; +}; + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +class CMdlInfoApp : public CTier3SteamApp +{ + typedef CTier3SteamApp BaseClass; + +public: + CMdlInfoApp(); + + // Methods of IApplication + virtual bool Create() OVERRIDE; + virtual bool PreInit() OVERRIDE; + virtual int Startup() OVERRIDE; + virtual int Main() OVERRIDE; + virtual void Shutdown() OVERRIDE; + virtual void PostShutdown() OVERRIDE; + virtual void Destroy() OVERRIDE {}; + + static const CommandLineBinaryOpt_t s_binaryOptions[]; + + bool m_bOptAll; + bool m_bOptVerbose; + + static const char kOptHelp[]; + static const char kOptVerbose[]; + + static const char kOptInput[]; + + static const char kOptGeneral[]; + static const char kOptBones[]; + static const char kOptAttachments[]; + static const char kOptAnimation[]; + static const char kOptSequence[]; + static const char kOptMesh[]; + static const char kOptTexture[]; + static const char kOptSkin[]; + + static bool CommandLineHasOpt( const char *pszOpt ); + + bool DoIt( const char *pszFileIn ); + void HandleOptions(); + static MDLHandle_t GetMDLHandle( const char *pszFilename ); + void PrintHelp(); + + void DumpGeneral( MDLHandle_t hMdl, CStudioHdr &cStudioHdr ) const; + void DumpBones( CStudioHdr &cStudioHdr ) const; + void DumpAttachments( CStudioHdr &cStudioHdr ) const; + void DumpAnimationList( CStudioHdr &cStudioHdr ) const; + void DumpSequenceList( CStudioHdr &cStudioHdr ) const; + void DumpMesh( CStudioHdr &cStudioHdr ) const; + void DumpTexture( CStudioHdr &cStudioHdr ) const; + void DumpSkin( CStudioHdr &cStudioHdr ) const; +}; + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +const char CMdlInfoApp::kOptHelp[] = "-help"; +const char CMdlInfoApp::kOptVerbose[] = "-verbose"; + +const char CMdlInfoApp::kOptInput[] = "-input"; + +const char CMdlInfoApp::kOptGeneral[] = "-general"; +const char CMdlInfoApp::kOptBones[] = "-bones"; +const char CMdlInfoApp::kOptAttachments[] = "-attachments"; +const char CMdlInfoApp::kOptAnimation[] = "-animation"; +const char CMdlInfoApp::kOptSequence[] = "-sequence"; +const char CMdlInfoApp::kOptMesh[] = "-mesh"; +const char CMdlInfoApp::kOptTexture[] = "-texture"; +const char CMdlInfoApp::kOptSkin[] = "-skin"; + +const CommandLineBinaryOpt_t CMdlInfoApp::s_binaryOptions[] = +{ + { "-h", kOptHelp, "Print usage information" }, + { "-v", kOptVerbose, "Print extra junk" }, + + { "-i", kOptInput, "Specifies the input MDL file" }, + + { "-g", kOptGeneral, "Print general information section" }, + { "-b", kOptBones, "Print bones/skeleton section" }, + { "-at", kOptAttachments, "Print attachments section" }, + { "-a", kOptAnimation, "Print animation section" }, + { "-s", kOptSequence, "Print sequence section" }, + { "-m", kOptMesh, "Print mesh section" }, + { "-t", kOptTexture, "Print texture section" }, + { "-k", kOptSkin, "Print sKin section" } +}; + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +DEFINE_CONSOLE_STEAM_APPLICATION_OBJECT( CMdlInfoApp ); + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +CMdlInfoApp::CMdlInfoApp() +: m_bOptAll( true ) +, m_bOptVerbose( false ) +{ +} + + +//----------------------------------------------------------------------------- +// The application object +//----------------------------------------------------------------------------- +bool CMdlInfoApp::Create() +{ + AppSystemInfo_t appSystems[] = + { + { "vstdlib.dll", PROCESS_UTILS_INTERFACE_VERSION }, + { "materialsystem.dll", MATERIAL_SYSTEM_INTERFACE_VERSION }, + { "datacache.dll", DATACACHE_INTERFACE_VERSION }, + { "datacache.dll", MDLCACHE_INTERFACE_VERSION }, + { "vphysics.dll", VPHYSICS_INTERFACE_VERSION }, + { "studiorender.dll", STUDIO_RENDER_INTERFACE_VERSION }, + + { "", "" } // Required to terminate the list + }; + + if ( !AddSystems( appSystems ) ) + return false; + + IMaterialSystem *pMaterialSystem = (IMaterialSystem*)FindSystem( MATERIAL_SYSTEM_INTERFACE_VERSION ); + if ( !pMaterialSystem ) + { + Warning( "Create: Unable to connect to material system interface!\n" ); + return false; + } + + pMaterialSystem->SetShaderAPI( "shaderapiempty.dll" ); + + return true; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +bool CMdlInfoApp::PreInit() +{ + MathLib_Init(); + + if ( !BaseClass::PreInit() ) + return false; + + CreateInterfaceFn factory = GetFactory(); + + ConnectTier1Libraries( &factory, 1 ); + ConnectTier2Libraries( &factory, 1 ); + ConnectTier3Libraries( &factory, 1 ); + + if ( !g_pFullFileSystem || !g_pMDLCache ) + { + Warning( "Error! mdlinfo is missing a required interface!\n" ); + return false; + } + + SetupSearchPaths( NULL, false, true ); + + return true; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +int CMdlInfoApp::Startup() +{ + if ( BaseClass::Startup() < 0 ) + return -1; + + if ( g_pMaterialSystem ) + { + g_pMaterialSystem->ModInit(); + } + + if ( g_pDataCache ) + { + g_pDataCache->SetSize( 64 * 1024 * 1024 ); + } + + return 0; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +int CMdlInfoApp::Main() +{ + // This bit of hackery allows us to access files on the harddrive + g_pFullFileSystem->AddSearchPath( "", "LOCAL", PATH_ADD_TO_HEAD ); + + if ( CommandLineHasOpt( kOptHelp ) ) + { + PrintHelp(); + return 0; + } + + const char *pszOptFileIn = CommandLine()->ParmValue( "-i" ); + if ( !pszOptFileIn ) + pszOptFileIn = CommandLine()->ParmValue( "-input" ); + + if ( pszOptFileIn ) + return DoIt( pszOptFileIn ); + + Warning( "Error! Missing -i <file>.mdl\n\n" ); + + PrintHelp(); + + return -1; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::Shutdown() +{ + if ( g_pMaterialSystem ) + { + g_pMaterialSystem->ModShutdown(); + } + + BaseClass::Shutdown(); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::PostShutdown() +{ + DisconnectTier3Libraries(); + DisconnectTier2Libraries(); + DisconnectTier1Libraries(); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +bool CMdlInfoApp::CommandLineHasOpt( const char *pszOpt ) +{ + for ( int ii = 0; ii < ARRAYSIZE( s_binaryOptions ); ++ii ) + { + if ( !V_stricmp( pszOpt, s_binaryOptions[ii].m_pszShortName ) || !V_stricmp( pszOpt, s_binaryOptions[ii].m_pszLongName ) ) + { + if ( CommandLine()->FindParm( s_binaryOptions[ii].m_pszShortName ) > 0 || CommandLine()->FindParm( s_binaryOptions[ii].m_pszLongName ) > 0 ) + return true; + + return false; + } + } + + if ( CommandLine()->FindParm( pszOpt ) > 0 ) + return true; + + return false; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +bool CMdlInfoApp::DoIt( const char *pszFileIn ) +{ + HandleOptions(); + + MDLHandle_t hMdl = GetMDLHandle( pszFileIn ); + if ( hMdl == MDLHANDLE_INVALID ) + return false; + + // Get the model + studiohdr_t *pHdr = g_pMDLCache->GetStudioHdr( hMdl ); + if ( !pHdr ) + return false; + + CStudioHdr cStudioHdr( pHdr, g_pMDLCache ); + + DumpGeneral( hMdl, cStudioHdr ); + DumpBones( cStudioHdr ); + DumpAttachments( cStudioHdr ); + DumpAnimationList( cStudioHdr ); + DumpSequenceList( cStudioHdr ); + DumpMesh( cStudioHdr ); + DumpTexture( cStudioHdr ); + DumpSkin( cStudioHdr ); + + g_pMDLCache->Release( hMdl ); + + return true; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::HandleOptions() +{ + if ( + CommandLineHasOpt( kOptGeneral ) || + CommandLineHasOpt( kOptBones ) || + CommandLineHasOpt( kOptAttachments ) || + CommandLineHasOpt( kOptAnimation ) || + CommandLineHasOpt( kOptSequence ) || + CommandLineHasOpt( kOptMesh ) || + CommandLineHasOpt( kOptTexture ) || + CommandLineHasOpt( kOptSkin ) ) + { + m_bOptAll = false; + } + + if ( CommandLineHasOpt( kOptVerbose ) ) + { + m_bOptVerbose = true; + } +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +MDLHandle_t CMdlInfoApp::GetMDLHandle( const char *pszFilename ) +{ + if ( pszFilename == NULL ) + return MDLHANDLE_INVALID; + + char szFullPath[ MAX_PATH ]; + if ( !GenerateFullPath( pszFilename, NULL, szFullPath, ARRAYSIZE( szFullPath ) ) ) + { + V_strncpy( szFullPath, pszFilename, ARRAYSIZE( szFullPath ) ); + } + + MDLHandle_t hMdl = g_pMDLCache->FindMDL( szFullPath ); + if ( hMdl == MDLHANDLE_INVALID ) + { + Error( "Couldn't Load MDL %s via g_pMDLCache\n", pszFilename ); + } + else + { + studiohdr_t *pHdr = g_pMDLCache->GetStudioHdr( hMdl ); + + if ( !pHdr || !V_strcmp( "error.mdl", pHdr->pszName() ) ) + { + Error( "Couldn't Load MDL %s via g_pMDLCache, got error model instead\n", pszFilename ); + g_pMDLCache->Release( hMdl ); + hMdl = MDLHANDLE_INVALID; + } + } + + return hMdl; +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::PrintHelp() +{ + Msg( "\n" ); + Msg( "NAME\n" ); + Msg( " mdlinfo - Prints information about a VALVe MDL file\n" ); + Msg( "\n" ); + Msg( "SYNOPSIS\n" ); + Msg( " mdlinfo [ options ] < -i filename.mdl >\n" ); + Msg( "\n" ); + + for ( int ii = 0; ii < ARRAYSIZE( s_binaryOptions ); ++ii ) + { + const CommandLineBinaryOpt_t &opt = s_binaryOptions[ii]; + Msg( " %s | %s : %s\n", opt.m_pszShortName, opt.m_pszLongName, opt.m_pszDoc ); + } + + Msg( "\n" ); + Msg( "DESCRIPTION\n" ); + Msg( " Prints information about a VALVe MDL file\n" ); + Msg( " If no sections are specified, all are printed\n" ); + Msg( " Multiple section specifiers can be specified but print order is fixed\n" ); + Msg( "\n" ); + Msg( "\n" ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::DumpGeneral( MDLHandle_t hMdl, CStudioHdr &cStudioHdr ) const +{ + if ( !( m_bOptAll || CommandLineHasOpt( kOptGeneral ) ) ) + return; + + const studiohdr_t *pHdr = cStudioHdr.GetRenderHdr(); + + Msg( "//\n" ); + Msg( "// MDL General Info\n" ); + Msg( "//\n" ); + Msg( "\n" ); + + Msg( "// MDL: %s\n", cStudioHdr.pszName() ); + Msg( "// Filename: %s\n", g_pMDLCache->GetModelName( hMdl ) ); + Msg( "// Id: 0x%08x\n", pHdr->id ); + Msg( "// Version: 0x%08x\n", pHdr->version ); + Msg( "// Checksum: 0x%08x\n", pHdr->checksum ); + Msg( "// EyePosition: %s\n", PrettyPrintVector( pHdr->eyeposition ).Get() ); + Msg( "// IllumPosition: %s\n", PrettyPrintVector( pHdr->illumposition ).Get() ); + Msg( "// Hull Min: %s\n", PrettyPrintVector( pHdr->hull_min ).Get() ); + Msg( "// Hull Max: %s\n", PrettyPrintVector( pHdr->hull_max ).Get() ); + Msg( "// Bone Count: %d\n", cStudioHdr.numbones() ); + + const char *pszSurfaceProp = cStudioHdr.pszSurfaceProp(); + if ( pszSurfaceProp ) + { + Msg( "// SurfaceProp: %s\n", pszSurfaceProp ); + } + + Msg( "\n" ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +static void PrintBoneFlags( const mstudiobone_t *pBone ) +{ + CFmtStrMax sBoneFlags; + + struct BoneFlag_t + { + int m_nMask; + const char *m_pzsName; + }; + + static const BoneFlag_t boneFlags[] = + { + { BONE_PHYSICALLY_SIMULATED, "BONE_PHYSICALLY_SIMULATED" }, + { BONE_PHYSICS_PROCEDURAL, "BONE_PHYSICS_PROCEDURAL" }, + { BONE_ALWAYS_PROCEDURAL, "BONE_ALWAYS_PROCEDURAL" }, + { BONE_SCREEN_ALIGN_SPHERE, "BONE_SCREEN_ALIGN_SPHERE" }, + { BONE_SCREEN_ALIGN_CYLINDER, "BONE_SCREEN_ALIGN_CYLINDER" }, + { BONE_USED_BY_HITBOX, "BONE_USED_BY_HITBOX" }, + { BONE_USED_BY_ATTACHMENT, "BONE_USED_BY_ATTACHMENT" }, + { BONE_USED_BY_VERTEX_LOD0, "BONE_USED_BY_VERTEX_LOD0" }, + { BONE_USED_BY_VERTEX_LOD1, "BONE_USED_BY_VERTEX_LOD1" }, + { BONE_USED_BY_VERTEX_LOD2, "BONE_USED_BY_VERTEX_LOD2" }, + { BONE_USED_BY_VERTEX_LOD3, "BONE_USED_BY_VERTEX_LOD3" }, + { BONE_USED_BY_VERTEX_LOD4, "BONE_USED_BY_VERTEX_LOD4" }, + { BONE_USED_BY_VERTEX_LOD5, "BONE_USED_BY_VERTEX_LOD5" }, + { BONE_USED_BY_VERTEX_LOD6, "BONE_USED_BY_VERTEX_LOD6" }, + { BONE_USED_BY_VERTEX_LOD7, "BONE_USED_BY_VERTEX_LOD7" }, + { BONE_USED_BY_BONE_MERGE, "BONE_USED_BY_BONE_MERGE" }, + { BONE_FIXED_ALIGNMENT, "BONE_FIXED_ALIGNMENT" }, + { BONE_HAS_SAVEFRAME_POS, "BONE_HAS_SAVEFRAME_POS" }, + { BONE_HAS_SAVEFRAME_ROT, "BONE_HAS_SAVEFRAME_ROT" }, + }; + + Msg( "// + Bone Flags: 0x%08x\n", pBone->flags ); + + for ( int ii = 0; ii < ARRAYSIZE( boneFlags ); ++ii ) + { + if ( pBone->flags & boneFlags[ii].m_nMask ) + { + Msg( "// - 0x%08x %s\n", boneFlags[ii].m_nMask, boneFlags[ii].m_pzsName ); + } + } +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::DumpBones( CStudioHdr &cStudioHdr ) const +{ + if ( !( m_bOptAll || CommandLineHasOpt( kOptBones ) ) ) + return; + + const float flEps = 1.0e-5; + + static const Quaternion qIdentity( 0.0f, 0.0f, 0.0f, 1.0f ); + + const int nBoneCount = cStudioHdr.numbones(); + + Msg( "//\n" ); + Msg( "// Define Bones, Bone Count: %d\n", nBoneCount ); + Msg( "//\n" ); + Msg( "\n" ); + + for ( int ii = 0; ii < nBoneCount; ++ii ) + { + const mstudiobone_t *pBone = cStudioHdr.pBone( ii ); + const mstudiobone_t *pParentBone = pBone->parent < ii && pBone->parent >= 0 ? cStudioHdr.pBone( pBone->parent ) : NULL; + const mstudiosrcbonetransform_t *pSrcBoneTransform = GetSrcBoneTransform( cStudioHdr.GetRenderHdr(), ii ); + + bool bRealigned = false; + Vector vAlignment; + QAngle aAlignment; + + if ( pSrcBoneTransform ) + { + MatrixAngles( pSrcBoneTransform->posttransform, aAlignment, vAlignment ); + + if ( !QAnglesAreEqual( QAngle( 0.0f, 0.0f, 0.0f ), aAlignment, flEps ) || !VectorsAreEqual( Vector( 0.0f, 0.0f, 0.0f ), vAlignment, flEps ) ) + { + bRealigned = true; + } + } + + if ( m_bOptVerbose ) + { + Msg( "// * %3d: %s\n", ii, pBone->pszName() ); + if ( pParentBone ) + { + Msg( "// + Parent: %3d: %s\n", pBone->parent, pParentBone->pszName() ); + } + + if ( bRealigned ) + { + Msg( "// + REALIGNED\n" ); + } + + if ( pBone->flags & BONE_ALWAYS_PROCEDURAL ) + { + static const char *s_ProcType[] = { "<ERROR", "AXISINTERP", "QUATINTERP", "AIMATBONE", "AIMATTACH", "JIGGLE" }; + Msg( "// + Procedural Type: %s\n", s_ProcType[pBone->proctype] ); + } + + const char *pszSurfaceProp = pBone->pszSurfaceProp(); + if ( pszSurfaceProp ) + { + Msg( "// + Surface Prop: %s\n", pszSurfaceProp ); + } + + PrintBoneFlags( pBone ); + } + + const QAngle aRot = pBone->rot.ToQAngle(); + + if ( pBone->flags & BONE_ALWAYS_PROCEDURAL ) + { + } + CFmtStrMax sTmp( "%s$definebone \"%s\" \"%s\" %s %s %s %s %s %s", + ( pBone->flags & BONE_ALWAYS_PROCEDURAL ) ? "// procedural " : "", + pBone->pszName(), + pParentBone ? pParentBone->pszName() : "", + PrettyPrintFloat( pBone->pos.x ).Get(), + PrettyPrintFloat( pBone->pos.y ).Get(), + PrettyPrintFloat( pBone->pos.z ).Get(), + PrettyPrintFloat( aRot.x ).Get(), + PrettyPrintFloat( aRot.y ).Get(), + PrettyPrintFloat( aRot.z ).Get() ); + + if ( bRealigned ) + { + sTmp.AppendFormat( " %s %s %s %s %s %s", + PrettyPrintFloat( vAlignment.x ).Get(), + PrettyPrintFloat( vAlignment.y ).Get(), + PrettyPrintFloat( vAlignment.z ).Get(), + PrettyPrintFloat( aAlignment.x ).Get(), + PrettyPrintFloat( aAlignment.y ).Get(), + PrettyPrintFloat( aAlignment.z ).Get() ); + } + + sTmp.Append( "\n" ); + + Msg( sTmp.Get() ); + + if ( m_bOptVerbose ) + { + Msg( "\n" ); + } + } + + if ( !m_bOptVerbose ) + { + Msg( "\n" ); + } + + bool bSaveFrame = false; + + for ( int ii = 0; ii < nBoneCount; ++ii ) + { + const mstudiobone_t *pBone = cStudioHdr.pBone( ii ); + const bool bPosition = ( pBone->flags & BONE_HAS_SAVEFRAME_POS ) != 0; + const bool bRotation = ( pBone->flags & BONE_HAS_SAVEFRAME_POS ) != 0; + if ( bPosition || bRotation ) + { + bSaveFrame = true; + + CFmtStr sTmp( "$BoneSaveFrame \"%s\"", pBone->pszName() ); + + if ( bPosition ) + { + sTmp.Append( " position" ); + } + + if ( bRotation ) + { + sTmp.Append( " rotation" ); + } + sTmp.Append( "\n" ); + Msg( sTmp.Get() ); + } + } + + if ( bSaveFrame ) + { + Msg( "\n" ); + } +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::DumpAttachments( CStudioHdr &cStudioHdr ) const +{ + if ( !( m_bOptAll || CommandLineHasOpt( kOptAttachments ) ) ) + return; + + const int nAtttachmentCount = cStudioHdr.GetNumAttachments(); + + Msg( "//\n" ); + Msg( "// Attachment Count: %d\n", nAtttachmentCount ); + Msg( "//\n" ); + Msg( "\n" ); + + for ( int ii = 0; ii < nAtttachmentCount; ++ii ) + { + const mstudioattachment_t &attachment = cStudioHdr.pAttachment( ii ); + + CFmtStrMax sTmp( "$attachment \"%s\"", + attachment.pszName() ); + + sTmp.Append( "\n" ); + + Msg( sTmp.Get() ); + } + + if ( !m_bOptVerbose ) + { + Msg( "\n" ); + } +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::DumpAnimationList( CStudioHdr &cStudioHdr ) const +{ + if ( !( m_bOptAll || CommandLineHasOpt( kOptAnimation ) ) ) + return; + + int nAnimCount = 0; + virtualmodel_t *pVirtualModel = cStudioHdr.GetVirtualModel(); + if ( pVirtualModel ) + { + nAnimCount = pVirtualModel->m_anim.Count(); + } + else + { + nAnimCount = cStudioHdr.GetRenderHdr()->numlocalanim; + } + + Msg( "//\n" ); + Msg( "// Animation Count: %d\n", nAnimCount ); + Msg( "//\n" ); + Msg( "\n" ); + + for ( int ii = 0; ii < nAnimCount; ++ii ) + { + const mstudioanimdesc_t &animDesc = cStudioHdr.pAnimdesc( ii ); + const studiohdr_t *pHdr = cStudioHdr.pAnimStudioHdr( ii ); + + if ( pHdr != cStudioHdr.GetRenderHdr() ) + { + Msg( "// %3d: %-50s [Included From %s]\n", ii, animDesc.pszName(), pHdr->pszName() ); + } + else + { + Msg( "// %3d: %-50s\n", ii, animDesc.pszName() ); + } + } + + Msg( "\n" ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::DumpSequenceList( CStudioHdr &cStudioHdr ) const +{ + if ( !( m_bOptAll || CommandLineHasOpt( kOptSequence ) ) ) + return; + + const int nSeqCount = cStudioHdr.GetNumSeq(); + + Msg( "//\n" ); + Msg( "// Sequence Count: %d\n", nSeqCount ); + Msg( "//\n" ); + Msg( "\n" ); + + for ( int ii = 0; ii < nSeqCount; ++ii ) + { + const mstudioseqdesc_t &seqDesc = cStudioHdr.pSeqdesc( ii ); + const studiohdr_t *pHdr = cStudioHdr.pSeqStudioHdr( ii ); + + if ( pHdr != cStudioHdr.GetRenderHdr() ) + { + Msg( "// %3d: %-50s %-50s [Included From %s]\n", ii, seqDesc.pszLabel(), seqDesc.pszActivityName(), pHdr->pszName() ); + } + else + { + Msg( "// %3d: %-50s %-50s\n", ii, seqDesc.pszLabel(), seqDesc.pszActivityName() ); + } + } + + Msg( "\n" ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::DumpMesh( CStudioHdr &cStudioHdr ) const +{ + if ( !( m_bOptAll || CommandLineHasOpt( kOptMesh ) ) ) + return; + +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::DumpTexture( CStudioHdr &cStudioHdr ) const +{ + if ( !( m_bOptAll || CommandLineHasOpt( kOptTexture ) ) ) + return; + + const studiohdr_t *pHdr = cStudioHdr.GetRenderHdr(); + + const int nTextureCount = pHdr->numtextures; + + Msg( "//\n" ); + Msg( "// Texture Count: %d\n", nTextureCount ); + Msg( "//\n" ); + Msg( "\n" ); + + for ( int ii = 0; ii < nTextureCount; ++ii ) + { + const mstudiotexture_t *pTexture = pHdr->pTexture( ii ); + Msg( "// Texture: %2d: %s\n", ii, pTexture->pszName() ); + } + + Msg( "\n" ); +} + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CMdlInfoApp::DumpSkin( CStudioHdr &cStudioHdr ) const +{ + if ( !( m_bOptAll || CommandLineHasOpt( kOptSkin ) ) ) + return; + + const studiohdr_t *pHdr = cStudioHdr.GetRenderHdr(); + + const int nSkinCount = pHdr->numskinfamilies; + + Msg( "//\n" ); + Msg( "// Skin Count: %d\n", nSkinCount ); + Msg( "//\n" ); + Msg( "\n" ); + + for ( int ii = 0; ii < nSkinCount; ++ii ) + { + const short *pSkinRef = pHdr->pSkinref( ii * pHdr->numskinref ); + CFmtStrMax sTmp( "// Skin: %2d: [", ii ); + for ( int jj = 0; jj < pHdr->numskinref; ++jj ) + { + const int nTextureIndex = pSkinRef[jj]; + sTmp.AppendFormat( " %3d", nTextureIndex ); + } + sTmp.Append( " ]\n" ); + Msg( sTmp.Get() ); + } + + Msg( "\n" ); +}
\ No newline at end of file |