1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-15 23:49:55 +00:00
openmw-tes3mp/apps/openmw/mwgui/videowidget.cpp
scrawl e8662bea31 Change the way that image origin is converted to OpenGL's lower-left convention
Flip the texture coordinates instead of flipping textures.

This simplifies the TextureManager (no need to worry if the caller wants flipping or not), should make it easier to generalize & multithread it.
2016-02-05 21:03:11 +01:00

101 lines
2.2 KiB
C++

#include "videowidget.hpp"
#include <extern/osg-ffmpeg-videoplayer/videoplayer.hpp>
#include <MyGUI_RenderManager.h>
#include <osg/Texture2D>
#include <components/vfs/manager.hpp>
#include <components/myguiplatform/myguitexture.hpp>
#include "../mwsound/movieaudiofactory.hpp"
namespace MWGui
{
VideoWidget::VideoWidget()
: mVFS(NULL)
{
mPlayer.reset(new Video::VideoPlayer());
setNeedKeyFocus(true);
}
void VideoWidget::setVFS(const VFS::Manager *vfs)
{
mVFS = vfs;
}
void VideoWidget::playVideo(const std::string &video)
{
mPlayer->setAudioFactory(new MWSound::MovieAudioFactory());
Files::IStreamPtr videoStream;
try
{
videoStream = mVFS->get(video);
}
catch (std::exception& e)
{
std::cerr << "Failed to open video: " << e.what() << std::endl;
return;
}
mPlayer->playVideo(videoStream, video);
osg::ref_ptr<osg::Texture2D> texture = mPlayer->getVideoTexture();
if (!texture)
return;
mTexture.reset(new osgMyGUI::OSGTexture(texture));
setRenderItemTexture(mTexture.get());
getSubWidgetMain()->_setUVSet(MyGUI::FloatRect(0.f, 1.f, 1.f, 0.f));
}
int VideoWidget::getVideoWidth()
{
return mPlayer->getVideoWidth();
}
int VideoWidget::getVideoHeight()
{
return mPlayer->getVideoHeight();
}
bool VideoWidget::update()
{
return mPlayer->update();
}
void VideoWidget::stop()
{
mPlayer->close();
}
bool VideoWidget::hasAudioStream()
{
return mPlayer->hasAudioStream();
}
void VideoWidget::autoResize(bool stretch)
{
MyGUI::IntSize screenSize = MyGUI::RenderManager::getInstance().getViewSize();
if (getParent())
screenSize = getParent()->getSize();
if (getVideoHeight() > 0 && !stretch)
{
double imageaspect = static_cast<double>(getVideoWidth())/getVideoHeight();
int leftPadding = std::max(0, static_cast<int>(screenSize.width - screenSize.height * imageaspect) / 2);
int topPadding = std::max(0, static_cast<int>(screenSize.height - screenSize.width / imageaspect) / 2);
setCoord(leftPadding, topPadding,
screenSize.width - leftPadding*2, screenSize.height - topPadding*2);
}
else
setCoord(0,0,screenSize.width,screenSize.height);
}
}