Clean up the rectangle and scene node used for displaying the video

This commit is contained in:
Chris Robinson 2012-12-15 04:01:52 -08:00
parent eb0e8d9e37
commit d50698d7d1
2 changed files with 106 additions and 92 deletions

View file

@ -938,55 +938,69 @@ void VideoState::deinit()
} }
VideoPlayer::VideoPlayer(Ogre::SceneManager* sceneMgr) VideoPlayer::VideoPlayer(Ogre::SceneManager* sceneMgr)
: mState(NULL) : mState(NULL)
, mSceneMgr(sceneMgr) , mSceneMgr(sceneMgr)
{ , mVideoMaterial(NULL)
mVideoMaterial = Ogre::MaterialManager::getSingleton ().create("VideoMaterial", "General"); , mRectangle(NULL)
, mNode(NULL)
{
mVideoMaterial = Ogre::MaterialManager::getSingleton().create("VideoMaterial", "General");
mVideoMaterial->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); mVideoMaterial->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false);
mVideoMaterial->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); mVideoMaterial->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false);
mVideoMaterial->getTechnique(0)->getPass(0)->setLightingEnabled(false); mVideoMaterial->getTechnique(0)->getPass(0)->setLightingEnabled(false);
mVideoMaterial->getTechnique(0)->getPass(0)->createTextureUnitState(); mVideoMaterial->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+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);
// Attach background to the scene // Attach background to the scene
Ogre::SceneNode* node = sceneMgr->getRootSceneNode()->createChildSceneNode(); mNode = sceneMgr->getRootSceneNode()->createChildSceneNode();
node->attachObject(mRectangle); mNode->attachObject(mRectangle);
mRectangle->setVisible(false); mRectangle->setVisible(false);
mRectangle->setVisibilityFlags (0x1); mRectangle->setVisibilityFlags(0x1);
} }
VideoPlayer::~VideoPlayer () VideoPlayer::~VideoPlayer()
{ {
if (mState) if(mState)
close(); close();
}
void VideoPlayer::playVideo (const std::string &resourceName) if(mNode)
{ mSceneMgr->destroySceneNode(mNode);
mNode = NULL;
if(mRectangle)
delete mRectangle;
mRectangle = NULL;
}
void VideoPlayer::playVideo(const std::string &resourceName)
{
// Register all formats and codecs // Register all formats and codecs
av_register_all(); av_register_all();
if (mState) if(mState)
close(); close();
mRectangle->setVisible(true); mRectangle->setVisible(true);
MWBase::Environment::get().getWindowManager ()->pushGuiMode (MWGui::GM_Video); MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Video);
// Turn off rendering except the GUI // Turn off rendering except the GUI
mSceneMgr->clearSpecialCaseRenderQueues(); mSceneMgr->clearSpecialCaseRenderQueues();
// SCRQM_INCLUDE with RENDER_QUEUE_OVERLAY does not work. // SCRQM_INCLUDE with RENDER_QUEUE_OVERLAY does not work.
for (int i = 0; i < Ogre::RENDER_QUEUE_MAX; ++i) for(int i = 0;i < Ogre::RENDER_QUEUE_MAX;++i)
{ {
if (i > 0 && i < 96) if(i > 0 && i < 96)
mSceneMgr->addSpecialCaseRenderQueue(i); mSceneMgr->addSpecialCaseRenderQueue(i);
} }
mSceneMgr->setSpecialCaseRenderQueueMode(Ogre::SceneManager::SCRQM_EXCLUDE); mSceneMgr->setSpecialCaseRenderQueueMode(Ogre::SceneManager::SCRQM_EXCLUDE);
@ -995,10 +1009,10 @@ void VideoState::deinit()
mState = new VideoState; mState = new VideoState;
mState->init(resourceName); mState->init(resourceName);
} }
void VideoPlayer::update () void VideoPlayer::update ()
{ {
if(mState) if(mState)
{ {
if(mState->quit) if(mState->quit)
@ -1007,17 +1021,15 @@ void VideoState::deinit()
{ {
mState->refresh = false; mState->refresh = false;
mState->video_refresh_timer(); mState->video_refresh_timer();
// Would be nice not to do this all the time...
if(mState->display_ready)
mVideoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("VideoTexture");
} }
} }
}
if (mState && mState->display_ready && !Ogre::TextureManager::getSingleton ().getByName ("VideoTexture").isNull ()) void VideoPlayer::close()
mVideoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState (0)->setTextureName ("VideoTexture"); {
else
mVideoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState (0)->setTextureName ("black.png");
}
void VideoPlayer::close()
{
mState->quit = 1; mState->quit = 1;
mState->deinit(); mState->deinit();
@ -1026,15 +1038,16 @@ void VideoState::deinit()
MWBase::Environment::get().getSoundManager()->resumeAllSounds(); MWBase::Environment::get().getSoundManager()->resumeAllSounds();
mRectangle->setVisible (false); mRectangle->setVisible(false);
MWBase::Environment::get().getWindowManager ()->removeGuiMode (MWGui::GM_Video); MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Video);
mSceneMgr->clearSpecialCaseRenderQueues(); mSceneMgr->clearSpecialCaseRenderQueues();
mSceneMgr->setSpecialCaseRenderQueueMode(Ogre::SceneManager::SCRQM_EXCLUDE); mSceneMgr->setSpecialCaseRenderQueueMode(Ogre::SceneManager::SCRQM_EXCLUDE);
} }
bool VideoPlayer::isPlaying () bool VideoPlayer::isPlaying ()
{ {
return mState != NULL; return mState != NULL;
} }
} }

View file

@ -45,8 +45,9 @@ namespace MWRender
VideoState* mState; VideoState* mState;
Ogre::SceneManager* mSceneMgr; Ogre::SceneManager* mSceneMgr;
Ogre::Rectangle2D* mRectangle;
Ogre::MaterialPtr mVideoMaterial; Ogre::MaterialPtr mVideoMaterial;
Ogre::Rectangle2D* mRectangle;
Ogre::SceneNode* mNode;
}; };
} }