private void Export_Shown(object sender, EventArgs e) { try { sfdExport.Title += " -- Test version " + typeof(ExportForm).Assembly.GetName().Version.ToString(); DialogResult dr = sfdExport.ShowDialog(); if (dr != DialogResult.OK) { Environment.ExitCode = 1; return; } string folder = Path.GetDirectoryName(sfdExport.FileName); string filebase = Path.GetFileNameWithoutExtension(sfdExport.FileName).Replace("_filebase", ""); try { using (FileStream fs = new FileStream(Path.Combine(folder, string.Format("{0}_filebase.s3asc", filebase)), FileMode.Create, FileAccess.Write)) { fs.Close(); } GenericRCOLResource rcolResource = new GenericRCOLResource(0, stream); MLOD mlod = null; if (rcolResource.ChunkEntries[0].TGIBlock.ResourceType == 0x01661233)//MODL { this.Text = "Export MODL..."; var lodRef = rcolResource.GetMLODChunkRefforMODL(); if (lodRef == null) { CopyableMessageBox.Show("MODL (0x01661233) with no MLOD (0x01D10F34).", "Invalid MODL resource", CopyableMessageBoxButtons.OK, CopyableMessageBoxIcon.Error); Environment.ExitCode = 1; return; } mlod = GenericRCOLResource.ChunkReference.GetBlock(rcolResource, lodRef) as MLOD; } else if (rcolResource.ChunkEntries[0].TGIBlock.ResourceType == 0x01D10F34)//MLOD { this.Text = "Export MLOD..."; mlod = rcolResource.ChunkEntries[0].RCOLBlock as MLOD; } else { CopyableMessageBox.Show("RCOL resource must be MODL (0x01661233) or MLOD (0x01D10F34).", "Invalid RCOL resource", CopyableMessageBoxButtons.OK, CopyableMessageBoxIcon.Error); Environment.ExitCode = 1; return; } Export export = new Export(new MyProgressBar(label1, pb)); for (int m = 0; m < mlod.Meshes.Count; m++) { string fnMesh = Path.Combine(folder, string.Format("{0}_group{1:D2}.s3ascg", filebase, m)); using (FileStream fsMesh = new FileStream(fnMesh, FileMode.Create, FileAccess.Write)) { export.Export_MLOD(new StreamWriter(fsMesh), rcolResource, mlod, mlod.Meshes[m]); fsMesh.Close(); } } Environment.ExitCode = 0; } catch (Exception ex) { CopyableMessageBox.IssueException(ex, "Error processing " + Program.Filename); throw ex; } } finally { this.Close(); } }
private void Import_Shown(object sender, EventArgs e) { try { ofdImport.Title += " -- Test version " + typeof(ImportForm).Assembly.GetName().Version.ToString(); DialogResult dr = ofdImport.ShowDialog(); if (dr != DialogResult.OK) { Environment.ExitCode = 1; return; } string folder = Path.GetDirectoryName(ofdImport.FileName); string filebase = Path.GetFileNameWithoutExtension(ofdImport.FileName).Replace("_filebase", ""); if (!File.Exists(Path.Combine(folder, string.Format("{0}_filebase.s3asc", filebase)))) { CopyableMessageBox.Show("File name must end \"_filebase.s3asc\"", "Base file not found", CopyableMessageBoxButtons.OK, CopyableMessageBoxIcon.Error); Environment.ExitCode = 1; return; } bool updateBBs = false; int q = CopyableMessageBox.Show("Update mesh bounding boxes?", Application.ProductName, CopyableMessageBoxButtons.YesNoCancel, CopyableMessageBoxIcon.Question); if (q == 0) updateBBs = true; else if (q == 2) { Environment.ExitCode = 1; return; } bool updateUVs = false; q = CopyableMessageBox.Show("Maximise mapping area?", Application.ProductName, CopyableMessageBoxButtons.YesNoCancel, CopyableMessageBoxIcon.Question); if (q == 0) updateUVs = true; else if (q == 2) { Environment.ExitCode = 1; return; } try { GenericRCOLResource rcolResource = new GenericRCOLResource(0, stream); MLOD mlod = null; IResourceKey rk = null; if (rcolResource.ChunkEntries[0].TGIBlock.ResourceType == 0x01661233)//MODL { this.Text = "Import MODL..."; var lodRef = rcolResource.GetMLODChunkRefforMODL(); if (lodRef == null) { CopyableMessageBox.Show("MODL (0x01661233) with no MLOD (0x01D10F34).", "Invalid MODL resource", CopyableMessageBoxButtons.OK, CopyableMessageBoxIcon.Error); Environment.ExitCode = 1; return; } rk = GenericRCOLResource.ChunkReference.GetKey(rcolResource, lodRef); mlod = GenericRCOLResource.ChunkReference.GetBlock(rcolResource, lodRef) as MLOD; } else if (rcolResource.ChunkEntries[0].TGIBlock.ResourceType == 0x01D10F34)//MLOD { this.Text = "Import MLOD..."; rk = rcolResource.ChunkEntries[0].TGIBlock; mlod = rcolResource.ChunkEntries[0].RCOLBlock as MLOD; } else { CopyableMessageBox.Show("RCOL resource must be MODL (0x01661233) or MLOD (0x01D10F34).", "Invalid RCOL resource", CopyableMessageBoxButtons.OK, CopyableMessageBoxIcon.Error); Environment.ExitCode = 1; return; } Import import = new Import(new MyProgressBar(label1, pb)); int m = 0; List<meshExpImp.ModelBlocks.Vertex[]> lmverts = new List<meshExpImp.ModelBlocks.Vertex[]>(); while (true) { string fnMesh = Path.Combine(folder, string.Format("{0}_group{1:D2}.s3ascg", filebase, m)); if (!File.Exists(fnMesh)) break; using (FileStream fsMesh = new FileStream(fnMesh, FileMode.Open, FileAccess.Read)) { meshExpImp.ModelBlocks.Vertex[] mverts; import.Import_Mesh(new StreamReader(fsMesh), mlod.Meshes[m++], rcolResource, mlod, rk, out mverts); lmverts.Add(mverts); fsMesh.Close(); } } List<Import.offScale> offScales = import.VertsToVBUFs(rcolResource, mlod, rk, lmverts, updateBBs, updateUVs); if (offScales.Count > 0) { while (true) { switch ( CopyableMessageBox.Show( Application.ProductName + " has detected some off-scale UV mappings.\n" + "This may mean your mapping is not stored as you intended.\n" + "This is often caused by UV-mapping too close to the edge of the map.\n\n" + "Click 'Commit' to commit the change or 'Cancel' to abandon.", Application.ProductName, CopyableMessageBoxIcon.Warning, new String[] { "C&ommit", "&View", "C&ancel", }, 0, 2)) { case 0: //commit goto Commit; case 1: //view System.Text.StringBuilder sb = new System.Text.StringBuilder(); offScales.ForEach(x => sb.AppendLine(x.ToString())); CopyableMessageBox.Show(sb.ToString(), Application.ProductName, CopyableMessageBoxButtons.OK, CopyableMessageBoxIcon.Information); break; default: //cancel Environment.ExitCode = 1; return; } } } Commit: result = (byte[])rcolResource.AsBytes.Clone(); Environment.ExitCode = 0; } catch (Exception ex) { CopyableMessageBox.IssueException(ex, "Error processing " + Program.Filename); throw ex; } } finally { this.Close(); } }
private void Import_Shown(object sender, EventArgs e) { try { ofdImport.Title += " -- Test version " + typeof(ImportForm).Assembly.GetName().Version.ToString(); DialogResult dr = ofdImport.ShowDialog(); if (dr != DialogResult.OK) { Environment.ExitCode = 1; return; } string folder = Path.GetDirectoryName(ofdImport.FileName); string filebase = Path.GetFileNameWithoutExtension(ofdImport.FileName).Replace("_filebase", ""); if (!File.Exists(Path.Combine(folder, string.Format("{0}_filebase.s3m2b", filebase)))) { CopyableMessageBox.Show("File name must end \"_filebase.s3m2b\"", "Base file not found", CopyableMessageBoxButtons.OK, CopyableMessageBoxIcon.Error); Environment.ExitCode = 1; return; } bool updateBBs = false; int q = CopyableMessageBox.Show("Update mesh bounding boxes?", Application.ProductName, CopyableMessageBoxButtons.YesNoCancel, CopyableMessageBoxIcon.Question); if (q == 0) { updateBBs = true; } else if (q == 2) { Environment.ExitCode = 1; return; } bool updateUVs = false; q = CopyableMessageBox.Show("Maximise mapping area?", Application.ProductName, CopyableMessageBoxButtons.YesNoCancel, CopyableMessageBoxIcon.Question); if (q == 0) { updateUVs = true; } else if (q == 2) { Environment.ExitCode = 1; return; } try { GenericRCOLResource rcolResource = new GenericRCOLResource(0, stream); MLOD mlod = null; IResourceKey rk = null; if (rcolResource.ChunkEntries[0].TGIBlock.ResourceType == 0x01661233)//MODL { this.Text = "Import MODL..."; var lodRef = rcolResource.GetMLODChunkRefforMODL(); if (lodRef == null) { CopyableMessageBox.Show("MODL (0x01661233) with no MLOD (0x01D10F34).", "Invalid MODL resource", CopyableMessageBoxButtons.OK, CopyableMessageBoxIcon.Error); Environment.ExitCode = 1; return; } rk = GenericRCOLResource.ChunkReference.GetKey(rcolResource, lodRef); mlod = GenericRCOLResource.ChunkReference.GetBlock(rcolResource, lodRef) as MLOD; } else if (rcolResource.ChunkEntries[0].TGIBlock.ResourceType == 0x01D10F34)//MLOD { this.Text = "Import MLOD..."; rk = rcolResource.ChunkEntries[0].TGIBlock; mlod = rcolResource.ChunkEntries[0].RCOLBlock as MLOD; } else { CopyableMessageBox.Show("RCOL resource must be MODL (0x01661233) or MLOD (0x01D10F34).", "Invalid RCOL resource", CopyableMessageBoxButtons.OK, CopyableMessageBoxIcon.Error); Environment.ExitCode = 1; return; } Import import = new Import(new MyProgressBar(label1, pb)); int m = 0; List <meshExpImp.ModelBlocks.Vertex[]> lmverts = new List <meshExpImp.ModelBlocks.Vertex[]>(); List <List <meshExpImp.ModelBlocks.Vertex[]> > llverts = new List <List <meshExpImp.ModelBlocks.Vertex[]> >(); while (true) { string fnMesh = Path.Combine(folder, string.Format("{0}_group{1:D2}.s3m2bg", filebase, m)); if (!File.Exists(fnMesh)) { break; } using (FileStream fsMesh = new FileStream(fnMesh, FileMode.Open, FileAccess.Read)) { meshExpImp.ModelBlocks.Vertex[] mverts; List <meshExpImp.ModelBlocks.Vertex[]> lverts; import.Import_Mesh(new StreamReader(fsMesh), mlod.Meshes[m++], rcolResource, mlod, rk, out mverts, out lverts); lmverts.Add(mverts); llverts.Add(lverts); fsMesh.Close(); } } List <Import.offScale> offScales = import.VertsToVBUFs(rcolResource, mlod, rk, lmverts, llverts, updateBBs, updateUVs); if (offScales.Count > 0) { while (true) { switch ( CopyableMessageBox.Show( Application.ProductName + " has detected some off-scale UV mappings.\n" + "This may mean your mapping is not stored as you intended.\n" + "This is often caused by UV-mapping too close to the edge of the map.\n\n" + "Click 'Commit' to commit the change or 'Cancel' to abandon.", Application.ProductName, CopyableMessageBoxIcon.Warning, new String[] { "C&ommit", "&View", "C&ancel", }, 0, 2)) { case 0: //commit goto Commit; case 1: //view System.Text.StringBuilder sb = new System.Text.StringBuilder(); offScales.ForEach(x => sb.AppendLine(x.ToString())); CopyableMessageBox.Show(sb.ToString(), Application.ProductName, CopyableMessageBoxButtons.OK, CopyableMessageBoxIcon.Information); break; default: //cancel Environment.ExitCode = 1; return; } } } Commit: result = (byte[])rcolResource.AsBytes.Clone(); Environment.ExitCode = 0; } catch (Exception ex) { CopyableMessageBox.IssueException(ex, "Error processing " + Program.Filename); throw ex; } } finally { this.Close(); } }