1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-12-16 07:43:07 +00:00

ESM::Cell::positionToCellIndex returns a ESM::ExteriorCellIndex

and takes a worldspace id as input
ESM::getCellSize takes a wordspace as input.
removed useless static in static inline funcs
This commit is contained in:
florent.teppe 2023-05-12 12:04:04 +02:00
parent 559830f59a
commit 393357abc0
9 changed files with 53 additions and 51 deletions

View file

@ -276,7 +276,10 @@ namespace MWGui
if (!mInterior) if (!mInterior)
{ {
cellIndex = ESM::positionToCellIndex(worldX, worldY); ESM::ExteriorCellIndex cellPos = ESM::positionToCellIndex(worldX, worldY);
cellIndex.x() = cellPos.mX;
cellIndex.y() = cellPos.mY;
nX = (worldX - cellSize * cellIndex.x()) / cellSize; nX = (worldX - cellSize * cellIndex.x()) / cellSize;
// Image space is -Y up, cells are Y up // Image space is -Y up, cells are Y up
nY = 1 - (worldY - cellSize * cellIndex.y()) / cellSize; nY = 1 - (worldY - cellSize * cellIndex.y()) / cellSize;

View file

@ -125,11 +125,11 @@ namespace MWGui
{ {
std::string_view cellname = transport[i].mCellName; std::string_view cellname = transport[i].mCellName;
bool interior = true; bool interior = true;
const osg::Vec2i cellIndex = ESM::positionToCellIndex(transport[i].mPos.pos[0], transport[i].mPos.pos[1]); const ESM::ExteriorCellIndex cellIndex
= ESM::positionToCellIndex(transport[i].mPos.pos[0], transport[i].mPos.pos[1]);
if (cellname.empty()) if (cellname.empty())
{ {
MWWorld::CellStore& cell = MWBase::Environment::get().getWorldModel()->getExterior( MWWorld::CellStore& cell = MWBase::Environment::get().getWorldModel()->getExterior(cellIndex);
ESM::ExteriorCellIndex(cellIndex.x(), cellIndex.y(), ESM::Cell::sDefaultWorldspaceId));
cellname = MWBase::Environment::get().getWorld()->getCellName(&cell); cellname = MWBase::Environment::get().getWorld()->getCellName(&cell);
interior = false; interior = false;
} }
@ -192,8 +192,8 @@ namespace MWGui
MWBase::Environment::get().getWindowManager()->exitCurrentGuiMode(); MWBase::Environment::get().getWindowManager()->exitCurrentGuiMode();
MWBase::Environment::get().getWindowManager()->fadeScreenOut(1); MWBase::Environment::get().getWindowManager()->fadeScreenOut(1);
osg::Vec2i posCell = ESM::positionToCellIndex(pos.pos[0], pos.pos[1]); const ESM::ExteriorCellIndex posCell = ESM::positionToCellIndex(pos.pos[0], pos.pos[1]);
ESM::RefId cellId = ESM::Cell::generateIdForCell(!interior, cellname, posCell.x(), posCell.y()); ESM::RefId cellId = ESM::Cell::generateIdForCell(!interior, cellname, posCell.mX, posCell.mY);
// Teleports any followers, too. // Teleports any followers, too.
MWWorld::ActionTeleport action(cellId, pos, true); MWWorld::ActionTeleport action(cellId, pos, true);

View file

@ -400,9 +400,9 @@ namespace MWScript
store = &worldModel->getCell(cellID); store = &worldModel->getCell(cellID);
if (store->isExterior()) if (store->isExterior())
{ {
const osg::Vec2i cellIndex = ESM::positionToCellIndex(x, y); const ESM::ExteriorCellIndex cellIndex
store = &worldModel->getExterior( = ESM::positionToCellIndex(x, y, store->getCell()->getWorldSpace());
ESM::ExteriorCellIndex(cellIndex.x(), cellIndex.y(), store->getCell()->getWorldSpace())); store = &worldModel->getExterior(cellIndex);
} }
} }
catch (std::exception&) catch (std::exception&)
@ -416,9 +416,9 @@ namespace MWScript
Log(Debug::Warning) << error; Log(Debug::Warning) << error;
if (!isPlayer) if (!isPlayer)
return; return;
const osg::Vec2i cellIndex = ESM::positionToCellIndex(x, y); const ESM::ExteriorCellIndex cellIndex
store = &worldModel->getExterior( = ESM::positionToCellIndex(x, y, store->getCell()->getWorldSpace());
ESM::ExteriorCellIndex(cellIndex.x(), cellIndex.y(), store->getCell()->getWorldSpace())); store = &worldModel->getExterior(cellIndex);
} }
if (store) if (store)
{ {
@ -467,15 +467,15 @@ namespace MWScript
{ {
world->getPlayer().setTeleported(true); world->getPlayer().setTeleported(true);
} }
const osg::Vec2i cellIndex = ESM::positionToCellIndex(x, y); const ESM::ExteriorCellIndex cellIndex
= ESM::positionToCellIndex(x, y, ESM::Cell::sDefaultWorldspaceId);
// another morrowind oddity: player will be moved to the exterior cell at this location, // another morrowind oddity: player will be moved to the exterior cell at this location,
// non-player actors will move within the cell they are in. // non-player actors will move within the cell they are in.
MWWorld::Ptr base = ptr; MWWorld::Ptr base = ptr;
if (isPlayer) if (isPlayer)
{ {
MWWorld::CellStore* cell = &MWBase::Environment::get().getWorldModel()->getExterior( MWWorld::CellStore* cell = &MWBase::Environment::get().getWorldModel()->getExterior(cellIndex);
ESM::ExteriorCellIndex(cellIndex.x(), cellIndex.y(), ESM::Cell::sDefaultWorldspaceId));
ptr = world->moveObject(ptr, cell, osg::Vec3(x, y, z)); ptr = world->moveObject(ptr, cell, osg::Vec3(x, y, z));
} }
else else
@ -568,9 +568,9 @@ namespace MWScript
MWWorld::CellStore* store = nullptr; MWWorld::CellStore* store = nullptr;
if (player.getCell()->isExterior()) if (player.getCell()->isExterior())
{ {
const osg::Vec2i cellIndex = ESM::positionToCellIndex(x, y); const ESM::ExteriorCellIndex cellIndex
store = &MWBase::Environment::get().getWorldModel()->getExterior(ESM::ExteriorCellIndex( = ESM::positionToCellIndex(x, y, player.getCell()->getCell()->getWorldSpace());
cellIndex.x(), cellIndex.y(), player.getCell()->getCell()->getWorldSpace())); store = &MWBase::Environment::get().getWorldModel()->getExterior(cellIndex);
} }
else else
store = player.getCell(); store = player.getCell();

View file

@ -88,8 +88,8 @@ namespace MWWorld
} }
else else
{ {
const osg::Vec2i index = ESM::positionToCellIndex(ref.mDoorDest.pos[0], ref.mDoorDest.pos[1]); const auto cellPos = ESM::positionToCellIndex(ref.mDoorDest.pos[0], ref.mDoorDest.pos[1]);
return ESM::RefId::esm3ExteriorCell(index.x(), index.y()); return ESM::RefId::esm3ExteriorCell(cellPos.mX, cellPos.mY);
} }
}; };
auto esm4Visit = [&](const ESM4::Reference& ref) -> ESM::RefId { auto esm4Visit = [&](const ESM4::Reference& ref) -> ESM::RefId {

View file

@ -519,12 +519,13 @@ namespace MWWorld
osg::Vec2 center = ESM::indexToPosition( osg::Vec2 center = ESM::indexToPosition(
ESM::ExteriorCellIndex(currentGridCenter->x(), currentGridCenter->y(), worldspace), true); ESM::ExteriorCellIndex(currentGridCenter->x(), currentGridCenter->y(), worldspace), true);
float distance = std::max(std::abs(center.x() - pos.x()), std::abs(center.y() - pos.y())); float distance = std::max(std::abs(center.x() - pos.x()), std::abs(center.y() - pos.y()));
float cellSize = ESM::getCellSize(isEsm4Ext); float cellSize = ESM::getCellSize(worldspace);
const float maxDistance = cellSize / 2 + mCellLoadingThreshold; // 1/2 cell size + threshold const float maxDistance = cellSize / 2 + mCellLoadingThreshold; // 1/2 cell size + threshold
if (distance <= maxDistance) if (distance <= maxDistance)
return *currentGridCenter; return *currentGridCenter;
} }
return ESM::positionToCellIndex(pos.x(), pos.y(), isEsm4Ext); ESM::ExteriorCellIndex cellPos = ESM::positionToCellIndex(pos.x(), pos.y(), worldspace);
return { cellPos.mX, cellPos.mY };
} }
void Scene::playerMoved(const osg::Vec3f& pos) void Scene::playerMoved(const osg::Vec3f& pos)
@ -1162,8 +1163,7 @@ namespace MWWorld
cellY = mCurrentGridCenter.y(); cellY = mCurrentGridCenter.y();
ESM::RefId extWorldspace = mWorld.getCurrentWorldspace(); ESM::RefId extWorldspace = mWorld.getCurrentWorldspace();
bool esm4Ext = ESM::isEsm4Ext(extWorldspace); float cellSize = ESM::getCellSize(extWorldspace);
float cellSize = ESM::getCellSize(esm4Ext);
for (int dx = -halfGridSizePlusOne; dx <= halfGridSizePlusOne; ++dx) for (int dx = -halfGridSizePlusOne; dx <= halfGridSizePlusOne; ++dx)
{ {
@ -1283,10 +1283,8 @@ namespace MWWorld
else else
{ {
osg::Vec3f pos = dest.mPos.asVec3(); osg::Vec3f pos = dest.mPos.asVec3();
const osg::Vec2i cellIndex = ESM::positionToCellIndex(pos.x(), pos.y()); const ESM::ExteriorCellIndex cellIndex = ESM::positionToCellIndex(pos.x(), pos.y(), extWorldspace);
preloadCell(mWorld.getWorldModel().getExterior( preloadCell(mWorld.getWorldModel().getExterior(cellIndex), true);
ESM::ExteriorCellIndex(cellIndex.x(), cellIndex.y(), extWorldspace)),
true);
exteriorPositions.emplace_back(pos, gridCenterToBounds(getNewGridCenter(pos))); exteriorPositions.emplace_back(pos, gridCenterToBounds(getNewGridCenter(pos)));
} }
} }

