diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index bbd6feb66..10288bbc0 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -249,9 +249,6 @@ namespace MWInput case A_Screenshot: screenshot(); break; - case A_Screenshot360: - screenshot360(); - break; case A_Inventory: toggleInventory (); break; @@ -1020,17 +1017,31 @@ namespace MWInput void InputManager::screenshot() { - mScreenCaptureHandler->setFramesToCapture(1); - mScreenCaptureHandler->captureNextFrame(*mViewer); - MWBase::Environment::get().getWindowManager()->messageBox("Screenshot saved"); - } + bool regularScreenshot = true; - void InputManager::screenshot360() - { - osg::ref_ptr screenshot (new osg::Image); - if (MWBase::Environment::get().getWorld()->screenshot360(screenshot.get())) - (*mScreenCaptureOperation) (*(screenshot.get()),0); - // calling mScreenCaptureHandler->getCaptureOperation() here caused segfault for some reason + try + { + // FIXME: the same string "screenshot type" is queried here AND in renderingmanager.cpp + std::string s = Settings::Manager::getString("screenshot type","Video"); + regularScreenshot = s.size() == 0; + } + catch (std::runtime_error) + { + } + + if (regularScreenshot) + { + mScreenCaptureHandler->setFramesToCapture(1); + mScreenCaptureHandler->captureNextFrame(*mViewer); + MWBase::Environment::get().getWindowManager()->messageBox("Screenshot saved"); + } + else + { + osg::ref_ptr screenshot (new osg::Image); + + if (MWBase::Environment::get().getWorld()->screenshot360(screenshot.get())) + (*mScreenCaptureOperation) (*(screenshot.get()),0); + } } void InputManager::toggleInventory() @@ -1216,7 +1227,6 @@ namespace MWInput defaultKeyBindings[A_QuickKey9] = SDL_SCANCODE_9; defaultKeyBindings[A_QuickKey10] = SDL_SCANCODE_0; defaultKeyBindings[A_Screenshot] = SDL_SCANCODE_F12; - defaultKeyBindings[A_Screenshot360] = SDL_SCANCODE_F8; defaultKeyBindings[A_ToggleHUD] = SDL_SCANCODE_F11; defaultKeyBindings[A_ToggleDebug] = SDL_SCANCODE_F10; defaultKeyBindings[A_AlwaysRun] = SDL_SCANCODE_CAPSLOCK; @@ -1352,9 +1362,6 @@ namespace MWInput if (action == A_Screenshot) return "Screenshot"; - if (action == A_Screenshot360) - return "Screenshot 360"; - descriptions[A_Use] = "sUse"; descriptions[A_Activate] = "sActivate"; descriptions[A_MoveBackward] = "sBack"; @@ -1516,7 +1523,6 @@ namespace MWInput ret.push_back(A_QuickSave); ret.push_back(A_QuickLoad); ret.push_back(A_Screenshot); - ret.push_back(A_Screenshot360); ret.push_back(A_QuickKeysMenu); ret.push_back(A_QuickKey1); ret.push_back(A_QuickKey2); @@ -1548,7 +1554,6 @@ namespace MWInput ret.push_back(A_QuickSave); ret.push_back(A_QuickLoad); ret.push_back(A_Screenshot); - ret.push_back(A_Screenshot360); ret.push_back(A_QuickKeysMenu); ret.push_back(A_QuickKey1); ret.push_back(A_QuickKey2); diff --git a/apps/openmw/mwinput/inputmanagerimp.hpp b/apps/openmw/mwinput/inputmanagerimp.hpp index 5d3e88eab..82b62e79b 100644 --- a/apps/openmw/mwinput/inputmanagerimp.hpp +++ b/apps/openmw/mwinput/inputmanagerimp.hpp @@ -229,7 +229,6 @@ namespace MWInput void toggleInventory(); void toggleConsole(); void screenshot(); - void screenshot360(); void toggleJournal(); void activate(); void toggleWalking(); diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index ff54ab1dc..682f35cc6 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -41,6 +41,8 @@ #include #include +#include + #include "../mwworld/cellstore.hpp" #include "sky.hpp" @@ -773,19 +775,62 @@ namespace MWRender bool RenderingManager::screenshot360(osg::Image* image) { - if (mCamera->isVanityOrPreviewModeEnabled()) + int screenshotW = mViewer->getCamera()->getViewport()->width(); + int screenshotH = mViewer->getCamera()->getViewport()->height(); + SphericalScreenshot::SphericalScreenshotMapping screenshotMapping = SphericalScreenshot::MAPPING_SPHERICAL; + int cubeSize = screenshotW / 2; + + try + { + std::string settingStr = Settings::Manager::getString("screenshot type","Video"); + std::vector settingArgs; + boost::algorithm::split(settingArgs,settingStr,boost::is_any_of(" ")); + + if (settingArgs.size() > 0) + { + std::string typeStrings[4] = {"spherical","cylindrical","planet","cubemap"}; + bool found = false; + + for (int i = 0; i < 4; ++i) + if (settingArgs[0].compare(typeStrings[i]) == 0) + { + screenshotMapping = (SphericalScreenshot::SphericalScreenshotMapping) i; + found = true; + break; + } + + if (!found) + { + std::cerr << "Wrong screenshot type: " << settingArgs[0] << "." << std::endl; + return false; + } + } + + if (settingArgs.size() > 1) + screenshotW = std::min(10000,std::atoi(settingArgs[1].c_str())); + + if (settingArgs.size() > 2) + screenshotH = std::min(10000,std::atoi(settingArgs[2].c_str())); + + if (settingArgs.size() > 3) + cubeSize = std::min(5000,std::atoi(settingArgs[3].c_str())); + } + catch (std::runtime_error) + { + std::cerr << "Wrong parameters for screenshot type." << std::endl; return false; + } - int screenshotWidth = Settings::Manager::tryGetInt("s360 width","Video",mViewer->getCamera()->getViewport()->width()); - int screenshotHeight = Settings::Manager::tryGetInt("s360 height","Video",mViewer->getCamera()->getViewport()->height()); - SphericalScreenshot::SphericalScreenshotMapping mapping = static_cast( - Settings::Manager::tryGetInt("s360 mapping","Video",SphericalScreenshot::MAPPING_SPHERICAL)); - int cubeWidth = Settings::Manager::tryGetInt("s360 cubemap size","Video",screenshotWidth / 2); + if (mCamera->isVanityOrPreviewModeEnabled()) + { + std::cerr << "Spherical screenshots are not allowed in preview mode." << std::endl; + return false; + } - if (mapping == SphericalScreenshot::MAPPING_CUBEMAP) - screenshotWidth = cubeWidth * 6; // the image will consist of 6 cube sides in a row + if (screenshotMapping == SphericalScreenshot::MAPPING_CUBEMAP) + screenshotW = cubeSize * 6; // the image will consist of 6 cube sides in a row - SphericalScreenshot s(cubeWidth); + SphericalScreenshot s(cubeSize); osg::Vec3 directions[6] = { osg::Vec3(0,0,-1), @@ -797,20 +842,20 @@ namespace MWRender }; double fovBackup = mFieldOfView; - mFieldOfView = 90.0; // each side sees 90 degrees + mFieldOfView = 90.0; // each cubemap side sees 90 degrees int maskBackup = mPlayerAnimation->getObjectRoot()->getNodeMask(); if (mCamera->isFirstPerson()) mPlayerAnimation->getObjectRoot()->setNodeMask(0); - for (int i = 0; i < 6; i++) // for each cube side + for (int i = 0; i < 6; i++) // for each cubemap side { osg::Image *sideImage = s.getImage(i); - screenshot(sideImage,cubeWidth,cubeWidth,directions[i]); + screenshot(sideImage,cubeSize,cubeSize,directions[i]); } - s.create(image,screenshotWidth,mapping != SphericalScreenshot::MAPPING_SMALL_PLANET ? screenshotHeight : screenshotWidth,mapping); + s.create(image,screenshotW,screenshotMapping != SphericalScreenshot::MAPPING_SMALL_PLANET ? screenshotH : screenshotW,screenshotMapping); mPlayerAnimation->getObjectRoot()->setNodeMask(maskBackup); mFieldOfView = fovBackup;