void FunctionTree::traverseRecursive(Function* parent, Function** writeNode, int* remaining){ if (*remaining==0) { *writeNode = parent; } if((parent->l!=NULL)&&(*remaining > 0)){ *remaining -= 1; traverseRecursive(parent->l, writeNode, remaining); } if((parent->r!=NULL)&&(*remaining > 0)){ *remaining -= 1; traverseRecursive(parent->r, writeNode, remaining); } }
void DotXsiLoader::process(ExporterBackend& backend, OutSerializer& serializer, bool oneObject) { m_serializer = &serializer; ZENIC_ASSERT(m_serializer); buildImages(backend); buildMaterials(backend); SceneInfo* sceneInfo = zenic_new SceneInfo; sceneInfo->setLength(10.0f); // TODO: Fix this length if (!oneObject) m_serializer->add(sceneInfo); traverseRecursive(m_scene->Root(), backend, *sceneInfo, 0, oneObject); for (std::vector<CSLModel*>::iterator i = m_meshList.begin(); i != m_meshList.end(); ++i) { CSLModel* model = (*i); Node* parentNode = 0; if (model->Parent()) parentNode = backend.findNode(model->Parent()); Node* node = backend.buildModel(*i); if (parentNode && node && !oneObject) parentNode->attachChild(node); // If we only want to export one object just add the first we find and exit the loop if (oneObject) { m_serializer->add(node); break; } } // saveMaterialAndImages(); }
Function *FunctionTree::traverse(int remaining){ Function *writeNode = NULL; traverseRecursive(rootNode, &writeNode, &remaining); return writeNode; }
Node* DotXsiLoader::traverseRecursive(CSLModel* child, ExporterBackend& backend, SceneInfo& sceneInfo, int level, bool oneObject) { Node* node = 0; char* name = child->GetName(); for (int i = 0; i < level; ++i) zenic::logOut << " "; ZENIC_INFO("Name " << child->Name().GetText()); CSLTemplate::ETemplateType type = child->GetPrimitiveType(); switch (child->GetPrimitiveType()) { case CSLTemplate::XSI_MESH : { addModel(child); break; } case CSLTemplate::SI_NULL_OBJECT : { // TODO: Do this in a proper way if (strstr(child->GetName(), "Glenz")) { node = backend.buildGlenz(child); } else if (strstr(child->GetName(), "Camera")) { node = backend.buildCamera(child); sceneInfo.setPrimaryCamera(reinterpret_cast<Camera*>(node)); } else { node = backend.buildNode(child); if (!sceneInfo.rootNode()) sceneInfo.setRootNode(node); } break; } default : { node = backend.buildNode(child); if (!sceneInfo.rootNode()) sceneInfo.setRootNode(node); break; } } if (node && !oneObject) m_serializer->add(node); backend.addMapNode(child, node); CSLModel** childList = child->GetChildrenList(); if (childList) { for (int i = 0; i < child->GetChildrenCount(); ++i) { Node* recNode = traverseRecursive(childList[i], backend, sceneInfo, level+1, oneObject); if (node && recNode) node->attachChild(recNode); } } return node; }