You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
4.5 KiB
175 lines
4.5 KiB
// |
|
// Copyright (c) 2010-2011 Matthew Jack and Doug Binks |
|
// |
|
// This software is provided 'as-is', without any express or implied |
|
// warranty. In no event will the authors be held liable for any damages |
|
// arising from the use of this software. |
|
// Permission is granted to anyone to use this software for any purpose, |
|
// including commercial applications, and to alter it and redistribute it |
|
// freely, subject to the following restrictions: |
|
// 1. The origin of this software must not be misrepresented; you must not |
|
// claim that you wrote the original software. If you use this software |
|
// in a product, an acknowledgment in the product documentation would be |
|
// appreciated but is not required. |
|
// 2. Altered source versions must be plainly marked as such, and must not be |
|
// misrepresented as being the original software. |
|
// 3. This notice may not be removed or altered from any source distribution. |
|
|
|
#include "ConsoleGame.h" |
|
|
|
|
|
#include "../../RuntimeCompiler/AUArray.h" |
|
#include "../../RuntimeCompiler/BuildTool.h" |
|
#include "../../RuntimeCompiler/ICompilerLogger.h" |
|
#include "../../RuntimeCompiler/FileChangeNotifier.h" |
|
#include "../../RuntimeObjectSystem/IObjectFactorySystem.h" |
|
#include "../../RuntimeObjectSystem/ObjectFactorySystem/ObjectFactorySystem.h" |
|
#include "../../RuntimeObjectSystem/RuntimeObjectSystem.h" |
|
|
|
#include "StdioLogSystem.h" |
|
|
|
#include "../../RuntimeObjectSystem/IObject.h" |
|
#include "IUpdateable.h" |
|
#include "InterfaceIds.h" |
|
|
|
#include <iostream> |
|
#ifdef WIN32 |
|
#include <conio.h> |
|
#include <tchar.h> |
|
#else |
|
#include <unistd.h> |
|
int _getche() |
|
{ |
|
int ret = getchar(); |
|
return ret; |
|
} |
|
int _kbhit() |
|
{ |
|
std::cout << "This port needs a fix, CTRL-C to quit\n"; |
|
return 0; |
|
} |
|
|
|
int Sleep( int msecs ) |
|
{ |
|
return usleep( msecs * 1000); |
|
} |
|
#endif |
|
#include <sstream> |
|
#include <vector> |
|
#include <algorithm> |
|
#include <string> |
|
#include <stdarg.h> |
|
|
|
// Remove windows.h define of GetObject which conflicts with EntitySystem GetObject |
|
#if defined _WINDOWS_ && defined GetObject |
|
#undef GetObject |
|
#endif |
|
using FileSystemUtils::Path; |
|
|
|
ConsoleGame::ConsoleGame() |
|
: m_pCompilerLogger(0) |
|
, m_pRuntimeObjectSystem(0) |
|
, m_pUpdateable(0) |
|
{ |
|
} |
|
|
|
ConsoleGame::~ConsoleGame() |
|
{ |
|
if( m_pRuntimeObjectSystem ) |
|
{ |
|
// clean temp object files |
|
m_pRuntimeObjectSystem->CleanObjectFiles(); |
|
} |
|
|
|
if( m_pRuntimeObjectSystem && m_pRuntimeObjectSystem->GetObjectFactorySystem() ) |
|
{ |
|
m_pRuntimeObjectSystem->GetObjectFactorySystem()->RemoveListener(this); |
|
|
|
// delete object via correct interface |
|
IObject* pObj = m_pRuntimeObjectSystem->GetObjectFactorySystem()->GetObject( m_ObjectId ); |
|
delete pObj; |
|
} |
|
|
|
delete m_pRuntimeObjectSystem; |
|
delete m_pCompilerLogger; |
|
} |
|
|
|
|
|
bool ConsoleGame::Init() |
|
{ |
|
//Initialise the RuntimeObjectSystem |
|
m_pRuntimeObjectSystem = new RuntimeObjectSystem; |
|
m_pCompilerLogger = new StdioLogSystem(); |
|
if( !m_pRuntimeObjectSystem->Initialise(m_pCompilerLogger, 0) ) |
|
{ |
|
m_pRuntimeObjectSystem = 0; |
|
return false; |
|
} |
|
m_pRuntimeObjectSystem->GetObjectFactorySystem()->AddListener(this); |
|
|
|
|
|
// construct first object |
|
IObjectConstructor* pCtor = m_pRuntimeObjectSystem->GetObjectFactorySystem()->GetConstructor( "RuntimeObject01" ); |
|
if( pCtor ) |
|
{ |
|
IObject* pObj = pCtor->Construct(); |
|
pObj->GetInterface( &m_pUpdateable ); |
|
if( 0 == m_pUpdateable ) |
|
{ |
|
delete pObj; |
|
m_pCompilerLogger->LogError("Error - no updateable interface found\n"); |
|
return false; |
|
} |
|
m_ObjectId = pObj->GetObjectId(); |
|
|
|
} |
|
|
|
return true; |
|
} |
|
|
|
void ConsoleGame::OnConstructorsAdded() |
|
{ |
|
// This could have resulted in a change of object pointer, so release old and get new one. |
|
if( m_pUpdateable ) |
|
{ |
|
IObject* pObj = m_pRuntimeObjectSystem->GetObjectFactorySystem()->GetObject( m_ObjectId ); |
|
pObj->GetInterface( &m_pUpdateable ); |
|
if( 0 == m_pUpdateable ) |
|
{ |
|
delete pObj; |
|
m_pCompilerLogger->LogError( "Error - no updateable interface found\n"); |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
bool ConsoleGame::MainLoop() |
|
{ |
|
//check status of any compile |
|
if( m_pRuntimeObjectSystem->GetIsCompiledComplete() ) |
|
{ |
|
// load module when compile complete |
|
m_pRuntimeObjectSystem->LoadCompiledModule(); |
|
} |
|
|
|
if( !m_pRuntimeObjectSystem->GetIsCompiling() ) |
|
{ |
|
static int numUpdates = 0; |
|
std::cout << "\nMain Loop - press q to quit. Updates every second. Update: " << numUpdates++ << "\n"; |
|
if( _kbhit() ) |
|
{ |
|
int ret = _getche(); |
|
if( 'q' == ret ) |
|
{ |
|
return false; |
|
} |
|
} |
|
const float deltaTime = 1.0f; |
|
m_pRuntimeObjectSystem->GetFileChangeNotifier()->Update( deltaTime ); |
|
m_pUpdateable->Update( deltaTime ); |
|
Sleep(1000); |
|
} |
|
|
|
return true; |
|
}
|
|
|