Fix issue where objects were sometimes unresponsive after dragging.

This commit is contained in:
cc9cii 2014-11-02 15:34:45 +11:00
parent e174428cc5
commit 7f54dab6ef
3 changed files with 34 additions and 8 deletions

View file

@ -441,7 +441,7 @@ namespace CSVRender
// FIXME: adjustRigidBody() seems to lose objects, work around by deleting and recreating objects // FIXME: adjustRigidBody() seems to lose objects, work around by deleting and recreating objects
//mPhysics->moveObject(sceneNode, pos, xr*yr*zr); //mPhysics->moveObject(sceneNode, pos, xr*yr*zr);
mPhysics->replaceObject(sceneNode, refId, cellref.mScale, pos, xr*yr*zr); mPhysics->replaceObject(sceneNode, cellref.mScale, pos, xr*yr*zr);
// update all SceneWidgets and their SceneManagers // update all SceneWidgets and their SceneManagers
updateSceneWidgets(); updateSceneWidgets();

View file

@ -85,7 +85,7 @@ namespace CSVWorld
// normal delete (e.g closing a scene subview) // normal delete (e.g closing a scene subview)
// TODO: should think about using some kind of reference counting within RigidBody // TODO: should think about using some kind of reference counting within RigidBody
void PhysicsSystem::removeObject(const std::string &sceneNodeName, bool force) void PhysicsSystem::removeObject(const std::string &sceneNodeName)
{ {
std::string referenceId = mSceneNodeToRefId[sceneNodeName]; std::string referenceId = mSceneNodeToRefId[sceneNodeName];
@ -137,7 +137,7 @@ namespace CSVWorld
} }
// check whether the physics model be deleted // check whether the physics model be deleted
if(force || mRefIdToSceneNode.find(referenceId) == mRefIdToSceneNode.end()) if(mRefIdToSceneNode.find(referenceId) == mRefIdToSceneNode.end())
{ {
mEngine->removeRigidBody(referenceId); mEngine->removeRigidBody(referenceId);
mEngine->deleteRigidBody(referenceId); mEngine->deleteRigidBody(referenceId);
@ -146,12 +146,38 @@ namespace CSVWorld
} }
void PhysicsSystem::replaceObject(const std::string &sceneNodeName, void PhysicsSystem::replaceObject(const std::string &sceneNodeName,
const std::string &referenceId, float scale, const Ogre::Vector3 &position, float scale, const Ogre::Vector3 &position,
const Ogre::Quaternion &rotation, bool placeable) const Ogre::Quaternion &rotation, bool placeable)
{ {
std::string referenceId = mSceneNodeToRefId[sceneNodeName];
std::string mesh = mSceneNodeToMesh[sceneNodeName]; std::string mesh = mSceneNodeToMesh[sceneNodeName];
removeObject(sceneNodeName, true); // force delete
addObject(mesh, sceneNodeName, referenceId, scale, position, rotation, placeable); if(referenceId != "")
{
// delete the physics object
mEngine->removeRigidBody(referenceId);
mEngine->deleteRigidBody(referenceId);
// create the physics object
mEngine->createAndAdjustRigidBody(mesh,
referenceId, scale, position, rotation,
0, // scaledBoxTranslation
0, // boxRotation
true, // raycasting
placeable);
// update other scene managers if they have the referenceId
std::list<Ogre::SceneManager *>::const_iterator iter = mSceneManagers.begin();
for(; iter != mSceneManagers.end(); ++iter)
{
std::string name = refIdToSceneNode(referenceId, *iter);
if(name != sceneNodeName && (*iter)->hasSceneNode(name))
{
// FIXME: rotation or scale not updated
(*iter)->getSceneNode(name)->setPosition(position);
}
}
}
} }
void PhysicsSystem::moveObject(const std::string &sceneNodeName, void PhysicsSystem::moveObject(const std::string &sceneNodeName,

View file

@ -52,10 +52,10 @@ namespace CSVWorld
const Ogre::Vector3 &position, const Ogre::Quaternion &rotation, const Ogre::Vector3 &position, const Ogre::Quaternion &rotation,
bool placeable=false); bool placeable=false);
void removeObject(const std::string &sceneNodeName, bool force = false); void removeObject(const std::string &sceneNodeName);
void replaceObject(const std::string &sceneNodeName, void replaceObject(const std::string &sceneNodeName,
const std::string &referenceId, float scale, const Ogre::Vector3 &position, float scale, const Ogre::Vector3 &position,
const Ogre::Quaternion &rotation, bool placeable=false); const Ogre::Quaternion &rotation, bool placeable=false);
void moveObject(const std::string &sceneNodeName, void moveObject(const std::string &sceneNodeName,