bool UrdfParser::parseMaterial(UrdfMaterial& material, TiXmlElement *config, ErrorLogger* logger) { if (!config->Attribute("name")) { logger->reportError("Material must contain a name attribute"); return false; } material.m_name = config->Attribute("name"); // texture TiXmlElement *t = config->FirstChildElement("texture"); if (t) { if (t->Attribute("filename")) { material.m_textureFilename = t->Attribute("filename"); } } if (material.m_textureFilename.length()==0) { //logger->reportWarning("material has no texture file name"); } // color TiXmlElement *c = config->FirstChildElement("color"); if (c) { if (c->Attribute("rgba")) { if (!parseVector4(material.m_rgbaColor,c->Attribute("rgba"))) { std::string msg = material.m_name+" has no rgba"; logger->reportWarning(msg.c_str()); } } } return true; }
void GuiWindowDef::constructFromTokens(parser::DefTokeniser& tokeniser) { // The windowDef keyword has already been parsed, so expect a name plus an opening brace here name = tokeniser.nextToken(); tokeniser.assertNextToken("{"); while (tokeniser.hasMoreTokens()) { std::string token = tokeniser.nextToken(); boost::algorithm::to_lower(token); if (token == "rect") { rect = parseVector4(tokeniser); } else if (token == "visible") { visible = parseBool(tokeniser); } else if (token == "notime") { notime = parseBool(tokeniser); } else if (token == "forecolor") { forecolor = parseVector4(tokeniser); } else if (token == "backcolor") { backcolor = parseVector4(tokeniser); } else if (token == "bordercolor") { bordercolor = parseVector4(tokeniser); } else if (token == "matcolor") { matcolor = parseVector4(tokeniser); } else if (token == "rotate") { rotate = parseFloat(tokeniser); } else if (token == "text") { setText(parseString(tokeniser)); } else if (token == "font") { font = parseString(tokeniser); // Cut off the "fonts/" part boost::algorithm::replace_first(font, "fonts/", ""); } else if (token == "textscale") { textscale = parseFloat(tokeniser); } else if (token == "textalign") { textalign = parseInt(tokeniser); } else if (token == "textalignx") { textalignx = parseFloat(tokeniser); } else if (token == "textaligny") { textaligny = parseFloat(tokeniser); } else if (token == "forceaspectwidth") { forceaspectwidth = parseFloat(tokeniser); } else if (token == "forceaspectheight") { forceaspectheight = parseFloat(tokeniser); } else if (token == "background") { background = parseString(tokeniser); } else if (token == "noevents") { noevents = parseBool(tokeniser); } else if (token == "nocursor") { nocursor = parseBool(tokeniser); } else if (token == "noclip") { noclip = parseBool(tokeniser); } else if (token == "nowrap") { nowrap = parseBool(tokeniser); } else if (token == "modal") { noevents = parseBool(tokeniser); } else if (token == "menugui") { menugui = parseBool(tokeniser); } else if (token == "windowdef") { // Child windowdef GuiWindowDefPtr window(new GuiWindowDef(_owner)); window->constructFromTokens(tokeniser); addWindow(window); } else if (token == "ontime") { std::string timeStr = tokeniser.nextToken(); // Check the time for validity std::size_t time = string::convert<std::size_t>( timeStr, std::numeric_limits<std::size_t>::max() ); if (time == std::numeric_limits<std::size_t>::max()) { rWarning() << "Invalid time encountered in onTime event in " << name << ": " << timeStr << std::endl; } // Allocate a new GuiScript GuiScriptPtr script(new GuiScript(*this)); script->constructFromTokens(tokeniser); _timedEvents.insert(TimedEventMap::value_type(time, script)); } else if (token == "onnamedevent") { std::string eventName = tokeniser.nextToken(); // Parse the script GuiScriptPtr script(new GuiScript(*this)); script->constructFromTokens(tokeniser); // TODO: Save event } else if (token == "onevent") { GuiScriptPtr script(new GuiScript(*this)); script->constructFromTokens(tokeniser); // TODO } else if (token == "onesc") { GuiScriptPtr script(new GuiScript(*this)); script->constructFromTokens(tokeniser); // TODO } else if (token == "onmouseenter" || token == "onmouseexit") { GuiScriptPtr script(new GuiScript(*this)); script->constructFromTokens(tokeniser); // TODO } else if (token == "onaction") { GuiScriptPtr script(new GuiScript(*this)); script->constructFromTokens(tokeniser); // TODO } else if (token == "float" || token == "definefloat") { // TODO: Add variable std::string variableName = tokeniser.nextToken(); } else if (token == "definevec4") { // TODO: Add variable std::string variableName = tokeniser.nextToken(); parseVector4(tokeniser); } else if (token == "}") { break; } else { rWarning() << "Unknown token encountered in GUI: " << token << std::endl; } } }
bool UrdfParser::parseVisual(UrdfModel& model, UrdfVisual& visual, TiXmlElement* config, ErrorLogger* logger) { visual.m_linkLocalFrame.setIdentity(); if(m_parseSDF) { TiXmlElement* pose = config->FirstChildElement("pose"); if (pose) { parseTransform(visual.m_linkLocalFrame, pose,logger,m_parseSDF); } } // Origin TiXmlElement *o = config->FirstChildElement("origin"); if (o) { if (!parseTransform(visual.m_linkLocalFrame, o,logger)) return false; } // Geometry TiXmlElement *geom = config->FirstChildElement("geometry"); if (!parseGeometry(visual.m_geometry,geom,logger)) { return false; } const char *name_char = config->Attribute("name"); if (name_char) visual.m_name = name_char; visual.m_hasLocalMaterial = false; // Material TiXmlElement *mat = config->FirstChildElement("material"); //todo(erwincoumans) skip materials in SDF for now (due to complexity) if (mat) { if (m_parseSDF) { UrdfMaterial* matPtr = new UrdfMaterial; matPtr->m_name = "mat"; if (name_char) matPtr->m_name = name_char; TiXmlElement *diffuse = mat->FirstChildElement("diffuse"); if (diffuse) { std::string diffuseText = diffuse->GetText(); btVector4 rgba(1,0,0,1); parseVector4(rgba,diffuseText); matPtr->m_rgbaColor = rgba; model.m_materials.insert(matPtr->m_name.c_str(),matPtr); visual.m_materialName = matPtr->m_name; visual.m_hasLocalMaterial = true; } } else { // get material name if (!mat->Attribute("name")) { logger->reportError("Visual material must contain a name attribute"); return false; } visual.m_materialName = mat->Attribute("name"); // try to parse material element in place TiXmlElement *t = mat->FirstChildElement("texture"); TiXmlElement *c = mat->FirstChildElement("color"); if (t||c) { if (parseMaterial(visual.m_localMaterial, mat,logger)) { UrdfMaterial* matPtr = new UrdfMaterial(visual.m_localMaterial); model.m_materials.insert(matPtr->m_name.c_str(),matPtr); visual.m_hasLocalMaterial = true; } } } } return true; }