1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-04-01 19:36:42 +00:00

added black bars

This commit is contained in:
scrawl 2012-12-15 19:23:03 +01:00
parent e6d27cd6d0
commit 5ed04ae53e
3 changed files with 47 additions and 7 deletions

View file

@ -162,6 +162,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const
mOcclusionQuery = new OcclusionQuery(&mRendering, mSkyManager->getSunNode()); mOcclusionQuery = new OcclusionQuery(&mRendering, mSkyManager->getSunNode());
mVideoPlayer = new VideoPlayer(mRendering.getScene ()); mVideoPlayer = new VideoPlayer(mRendering.getScene ());
mVideoPlayer->setResolution (Settings::Manager::getInt ("resolution x", "Video"), Settings::Manager::getInt ("resolution y", "Video"));
mSun = 0; mSun = 0;
@ -843,6 +844,8 @@ void RenderingManager::windowResized(Ogre::RenderWindow* rw)
mCompositors->recreate(); mCompositors->recreate();
mWater->assignTextures(); mWater->assignTextures();
mVideoPlayer->setResolution (rw->getWidth(), rw->getHeight());
const Settings::CategorySettingVector& changed = Settings::Manager::apply(); const Settings::CategorySettingVector& changed = Settings::Manager::apply();
MWBase::Environment::get().getInputManager()->processChangedSettings(changed); //FIXME MWBase::Environment::get().getInputManager()->processChangedSettings(changed); //FIXME
MWBase::Environment::get().getWindowManager()->processChangedSettings(changed); // FIXME MWBase::Environment::get().getWindowManager()->processChangedSettings(changed); // FIXME

View file

@ -950,22 +950,41 @@ VideoPlayer::VideoPlayer(Ogre::SceneManager* sceneMgr)
} }
mVideoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("black.png"); mVideoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("black.png");
Ogre::MaterialPtr blackMaterial = Ogre::MaterialManager::getSingleton().getByName("BlackBarsMaterial", "General");
if (blackMaterial.isNull ())
{
blackMaterial = Ogre::MaterialManager::getSingleton().create("BlackBarsMaterial", "General");
blackMaterial->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false);
blackMaterial->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false);
blackMaterial->getTechnique(0)->getPass(0)->setLightingEnabled(false);
blackMaterial->getTechnique(0)->getPass(0)->createTextureUnitState()->setTextureName("black.png");
}
mRectangle = new Ogre::Rectangle2D(true); mRectangle = new Ogre::Rectangle2D(true);
mRectangle->setCorners(-1.0, 1.0, 1.0, -1.0); mRectangle->setCorners(-1.0, 1.0, 1.0, -1.0);
mRectangle->setMaterial("VideoMaterial"); mRectangle->setMaterial("VideoMaterial");
mRectangle->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY+1); mRectangle->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY+2);
mBackgroundRectangle = new Ogre::Rectangle2D(true);
mBackgroundRectangle->setCorners(-1.0, 1.0, 1.0, -1.0);
mBackgroundRectangle->setMaterial("BlackBarsMaterial");
mBackgroundRectangle->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY+1);
// Use infinite AAB to always stay visible // Use infinite AAB to always stay visible
Ogre::AxisAlignedBox aabInf; Ogre::AxisAlignedBox aabInf;
aabInf.setInfinite(); aabInf.setInfinite();
mRectangle->setBoundingBox(aabInf); mRectangle->setBoundingBox(aabInf);
mBackgroundRectangle->setBoundingBox(aabInf);
// Attach background to the scene // Attach background to the scene
mNode = sceneMgr->getRootSceneNode()->createChildSceneNode(); mNode = sceneMgr->getRootSceneNode()->createChildSceneNode();
mNode->attachObject(mRectangle); mNode->attachObject(mRectangle);
mBackgroundNode = sceneMgr->getRootSceneNode()->createChildSceneNode();
mBackgroundNode->attachObject(mBackgroundRectangle);
mRectangle->setVisible(false); mRectangle->setVisible(false);
mRectangle->setVisibilityFlags(0x1); mRectangle->setVisibilityFlags(0x1);
mBackgroundRectangle->setVisible(false);
mBackgroundRectangle->setVisibilityFlags(0x1);
} }
VideoPlayer::~VideoPlayer() VideoPlayer::~VideoPlayer()
@ -973,13 +992,11 @@ VideoPlayer::~VideoPlayer()
if(mState) if(mState)
close(); close();
if(mNode) mSceneMgr->destroySceneNode(mNode);
mSceneMgr->destroySceneNode(mNode); mSceneMgr->destroySceneNode(mBackgroundNode);
mNode = NULL;
if(mRectangle) delete mRectangle;
delete mRectangle; delete mBackgroundRectangle;
mRectangle = NULL;
} }
void VideoPlayer::playVideo(const std::string &resourceName) void VideoPlayer::playVideo(const std::string &resourceName)
@ -991,6 +1008,7 @@ void VideoPlayer::playVideo(const std::string &resourceName)
close(); close();
mRectangle->setVisible(true); mRectangle->setVisible(true);
mBackgroundRectangle->setVisible(true);
MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Video); MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Video);
@ -1025,6 +1043,17 @@ void VideoPlayer::update ()
// Would be nice not to do this all the time... // Would be nice not to do this all the time...
if(mState->display_ready) if(mState->display_ready)
mVideoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("VideoTexture"); mVideoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("VideoTexture");
// Correct aspect ratio by adding black bars
int width = (mState->video_st->codec->width);
int height = (mState->video_st->codec->height);
float screenaspect = static_cast<float>(mWidth) / mHeight;
float videoaspect = static_cast<float>(width) / height;
float aspect_correction = videoaspect / screenaspect;
mRectangle->setCorners (std::max(-1.f, -1.f * aspect_correction), std::min(1.f, 1.f / aspect_correction),
std::min(1.f, 1.f * aspect_correction), std::max(-1.f, -1.f / aspect_correction));
} }
} }
} }
@ -1040,6 +1069,7 @@ void VideoPlayer::close()
MWBase::Environment::get().getSoundManager()->resumeAllSounds(); MWBase::Environment::get().getSoundManager()->resumeAllSounds();
mRectangle->setVisible(false); mRectangle->setVisible(false);
mBackgroundRectangle->setVisible(false);
MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Video); MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Video);
mSceneMgr->clearSpecialCaseRenderQueues(); mSceneMgr->clearSpecialCaseRenderQueues();

View file

@ -40,6 +40,8 @@ namespace MWRender
bool isPlaying(); bool isPlaying();
void setResolution (int w, int h) { mWidth = w; mHeight = h; }
private: private:
VideoState* mState; VideoState* mState;
@ -47,7 +49,12 @@ namespace MWRender
Ogre::SceneManager* mSceneMgr; Ogre::SceneManager* mSceneMgr;
Ogre::MaterialPtr mVideoMaterial; Ogre::MaterialPtr mVideoMaterial;
Ogre::Rectangle2D* mRectangle; Ogre::Rectangle2D* mRectangle;
Ogre::Rectangle2D* mBackgroundRectangle;
Ogre::SceneNode* mNode; Ogre::SceneNode* mNode;
Ogre::SceneNode* mBackgroundNode;
int mWidth;
int mHeight;
}; };
} }