float* -> Vector3, moveToCell -> copyToCell, fixed placeObject()

actorid
greye 13 years ago
parent b734460dc9
commit 26595f22f6

@ -96,7 +96,7 @@ namespace MWClass
}
MWWorld::Ptr
Activator::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Activator::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Activator> *ref =
ptr.get<ESM::Activator>();

@ -9,7 +9,7 @@ namespace MWClass
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -151,7 +151,7 @@ namespace MWClass
}
MWWorld::Ptr
Apparatus::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Apparatus::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Apparatus> *ref =
ptr.get<ESM::Apparatus>();

@ -9,7 +9,7 @@ namespace MWClass
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -278,7 +278,7 @@ namespace MWClass
}
MWWorld::Ptr
Armor::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Armor::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Armor> *ref =
ptr.get<ESM::Armor>();

@ -8,7 +8,7 @@ namespace MWClass
class Armor : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -158,7 +158,7 @@ namespace MWClass
}
MWWorld::Ptr
Book::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Book::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Book> *ref =
ptr.get<ESM::Book>();

@ -8,7 +8,7 @@ namespace MWClass
class Book : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -229,7 +229,7 @@ namespace MWClass
}
MWWorld::Ptr
Clothing::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Clothing::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Clothing> *ref =
ptr.get<ESM::Clothing>();

@ -8,7 +8,7 @@ namespace MWClass
class Clothing : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -209,7 +209,7 @@ namespace MWClass
}
MWWorld::Ptr
Container::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Container::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Container> *ref =
ptr.get<ESM::Container>();

@ -11,7 +11,7 @@ namespace MWClass
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -197,7 +197,7 @@ namespace MWClass
}
MWWorld::Ptr
Creature::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Creature::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Creature> *ref =
ptr.get<ESM::Creature>();

@ -12,7 +12,7 @@ namespace MWClass
void ensureCustomData (const MWWorld::Ptr& ptr) const;
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -211,7 +211,7 @@ namespace MWClass
}
MWWorld::Ptr
Door::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Door::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Door> *ref =
ptr.get<ESM::Door>();

@ -8,7 +8,7 @@ namespace MWClass
class Door : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -158,7 +158,7 @@ namespace MWClass
}
MWWorld::Ptr
Ingredient::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Ingredient::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Ingredient> *ref =
ptr.get<ESM::Ingredient>();

@ -8,7 +8,7 @@ namespace MWClass
class Ingredient : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -198,7 +198,7 @@ namespace MWClass
}
MWWorld::Ptr
Light::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Light::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Light> *ref =
ptr.get<ESM::Light>();

@ -8,7 +8,7 @@ namespace MWClass
class Light : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -167,7 +167,7 @@ namespace MWClass
}
MWWorld::Ptr
Lockpick::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Lockpick::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Tool> *ref =
ptr.get<ESM::Tool>();

@ -8,7 +8,7 @@ namespace MWClass
class Lockpick : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -186,7 +186,7 @@ namespace MWClass
}
MWWorld::Ptr
Miscellaneous::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Miscellaneous::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::Ptr newPtr;

@ -8,7 +8,7 @@ namespace MWClass
class Miscellaneous : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -382,7 +382,7 @@ namespace MWClass
}
MWWorld::Ptr
Npc::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Npc::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::NPC> *ref =
ptr.get<ESM::NPC>();

@ -10,7 +10,7 @@ namespace MWClass
void ensureCustomData (const MWWorld::Ptr& ptr) const;
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -162,7 +162,7 @@ namespace MWClass
}
MWWorld::Ptr
Potion::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Potion::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Potion> *ref =
ptr.get<ESM::Potion>();

@ -8,7 +8,7 @@ namespace MWClass
class Potion : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -166,7 +166,7 @@ namespace MWClass
}
MWWorld::Ptr
Probe::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Probe::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Probe> *ref =
ptr.get<ESM::Probe>();

@ -8,7 +8,7 @@ namespace MWClass
class Probe : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -148,7 +148,7 @@ namespace MWClass
}
MWWorld::Ptr
Repair::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Repair::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Repair> *ref =
ptr.get<ESM::Repair>();

@ -8,7 +8,7 @@ namespace MWClass
class Repair : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -55,7 +55,7 @@ namespace MWClass
}
MWWorld::Ptr
Static::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Static::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Static> *ref =
ptr.get<ESM::Static>();

