1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-26 09:35:28 +00:00

Merge branch 'fix_op_bzzt_whoopsie' into 'master'

resolve issue of OP meshes that cross boundaries

See merge request OpenMW/openmw!1117
This commit is contained in:
psi29a 2021-08-10 15:50:33 +00:00
commit 45b45b3560
4 changed files with 2 additions and 29 deletions

View File

@ -172,7 +172,7 @@ namespace MWRender
osg::Vec3f pos = ref.mPos.asVec3();
osg::Vec3f cellPos = pos / ESM::Land::REAL_SIZE;
if ((minBound.x() > std::floor(minBound.x()) && cellPos.x() < minBound.x()) || (minBound.y() > std::floor(minBound.y()) && cellPos.y() < minBound.y())
|| (maxBound.x() < std::ceil(maxBound.x()) && cellPos.x() >= maxBound.x()) || (minBound.y() < std::ceil(maxBound.y()) && cellPos.y() >= maxBound.y()))
|| (maxBound.x() < std::ceil(maxBound.x()) && cellPos.x() >= maxBound.x()) || (maxBound.y() < std::ceil(maxBound.y()) && cellPos.y() >= maxBound.y()))
return false;
return true;

View File

@ -434,7 +434,6 @@ namespace MWRender
continue;
if (std::find(cell->mMovedRefs.begin(), cell->mMovedRefs.end(), ref.mRefNum) != cell->mMovedRefs.end()) continue;
if (std::find(cell->mMovedRefsByPos.begin(), cell->mMovedRefsByPos.end(), ref.mRefNum) != cell->mMovedRefsByPos.end()) continue;
Misc::StringUtils::lowerCaseInPlace(ref.mRefID);
int type = store.findStatic(ref.mRefID);
if (!typeFilter(type,size>=2)) continue;
@ -456,15 +455,6 @@ namespace MWRender
if (!typeFilter(type,size>=2)) continue;
refs[ref.mRefNum] = std::move(ref);
}
for (auto [ref, deleted] : cell->mLeasedRefsByPos)
{
if (deleted) { refs.erase(ref.mRefNum); continue; }
Misc::StringUtils::lowerCaseInPlace(ref.mRefID);
int type = store.findStatic(ref.mRefID);
if (!typeFilter(type, size >= 2)) continue;
refs[ref.mRefNum] = std::move(ref);
}
}
}
@ -507,7 +497,7 @@ namespace MWRender
{
osg::Vec3f cellPos = pos / ESM::Land::REAL_SIZE;
if ((minBound.x() > std::floor(minBound.x()) && cellPos.x() < minBound.x()) || (minBound.y() > std::floor(minBound.y()) && cellPos.y() < minBound.y())
|| (maxBound.x() < std::ceil(maxBound.x()) && cellPos.x() >= maxBound.x()) || (minBound.y() < std::ceil(maxBound.y()) && cellPos.y() >= maxBound.y()))
|| (maxBound.x() < std::ceil(maxBound.x()) && cellPos.x() >= maxBound.x()) || (maxBound.y() < std::ceil(maxBound.y()) && cellPos.y() >= maxBound.y()))
continue;
}

View File

@ -478,15 +478,6 @@ namespace MWWorld
// implementation when the oher implementation works as well.
while (cell->getNextRef(esm, ref, deleted, cMRef, moved))
{
auto x = static_cast<int>(std::floor(ref.mPos.pos[0] / float(ESM::Land::REAL_SIZE)));
auto y = static_cast<int>(std::floor(ref.mPos.pos[1] / float(ESM::Land::REAL_SIZE)));
if (x != cell->getGridX() || y != cell->getGridY())
{
ESM::Cell* cellAlt = const_cast<ESM::Cell*>(searchOrCreate(x, y));
cellAlt->mLeasedRefsByPos.emplace_back(ref, deleted);
cell->mMovedRefsByPos.push_back(ref.mRefNum);
}
if (!moved)
continue;
@ -687,9 +678,6 @@ namespace MWWorld
oldcell->mMovedRefs.push_back(*it);
}
oldcell->mLeasedRefsByPos.splice(oldcell->mLeasedRefsByPos.end(), cell.mLeasedRefsByPos);
oldcell->mMovedRefsByPos.splice(oldcell->mMovedRefsByPos.end(), cell.mMovedRefsByPos);
// We don't need to merge mLeasedRefs of cell / oldcell. This list is filled when another cell moves a
// reference to this cell, so the list for the new cell should be empty. The list for oldcell,
// however, could have leased refs in it and so should be kept.

View File

@ -124,11 +124,6 @@ struct Cell
CellRefTracker mLeasedRefs;
MovedCellRefTracker mMovedRefs;
// References "adopted" from another cell (i.e. a different cell
// introduced this ref, and it has been moved here as it geographically in this cell)
CellRefTracker mLeasedRefsByPos;
std::list<RefNum> mMovedRefsByPos;
void postLoad(ESMReader &esm);
// This method is left in for compatibility with esmtool. Parsing moved references currently requires