diff --git a/apps/openmw/mwrender/playerpos.cpp b/apps/openmw/mwrender/playerpos.cpp new file mode 100644 index 000000000..4a5e6628f --- /dev/null +++ b/apps/openmw/mwrender/playerpos.cpp @@ -0,0 +1,18 @@ + +#include "playerpos.hpp" + +#include "../mwworld/world.hpp" + +namespace MWRender +{ + void PlayerPos::setPos(float x, float y, float z, bool updateCamera) + { + mWorld.moveObject (getPlayer(), x, y, z); + + if (updateCamera) + camera->setPosition (Ogre::Vector3 ( + mPlayer.ref.pos.pos[0], + mPlayer.ref.pos.pos[2], + -mPlayer.ref.pos.pos[1])); + } +} diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index c8c661dd8..e3a2e6a2a 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -692,7 +692,28 @@ namespace MWWorld ptr.getCellRef().pos.pos[1] = y; ptr.getCellRef().pos.pos[2] = z; + if (ptr==mPlayerPos->getPlayer()) + { + CellRenderCollection::iterator active = mActiveCells.begin(); + + if (active!=mActiveCells.end()) + { + if (!(active->first->cell->data.flags & ESM::Cell::Interior)) + { + // exterior -> adjust loaded cells + const int cellSize = 8192; + + int cellX = static_cast (x/cellSize); + int cellY = static_cast (y/cellSize); + + if (active->first->cell->data.gridX!=cellX || active->first->cell->data.gridY!=cellY) + { + changeCell (cellX, cellY, mPlayerPos->getPlayer().getCellRef().pos); + } + } + } + } + // TODO cell change for non-player ref - // TODO cell change for player ref } }