forked from teamnwah/openmw-tes3coop
Refactor duplicate code sections.
This commit is contained in:
parent
49d416353e
commit
3796240b19
2 changed files with 32 additions and 36 deletions
|
@ -36,21 +36,15 @@ namespace CSVWorld
|
||||||
const std::string &sceneNodeName, const std::string &referenceId, float scale,
|
const std::string &sceneNodeName, const std::string &referenceId, float scale,
|
||||||
const Ogre::Vector3 &position, const Ogre::Quaternion &rotation, bool placeable)
|
const Ogre::Vector3 &position, const Ogre::Quaternion &rotation, bool placeable)
|
||||||
{
|
{
|
||||||
bool foundSceneManager = false;
|
Ogre::SceneManager *sceneManager = findSceneManager(sceneNodeName);
|
||||||
std::map<Ogre::SceneManager *, CSVRender::SceneWidget *>::const_iterator iter = mSceneWidgets.begin();
|
if(sceneManager)
|
||||||
for(; iter != mSceneWidgets.end(); ++iter)
|
|
||||||
{
|
{
|
||||||
if((*iter).first->hasSceneNode(sceneNodeName))
|
// update maps
|
||||||
{
|
mSceneNodeToRefId[sceneNodeName] = referenceId;
|
||||||
mSceneNodeToRefId[sceneNodeName] = referenceId;
|
mSceneNodeToMesh[sceneNodeName] = mesh;
|
||||||
mRefIdToSceneNode[referenceId][(*iter).first] = sceneNodeName;
|
mRefIdToSceneNode[referenceId][sceneManager] = sceneNodeName;
|
||||||
mSceneNodeToMesh[sceneNodeName] = mesh;
|
|
||||||
foundSceneManager = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if(!foundSceneManager)
|
|
||||||
{
|
{
|
||||||
std::cerr << "Attempt to add an object without a corresponding SceneManager: "
|
std::cerr << "Attempt to add an object without a corresponding SceneManager: "
|
||||||
+ referenceId + " : " + sceneNodeName << std::endl;
|
+ referenceId + " : " + sceneNodeName << std::endl;
|
||||||
|
@ -81,17 +75,7 @@ namespace CSVWorld
|
||||||
mSceneNodeToMesh.erase(sceneNodeName);
|
mSceneNodeToMesh.erase(sceneNodeName);
|
||||||
|
|
||||||
// find which SceneManager has this object
|
// find which SceneManager has this object
|
||||||
Ogre::SceneManager *sceneManager = NULL;
|
Ogre::SceneManager *sceneManager = findSceneManager(sceneNodeName);
|
||||||
std::map<Ogre::SceneManager *, CSVRender::SceneWidget *>::const_iterator iter = mSceneWidgets.begin();
|
|
||||||
for(; iter != mSceneWidgets.end(); ++iter)
|
|
||||||
{
|
|
||||||
if((*iter).first->hasSceneNode(sceneNodeName))
|
|
||||||
{
|
|
||||||
sceneManager = (*iter).first;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!sceneManager)
|
if(!sceneManager)
|
||||||
{
|
{
|
||||||
std::cerr << "Attempt to remove an object without a corresponding SceneManager: "
|
std::cerr << "Attempt to remove an object without a corresponding SceneManager: "
|
||||||
|
@ -121,7 +105,7 @@ namespace CSVWorld
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check whether the physics model be deleted
|
// check whether the physics model should be deleted
|
||||||
if(mRefIdToSceneNode.find(referenceId) == mRefIdToSceneNode.end())
|
if(mRefIdToSceneNode.find(referenceId) == mRefIdToSceneNode.end())
|
||||||
{
|
{
|
||||||
mEngine->removeRigidBody(referenceId);
|
mEngine->removeRigidBody(referenceId);
|
||||||
|
@ -130,9 +114,8 @@ namespace CSVWorld
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsSystem::replaceObject(const std::string &sceneNodeName,
|
void PhysicsSystem::replaceObject(const std::string &sceneNodeName, float scale,
|
||||||
float scale, const Ogre::Vector3 &position,
|
const Ogre::Vector3 &position, const Ogre::Quaternion &rotation, bool placeable)
|
||||||
const Ogre::Quaternion &rotation, bool placeable)
|
|
||||||
{
|
{
|
||||||
std::string referenceId = mSceneNodeToRefId[sceneNodeName];
|
std::string referenceId = mSceneNodeToRefId[sceneNodeName];
|
||||||
std::string mesh = mSceneNodeToMesh[sceneNodeName];
|
std::string mesh = mSceneNodeToMesh[sceneNodeName];
|
||||||
|
@ -143,13 +126,9 @@ namespace CSVWorld
|
||||||
mEngine->removeRigidBody(referenceId);
|
mEngine->removeRigidBody(referenceId);
|
||||||
mEngine->deleteRigidBody(referenceId);
|
mEngine->deleteRigidBody(referenceId);
|
||||||
|
|
||||||
// create the physics object
|
// create a new physics object
|
||||||
mEngine->createAndAdjustRigidBody(mesh,
|
mEngine->createAndAdjustRigidBody(mesh, referenceId, scale, position, rotation,
|
||||||
referenceId, scale, position, rotation,
|
0, 0, true, placeable);
|
||||||
0, // scaledBoxTranslation
|
|
||||||
0, // boxRotation
|
|
||||||
true, // raycasting
|
|
||||||
placeable);
|
|
||||||
|
|
||||||
// update other scene managers if they have the referenceId
|
// update other scene managers if they have the referenceId
|
||||||
// FIXME: rotation or scale not updated
|
// FIXME: rotation or scale not updated
|
||||||
|
@ -182,6 +161,7 @@ namespace CSVWorld
|
||||||
{
|
{
|
||||||
moveSceneNodeImpl(sceneNodeName, sceneNodeToRefId(sceneNodeName), position);
|
moveSceneNodeImpl(sceneNodeName, sceneNodeToRefId(sceneNodeName), position);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsSystem::addHeightField(Ogre::SceneManager *sceneManager,
|
void PhysicsSystem::addHeightField(Ogre::SceneManager *sceneManager,
|
||||||
float* heights, int x, int y, float yoffset, float triSize, float sqrtVerts)
|
float* heights, int x, int y, float yoffset, float triSize, float sqrtVerts)
|
||||||
{
|
{
|
||||||
|
@ -276,7 +256,7 @@ namespace CSVWorld
|
||||||
return mSceneNodeToRefId[sceneNodeName];
|
return mSceneNodeToRefId[sceneNodeName];
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsSystem::addSceneManager(Ogre::SceneManager *sceneMgr, CSVRender::SceneWidget * sceneWidget)
|
void PhysicsSystem::addSceneManager(Ogre::SceneManager *sceneMgr, CSVRender::SceneWidget *sceneWidget)
|
||||||
{
|
{
|
||||||
mSceneWidgets[sceneMgr] = sceneWidget;
|
mSceneWidgets[sceneMgr] = sceneWidget;
|
||||||
}
|
}
|
||||||
|
@ -291,6 +271,20 @@ namespace CSVWorld
|
||||||
mSceneWidgets.erase(sceneMgr);
|
mSceneWidgets.erase(sceneMgr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ogre::SceneManager *PhysicsSystem::findSceneManager(std::string sceneNodeName)
|
||||||
|
{
|
||||||
|
std::map<Ogre::SceneManager *, CSVRender::SceneWidget *>::const_iterator iter = mSceneWidgets.begin();
|
||||||
|
for(; iter != mSceneWidgets.end(); ++iter)
|
||||||
|
{
|
||||||
|
if((*iter).first->hasSceneNode(sceneNodeName))
|
||||||
|
{
|
||||||
|
return (*iter).first;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void PhysicsSystem::toggleDebugRendering(Ogre::SceneManager *sceneMgr)
|
void PhysicsSystem::toggleDebugRendering(Ogre::SceneManager *sceneMgr)
|
||||||
{
|
{
|
||||||
// FIXME: should check if sceneMgr is in the list
|
// FIXME: should check if sceneMgr is in the list
|
||||||
|
|
|
@ -85,6 +85,8 @@ namespace CSVWorld
|
||||||
void updateSelectionHighlight(std::string sceneNode, const Ogre::Vector3 &position);
|
void updateSelectionHighlight(std::string sceneNode, const Ogre::Vector3 &position);
|
||||||
|
|
||||||
std::string refIdToSceneNode(std::string referenceId, Ogre::SceneManager *sceneMgr);
|
std::string refIdToSceneNode(std::string referenceId, Ogre::SceneManager *sceneMgr);
|
||||||
|
|
||||||
|
Ogre::SceneManager *findSceneManager(std::string sceneNodeName);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue