summaryrefslogtreecommitdiff
path: root/public/movieobjects/dmemakefileutils.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/movieobjects/dmemakefileutils.h')
-rw-r--r--public/movieobjects/dmemakefileutils.h301
1 files changed, 301 insertions, 0 deletions
diff --git a/public/movieobjects/dmemakefileutils.h b/public/movieobjects/dmemakefileutils.h
new file mode 100644
index 0000000..e2d47c8
--- /dev/null
+++ b/public/movieobjects/dmemakefileutils.h
@@ -0,0 +1,301 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Interface for makefiles to build differently depending on where they are run from
+//
+//===========================================================================//
+
+#ifndef DMEMAKEFILEUTILS_H
+#define DMEMAKEFILEUTILS_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+
+#include "movieobjects/idmemakefileutils.h"
+#include "datamodel/dmehandle.h"
+#include "tier1/utlsymbol.h"
+#include "tier3/tier3.h"
+
+
+//-----------------------------------------------------------------------------
+// Forward declarations
+//-----------------------------------------------------------------------------
+class CDmeMakefileUtils;
+class CDmeMDLMakefile;
+class CDmeMayaMakefile;
+class CDmeSourceMayaFile;
+class CDmeMakefile;
+
+
+//-----------------------------------------------------------------------------
+//
+// This glue code here is to make it easy to create methods using various DmElement types
+//
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// Compilation steps
+//-----------------------------------------------------------------------------
+enum CompilationStep_t
+{
+ BUILDING_STANDARD_DEPENDENCIES = 0,
+ BUILDING_ALL_DEPENDENCIES,
+ BEFORE_COMPILATION,
+ PERFORMING_COMPILATION,
+ AFTER_COMPILATION_FAILED,
+ AFTER_COMPILATION_SUCCEEDED,
+ NOT_COMPILING,
+};
+
+
+//-----------------------------------------------------------------------------
+// Utility adapter class to hook compile funcs into the map
+//-----------------------------------------------------------------------------
+class CCompileFuncAdapterBase
+{
+public:
+ virtual void InitializeAdapter( ) = 0;
+ virtual bool PerformCompilationStep( CDmElement *pElement, CompilationStep_t step ) = 0;
+
+protected:
+ // Constructor, protected because these should never be instanced directly
+ CCompileFuncAdapterBase( ) {}
+
+public:
+ CUtlSymbol m_ElementType;
+
+ CCompileFuncAdapterBase *m_pNext;
+};
+
+
+template< class U, class T >
+class CCompileFuncAdapter : public CCompileFuncAdapterBase
+{
+ typedef CCompileFuncAdapterBase BaseClass;
+
+public:
+ CCompileFuncAdapter( )
+ {
+ // Hook into the list
+ m_pNext = U::m_CompileFuncTree.m_pFirstAdapter;
+ U::m_CompileFuncTree.m_pFirstAdapter = this;
+ }
+
+ virtual void InitializeAdapter( )
+ {
+ m_ElementType = T::GetStaticTypeSymbol();
+ if ( m_pNext )
+ {
+ m_pNext->InitializeAdapter();
+ }
+ }
+
+ virtual bool PerformCompilationStep( CDmElement *pElement, CompilationStep_t step )
+ {
+ T *pConverted = CastElement< T >( pElement );
+ if ( pConverted )
+ return U::m_pSingleton->PerformCompilationStep( pConverted, step );
+ return false;
+ }
+};
+
+//-----------------------------------------------------------------------------
+// Utility adapter class to hook editor opening funcs into the map
+//-----------------------------------------------------------------------------
+class COpenEditorFuncAdapterBase
+{
+public:
+ virtual void InitializeAdapter( ) = 0;
+ virtual void OpenEditor( CDmElement *pElement ) = 0;
+
+protected:
+ // Constructor, protected because these should never be instanced directly
+ COpenEditorFuncAdapterBase( ) {}
+
+public:
+ CUtlSymbol m_ElementType;
+ COpenEditorFuncAdapterBase *m_pNext;
+};
+
+
+template< class U, class T >
+class COpenEditorFuncAdapter : public COpenEditorFuncAdapterBase
+{
+ typedef COpenEditorFuncAdapterBase BaseClass;
+
+public:
+ COpenEditorFuncAdapter( )
+ {
+ // Hook into the list
+ m_pNext = U::m_OpenEditorFuncTree.m_pFirstAdapter;
+ U::m_OpenEditorFuncTree.m_pFirstAdapter = this;
+ }
+
+ virtual void InitializeAdapter( )
+ {
+ m_ElementType = T::GetStaticTypeSymbol();
+ if ( m_pNext )
+ {
+ m_pNext->InitializeAdapter();
+ }
+ }
+
+ virtual void OpenEditor( CDmElement *pElement )
+ {
+ T *pConverted = CastElement< T >( pElement );
+ if ( pConverted )
+ {
+ U::m_pSingleton->OpenEditor( pConverted );
+ }
+ }
+};
+
+
+#define DECLARE_DMEMAKEFILE_UTIL_CLASS_BASE( _className ) \
+ protected: \
+ typedef _className ThisClass; \
+ static CompileFuncTree_t m_CompileFuncTree; \
+ static OpenEditorFuncTree_t m_OpenEditorFuncTree; \
+ static _className *m_pSingleton; \
+ template< typename U, typename T > friend class CCompileFuncAdapter; \
+ template< typename U, typename T > friend class COpenEditorFuncAdapter; \
+ virtual CompileFuncTree_t* GetCompileTree() \
+ { \
+ return &m_CompileFuncTree; \
+ } \
+ virtual OpenEditorFuncTree_t* GetOpenEditorTree() \
+ { \
+ return &m_OpenEditorFuncTree; \
+ } \
+
+
+#define DECLARE_DMEMAKEFILE_UTIL_CLASS( _className, _baseClass ) \
+ DECLARE_DMEMAKEFILE_UTIL_CLASS_BASE( _className ) \
+ typedef _baseClass BaseClass; \
+ protected: \
+ virtual void InitializeFuncMaps() \
+ { \
+ m_pSingleton = this; \
+ m_CompileFuncTree.m_pBaseAdapterTree = &BaseClass::m_CompileFuncTree; \
+ m_CompileFuncTree.m_pFirstAdapter->InitializeAdapter( ); \
+ m_OpenEditorFuncTree.m_pBaseAdapterTree = &BaseClass::m_OpenEditorFuncTree; \
+ m_OpenEditorFuncTree.m_pFirstAdapter->InitializeAdapter( ); \
+ BaseClass::InitializeFuncMaps(); \
+ } \
+
+#define DECLARE_DMEMAKEFILE_UTIL_CLASS_ROOT( _className ) \
+ DECLARE_DMEMAKEFILE_UTIL_CLASS_BASE( _className ) \
+ protected: \
+ virtual void InitializeFuncMaps() \
+ { \
+ m_pSingleton = this; \
+ m_CompileFuncTree.m_pBaseAdapterTree = NULL; \
+ m_CompileFuncTree.m_pFirstAdapter->InitializeAdapter( ); \
+ m_OpenEditorFuncTree.m_pBaseAdapterTree = NULL; \
+ m_OpenEditorFuncTree.m_pFirstAdapter->InitializeAdapter( ); \
+ } \
+
+#define IMPLEMENT_DMEMAKEFILE_UTIL_CLASS( _className ) \
+ CDmeMakefileUtils::CompileFuncTree_t _className::m_CompileFuncTree; \
+ CDmeMakefileUtils::OpenEditorFuncTree_t _className::m_OpenEditorFuncTree; \
+ _className *_className::m_pSingleton; \
+
+#define DECLARE_COMPILEFUNC( _className ) \
+ bool PerformCompilationStep( _className *pClassName, CompilationStep_t step ); \
+ CCompileFuncAdapter< ThisClass, _className > m_##_className##CompileAdapter
+
+#define DECLARE_OPENEDITORFUNC( _className ) \
+ void OpenEditor( _className *pClassName ); \
+ COpenEditorFuncAdapter< ThisClass, _className > m_##_className##OpenEditorAdapter
+
+
+//-----------------------------------------------------------------------------
+// Interface for makefiles to build differently depending on where they are run from
+//-----------------------------------------------------------------------------
+class CDmeMakefileUtils : public CTier3AppSystem<IDmeMakefileUtils>
+{
+protected:
+ struct CompileFuncTree_t
+ {
+ CCompileFuncAdapterBase *m_pFirstAdapter;
+ CompileFuncTree_t *m_pBaseAdapterTree;
+ };
+
+ struct OpenEditorFuncTree_t
+ {
+ COpenEditorFuncAdapterBase *m_pFirstAdapter;
+ OpenEditorFuncTree_t *m_pBaseAdapterTree;
+ };
+
+ typedef CTier3AppSystem< IDmeMakefileUtils > BaseClass;
+
+ DECLARE_DMEMAKEFILE_UTIL_CLASS_ROOT( CDmeMakefileUtils );
+
+public:
+ // Constructor, destructor
+ CDmeMakefileUtils();
+ virtual ~CDmeMakefileUtils();
+
+ // Inherited from IAppSystem
+ virtual void *QueryInterface( const char *pInterfaceName );
+ virtual InitReturnVal_t Init();
+
+ // Inherited from IDmeMakefileUtils
+ virtual void PerformCompile( CDmElement *pElement, bool bBuildAllDependencies );
+ virtual bool IsCurrentlyCompiling( );
+ virtual int GetCompileOutputSize();
+ virtual CompilationState_t UpdateCompilation( char *pOutputBuf, int nBufLen );
+ virtual void AbortCurrentCompilation();
+ virtual void PerformOpenEditor( CDmElement *pElement );
+ virtual int GetExitCode();
+
+protected:
+ // Compile functions + editor functions
+ DECLARE_COMPILEFUNC( CDmElement );
+ DECLARE_COMPILEFUNC( CDmeMakefile );
+ DECLARE_COMPILEFUNC( CDmeMDLMakefile );
+ DECLARE_COMPILEFUNC( CDmeMayaMakefile );
+ DECLARE_OPENEDITORFUNC( CDmeSourceMayaFile );
+
+ // Queues up a compilation task
+ // ( Call only in BUILDING_STANDARD_DEPENDENCIES or BUILDING_ALL_DEPENDENCIES )
+ void AddCompilationTask( CDmElement* pElement );
+
+ // Sets the compilation process handle
+ // ( Call only in PERFORMING_COMPILATION )
+ void SetCompileProcess( ProcessHandle_t hProcess );
+
+private:
+ struct CompileInfo_t
+ {
+ CDmeHandle< CDmElement > m_hElement;
+ CCompileFuncAdapterBase *m_pAdapter;
+ };
+
+ // Finds the adapter class associated with a particular element type
+ CCompileFuncAdapterBase *DetermineCompileAdapter( CDmElement *pElement );
+ COpenEditorFuncAdapterBase *DetermineOpenEditorAdapter( CDmElement *pElement );
+
+ // Dequeue the first compile task and start it up
+ void StartNextCompileTask();
+
+ // Performs the compilation step on all elements
+ bool PerformCompilationStep( CompilationStep_t step );
+
+ // Queues up a compilation task
+ void AddCompilationTask( CDmElement* pElement, CCompileFuncAdapterBase *pAdapter );
+
+ // Default implementatations for compile dependencies
+ bool AddCompileDependencies( CDmeMakefile *pMakefile, bool bBuildAllDependencies );
+
+ CUtlVector< CompileInfo_t > m_CompileTasks;
+ ProcessHandle_t m_hCompileProcess;
+ int m_nCurrentCompileTask;
+ int m_nExitCode;
+ CompilationStep_t m_CompilationStep;
+};
+
+
+#endif // DMEMAKEFILEUTILS_H