View file

@ -379,8 +379,8 @@ namespace MWWorld
pos.rot[1] = 0; pos.rot[1] = 0;
pos.rot[2] = 0; pos.rot[2] = 0;
osg::Vec2i exteriorCellPos = ESM::positionToCellIndex(pos.pos[0], pos.pos[1]); ESM::ExteriorCellIndex exteriorCellPos = ESM::positionToCellIndex(pos.pos[0], pos.pos[1]);
ESM::RefId cellId = ESM::RefId::esm3ExteriorCell(exteriorCellPos.x(), exteriorCellPos.y()); ESM::RefId cellId = ESM::RefId::esm3ExteriorCell(exteriorCellPos.mX, exteriorCellPos.mY);
mWorldScene->changeToExteriorCell(cellId, pos, true); mWorldScene->changeToExteriorCell(cellId, pos, true);
} }
} }
@ -1244,14 +1244,12 @@ namespace MWWorld
MWWorld::Ptr World::moveObject(const Ptr& ptr, const osg::Vec3f& position, bool movePhysics, bool moveToActive) MWWorld::Ptr World::moveObject(const Ptr& ptr, const osg::Vec3f& position, bool movePhysics, bool moveToActive)
{ {
const osg::Vec2i index = ESM::positionToCellIndex(position.x(), position.y());
CellStore* cell = ptr.getCell(); CellStore* cell = ptr.getCell();
ESM::RefId worldspaceId ESM::RefId worldspaceId
= cell->isExterior() ? cell->getCell()->getWorldSpace() : ESM::Cell::sDefaultWorldspaceId; = cell->isExterior() ? cell->getCell()->getWorldSpace() : ESM::Cell::sDefaultWorldspaceId;
CellStore* newCell = cell->isExterior() const ESM::ExteriorCellIndex index = ESM::positionToCellIndex(position.x(), position.y(), worldspaceId);
? &mWorldModel.getExterior(ESM::ExteriorCellIndex(index.x(), index.y(), worldspaceId))
: nullptr; CellStore* newCell = cell->isExterior() ? &mWorldModel.getExterior(index) : nullptr;
bool isCellActive = getPlayerPtr().isInCell() && getPlayerPtr().getCell()->isExterior() bool isCellActive = getPlayerPtr().isInCell() && getPlayerPtr().getCell()->isExterior()
&& (newCell && mWorldScene->isCellActive(*newCell)); && (newCell && mWorldScene->isCellActive(*newCell));
@ -1373,8 +1371,8 @@ namespace MWWorld
&& !(ptr.getClass().isPersistent(ptr) && ptr.getClass().getCreatureStats(ptr).isDeathAnimationFinished()); && !(ptr.getClass().isPersistent(ptr) && ptr.getClass().getCreatureStats(ptr).isDeathAnimationFinished());
if (force || !ptr.getClass().isActor() || (!isFlying(ptr) && !swims && isActorCollisionEnabled(ptr))) if (force || !ptr.getClass().isActor() || (!isFlying(ptr) && !swims && isActorCollisionEnabled(ptr)))
{ {
bool esm4Ext = ptr.getCell()->isExterior() && ESM::isEsm4Ext(ptr.getCell()->getCell()->getWorldSpace()); osg::Vec3f traced
osg::Vec3f traced = mPhysics->traceDown(ptr, pos, ESM::getCellSize(esm4Ext)); = mPhysics->traceDown(ptr, pos, ESM::getCellSize(ptr.getCell()->getCell()->getWorldSpace()));
pos.z() = std::min(pos.z(), traced.z()); pos.z() = std::min(pos.z(), traced.z());
} }
@ -1409,9 +1407,9 @@ namespace MWWorld
if (!mPhysics->castRay(pos, targetPos, MWPhysics::CollisionType_World | MWPhysics::CollisionType_Door).mHit) if (!mPhysics->castRay(pos, targetPos, MWPhysics::CollisionType_World | MWPhysics::CollisionType_Door).mHit)
break; break;
} }
bool esm4Ext = actor.getCell()->isExterior() && ESM::isEsm4Ext(actor.getCell()->getCell()->getWorldSpace());
targetPos.z() += distance / 2.f; // move up a bit to get out from geometry, will snap down later targetPos.z() += distance / 2.f; // move up a bit to get out from geometry, will snap down later
osg::Vec3f traced = mPhysics->traceDown(actor, targetPos, ESM::getCellSize(esm4Ext)); osg::Vec3f traced
= mPhysics->traceDown(actor, targetPos, ESM::getCellSize(actor.getCell()->getCell()->getWorldSpace()));
if (traced != pos) if (traced != pos)
{ {
esmPos.pos[0] = traced.x(); esmPos.pos[0] = traced.x();
@ -2048,9 +2046,9 @@ namespace MWWorld
throw std::runtime_error("copyObjectToCell(): cannot copy object to null cell"); throw std::runtime_error("copyObjectToCell(): cannot copy object to null cell");
if (cell->isExterior()) if (cell->isExterior())
{ {
const osg::Vec2i index = ESM::positionToCellIndex(pos.pos[0], pos.pos[1]); const ESM::ExteriorCellIndex index
cell = &mWorldModel.getExterior( = ESM::positionToCellIndex(pos.pos[0], pos.pos[1], cell->getCell()->getWorldSpace());
ESM::ExteriorCellIndex(index.x(), index.y(), cell->getCell()->getWorldSpace())); cell = &mWorldModel.getExterior(index);
} }
MWWorld::Ptr dropped = object.getClass().copyToCell(object, *cell, pos, count); MWWorld::Ptr dropped = object.getClass().copyToCell(object, *cell, pos, count);

View file

@ -327,10 +327,11 @@ MWWorld::CellStore& MWWorld::WorldModel::getCellByPosition(
{ {
if (cellInSameWorldSpace && !cellInSameWorldSpace->isExterior()) if (cellInSameWorldSpace && !cellInSameWorldSpace->isExterior())
return *cellInSameWorldSpace; return *cellInSameWorldSpace;
const osg::Vec2i cellIndex = ESM::positionToCellIndex(pos.x(), pos.y());
ESM::RefId exteriorWorldspace ESM::RefId exteriorWorldspace
= cellInSameWorldSpace ? cellInSameWorldSpace->getCell()->getWorldSpace() : ESM::Cell::sDefaultWorldspaceId; = cellInSameWorldSpace ? cellInSameWorldSpace->getCell()->getWorldSpace() : ESM::Cell::sDefaultWorldspaceId;
return getExterior(ESM::ExteriorCellIndex(cellIndex.x(), cellIndex.y(), exteriorWorldspace)); const ESM::ExteriorCellIndex cellIndex = ESM::positionToCellIndex(pos.x(), pos.y(), exteriorWorldspace);
return getExterior(cellIndex);
} }
MWWorld::Ptr MWWorld::WorldModel::getPtr(const ESM::RefId& name, CellStore& cell) MWWorld::Ptr MWWorld::WorldModel::getPtr(const ESM::RefId& name, CellStore& cell)

View file

@ -2,7 +2,7 @@
osg::Vec2 ESM::indexToPosition(const ESM::ExteriorCellIndex& cellIndex, bool centre) osg::Vec2 ESM::indexToPosition(const ESM::ExteriorCellIndex& cellIndex, bool centre)
{ {
const int cellSize = ESM::getCellSize(ESM::isEsm4Ext(cellIndex.mWorldspace)); const int cellSize = ESM::getCellSize(cellIndex.mWorldspace);
float x = static_cast<float>(cellSize * cellIndex.mX); float x = static_cast<float>(cellSize * cellIndex.mX);
float y = static_cast<float>(cellSize * cellIndex.mY); float y = static_cast<float>(cellSize * cellIndex.mY);

View file

@ -72,20 +72,22 @@ namespace ESM
} }
}; };
static inline bool isEsm4Ext(ESM::RefId worldspaceId) inline bool isEsm4Ext(ESM::RefId worldspaceId)
{ {
return worldspaceId != ESM::Cell::sDefaultWorldspaceId; return worldspaceId != ESM::Cell::sDefaultWorldspaceId;
} }
static inline int getCellSize(bool isESM4Ext) inline int getCellSize(ESM::RefId worldspaceId)
{ {
return isESM4Ext ? Constants::ESM4CellSizeInUnits : Constants::CellSizeInUnits;
return isEsm4Ext(worldspaceId) ? Constants::ESM4CellSizeInUnits : Constants::CellSizeInUnits;
} }
inline osg::Vec2i positionToCellIndex(float x, float y, bool esm4Ext = false) inline ESM::ExteriorCellIndex positionToCellIndex(
float x, float y, ESM::RefId worldspaceId = ESM::Cell::sDefaultWorldspaceId)
{ {
const float cellSize = esm4Ext ? Constants::ESM4CellSizeInUnits : Constants::CellSizeInUnits; const float cellSize = getCellSize(worldspaceId);
return { static_cast<int>(std::floor(x / cellSize)), static_cast<int>(std::floor(y / cellSize)) }; return { static_cast<int>(std::floor(x / cellSize)), static_cast<int>(std::floor(y / cellSize)), worldspaceId };
} }
osg::Vec2 indexToPosition(const ESM::ExteriorCellIndex& cellIndex, bool centre = false); osg::Vec2 indexToPosition(const ESM::ExteriorCellIndex& cellIndex, bool centre = false);