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

@ -941,24 +941,30 @@ void VideoState::deinit()
VideoPlayer::VideoPlayer(Ogre::SceneManager* sceneMgr) VideoPlayer::VideoPlayer(Ogre::SceneManager* sceneMgr)
: mState(NULL) : mState(NULL)
, mSceneMgr(sceneMgr) , mSceneMgr(sceneMgr)
, mVideoMaterial(NULL)
, mRectangle(NULL)
, mNode(NULL)
{ {
mVideoMaterial = Ogre::MaterialManager::getSingleton().create("VideoMaterial", "General"); 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);
} }
@ -967,6 +973,14 @@ void VideoState::deinit()
{ {
if(mState) if(mState)
close(); close();
if(mNode)
mSceneMgr->destroySceneNode(mNode);
mNode = NULL;
if(mRectangle)
delete mRectangle;
mRectangle = NULL;
} }
void VideoPlayer::playVideo(const std::string &resourceName) void VideoPlayer::playVideo(const std::string &resourceName)
@ -1007,13 +1021,11 @@ 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)
if (mState && mState->display_ready && !Ogre::TextureManager::getSingleton ().getByName ("VideoTexture").isNull ())
mVideoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("VideoTexture"); mVideoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("VideoTexture");
else }
mVideoMaterial->getTechnique(0)->getPass(0)->getTextureUnitState (0)->setTextureName ("black.png"); }
} }
void VideoPlayer::close() void VideoPlayer::close()
@ -1037,4 +1049,5 @@ void VideoState::deinit()
{ {
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;
}; };
} }