354 lines
6.6 KiB
C++
354 lines
6.6 KiB
C++
#include "Engine.h"
|
|
#include "Logging.h"
|
|
#include "Variables.h"
|
|
#include "Commands.h"
|
|
|
|
#include "PhysicsBase.h"
|
|
#include "CameraBase.h"
|
|
|
|
#include "ViewBase.h"
|
|
#include "ModelBase.h"
|
|
#include "ControllerBase.h"
|
|
|
|
#include "EntityFactoryBase.h"
|
|
#include "EventsBase.h"
|
|
|
|
#include <iostream>
|
|
#include <cstdio>
|
|
#include <cstdarg>
|
|
#include <cstdlib>
|
|
#include <assert.h>
|
|
|
|
int vasprintf (char **result, const char *format, va_list *string) {
|
|
return 0;
|
|
}
|
|
|
|
namespace Engine {
|
|
|
|
/* Globaly visible classes */
|
|
Engine* EngineInstance = NULL;
|
|
|
|
/*
|
|
* Inherited Module functions
|
|
*/
|
|
int Engine::OnInit (int argc, char* argv[]) {
|
|
EngineInstance = this;
|
|
mStatus = EngineStatusUndefined;
|
|
|
|
/* Initialization of the base modules */
|
|
if (mLogging == NULL)
|
|
mLogging = new Logging ();
|
|
|
|
if (! mLogging ) {
|
|
SetError ("Could not allocate memory for Logging!");
|
|
exit (-1);
|
|
}
|
|
mLogging->Init (argc, argv);
|
|
SetStatus (EngineStatusInitializing);
|
|
|
|
if (mEventManager == NULL)
|
|
mEventManager = new EventManager();
|
|
|
|
mEventManager->Init (argc, argv);
|
|
|
|
if (mVariables == NULL)
|
|
mVariables = new Variables ();
|
|
if (! mVariables ) {
|
|
SetError ("Could not allocate memory for Variables!");
|
|
exit (-1);
|
|
}
|
|
mVariables->Init (argc, argv);
|
|
|
|
if (mCommands == NULL)
|
|
mCommands = new Commands ();
|
|
if (! mCommands ) {
|
|
SetError ("Could not allocate memory for Commands!");
|
|
exit (-1);
|
|
}
|
|
mCommands->Init (argc, argv);
|
|
|
|
// Initialize the SDL
|
|
LogDebug ("Initializing SDL");
|
|
if ( SDL_Init ( SDL_INIT_VIDEO ) < 0) {
|
|
LogError ("Error initializing SDL: %s", SDL_GetError ());
|
|
exit (-1);
|
|
}
|
|
|
|
|
|
/* Model */
|
|
if (mModel == NULL)
|
|
mModel = new ModelBase ();
|
|
|
|
if (! mModel ) {
|
|
SetError ("Could not allocate memory for Model!");
|
|
exit (-1);
|
|
}
|
|
|
|
/* Initialization of the modules for the model */
|
|
if (mEntityFactory == NULL)
|
|
mEntityFactory = new EntityFactoryBase;
|
|
|
|
mModel->mEntityFactory = mEntityFactory;
|
|
|
|
|
|
/* Physics */
|
|
if (mPhysics == NULL) {
|
|
mPhysics = new PhysicsBase ();
|
|
|
|
if (! mPhysics ) {
|
|
SetError ("Could not allocate memory for Physics!");
|
|
exit (-1);
|
|
}
|
|
}
|
|
|
|
mModel->mPhysics = mPhysics;
|
|
|
|
mEntityFactory->Init (argc, argv);
|
|
mModel->mPhysics->Init (argc, argv);
|
|
mModel->Init (argc, argv);
|
|
|
|
/* View */
|
|
if (mView == NULL)
|
|
mView = new ViewBase ();
|
|
|
|
if (! mView ) {
|
|
SetError ("Could not allocate memory for View!");
|
|
exit (-1);
|
|
}
|
|
|
|
mView->mCamera = new CameraBase ();
|
|
mView->mCamera->Init (argc, argv);
|
|
|
|
mView->mModel = mModel;
|
|
mView->Init (argc, argv);
|
|
|
|
/* Controller */
|
|
if (mController == NULL)
|
|
mController = new ControllerBase ();
|
|
|
|
if (! mController ) {
|
|
SetError ("Could not allocate memory for Controller!");
|
|
exit (-1);
|
|
}
|
|
|
|
mController->mModel = mModel;
|
|
mController->mView = mView;
|
|
|
|
mController->Init (argc, argv);
|
|
|
|
/* Now register the commands */
|
|
mLogging->RegisterCommands ();
|
|
mVariables->RegisterCommands ();
|
|
mCommands->RegisterCommands ();
|
|
|
|
mModel->mPhysics->RegisterCommands ();
|
|
mModel->RegisterCommands ();
|
|
|
|
mView->mCamera->RegisterCommands ();
|
|
mView->RegisterCommands ();
|
|
|
|
mController->RegisterCommands ();
|
|
|
|
RegisterCommands ();
|
|
|
|
/* Now we are done */
|
|
SetStatus (EngineStatusInitialized);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void Engine::OnDestroy () {
|
|
SetStatus (EngineStatusDestroying);
|
|
|
|
// Quit the SDL
|
|
SDL_Quit ();
|
|
|
|
if (mController) {
|
|
mController->Destroy ();
|
|
delete mController;
|
|
mController = NULL;
|
|
}
|
|
|
|
if (mView) {
|
|
if (mView->mCamera ) {
|
|
mView->mCamera->Destroy ();
|
|
delete mView->mCamera;
|
|
}
|
|
|
|
mView->Destroy ();
|
|
delete mView;
|
|
mView = NULL;
|
|
}
|
|
|
|
if (mModel) {
|
|
mModel->Destroy ();
|
|
|
|
if (mModel->mPhysics ) {
|
|
mModel->mPhysics->Destroy ();
|
|
delete mModel->mPhysics;
|
|
}
|
|
|
|
delete mModel;
|
|
mModel = NULL;
|
|
}
|
|
|
|
if (mCommands) {
|
|
mCommands->Destroy ();
|
|
delete mCommands;
|
|
mCommands = NULL;
|
|
}
|
|
|
|
if (mVariables) {
|
|
mVariables->Destroy ();
|
|
delete mVariables;
|
|
mVariables = NULL;
|
|
}
|
|
|
|
SetStatus (EngineStatusStopped);
|
|
|
|
if (mEventManager) {
|
|
mEventManager->Destroy();
|
|
delete mEventManager;
|
|
mEventManager = NULL;
|
|
}
|
|
|
|
if (mLogging) {
|
|
mLogging->Destroy ();
|
|
delete mLogging;
|
|
mLogging = NULL;
|
|
}
|
|
|
|
mStatus = EngineStatusUndefined;
|
|
EngineInstance = NULL;
|
|
}
|
|
|
|
/*
|
|
* Module specific functions
|
|
*/
|
|
void Engine::SetStatus (EngineStatus new_status) {
|
|
LogDebug ("EngineStatus Change: '%d' -> '%d'", mStatus, new_status);
|
|
mStatus = new_status;
|
|
}
|
|
|
|
EngineStatus Engine::GetStatus () {
|
|
return mStatus;
|
|
}
|
|
|
|
void Engine::OnMainLoop () {
|
|
SetStatus (EngineStatusRunning);
|
|
|
|
while (mStatus == EngineStatusRunning) {
|
|
mController->Process ();
|
|
mCommands->QueueExecute ();
|
|
mEventManager->Process();
|
|
mModel->UpdateTimer ();
|
|
mModel->Process ();
|
|
mView->Draw ();
|
|
}
|
|
}
|
|
|
|
void Engine::SetError (const char* str, ...) {
|
|
static char msg[LOG_MAX_MESSAGE_LENGTH];
|
|
static int last_length = LOG_MAX_MESSAGE_LENGTH;
|
|
int i;
|
|
|
|
for (i = 0; i < last_length; i++)
|
|
msg[i] = 0;
|
|
|
|
va_list ap;
|
|
va_start(ap, str);
|
|
vsprintf(msg, str, ap);
|
|
va_end(ap);
|
|
|
|
mErrorString = msg;
|
|
|
|
last_length = strlen (msg);
|
|
}
|
|
|
|
const char* Engine::GetError () {
|
|
return mErrorString.c_str();
|
|
}
|
|
|
|
/*
|
|
* Global functions
|
|
*/
|
|
void EngineSetError (const char* str, ...) {
|
|
if (EngineInstance == NULL) {
|
|
std::cerr << "Error: Engine Instance not yet initialized!" << std::endl;
|
|
assert (0);
|
|
}
|
|
|
|
static char msg[LOG_MAX_MESSAGE_LENGTH];
|
|
static int last_length = LOG_MAX_MESSAGE_LENGTH;
|
|
int i;
|
|
|
|
for (i = 0; i < last_length; i++)
|
|
msg[i] = 0;
|
|
|
|
va_list ap;
|
|
va_start(ap, str);
|
|
vsprintf(msg, str, ap);
|
|
va_end(ap);
|
|
|
|
EngineInstance->SetError (msg);
|
|
|
|
last_length = strlen (msg);
|
|
}
|
|
|
|
const char* EngineGetError () {
|
|
if (EngineInstance == NULL) {
|
|
std::cerr << "Error: Engine Instance not yet initialized!" << std::endl;
|
|
assert (0);
|
|
}
|
|
|
|
return EngineInstance->GetError ();
|
|
}
|
|
|
|
void EngineSetStatus (const EngineStatus status) {
|
|
if (EngineInstance == NULL) {
|
|
std::cerr << "Error: Engine Instance not yet initialized!" << std::endl;
|
|
assert (0);
|
|
}
|
|
|
|
EngineInstance->SetStatus (status);
|
|
}
|
|
|
|
EngineStatus EngineGetStatus () {
|
|
if (EngineInstance == NULL) {
|
|
std::cerr << "Error: Engine Instance not yet initialized!" << std::endl;
|
|
assert (0);
|
|
}
|
|
|
|
return EngineInstance->GetStatus ();
|
|
}
|
|
|
|
ModelBase* EngineGetModel () {
|
|
if (EngineInstance == NULL) {
|
|
std::cerr << "Error: Engine Instance not yet initialized!" << std::endl;
|
|
assert (0);
|
|
}
|
|
|
|
return EngineInstance->GetModel();
|
|
}
|
|
|
|
ViewBase* EngineGetView () {
|
|
if (EngineInstance == NULL) {
|
|
std::cerr << "Error: Engine Instance not yet initialized!" << std::endl;
|
|
assert (0);
|
|
}
|
|
|
|
return EngineInstance->GetView();
|
|
}
|
|
|
|
ControllerBase* EngineGetController () {
|
|
if (EngineInstance == NULL) {
|
|
std::cerr << "Error: Engine Instance not yet initialized!" << std::endl;
|
|
assert (0);
|
|
}
|
|
|
|
return EngineInstance->GetController();
|
|
}
|
|
|
|
}
|
|
|