OSG::NodePtr makePolygon(double pntData[][3], int numPoints) {

  OSG::GeometryPtr geoPtr  = OSG::Geometry::create();
  OSG::NodePtr     nodePtr = OSG::Node::create();

  GeoPositions3fPtr    pnts    = GeoPositions3f::create();
  GeoNormals3fPtr      norms   = GeoNormals3f::create();
  GeoTexCoords2fPtr    tex     = GeoTexCoords2f::create();
  GeoIndicesUI32Ptr    indices = GeoIndicesUI32::create();   
  GeoPLengthsUI32Ptr   lens    = GeoPLengthsUI32::create();  
  GeoPTypesUI8Ptr      types   = GeoPTypesUI8::create();     

  //Set up the properties according to the geometry defined above
  beginEditCP(pnts);
  beginEditCP(norms);
  
  for(int i = 0; i < numPoints; i++) 
    {
      pnts->push_back(Pnt3f(pntData[i][0],
                            pntData[i][1], 
                            pntData[i][2]));

      indices->push_back(2*i);

      norms->push_back(Vec3f(0.0, 0.0, pntData[i][2]));
      indices->push_back(2*i + 1);
    }

  endEditCP(pnts);
  endEditCP(norms);

  beginEditCP(types);
  beginEditCP(lens);
  types->push_back(GL_POLYGON);
  lens->push_back(numPoints);
  endEditCP(types);
  endEditCP(lens);

  beginEditCP(geoPtr);
  
  geoPtr->setMaterial(getDefaultMaterial());
  geoPtr->setPositions(pnts);
  geoPtr->setNormals(norms);
  geoPtr->setIndices(indices);
  
  geoPtr->editMFIndexMapping()->push_back(Geometry::MapPosition | 
                                          Geometry::MapNormal);
  
  geoPtr->setTypes(types);
  geoPtr->setLengths(lens);
  
  endEditCP(geoPtr);

  nodePtr->setCore(geoPtr);
  return nodePtr;
}
// This implementation is adapted from
// OSG::SimpleSceneManager::highlightChanged() in OpenSG 1.4.0.
void OpenSGNavGrab::initHighlight()
{
   if ( mHighlightMaterial == OSG::NullFC )
   {
      mHighlightMaterial = OSG::SimpleMaterial::create();

#if OSG_MAJOR_VERSION < 2
      CPEdit(mHighlightMaterial, OSG::SimpleMaterial::LitFieldMask);
#endif

      mHighlightMaterial->setLit(false);
   }

   if ( mHighlightNode == OSG::NullFC )
   {
#if OSG_MAJOR_VERSION < 2
      OSG::GeoPTypesPtr type       = OSG::GeoPTypesUI8::create();
      OSG::GeoPLengthsPtr lens     = OSG::GeoPLengthsUI32::create();
#else
      OSG::GeoPTypesUI8Ptr type    = OSG::GeoPTypesUI8::create();
      OSG::GeoPLengthsUI32Ptr lens = OSG::GeoPLengthsUI32::create();
#endif
      OSG::GeoIndicesUI32Ptr index = OSG::GeoIndicesUI32::create();
      mHighlightPoints             = OSG::GeoPositions3f::create();
      OSG::GeometryPtr geo         = OSG::Geometry::create();
      mHighlightNode               = OSG::Node::create();

#if OSG_MAJOR_VERSION < 2
      CPEditAll(type);
      CPEditAll(lens);
      CPEditAll(index);
      CPEditAll(mHighlightPoints);
      CPEditAll(geo);
      CPEdit(mHighlightNode, OSG::Node::CoreFieldMask);
#endif

      type->push_back(GL_LINE_STRIP);
      type->push_back(GL_LINES);

      lens->push_back(10);
      lens->push_back(6);

#if OSG_MAJOR_VERSION < 2
      OSG::GeoIndicesUI32::StoredFieldType* index_field =
         index->getFieldPtr();
#else
      OSG::GeoIndicesUI32::StoredFieldType* index_field =
         index->editFieldPtr();
#endif

      index_field->push_back(0);
      index_field->push_back(1);
      index_field->push_back(3);
      index_field->push_back(2);
      index_field->push_back(0);
      index_field->push_back(4);
      index_field->push_back(5);
      index_field->push_back(7);
      index_field->push_back(6);
      index_field->push_back(4);

      index_field->push_back(1);
      index_field->push_back(5);
      index_field->push_back(2);
      index_field->push_back(6);
      index_field->push_back(3);
      index_field->push_back(7);

      mHighlightPoints->push_back(OSG::Pnt3f(-1, -1, -1));
      mHighlightPoints->push_back(OSG::Pnt3f( 1, -1, -1));
      mHighlightPoints->push_back(OSG::Pnt3f(-1,  1, -1));
      mHighlightPoints->push_back(OSG::Pnt3f( 1,  1, -1));
      mHighlightPoints->push_back(OSG::Pnt3f(-1, -1,  1));
      mHighlightPoints->push_back(OSG::Pnt3f( 1, -1,  1));
      mHighlightPoints->push_back(OSG::Pnt3f(-1,  1,  1));
      mHighlightPoints->push_back(OSG::Pnt3f( 1,  1,  1));

      geo->setTypes(type);
      geo->setLengths(lens);
      geo->setIndices(index);
      geo->setPositions(mHighlightPoints);
      geo->setMaterial(mHighlightMaterial);

      mHighlightNode->setCore(geo);
   }
}