int main(int argc, char **argv) { // Look for help for (int i = 0; i < argc; i++) { if (!strcmp(argv[i], "-help")) { ShowUsage(); } } // Read input and output mesh filenames if (argc < 3) ShowUsage(); argv++, argc--; // First argument is program name char *input_mesh_name = *argv; argv++, argc--; char *output_mesh_name = *argv; argv++, argc--; // Allocate mesh R3Mesh *mesh = new R3Mesh(); if (!mesh) { fprintf(stderr, "Unable to allocate mesh\n"); exit(-1); } // Read input mesh if (!mesh->Read(input_mesh_name)) { fprintf(stderr, "Unable to read mesh from %s\n", input_mesh_name); exit(-1); } // Parse arguments and perform operations while (argc > 0) { if (!strcmp(*argv, "-twist")) { CheckOption(*argv, argc, 2); double angle = atof(argv[1]); argv += 2, argc -= 2; mesh->Twist(angle); } else if (!strcmp(*argv, "-taubin")) { CheckOption(*argv, argc, 4); double lambda = atof(argv[1]); double mu = atof(argv[2]); double iters = atoi(argv[3]); argv += 4, argc -= 4; mesh->Taubin(lambda, mu, iters); } else if (!strcmp(*argv, "-loop")) { CheckOption(*argv, argc, 1); argv += 1, argc -= 1; mesh->Loop(); } else { // Unrecognized program argument fprintf(stderr, "meshpro: invalid option: %s\n", *argv); ShowUsage(); } } // Write output mesh if (!mesh->Write(output_mesh_name)) { fprintf(stderr, "Unable to write mesh to %s\n", output_mesh_name); exit(-1); } // Delete mesh delete mesh; // Return success return EXIT_SUCCESS; }