void HandleFace(OpenFlight.Node node, Scene.Node parent) { if (WorkingGroup == null) { WorkingGroup = new WorkingGroup_(); WorkingGroup.Parent = parent; } var face = Parser.ParseFace(node.Record); // TODO: face properties WorkingGroup.Material = MaterialForFace(face); if (!WorkingGroup.MeshMap.ContainsKey(WorkingGroup.Material)) { WorkingGroup.MeshMap[WorkingGroup.Material] = new WorkingMesh(); } var working_mesh = WorkingGroup.MeshMap[WorkingGroup.Material]; working_mesh.MaterialIndex = Scene.Materials.IndexOf(WorkingGroup.Material); int before_index = working_mesh.CurrentVertexIndex; foreach (var child in node.Children) { HandleNode(child, parent); } int after_index = working_mesh.CurrentVertexIndex; if (after_index - before_index == 3) { working_mesh.Triangles.Add(before_index + 0); working_mesh.Triangles.Add(before_index + 2); working_mesh.Triangles.Add(before_index + 1); return; } if (after_index - before_index == 4) { working_mesh.Triangles.Add(before_index + 0); working_mesh.Triangles.Add(before_index + 2); working_mesh.Triangles.Add(before_index + 1); working_mesh.Triangles.Add(before_index + 2); working_mesh.Triangles.Add(before_index + 0); working_mesh.Triangles.Add(before_index + 3); return; } UnityEngine.Debug.LogError("FLT: invalid vertex count"); }
void CloseWorkingGroup() { foreach (var working_mesh_index in WorkingGroup.MeshMap.Keys) { var working_mesh = WorkingGroup.MeshMap[working_mesh_index]; var mesh = new Scene.Mesh(); mesh.MaterialIndex = working_mesh.MaterialIndex; var working_material = Scene.Materials[mesh.MaterialIndex]; mesh.Name = working_material.Name; mesh.Vertices = working_mesh.Vertices.ToArray(); mesh.Triangles = working_mesh.Triangles.ToArray(); mesh.Normals = working_mesh.Normals.ToArray(); mesh.Colors = working_mesh.Colors.ToArray(); mesh.UVs1 = working_mesh.UVs.ToArray(); WorkingGroup.Parent.AddChild(mesh); } WorkingGroup = null; }