//---------------------------------------------------------------
    ExportNode * ExportSceneGraph::create ( INode *iNode, ExportNode* parent, bool& isInVisualScene)
    {

        ExportNode * exportNode = new ExportNode ( iNode, parent );

		isInVisualScene = isNodeInVisualScene(iNode);

        int numberOfChildren = iNode->NumberOfChildren();

        for ( int i = 0; i < numberOfChildren; ++i )
        {
            INode * child = iNode->GetChildNode ( i );
			bool isChildInVisualScene;
            ExportNode * childExportNode = create ( child, exportNode, isChildInVisualScene );

			exportNode->add( childExportNode );

            if ( isChildInVisualScene )
               isInVisualScene = true;
        }

		exportNode->setId ( mNodeIdList.addId ( NativeString(iNode->GetName()) ) );
		mINodeExportNodeMap[iNode] = exportNode;
		exportNode->createControllerList();
		//createBones(exportNode);
		exportNode->setIsInVisualScene(isInVisualScene);

		return exportNode;
    }
	void ControllerExporter::determineReferencedJoints(ExportNode* exportNode, SkinController* skinController)
	{
		ISkinInterface* skinInterface = getISkinInterface( exportNode, skinController);

		int jointCount = skinInterface->getNumBones();

		ExportNodeSet referencedJoints;

		for (int i = 0; i <  jointCount; ++i)
		{
			// there should not be any null bone.
			// the ISkin::GetBone, not GetBoneFlat, function is called here.
			INode* boneNode = skinInterface->getBone(i);
			assert(boneNode);

			ExportNode* jointExportNode = mExportSceneGraph->getExportNode(boneNode);
			assert(jointExportNode);
			jointExportNode->setIsInVisualScene( true );

			referencedJoints.insert(jointExportNode);
		}

		determineSkeletonRoots(referencedJoints, exportNode->getControllerList());
		skinInterface->releaseMe();
	}