forked from teamnwah/openmw-tes3coop
Fix issue where objects were sometimes unresponsive after dragging.
This commit is contained in:
parent
e174428cc5
commit
7f54dab6ef
3 changed files with 34 additions and 8 deletions
|
@ -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();
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue