2012-09-19 15:15:01 +00:00
//-----------------------------------------------------------------------------
// Copyright (c) 2012 GarageGames, LLC
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//-----------------------------------------------------------------------------
# ifdef TORQUE_SHARED
# ifdef WIN32
# include <windows.h>
2014-03-14 16:02:27 +00:00
# include <string>
2023-07-22 14:49:43 +00:00
# include <locale.h>
2012-09-19 15:15:01 +00:00
extern " C "
{
2014-03-14 15:36:43 +00:00
int ( * torque_winmain ) ( HINSTANCE hInstance , HINSTANCE h , LPSTR lpszCmdLine , int nShow ) = NULL ;
2012-09-19 15:15:01 +00:00
} ;
2015-02-19 01:47:33 +00:00
bool getDllName ( std : : wstring & dllName , const std : : wstring & suffix )
2014-03-11 09:57:39 +00:00
{
2014-03-14 16:02:27 +00:00
wchar_t filenameBuf [ MAX_PATH ] ;
DWORD length = GetModuleFileNameW ( NULL , filenameBuf , MAX_PATH ) ;
if ( length = = 0 ) return false ;
dllName = std : : wstring ( filenameBuf ) ;
size_t dotPos = dllName . find_last_of ( L " . " ) ;
2014-07-10 09:56:33 +00:00
if ( dotPos = = std : : wstring : : npos )
{
dllName . clear ( ) ;
return false ;
}
2014-03-14 16:02:27 +00:00
dllName . erase ( dotPos ) ;
2014-07-10 09:56:33 +00:00
dllName + = suffix + L " .dll " ;
2014-03-14 16:02:27 +00:00
return true ;
}
2014-03-14 15:36:43 +00:00
2014-11-11 20:19:26 +00:00
int WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpszCmdLine , int nCommandShow )
2014-03-14 16:02:27 +00:00
{
2014-07-10 09:56:33 +00:00
// Try to find the game DLL, which may have one of several file names.
HMODULE hGame = NULL ;
2014-03-14 16:02:27 +00:00
std : : wstring dllName = std : : wstring ( ) ;
2014-07-10 09:56:33 +00:00
// The file name is the same as this executable's name, plus a suffix.
2014-08-16 01:55:21 +00:00
const std : : wstring dllSuffices [ ] = { L " DLL " , L " " } ;
2014-07-10 09:56:33 +00:00
const unsigned int numSuffices = sizeof ( dllSuffices ) / sizeof ( std : : wstring ) ;
for ( unsigned int i = 0 ; i < numSuffices ; i + + )
{
// Attempt to glue the suffix onto the current filename.
if ( ! getDllName ( dllName , dllSuffices [ i ] ) )
continue ;
// Load the DLL at that address.
hGame = LoadLibraryW ( dllName . c_str ( ) ) ;
if ( hGame )
break ;
}
if ( ! dllName . length ( ) )
2014-03-14 16:02:27 +00:00
{
MessageBoxW ( NULL , L " Unable to find game dll " , L " Error " , MB_OK | MB_ICONWARNING ) ;
return - 1 ;
}
2014-03-14 15:36:43 +00:00
2014-12-12 01:07:11 +00:00
enum { errorSize = 4096 } ;
2014-03-14 15:36:43 +00:00
if ( ! hGame )
{
2014-12-12 01:07:11 +00:00
wchar_t error [ errorSize ] ;
_swprintf_l ( error , errorSize , L " Unable to load game library: %s. Please make sure it exists and the latest DirectX is installed. " , _get_current_locale ( ) , dllName . c_str ( ) ) ;
2014-03-14 16:02:27 +00:00
MessageBoxW ( NULL , error , L " Error " , MB_OK | MB_ICONWARNING ) ;
2014-03-14 15:36:43 +00:00
return - 1 ;
}
2014-03-14 16:02:27 +00:00
torque_winmain = ( int ( * ) ( HINSTANCE hInstance , HINSTANCE h , LPSTR lpszCmdLine , int nShow ) ) GetProcAddress ( hGame , " torque_winmain " ) ;
2014-03-14 15:36:43 +00:00
if ( ! torque_winmain )
{
2014-12-12 01:07:11 +00:00
wchar_t error [ errorSize ] ;
_swprintf_l ( error , errorSize , L " Missing torque_winmain export in game library: %s. Please make sure that it exists and the latest DirectX is installed. " , _get_current_locale ( ) , dllName . c_str ( ) ) ;
2014-03-14 16:02:27 +00:00
MessageBoxW ( NULL , error , L " Error " , MB_OK | MB_ICONWARNING ) ;
2014-03-14 15:36:43 +00:00
return - 1 ;
}
2014-03-14 16:02:27 +00:00
int ret = torque_winmain ( hInstance , hPrevInstance , lpszCmdLine , nCommandShow ) ;
2014-03-14 15:36:43 +00:00
FreeLibrary ( hGame ) ;
return ret ;
2012-09-19 15:15:01 +00:00
}
# endif // WIN32
# ifdef __MACOSX__
# include <dlfcn.h>
# include <stdio.h>
# include <unistd.h>
2022-06-01 20:59:06 +00:00
# include <libgen.h> // for dirname
# include <filesystem>
# include <mach-o/dyld.h> // for _NSGetExecutablePath
2012-09-19 15:15:01 +00:00
# include <Carbon/Carbon.h>
extern " C " {
2014-03-14 15:36:43 +00:00
int ( * torque_macmain ) ( int argc , const char * * argv ) = 0 ;
2012-09-19 15:15:01 +00:00
2022-06-01 20:59:06 +00:00
}
2012-09-19 15:15:01 +00:00
int main ( int argc , const char * * argv )
{
2022-06-01 20:59:06 +00:00
char path [ PATH_MAX ] ;
uint32_t pathLen = sizeof ( path ) ;
int err = _NSGetExecutablePath ( path , & pathLen ) ;
2012-09-19 15:15:01 +00:00
2022-06-01 20:59:06 +00:00
char * executableDirectory = dirname ( path ) ;
2012-09-19 15:15:01 +00:00
2022-06-01 20:59:06 +00:00
// Once the executable directory is determined, we search two possibilities: The frameworks and next to the app bundle
chdir ( executableDirectory ) ;
chdir ( " ../Frameworks " ) ;
2012-09-19 15:15:01 +00:00
2022-06-01 20:59:06 +00:00
void * gameLib = dlopen ( " libTorqueEngine.dylib " , RTLD_LAZY | RTLD_LOCAL ) ;
if ( ! gameLib )
2014-03-14 15:36:43 +00:00
{
return - 1 ;
2022-06-01 20:59:06 +00:00
}
2012-09-19 15:15:01 +00:00
2022-06-01 20:59:06 +00:00
torque_macmain = ( int ( * ) ( int argc , const char * * argv ) ) dlsym ( gameLib , " torque_macmain " ) ;
2012-09-19 15:15:01 +00:00
2014-03-14 15:36:43 +00:00
if ( ! torque_macmain )
2022-06-01 20:59:06 +00:00
return - 2 ;
2012-09-19 15:15:01 +00:00
2014-03-14 15:36:43 +00:00
return torque_macmain ( argc , argv ) ;
2012-09-19 15:15:01 +00:00
}
# endif // __MACOSX
# ifdef __linux__
# include <dlfcn.h>
# include <stdio.h>
# include <unistd.h>
# include <string.h>
extern " C "
{
2014-03-14 15:36:43 +00:00
int ( * torque_unixmain ) ( int argc , const char * * argv ) = NULL ;
void ( * setExePathName ) ( const char * exePathName ) = NULL ;
2012-09-19 15:15:01 +00:00
}
int main ( int argc , const char * * argv )
{
2014-03-14 15:36:43 +00:00
// assume bin name is in argv[0]
int len = strlen ( argv [ 0 ] ) ;
char * libName = new char [ len + 4 ] ; // len + .so + NUL
strcpy ( libName , argv [ 0 ] ) ;
strcat ( libName , " .so " ) ;
// try to load the game lib
void * gameLib = dlopen ( libName , RTLD_LAZY | RTLD_LOCAL ) ;
delete [ ] libName ;
if ( gameLib = = NULL )
{
printf ( " %s \n " , dlerror ( ) ) ;
return - 1 ;
}
// set the filename of the exe image
setExePathName = ( void ( * ) ( const char * ) ) dlsym ( gameLib , " setExePathName " ) ;
if ( setExePathName = = NULL )
{
printf ( " %s \n " , dlerror ( ) ) ;
return - 1 ;
}
setExePathName ( argv [ 0 ] ) ;
// try to load the lib entry point
torque_unixmain = ( int ( * ) ( int argc , const char * * argv ) ) dlsym ( gameLib , " torque_unixmain " ) ;
if ( torque_unixmain = = NULL )
{
printf ( " %s \n " , dlerror ( ) ) ;
return - 1 ;
}
// Go!
return torque_unixmain ( argc , argv ) ;
2012-09-19 15:15:01 +00:00
}
# endif // __linux__
# else //static exe build
# include "platform/platform.h"
# include "app/mainLoop.h"
# include "T3D/gameFunctions.h"
2022-05-17 22:04:19 +00:00
# if defined(WIN32) || defined(_WIN32)
2018-02-27 04:34:21 +00:00
//tell switchable graphics supported systems that they need to use the beefier GPU
# include <windows.h>
extern " C " { __declspec ( dllexport ) DWORD NvOptimusEnablement = 0x00000001 ; }
extern " C " { __declspec ( dllexport ) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001 ; }
2022-05-17 22:04:19 +00:00
# else
2018-02-27 02:45:18 +00:00
extern " C " { int NvOptimusEnablement = 1 ; }
extern " C " { int AmdPowerXpressRequestHighPerformance = 1 ; }
# endif
2012-09-19 15:15:01 +00:00
// Entry point for your game.
//
// This is build by default using the "StandardMainLoop" toolkit. Feel free
// to bring code over directly as you need to modify or extend things. You
// will need to merge against future changes to the SML code if you do this.
S32 TorqueMain ( S32 argc , const char * * argv )
{
2014-03-14 15:36:43 +00:00
// Some handy debugging code:
// if (argc == 1) {
// static const char* argvFake[] = { "dtest.exe", "-jload", "test.jrn" };
// argc = 3;
// argv = argvFake;
// }
2012-09-19 15:15:01 +00:00
2014-03-14 15:36:43 +00:00
// Memory::enableLogging("testMem.log");
// Memory::setBreakAlloc(104717);
2012-09-19 15:15:01 +00:00
2014-03-14 15:36:43 +00:00
// Initialize the subsystems.
StandardMainLoop : : init ( ) ;
2012-09-19 15:15:01 +00:00
2014-03-14 15:36:43 +00:00
// Handle any command line args.
if ( ! StandardMainLoop : : handleCommandLine ( argc , argv ) )
{
Platform : : AlertOK ( " Error " , " Failed to initialize game, shutting down. " ) ;
2012-09-19 15:15:01 +00:00
2014-03-14 15:36:43 +00:00
return 1 ;
}
2012-09-19 15:15:01 +00:00
2014-03-14 15:36:43 +00:00
// Main loop
while ( StandardMainLoop : : doMainLoop ( ) ) ;
2012-09-19 15:15:01 +00:00
2014-03-14 15:36:43 +00:00
// Clean everything up.
StandardMainLoop : : shutdown ( ) ;
2012-09-19 15:15:01 +00:00
2014-03-14 15:36:43 +00:00
// Do we need to restart?
if ( StandardMainLoop : : requiresRestart ( ) )
Platform : : restartInstance ( ) ;
2012-09-19 15:15:01 +00:00
2014-03-14 15:36:43 +00:00
// Return.
2014-09-21 08:27:31 +00:00
return StandardMainLoop : : getReturnStatus ( ) ;
2012-09-19 15:15:01 +00:00
}
# endif //TORQUE_SHARED