source-engine/movieobjects/dmemdlmakefile.cpp

288 lines
8.2 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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 );
}
}