60d4a48
diff -up ./src/parser_urdf.cc.urdf3 ./src/parser_urdf.cc
60d4a48
--- ./src/parser_urdf.cc.urdf3	2014-04-11 14:42:48.000000000 -0400
60d4a48
+++ ./src/parser_urdf.cc	2014-05-26 14:31:34.251525903 -0400
60d4a48
@@ -28,6 +28,8 @@
60d4a48
 
60d4a48
 using namespace sdf;
60d4a48
 
60d4a48
+#undef USE_EXTERNAL_URDF
60d4a48
+
60d4a48
 typedef boost::shared_ptr<urdf::Collision> UrdfCollisionPtr;
60d4a48
 typedef boost::shared_ptr<urdf::Visual> UrdfVisualPtr;
60d4a48
 typedef boost::shared_ptr<urdf::Link> UrdfLinkPtr;
60d4a48
@@ -298,7 +300,12 @@ std::string Vector32Str(const urdf::Vect
60d4a48
 
60d4a48
 ////////////////////////////////////////////////////////////////////////////////
60d4a48
 void ReduceCollisionToParent(UrdfLinkPtr _link,
60d4a48
-    const std::string &_groupName, UrdfCollisionPtr _collision)
60d4a48
+#if USE_EXTERNAL_URDF
60d4a48
+    const std::string &_groupName,
60d4a48
+#else
60d4a48
+    const std::string &/*_groupName*/,
60d4a48
+#endif
60d4a48
+    UrdfCollisionPtr _collision)
60d4a48
 {
60d4a48
   boost::shared_ptr<std::vector<UrdfCollisionPtr> > cols;
60d4a48
 #if USE_EXTERNAL_URDF
60d4a48
@@ -312,9 +319,6 @@ void ReduceCollisionToParent(UrdfLinkPtr
60d4a48
     cols = boost::shared_ptr<std::vector<UrdfCollisionPtr> >(
60d4a48
             &_link->collision_array);
60d4a48
   }
60d4a48
-#else
60d4a48
-  cols = _link->getCollisions(_groupName);
60d4a48
-#endif
60d4a48
 
60d4a48
   if (!cols)
60d4a48
   {
60d4a48
@@ -323,22 +327,37 @@ void ReduceCollisionToParent(UrdfLinkPtr
60d4a48
     // new group name, create add vector to map and add Collision to the vector
60d4a48
     _link->collision_groups.insert(make_pair(_groupName, cols));
60d4a48
   }
60d4a48
+#else
60d4a48
+  cols = boost::shared_ptr<std::vector<UrdfCollisionPtr> >(
60d4a48
+          &_link->collision_array);
60d4a48
+#endif
60d4a48
 
60d4a48
-  // group exists, add Collision to the vector in the map
60d4a48
+  // add Collision to the vector of collisions in link
60d4a48
   std::vector<UrdfCollisionPtr>::iterator colIt =
60d4a48
     find(cols->begin(), cols->end(), _collision);
60d4a48
+
60d4a48
   if (colIt != cols->end())
60d4a48
     sdfwarn << "attempted to add collision to link ["
60d4a48
       << _link->name
60d4a48
+#if USE_EXTERNAL_URDF
60d4a48
       << "], but it already exists under group ["
60d4a48
       << _groupName << "]\n";
60d4a48
+#else
60d4a48
+      << "], but it already exists in link\n";
60d4a48
+#endif
60d4a48
+
60d4a48
   else
60d4a48
     cols->push_back(_collision);
60d4a48
 }
60d4a48
 
60d4a48
 ////////////////////////////////////////////////////////////////////////////////
60d4a48
 void ReduceVisualToParent(UrdfLinkPtr _link,
60d4a48
-    const std::string &_groupName, UrdfVisualPtr _visual)
60d4a48
+#if USE_EXTERNAL_URDF
60d4a48
+    const std::string &_groupName,
60d4a48
+#else
60d4a48
+    const std::string &/*_groupName*/,
60d4a48
+#endif
60d4a48
+    UrdfVisualPtr _visual)
60d4a48
 {
60d4a48
   boost::shared_ptr<std::vector<UrdfVisualPtr> > viss;
60d4a48
 #if USE_EXTERNAL_URDF
60d4a48
@@ -351,9 +370,6 @@ void ReduceVisualToParent(UrdfLinkPtr _l
60d4a48
   {
60d4a48
     viss = boost::shared_ptr<std::vector<UrdfVisualPtr> >(&_link->visual_array);
60d4a48
   }
60d4a48
-#else
60d4a48
-  viss = _link->getVisuals(_groupName);
60d4a48
-#endif
60d4a48
 
60d4a48
   if (!viss)
60d4a48
   {
60d4a48
@@ -365,15 +381,23 @@ void ReduceVisualToParent(UrdfLinkPtr _l
60d4a48
     sdfdbg << "successfully added a new visual group name ["
60d4a48
           << _groupName << "]\n";
60d4a48
   }
60d4a48
+#else
60d4a48
+  viss = boost::shared_ptr<std::vector<UrdfVisualPtr> >(&_link->visual_array);
60d4a48
+#endif
60d4a48
 
60d4a48
   // group exists, add Visual to the vector in the map if it's not there
60d4a48
   std::vector<UrdfVisualPtr>::iterator visIt
60d4a48
     = find(viss->begin(), viss->end(), _visual);
60d4a48
+
60d4a48
   if (visIt != viss->end())
60d4a48
     sdfwarn << "attempted to add visual to link ["
60d4a48
       << _link->name
60d4a48
+#if USE_EXTERNAL_URDF
60d4a48
       << "], but it already exists under group ["
60d4a48
       << _groupName << "]\n";
60d4a48
+#else
60d4a48
+      << "], but it already exists in link.\n";
60d4a48
+#endif
60d4a48
   else
60d4a48
     viss->push_back(_visual);
60d4a48
 }
60d4a48
@@ -844,6 +868,7 @@ void ReduceVisualsToParent(UrdfLinkPtr _
60d4a48
   // "lump::"+group name+"::'+_link name
60d4a48
   // lump but keep the _link name in(/as) the group name,
60d4a48
   // so we can correlate visuals to visuals somehow.
60d4a48
+#if USE_EXTERNAL_URDF
60d4a48
   for (std::map
60d4a48
       boost::shared_ptr<std::vector<UrdfVisualPtr> > >::iterator
60d4a48
       visualsIt = _link->visual_groups.begin();
60d4a48
@@ -888,6 +913,21 @@ void ReduceVisualsToParent(UrdfLinkPtr _
60d4a48
       }
60d4a48
     }
60d4a48
   }
60d4a48
+#else
60d4a48
+  std::string lumpGroupName = std::string("lump::")+_link->name;
60d4a48
+  for (std::vector<UrdfVisualPtr>::iterator
60d4a48
+      visualIt = _link->visual_array.begin();
60d4a48
+      visualIt != _link->visual_array.end(); ++visualIt)
60d4a48
+  {
60d4a48
+    // transform visual origin from _link frame to
60d4a48
+    // parent link frame before adding to parent
60d4a48
+    (*visualIt)->origin = TransformToParentFrame((*visualIt)->origin,
60d4a48
+        _link->parent_joint->parent_to_joint_origin_transform);
60d4a48
+    // add the modified visual to parent
60d4a48
+    ReduceVisualToParent(_link->getParent(), lumpGroupName,
60d4a48
+        *visualIt);
60d4a48
+  }
60d4a48
+#endif
60d4a48
 }
60d4a48
 
60d4a48
 /////////////////////////////////////////////////
60d4a48
@@ -899,6 +939,7 @@ void ReduceCollisionsToParent(UrdfLinkPt
60d4a48
   // "lump::"+group name+"::'+_link name
60d4a48
   // lump but keep the _link name in(/as) the group name,
60d4a48
   // so we can correlate visuals to collisions somehow.
60d4a48
+#if USE_EXTERNAL_URDF
60d4a48
   for (std::map
60d4a48
       boost::shared_ptr<std::vector<UrdfCollisionPtr> > >::iterator
60d4a48
       collisionsIt = _link->collision_groups.begin();
60d4a48
@@ -951,6 +992,23 @@ void ReduceCollisionsToParent(UrdfLinkPt
60d4a48
     }
60d4a48
   }
60d4a48
   // this->PrintCollisionGroups(_link->getParent());
60d4a48
+#else
60d4a48
+  std::string lumpGroupName = std::string("lump::")+_link->name;
60d4a48
+  for (std::vector<UrdfCollisionPtr>::iterator
60d4a48
+      collisionIt = _link->collision_array.begin();
60d4a48
+      collisionIt != _link->collision_array.end(); ++collisionIt)
60d4a48
+  {
60d4a48
+    // transform collision origin from _link frame to
60d4a48
+    // parent link frame before adding to parent
60d4a48
+    (*collisionIt)->origin = TransformToParentFrame(
60d4a48
+        (*collisionIt)->origin,
60d4a48
+        _link->parent_joint->parent_to_joint_origin_transform);
60d4a48
+
60d4a48
+    // add the modified collision to parent
60d4a48
+    ReduceCollisionToParent(_link->getParent(), lumpGroupName,
60d4a48
+        *collisionIt);
60d4a48
+  }
60d4a48
+#endif
60d4a48
 }
60d4a48
 
60d4a48
 /////////////////////////////////////////////////
60d4a48
@@ -1161,8 +1219,21 @@ void URDF2SDF::ParseSDFExtension(TiXmlDo
60d4a48
       {
60d4a48
         sdf->material = GetKeyValueAsString(childElem);
60d4a48
       }
60d4a48
-      else if (childElem->ValueStr() == "visual")
60d4a48
+      else if (0 && childElem->ValueStr() == "visual")
60d4a48
       {
60d4a48
+        // anything inside of visual tags:
60d4a48
+        // <gazebo reference="link_name">
60d4a48
+        //   <visual>
60d4a48
+        //     <extention_stuff_here/>
60d4a48
+        //   </visual>
60d4a48
+        // </gazebl>
60d4a48
+        // are treated as blobs that gets inserted
60d4a48
+        // into visuals for the link
60d4a48
+        // <visual name="link_name[anything here]">
60d4a48
+        //   <stuff_from_urdf_link_visuals/>
60d4a48
+        //   <extention_stuff_here/>
60d4a48
+        // </visual>
60d4a48
+
60d4a48
         // a place to store converted doc
60d4a48
         for (TiXmlElement* e = childElem->FirstChildElement(); e;
60d4a48
             e = e->NextSiblingElement())
60d4a48
@@ -1826,6 +1897,7 @@ std::string GetGeometryBoundingBox(
60d4a48
 ////////////////////////////////////////////////////////////////////////////////
60d4a48
 void PrintCollisionGroups(UrdfLinkPtr _link)
60d4a48
 {
60d4a48
+#if USE_EXTERNAL_URDF
60d4a48
   sdfdbg << "COLLISION LUMPING: link: [" << _link->name << "] contains ["
60d4a48
     << static_cast<int>(_link->collision_groups.size())
60d4a48
     << "] collisions.\n";
60d4a48
@@ -1838,6 +1910,11 @@ void PrintCollisionGroups(UrdfLinkPtr _l
60d4a48
       << static_cast<int>(colsIt->second->size())
60d4a48
       << "] Collision objects\n";
60d4a48
   }
60d4a48
+#else
60d4a48
+  sdfdbg << "COLLISION LUMPING: link: [" << _link->name << "] contains ["
60d4a48
+    << static_cast<int>(_link->collision_array.size())
60d4a48
+    << "] collisions.\n";
60d4a48
+#endif
60d4a48
 }
60d4a48
 
60d4a48
 ////////////////////////////////////////////////////////////////////////////////
60d4a48
@@ -2211,6 +2288,7 @@ void CreateCollisions(TiXmlElement* _ele
60d4a48
 {
60d4a48
   // loop through all collision groups. as well as additional collision from
60d4a48
   //   lumped meshes (fixed joint reduction)
60d4a48
+#if USE_EXTERNAL_URDF
60d4a48
   for (std::map
60d4a48
       boost::shared_ptr<std::vector<UrdfCollisionPtr> > >::const_iterator
60d4a48
       collisionsIt = _link->collision_groups.begin();
60d4a48
@@ -2287,6 +2365,33 @@ void CreateCollisions(TiXmlElement* _ele
60d4a48
       }
60d4a48
     }
60d4a48
   }
60d4a48
+#else
60d4a48
+  unsigned int defaultMeshCount = 0;
60d4a48
+  for (std::vector<UrdfCollisionPtr>::const_iterator
60d4a48
+      collision = _link->collision_array.begin();
60d4a48
+      collision != _link->collision_array.end();
60d4a48
+      ++collision)
60d4a48
+  {
60d4a48
+    sdfdbg << "creating default collision for link [" << _link->name
60d4a48
+           << "]";
60d4a48
+
60d4a48
+    std::string collisionPrefix = _link->name;
60d4a48
+
60d4a48
+    if (defaultMeshCount > 0)
60d4a48
+    {
60d4a48
+      // append _[meshCount] to link name for additional collisions
60d4a48
+      std::ostringstream collisionNameStream;
60d4a48
+      collisionNameStream << collisionPrefix << "_" << defaultMeshCount;
60d4a48
+      collisionPrefix = collisionNameStream.str();
60d4a48
+    }
60d4a48
+
60d4a48
+    /* make a <collision> block */
60d4a48
+    CreateCollision(_elem, _link, *collision, collisionPrefix);
60d4a48
+
60d4a48
+    // only 1 default mesh
60d4a48
+    ++defaultMeshCount;
60d4a48
+  }
60d4a48
+#endif
60d4a48
 }
60d4a48
 
60d4a48
 ////////////////////////////////////////////////////////////////////////////////
60d4a48
@@ -2295,6 +2400,7 @@ void CreateVisuals(TiXmlElement* _elem,
60d4a48
 {
60d4a48
   // loop through all visual groups. as well as additional visuals from
60d4a48
   //   lumped meshes (fixed joint reduction)
60d4a48
+#if USE_EXTERNAL_URDF
60d4a48
   for (std::map
60d4a48
       boost::shared_ptr<std::vector<UrdfVisualPtr> > >::const_iterator
60d4a48
       visualsIt = _link->visual_groups.begin();
60d4a48
@@ -2371,6 +2477,33 @@ void CreateVisuals(TiXmlElement* _elem,
60d4a48
       }
60d4a48
     }
60d4a48
   }
60d4a48
+#else
60d4a48
+  unsigned int defaultMeshCount = 0;
60d4a48
+  for (std::vector<UrdfVisualPtr>::const_iterator
60d4a48
+      visual = _link->visual_array.begin();
60d4a48
+      visual != _link->visual_array.end();
60d4a48
+      ++visual)
60d4a48
+  {
60d4a48
+    sdfdbg << "creating default visual for link [" << _link->name
60d4a48
+           << "]";
60d4a48
+
60d4a48
+    std::string visualPrefix = _link->name;
60d4a48
+
60d4a48
+    if (defaultMeshCount > 0)
60d4a48
+    {
60d4a48
+      // append _[meshCount] to _link name for additional visuals
60d4a48
+      std::ostringstream visualNameStream;
60d4a48
+      visualNameStream << visualPrefix << "_" << defaultMeshCount;
60d4a48
+      visualPrefix = visualNameStream.str();
60d4a48
+    }
60d4a48
+
60d4a48
+    // create a <visual> block
60d4a48
+    CreateVisual(_elem, _link, *visual, visualPrefix);
60d4a48
+
60d4a48
+    // only 1 default mesh
60d4a48
+    ++defaultMeshCount;
60d4a48
+  }
60d4a48
+#endif
60d4a48
 }
60d4a48
 
60d4a48
 ////////////////////////////////////////////////////////////////////////////////