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); } } }
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); } } }