@ -8,7 +8,7 @@ namespace MWClass
class Static : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -367,7 +367,7 @@ namespace MWClass
}
MWWorld::Ptr
Weapon::moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
Weapon::copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const
{
MWWorld::LiveCellRef<ESM::Weapon> *ref =
ptr.get<ESM::Weapon>();

@ -8,7 +8,7 @@ namespace MWClass
class Weapon : public MWWorld::Class
{
virtual MWWorld::Ptr
moveToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
public:

@ -222,27 +222,26 @@ namespace MWWorld
}
MWWorld::Ptr
Class::moveToCellImpl(const Ptr &ptr, CellStore &cell) const
Class::copyToCellImpl(const Ptr &ptr, CellStore &cell) const
{
throw std::runtime_error("unable to move class to cell");
}
MWWorld::Ptr
Class::moveToCell(const Ptr &ptr, CellStore &cell) const
Class::copyToCell(const Ptr &ptr, CellStore &cell) const
{
Ptr newPtr = moveToCellImpl(ptr, cell);
Ptr newPtr = copyToCellImpl(ptr, cell);
newPtr.getRefData().setCount(ptr.getRefData().getCount());
ptr.getRefData().setCount(0);
newPtr.getRefData().enable();
return newPtr;
}
MWWorld::Ptr
Class::moveToCell(const Ptr &ptr, CellStore &cell, const ESM::Position &pos) const
Class::copyToCell(const Ptr &ptr, CellStore &cell, const ESM::Position &pos) const
{
Ptr newPtr = moveToCell(ptr, cell);
Ptr newPtr = copyToCell(ptr, cell);
newPtr.getRefData().getPosition() = pos;
return newPtr;

@ -57,7 +57,7 @@ namespace MWWorld
Class();
virtual Ptr moveToCellImpl(const Ptr &ptr, CellStore &cell) const;
virtual Ptr copyToCellImpl(const Ptr &ptr, CellStore &cell) const;
public:
@ -216,10 +216,10 @@ namespace MWWorld
virtual std::string getModel(const MWWorld::Ptr &ptr) const;
virtual Ptr
moveToCell(const Ptr &ptr, CellStore &cell) const;
copyToCell(const Ptr &ptr, CellStore &cell) const;
virtual Ptr
moveToCell(const Ptr &ptr, CellStore &cell, const ESM::Position &pos) const;
copyToCell(const Ptr &ptr, CellStore &cell, const ESM::Position &pos) const;
};
}

@ -382,14 +382,23 @@ namespace MWWorld
addActor (node->getName(), model, node->getPosition());
}
bool PhysicsSystem::getObjectAABB(const MWWorld::Ptr &ptr, float *min, float *max)
bool PhysicsSystem::getObjectAABB(const MWWorld::Ptr &ptr, Ogre::Vector3 &min, Ogre::Vector3 &max)
{
std::string model = MWWorld::Class::get(ptr).getModel(ptr);
if (model.empty()) {
return false;
}
float scale = ptr.getRefData().getBaseNode()->getScale().x;
mEngine->getObjectAABB(model, scale, min, max);
btVector3 btMin, btMax;
float scale = ptr.getCellRef().scale;
mEngine->getObjectAABB(model, scale, btMin, btMax);
min.x = btMin.x();
min.y = btMin.y();
min.z = btMin.z();
max.x = btMax.x();
max.y = btMax.y();
max.z = btMax.z();
return true;
}

@ -68,7 +68,7 @@ namespace MWWorld
void setCurrentWater(bool hasWater, int waterHeight);
bool getObjectAABB(const MWWorld::Ptr &ptr, float *min, float *max);
bool getObjectAABB(const MWWorld::Ptr &ptr, Ogre::Vector3 &min, Ogre::Vector3 &max);
private:
OEngine::Render::OgreRenderer &mRender;

