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:
parent
c2176945bd
commit
231e629e66
2 changed files with 29 additions and 23 deletions
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue