summaryrefslogtreecommitdiff
path: root/movieobjects/dmemdlmakefile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'movieobjects/dmemdlmakefile.cpp')
-rw-r--r--movieobjects/dmemdlmakefile.cpp287
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 );
+ }
+}
+