@ -334,21 +334,10 @@ namespace MWWorld
void Scene::addObjectToScene (const Ptr& ptr)
{
mRendering.addObject (ptr);
float *pos = ptr.getRefData().getPosition().pos;
float min[3], max[3];
if (mPhysics->getObjectAABB(ptr, min, max)) {
pos[0] -= (min[0] + max[0]) / 2;
pos[1] -= (min[1] + max[1]) / 2;
pos[2] -= min[2];
}
ptr.getRefData().getBaseNode()->setPosition(pos[0], pos[1], pos[2]);
MWWorld::Class::get (ptr).insertObject (ptr, *mPhysics);
mRendering.addObject(ptr);
MWWorld::Class::get(ptr).insertObject(ptr, *mPhysics);
}
void Scene::removeObjectFromScene (const Ptr& ptr)
{
MWBase::Environment::get().getMechanicsManager()->removeActor (ptr);
@ -356,4 +345,19 @@ namespace MWWorld
mPhysics->removeObject (ptr.getRefData().getHandle());
mRendering.removeObject (ptr);
}
bool Scene::isCellActive(const CellStore &cell)
{
CellStoreCollection::iterator active = mActiveCells.begin();
while (active != mActiveCells.end()) {
if ((*active)->cell->name == cell.cell->name &&
(*active)->cell->data.gridX == cell.cell->data.gridX &&
(*active)->cell->data.gridY == cell.cell->data.gridY)
{
return true;
}
++active;
}
return false;
}
}

@ -95,6 +95,8 @@ namespace MWWorld
void removeObjectFromScene (const Ptr& ptr);
///< Remove an object from the scene, but not from the world model.
bool isCellActive(const CellStore &cell);
};
}

@ -1022,6 +1022,7 @@ namespace MWWorld
pos.pos[2] = result.second[1];
placeObject(object, *cell, pos);
object.getRefData().setCount(0);
return true;
}
@ -1040,16 +1041,25 @@ namespace MWWorld
void
World::placeObject(const Ptr &object, CellStore &cell, const ESM::Position &pos)
{
mLocalScripts.remove(object);
/// \todo add searching correct cell for position specified
MWWorld::Ptr dropped =
MWWorld::Class::get(object).moveToCell(object, cell, pos);
MWWorld::Class::get(object).copyToCell(object, cell, pos);
Ogre::Vector3 min, max;
if (mPhysics->getObjectAABB(object, min, max)) {
float *pos = dropped.getRefData().getPosition().pos;
pos[0] -= (min.x + max.x) / 2;
pos[1] -= (min.y + max.y) / 2;
pos[2] -= min.z;
}
mWorldScene->addObjectToScene(dropped);
if (mWorldScene->isCellActive(cell)) {
mWorldScene->addObjectToScene(dropped);
std::string script = MWWorld::Class::get(dropped).getScript(dropped);
if (!script.empty()) {
mLocalScripts.add(script, dropped);
std::string script = MWWorld::Class::get(dropped).getScript(dropped);
if (!script.empty()) {
mLocalScripts.add(script, dropped);
}
}
}
@ -1071,8 +1081,8 @@ namespace MWWorld
mPhysics->castRay(orig, dir, len);
pos.pos[2] = hit.second.z;
/// \todo fix item dropping at player object center position
placeObject(object, *cell, pos);
object.getRefData().setCount(0);
}
void World::processChangedSettings(const Settings::CategorySettingVector& settings)

@ -569,7 +569,7 @@ namespace Physic
return results2;
}
void PhysicEngine::getObjectAABB(const std::string &mesh, float scale, float *min, float *max)
void PhysicEngine::getObjectAABB(const std::string &mesh, float scale, btVector3 &min, btVector3 &max)
{
char uniqueID[8];
sprintf( uniqueID, "%07.3f", scale );
@ -582,17 +582,8 @@ namespace Physic
BulletShapeManager::getSingleton().getByName(outputstring, "General");
btTransform trans;
btVector3 btmin, btmax;
trans.setIdentity();
shape->Shape->getAabb(trans, btmin, btmax);
min[0] = btmin.x();
min[1] = btmin.y();
min[2] = btmin.z();
max[0] = btmax.x();
max[1] = btmax.y();
max[2] = btmax.z();
shape->Shape->getAabb(trans, min, max);
}
}};

@ -221,7 +221,7 @@ namespace Physic
bool toggleDebugRendering();
void getObjectAABB(const std::string &mesh, float scale, float *min, float *max);
void getObjectAABB(const std::string &mesh, float scale, btVector3 &min, btVector3 &max);
/**
* Return the closest object hit by a ray. If there are no objects, it will return ("",-1).

Loading…
Cancel
Save