fysxasteroids/engine/Engine.cc

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();
}
}