// ------------------------------------------------------------------------------------------------
void ColladaModelFactory::ProcessXml(xml_node * rootXml, Model3dBuilder * builder)
{
    // process images
    xml_node* images = FindChildByName(rootXml, "library_images");
    for(xml_node* node = FindChildByName(images, "image"); node != NULL; node=FindNextByName(node, "image"))
    {
        ProcessImage(builder, node);
    }

    // process materials
    xml_node* mats = FindChildByName(rootXml, "library_materials");
    for(xml_node* node = FindChildByName(mats, "material"); node != NULL; node=FindNextByName(node, "material"))
    {
        ProcessMaterial(builder, node);
    }

    // process effects
    xml_node* effects = FindChildByName(rootXml, "library_effects");
    for(xml_node* node = FindChildByName(effects, "effect"); node != NULL; node=FindNextByName(node, "effect"))
    {
        ProcessEffect(builder, node);
    }

    // process geometries
    xml_node* geos = FindChildByName(rootXml, "library_geometries");
    for(xml_node* node = FindChildByName(geos, "geometry"); node != NULL; node=FindNextByName(node, "geometry"))
    {
        ProcessGeo(builder, node);
    }

    // process controllers
    ControllerToGeo controllerToGeo;
    xml_node* controllers = FindChildByName(rootXml, "library_controllers");
    for(xml_node* node = FindChildByName(controllers, "controller"); node != NULL; node=FindNextByName(node, "controller"))
    {
        ProcessController(node, &controllerToGeo);
    }

    // process visual scene
    xml_node* scenes = FindChildByName(rootXml, "library_visual_scenes");
    xml_node* scene = FindChildByName(scenes, "visual_scene");  // just grab the 1st visual scene
    if(scene)
    {
        const char * nodeName = GetAttributeText(scene, "id", true);
        if (!nodeName)
        {
            nodeName = "!missing-id!";
        }
        Node * rootNode = builder->m_model->CreateNode(nodeName);

        builder->m_model->SetRoot(rootNode);
        ProcessChildNodes(builder, scene, rootNode, &controllerToGeo);
    }
}
Пример #2
-1
		void FbxLoader::LoadFromFile(const std::string& folder, const std::string& name, AxisMode axismode, float scaleFactor)
		{
			FbxManager* fbxManager = FbxManager::Create();
			FbxIOSettings* ios = FbxIOSettings::Create(fbxManager, IOSROOT);
			fbxManager->SetIOSettings(ios);


			std::string path = folder + "\\" + name;
			relativeFolder = folder;
			FbxImporter* importer = (FbxImporter::Create(fbxManager, ""));
			bool b = importer->Initialize(path.c_str(), -1, fbxManager->GetIOSettings());
			if(!b) {
			}
			scene = FbxScene::Create(fbxManager, path.c_str());
			importer->Import(scene);
			

			int fileMajor, fileMinor, fileRevision;
			importer->GetFileVersion(fileMajor, fileMinor, fileRevision);
			importer->Destroy();

			factor = scaleFactor;
			this->axismode = axismode;
			FbxNode* root = scene->GetRootNode();
			
			FbxGeometryConverter geometryConverter(fbxManager);
						
			FbxAxisSystem axis = FbxAxisSystem::MayaYUp;	
			axis.ConvertScene(scene);
			
			geometryConverter.Triangulate(scene, false);

			ProcessMaterial(scene);

			LoadAnimationClipData();

			ProcessMeshNode(root, rootNode);			
		}