mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 14:16:50 +00:00
288 lines
8.2 KiB
C++
288 lines
8.2 KiB
C++
|
//========= 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 );
|
||
|
}
|
||
|
}
|
||
|
|