mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-03 13:09:40 +00:00
Restore savegame screenshot display
This commit is contained in:
parent
1f00174c02
commit
025a1a7866
4 changed files with 69 additions and 25 deletions
|
@ -1,18 +1,21 @@
|
||||||
#include "savegamedialog.hpp"
|
#include "savegamedialog.hpp"
|
||||||
#include "widgets.hpp"
|
|
||||||
|
|
||||||
#include <OgreImage.h>
|
|
||||||
#include <OgreTextureManager.h>
|
|
||||||
|
|
||||||
#include <MyGUI_ComboBox.h>
|
#include <MyGUI_ComboBox.h>
|
||||||
#include <MyGUI_ImageBox.h>
|
#include <MyGUI_ImageBox.h>
|
||||||
#include <MyGUI_ListBox.h>
|
#include <MyGUI_ListBox.h>
|
||||||
#include <MyGUI_InputManager.h>
|
#include <MyGUI_InputManager.h>
|
||||||
|
|
||||||
|
#include <osgDB/ReadFile>
|
||||||
|
#include <osg/Texture2D>
|
||||||
|
|
||||||
|
#include <components/myguiplatform/myguitexture.hpp>
|
||||||
|
|
||||||
#include <components/misc/stringops.hpp>
|
#include <components/misc/stringops.hpp>
|
||||||
|
|
||||||
#include <components/settings/settings.hpp>
|
#include <components/settings/settings.hpp>
|
||||||
|
|
||||||
|
#include <components/files/memorystream.hpp>
|
||||||
|
|
||||||
#include "../mwbase/statemanager.hpp"
|
#include "../mwbase/statemanager.hpp"
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
|
@ -22,6 +25,7 @@
|
||||||
#include "../mwstate/character.hpp"
|
#include "../mwstate/character.hpp"
|
||||||
|
|
||||||
#include "confirmationdialog.hpp"
|
#include "confirmationdialog.hpp"
|
||||||
|
#include "widgets.hpp"
|
||||||
|
|
||||||
namespace MWGui
|
namespace MWGui
|
||||||
{
|
{
|
||||||
|
@ -358,30 +362,38 @@ namespace MWGui
|
||||||
<< " " << hour << " " << (pm ? "#{sSaveMenuHelp05}" : "#{sSaveMenuHelp04}");
|
<< " " << hour << " " << (pm ? "#{sSaveMenuHelp05}" : "#{sSaveMenuHelp04}");
|
||||||
|
|
||||||
mInfoText->setCaptionWithReplacing(text.str());
|
mInfoText->setCaptionWithReplacing(text.str());
|
||||||
#if 0
|
|
||||||
|
|
||||||
// Decode screenshot
|
// Decode screenshot
|
||||||
std::vector<char> data = mCurrentSlot->mProfile.mScreenshot; // MemoryDataStream doesn't work with const data :(
|
const std::vector<char>& data = mCurrentSlot->mProfile.mScreenshot;
|
||||||
Ogre::DataStreamPtr stream(new Ogre::MemoryDataStream(&data[0], data.size()));
|
Files::IMemStream instream (&data[0], data.size());
|
||||||
Ogre::Image image;
|
|
||||||
image.load(stream, "jpg");
|
|
||||||
|
|
||||||
const std::string textureName = "@savegame_screenshot";
|
osgDB::ReaderWriter* readerwriter = osgDB::Registry::instance()->getReaderWriterForExtension("jpg");
|
||||||
Ogre::TexturePtr texture;
|
if (!readerwriter)
|
||||||
texture = Ogre::TextureManager::getSingleton().getByName(textureName);
|
|
||||||
mScreenshot->setImageTexture("");
|
|
||||||
if (texture.isNull())
|
|
||||||
{
|
{
|
||||||
texture = Ogre::TextureManager::getSingleton().createManual(textureName,
|
std::cerr << "Can't open savegame screenshot, no jpg readerwriter found" << std::endl;
|
||||||
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
|
return;
|
||||||
Ogre::TEX_TYPE_2D,
|
|
||||||
image.getWidth(), image.getHeight(), 0, Ogre::PF_BYTE_RGBA, Ogre::TU_DYNAMIC_WRITE_ONLY);
|
|
||||||
}
|
}
|
||||||
texture->unload();
|
|
||||||
texture->setWidth(image.getWidth());
|
|
||||||
texture->setHeight(image.getHeight());
|
|
||||||
texture->loadImage(image);
|
|
||||||
|
|
||||||
mScreenshot->setImageTexture(textureName);
|
osgDB::ReaderWriter::ReadResult result = readerwriter->readImage(instream);
|
||||||
#endif
|
if (!result.success())
|
||||||
|
{
|
||||||
|
std::cerr << "Failed to read savegame screenshot: " << result.message() << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Texture2D> texture (new osg::Texture2D);
|
||||||
|
texture->setImage(result.getImage());
|
||||||
|
texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
|
||||||
|
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
|
||||||
|
texture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
|
||||||
|
texture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
|
||||||
|
texture->setResizeNonPowerOfTwoHint(false);
|
||||||
|
texture->setUnRefImageDataAfterApply(true);
|
||||||
|
|
||||||
|
mScreenshotTexture.reset(new osgMyGUI::OSGTexture(texture));
|
||||||
|
|
||||||
|
mScreenshot->setRenderItemTexture(mScreenshotTexture.get());
|
||||||
|
mScreenshot->getSubWidgetMain()->_setUVSet(MyGUI::FloatRect(0.f, 1.f, 1.f, 0.f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ namespace MWGui
|
||||||
|
|
||||||
void fillSaveList();
|
void fillSaveList();
|
||||||
|
|
||||||
|
std::auto_ptr<MyGUI::ITexture> mScreenshotTexture;
|
||||||
MyGUI::ImageBox* mScreenshot;
|
MyGUI::ImageBox* mScreenshot;
|
||||||
bool mSaving;
|
bool mSaving;
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,7 @@ IF(NOT WIN32 AND NOT APPLE)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
add_component_dir (files
|
add_component_dir (files
|
||||||
linuxpath androidpath windowspath macospath fixedpath multidircollection collections configurationmanager
|
linuxpath androidpath windowspath macospath fixedpath multidircollection collections configurationmanager
|
||||||
lowlevelfile constrainedfilestream
|
lowlevelfile constrainedfilestream memorystream
|
||||||
)
|
)
|
||||||
|
|
||||||
add_component_dir (compiler
|
add_component_dir (compiler
|
||||||
|
|
31
components/files/memorystream.hpp
Normal file
31
components/files/memorystream.hpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#ifndef OPENMW_COMPONENTS_FILES_MEMORYSTREAM_H
|
||||||
|
#define OPENMW_COMPONENTS_FILES_MEMORYSTREAM_H
|
||||||
|
|
||||||
|
#include <istream>
|
||||||
|
|
||||||
|
namespace Files
|
||||||
|
{
|
||||||
|
|
||||||
|
struct MemBuf : std::streambuf
|
||||||
|
{
|
||||||
|
MemBuf(char const* buffer, size_t size)
|
||||||
|
{
|
||||||
|
// a streambuf isn't specific to istreams, so we need a non-const pointer :/
|
||||||
|
char* nonconstBuffer = (const_cast<char*>(buffer));
|
||||||
|
this->setg(nonconstBuffer, nonconstBuffer, nonconstBuffer + size);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @brief A variant of std::istream that reads from a constant in-memory buffer.
|
||||||
|
struct IMemStream: virtual MemBuf, std::istream
|
||||||
|
{
|
||||||
|
IMemStream(char const* buffer, size_t size)
|
||||||
|
: MemBuf(buffer, size)
|
||||||
|
, std::istream(static_cast<std::streambuf*>(this))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue