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);
	}
}
Exemple #2
0
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;
}
Exemple #4
0
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;
}