source-engine/movieobjects/dmedccmakefile.cpp

324 lines
9.4 KiB
C++
Raw Normal View History

2020-04-23 00:56:21 +08: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/dmedccmakefile.h"
#include "datamodel/dmelementfactoryhelper.h"
#include "tier2/fileutils.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
//-----------------------------------------------------------------------------
// Hook into datamodel
//-----------------------------------------------------------------------------
IMPLEMENT_ELEMENT_FACTORY( DmeSourceDCCFile, CDmeSourceDCCFile );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDmeSourceDCCFile::OnConstruction()
{
m_RootDCCObjects.Init( this, "rootDCCObjects" );
m_ExportType.InitAndSet( this, "exportType", 0 );
m_FrameStart.InitAndSet( this, "frameStart", 0.0f );
m_FrameEnd.InitAndSet( this, "frameEnd", 0.0f );
m_FrameIncrement.InitAndSet( this, "frameIncrement", 1.0f );
}
void CDmeSourceDCCFile::OnDestruction()
{
}
//-----------------------------------------------------------------------------
// Hook into datamodel
//-----------------------------------------------------------------------------
IMPLEMENT_ELEMENT_FACTORY( DmeSourceMayaFile, CDmeSourceMayaFile );
IMPLEMENT_ELEMENT_FACTORY( DmeSourceMayaModelFile, CDmeSourceMayaModelFile );
IMPLEMENT_ELEMENT_FACTORY( DmeSourceMayaAnimationFile, CDmeSourceMayaAnimationFile );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDmeSourceMayaFile::OnConstruction()
{
}
void CDmeSourceMayaFile::OnDestruction()
{
}
void CDmeSourceMayaModelFile::OnConstruction()
{
m_ExportType = 0;
}
void CDmeSourceMayaModelFile::OnDestruction()
{
}
void CDmeSourceMayaAnimationFile::OnConstruction()
{
m_ExportType = 1;
}
void CDmeSourceMayaAnimationFile::OnDestruction()
{
}
//-----------------------------------------------------------------------------
// Hook into datamodel
//-----------------------------------------------------------------------------
IMPLEMENT_ELEMENT_FACTORY( DmeSourceXSIFile, CDmeSourceXSIFile );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDmeSourceXSIFile::OnConstruction()
{
}
void CDmeSourceXSIFile::OnDestruction()
{
}
//-----------------------------------------------------------------------------
// Hook into datamodel
//-----------------------------------------------------------------------------
IMPLEMENT_ELEMENT_FACTORY( DmeDCCMakefile, CDmeDCCMakefile );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDmeDCCMakefile::OnConstruction()
{
m_bFlushFile = false;
}
void CDmeDCCMakefile::OnDestruction()
{
}
//-----------------------------------------------------------------------------
// Compile assets
//-----------------------------------------------------------------------------
void CDmeDCCMakefile::GetOutputs( CUtlVector<CUtlString> &fullPaths )
{
fullPaths.RemoveAll();
char pOutputName[MAX_PATH];
Q_FileBase( GetFileName(), pOutputName, sizeof(pOutputName) );
if ( !pOutputName[0] )
return;
// FIXME: We need to come up with an appropriate directory structure for export
char pOutputDir[MAX_PATH];
GetMakefilePath( pOutputDir, sizeof(pOutputDir) );
if ( !pOutputDir[0] )
return;
Q_StripTrailingSlash( pOutputDir );
char pFullPath[MAX_PATH];
Q_snprintf( pFullPath, sizeof(pFullPath), "%s\\%s.dmx", pOutputDir, pOutputName );
fullPaths.AddToTail( pFullPath );
}
//-----------------------------------------------------------------------------
// Creates, destroys the output element associated with this makefile
//-----------------------------------------------------------------------------
CDmElement *CDmeDCCMakefile::CreateOutputElement( )
{
if ( m_bFlushFile )
{
m_bFlushFile = false;
if ( GetFileId() != DMFILEID_INVALID )
{
// NOTE: CDmeHandles will correctly re-hook up to the new makefile after load
// If the file fails to load, we have the copy. If the file correctly has the make in it
// it will replace this copy I made
CDmeHandle< CDmeDCCMakefile > hMakefileOld;
hMakefileOld = this;
// NOTE NOTE NOTE
// UnloadFile essentially calls delete this!
// So don't refer to any state in this DmElement after that
DmFileId_t fileId = GetFileId();
g_pDataModel->UnloadFile( fileId );
CDmElement *pRoot = NULL;
if ( g_pDataModel->RestoreFromFile( g_pDataModel->GetFileName( fileId ), NULL, NULL, &pRoot, CR_DELETE_OLD ) != DMFILEID_INVALID )
{
// NOTE: Unload/restore kills the this pointer, we need to redo this
if ( hMakefileOld.Get() )
{
hMakefileOld->SetDirty( false );
return hMakefileOld->CreateOutputElement();
}
}
// NOTE: We expect file backup prior to compile to avoid really fatal errors
// This case happens if the file failed to load. In this case, we must use
// the copy of the makefile
Assert( 0 );
return NULL;
}
}
// The output element is the root element containing the makefile
return FindReferringElement< CDmElement >( this, "makefile" );
}
void CDmeDCCMakefile::DestroyOutputElement( CDmElement *pOutput )
{
m_bFlushFile = true;
}
//-----------------------------------------------------------------------------
// Hook into datamodel
//-----------------------------------------------------------------------------
IMPLEMENT_ELEMENT_FACTORY( DmeMayaMakefile, CDmeMayaMakefile );
IMPLEMENT_ELEMENT_FACTORY( DmeMayaModelMakefile, CDmeMayaModelMakefile );
IMPLEMENT_ELEMENT_FACTORY( DmeMayaAnimationMakefile, CDmeMayaAnimationMakefile );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDmeMayaMakefile::OnConstruction()
{
}
void CDmeMayaMakefile::OnDestruction()
{
}
void CDmeMayaModelMakefile::OnConstruction()
{
}
void CDmeMayaModelMakefile::OnDestruction()
{
}
void CDmeMayaAnimationMakefile::OnConstruction()
{
}
void CDmeMayaAnimationMakefile::OnDestruction()
{
}
//-----------------------------------------------------------------------------
// Returns source types
//-----------------------------------------------------------------------------
static DmeMakefileType_t s_pMayaModelSourceTypes[] =
{
{ "DmeSourceMayaModelFile", "Maya Model File", true, "makefiledir:../maya", "*.ma;*.mb", "Maya File (*.ma,*.mb)" },
{ NULL, NULL, false, NULL, NULL, NULL },
};
DmeMakefileType_t* CDmeMayaModelMakefile::GetSourceTypes()
{
return s_pMayaModelSourceTypes;
}
static DmeMakefileType_t s_pMayaAnimationSourceTypes[] =
{
{ "DmeSourceMayaAnimationFile", "Maya Animation File", true, "makefiledir:../maya", "*.ma;*.mb", "Maya File (*.ma,*.mb)" },
{ NULL, NULL, false, NULL, NULL, NULL },
};
DmeMakefileType_t* CDmeMayaAnimationMakefile::GetSourceTypes()
{
return s_pMayaAnimationSourceTypes;
}
//-----------------------------------------------------------------------------
// Makefile type
//-----------------------------------------------------------------------------
static DmeMakefileType_t s_MayaModelMakefileType =
{
"DmeMayaModelMakefile", "Maya Model Component", true, "contentdir:models", "*.dmx", "DMX File (*.dmx)"
};
DmeMakefileType_t *CDmeMayaModelMakefile::GetMakefileType()
{
return &s_MayaModelMakefileType;
}
static DmeMakefileType_t s_MayaAnimationMakefileType =
{
"DmeMayaAnimationMakefile", "Maya Animation Component", true, "contentdir:models", "*.dmx", "DMX File (*.dmx)"
};
DmeMakefileType_t *CDmeMayaAnimationMakefile::GetMakefileType()
{
return &s_MayaAnimationMakefileType;
}
//-----------------------------------------------------------------------------
// Hook into datamodel
//-----------------------------------------------------------------------------
IMPLEMENT_ELEMENT_FACTORY( DmeXSIMakefile, CDmeXSIMakefile );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDmeXSIMakefile::OnConstruction()
{
}
void CDmeXSIMakefile::OnDestruction()
{
}
//-----------------------------------------------------------------------------
// Returns source types
//-----------------------------------------------------------------------------
static DmeMakefileType_t s_pXSISourceTypes[] =
{
{ "DmeSourceXSIFile", "XSI File", true, "makefiledir:../xsi", "*.xsi", "XSI File (*.xsi)" },
{ NULL, NULL, false, NULL, NULL, NULL },
};
DmeMakefileType_t* CDmeXSIMakefile::GetSourceTypes()
{
return s_pXSISourceTypes;
}
//-----------------------------------------------------------------------------
// Makefile type
//-----------------------------------------------------------------------------
static DmeMakefileType_t s_XSIMakefileType =
{
"DmeXSIMakefile", "XSI Model Component", true, "contentdir:models", "*.dmx", "DMX File (*.dmx)",
};
DmeMakefileType_t *CDmeXSIMakefile::GetMakefileType()
{
return &s_XSIMakefileType;
}