//====== Copyright © 1996-2008, Valve Corporation, All rights reserved. ======= // // Describes an asset: something that is compiled from sources, // in potentially multiple steps, to a compiled resource // //============================================================================= #include "movieobjects/dmemdlmakefile.h" #include "movieobjects/dmedag.h" #include "movieobjects/dmemdl.h" #include "datamodel/dmelementfactoryhelper.h" #include "datacache/imdlcache.h" #include "filesystem.h" #include "tier3/tier3.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" //----------------------------------------------------------------------------- // Hook into datamodel //----------------------------------------------------------------------------- IMPLEMENT_ELEMENT_FACTORY( DmeSourceSkin, CDmeSourceSkin ); //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CDmeSourceSkin::OnConstruction() { m_SkinName.Init( this, "skinName" ); m_bFlipTriangles.Init( this, "flipTriangles" ); m_bQuadSubd.Init( this, "quadSubd" ); m_flScale.InitAndSet( this, "scale", 1.0f ); } void CDmeSourceSkin::OnDestruction() { } //----------------------------------------------------------------------------- // These can be built from DCC makefiles //----------------------------------------------------------------------------- static const char *s_pSkinMakeFiles[] = { "DmeMayaModelMakefile", "DmeXSIModelMakefile", NULL }; const char **CDmeSourceSkin::GetSourceMakefileTypes() { return s_pSkinMakeFiles; } //----------------------------------------------------------------------------- // Hook into datamodel //----------------------------------------------------------------------------- IMPLEMENT_ELEMENT_FACTORY( DmeSourceCollisionModel, CDmeSourceCollisionModel ); //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CDmeSourceCollisionModel::OnConstruction() { } void CDmeSourceCollisionModel::OnDestruction() { } //----------------------------------------------------------------------------- // These can be built from DCC makefiles //----------------------------------------------------------------------------- const char **CDmeSourceCollisionModel::GetSourceMakefileTypes() { return s_pSkinMakeFiles; } //----------------------------------------------------------------------------- // Hook into datamodel //----------------------------------------------------------------------------- IMPLEMENT_ELEMENT_FACTORY( DmeSourceAnimation, CDmeSourceAnimation ); //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CDmeSourceAnimation::OnConstruction() { m_AnimationName.Init( this, "animationName" ); m_SourceAnimationName.Init( this, "sourceAnimationName" ); } void CDmeSourceAnimation::OnDestruction() { } //----------------------------------------------------------------------------- // These can be built from DCC makefiles //----------------------------------------------------------------------------- static const char *s_pAnimationMakeFiles[] = { "DmeMayaAnimationMakefile", "DmeXSIAnimationMakefile", NULL }; const char **CDmeSourceAnimation::GetSourceMakefileTypes() { return s_pAnimationMakeFiles; } //----------------------------------------------------------------------------- // Hook into datamodel //----------------------------------------------------------------------------- IMPLEMENT_ELEMENT_FACTORY( DmeMDLMakefile, CDmeMDLMakefile ); //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CDmeMDLMakefile::OnConstruction() { m_hMDL = CreateElement< CDmeMDL >( "MDLMakefile Preview", DMFILEID_INVALID ); m_bFlushMDL = false; } void CDmeMDLMakefile::OnDestruction() { DestroyElement( m_hMDL.Get() ); } //----------------------------------------------------------------------------- // Returns source types //----------------------------------------------------------------------------- static DmeMakefileType_t s_pSourceTypes[] = { { "DmeSourceSkin", "Skin", true, "makefiledir:models\\dmx", "*.dmx", "Valve DMX File (*.dmx)" }, { "DmeSourceAnimation", "Animation", false, "makefiledir:animations\\dmx", "*.dmx", "Valve DMX File (*.dmx)" }, { "DmeSourceCollisionModel", "Collision Model", true, "makefiledir:models\\dmx", "*.dmx", "Valve DMX File (*.dmx)" }, { NULL, NULL, false, NULL, NULL, NULL }, }; DmeMakefileType_t* CDmeMDLMakefile::GetSourceTypes() { return s_pSourceTypes; } //----------------------------------------------------------------------------- // Makefile type //----------------------------------------------------------------------------- static DmeMakefileType_t s_MakefileType = { "DmeMDLMakefile", "Model", true, "contentdir:models", "*.dmx", "Valve Model MakeFile (*.dmx)" }; DmeMakefileType_t *CDmeMDLMakefile::GetMakefileType() { return &s_MakefileType; } //----------------------------------------------------------------------------- // Add, remove sources //----------------------------------------------------------------------------- void CDmeMDLMakefile::SetSkin( const char *pFullPath ) { RemoveAllSources( "DmeSourceSkin" ); AddSource( "DmeSourceSkin", pFullPath ); } void CDmeMDLMakefile::AddAnimation( const char *pFullPath ) { AddSource( "animation", pFullPath ); } void CDmeMDLMakefile::RemoveAnimation( const char *pFullPath ) { RemoveSource( "animation", pFullPath ); } void CDmeMDLMakefile::RemoveAllAnimations( ) { RemoveAllSources( "animation" ); } //----------------------------------------------------------------------------- // Inherited classes should re-implement these methods //----------------------------------------------------------------------------- CDmElement *CDmeMDLMakefile::CreateOutputElement( ) { if ( m_bFlushMDL ) { // Flush the model out of the cache; detach it from the MDL MDLHandle_t h = m_hMDL->GetMDL(); if ( h != MDLHANDLE_INVALID ) { g_pMDLCache->Flush( h ); } m_bFlushMDL = false; } m_hMDL->SetMDL( MDLHANDLE_INVALID ); // FIXME: Should we ask the tool (studiomdl) for this? // Should we have output type names? Not sure yet.. // Doing the simplest thing first. char pOutputName[MAX_PATH]; Q_FileBase( GetFileName(), pOutputName, sizeof(pOutputName) ); if ( !pOutputName[0] ) return m_hMDL.Get(); char pOutputDir[MAX_PATH]; GetOutputDirectory( pOutputDir, sizeof(pOutputDir) ); if ( !pOutputDir[0] ) return m_hMDL.Get(); Q_StripTrailingSlash( pOutputDir ); char pFullPath[MAX_PATH]; Q_snprintf( pFullPath, sizeof(pFullPath), "%s\\%s.mdl", pOutputDir, pOutputName ); char pRelativePath[MAX_PATH]; g_pFullFileSystem->FullPathToRelativePathEx( pFullPath, "GAME", pRelativePath, sizeof( pRelativePath ) ); MDLHandle_t h = g_pMDLCache->FindMDL( pRelativePath ); m_hMDL->SetMDL( h ); return m_hMDL.Get(); } void CDmeMDLMakefile::DestroyOutputElement( CDmElement *pOutput ) { m_bFlushMDL = true; } //----------------------------------------------------------------------------- // Compile assets //----------------------------------------------------------------------------- static const char *s_pOutputExtensions[] = { "dx80.vtx", "dx90.vtx", "sw.vtx", "mdl", "vvd", "phy", NULL }; void CDmeMDLMakefile::GetOutputs( CUtlVector &fullPaths ) { fullPaths.RemoveAll(); // FIXME: Should we ask the tool (studiomdl) for this? // Should we have output type names? Not sure yet.. // Doing the simplest thing first. char pOutputName[MAX_PATH]; Q_FileBase( GetFileName(), pOutputName, sizeof(pOutputName) ); if ( !pOutputName[0] ) return; char pOutputDir[MAX_PATH]; GetOutputDirectory( pOutputDir, sizeof(pOutputDir) ); if ( !pOutputDir[0] ) return; Q_StripTrailingSlash( pOutputDir ); char pFullPath[MAX_PATH]; for ( int i = 0; s_pOutputExtensions[i]; ++i ) { Q_snprintf( pFullPath, sizeof(pFullPath), "%s\\%s.%s", pOutputDir, pOutputName, s_pOutputExtensions[i] ); fullPaths.AddToTail( pFullPath ); } }