예제 #1
0
        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(); }
        }
예제 #2
0
        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(); }
        }
예제 #3
0
        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(); }
        }
예제 #4
0
        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(); }
        }