#include "X3D_SceneSaver.h" #include "DFSGraphTraversal.h" #include "X3D_SceneSaverGetCoreVisitor.h" #include "X3D_SceneSaverSetCoreVisitor.h" #include "X3D_SceneSaverWriteCoreVisitor.h" #include "X3D_Scene.h" #include #include using namespace std; namespace X3DTK { namespace X3D { SceneSaver::SceneSaver() : X3DMultiPassProcessor() { setGraphTraversal("Get", new DFSGraphTraversal()); setComponentVisitor("Get", new SceneSaverGetCoreVisitor()); setGraphTraversal("Set", new DFSGraphTraversal()); setComponentVisitor("Set", new SceneSaverSetCoreVisitor()); setGraphTraversal("Write", new DFSGraphTraversal()); setComponentVisitor("Write", new SceneSaverWriteCoreVisitor()); } SceneSaver::~SceneSaver() { Singleton::removeInstance(); } void SceneSaver::saveAs(Scene *S, const SFString &fileName) { if (S == 0) { cx3d << "unable to write to file, because the Scene is NULL!" << endl; return; } Singleton::getInstance()->init(); traverse("Get", S); traverse("Set", S); Singleton::getInstance()->initNodes(); ofstream output(fileName); output << "" << endl; output << "" << endl; output << " " << endl; std::list > history = S->getProcessHistory().getProcessMap(); for (std::list >::const_iterator h = history.begin(); h != history.end(); ++h) output << " " << endl; output << " " << endl; traverse("Write", S); MFString text = Singleton::getInstance()->getOutput(); for (MFString::const_iterator l = text.begin(); l != text.end(); ++l) output << (*l) << endl; output << "" << endl; Singleton::getInstance()->finish(); } void SceneSaver::save(Scene *S) { saveAs(S, S->getFileName()); } } }