bool XmlODESettings::GetSettings(ODESimulator& sim) { string globals="globals"; TiXmlElement* c = e->FirstChildElement(globals); if(c) { printf("Parsing globals...\n"); //parse globals: gravity, etc Vector3 gravity; if(c->QueryValueAttribute("gravity",&gravity)==TIXML_SUCCESS) sim.SetGravity(gravity); double worldERP,worldCFM; if(c->QueryValueAttribute("ERP",&worldERP)==TIXML_SUCCESS) sim.SetERP(worldERP); if(c->QueryValueAttribute("CFM",&worldCFM)==TIXML_SUCCESS) sim.SetCFM(worldCFM); int maxContacts; if(c->QueryValueAttribute("maxContacts",&maxContacts)==TIXML_SUCCESS) sim.GetSettings().maxContacts = maxContacts; int rigidObjectCollisions,robotSelfCollisions,robotRobotCollisions; if(c->QueryValueAttribute("rigidObjectCollisions",&rigidObjectCollisions)==TIXML_SUCCESS) sim.GetSettings().rigidObjectCollisions = rigidObjectCollisions; if(c->QueryValueAttribute("robotSelfCollisions",&robotSelfCollisions)==TIXML_SUCCESS) sim.GetSettings().robotSelfCollisions = robotSelfCollisions; if(c->QueryValueAttribute("robotRobotCollisions",&robotRobotCollisions)==TIXML_SUCCESS) sim.GetSettings().robotRobotCollisions = robotRobotCollisions; } else c=e->FirstChildElement(); while(c!=NULL) { const char* name=c->Value(); printf("Parsing element %s\n",name); if(0 == strcmp(name,"env")) { int index; if(c->QueryValueAttribute("index",&index)==TIXML_SUCCESS) { Assert(index < (int)sim.numEnvs()); TiXmlElement* eg=c->FirstChildElement("geometry"); if(eg) { XmlODEGeometry g(eg); if(!g.Get(*sim.envMesh(index))) { fprintf(stderr,"Error reading environment geometry from XML\n"); return false; } } } else { fprintf(stderr,"Error reading environment index from XML file\n"); return false; } } else if(0 == strcmp(name,"object")) { int index; if(c->QueryValueAttribute("index",&index)==TIXML_SUCCESS) { Assert(index < (int)sim.numObjects()); TiXmlElement* eg=c->FirstChildElement("geometry"); if(eg) { XmlODEGeometry g(eg); if(!g.Get(*sim.object(index)->triMesh())) { fprintf(stderr,"Error reading object geometry from XML\n"); return false; } } } else { fprintf(stderr,"Error reading object index from XML file\n"); return false; } } else if(0 == strcmp(name,"robot")) { int index,bodyIndex=-1; if(c->QueryValueAttribute("index",&index)==TIXML_SUCCESS) { Assert(index < (int)sim.numRobots()); if(c->QueryValueAttribute("body",&bodyIndex)==TIXML_SUCCESS) { } else bodyIndex=-1; ODERobot* robot=sim.robot(index); TiXmlElement* eg=c->FirstChildElement("geometry"); if(eg) { XmlODEGeometry g(eg); if(bodyIndex < 0) { for(size_t i=0;i<robot->robot.links.size();i++) { if(robot->triMesh(i)) g.Get(*robot->triMesh(i)); } } else { Assert(bodyIndex < (int)robot->robot.links.size()); if(robot->triMesh(bodyIndex)) g.Get(*robot->triMesh(bodyIndex)); } } } else { fprintf(stderr,"Error reading robot index from XML file\n"); return false; } } c=c->NextSiblingElement(); } return true; }