mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-31 23:45:35 +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:
commit
45b45b3560
4 changed files with 2 additions and 29 deletions
|
@ -172,7 +172,7 @@ namespace MWRender
|
||||||
osg::Vec3f pos = ref.mPos.asVec3();
|
osg::Vec3f pos = ref.mPos.asVec3();
|
||||||
osg::Vec3f cellPos = pos / ESM::Land::REAL_SIZE;
|
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())
|
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 false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -434,7 +434,6 @@ namespace MWRender
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (std::find(cell->mMovedRefs.begin(), cell->mMovedRefs.end(), ref.mRefNum) != cell->mMovedRefs.end()) 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);
|
Misc::StringUtils::lowerCaseInPlace(ref.mRefID);
|
||||||
int type = store.findStatic(ref.mRefID);
|
int type = store.findStatic(ref.mRefID);
|
||||||
if (!typeFilter(type,size>=2)) continue;
|
if (!typeFilter(type,size>=2)) continue;
|
||||||
|
@ -456,15 +455,6 @@ namespace MWRender
|
||||||
if (!typeFilter(type,size>=2)) continue;
|
if (!typeFilter(type,size>=2)) continue;
|
||||||
refs[ref.mRefNum] = std::move(ref);
|
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;
|
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())
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -478,15 +478,6 @@ namespace MWWorld
|
||||||
// implementation when the oher implementation works as well.
|
// implementation when the oher implementation works as well.
|
||||||
while (cell->getNextRef(esm, ref, deleted, cMRef, moved))
|
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)
|
if (!moved)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -687,9 +678,6 @@ namespace MWWorld
|
||||||
oldcell->mMovedRefs.push_back(*it);
|
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
|
// 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,
|
// 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.
|
// however, could have leased refs in it and so should be kept.
|
||||||
|
|
|
@ -124,11 +124,6 @@ struct Cell
|
||||||
CellRefTracker mLeasedRefs;
|
CellRefTracker mLeasedRefs;
|
||||||
MovedCellRefTracker mMovedRefs;
|
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);
|
void postLoad(ESMReader &esm);
|
||||||
|
|
||||||
// This method is left in for compatibility with esmtool. Parsing moved references currently requires
|
// This method is left in for compatibility with esmtool. Parsing moved references currently requires
|
||||||
|
|
Loading…
Reference in a new issue