#include "main.h"
Game::Game(CSettings* sett, CLog* logging) {
settings = sett;
log = logging;
anaglyph = false;
for (u32 i=0; i<KEY_KEY_CODES_COUNT; ++i) KeyIsDown[i] = false;
}
Game::~Game() {
}
int Game::start() {
if(settings->DriverType==EDT_COUNT) return log->error(1, "User not selected driver");
log->info("GAME", "Starting the game...");
irr::SIrrlichtCreationParameters params;
params.DriverType = settings->DriverType;
#ifdef CONFIG_FULLSCREEN
params.Fullscreen = true;
params.Vsync = true;
params.WindowSize = CDeviceInfo::GetScreenResolution();
log->debug("GAME", "Fullscreen mode");
#else
params.WindowSize = dimension2d<u32>(800, 600);
log->debug("GAME", "Windowed mode");
#endif
params.EventReceiver = this;
device = createDeviceEx(params);
if(!device) return log->error(2, "Failed to create device");
log->debug("GAME", "Device created!");
#ifdef CONFIG_ANAGLYPH
log->debug("GAME", "Anaglyph 3D enabled!");
#else
log->debug("GAME", "Anaglyph 3D disabled!");
#endif
// video::IVideoDriver* driver = device->getVideoDriver();
// scene::ISceneManager* smgr = device->getSceneManager();
// gui::IGUIEnvironment* env = device->getGUIEnvironment();
driver = device->getVideoDriver();
smgr = device->getSceneManager();
env = device->getGUIEnvironment();
device->getCursorControl()->setVisible(false);
loader = new CMapLoader(device, log, "test");
camera = smgr->addCameraSceneNodeFPS(0, 50.0f, .1f, -1, settings->keyMap, 9, false, 0.5f);
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
loader->meta, camera, core::vector3df(5,5,5),
core::vector3df(0,-10,0));
camera->addAnimator(anim);
anim->drop(); // I'm done with the animator now
// And set the camera position so that it doesn't start off stuck in the geometry
camera->setPosition(core::vector3df(0.f, 500.f, 0.f));
//camera->setTarget(core::vector3df(0.f, 50.f, 0.f));
camera->setRotation(core::vector3df(0.f, 50.f, 0.f));
log->info("GAME", "Loaded. Starting main loop...");
int lastFPS = -1;
while(device->run() && driver) {
if (device->isWindowActive())
{
device->getCursorControl()->setVisible(false);
if(anaglyph) {
drawAnaglyph();
} else {
driver->beginScene(true, true, video::SColor(0,200,200,200));
draw();
driver->endScene();
}
int fps = driver->getFPS();
if (lastFPS != fps)
{
stringw str = L"";
str += PROJECT_NAME;
str += " [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
} else device->getCursorControl()->setVisible(true);
}
delete loader;
device->drop();
log->info("GAME", "Ending the game.");
return 0;
}
void Game::draw()
{
smgr->drawAll();
}
void Game::drawAnaglyph()
{
vector3df oldPosition=camera->getPosition();
vector3df oldTarget=camera->getTarget();
matrix4 startMatrix=camera->getAbsoluteTransformation();
vector3df focusPoint= (camera->getTarget()-camera->getAbsolutePosition()).setLength(1) + camera->getAbsolutePosition() ;
/*stringc str( "" );
str += "Pos:";
str += oldPosition.X;
str += "x";
str += oldPosition.Y;
str += "x";
str += oldPosition.Z;
str += " Tar:";
str += oldTarget.X;
str += "x";
str += oldTarget.Y;
str += "x";
str += oldTarget.Z;
str += " Foc:";
str += focusPoint.X;
str += "x";
str += focusPoint.Y;
str += "x";
str += focusPoint.Z;
log->debug(str.c_str());*/
//Left eye...
vector3df leftEye;
matrix4 leftMove;
leftMove.setTranslation( vector3df(-0.01f,0.0f,0.0f) );
leftEye=(startMatrix*leftMove).getTranslation();
//clear the depth buffer, and color
driver->beginScene( true, true, SColor(0,200,200,255) );
driver->getOverrideMaterial().Material.ColorMask=ECP_RED;
driver->getOverrideMaterial().EnableFlags=EMF_COLOR_MASK;
driver->getOverrideMaterial().EnablePasses=ESNRP_SKY_BOX+ESNRP_SOLID+ESNRP_TRANSPARENT+ESNRP_TRANSPARENT_EFFECT+ESNRP_SHADOW;
camera->setPosition( leftEye );
camera->setTarget( focusPoint );
draw(); // 'smgr->drawAll();' may go here
//Right eye...
vector3df rightEye;
matrix4 rightMove;
rightMove.setTranslation( vector3df(0.01f,0.0f,0.0f) );
rightEye=(startMatrix*rightMove).getTranslation();
//clear the depth buffer
driver->clearZBuffer();
driver->getOverrideMaterial().Material.ColorMask=ECP_GREEN+ECP_BLUE;
driver->getOverrideMaterial().EnableFlags=EMF_COLOR_MASK;
driver->getOverrideMaterial().EnablePasses=ESNRP_SKY_BOX+ESNRP_SOLID+ESNRP_TRANSPARENT+ESNRP_TRANSPARENT_EFFECT+ESNRP_SHADOW;
camera->setPosition( rightEye );
camera->setTarget( focusPoint );
draw(); // 'smgr->drawAll();' may go here
driver->endScene();
driver->getOverrideMaterial().Material.ColorMask=ECP_ALL;
driver->getOverrideMaterial().EnableFlags=0;
driver->getOverrideMaterial().EnablePasses=0;
camera->setPosition( oldPosition );
camera->setTarget( oldTarget );
}
bool Game::OnEvent(const SEvent& event)
{
if(event.EventType == EET_KEY_INPUT_EVENT) KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;
if(event.EventType == EET_LOG_TEXT_EVENT) {
if(event.LogEvent.Level == ELL_INFORMATION) log->info("ENGINE", event.LogEvent.Text);
if(event.LogEvent.Level == ELL_WARNING) log->warning(0, "ENGINE", event.LogEvent.Text);
if(event.LogEvent.Level == ELL_ERROR) log->error(0, "ENGINE", event.LogEvent.Text);
if(event.LogEvent.Level == ELL_NONE) log->debug("ENGINE", event.LogEvent.Text);
return true;
}
if ( event.EventType == EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown == false)
{
if ( event.KeyInput.Key == KEY_ESCAPE )
{
device->closeDevice();
}
#ifdef CONFIG_DEBUG_MODE
else if(event.KeyInput.Key == KEY_KEY_M)
{
camera->remove();
delete loader;
camera = device->getSceneManager()->addCameraSceneNodeFPS(0, 50.0f, .1f, -1, settings->keyMap, 9, false, 0.5f);
loader = new CMapLoader(device, log, "test2");
scene::ISceneNodeAnimator* anim = device->getSceneManager()->createCollisionResponseAnimator(
loader->meta, camera, core::vector3df(5,5,5),
core::vector3df(0,-10,0));
camera->addAnimator(anim);
anim->drop(); // I'm done with the animator now
// And set the camera position so that it doesn't start off stuck in the geometry
camera->setPosition(core::vector3df(0.f, 20.f, 0.f));
camera->setTarget(core::vector3df(0.f, 0.f, 0.f));
}
else if(event.KeyInput.Key == KEY_KEY_P)
{
CObjLoader* obj = new CObjLoader(device, log, "robots/PracticeBot");
}
else if(event.KeyInput.Key == KEY_KEY_Q)
{
anaglyph = !anaglyph;
}
#endif
else if(event.KeyInput.Key == CONFIG_KEY_SCREENSHOT) {
c8 buf[256];
// screenshot are taken without gamma!
IImage* image = device->getVideoDriver()->createScreenShot();
if (image)
{
time_t rawtime;
time(&rawtime);
struct tm * timeinfo;
timeinfo = localtime(&rawtime);
size_t slen = snprintf(buf, 256, "saves/screenshot/%s_%s_", loader->name, CDeviceInfo::GetShortDriverName(device->getVideoDriver()->getDriverType()));
slen += strftime(buf+slen, 256-slen, "%Y-%m-%d_%H-%M-%S", timeinfo);
strncpy(buf+slen, CONFIG_SCREENSHOT_EXT, 256-slen);
path filename(buf);
device->getVideoDriver()->writeImageToFile(image, filename, 100 );
image->drop();
char str[256];
snprintf(str, 256, "Screenshot taken: %s", buf+17);
log->info("SCRSHOOT", str);
}
}
}
return false;
}
bool Game::IsKeyDown(EKEY_CODE keyCode)
{
return KeyIsDown[keyCode];
}