////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Overwrite the lightmap uv's in the target bsp. </summary>
		///
		/// <param name="lightmapMeshes">	The lightmap meshes. </param>
		/// <param name="BSP">			 	The bsp. </param>
		///
		/// <returns>	true if it succeeds, false if it fails. </returns>
		bool OverwriteLightmapUVs(List<Lightmap> lightmapMeshes, structure_bsp_group BSP)
		{
			int bspLightmapCount = BSP.Lightmaps.Count - 1;

			// Replace the vertex uv's
			foreach (var lightmap in lightmapMeshes)
			{
				var bspLightmap = BSP.Lightmaps[lightmap.LightmapIndex];

				int startFaceOffset = 0;
				foreach (var material in bspLightmap.Materials)
				{
					// Write the lightmap UV's to the BSP's vertex data
					try
					{
						var binaryWriter = new BinaryWriter(new MemoryStream(material.UncompressedVertices.Value));

						// Skip past the normal texture coordinates
						int vertexOffset = material.VerticesCount * 56;
						int faceIndex = startFaceOffset;
						foreach (int surfaceIndex in Enumerable.Range(0, material.SurfaceCount))
						{
							var colladaFace = lightmap.Faces[faceIndex];
							var surface = BSP.Surfaces[material.Surfaces + surfaceIndex];

							// Write the coordinate values
							binaryWriter.Seek(vertexOffset + ((int)surface.A1.Value * 20) + 12, SeekOrigin.Begin);
							binaryWriter.Write(colladaFace.Vertex2.X);
							binaryWriter.Write(colladaFace.Vertex2.Y);

							binaryWriter.Seek(vertexOffset + ((int)surface.A2.Value * 20) + 12, SeekOrigin.Begin);
							binaryWriter.Write(colladaFace.Vertex1.X);
							binaryWriter.Write(colladaFace.Vertex1.Y);

							binaryWriter.Seek(vertexOffset + ((int)surface.A3.Value * 20) + 12, SeekOrigin.Begin);
							binaryWriter.Write(colladaFace.Vertex0.X);
							binaryWriter.Write(colladaFace.Vertex0.Y);

							faceIndex++;
						}

						binaryWriter.Flush();
					}
					catch (Exception exception)
					{
						SendMessage(String.Format("Failed to write to the target BSP due to an exception: {0}", exception.Message));
						return false;
					}

					startFaceOffset += material.SurfaceCount;
				}
			}

			return true;
		}
		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Verifies that the lightmap mesh data is compatible with the loaded bsp. </summary>
		///
		/// <param name="lightmapMeshes">	The lightmap meshes. </param>
		/// <param name="BSP">			 	The bsp. </param>
		///
		/// <returns>	true if it passes, false if it fails. </returns>
		bool VerifyMeshData(List<Lightmap> lightmapMeshes, structure_bsp_group BSP)
		{
			// Verify the BSP matches the loaded geometry
			foreach (var lightmap in lightmapMeshes)
			{
				// Get the lightmap objects from the bsp and collada file
				if(lightmap.LightmapIndex < 0 || lightmap.LightmapIndex >= BSP.Lightmaps.Count)
				{
					SendMessage(String.Format("A mesh in the COLLADA file has an out of bounds lightmap index ({0})", lightmap.LightmapIndex));
					return false;
				}

				var bspLightmap = BSP.Lightmaps[lightmap.LightmapIndex];

				// Check the face count matches
				int colladaFaceCount = lightmap.Faces.Count;
				int bspFaceCount = 0;
				bspLightmap.Materials.Elements.ForEach(entry => bspFaceCount += entry.SurfaceCount);

				SendMessage(String.Format("COLLADA lightmap mesh {0}'s face count: {1}", lightmap.LightmapIndex, colladaFaceCount));
				SendMessage(String.Format("BSP lightmap mesh {0}'s face count: {1}", lightmap.LightmapIndex, bspFaceCount));

				if (colladaFaceCount != bspFaceCount)
				{
					SendMessage(String.Format("COLLADA lightmap mesh {0}'s face count does not match the bsp", lightmap.LightmapIndex));
					return false;
				}
			}

			return true;
		}