#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;
params.Bits = 32;
#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!");
// 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);
log->info("GAME", "Loading...");
CLevelLoader* level = new CLevelLoader(device, log, "first");
log->debug("GAME", "Level loaded!");
loader = new CMapLoader(device, log, "test");
/*IAnimatedMesh* mesh = smgr->getMesh("levels/land1.3DS");
IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );
ITriangleSelector* selector = 0;
if (node)
{
node->setMaterialFlag(EMF_LIGHTING, false);
node->setMaterialTexture( 0, driver->getTexture("textures/land1/grass1_a.jpg") );
node->setPosition(vector3df(0.f, 50.f, 0.f));
selector = smgr->createTriangleSelectorFromBoundingBox( node );
}*/
camera = smgr->addCameraSceneNodeFPS(0, 50.0f, .1f, -1, settings->keyMap, 9, false, 0.f);
camera->setNearValue(CONFIG_CAMERA_DRAW_DISTANCE_MIN);
camera->setFarValue(CONFIG_CAMERA_DRAW_DISTANCE_MAX);
#ifdef CONFIG_WIDESCREEN
camera->setAspectRatio(16.0f / 9.0f);
#else
camera->setAspectRatio(4.0f / 3.0f);
#endif
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(loader->meta, camera, core::vector3df(5,5,5), core::vector3df(0,-10,0));
//scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(selector, camera, core::vector3df(5,5,5), core::vector3df(0,-10,0));
camera->addAnimator(anim);
anim->drop(); // I'm done with the animator now
pAnaglyphCamera = smgr->addCameraSceneNode();
pAnaglyphCamera->setInputReceiverEnabled(false);
pAnaglyphCamera->setScale( camera->getScale());
pAnaglyphCamera->setNearValue( camera->getNearValue());
pAnaglyphCamera->setFarValue( camera->getFarValue());
pAnaglyphCamera->setAspectRatio( camera->getAspectRatio());
smgr->setActiveCamera(camera);
// And set the camera position so that it doesn't start off stuck in the geometry
camera->setPosition(core::vector3df(0.f, 50.f, 0.f));
camera->setTarget(core::vector3df(50.f, 0.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;
delete level;
device->drop();
log->info("GAME", "Ending the game.");
return 0;
}
void Game::draw()
{
smgr->drawAll();
}
void Game::drawAnaglyph()
{
scene::ICameraSceneNode* pCamera = smgr->getActiveCamera();
// explicitly update attached camera animators
pCamera->OnAnimate(device->getTimer()->getTime());
pCamera->OnRegisterSceneNode();
core::matrix4 startMatrix=pCamera->getAbsoluteTransformation();
core:: vector3df focusPoint=
(pCamera->getTarget()-pCamera->getAbsolutePosition()).setLength(1) + pCamera->getAbsolutePosition() ;
//Left eye...
core::vector3df leftEye;
core::matrix4 leftMove;
leftMove.setTranslation( core::vector3df(-CONFIG_ANAGLYPH_EYE_DIST,0.0f,0.0f) );
leftEye=(startMatrix*leftMove).getTranslation();
//Right eye...
core::vector3df rightEye;
core::matrix4 rightMove;
rightMove.setTranslation( core::vector3df(CONFIG_ANAGLYPH_EYE_DIST,0.0f,0.0f) );
rightEye=(startMatrix*rightMove).getTranslation();
// enable secondary camera for anaglyph rendering
smgr->setActiveCamera(pAnaglyphCamera);
// ------- RENDER LEFT EYE ----------
driver->beginScene( true, true, video::SColor(0,200,200,200) );
driver->getOverrideMaterial().Material.ColorMask= video::ECP_RED;
driver->getOverrideMaterial().EnableFlags= video::EMF_COLOR_MASK;
driver->getOverrideMaterial().EnablePasses= scene::ESNRP_SKY_BOX+ scene::ESNRP_SOLID +
scene::ESNRP_TRANSPARENT+ scene::ESNRP_TRANSPARENT_EFFECT+ scene::ESNRP_SHADOW;
pAnaglyphCamera->setTarget( focusPoint );
pAnaglyphCamera->setPosition( leftEye );
pAnaglyphCamera->OnRegisterSceneNode();
draw();
// ------- RENDER RIGHT EYE ----------
driver->clearZBuffer();
driver->getOverrideMaterial().Material.ColorMask= video::ECP_GREEN + video::ECP_BLUE;
driver->getOverrideMaterial().EnableFlags= video::EMF_COLOR_MASK;
driver->getOverrideMaterial().EnablePasses= scene::ESNRP_SKY_BOX+ scene::ESNRP_SOLID+
scene::ESNRP_TRANSPARENT+ scene::ESNRP_TRANSPARENT_EFFECT+ scene::ESNRP_SHADOW;
pAnaglyphCamera->setTarget( focusPoint );
pAnaglyphCamera->setPosition( rightEye );
pAnaglyphCamera->OnRegisterSceneNode();
draw();
driver->getOverrideMaterial().Material.ColorMask= video::ECP_ALL;
driver->getOverrideMaterial().EnableFlags=0;
driver->getOverrideMaterial().EnablePasses=0;
driver->endScene();
// restore active camera
smgr->setActiveCamera(pCamera);
}
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];
}