void ExteriorCellRender::destroyAllAttachedMovableObjects(Ogre::SceneNode* i_pSceneNode) { if ( !i_pSceneNode ) { assert( false ); return; } // Destroy all the attached objects SceneNode::ObjectIterator itObject = i_pSceneNode->getAttachedObjectIterator(); while ( itObject.hasMoreElements() ) { MovableObject* pObject = static_cast<MovableObject*>(itObject.getNext()); i_pSceneNode->getCreator()->destroyMovableObject( pObject ); } // Recurse to child SceneNodes SceneNode::ChildNodeIterator itChild = i_pSceneNode->getChildIterator(); while ( itChild.hasMoreElements() ) { SceneNode* pChildNode = static_cast<SceneNode*>(itChild.getNext()); destroyAllAttachedMovableObjects( pChildNode ); } }
Object::~Object() { // Notify projectiles that the object is toast clearAllTrackers(); //cout << "Collecting " << name_ << endl; // Un-track if (target_) target_->removeTracker(this); // Clean up physics game_->getWorld()->removeCollisionObject(body_.get()); // Destroy all subobjects subObjects_.clear(); // Destroy objects attached to the scene node while (node_->numAttachedObjects() > 0) { MovableObject* obj = node_->getAttachedObject(0U); node_->detachObject((unsigned short)0U); node_->getCreator()->destroyMovableObject(obj->getName(), obj->getMovableType()); } // Destroy all attached entities and scene nodes SceneNode::ChildNodeIterator i = node_->getChildIterator(); while (i.hasMoreElements()) { SceneNode* node = static_cast<SceneNode*>(i.getNext()); MovableObject* obj = node->getAttachedObject(0U); node->detachObject((unsigned short)0U); node->getCreator()->destroyMovableObject(obj->getName(), obj->getMovableType()); } node_->removeAndDestroyAllChildren(); node_->getParentSceneNode()->removeAndDestroyChild(node_->getName()); // Clean up scripting lua_State* env = game_->getScriptState(); StackCheck check(env); lua_getref(env, table_); lua_pushnil(env); lua_setfield(env, -2, "__thiscpp"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "addEntity"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "setEntity"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "addParticleSystem"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "setParticleSystem"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "set"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "explode"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "destroy"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "target"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "setPosition"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "getPosition"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "setVelocity"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "getVelocity"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "setOrientation"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "getOrientation"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "createMissile"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "getTarget"); lua_pushcclosure(env, &Object::luaWarningDestroyed, 0); lua_setfield(env, -2, "setTarget"); lua_unref(env, table_); }