1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-03 18:45:34 +00:00

Store map widgets and textures in one vector instead of 4 different ones

This commit is contained in:
bzzt 2019-02-20 13:37:00 +00:00 committed by Andrei Kortunov
parent c2176945bd
commit 231e629e66
2 changed files with 29 additions and 23 deletions

View file

@ -213,8 +213,7 @@ namespace MWGui
map->setNeedMouseFocus(false); map->setNeedMouseFocus(false);
fog->setNeedMouseFocus(false); fog->setNeedMouseFocus(false);
mMapWidgets.push_back(map); mMaps.emplace_back(map, fog);
mFogWidgets.push_back(fog);
} }
} }
} }
@ -234,36 +233,37 @@ namespace MWGui
void LocalMapBase::applyFogOfWar() void LocalMapBase::applyFogOfWar()
{ {
TextureVector fogTextures;
for (int mx=0; mx<mNumCells; ++mx) for (int mx=0; mx<mNumCells; ++mx)
{ {
for (int my=0; my<mNumCells; ++my) for (int my=0; my<mNumCells; ++my)
{ {
int x = mCurX + (mx - mCellDistance); int x = mCurX + (mx - mCellDistance);
int y = mCurY + (-1*(my - mCellDistance)); int y = mCurY + (-1*(my - mCellDistance));
MyGUI::ImageBox* fog = mFogWidgets[my + mNumCells*mx];
MapEntry& entry = mMaps[my + mNumCells*mx];
MyGUI::ImageBox* fog = entry.mFogWidget;
if (!mFogOfWarToggled || !mFogOfWarEnabled) if (!mFogOfWarToggled || !mFogOfWarEnabled)
{ {
fog->setImageTexture(""); fog->setImageTexture("");
entry.mFogTexture.reset();
continue; continue;
} }
osg::ref_ptr<osg::Texture2D> tex = mLocalMapRender->getFogOfWarTexture(x, y); osg::ref_ptr<osg::Texture2D> tex = mLocalMapRender->getFogOfWarTexture(x, y);
if (tex) if (tex)
{ {
std::shared_ptr<MyGUI::ITexture> myguitex (new osgMyGUI::OSGTexture(tex)); entry.mFogTexture.reset(new osgMyGUI::OSGTexture(tex));
fog->setRenderItemTexture(myguitex.get()); fog->setRenderItemTexture(entry.mFogTexture.get());
fog->getSubWidgetMain()->_setUVSet(MyGUI::FloatRect(0.f, 1.f, 1.f, 0.f)); fog->getSubWidgetMain()->_setUVSet(MyGUI::FloatRect(0.f, 1.f, 1.f, 0.f));
fogTextures.push_back(myguitex);
} }
else else
{
fog->setImageTexture("black"); fog->setImageTexture("black");
entry.mFogTexture.reset();
}
} }
} }
// Move the textures we just set into mFogTextures, and move the previous textures into fogTextures, for deletion when this function ends.
// Note, above we need to ensure that all widgets are getting a new texture set, lest we delete textures that are still in use.
mFogTextures.swap(fogTextures);
redraw(); redraw();
} }
@ -369,7 +369,6 @@ namespace MWGui
applyFogOfWar(); applyFogOfWar();
// Update the map textures // Update the map textures
TextureVector textures;
for (int mx=0; mx<mNumCells; ++mx) for (int mx=0; mx<mNumCells; ++mx)
{ {
for (int my=0; my<mNumCells; ++my) for (int my=0; my<mNumCells; ++my)
@ -377,21 +376,23 @@ namespace MWGui
int mapX = x + (mx - mCellDistance); int mapX = x + (mx - mCellDistance);
int mapY = y + (-1*(my - mCellDistance)); int mapY = y + (-1*(my - mCellDistance));
MyGUI::ImageBox* box = mMapWidgets[my + mNumCells*mx]; MapEntry& entry = mMaps[my + mNumCells*mx];
MyGUI::ImageBox* box = entry.mMapWidget;
osg::ref_ptr<osg::Texture2D> texture = mLocalMapRender->getMapTexture(mapX, mapY); osg::ref_ptr<osg::Texture2D> texture = mLocalMapRender->getMapTexture(mapX, mapY);
if (texture) if (texture)
{ {
std::shared_ptr<MyGUI::ITexture> guiTex (new osgMyGUI::OSGTexture(texture)); entry.mMapTexture.reset(new osgMyGUI::OSGTexture(texture));
textures.push_back(guiTex); box->setRenderItemTexture(entry.mMapTexture.get());
box->setRenderItemTexture(guiTex.get());
box->getSubWidgetMain()->_setUVSet(MyGUI::FloatRect(0.f, 0.f, 1.f, 1.f)); box->getSubWidgetMain()->_setUVSet(MyGUI::FloatRect(0.f, 0.f, 1.f, 1.f));
} }
else else
{
box->setRenderItemTexture(nullptr); box->setRenderItemTexture(nullptr);
entry.mMapTexture.reset();
}
} }
} }
mMapTextures.swap(textures);
// Delay the door markers update until scripts have been given a chance to run. // Delay the door markers update until scripts have been given a chance to run.
// If we don't do this, door markers that should be disabled will still appear on the map. // If we don't do this, door markers that should be disabled will still appear on the map.
@ -1046,8 +1047,8 @@ namespace MWGui
NoDrop::setAlpha(alpha); NoDrop::setAlpha(alpha);
// can't allow showing map with partial transparency, as the fog of war will also go transparent // can't allow showing map with partial transparency, as the fog of war will also go transparent
// and reveal parts of the map you shouldn't be able to see // and reveal parts of the map you shouldn't be able to see
for (MyGUI::ImageBox* widget : mMapWidgets) for (MapEntry& entry : mMaps)
widget->setVisible(alpha == 1); entry.mMapWidget->setVisible(alpha == 1);
} }
void MapWindow::customMarkerCreated(MyGUI::Widget *marker) void MapWindow::customMarkerCreated(MyGUI::Widget *marker)

View file

@ -126,12 +126,17 @@ namespace MWGui
// Stores markers that were placed by a player. May be shared between multiple map views. // Stores markers that were placed by a player. May be shared between multiple map views.
CustomMarkerCollection& mCustomMarkers; CustomMarkerCollection& mCustomMarkers;
std::vector<MyGUI::ImageBox*> mMapWidgets; struct MapEntry
std::vector<MyGUI::ImageBox*> mFogWidgets; {
MapEntry(MyGUI::ImageBox* mapWidget, MyGUI::ImageBox* fogWidget)
: mMapWidget(mapWidget), mFogWidget(fogWidget) {}
typedef std::vector<std::shared_ptr<MyGUI::ITexture> > TextureVector; MyGUI::ImageBox* mMapWidget;
TextureVector mMapTextures; MyGUI::ImageBox* mFogWidget;
TextureVector mFogTextures; std::shared_ptr<MyGUI::ITexture> mMapTexture;
std::shared_ptr<MyGUI::ITexture> mFogTexture;
};
std::vector<MapEntry> mMaps;
// Keep track of created marker widgets, just to easily remove them later. // Keep track of created marker widgets, just to easily remove them later.
std::vector<MyGUI::Widget*> mDoorMarkerWidgets; std::vector<MyGUI::Widget*> mDoorMarkerWidgets;