mirror of
https://github.com/OpenMW/openmw.git
synced 2025-06-19 13:41:32 +00:00
segfault fix
This commit is contained in:
parent
d4fd08a63f
commit
8f32114025
6 changed files with 56 additions and 50 deletions
|
@ -484,7 +484,7 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
|
||||||
else
|
else
|
||||||
gameControllerdb = ""; //if it doesn't exist, pass in an empty string
|
gameControllerdb = ""; //if it doesn't exist, pass in an empty string
|
||||||
|
|
||||||
MWInput::InputManager* input = new MWInput::InputManager (mWindow, mViewer, mScreenCaptureHandler, keybinderUser, keybinderUserExists, gameControllerdb, mGrab);
|
MWInput::InputManager* input = new MWInput::InputManager (mWindow, mViewer, mScreenCaptureHandler, mScreenCaptureOperation, keybinderUser, keybinderUserExists, gameControllerdb, mGrab);
|
||||||
mEnvironment.setInputManager (input);
|
mEnvironment.setInputManager (input);
|
||||||
|
|
||||||
std::string myguiResources = (mResDir / "mygui").string();
|
std::string myguiResources = (mResDir / "mygui").string();
|
||||||
|
@ -641,8 +641,11 @@ void OMW::Engine::go()
|
||||||
|
|
||||||
settingspath = loadSettings (settings);
|
settingspath = loadSettings (settings);
|
||||||
|
|
||||||
mScreenCaptureHandler = new osgViewer::ScreenCaptureHandler(new WriteScreenshotToFileOperation(mCfgMgr.getUserDataPath().string(),
|
mScreenCaptureOperation = new WriteScreenshotToFileOperation(mCfgMgr.getUserDataPath().string(),
|
||||||
Settings::Manager::getString("screenshot format", "General")));
|
Settings::Manager::getString("screenshot format", "General"));
|
||||||
|
|
||||||
|
mScreenCaptureHandler = new osgViewer::ScreenCaptureHandler(mScreenCaptureOperation);
|
||||||
|
|
||||||
mViewer->addEventHandler(mScreenCaptureHandler);
|
mViewer->addEventHandler(mScreenCaptureHandler);
|
||||||
|
|
||||||
mEnvironment.setFrameRateLimit(Settings::Manager::getFloat("framerate limit", "Video"));
|
mEnvironment.setFrameRateLimit(Settings::Manager::getFloat("framerate limit", "Video"));
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#include <components/settings/settings.hpp>
|
#include <components/settings/settings.hpp>
|
||||||
|
|
||||||
#include <osgViewer/Viewer>
|
#include <osgViewer/Viewer>
|
||||||
|
#include <osgViewer/ViewerEventHandlers>
|
||||||
|
|
||||||
#include "mwbase/environment.hpp"
|
#include "mwbase/environment.hpp"
|
||||||
|
|
||||||
|
@ -82,6 +82,7 @@ namespace OMW
|
||||||
boost::filesystem::path mResDir;
|
boost::filesystem::path mResDir;
|
||||||
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
||||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> mScreenCaptureHandler;
|
osg::ref_ptr<osgViewer::ScreenCaptureHandler> mScreenCaptureHandler;
|
||||||
|
osgViewer::ScreenCaptureHandler::CaptureOperation *mScreenCaptureOperation;
|
||||||
std::string mCellName;
|
std::string mCellName;
|
||||||
std::vector<std::string> mContentFiles;
|
std::vector<std::string> mContentFiles;
|
||||||
bool mSkipMenu;
|
bool mSkipMenu;
|
||||||
|
|
|
@ -37,12 +37,14 @@ namespace MWInput
|
||||||
SDL_Window* window,
|
SDL_Window* window,
|
||||||
osg::ref_ptr<osgViewer::Viewer> viewer,
|
osg::ref_ptr<osgViewer::Viewer> viewer,
|
||||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler,
|
osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler,
|
||||||
|
osgViewer::ScreenCaptureHandler::CaptureOperation *screenCaptureOperation,
|
||||||
const std::string& userFile, bool userFileExists,
|
const std::string& userFile, bool userFileExists,
|
||||||
const std::string& controllerBindingsFile, bool grab)
|
const std::string& controllerBindingsFile, bool grab)
|
||||||
: mWindow(window)
|
: mWindow(window)
|
||||||
, mWindowVisible(true)
|
, mWindowVisible(true)
|
||||||
, mViewer(viewer)
|
, mViewer(viewer)
|
||||||
, mScreenCaptureHandler(screenCaptureHandler)
|
, mScreenCaptureHandler(screenCaptureHandler)
|
||||||
|
, mScreenCaptureOperation(screenCaptureOperation)
|
||||||
, mJoystickLastUsed(false)
|
, mJoystickLastUsed(false)
|
||||||
, mPlayer(NULL)
|
, mPlayer(NULL)
|
||||||
, mInputManager(NULL)
|
, mInputManager(NULL)
|
||||||
|
@ -1027,29 +1029,7 @@ namespace MWInput
|
||||||
{
|
{
|
||||||
osg::ref_ptr<osg::Image> screenshot (new osg::Image);
|
osg::ref_ptr<osg::Image> screenshot (new osg::Image);
|
||||||
MWBase::Environment::get().getWorld()->screenshot360(screenshot.get());
|
MWBase::Environment::get().getWorld()->screenshot360(screenshot.get());
|
||||||
(*mScreenCaptureHandler->getCaptureOperation()) (*(screenshot.get()),0);
|
(*mScreenCaptureOperation) (*(screenshot.get()),0);
|
||||||
|
|
||||||
/*
|
|
||||||
osgDB::ReaderWriter* readerwriter = osgDB::Registry::instance()->getReaderWriterForExtension("jpg");
|
|
||||||
|
|
||||||
if (!readerwriter)
|
|
||||||
{
|
|
||||||
std::cerr << "Error: Unable to write 360 degree screenshot, can't find a jpg ReaderWriter" << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ofstream outfile;
|
|
||||||
outfile.open("test.jpg");
|
|
||||||
|
|
||||||
osgDB::ReaderWriter::WriteResult result = readerwriter->writeImage(*screenshot, outfile);
|
|
||||||
|
|
||||||
if (!result.success())
|
|
||||||
{
|
|
||||||
outfile << "Error: Unable to write screenshot: " << result.message() << " code " << result.status() << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
outfile.close(); */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputManager::toggleInventory()
|
void InputManager::toggleInventory()
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "../mwgui/mode.hpp"
|
#include "../mwgui/mode.hpp"
|
||||||
|
|
||||||
#include <osg/ref_ptr>
|
#include <osg/ref_ptr>
|
||||||
|
#include <osgViewer/ViewerEventHandlers>
|
||||||
|
|
||||||
#include <extern/oics/ICSChannelListener.h>
|
#include <extern/oics/ICSChannelListener.h>
|
||||||
#include <extern/oics/ICSInputControlSystem.h>
|
#include <extern/oics/ICSInputControlSystem.h>
|
||||||
|
@ -14,7 +15,6 @@
|
||||||
|
|
||||||
#include "../mwbase/inputmanager.hpp"
|
#include "../mwbase/inputmanager.hpp"
|
||||||
|
|
||||||
|
|
||||||
namespace MWWorld
|
namespace MWWorld
|
||||||
{
|
{
|
||||||
class Player;
|
class Player;
|
||||||
|
@ -74,6 +74,7 @@ namespace MWInput
|
||||||
SDL_Window* window,
|
SDL_Window* window,
|
||||||
osg::ref_ptr<osgViewer::Viewer> viewer,
|
osg::ref_ptr<osgViewer::Viewer> viewer,
|
||||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler,
|
osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler,
|
||||||
|
osgViewer::ScreenCaptureHandler::CaptureOperation *screenCaptureOperation,
|
||||||
const std::string& userFile, bool userFileExists,
|
const std::string& userFile, bool userFileExists,
|
||||||
const std::string& controllerBindingsFile, bool grab);
|
const std::string& controllerBindingsFile, bool grab);
|
||||||
|
|
||||||
|
@ -158,6 +159,7 @@ namespace MWInput
|
||||||
bool mWindowVisible;
|
bool mWindowVisible;
|
||||||
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
||||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> mScreenCaptureHandler;
|
osg::ref_ptr<osgViewer::ScreenCaptureHandler> mScreenCaptureHandler;
|
||||||
|
osgViewer::ScreenCaptureHandler::CaptureOperation *mScreenCaptureOperation;
|
||||||
|
|
||||||
bool mJoystickLastUsed;
|
bool mJoystickLastUsed;
|
||||||
MWWorld::Player* mPlayer;
|
MWWorld::Player* mPlayer;
|
||||||
|
|
|
@ -625,6 +625,13 @@ namespace MWRender
|
||||||
class SphericalScreenshot
|
class SphericalScreenshot
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
MAPPING_CYLINDRICAL = 0,
|
||||||
|
MAPPING_SPHERICAL,
|
||||||
|
MAPPING_SMALL_PLANET
|
||||||
|
} SphericalScreenshotMapping;
|
||||||
|
|
||||||
SphericalScreenshot(int size)
|
SphericalScreenshot(int size)
|
||||||
{
|
{
|
||||||
mSize = size;
|
mSize = size;
|
||||||
|
@ -638,13 +645,26 @@ namespace MWRender
|
||||||
return mImages[index].get();
|
return mImages[index].get();
|
||||||
}
|
}
|
||||||
|
|
||||||
void create(osg::Image *dest, int w, int h)
|
void create(osg::Image *dest, int w, int h, SphericalScreenshotMapping mapping)
|
||||||
{
|
{
|
||||||
dest->allocateImage(w,h,mImages[0]->r(),mImages[0]->getPixelFormat(),mImages[0]->getDataType());
|
dest->allocateImage(w,h,mImages[0]->r(),mImages[0]->getPixelFormat(),mImages[0]->getDataType());
|
||||||
|
|
||||||
for (int j = 0; j < h; ++j)
|
for (int j = 0; j < h; ++j)
|
||||||
for (int i = 0; i < w; ++i)
|
for (int i = 0; i < w; ++i)
|
||||||
dest->setColor(getColorByDirection(sphericalCoords(i / ((float) w), j / ((float) h))),i,j);
|
{
|
||||||
|
osg::Vec3d coords;
|
||||||
|
osg::Vec2d normalizedXY = osg::Vec2d(i / ((float) w), j / ((float) h));
|
||||||
|
|
||||||
|
switch (mapping)
|
||||||
|
{
|
||||||
|
case MAPPING_CYLINDRICAL: coords = cylindricalCoords(normalizedXY.x(),normalizedXY.y()); break;
|
||||||
|
case MAPPING_SPHERICAL: coords = sphericalCoords(normalizedXY.x(),normalizedXY.y()); break;
|
||||||
|
case MAPPING_SMALL_PLANET: coords = smallPlanetCoords(normalizedXY.x(),normalizedXY.y()); break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dest->setColor(getColorByDirection(coords),i,j);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::Vec3d cylindricalCoords(double x, double y)
|
osg::Vec3d cylindricalCoords(double x, double y)
|
||||||
|
@ -682,18 +702,18 @@ namespace MWRender
|
||||||
|
|
||||||
osg::Vec4 getColorByDirection(osg::Vec3d d)
|
osg::Vec4 getColorByDirection(osg::Vec3d d)
|
||||||
{
|
{
|
||||||
|
// for details see OpenGL 4.4 specification page 241
|
||||||
|
|
||||||
double x, y;
|
double x, y;
|
||||||
double ma; // see OpenGL 4.4 specification page 241
|
double ma;
|
||||||
int side;
|
int side;
|
||||||
|
|
||||||
double ax, ay, az;
|
double ax, ay, az;
|
||||||
ax = d.x() > 0 ? d.x() : -d.x();
|
ax = d.x() > 0 ? d.x() : -d.x(); // abs behaves weirdly for some reason
|
||||||
ay = d.y() > 0 ? d.y() : -d.y();
|
ay = d.y() > 0 ? d.y() : -d.y();
|
||||||
az = d.z() > 0 ? d.z() : -d.z();
|
az = d.z() > 0 ? d.z() : -d.z();
|
||||||
|
|
||||||
|
|
||||||
if (ax > ay)
|
if (ax > ay)
|
||||||
{
|
|
||||||
if (ax > az)
|
if (ax > az)
|
||||||
{
|
{
|
||||||
side = d.x() > 0 ? 1 : 3;
|
side = d.x() > 0 ? 1 : 3;
|
||||||
|
@ -704,9 +724,7 @@ namespace MWRender
|
||||||
side = d.z() > 0 ? 5 : 4;
|
side = d.z() > 0 ? 5 : 4;
|
||||||
ma = az;
|
ma = az;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
if (ay > az)
|
if (ay > az)
|
||||||
{
|
{
|
||||||
side = d.y() > 0 ? 0 : 2;
|
side = d.y() > 0 ? 0 : 2;
|
||||||
|
@ -717,12 +735,11 @@ namespace MWRender
|
||||||
side = d.z() > 0 ? 5 : 4;
|
side = d.z() > 0 ? 5 : 4;
|
||||||
ma = az;
|
ma = az;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
switch (side)
|
switch (side)
|
||||||
{
|
{
|
||||||
case 0: x = d.x(); y = d.z(); break;
|
case 0: x = d.x(); y = d.z(); break;
|
||||||
case 1: x = -d.y(); y = d.z(); break;
|
case 1: x = -d.y(); y = d.z(); break;
|
||||||
case 2: x = -d.x(); y = d.z(); break;
|
case 2: x = -d.x(); y = d.z(); break;
|
||||||
case 3: x = d.y(); y = d.z(); break;
|
case 3: x = d.y(); y = d.z(); break;
|
||||||
case 4: x = d.x(); y = d.y(); break;
|
case 4: x = d.x(); y = d.y(); break;
|
||||||
|
@ -745,8 +762,10 @@ namespace MWRender
|
||||||
|
|
||||||
void RenderingManager::screenshot360(osg::Image* image)
|
void RenderingManager::screenshot360(osg::Image* image)
|
||||||
{
|
{
|
||||||
int w = 1024;
|
int cubeWidth = 1024;
|
||||||
SphericalScreenshot s(w);
|
int screenshotWidth = 1600;
|
||||||
|
int screenshotHeight = 1280;
|
||||||
|
SphericalScreenshot s(cubeWidth);
|
||||||
|
|
||||||
osg::Vec3 directions[6] = {
|
osg::Vec3 directions[6] = {
|
||||||
osg::Vec3(0,0,-1),
|
osg::Vec3(0,0,-1),
|
||||||
|
@ -766,18 +785,18 @@ namespace MWRender
|
||||||
for (int i = 0; i < 6; i++) // for each cube side
|
for (int i = 0; i < 6; i++) // for each cube side
|
||||||
{
|
{
|
||||||
osg::Image *sideImage = s.getImage(i);
|
osg::Image *sideImage = s.getImage(i);
|
||||||
screenshot(sideImage,w,w,directions[i]);
|
screenshot(sideImage,cubeWidth,cubeWidth,directions[i],true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mCamera->isFirstPerson())
|
if (mCamera->isFirstPerson())
|
||||||
mPlayerAnimation->getObjectRoot()->setNodeMask(1);
|
mPlayerAnimation->getObjectRoot()->setNodeMask(1);
|
||||||
|
|
||||||
s.create(image,1600,1600);
|
s.create(image,screenshotWidth,screenshotHeight,SphericalScreenshot::MAPPING_SPHERICAL);
|
||||||
|
|
||||||
mFieldOfView = fovBackup;
|
mFieldOfView = fovBackup;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderingManager::screenshot(osg::Image *image, int w, int h, osg::Vec3 direction)
|
void RenderingManager::screenshot(osg::Image *image, int w, int h, osg::Vec3 direction, bool disableWaterEffects)
|
||||||
{
|
{
|
||||||
osg::ref_ptr<osg::Camera> rttCamera (new osg::Camera);
|
osg::ref_ptr<osg::Camera> rttCamera (new osg::Camera);
|
||||||
rttCamera->setNodeMask(Mask_RenderToTexture);
|
rttCamera->setNodeMask(Mask_RenderToTexture);
|
||||||
|
@ -786,9 +805,7 @@ namespace MWRender
|
||||||
rttCamera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
|
rttCamera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
|
||||||
rttCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT, osg::Camera::PIXEL_BUFFER_RTT);
|
rttCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT, osg::Camera::PIXEL_BUFFER_RTT);
|
||||||
rttCamera->setProjectionMatrixAsPerspective(mFieldOfView, w/float(h), mNearClip, mViewDistance);
|
rttCamera->setProjectionMatrixAsPerspective(mFieldOfView, w/float(h), mNearClip, mViewDistance);
|
||||||
rttCamera->setViewMatrix(
|
rttCamera->setViewMatrix(mViewer->getCamera()->getViewMatrix() * osg::Matrixd::rotate(osg::Vec3(0,0,-1),direction));
|
||||||
mViewer->getCamera()->getViewMatrix() * osg::Matrixd::rotate(osg::Vec3(0,0,-1),direction)
|
|
||||||
);
|
|
||||||
|
|
||||||
rttCamera->setViewport(0, 0, w, h);
|
rttCamera->setViewport(0, 0, w, h);
|
||||||
|
|
||||||
|
@ -816,13 +833,16 @@ namespace MWRender
|
||||||
// at the time this function is called we are in the middle of a frame,
|
// at the time this function is called we are in the middle of a frame,
|
||||||
// so out of order calls are necessary to get a correct frameNumber for the next frame.
|
// so out of order calls are necessary to get a correct frameNumber for the next frame.
|
||||||
// refer to the advance() and frame() order in Engine::go()
|
// refer to the advance() and frame() order in Engine::go()
|
||||||
mWater->setEffectsEnabled(false);
|
|
||||||
|
if (disableWaterEffects)
|
||||||
|
mWater->setEffectsEnabled(false);
|
||||||
|
|
||||||
mViewer->eventTraversal();
|
mViewer->eventTraversal();
|
||||||
mViewer->updateTraversal();
|
mViewer->updateTraversal();
|
||||||
mViewer->renderingTraversals();
|
mViewer->renderingTraversals();
|
||||||
|
|
||||||
mWater->setEffectsEnabled(true);
|
if (disableWaterEffects)
|
||||||
|
mWater->setEffectsEnabled(true);
|
||||||
|
|
||||||
callback->waitTillDone();
|
callback->waitTillDone();
|
||||||
|
|
||||||
|
|
|
@ -125,7 +125,7 @@ namespace MWRender
|
||||||
void setWaterHeight(float level);
|
void setWaterHeight(float level);
|
||||||
|
|
||||||
/// Take a screenshot of w*h onto the given image, not including the GUI.
|
/// Take a screenshot of w*h onto the given image, not including the GUI.
|
||||||
void screenshot(osg::Image* image, int w, int h, osg::Vec3 direction=osg::Vec3(0,0,-1));
|
void screenshot(osg::Image* image, int w, int h, osg::Vec3 direction=osg::Vec3(0,0,-1), bool disableWaterEffects=false);
|
||||||
void screenshot360(osg::Image* image);
|
void screenshot360(osg::Image* image);
|
||||||
|
|
||||||
struct RayResult
|
struct RayResult
|
||||||
|
|
Loading…
Reference in a new issue