private void AddFace(GameObject parent, X3DIndexedFaceSet preparedFaceSet, bool frontFace) {

			List<Vector3> vertices = null;
			int?[] vertexMapping = null;
			List<Vector3> normals = null;
			List<Color> colors = null;
			List<int> triangles = null;

			int partCount = 0;

			for (int i = 0; i < preparedFaceSet.Faces.Count; i++) {
				if (vertices != null && vertices.Count + 3 > MAX_VERTEX_PER_MESH_COUNT) {
					AddPart (parent, vertices, normals, colors, triangles, (frontFace ? "Front_" : "Back_") + partCount);
					partCount++;
					vertices = null;
				}
				if (vertices == null) {
					vertices = new List<Vector3> (preparedFaceSet.Vertices.Count);
					vertexMapping = new int?[preparedFaceSet.Vertices.Count];
					if (preparedFaceSet.Normals != null) {
						normals = new List<Vector3> (preparedFaceSet.Normals.Count);
					}
					if (preparedFaceSet.Colors != null) {
						colors = new List<Color> (preparedFaceSet.Colors.Count);
					}
					triangles = new List<int>(preparedFaceSet.Faces.Count * 3);
				}
					
				int vertexA;
				int vertexB;
				int vertexC;

				if (frontFace) {
					vertexA = preparedFaceSet.Faces [i] [0];
					vertexB = preparedFaceSet.Faces [i] [1];
					vertexC = preparedFaceSet.Faces [i] [2];
				} else {
					vertexA = preparedFaceSet.Faces [i] [2];
					vertexB = preparedFaceSet.Faces [i] [1];
					vertexC = preparedFaceSet.Faces [i] [0];
				}

				foreach (int vertexId in new int[]{vertexA, vertexB, vertexC}) {
					if (vertexMapping [vertexId] == null) {
						vertexMapping [vertexId] = vertices.Count;
						vertices.Add (preparedFaceSet.Vertices[vertexId]);
						if (preparedFaceSet.Normals != null) {
							normals.Add (preparedFaceSet.Normals[vertexId]);
						}
						if (preparedFaceSet.Colors != null) {
							colors.Add (preparedFaceSet.Colors[vertexId]);
						}
					}
					triangles.Add (vertexMapping [vertexId].Value);
				}
			}
			AddPart (parent, vertices, normals, colors, triangles, (frontFace ? "Front_" : "Back_") + partCount);
		}
        override public void Convert(GameObject parent)
        {
            X3DIndexedFaceSet preparedFaceSet = this.ToTriangulatedFaceSet().
                                                ToVertexOrientedFaceSet();

            AddFace(parent, preparedFaceSet, true);
            if (!this.Solid)
            {
                AddFace(parent, preparedFaceSet, false);
            }
        }
        private void AddFace(GameObject parent, X3DIndexedFaceSet preparedFaceSet, bool frontFace)
        {
            List <Vector3> vertices = null;

            int?[]         vertexMapping = null;
            List <Vector3> normals       = null;
            List <Color>   colors        = null;
            List <int>     triangles     = null;

            int partCount = 0;

            for (int i = 0; i < preparedFaceSet.Faces.Count; i++)
            {
                if (vertices != null && vertices.Count + 3 > MAX_VERTEX_PER_MESH_COUNT)
                {
                    AddPart(parent, vertices, normals, colors, triangles, (frontFace ? "Front_" : "Back_") + partCount);
                    partCount++;
                    vertices = null;
                }
                if (vertices == null)
                {
                    vertices      = new List <Vector3> (preparedFaceSet.Vertices.Count);
                    vertexMapping = new int?[preparedFaceSet.Vertices.Count];
                    if (preparedFaceSet.Normals != null)
                    {
                        normals = new List <Vector3> (preparedFaceSet.Normals.Count);
                    }
                    if (preparedFaceSet.Colors != null)
                    {
                        colors = new List <Color> (preparedFaceSet.Colors.Count);
                    }
                    triangles = new List <int>(preparedFaceSet.Faces.Count * 3);
                }

                int vertexA;
                int vertexB;
                int vertexC;

                if (frontFace)
                {
                    vertexA = preparedFaceSet.Faces [i] [0];
                    vertexB = preparedFaceSet.Faces [i] [1];
                    vertexC = preparedFaceSet.Faces [i] [2];
                }
                else
                {
                    vertexA = preparedFaceSet.Faces [i] [2];
                    vertexB = preparedFaceSet.Faces [i] [1];
                    vertexC = preparedFaceSet.Faces [i] [0];
                }

                foreach (int vertexId in new int[] { vertexA, vertexB, vertexC })
                {
                    if (vertexMapping [vertexId] == null)
                    {
                        vertexMapping [vertexId] = vertices.Count;
                        vertices.Add(preparedFaceSet.Vertices[vertexId]);
                        if (preparedFaceSet.Normals != null)
                        {
                            normals.Add(preparedFaceSet.Normals[vertexId]);
                        }
                        if (preparedFaceSet.Colors != null)
                        {
                            colors.Add(preparedFaceSet.Colors[vertexId]);
                        }
                    }
                    triangles.Add(vertexMapping [vertexId].Value);
                }
            }
            AddPart(parent, vertices, normals, colors, triangles, (frontFace ? "Front_" : "Back_") + partCount);
        }