SceneNode * PCZSceneManager::createSceneNode( void )
    {
        SceneNode * on = createSceneNodeImpl();
        mSceneNodes[ on->getName() ] = on;
		// create any zone-specific data necessary
		createZoneSpecificNodeData((PCZSceneNode*)on);
		// return pointer to the node
        return on;
    }
	DSceneNode* DSceneManager::createSceneNode( const DString& name )
	{
		SceneNodeMap::iterator i = mSceneNodeMap.find(name);
		if (i != mSceneNodeMap.end())
		{
			return i->second;
		}
		DSceneNode* n = createSceneNodeImpl(name);
		mSceneNodeMap[name] = n;
		return n;
	}
	DSceneNode* DSceneManager::createSceneNode()
	{
		DSceneNode* ret;
		DSceneNode* n = createSceneNodeImpl();
		SceneNodeMap::iterator i = mSceneNodeMap.find(n->getName());
		if (i != mSceneNodeMap.end())
		{
			ret = n;
			mSceneNodeMap[n->getName()] = n;
		}
		else
		{
			destroySceneNodeImpl(n);
			ret = i->second;
		}
		return ret;
	}
    SceneNode * PCZSceneManager::createSceneNode( const String &name )
    {
        // Check name not used
        if (mSceneNodes.find(name) != mSceneNodes.end())
        {
            OGRE_EXCEPT(
                Exception::ERR_DUPLICATE_ITEM,
                "A scene node with the name " + name + " already exists",
                "PCZSceneManager::createSceneNode" );
        }
        SceneNode * on = createSceneNodeImpl( name );
        mSceneNodes[ on->getName() ] = on;
		// create any zone-specific data necessary
		createZoneSpecificNodeData((PCZSceneNode*)on);
		// return pointer to the node
        return on;
    }