|
|
//============================================================================= |
|
|
// |
|
|
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
|
// The contents may be used and/or copied only with the written permission of |
|
|
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in |
|
|
// the agreement/contract under which the contents have been supplied. |
|
|
// |
|
|
// $Header: $ |
|
|
// $NoKeywords: $ |
|
|
// |
|
|
//============================================================================= |
|
|
|
|
|
|
|
|
// Standard includes |
|
|
#include <ctype.h> |
|
|
#include <io.h> |
|
|
|
|
|
|
|
|
// Valve includes |
|
|
#include "appframework/AppFramework.h" |
|
|
#include "datamodel/idatamodel.h" |
|
|
#include "filesystem.h" |
|
|
#include "icommandline.h" |
|
|
#include "materialsystem/imaterialsystem.h" |
|
|
#include "mathlib/mathlib.h" |
|
|
#include "tier1/tier1.h" |
|
|
#include "tier2/tier2.h" |
|
|
#include "tier2/tier2dm.h" |
|
|
#include "tier3/tier3.h" |
|
|
#include "tier1/UtlStringMap.h" |
|
|
#include "vstdlib/vstdlib.h" |
|
|
#include "vstdlib/iprocessutils.h" |
|
|
#include "tier2/p4helpers.h" |
|
|
#include "p4lib/ip4.h" |
|
|
|
|
|
|
|
|
// Lua includes |
|
|
#include <lua.h> |
|
|
#include <lauxlib.h> |
|
|
#include <lualib.h> |
|
|
|
|
|
|
|
|
// Local includes |
|
|
#include "dmxedit.h" |
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// The application object |
|
|
//----------------------------------------------------------------------------- |
|
|
class CDmxEditApp : public CDefaultAppSystemGroup< CSteamAppSystemGroup > |
|
|
{ |
|
|
public: |
|
|
// Methods of IApplication |
|
|
virtual bool Create(); |
|
|
virtual bool PreInit( ); |
|
|
virtual int Main(); |
|
|
virtual void PostShutdown(); |
|
|
|
|
|
void PrintHelp( bool bWiki = false ); |
|
|
}; |
|
|
|
|
|
|
|
|
DEFINE_CONSOLE_STEAM_APPLICATION_OBJECT( CDmxEditApp ); |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// The application object |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CDmxEditApp::Create() |
|
|
{ |
|
|
AppSystemInfo_t appSystems[] = |
|
|
{ |
|
|
{ "vstdlib.dll", PROCESS_UTILS_INTERFACE_VERSION }, |
|
|
{ "materialsystem.dll", MATERIAL_SYSTEM_INTERFACE_VERSION }, |
|
|
{ "p4lib.dll", P4_INTERFACE_VERSION }, |
|
|
{ "", "" } // Required to terminate the list |
|
|
}; |
|
|
|
|
|
AddSystems( appSystems ); |
|
|
|
|
|
IMaterialSystem *pMaterialSystem = reinterpret_cast< IMaterialSystem * >( FindSystem( MATERIAL_SYSTEM_INTERFACE_VERSION ) ); |
|
|
if ( !pMaterialSystem ) |
|
|
{ |
|
|
Error( "// ERROR: Unable to connect to material system interface!\n" ); |
|
|
return false; |
|
|
} |
|
|
|
|
|
pMaterialSystem->SetShaderAPI( "shaderapiempty.dll" ); |
|
|
return true; |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CDmxEditApp::PreInit( ) |
|
|
{ |
|
|
CreateInterfaceFn factory = GetFactory(); |
|
|
|
|
|
MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f, false, false, false, false ); |
|
|
|
|
|
ConnectTier1Libraries( &factory, 1 ); |
|
|
ConnectTier2Libraries( &factory, 1 ); |
|
|
ConnectTier3Libraries( &factory, 1 ); |
|
|
|
|
|
if ( !ConnectDataModel( factory ) ) |
|
|
return false; |
|
|
|
|
|
if ( InitDataModel( ) != INIT_OK ) |
|
|
return false; |
|
|
|
|
|
if ( !g_pFullFileSystem || !g_pDataModel ) |
|
|
{ |
|
|
Error( "// ERROR: dmxedit is missing a required interface!\n" ); |
|
|
return false; |
|
|
} |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// |
|
|
//----------------------------------------------------------------------------- |
|
|
void CDmxEditApp::PostShutdown() |
|
|
{ |
|
|
ShutdownDataModel(); |
|
|
DisconnectDataModel(); |
|
|
|
|
|
DisconnectTier3Libraries(); |
|
|
DisconnectTier2Libraries(); |
|
|
DisconnectTier1Libraries(); |
|
|
} |
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// The application object |
|
|
//----------------------------------------------------------------------------- |
|
|
int CDmxEditApp::Main() |
|
|
{ |
|
|
// This bit of hackery allows us to access files on the harddrive |
|
|
g_pFullFileSystem->AddSearchPath( "", "LOCAL", PATH_ADD_TO_HEAD ); |
|
|
|
|
|
if ( CommandLine()->CheckParm( "-h" ) || CommandLine()->CheckParm( "-help" ) ) |
|
|
{ |
|
|
PrintHelp(); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
if ( CommandLine()->CheckParm( "-wiki" ) ) |
|
|
{ |
|
|
PrintHelp( true ); |
|
|
return 0; |
|
|
} |
|
|
|
|
|
CUtlStringMap< CUtlString > setVars; |
|
|
CUtlString sGame; |
|
|
|
|
|
const int nParamCount = CommandLine()->ParmCount(); |
|
|
for ( int i = 0; i < nParamCount - 1; ++i ) |
|
|
{ |
|
|
const char *pCmd = CommandLine()->GetParm( i ); |
|
|
const char *pArg = CommandLine()->GetParm( i + 1 ); |
|
|
|
|
|
if ( StringHasPrefix( pCmd, "-s" ) ) |
|
|
{ |
|
|
const char *const pEquals = strchr( pArg, '=' ); |
|
|
if ( !pEquals ) |
|
|
{ |
|
|
Warning( "Warning: Invalid command line args, no ='s in -set argument: %s %s\n", pCmd, pArg ); |
|
|
} |
|
|
|
|
|
char buf[ BUFSIZ ]; |
|
|
Q_strncpy( buf, pArg, pEquals - pArg + 1 ); |
|
|
|
|
|
const CUtlString sKey( buf ); |
|
|
CUtlString sVal( pEquals + 1 ); |
|
|
|
|
|
if ( !V_isdigit( *sVal.Get() ) && *sVal.Get() != '-' && *sVal.Get() != '"' ) |
|
|
{ |
|
|
CUtlString sqVal( "\"" ); |
|
|
sqVal += sVal; |
|
|
sqVal += "\""; |
|
|
sVal = sqVal; |
|
|
} |
|
|
|
|
|
setVars[ sKey ] = sVal; |
|
|
|
|
|
if ( !Q_stricmp( sKey.Get(), "game" ) && sGame.IsEmpty() ) |
|
|
{ |
|
|
sGame = sKey; |
|
|
} |
|
|
|
|
|
++i; |
|
|
} |
|
|
else if ( StringHasPrefix( pCmd, "-g" ) ) |
|
|
{ |
|
|
if ( *pArg == '"' ) |
|
|
{ |
|
|
sGame = pArg; |
|
|
} |
|
|
else |
|
|
{ |
|
|
sGame = ( "\"" ); |
|
|
sGame += pArg; |
|
|
sGame += "\""; |
|
|
} |
|
|
} |
|
|
else if ( StringHasPrefix( pCmd, "-nop4" ) ) |
|
|
{ |
|
|
// Don't issue warning on -nop4 |
|
|
} |
|
|
else if ( StringHasPrefix( pCmd, "-coe" ) || StringHasPrefix( pCmd, "-ContinueOnError" ) ) |
|
|
{ |
|
|
// Don't issue warning on -nop4 |
|
|
} |
|
|
else if ( StringHasPrefix( pCmd, "-" ) ) |
|
|
{ |
|
|
Warning( "Warning: Unknown command line argument: %s\n", pCmd ); |
|
|
} |
|
|
} |
|
|
|
|
|
// Do Perforce Stuff |
|
|
if ( CommandLine()->FindParm( "-nop4" ) ) |
|
|
g_p4factory->SetDummyMode( true ); |
|
|
|
|
|
g_p4factory->SetOpenFileChangeList( "dmxedit" ); |
|
|
|
|
|
for ( int i = CommandLine()->ParmCount() - 1; i >= 1; --i ) |
|
|
{ |
|
|
const char *pParam = CommandLine()->GetParm( i ); |
|
|
if ( _access( pParam, 04 ) == 0 ) |
|
|
{ |
|
|
CDmxEditLua dmxEditLua; |
|
|
for ( int i = 0; i < setVars.GetNumStrings(); ++i ) |
|
|
{ |
|
|
dmxEditLua.SetVar( setVars.String( i ), setVars[ i ] ); |
|
|
} |
|
|
|
|
|
if ( !sGame.IsEmpty() ) |
|
|
{ |
|
|
dmxEditLua.SetGame( sGame ); |
|
|
} |
|
|
|
|
|
return dmxEditLua.DoIt( pParam ); |
|
|
} |
|
|
} |
|
|
|
|
|
Error( "Cannot find any file to execute from passed command line arguments\n\n" ); |
|
|
PrintHelp(); |
|
|
|
|
|
return -1; |
|
|
} |
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// |
|
|
//----------------------------------------------------------------------------- |
|
|
CUtlString Wikize( lua_State *pLuaState, const char *pWikiString ) |
|
|
{ |
|
|
CUtlString retVal( pWikiString ); |
|
|
|
|
|
lua_pushstring( pLuaState, "string"); |
|
|
lua_gettable( pLuaState, LUA_GLOBALSINDEX ); |
|
|
lua_pushstring( pLuaState, "gsub"); |
|
|
lua_gettable( pLuaState, -2); |
|
|
lua_pushstring( pLuaState, pWikiString ); |
|
|
lua_pushstring( pLuaState, "([$#]%w+)" ); |
|
|
lua_pushstring( pLuaState, "'''%0'''" ); |
|
|
|
|
|
if ( lua_pcall( pLuaState, 3, 1, 0 ) == 0 ) |
|
|
{ |
|
|
if ( lua_isstring( pLuaState, -1 ) ) |
|
|
{ |
|
|
retVal = lua_tostring( pLuaState, -1 ); |
|
|
} |
|
|
lua_pop( pLuaState, 1 ); |
|
|
} |
|
|
|
|
|
return retVal; |
|
|
} |
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// |
|
|
//----------------------------------------------------------------------------- |
|
|
template < class T_t > |
|
|
int Sort_LuaFunc_s( const T_t *pA, const T_t *pB ) |
|
|
{ |
|
|
return Q_stricmp( (*pA)->m_pFuncName, (*pB)->m_pFuncName ); |
|
|
} |
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// |
|
|
//----------------------------------------------------------------------------- |
|
|
void CDmxEditApp::PrintHelp( bool bWiki /* = false */ ) |
|
|
{ |
|
|
CUtlVector< LuaFunc_s * > luaFuncs; |
|
|
|
|
|
for ( LuaFunc_s *pFunc = LuaFunc_s::s_pFirstFunc; pFunc; pFunc = pFunc->m_pNextFunc ) |
|
|
{ |
|
|
luaFuncs.AddToTail( pFunc ); |
|
|
} |
|
|
luaFuncs.Sort( Sort_LuaFunc_s ); |
|
|
|
|
|
if ( bWiki && LuaFunc_s::s_pFirstFunc ) |
|
|
{ |
|
|
lua_State *pLuaState = lua_open(); |
|
|
if ( pLuaState ) |
|
|
{ |
|
|
luaL_openlibs( pLuaState ); |
|
|
|
|
|
CUtlString wikiString; |
|
|
|
|
|
for ( int i = 0; i < luaFuncs.Count(); ++i ) |
|
|
{ |
|
|
const LuaFunc_s *pFunc = luaFuncs[ i ]; |
|
|
if ( pFunc != LuaFunc_s::s_pFirstFunc ) |
|
|
{ |
|
|
Msg( "\n" ); |
|
|
} |
|
|
Msg( ";%s( %s );\n", pFunc->m_pFuncName, pFunc->m_pFuncPrototype ); |
|
|
Msg( ":%s\n", Wikize( pLuaState, pFunc->m_pFuncDesc ).Get() ); |
|
|
} |
|
|
|
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
Msg( "\n" ); |
|
|
Msg( "NAME\n" ); |
|
|
Msg( " dmxedit - Edit dmx files\n" ); |
|
|
Msg( "\n" ); |
|
|
Msg( "SYNOPSIS\n" ); |
|
|
Msg( " dmxedit [ -h | -help ] [ -game <$game> ] [ -set $var=val ] [ script.lua ]\n" ); |
|
|
Msg( "\n" ); |
|
|
Msg( " -h | -help : Prints this information\n" ); |
|
|
Msg( " -g | -game <$game> : Sets the VPROJECT environment variable to the specified game.\n" ); |
|
|
Msg( " -s | -set <$var=val> : Sets the lua variable var to the specified val before the script is run.\n" ); |
|
|
Msg( "\n" ); |
|
|
Msg( "DESCRIPTION\n" ); |
|
|
Msg( " Edits dmx files by executing a lua script of dmx editing functions\n" ); |
|
|
Msg( "\n" ); |
|
|
|
|
|
if ( !LuaFunc_s::s_pFirstFunc ) |
|
|
return; |
|
|
|
|
|
Msg( "FUNCTIONS\n" ); |
|
|
|
|
|
const char *pWhitespace = " \t"; |
|
|
|
|
|
for ( int i = 0; i < luaFuncs.Count(); ++i ) |
|
|
{ |
|
|
const LuaFunc_s *pFunc = luaFuncs[ i ]; |
|
|
|
|
|
Msg( " %s( %s );\n", pFunc->m_pFuncName, pFunc->m_pFuncPrototype ); |
|
|
Msg( " * " ); |
|
|
|
|
|
CUtlString tmpStr; |
|
|
|
|
|
const char *pWordBegin = pFunc->m_pFuncDesc + strspn( pFunc->m_pFuncDesc, pWhitespace ); |
|
|
const char *pWhiteSpaceBegin = pWordBegin; |
|
|
const char *pWordEnd = pWordBegin + strcspn( pWordBegin, pWhitespace ); |
|
|
|
|
|
bool bNewline = false; |
|
|
while ( *pWordBegin ) |
|
|
{ |
|
|
if ( pWordEnd - pWhiteSpaceBegin + tmpStr.Length() > 70 ) |
|
|
{ |
|
|
if ( bNewline ) |
|
|
{ |
|
|
Msg( " " ); |
|
|
} |
|
|
else |
|
|
{ |
|
|
bNewline = true; |
|
|
} |
|
|
Msg( "%s\n", tmpStr.Get() ); |
|
|
tmpStr.Set( "" ); |
|
|
} |
|
|
|
|
|
if ( tmpStr.Length() ) |
|
|
{ |
|
|
tmpStr += CUtlString( pWhiteSpaceBegin, pWordEnd - pWhiteSpaceBegin + 1); |
|
|
} |
|
|
else |
|
|
{ |
|
|
tmpStr += CUtlString( pWordBegin, pWordEnd - pWordBegin + 1 ); |
|
|
} |
|
|
|
|
|
pWhiteSpaceBegin = pWordEnd; |
|
|
pWordBegin = pWhiteSpaceBegin + strspn( pWhiteSpaceBegin, pWhitespace ); |
|
|
pWordEnd = pWordBegin + strcspn( pWordBegin, pWhitespace ); |
|
|
} |
|
|
|
|
|
if ( tmpStr.Length() ) |
|
|
{ |
|
|
if ( bNewline ) |
|
|
{ |
|
|
Msg( " " ); |
|
|
} |
|
|
Msg( "%s\n", tmpStr.Get() ); |
|
|
} |
|
|
Msg( "\n" ); |
|
|
} |
|
|
|
|
|
Msg( "CREDITS\n" ); |
|
|
Msg( " Lua Copyright <EFBFBD> 1994-2006 Lua.org, PUC-Rio.\n "); |
|
|
|
|
|
Msg( "\n" ); |
|
|
} |