void CLedgeManagerEdit::Export( const char* fileName ) const
{
	const uint32 totalLedgeObjectsCount = m_ledgeObjects.size();

	if (totalLedgeObjectsCount > 0)
	{
		CCryFile file;
		if( false != file.Open( fileName, "wb" ) )
		{
			// Count number of markers ...
			uint32 totalLedgeMarkersCount = 0;
			for (uint32 objectIdx = 0; objectIdx < totalLedgeObjectsCount; ++objectIdx)
			{
				totalLedgeMarkersCount += m_ledgeObjects[objectIdx].m_markers.size();
			}

			// Prepare buffers ...
			SLedgeObject ledgeObjectBuffer[MAX_LEDGE_ENTITIES];
			SLedgeMarkerBuffer ledgeMarkersBuffer(totalLedgeMarkersCount);

			uint32 currentMarkerIdx = 0;
			for (uint32 objectIdx = 0; objectIdx < totalLedgeObjectsCount; ++objectIdx)
			{
				SLedgeObject& ledgeObject = ledgeObjectBuffer[objectIdx];
				const SLedgeObjectEditor& ledgeObjectEdit = m_ledgeObjects[objectIdx];

				ledgeObject.m_entityId = ((ledgeObjectEdit.m_ledgeFlags[LedgeSide_In] & kLedgeFlag_static) == 0) ? ledgeObjectEdit.m_entityId : 0;
				ledgeObject.m_ledgeFlags[LedgeSide_In]  = ledgeObjectEdit.m_ledgeFlags[LedgeSide_In];
				ledgeObject.m_ledgeFlags[LedgeSide_Out] = ledgeObjectEdit.m_ledgeFlags[LedgeSide_Out];
				ledgeObject.m_ledgeCornerEndAdjustAmount = ledgeObjectEdit.m_ledgeCornerEndAdjustAmount;
				ledgeObject.m_markersStartIdx = currentMarkerIdx;
				ledgeObject.m_markersCount = ledgeObjectEdit.m_markers.size();

				CRY_ASSERT((ledgeObject.m_markersStartIdx + ledgeObject.m_markersCount) <= totalLedgeMarkersCount);

				for(size_t markerIdx = 0; markerIdx < ledgeObjectEdit.m_markers.size(); ++markerIdx)
				{
					ledgeMarkersBuffer.InsertAt( ledgeObjectEdit.m_markers[markerIdx], currentMarkerIdx + markerIdx );
				}
				currentMarkerIdx += ledgeObject.m_markersCount;
			}

			// Write to file...

			// File version
			uint32 nFileVersion = LEDGE_DATA_FILE_VERSION;
			file.Write( &nFileVersion,sizeof(nFileVersion) );

			// Ledges and markers info
			file.Write( &totalLedgeObjectsCount, sizeof(totalLedgeObjectsCount) );
			file.Write( &totalLedgeMarkersCount, sizeof(totalLedgeMarkersCount) );

			file.Write( &ledgeObjectBuffer[0], sizeof(ledgeObjectBuffer[0]) * totalLedgeObjectsCount );
			file.Write( &ledgeMarkersBuffer.pMarkers[0], sizeof(ledgeMarkersBuffer.pMarkers[0]) * ledgeMarkersBuffer.bufferSize );

			file.Close();
		}
	}
}
	static inline void WriteFccCodes(CCryFile& file, const TFourCCSet& fccs, uint32 keyword)
	{
		uint32 fcc = keyword;
		file.Write( &fcc, sizeof(fcc) );
		for ( TFourCCSet::const_iterator it = fccs.begin(); it != fccs.end(); ++it )
		{
			fcc = *it;
			file.Write( &fcc, sizeof(fcc) );
		}
		fcc = eBK_void;
		file.Write( &fcc, sizeof(fcc) );
	}
void CGameVolumesManager::Export( const char* fileName ) const
{
	CCryFile file;
	if( false != file.Open( fileName, "wb" ) )
	{
		const uint32 maxVertices = 512;
		Vec3 writeVertexBuffer[maxVertices];

		// File version
		uint32 nFileVersion = GAME_VOLUMES_FILE_VERSION;
		file.Write( &nFileVersion,sizeof(nFileVersion) );


		// Save volume info
		uint32 nVolumeCount = (uint32)m_volumesData.size();
		file.Write( &nVolumeCount, sizeof(nVolumeCount) );

		for (uint32 i = 0; i < nVolumeCount; ++i)
		{
			const EntityVolume& volumeInfo = m_volumesData[i];

			CRY_ASSERT ( volumeInfo.vertices.size() < maxVertices );

			uint32 nVertexCount = min( (uint32)volumeInfo.vertices.size(), maxVertices );
			uint32 nEntityId = volumeInfo.entityId;
			f32    fHeight = volumeInfo.height;
			bool   bClosed = volumeInfo.closed;

			file.Write( &nEntityId, sizeof(nEntityId) );
			file.Write( &fHeight, sizeof(fHeight) );
			if( nFileVersion > 1 )
			{
				file.Write( &bClosed, sizeof(bClosed) );
			}
			file.Write( &nVertexCount, sizeof(nVertexCount) );

			if (nVertexCount > 0)
			{
				for (uint32 v = 0; v < nVertexCount; ++v)
				{
					writeVertexBuffer[v] = volumeInfo.vertices[v];
				}
				file.Write( &writeVertexBuffer[0], sizeof(writeVertexBuffer[0]) * nVertexCount );
			}
		}

		file.Close();
	}
}