diff options
Diffstat (limited to 'movieobjects/dmemdlmakefile.cpp')
| -rw-r--r-- | movieobjects/dmemdlmakefile.cpp | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/movieobjects/dmemdlmakefile.cpp b/movieobjects/dmemdlmakefile.cpp new file mode 100644 index 0000000..f79e2fb --- /dev/null +++ b/movieobjects/dmemdlmakefile.cpp @@ -0,0 +1,287 @@ +//========= Copyright 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_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" ); + 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<CUtlString> &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 ); + } +} + |