std::vector<PolygonalObject> Convert(IPObjectStruct* iritObjects)
	{
		std::vector<PolygonalObject> res;
		if (iritObjects == NULL)
		{
			return std::vector<PolygonalObject>();
		}
		if (IP_IS_OLST_OBJ(iritObjects))
		{
			std::vector<PolygonalObject> res;
			res.reserve(iritObjects->U.Lst.ListMaxLen);
			IPObjectStruct** currObject = iritObjects->U.Lst.PObjList;
			while ((*currObject) != NULL)
			{
				std::vector<PolygonalObject> currRes = Convert(*currObject);
				res.insert(res.end(), currRes.begin(), currRes.end());
				++currObject;
			}
			return res;
		}
		else if (IP_IS_POLYGON_OBJ(iritObjects))
		{
			std::vector<PolygonalObject> res;
			res.push_back(ConvertSingleObject(iritObjects));
			return res;
		}
		else
		{
			throw ConvertError();
		}
	}
	PolygonalObject ConvertSingleObject(IPObjectStruct* iritObjects)
	{
		if (!IP_IS_POLYGON_OBJ(iritObjects))
		{
			throw ConvertError();
		}
		std::vector<Polygon3D> currPolys;
		IPPolygonStruct* currPoly = iritObjects->U.Pl;
		while (currPoly != NULL)
		{
			currPolys.push_back(ConvertPolygon(currPoly));
			currPoly = currPoly->Pnext;
		}

		double transp;
		bool transpValid = CGSkelGetObjectTransp(iritObjects, &transp);

		IPAttributeStruct* attrRGB = AttrFindAttribute(iritObjects->Attr, "rgb");
		if (attrRGB != NULL)
		{
			int r, g, b;
			sscanf_s(attrRGB->U.Str, "%d,%d,%d", &r, &g, &b);
			if (transpValid)
				return PolygonalObject(currPolys, RGB(r, g, b), 1 - transp);
			else
				return PolygonalObject(currPolys, RGB(r, g, b));
		}
		{
			if (transpValid)
				return PolygonalObject(currPolys, 1 - transp);
			else
				return PolygonalObject(currPolys);
		}
	}
/*****************************************************************************
* DESCRIPTION:                                                               *
* Dumps one object PObject to file f.                                        *
*                                                                            *
* PARAMETERS:                                                                *
*   f:            File to dump object to.                                    *
*   PObject:      Object to dump to file f.                                  *
*                                                                            *
* RETURN VALUE:                                                              *
*   void                                                                     *
*****************************************************************************/
static void DumpOneObject(FILE *f, IPObjectStruct *PObject)
{
    IPPolygonStruct
	*PList = NULL;

    switch (PObject -> ObjType) {
	case IP_OBJ_POLY:
	    if (IP_IS_POLYGON_OBJ(PObject) ||
		IP_IS_POLYLINE_OBJ(PObject))
	        PList = PObject -> U.Pl;
	    break;
	case IP_OBJ_CURVE:
	case IP_OBJ_SURFACE:
	    IRIT_FATAL_ERROR("Curves and surfaces should have been converted to polylines.");
	    break;
	default:
	    break;
    }

    while (PList) {
	DumpOnePoly(f, PList, IP_IS_POLYGON_OBJ(PObject));
	PList =	PList -> Pnext;
    }
}