//----------------------------------------------------------------------- MovableObject* SceneNode::detachObject(unsigned short index) { MovableObject* ret; if (index < mObjectsByName.size()) { ObjectMap::iterator i = mObjectsByName.begin(); // Increment (must do this one at a time) while (index--)++i; ret = i->second; mObjectsByName.erase(i); ret->_notifyAttached((SceneNode*)0); // Make sure bounds get updated (must go right to the top) needUpdate(); return ret; } else { OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Object index out of bounds.", "SceneNode::getAttchedEntity"); } }
//----------------------------------------------------------------------- void SceneNode::detachAllObjects(void) { ObjectMap::iterator itr; for ( itr = mObjectsByName.begin(); itr != mObjectsByName.end(); ++itr ) { MovableObject* ret = itr->second; ret->_notifyAttached((SceneNode*)0); } mObjectsByName.clear(); // Make sure bounds get updated (must go right to the top) needUpdate(); }
//----------------------------------------------------------------------- SceneNode::~SceneNode() { // Detach all objects, do this manually to avoid needUpdate() call // which can fail because of deleted items ObjectMap::iterator itr; for ( itr = mObjectsByName.begin(); itr != mObjectsByName.end(); ++itr ) { MovableObject* ret = itr->second; ret->_notifyAttached((SceneNode*)0); } mObjectsByName.clear(); OGRE_DELETE mWireBoundingBox; }
//----------------------------------------------------------------------- MovableObject* SceneNode::detachObject(const String& name) { ObjectMap::iterator it = mObjectsByName.find(name); if (it == mObjectsByName.end()) { OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Object " + name + " is not attached " "to this node.", "SceneNode::detachObject"); } MovableObject* ret = it->second; mObjectsByName.erase(it); ret->_notifyAttached((SceneNode*)0); // Make sure bounds get updated (must go right to the top) needUpdate(); return ret; }