Exemple #1
0
 KDNode<T> *findNodeHelper(KDNode<T> *node, const KDNode<T> *searchNode) {
     if(node == NULL) {
         return NULL;
     } else if(node->equals(searchNode)) {
         return node;
     } else {
         BinaryDecision binaryDecision = node->getNextDirection(searchNode);
         if(binaryDecision == LEFT) {
             return findNodeHelper(node->left, searchNode);
         } else {
             return findNodeHelper(node->right, searchNode);
         }
     }
 }
Exemple #2
0
 KDNode<T> * findNode(const std::vector<T> &data) {
     KDNode<T> searchNode = KDNode<T>::createTempNode(data);
     return findNodeHelper(root, const_cast<KDNode<T> *>(&searchNode));
 }
void VRMLFile::addRoute(const Char8  *szOutNodename,
                        const Char8  *szOutFieldname,
                        const Char8  *szInNodename,
                        const Char8  *szInFieldname )
{
    if(szOutNodename == NULL || szOutFieldname == NULL ||
       szInNodename  == NULL || szInFieldname  == NULL  )
    {
        FWARNING(("addRoute missing params\n"));
    }

    FieldContainer *pSrcNode = findReference(szOutNodename);
    FieldContainer *pDstNode = findReference(szInNodename);

    AttachmentContainer *pSrc = dynamic_cast<AttachmentContainer *>(pSrcNode);
    AttachmentContainer *pDst = dynamic_cast<AttachmentContainer *>(pDstNode);

    if(pSrc == NULL)
    {
        FWARNING(("Unknow src node %s\n", szOutNodename));
        return;
    }

    if(pDstNode == NULL)
    {
        FWARNING(("Unknow dst node %s\n", szInNodename));
        return;
    }

    VRMLGenericAtt *pSrcAtt = dynamic_cast<VRMLGenericAtt *>(
        pSrc->findAttachment(VRMLGenericAtt::getClassType()));

    VRMLGenericAtt *pDstAtt = NULL;

    if(pDst != NULL)
    {
        pDstAtt = dynamic_cast<VRMLGenericAtt *>(
            pDst->findAttachment(VRMLGenericAtt::getClassType()));
    }

    if(pSrcAtt == NULL)
    {
        Node *pNode = dynamic_cast<Node *>(pSrc);

        if(pNode != NULL && pNode->getCore() != NULL)
        {
            pSrcAtt = dynamic_cast<VRMLGenericAtt *>(
                pNode->getCore()->findAttachment(
                    VRMLGenericAtt::getClassType())); 
        }
    }

    if(pDstAtt == NULL)
    {
        Node *pNode = dynamic_cast<Node *>(pDst);

        if(pNode != NULL && pNode->getCore() != NULL)
        {
            pDstAtt = dynamic_cast<VRMLGenericAtt *>(
                pNode->getCore()->findAttachment(
                    VRMLGenericAtt::getClassType())); 
        }
    }

   
    std::string szOutFName = szOutFieldname;
    std::string szInFName  = szInFieldname;

    
    std::string::size_type uiPos = szOutFName.rfind(std::string("_changed"));


    if(uiPos != std::string::npos)
    {
        szOutFName.erase(uiPos, std::string::npos);
    }
    
    uiPos = szInFName.find(std::string("set_"));

    if(uiPos != std::string::npos)
    {
        szInFName.erase(uiPos, uiPos + 4);
    }


    if(pSrcAtt != NULL)
    {
        VRMLNodeHelper *pHelper = findNodeHelper(
            pSrcAtt->getVrmlNodeTypename().c_str());

        if(pHelper != NULL)
        {
            pHelper->mapFieldname(pSrcAtt->getVrmlNodeTypename(), szOutFName);
        }
    }

    if(pSrcAtt != NULL)
    {
        VRMLNodeHelper *pHelper = findNodeHelper(
            pDstAtt->getVrmlNodeTypename().c_str());

        if(pHelper != NULL)
        {
            pHelper->mapFieldname(pDstAtt->getVrmlNodeTypename(), szInFName);
        }
    }

    addConnection(pSrc,     szOutFName.c_str(),
                  pDstNode, szInFName .c_str());
}
void VRMLFile::beginNode(const Char8     *szNodeTypename,
                         const Char8     *szNodename,
                         const BitVector  bvLocalFlags  )
{
    SceneFileHandler::the()->updateReadProgress();

    FieldContainerUnrecPtr pNewNode;

#ifdef OSG_DEBUG_VRML
    indentLog(VRMLNodeHelper::getIndent(), PINFO);
    PINFO << "Begin Node " << szNodeTypename << std::endl;

    VRMLNodeHelper::incIndent();
#endif

    VRMLNodeHelper *pOldHelper = _pCurrNodeHelper;

    _pCurrNodeHelper = findNodeHelper(szNodeTypename);

    _sNodeHelpers.push(_pCurrNodeHelper);

    if(_pCurrNodeHelper == NULL)
    {
        std::string szTmp = "Unknow node type '#";

        szTmp += szNodeTypename;
        szTmp += "#";

        Inherited::handleError(szTmp.c_str());

        return;
    }

    _pCurrNodeHelper->reset();

    pNewNode = _pCurrNodeHelper->beginNode( szNodeTypename,
                                            szNodename,
                                           _pCurrentFC);


    if(szNodename != NULL)
    {
        if(pNewNode != NULL)
        {
            std::string szKey = szNodename;

            AttachmentContainer *pAttC = 
                dynamic_pointer_cast<AttachmentContainer>(pNewNode);

            if(pAttC != NULL)
            {
                setName(pAttC, szKey);
            }

            // amz - I removed the map checks that's more spec conform.
            // From the spec:
            // If multiple nodes are given the same name,
            // each USE statement refers to the closest node with the given
            // name preceding it 
            // in either the VRML file or prototype definition.
                
            //NameContainerMap::iterator mIt = _nameFCMap.find(szKey);
            //if(mIt == _nameFCMap.end())
            {
                _nameFCMap[szKey] = pNewNode;
            }
//            else
//            {
//                PWARNING << "Did not add fieldContainer with name "
//                         << szKey
//                         << " a second time"
//                         << std::endl;
//            }

        }
    }

    if(pOldHelper != NULL)
    {
        pOldHelper->setContainerFieldValue( pNewNode,
                                           _pCurrentFieldDesc,
                                           _pCurrentFieldFC  );
    }

    _pCurrentFC = pNewNode;

    _fcStack.push(_pCurrentFC);

    if(_fcStack.size() == 1)
    {
        Node *pNode = dynamic_cast<Node *>(_pCurrentFC.get());

        if(pNode != NULL)
        {
            if(_pSceneRootNode == NULL)
            {
                _pSceneRootNode = Node::create();

                _pSceneRootNode->setCore(Group::create());
            }

            _pSceneRootNode->addChild(pNode);
        }
    }
}