private bool loadMeshFaces(Mesh mesh) { bool success = true; int nextToken = 0; int f, i; bool haveNext = false; readBlockStart(); while (haveNext || (nextToken = scanner.yylex()) != (int)TokenType.BlockEnd) { if (nextToken != (int)TokenType.Node) { Console.Error.WriteLine("Expected a node" + " - " + scanner.yytext); } haveNext = false; string str = scanner.yytext; if (str.Equals("*MESH_FACE")) { string index; if (!readIndex(out index)) { success = false; continue; } f = int.Parse(index); if (f >= mesh.faceCount) Console.Error.WriteLine("File referred to a non-existent face ({0} >= {1})", f, mesh.faces.Count); Face face = mesh.faces[f]; face.vertex = new int[3]; for (i = 0; i < 3; i++) { if (!readIndex()) success = false; if (!readInt(out face.vertex[i])) success = false; } if (!readIndex()) success = false; if (!readInt(out face.ab)) success = false; if (!readIndex()) success = false; if (!readInt(out face.bc)) success = false; if (!readIndex()) success = false; if (!readInt(out face.ca)) success = false; mesh.faces[f] = face; } else { if ((nextToken = skip()) == (int)TokenType.BlockEnd || nextToken < 1) break; haveNext = true; } } return success; }
private bool loadMeshNormals(Mesh mesh) { bool success = true; int nextToken = 0; int i; bool haveNext = false; readBlockStart(); while (haveNext || (nextToken = scanner.yylex()) != (int)TokenType.BlockEnd) { if (nextToken != (int)TokenType.Node) { Console.Error.WriteLine("Expected a node"); } haveNext = false; if (scanner.yytext.Equals("*MESH_FACENORMAL")) { if (!readInt(out i)) { success = false; continue; } if (i >= mesh.faceCount) { Console.Error.WriteLine("File referred to a non-existent face"); success = false; continue; } Face face = mesh.faces[i]; if (!readVector3D(out face.faceNormal)) success = false; mesh.faces[i] = face; } else if (scanner.yytext.Equals("*MESH_VERTEXNORMAL")) { if (!readInt(out i)) { success = false; continue; } if (i >= mesh.vertexCount) { Console.Error.WriteLine("File referred to a non-existent vertex"); success = false; continue; } Vector3D normal = mesh.vertexNormals[i]; if (!readVector3D(out normal)) success = false; mesh.vertexNormals[i] = normal; } else { if ((nextToken = skip()) == (int)TokenType.BlockEnd || nextToken < 1) break; haveNext = true; } } return success; }
private bool loadMesh(out Mesh mesh) { bool success = true; int nextToken = 0; bool haveNext = false; mesh = new Mesh(); readBlockStart(); while (haveNext || (nextToken = scanner.yylex()) != (int)TokenType.BlockEnd) { if (nextToken != (int)TokenType.Node) { Console.Error.WriteLine("Expected a node" + " - " + scanner.yytext); } haveNext = false; string str = scanner.yytext; if (str.Equals("*TIMEVALUE")) { if (!readInt(out mesh.timeValue)) success = false; } else if (str.Equals("*MESH_NUMVERTEX")) { if (!readInt(out mesh.vertexCount)) success = false; mesh.vertexNormals = new List<Vector3D>(); for (int i = 0; i < mesh.vertexCount; i++) mesh.vertexNormals.Add(new Vector3D()); } else if (str.Equals("*MESH_NUMFACES")) { if (!readInt(out mesh.faceCount)) success = false; mesh.faces = new List<Face>(); for (int i = 0; i < mesh.faceCount; i++) mesh.faces.Add(new Face()); } else if (str.Equals("*MESH_VERTEX_LIST")) { readBlockStart(); while ((nextToken = scanner.yylex()) != (int)TokenType.BlockEnd) { int i; if (nextToken != (int)TokenType.Node || !scanner.yytext.Equals("*MESH_VERTEX")) { Console.Error.WriteLine("Expected a *MESH_VERTEX node"); continue; } if (!readInt(out i)) success = false; if (i >= mesh.vertexCount) { Console.Error.WriteLine("File referred to a non-existent vertex"); continue; } if (mesh.verticies == null) mesh.verticies = new List<Vector3D>(); Vector3D vertex; if (!readVector3D(out vertex)) success = false; mesh.verticies.Add(vertex); } } else if (str.Equals("*MESH_FACE_LIST")) { if (!loadMeshFaces(mesh)) success = false; } else if (str.Equals("*MESH_NUMTVERTEX")) { if (!readInt(out mesh.textureCoordinateCount)) success = false; } else if (str.Equals("*MESH_TVERTLIST")) { readBlockStart(); while ((nextToken = scanner.yylex()) != (int)TokenType.BlockEnd) { int i; if (nextToken != (int)TokenType.Node || !scanner.yytext.Equals("*MESH_TVERT")) { Console.Error.WriteLine("Expected a *MESH_TVERT node"); continue; } if (!readInt(out i)) success = false; if (i >= mesh.textureCoordinateCount) { Console.Error.WriteLine("File referred to a non-existent vertex"); continue; } if (mesh.textureCoordinates == null) mesh.textureCoordinates = new List<Vector3D>(); Vector3D vertex; if (!readVector3D(out vertex)) success = false; mesh.textureCoordinates.Add(vertex); } } else if (str.Equals("*MESH_NUMTVFACES")) { int i; if (!readInt(out i)) success = false; if (i != mesh.faceCount) Console.Error.WriteLine("Expected face texture count does not match face count"); } else if (str.Equals("*MESH_TFACELIST")) { readBlockStart(); while ((nextToken = scanner.yylex()) != (int)TokenType.BlockEnd) { int i; if (nextToken != (int)TokenType.Node || !scanner.yytext.Equals("*MESH_TFACE")) { Console.Error.WriteLine("Expected a *MESH_TFACE node"); continue; } if (!readInt(out i)) success = false; if (i >= mesh.faceCount) { Console.Error.WriteLine("File referred to a non-existent face"); continue; } if (mesh.faces != null) { Face face = mesh.faces[i]; if (!readInt3(out face.textureCoordinates)) success = false; mesh.faces[i] = face; } else { success = false; } } } else if (str.Equals("*MESH_NORMALS")) { if (!loadMeshNormals(mesh)) success = false; } else { if ((nextToken = skip()) == (int)TokenType.BlockEnd || nextToken < 1) break; haveNext = true; } } return success; }