mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-26 09:35:28 +00:00
[Refactoring] Several refactorings:
[Refactoring] Add marker size method instead of using magic constant [Refactoring] Simplify worldPosToImageSpace and cellTopLeftCornerToImageSpace usage [Refactoring] Add a missing 'f' to specify the float type [Refactoring] Make cellTopLeftCornerToImageSpace more homogenous with worldPosToImageSpace [Refactoring] Extract createmakrercoords method [Refactoring] Use worldPosToImageSpace instead of cellTopLeftCornerToImageSpace Remove cellTopLeftCornerToImageSpace as it is not used anymore Remove getCellSize as it is not used anymore [Refactoring] Extract new method createMarker [Refactoring] Extract new method getMarkerCoordinates [Refactoring] Extract new method getPosition [Refactoring] Extract new method centerView [Refactoring] Extract new method createDoorMarker [Refactoring] Simplify for loop [Refactoring] Make the test before the loop
This commit is contained in:
parent
3a7fc04535
commit
99cd4b6742
@ -167,7 +167,7 @@ namespace MWGui
|
|||||||
, mFogOfWarToggled(true)
|
, mFogOfWarToggled(true)
|
||||||
, mFogOfWarEnabled(fogOfWarEnabled)
|
, mFogOfWarEnabled(fogOfWarEnabled)
|
||||||
, mMapWidgetSize(0)
|
, mMapWidgetSize(0)
|
||||||
, mNumCells(0)
|
, mNumCells(1)
|
||||||
, mCellDistance(0)
|
, mCellDistance(0)
|
||||||
, mCustomMarkers(markers)
|
, mCustomMarkers(markers)
|
||||||
, mMarkerUpdateTimer(0.0f)
|
, mMarkerUpdateTimer(0.0f)
|
||||||
@ -234,65 +234,82 @@ namespace MWGui
|
|||||||
|
|
||||||
void LocalMapBase::applyFogOfWar()
|
void LocalMapBase::applyFogOfWar()
|
||||||
{
|
{
|
||||||
for (int mx=0; mx<mNumCells; ++mx)
|
if (!mFogOfWarToggled || !mFogOfWarEnabled)
|
||||||
{
|
{
|
||||||
for (int my=0; my<mNumCells; ++my)
|
for (auto& entry : mMaps)
|
||||||
{
|
{
|
||||||
MapEntry& entry = mMaps[my + mNumCells*mx];
|
entry.mFogWidget->setImageTexture("");
|
||||||
MyGUI::ImageBox* fog = entry.mFogWidget;
|
entry.mFogTexture.reset();
|
||||||
|
|
||||||
if (!mFogOfWarToggled || !mFogOfWarEnabled)
|
|
||||||
{
|
|
||||||
fog->setImageTexture("");
|
|
||||||
entry.mFogTexture.reset();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
MyGUI::IntPoint LocalMapBase::getMarkerPosition(float worldX, float worldY, MarkerUserData& markerPos)
|
MyGUI::IntPoint LocalMapBase::getPosition(int cellX, int cellY, float nX, float nY) const
|
||||||
{
|
{
|
||||||
MyGUI::IntPoint widgetPos;
|
// normalized cell coordinates
|
||||||
|
auto mapWidgetSize = getWidgetSize();
|
||||||
|
return MyGUI::IntPoint(
|
||||||
|
static_cast<int>(nX * mapWidgetSize + (mCellDistance + (cellX - mCurX)) * mapWidgetSize),
|
||||||
|
static_cast<int>(nY * mapWidgetSize + (mCellDistance - (cellY - mCurY)) * mapWidgetSize)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
MyGUI::IntPoint LocalMapBase::getMarkerPosition(float worldX, float worldY, MarkerUserData& markerPos) const
|
||||||
|
{
|
||||||
|
int cellX, cellY;
|
||||||
// normalized cell coordinates
|
// normalized cell coordinates
|
||||||
float nX,nY;
|
float nX,nY;
|
||||||
|
|
||||||
if (!mInterior)
|
if (!mInterior)
|
||||||
{
|
{
|
||||||
int cellX, cellY;
|
|
||||||
MWBase::Environment::get().getWorld()->positionToIndex(worldX, worldY, cellX, cellY);
|
MWBase::Environment::get().getWorld()->positionToIndex(worldX, worldY, cellX, cellY);
|
||||||
nX = (worldX - cellSize * cellX) / cellSize;
|
nX = (worldX - cellSize * cellX) / cellSize;
|
||||||
// Image space is -Y up, cells are Y up
|
// Image space is -Y up, cells are Y up
|
||||||
nY = 1 - (worldY - cellSize * cellY) / cellSize;
|
nY = 1 - (worldY - cellSize * cellY) / cellSize;
|
||||||
|
|
||||||
float cellDx = static_cast<float>(cellX - mCurX);
|
|
||||||
float cellDy = static_cast<float>(cellY - mCurY);
|
|
||||||
|
|
||||||
markerPos.cellX = cellX;
|
|
||||||
markerPos.cellY = cellY;
|
|
||||||
|
|
||||||
widgetPos = MyGUI::IntPoint(static_cast<int>(nX * mMapWidgetSize + (mCellDistance + cellDx) * mMapWidgetSize),
|
|
||||||
static_cast<int>(nY * mMapWidgetSize + (mCellDistance - cellDy) * mMapWidgetSize));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
mLocalMapRender->worldToInteriorMapPosition({ worldX, worldY }, nX, nY, cellX, cellY);
|
||||||
int cellX, cellY;
|
|
||||||
osg::Vec2f worldPos (worldX, worldY);
|
|
||||||
mLocalMapRender->worldToInteriorMapPosition(worldPos, nX, nY, cellX, cellY);
|
|
||||||
|
|
||||||
markerPos.cellX = cellX;
|
|
||||||
markerPos.cellY = cellY;
|
|
||||||
|
|
||||||
// Image space is -Y up, cells are Y up
|
|
||||||
widgetPos = MyGUI::IntPoint(static_cast<int>(nX * mMapWidgetSize + (mCellDistance + (cellX - mCurX)) * mMapWidgetSize),
|
|
||||||
static_cast<int>(nY * mMapWidgetSize + (mCellDistance - (cellY - mCurY)) * mMapWidgetSize));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
markerPos.cellX = cellX;
|
||||||
|
markerPos.cellY = cellY;
|
||||||
markerPos.nX = nX;
|
markerPos.nX = nX;
|
||||||
markerPos.nY = nY;
|
markerPos.nY = nY;
|
||||||
return widgetPos;
|
return getPosition(markerPos.cellX, markerPos.cellY, markerPos.nX, markerPos.nY);
|
||||||
|
}
|
||||||
|
|
||||||
|
MyGUI::IntCoord LocalMapBase::getMarkerCoordinates(float worldX, float worldY, MarkerUserData& markerPos, size_t markerSize) const
|
||||||
|
{
|
||||||
|
int halfMarkerSize = markerSize / 2;
|
||||||
|
auto position = getMarkerPosition(worldX, worldY, markerPos);
|
||||||
|
return MyGUI::IntCoord(position.left - halfMarkerSize, position.top - halfMarkerSize, markerSize, markerSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
MyGUI::Widget* LocalMapBase::createDoorMarker(const std::string& name, const MyGUI::VectorString& notes, float x, float y) const
|
||||||
|
{
|
||||||
|
MarkerUserData data(mLocalMapRender);
|
||||||
|
data.notes = notes;
|
||||||
|
data.caption = name;
|
||||||
|
MarkerWidget* markerWidget = mLocalMap->createWidget<MarkerWidget>("MarkerButton",
|
||||||
|
getMarkerCoordinates(x, y, data, 8), MyGUI::Align::Default);
|
||||||
|
markerWidget->setNormalColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal}")));
|
||||||
|
markerWidget->setHoverColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal_over}")));
|
||||||
|
markerWidget->setDepth(Local_MarkerLayer);
|
||||||
|
markerWidget->setNeedMouseFocus(true);
|
||||||
|
// Used by tooltips to not show the tooltip if marker is hidden by fog of war
|
||||||
|
markerWidget->setUserString("ToolTipType", "MapMarker");
|
||||||
|
|
||||||
|
markerWidget->setUserData(data);
|
||||||
|
return markerWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocalMapBase::centerView()
|
||||||
|
{
|
||||||
|
MyGUI::IntPoint pos = mCompass->getPosition() + MyGUI::IntPoint{ 16, 16 };
|
||||||
|
MyGUI::IntSize viewsize = mLocalMap->getSize();
|
||||||
|
MyGUI::IntPoint viewOffset((viewsize.width / 2) - pos.left, (viewsize.height / 2) - pos.top);
|
||||||
|
mLocalMap->setViewOffset(viewOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalMapBase::updateCustomMarkers()
|
void LocalMapBase::updateCustomMarkers()
|
||||||
@ -317,13 +334,8 @@ namespace MWGui
|
|||||||
const ESM::CustomMarker& marker = it->second;
|
const ESM::CustomMarker& marker = it->second;
|
||||||
|
|
||||||
MarkerUserData markerPos (mLocalMapRender);
|
MarkerUserData markerPos (mLocalMapRender);
|
||||||
MyGUI::IntPoint widgetPos = getMarkerPosition(marker.mWorldX, marker.mWorldY, markerPos);
|
|
||||||
|
|
||||||
MyGUI::IntCoord widgetCoord(widgetPos.left - 8,
|
|
||||||
widgetPos.top - 8,
|
|
||||||
16, 16);
|
|
||||||
MarkerWidget* markerWidget = mLocalMap->createWidget<MarkerWidget>("CustomMarkerButton",
|
MarkerWidget* markerWidget = mLocalMap->createWidget<MarkerWidget>("CustomMarkerButton",
|
||||||
widgetCoord, MyGUI::Align::Default);
|
getMarkerCoordinates(marker.mWorldX, marker.mWorldY, markerPos, 16), MyGUI::Align::Default);
|
||||||
markerWidget->setDepth(Local_MarkerAboveFogLayer);
|
markerWidget->setDepth(Local_MarkerAboveFogLayer);
|
||||||
markerWidget->setUserString("ToolTipType", "Layout");
|
markerWidget->setUserString("ToolTipType", "Layout");
|
||||||
markerWidget->setUserString("ToolTipLayout", "TextToolTipOneLine");
|
markerWidget->setUserString("ToolTipLayout", "TextToolTipOneLine");
|
||||||
@ -385,21 +397,21 @@ namespace MWGui
|
|||||||
mLocalMap->getParent()->_updateChilds();
|
mLocalMap->getParent()->_updateChilds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float LocalMapBase::getWidgetSize() const
|
||||||
|
{
|
||||||
|
return mMapWidgetSize;
|
||||||
|
}
|
||||||
|
|
||||||
void LocalMapBase::setPlayerPos(int cellX, int cellY, const float nx, const float ny)
|
void LocalMapBase::setPlayerPos(int cellX, int cellY, const float nx, const float ny)
|
||||||
{
|
{
|
||||||
MyGUI::IntPoint pos(static_cast<int>(mMapWidgetSize * mCellDistance + nx*mMapWidgetSize - 16), static_cast<int>(mMapWidgetSize * mCellDistance + ny*mMapWidgetSize - 16));
|
MyGUI::IntPoint pos = getPosition(cellX, cellY, nx, ny) - MyGUI::IntPoint{ 16, 16 };
|
||||||
pos.left += (cellX - mCurX) * mMapWidgetSize;
|
|
||||||
pos.top -= (cellY - mCurY) * mMapWidgetSize;
|
|
||||||
|
|
||||||
if (pos != mCompass->getPosition())
|
if (pos != mCompass->getPosition())
|
||||||
{
|
{
|
||||||
notifyPlayerUpdate ();
|
notifyPlayerUpdate ();
|
||||||
|
|
||||||
mCompass->setPosition(pos);
|
mCompass->setPosition(pos);
|
||||||
MyGUI::IntPoint middle (pos.left+16, pos.top+16);
|
centerView();
|
||||||
MyGUI::IntCoord viewsize = mLocalMap->getCoord();
|
|
||||||
MyGUI::IntPoint viewOffset((viewsize.width / 2) - middle.left, (viewsize.height / 2) - middle.top);
|
|
||||||
mLocalMap->setViewOffset(viewOffset);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -449,13 +461,9 @@ namespace MWGui
|
|||||||
{
|
{
|
||||||
const ESM::Position& worldPos = ptr.getRefData().getPosition();
|
const ESM::Position& worldPos = ptr.getRefData().getPosition();
|
||||||
MarkerUserData markerPos (mLocalMapRender);
|
MarkerUserData markerPos (mLocalMapRender);
|
||||||
MyGUI::IntPoint widgetPos = getMarkerPosition(worldPos.pos[0], worldPos.pos[1], markerPos);
|
|
||||||
MyGUI::IntCoord widgetCoord(widgetPos.left - 4,
|
|
||||||
widgetPos.top - 4,
|
|
||||||
8, 8);
|
|
||||||
++counter;
|
++counter;
|
||||||
MyGUI::ImageBox* markerWidget = mLocalMap->createWidget<MyGUI::ImageBox>("ImageBox",
|
MyGUI::ImageBox* markerWidget = mLocalMap->createWidget<MyGUI::ImageBox>("ImageBox",
|
||||||
widgetCoord, MyGUI::Align::Default);
|
getMarkerCoordinates(worldPos.pos[0], worldPos.pos[1], markerPos, 8), MyGUI::Align::Default);
|
||||||
markerWidget->setDepth(Local_MarkerAboveFogLayer);
|
markerWidget->setDepth(Local_MarkerAboveFogLayer);
|
||||||
markerWidget->setImageTexture(markerTexture);
|
markerWidget->setImageTexture(markerTexture);
|
||||||
markerWidget->setImageCoord(MyGUI::IntCoord(0,0,8,8));
|
markerWidget->setImageCoord(MyGUI::IntCoord(0,0,8,8));
|
||||||
@ -561,18 +569,17 @@ namespace MWGui
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (int dX=-mCellDistance; dX<=mCellDistance; ++dX)
|
for (int x = mCurX - mCellDistance; x <= mCurX + mCellDistance; ++x)
|
||||||
{
|
{
|
||||||
for (int dY=-mCellDistance; dY<=mCellDistance; ++dY)
|
for (int y = mCurY - mCellDistance; y <= mCurY + mCellDistance; ++y)
|
||||||
{
|
{
|
||||||
MWWorld::CellStore* cell = world->getExterior (mCurX+dX, mCurY+dY);
|
MWWorld::CellStore* cell = world->getExterior (x, y);
|
||||||
world->getDoorMarkers(cell, doors);
|
world->getDoorMarkers(cell, doors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a widget for each marker
|
// Create a widget for each marker
|
||||||
int counter = 0;
|
|
||||||
for (MWBase::World::DoorMarker& marker : doors)
|
for (MWBase::World::DoorMarker& marker : doors)
|
||||||
{
|
{
|
||||||
std::vector<std::string> destNotes;
|
std::vector<std::string> destNotes;
|
||||||
@ -580,24 +587,7 @@ namespace MWGui
|
|||||||
for (CustomMarkerCollection::ContainerType::const_iterator iter = markers.first; iter != markers.second; ++iter)
|
for (CustomMarkerCollection::ContainerType::const_iterator iter = markers.first; iter != markers.second; ++iter)
|
||||||
destNotes.push_back(iter->second.mNote);
|
destNotes.push_back(iter->second.mNote);
|
||||||
|
|
||||||
MarkerUserData data (mLocalMapRender);
|
MyGUI::Widget* markerWidget = createDoorMarker(marker.name, destNotes, marker.x, marker.y);
|
||||||
data.notes = destNotes;
|
|
||||||
data.caption = marker.name;
|
|
||||||
MyGUI::IntPoint widgetPos = getMarkerPosition(marker.x, marker.y, data);
|
|
||||||
MyGUI::IntCoord widgetCoord(widgetPos.left - 4,
|
|
||||||
widgetPos.top - 4,
|
|
||||||
8, 8);
|
|
||||||
++counter;
|
|
||||||
MarkerWidget* markerWidget = mLocalMap->createWidget<MarkerWidget>("MarkerButton",
|
|
||||||
widgetCoord, MyGUI::Align::Default);
|
|
||||||
markerWidget->setNormalColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal}")));
|
|
||||||
markerWidget->setHoverColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal_over}")));
|
|
||||||
markerWidget->setDepth(Local_MarkerLayer);
|
|
||||||
markerWidget->setNeedMouseFocus(true);
|
|
||||||
// Used by tooltips to not show the tooltip if marker is hidden by fog of war
|
|
||||||
markerWidget->setUserString("ToolTipType", "MapMarker");
|
|
||||||
|
|
||||||
markerWidget->setUserData(data);
|
|
||||||
doorMarkerCreated(markerWidget);
|
doorMarkerCreated(markerWidget);
|
||||||
|
|
||||||
mDoorMarkerWidgets.push_back(markerWidget);
|
mDoorMarkerWidgets.push_back(markerWidget);
|
||||||
@ -623,12 +613,8 @@ namespace MWGui
|
|||||||
&& (!mInterior || Misc::StringUtils::ciEqual(markedCell->getCell()->mName, mPrefix)))
|
&& (!mInterior || Misc::StringUtils::ciEqual(markedCell->getCell()->mName, mPrefix)))
|
||||||
{
|
{
|
||||||
MarkerUserData markerPos (mLocalMapRender);
|
MarkerUserData markerPos (mLocalMapRender);
|
||||||
MyGUI::IntPoint widgetPos = getMarkerPosition(markedPosition.pos[0], markedPosition.pos[1], markerPos);
|
|
||||||
MyGUI::IntCoord widgetCoord(widgetPos.left - 4,
|
|
||||||
widgetPos.top - 4,
|
|
||||||
8, 8);
|
|
||||||
MyGUI::ImageBox* markerWidget = mLocalMap->createWidget<MyGUI::ImageBox>("ImageBox",
|
MyGUI::ImageBox* markerWidget = mLocalMap->createWidget<MyGUI::ImageBox>("ImageBox",
|
||||||
widgetCoord, MyGUI::Align::Default);
|
getMarkerCoordinates(markedPosition.pos[0], markedPosition.pos[1], markerPos, 8), MyGUI::Align::Default);
|
||||||
markerWidget->setDepth(Local_MarkerAboveFogLayer);
|
markerWidget->setDepth(Local_MarkerAboveFogLayer);
|
||||||
markerWidget->setImageTexture("textures\\menu_map_smark.dds");
|
markerWidget->setImageTexture("textures\\menu_map_smark.dds");
|
||||||
markerWidget->setNeedMouseFocus(false);
|
markerWidget->setNeedMouseFocus(false);
|
||||||
@ -745,10 +731,11 @@ namespace MWGui
|
|||||||
MyGUI::IntPoint clickedPos = MyGUI::InputManager::getInstance().getMousePosition();
|
MyGUI::IntPoint clickedPos = MyGUI::InputManager::getInstance().getMousePosition();
|
||||||
|
|
||||||
MyGUI::IntPoint widgetPos = clickedPos - mEventBoxLocal->getAbsolutePosition();
|
MyGUI::IntPoint widgetPos = clickedPos - mEventBoxLocal->getAbsolutePosition();
|
||||||
int x = int(widgetPos.left/float(mMapWidgetSize))-mCellDistance;
|
auto mapWidgetSize = getWidgetSize();
|
||||||
int y = (int(widgetPos.top/float(mMapWidgetSize))-mCellDistance)*-1;
|
int x = int(widgetPos.left/float(mapWidgetSize))-mCellDistance;
|
||||||
float nX = widgetPos.left/float(mMapWidgetSize) - int(widgetPos.left/float(mMapWidgetSize));
|
int y = (int(widgetPos.top/float(mapWidgetSize))-mCellDistance)*-1;
|
||||||
float nY = widgetPos.top/float(mMapWidgetSize) - int(widgetPos.top/float(mMapWidgetSize));
|
float nX = widgetPos.left/float(mapWidgetSize) - int(widgetPos.left/float(mapWidgetSize));
|
||||||
|
float nY = widgetPos.top/float(mapWidgetSize) - int(widgetPos.top/float(mapWidgetSize));
|
||||||
x += mCurX;
|
x += mCurX;
|
||||||
y += mCurY;
|
y += mCurY;
|
||||||
|
|
||||||
@ -818,6 +805,39 @@ namespace MWGui
|
|||||||
setTitle("#{sCell=" + cellName + "}");
|
setTitle("#{sCell=" + cellName + "}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MyGUI::IntCoord MapWindow::createMarkerCoords(float x, float y) const
|
||||||
|
{
|
||||||
|
float worldX, worldY;
|
||||||
|
mGlobalMapRender->worldPosToImageSpace((x + 0.5f) * Constants::CellSizeInUnits, (y + 0.5f)* Constants::CellSizeInUnits, worldX, worldY);
|
||||||
|
|
||||||
|
const float markerSize = getMarkerSize();
|
||||||
|
const float halfMarkerSize = markerSize / 2.0f;
|
||||||
|
return MyGUI::IntCoord(
|
||||||
|
static_cast<int>(worldX - halfMarkerSize),
|
||||||
|
static_cast<int>(worldY - halfMarkerSize),
|
||||||
|
markerSize, markerSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
MyGUI::Widget* MapWindow::createMarker(const std::string& name, float x, float y)
|
||||||
|
{
|
||||||
|
MyGUI::Widget* markerWidget = mGlobalMap->createWidget<MyGUI::Widget>("MarkerButton",
|
||||||
|
createMarkerCoords(x, y), MyGUI::Align::Default);
|
||||||
|
|
||||||
|
markerWidget->setUserString("Caption_TextOneLine", "#{sCell=" + name + "}");
|
||||||
|
|
||||||
|
setGlobalMapMarkerTooltip(markerWidget, x, y);
|
||||||
|
|
||||||
|
markerWidget->setUserString("ToolTipLayout", "TextToolTipOneLine");
|
||||||
|
|
||||||
|
markerWidget->setNeedMouseFocus(true);
|
||||||
|
markerWidget->setColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal}")));
|
||||||
|
markerWidget->setDepth(Global_MarkerLayer);
|
||||||
|
markerWidget->eventMouseDrag += MyGUI::newDelegate(this, &MapWindow::onMouseDrag);
|
||||||
|
markerWidget->eventMouseButtonPressed += MyGUI::newDelegate(this, &MapWindow::onDragStart);
|
||||||
|
|
||||||
|
return markerWidget;
|
||||||
|
}
|
||||||
|
|
||||||
void MapWindow::addVisitedLocation(const std::string& name, int x, int y)
|
void MapWindow::addVisitedLocation(const std::string& name, int x, int y)
|
||||||
{
|
{
|
||||||
CellId cell;
|
CellId cell;
|
||||||
@ -825,31 +845,7 @@ namespace MWGui
|
|||||||
cell.second = y;
|
cell.second = y;
|
||||||
if (mMarkers.insert(cell).second)
|
if (mMarkers.insert(cell).second)
|
||||||
{
|
{
|
||||||
float worldX, worldY;
|
mGlobalMapMarkers[std::make_pair(x, y)] = createMarker(name, x, y);
|
||||||
mGlobalMapRender->cellTopLeftCornerToImageSpace (x, y, worldX, worldY);
|
|
||||||
|
|
||||||
int markerSize = 12;
|
|
||||||
int offset = mGlobalMapRender->getCellSize()/2 - markerSize/2;
|
|
||||||
MyGUI::IntCoord widgetCoord(
|
|
||||||
static_cast<int>(worldX * mGlobalMapRender->getWidth()+offset),
|
|
||||||
static_cast<int>(worldY * mGlobalMapRender->getHeight() + offset),
|
|
||||||
markerSize, markerSize);
|
|
||||||
|
|
||||||
MyGUI::Widget* markerWidget = mGlobalMap->createWidget<MyGUI::Widget>("MarkerButton",
|
|
||||||
widgetCoord, MyGUI::Align::Default);
|
|
||||||
|
|
||||||
markerWidget->setUserString("Caption_TextOneLine", "#{sCell=" + name + "}");
|
|
||||||
|
|
||||||
setGlobalMapMarkerTooltip(markerWidget, x, y);
|
|
||||||
|
|
||||||
markerWidget->setUserString("ToolTipLayout", "TextToolTipOneLine");
|
|
||||||
|
|
||||||
markerWidget->setNeedMouseFocus(true);
|
|
||||||
markerWidget->setColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal}")));
|
|
||||||
markerWidget->setDepth(Global_MarkerLayer);
|
|
||||||
markerWidget->eventMouseDrag += MyGUI::newDelegate(this, &MapWindow::onMouseDrag);
|
|
||||||
markerWidget->eventMouseButtonPressed += MyGUI::newDelegate(this, &MapWindow::onDragStart);
|
|
||||||
mGlobalMapMarkers[std::make_pair(x,y)] = markerWidget;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -891,6 +887,11 @@ namespace MWGui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float MapWindow::getMarkerSize() const
|
||||||
|
{
|
||||||
|
return 12.0f;
|
||||||
|
}
|
||||||
|
|
||||||
void MapWindow::updateCustomMarkers()
|
void MapWindow::updateCustomMarkers()
|
||||||
{
|
{
|
||||||
LocalMapBase::updateCustomMarkers();
|
LocalMapBase::updateCustomMarkers();
|
||||||
@ -978,19 +979,22 @@ namespace MWGui
|
|||||||
setGlobalMapPlayerDir(mLastDirectionX, mLastDirectionY);
|
setGlobalMapPlayerDir(mLastDirectionX, mLastDirectionY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MapWindow::centerView()
|
||||||
|
{
|
||||||
|
// set the view offset so that player is in the center
|
||||||
|
MyGUI::IntSize viewsize = mGlobalMap->getSize();
|
||||||
|
MyGUI::IntPoint pos = mPlayerArrowGlobal->getPosition() + MyGUI::IntPoint{ 16,16 };
|
||||||
|
MyGUI::IntPoint viewoffs(static_cast<int>(viewsize.width * 0.5f - pos.left), static_cast<int>(viewsize.height * 0.5f - pos.top));
|
||||||
|
mGlobalMap->setViewOffset(viewoffs);
|
||||||
|
}
|
||||||
|
|
||||||
void MapWindow::setGlobalMapPlayerPosition(float worldX, float worldY)
|
void MapWindow::setGlobalMapPlayerPosition(float worldX, float worldY)
|
||||||
{
|
{
|
||||||
float x, y;
|
float x, y;
|
||||||
mGlobalMapRender->worldPosToImageSpace (worldX, worldY, x, y);
|
mGlobalMapRender->worldPosToImageSpace (worldX, worldY, x, y);
|
||||||
x *= mGlobalMapRender->getWidth();
|
|
||||||
y *= mGlobalMapRender->getHeight();
|
|
||||||
|
|
||||||
mPlayerArrowGlobal->setPosition(MyGUI::IntPoint(static_cast<int>(x - 16), static_cast<int>(y - 16)));
|
mPlayerArrowGlobal->setPosition(MyGUI::IntPoint(static_cast<int>(x - 16), static_cast<int>(y - 16)));
|
||||||
|
|
||||||
// set the view offset so that player is in the center
|
centerView();
|
||||||
MyGUI::IntSize viewsize = mGlobalMap->getSize();
|
|
||||||
MyGUI::IntPoint viewoffs(static_cast<int>(viewsize.width * 0.5f - x), static_cast<int>(viewsize.height *0.5 - y));
|
|
||||||
mGlobalMap->setViewOffset(viewoffs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapWindow::setGlobalMapPlayerDir(const float x, const float y)
|
void MapWindow::setGlobalMapPlayerDir(const float x, const float y)
|
||||||
|
@ -149,9 +149,13 @@ namespace MWGui
|
|||||||
|
|
||||||
void applyFogOfWar();
|
void applyFogOfWar();
|
||||||
|
|
||||||
MyGUI::IntPoint getMarkerPosition (float worldX, float worldY, MarkerUserData& markerPos);
|
MyGUI::IntPoint getPosition(int cellX, int cellY, float nx, float ny) const;
|
||||||
|
MyGUI::IntPoint getMarkerPosition (float worldX, float worldY, MarkerUserData& markerPos) const;
|
||||||
|
MyGUI::IntCoord getMarkerCoordinates(float worldX, float worldY, MarkerUserData& markerPos, size_t markerSize) const;
|
||||||
|
MyGUI::Widget* createDoorMarker(const std::string& name, const MyGUI::VectorString& notes, float x, float y) const;
|
||||||
|
|
||||||
virtual void notifyPlayerUpdate() {}
|
virtual void notifyPlayerUpdate() {}
|
||||||
|
void centerView();
|
||||||
virtual void notifyMapChanged() {}
|
virtual void notifyMapChanged() {}
|
||||||
|
|
||||||
virtual void customMarkerCreated(MyGUI::Widget* marker) {}
|
virtual void customMarkerCreated(MyGUI::Widget* marker) {}
|
||||||
@ -163,6 +167,7 @@ namespace MWGui
|
|||||||
void addDetectionMarkers(int type);
|
void addDetectionMarkers(int type);
|
||||||
|
|
||||||
void redraw();
|
void redraw();
|
||||||
|
float getWidgetSize() const;
|
||||||
|
|
||||||
float mMarkerUpdateTimer;
|
float mMarkerUpdateTimer;
|
||||||
|
|
||||||
@ -252,6 +257,9 @@ namespace MWGui
|
|||||||
void onChangeScrollWindowCoord(MyGUI::Widget* sender);
|
void onChangeScrollWindowCoord(MyGUI::Widget* sender);
|
||||||
void globalMapUpdatePlayer();
|
void globalMapUpdatePlayer();
|
||||||
void setGlobalMapMarkerTooltip(MyGUI::Widget* widget, int x, int y);
|
void setGlobalMapMarkerTooltip(MyGUI::Widget* widget, int x, int y);
|
||||||
|
float getMarkerSize() const;
|
||||||
|
MyGUI::IntCoord createMarkerCoords(float x, float y) const;
|
||||||
|
MyGUI::Widget* createMarker(const std::string& name, float x, float y);
|
||||||
|
|
||||||
MyGUI::ScrollView* mGlobalMap;
|
MyGUI::ScrollView* mGlobalMap;
|
||||||
std::unique_ptr<MyGUI::ITexture> mGlobalMapTexture;
|
std::unique_ptr<MyGUI::ITexture> mGlobalMapTexture;
|
||||||
@ -288,6 +296,7 @@ namespace MWGui
|
|||||||
|
|
||||||
void notifyPlayerUpdate() override;
|
void notifyPlayerUpdate() override;
|
||||||
|
|
||||||
|
void centerView();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -270,17 +270,9 @@ namespace MWRender
|
|||||||
|
|
||||||
void GlobalMap::worldPosToImageSpace(float x, float z, float& imageX, float& imageY)
|
void GlobalMap::worldPosToImageSpace(float x, float z, float& imageX, float& imageY)
|
||||||
{
|
{
|
||||||
imageX = float(x / float(Constants::CellSizeInUnits) - mMinX) / (mMaxX - mMinX + 1);
|
imageX = (float(x / float(Constants::CellSizeInUnits) - mMinX) / (mMaxX - mMinX + 1)) * getWidth();
|
||||||
|
|
||||||
imageY = 1.f-float(z / float(Constants::CellSizeInUnits) - mMinY) / (mMaxY - mMinY + 1);
|
imageY = (1.f-float(z / float(Constants::CellSizeInUnits) - mMinY) / (mMaxY - mMinY + 1)) * getHeight();
|
||||||
}
|
|
||||||
|
|
||||||
void GlobalMap::cellTopLeftCornerToImageSpace(int x, int y, float& imageX, float& imageY)
|
|
||||||
{
|
|
||||||
imageX = float(x - mMinX) / (mMaxX - mMinX + 1);
|
|
||||||
|
|
||||||
// NB y + 1, because we want the top left corner, not bottom left where the origin of the cell is
|
|
||||||
imageY = 1.f-float(y - mMinY + 1) / (mMaxY - mMinY + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalMap::requestOverlayTextureUpdate(int x, int y, int width, int height, osg::ref_ptr<osg::Texture2D> texture, bool clear, bool cpuCopy,
|
void GlobalMap::requestOverlayTextureUpdate(int x, int y, int width, int height, osg::ref_ptr<osg::Texture2D> texture, bool clear, bool cpuCopy,
|
||||||
|
@ -41,12 +41,8 @@ namespace MWRender
|
|||||||
int getWidth() const { return mWidth; }
|
int getWidth() const { return mWidth; }
|
||||||
int getHeight() const { return mHeight; }
|
int getHeight() const { return mHeight; }
|
||||||
|
|
||||||
int getCellSize() const { return mCellSize; }
|
|
||||||
|
|
||||||
void worldPosToImageSpace(float x, float z, float& imageX, float& imageY);
|
void worldPosToImageSpace(float x, float z, float& imageX, float& imageY);
|
||||||
|
|
||||||
void cellTopLeftCornerToImageSpace(int x, int y, float& imageX, float& imageY);
|
|
||||||
|
|
||||||
void exploreCell (int cellX, int cellY, osg::ref_ptr<osg::Texture2D> localMapTexture);
|
void exploreCell (int cellX, int cellY, osg::ref_ptr<osg::Texture2D> localMapTexture);
|
||||||
|
|
||||||
/// Clears the overlay
|
/// Clears the overlay
|
||||||
|
Loading…
x
Reference in New Issue
Block a user