Add ManualResourceLoader for character previews (Fixes #1752)

This commit is contained in:
scrawl 2014-08-04 16:32:53 +02:00
parent 0b1e997bdd
commit c6bf9dfbfb
5 changed files with 93 additions and 21 deletions

View file

@ -91,6 +91,13 @@ namespace MWGui
mTradeModel = new TradeItemModel(new InventoryItemModel(mPtr), MWWorld::Ptr()); mTradeModel = new TradeItemModel(new InventoryItemModel(mPtr), MWWorld::Ptr());
mSortModel = new SortFilterItemModel(mTradeModel); mSortModel = new SortFilterItemModel(mTradeModel);
mItemView->setModel(mSortModel); mItemView->setModel(mSortModel);
mPreview.reset(NULL);
mAvatarImage->setImageTexture("");
MyGUI::ITexture* tex = MyGUI::RenderManager::getInstance().getTexture("CharacterPreview");
if (tex)
MyGUI::RenderManager::getInstance().destroyTexture(tex);
mPreview.reset(new MWRender::InventoryPreview(mPtr)); mPreview.reset(new MWRender::InventoryPreview(mPtr));
mPreview->setup(); mPreview->setup();
} }

View file

@ -83,19 +83,10 @@ namespace MWRender
mCamera->setNearClipDistance (0.01); mCamera->setNearClipDistance (0.01);
mCamera->setFarClipDistance (1000); mCamera->setFarClipDistance (1000);
mTexture = Ogre::TextureManager::getSingleton().getByName (mName); mTexture = Ogre::TextureManager::getSingleton().createManual(mName,
if (mTexture.isNull ()) Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, mSizeX, mSizeY, 0, Ogre::PF_A8R8G8B8, Ogre::TU_RENDERTARGET, this);
mTexture = Ogre::TextureManager::getSingleton().createManual(mName,
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, mSizeX, mSizeY, 0, Ogre::PF_A8R8G8B8, Ogre::TU_RENDERTARGET);
mRenderTarget = mTexture->getBuffer()->getRenderTarget(); setupRenderTarget();
mRenderTarget->removeAllViewports ();
mViewport = mRenderTarget->addViewport(mCamera);
mViewport->setOverlaysEnabled(false);
mViewport->setBackgroundColour(Ogre::ColourValue(0, 0, 0, 0));
mViewport->setShadowsEnabled(false);
mRenderTarget->setActive(true);
mRenderTarget->setAutoUpdated (false);
onSetup (); onSetup ();
} }
@ -107,6 +98,7 @@ namespace MWRender
mSceneMgr->destroyAllCameras(); mSceneMgr->destroyAllCameras();
delete mAnimation; delete mAnimation;
Ogre::Root::getSingleton().destroySceneManager(mSceneMgr); Ogre::Root::getSingleton().destroySceneManager(mSceneMgr);
Ogre::TextureManager::getSingleton().remove(mName);
} }
} }
@ -127,12 +119,39 @@ namespace MWRender
onSetup(); onSetup();
} }
void CharacterPreview::loadResource(Ogre::Resource *resource)
{
Ogre::Texture* tex = dynamic_cast<Ogre::Texture*>(resource);
if (!tex)
return;
tex->createInternalResources();
setupRenderTarget();
mRenderTarget->update();
}
void CharacterPreview::setupRenderTarget()
{
mRenderTarget = mTexture->getBuffer()->getRenderTarget();
mRenderTarget->removeAllViewports ();
mViewport = mRenderTarget->addViewport(mCamera);
mViewport->setOverlaysEnabled(false);
mViewport->setBackgroundColour(Ogre::ColourValue(0, 0, 0, 0));
mViewport->setShadowsEnabled(false);
mRenderTarget->setActive(true);
mRenderTarget->setAutoUpdated (false);
}
// -------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------
InventoryPreview::InventoryPreview(MWWorld::Ptr character) InventoryPreview::InventoryPreview(MWWorld::Ptr character)
: CharacterPreview(character, 512, 1024, "CharacterPreview", Ogre::Vector3(0, 65, -180), Ogre::Vector3(0,65,0)) : CharacterPreview(character, 512, 1024, "CharacterPreview", Ogre::Vector3(0, 65, -180), Ogre::Vector3(0,65,0))
, mSelectionBuffer(NULL) , mSelectionBuffer(NULL)
, mSizeX(0)
, mSizeY(0)
{ {
} }
@ -143,6 +162,9 @@ namespace MWRender
void InventoryPreview::update(int sizeX, int sizeY) void InventoryPreview::update(int sizeX, int sizeY)
{ {
mSizeX = sizeX;
mSizeY = sizeY;
mAnimation->updateParts(); mAnimation->updateParts();
MWWorld::InventoryStore &inv = mCharacter.getClass().getInventoryStore(mCharacter); MWWorld::InventoryStore &inv = mCharacter.getClass().getInventoryStore(mCharacter);
@ -197,15 +219,21 @@ namespace MWRender
mAnimation->runAnimation(0.0f); mAnimation->runAnimation(0.0f);
mViewport->setDimensions (0, 0, std::min(1.f, float(sizeX) / float(512)), std::min(1.f, float(sizeY) / float(1024)));
mNode->setOrientation (Ogre::Quaternion::IDENTITY); mNode->setOrientation (Ogre::Quaternion::IDENTITY);
mViewport->setDimensions (0, 0, std::min(1.f, float(mSizeX) / float(512)), std::min(1.f, float(mSizeY) / float(1024)));
mTexture->load();
mRenderTarget->update(); mRenderTarget->update();
mSelectionBuffer->update(); mSelectionBuffer->update();
} }
void InventoryPreview::setupRenderTarget()
{
CharacterPreview::setupRenderTarget();
mViewport->setDimensions (0, 0, std::min(1.f, float(mSizeX) / float(512)), std::min(1.f, float(mSizeY) / float(1024)));
}
int InventoryPreview::getSlotSelected (int posX, int posY) int InventoryPreview::getSlotSelected (int posX, int posY)
{ {
return mSelectionBuffer->getSelected (posX, posY); return mSelectionBuffer->getSelected (posX, posY);
@ -243,6 +271,7 @@ namespace MWRender
void RaceSelectionPreview::render() void RaceSelectionPreview::render()
{ {
mTexture->load();
mRenderTarget->update(); mRenderTarget->update();
} }

View file

@ -22,7 +22,7 @@ namespace MWRender
class NpcAnimation; class NpcAnimation;
class CharacterPreview class CharacterPreview : public Ogre::ManualResourceLoader
{ {
public: public:
CharacterPreview(MWWorld::Ptr character, int sizeX, int sizeY, const std::string& name, CharacterPreview(MWWorld::Ptr character, int sizeX, int sizeY, const std::string& name,
@ -34,6 +34,8 @@ namespace MWRender
virtual void rebuild(); virtual void rebuild();
void loadResource(Ogre::Resource *resource);
private: private:
CharacterPreview(const CharacterPreview&); CharacterPreview(const CharacterPreview&);
CharacterPreview& operator=(const CharacterPreview&); CharacterPreview& operator=(const CharacterPreview&);
@ -41,6 +43,8 @@ namespace MWRender
protected: protected:
virtual bool renderHeadOnly() { return false; } virtual bool renderHeadOnly() { return false; }
virtual void setupRenderTarget();
Ogre::TexturePtr mTexture; Ogre::TexturePtr mTexture;
Ogre::RenderTarget* mRenderTarget; Ogre::RenderTarget* mRenderTarget;
Ogre::Viewport* mViewport; Ogre::Viewport* mViewport;
@ -76,7 +80,12 @@ namespace MWRender
int getSlotSelected(int posX, int posY); int getSlotSelected(int posX, int posY);
protected:
virtual void setupRenderTarget();
private: private:
int mSizeX;
int mSizeY;
OEngine::Render::SelectionBuffer* mSelectionBuffer; OEngine::Render::SelectionBuffer* mSelectionBuffer;
}; };

View file

@ -18,22 +18,42 @@ namespace Render
{ {
SelectionBuffer::SelectionBuffer(Ogre::Camera *camera, int sizeX, int sizeY, int visibilityFlags) SelectionBuffer::SelectionBuffer(Ogre::Camera *camera, int sizeX, int sizeY, int visibilityFlags)
: mCamera(camera)
, mVisibilityFlags(visibilityFlags)
{ {
mTexture = Ogre::TextureManager::getSingleton().createManual("SelectionBuffer", mTexture = Ogre::TextureManager::getSingleton().createManual("SelectionBuffer",
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, sizeX, sizeY, 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET); Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, sizeX, sizeY, 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET, this);
setupRenderTarget();
mCurrentColour = Ogre::ColourValue(0.3, 0.3, 0.3);
}
void SelectionBuffer::setupRenderTarget()
{
mRenderTarget = mTexture->getBuffer()->getRenderTarget(); mRenderTarget = mTexture->getBuffer()->getRenderTarget();
Ogre::Viewport* vp = mRenderTarget->addViewport(camera); Ogre::Viewport* vp = mRenderTarget->addViewport(mCamera);
vp->setOverlaysEnabled(false); vp->setOverlaysEnabled(false);
vp->setBackgroundColour(Ogre::ColourValue(0, 0, 0, 0)); vp->setBackgroundColour(Ogre::ColourValue(0, 0, 0, 0));
vp->setShadowsEnabled(false); vp->setShadowsEnabled(false);
vp->setMaterialScheme("selectionbuffer"); vp->setMaterialScheme("selectionbuffer");
if (visibilityFlags != 0) if (mVisibilityFlags != 0)
vp->setVisibilityMask (visibilityFlags); vp->setVisibilityMask (mVisibilityFlags);
mRenderTarget->setActive(true); mRenderTarget->setActive(true);
mRenderTarget->setAutoUpdated (false); mRenderTarget->setAutoUpdated (false);
}
mCurrentColour = Ogre::ColourValue(0.3, 0.3, 0.3); void SelectionBuffer::loadResource(Ogre::Resource *resource)
{
Ogre::Texture* tex = dynamic_cast<Ogre::Texture*>(resource);
if (!tex)
return;
tex->createInternalResources();
setupRenderTarget();
mRenderTarget->update();
} }
SelectionBuffer::~SelectionBuffer() SelectionBuffer::~SelectionBuffer()

View file

@ -20,7 +20,7 @@ namespace Render
} }
}; };
class SelectionBuffer : public Ogre::MaterialManager::Listener class SelectionBuffer : public Ogre::MaterialManager::Listener, public Ogre::ManualResourceLoader
{ {
public: public:
SelectionBuffer(Ogre::Camera* camera, int sizeX, int sizeY, int visibilityFlags); SelectionBuffer(Ogre::Camera* camera, int sizeX, int sizeY, int visibilityFlags);
@ -31,6 +31,8 @@ namespace Render
void update(); void update();
virtual void loadResource(Ogre::Resource* resource);
virtual Ogre::Technique* handleSchemeNotFound ( virtual Ogre::Technique* handleSchemeNotFound (
unsigned short schemeIndex, const Ogre::String &schemeName, Ogre::Material *originalMaterial, unsigned short schemeIndex, const Ogre::String &schemeName, Ogre::Material *originalMaterial,
unsigned short lodIndex, const Ogre::Renderable *rend); unsigned short lodIndex, const Ogre::Renderable *rend);
@ -46,7 +48,12 @@ namespace Render
Ogre::ColourValue mCurrentColour; Ogre::ColourValue mCurrentColour;
Ogre::Camera* mCamera;
int mVisibilityFlags;
void getNextColour(); void getNextColour();
void setupRenderTarget();
}; };
} }