void SavePRC::WriteNodeModelsToPRCFile(PRCFile &outPRCFile, PRCModelTreeNode modelTreeNode)
{
  if (modelTreeNode.ID != 0)   // Do not create a group for root node
  {
    outPRCFile.begingroup(modelTreeNode.Name.c_str());
  }

  WritePointSetDataToPRCFile(outPRCFile, modelTreeNode.ID);
  WriteLineSetDataToPRCFile(outPRCFile, modelTreeNode.ID);
  WriteMeshDataToPRCFile(outPRCFile, modelTreeNode.ID);
  // Write annotations

  for (MLintVector::iterator it = modelTreeNode.ChildrenIDs.begin(); it != modelTreeNode.ChildrenIDs.end(); ++it) 
  {
    MLint thisChildNodeIndex = *it;
    PRCModelTreeNode nextNode = getNodeFromPRCModelTree(_modelTree, thisChildNodeIndex);

    if (nextNode.ID != -1)  
    {
      WriteNodeModelsToPRCFile(outPRCFile, nextNode);
    }
    else  
    {
      // This can happen only if ThisChildNodeIndex was not found in model tree... and therefore should never happen!
    }
  }

  if (modelTreeNode.ID != 0)   // Do not close group for root node
  {
    outPRCFile.endgroup();
  }

}
void SavePRC::WriteLineSetDataToPRCFile(PRCFile &outPRCFile, MLint modelTreeNode)
{
  const bool perSegmentColor = false;
  const MLuint32 numberOfSegmentColors = 0;
  const MLuint32 numberOfSegmentColorIndices = 0;

  for (PRCObjectInfoVector::iterator it = _prcObjectInfoVector.begin(); it != _prcObjectInfoVector.end(); ++it)
  {
    PRCObjectInfoStruct thisObjectInfo = *it;

    if ( (thisObjectInfo.Type == PRCOBJECTTYPE_LINESET) && (thisObjectInfo.ParentTreeNodeID == modelTreeNode) )
    {
      outPRCFile.begingroup(thisObjectInfo.DisplayName.c_str());

      size_t numLineSets = _lineSetsGeometryVector.size();

      for (size_t s = 0; s < numLineSets; s++)
      {
        LineSetSpecificationStruct thisLineSetGeometry = _lineSetsGeometryVector[s];

        if (thisLineSetGeometry.internalName == thisObjectInfo.InternalName)
        {
          Vector3 startPositionColor = thisLineSetGeometry.positions[0].color;
          double  startPositionAlpha = thisLineSetGeometry.positions[0].alpha;

          size_t numberOfPositions = thisLineSetGeometry.positions.size();
          double (*positionsArray)[3] = new double[numberOfPositions][3];

          for (MLuint32 p = 0; p < numberOfPositions; p++) {
            positionsArray[p][0] = thisLineSetGeometry.positions[p].position.x;
            positionsArray[p][1] = thisLineSetGeometry.positions[p].position.y;
            positionsArray[p][2] = thisLineSetGeometry.positions[p].position.z;
          }

          const size_t numberOfIndices = thisLineSetGeometry.lines.size();            
          const size_t lineIndexArraySize = numberOfIndices*3;
          MLuint32 *lineIndexArray = new MLuint32[lineIndexArraySize];

          for (MLuint32 i = 0; i < numberOfIndices; i++) {
            lineIndexArray[i*3] = 2;     // Number of points in this segment
            lineIndexArray[i*3+1] = thisLineSetGeometry.lines[i].startIndex;
            lineIndexArray[i*3+2] = thisLineSetGeometry.lines[i].endIndex;
          }

          PRC_RGBAColor c(startPositionColor[0],startPositionColor[1],startPositionColor[2],startPositionAlpha);

          if (thisObjectInfo.RGBAColor[3] > 0)  // If alpha value is not = "invisible" -> Use color from UI
          {
            c.Set(thisObjectInfo.RGBAColor[0],thisObjectInfo.RGBAColor[1],thisObjectInfo.RGBAColor[2],thisObjectInfo.RGBAColor[3]);
          }

          outPRCFile.addLines((MLuint32)numberOfPositions, positionsArray, (MLuint32)lineIndexArraySize, lineIndexArray, c, thisLineSetGeometry.lines[0].width, perSegmentColor, numberOfSegmentColors, NULL, numberOfSegmentColorIndices, NULL);

          delete[] positionsArray;
          delete[] lineIndexArray;

        }
      }

      outPRCFile.endgroup();
    }

  }

}