internal static void PrintUse() { ULogger.W("APP", "Usage: mset2 <arguments...> <files>"); ULogger.N("APP"); ULogger.W("APP", "Extraction options:"); ULogger.W("APP", " -e:<encoder>"); ULogger.W("APP", " Specifies output encoder. <encoder> must be a valid encoder. For available encoders, see readme."); ULogger.W("APP", " Default value: OBJ"); ULogger.N("APP"); ULogger.W("APP", " -d:<path>"); ULogger.W("APP", " Specifies output directory. <path> must be a valid directory path."); ULogger.W("APP", " Default value: <null> (outputs to source files' directory)"); ULogger.N("APP"); ULogger.W("APP", " -l"); ULogger.W("APP", " Lists models in a file then exists."); ULogger.N("APP"); ULogger.W("APP", " -m:<model_name>"); ULogger.W("APP", " Specifies extracting a specific model from input file(s). <model_name> is a model to extract."); ULogger.W("APP", " Default value: <null> (extracts all models)"); ULogger.N("APP"); ULogger.W("APP", " -c:<color>"); ULogger.W("APP", " Overrides vertex colors on resulting mesh. <color> is an unsigned 32-bit integer containing ARGB information."); ULogger.W("APP", " Default value: <null> (does not override colors)"); ULogger.N("APP"); ULogger.W("APP", " -o:<options>"); ULogger.W("APP", " Specifies selected encoder's options. <options> is a string of comma-separated key-value pairs. For examples and available encoder options, see readme."); ULogger.W("APP", " Default value: <null> (use default options)"); ULogger.N("APP"); ULogger.W("APP", " -r"); ULogger.W("APP", " Creates raw mesh dumps alongside output files. These are UTF-8-encoded text files describing raw input data."); ULogger.N("APP"); ULogger.W("APP", "Program options:"); ULogger.W("APP", " -v"); ULogger.W("APP", " Enables verbose logging to console."); ULogger.N("APP"); ULogger.W("APP", " -v:<path>"); ULogger.W("APP", " Enables logging to file. Supersedes -v. <path> must be a valid file path."); ULogger.N("APP"); ULogger.W("APP", " -help"); ULogger.W("APP", " Prints this message and quits."); ULogger.N("APP"); }
/* * COMMANDLINE OPTIONS * * Extraction options: * -e:<encoder> * Specifies output encoder. <encoder> must be a valid encoder. For available encoders, see readme. * Default value: OBJ * * -d:<path> * Specifies output directory. <path> must be a valid directory path. * Default value: <null> (outputs to source files' directory) * * -l * Lists models in a file then exists. * * -m:<model_name> * Specifies extracting a specific model from input file(s). <model_name> is a model to extract. * Default value: <null> (extracts all models) * * -c:<color> * Overrides vertex colors on resulting mesh. <color> is an unsigned 32-bit integer containing ARGB information. * Default value: <null> (does not override colors) * * -o:<options> * Specifies selected encoder's options. <options> is a string of comma-separated key-value pairs. For examples and available encoder options, see readme. * Default value: <null> (use default options) * * -r * Creates raw mesh dumps alongside output files. These are UTF-8-encoded text files describing raw input data. * * Program options: * -v * Enables verbose logging to console. * * -v:<path> * Enables logging to file. Supersedes -v. <path> must be a valid file path. */ internal static void Main(string[] args) { ULogger.D(Debugger.IsAttached); ULogger.R(Console.Out); ULogger.W("MSET2", "Initializing"); AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; var cmdl = ParseCommandLine(args); Options = cmdl; if (cmdl.VerboseMode) { if (cmdl.VerboseModeLogFile != null) { var tw = new StreamWriter(cmdl.VerboseModeLogFile.Create(), new UTF8Encoding(false)); ULogger.R(tw); } ULogger.W("APP", "Commandline options:"); ULogger.W("APP", " Encoder: {0} (ver. {1})", cmdl.ModelWriter.WriterID, cmdl.ModelWriter.VersionID); ULogger.W("APP", " Output path: {0}", cmdl.OutputDirectory != null ? cmdl.OutputDirectory.FullName : "<null>"); ULogger.W("APP", " Just list models: {0}", cmdl.ListModels ? "Yes" : "No"); ULogger.W("APP", " Model name: {0}", cmdl.ModelName != null ? cmdl.ModelName : "<null>"); ULogger.W("APP", " Override color: {0}", cmdl.IsColorDefined ? string.Format("Yes (RGBA #{0:X2}{1:X2}{2:X2}{3:X2})", cmdl.OverrideColor.R, cmdl.OverrideColor.G, cmdl.OverrideColor.B, cmdl.OverrideColor.A) : "No"); ULogger.W("APP", " Encoder options specified: {0}", cmdl.ModelWriterOptions.Count); ULogger.W("APP", " Create raw meshes: {0}", cmdl.CreateRawMeshes ? "Yes" : "No"); ULogger.W("APP", " Verbose mode: {0}", cmdl.VerboseMode ? "Yes" : "No"); ULogger.W("APP", " Log file: {0}", cmdl.VerboseModeLogFile != null ? cmdl.VerboseModeLogFile.FullName : "<null>"); ULogger.N("APP"); ULogger.W("APP", "Invalid arguments specified: {0}", cmdl.HasInvalidArguments ? "Yes" : "No"); ULogger.N("APP"); ULogger.W("APP", "Input files ({0}):", cmdl.InputFiles.Count()); foreach (var infile in cmdl.InputFiles) { ULogger.W("APP", "'{0}'", infile.FullName); } ULogger.N("APP"); } if (cmdl.HasInvalidArguments && cmdl.ArgumentException != null) { ULogger.X("APP", cmdl.ArgumentException); ULogger.N("APP"); } if (cmdl.HelpMode || cmdl.HasInvalidArguments) { PrintUse(); ULogger.Q(); return; } var msetrdr = new MSetReader(); var msetdmp = new RawDumper(); foreach (var kvp in cmdl.ModelWriterOptions) { cmdl.ModelWriter.Options.Add(kvp.Key, kvp.Value); } var m3dw = cmdl.ModelWriter; var utf8 = new UTF8Encoding(false); try { foreach (var msetf in cmdl.InputFiles) { if (cmdl.VerboseMode) { ULogger.W("MSETLDR", "Loading '{0}'", msetf.FullName); } var mset = msetrdr.Load(msetf); var m3ds = msetrdr.Create3DModels(mset).ToList(); if (cmdl.VerboseMode) { ULogger.W("MSETLDR", "Loaded {0} models", m3ds.Count); } foreach (var m3d in m3ds) { ULogger.W("M3D", "Model '{0}' in file '{1}'", m3d.ModelName, msetf.FullName); if (cmdl.ListModels) { continue; } if (cmdl.ModelName != null && m3d.ModelName != cmdl.ModelName) { continue; } ULogger.W("M3DWRTR", "Extracting '{0}'", m3d.ModelName); var opath = cmdl.OutputDirectory != null ? cmdl.OutputDirectory.FullName : msetf.Directory.FullName; //var msetn = msetf.Name.Substring(0, msetf.Name.Length - msetf.Extension.Length); var msetn = m3d.ModelName; msetn = string.Concat(msetn, m3dw.FileExtension); opath = Path.Combine(opath, msetn); var m3df = new FileInfo(opath); m3dw.WriteModel(m3d, m3df); if (cmdl.CreateRawMeshes) { if (cmdl.VerboseMode) { ULogger.W("M3D RAW", "Creating raw dump"); } opath = string.Concat(opath, ".raw_3d"); var m3drf = new FileInfo(opath); msetdmp.WriteRawMesh(m3d, msetf, m3drf, utf8); } } } } catch (Exception ex) { ULogger.W("APP ERROR", "CRITICAL: ERROR WHILE UNPACKING MSET"); ULogger.X("APP ERROR", ex); } ULogger.W("MSET2", "Conversion completed"); ULogger.Q(); if (Debugger.IsAttached) { Console.ReadKey(); } }