Refactor duplicate code sections.

This commit is contained in:
cc9cii 2014-11-02 18:13:25 +11:00
parent 49d416353e
commit 3796240b19
2 changed files with 32 additions and 36 deletions

View file

@ -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

View file

@ -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);
}; };
} }