1
0
forked from 0ad/0ad

Correctly compute the masks for shared visibility updates. The old code was working only because of luck when shared vision was always reciprocal.

Refs #2055, fixes #3327

This was SVN commit r16842.
This commit is contained in:
Nicolas Auvray 2015-07-11 16:45:09 +00:00
parent c4389abceb
commit 0c45e3b5d0

View File

@ -96,18 +96,15 @@ static u32 CalcSharedLosMask(std::vector<player_id_t> players)
}
/**
* Returns shared 1-bit mask for given list of players.
* Add a player to mask, which is a 1-bit mask representing a list of players.
* Returns true if the mask is modified.
*/
static u32 CalcSharedDirtyVisibilityMask(std::vector<player_id_t> players)
static bool AddPlayerSharedDirtyVisibilityMask(u16& mask, player_id_t player)
{
u16 playerMask = 0;
for (size_t i = 0; i < players.size(); i++)
{
if (players[i] > 0 && players[i] <= 16)
playerMask |= (0x1 << (players[i] - 1));
}
return playerMask;
u16 oldMask = mask;
if (player > 0 && player <= 16)
mask |= (0x1 << (player - 1));
return oldMask != mask;
}
/**
@ -1704,10 +1701,14 @@ public:
{
m_SharedLosMasks[player] = CalcSharedLosMask(players);
u16 oldMask = m_SharedDirtyVisibilityMasks[player];
m_SharedDirtyVisibilityMasks[player] = CalcSharedDirtyVisibilityMask(players);
// From now on, units belonging to any of 'players' can trigger visibility updates for 'player'.
bool modified = false;
if (oldMask != m_SharedDirtyVisibilityMasks[player] && (size_t)player <= m_GlobalPlayerVisibilityUpdate.size())
for (player_id_t partner : players)
if (AddPlayerSharedDirtyVisibilityMask(m_SharedDirtyVisibilityMasks[partner], player))
modified = true;
if (modified && (size_t)player <= m_GlobalPlayerVisibilityUpdate.size())
m_GlobalPlayerVisibilityUpdate[player-1] = 1;
}