From 6f1a8ab81616ab451f107ab417c2960d30f7c2ff Mon Sep 17 00:00:00 2001 From: KillzXGaming Date: Thu, 9 May 2019 14:49:11 -0400 Subject: [PATCH] Add all the working BCRES stuff. --- .../FileFormats/BCRES/BCRES.cs | 95 ++++++++++++++ .../BCRES/Wrappers/BCRESGroupNode.cs | 96 ++++++++++++++ .../FileFormats/BCRES/Wrappers/CMDLWrapper.cs | 36 ++++++ .../FileFormats/BCRES/Wrappers/TXOBWrapper.cs | 102 +++++++++++++++ Switch_FileFormatsMain/Main.cs | 1 + .../Switch_FileFormatsMain.csproj | 8 ++ .../ImageEditor/ImageEditorBase.Designer.cs | 47 +++---- .../Editors/ImageEditor/ImageEditorBase.cs | 19 ++- .../Editors/ImageEditor/ImageEditorBase.resx | 6 +- Switch_Toolbox_Library/IO/STFileSaver.cs | 4 + Switch_Toolbox_Library/Swizzling/GX2.cs | 9 ++ Toolbox/GUI/GithubUpdateDialog.Designer.cs | 114 +++++++++++++++++ Toolbox/GUI/GithubUpdateDialog.cs | 30 +++++ Toolbox/GUI/GithubUpdateDialog.resx | 120 ++++++++++++++++++ Toolbox/Lib/BcresLibrary.deps.json | 75 +++++++++++ Toolbox/Lib/BcresLibrary.dll | Bin 0 -> 99840 bytes Toolbox/Lib/BcresLibrary.pdb | Bin 0 -> 40332 bytes Toolbox/Toolbox.csproj | 12 ++ Toolbox/UpdateProgram.cs | 16 +++ 19 files changed, 760 insertions(+), 30 deletions(-) create mode 100644 Switch_FileFormatsMain/FileFormats/BCRES/BCRES.cs create mode 100644 Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/BCRESGroupNode.cs create mode 100644 Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/CMDLWrapper.cs create mode 100644 Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/TXOBWrapper.cs create mode 100644 Toolbox/GUI/GithubUpdateDialog.Designer.cs create mode 100644 Toolbox/GUI/GithubUpdateDialog.cs create mode 100644 Toolbox/GUI/GithubUpdateDialog.resx create mode 100644 Toolbox/Lib/BcresLibrary.deps.json create mode 100644 Toolbox/Lib/BcresLibrary.dll create mode 100644 Toolbox/Lib/BcresLibrary.pdb diff --git a/Switch_FileFormatsMain/FileFormats/BCRES/BCRES.cs b/Switch_FileFormatsMain/FileFormats/BCRES/BCRES.cs new file mode 100644 index 00000000..f7c1cf02 --- /dev/null +++ b/Switch_FileFormatsMain/FileFormats/BCRES/BCRES.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Switch_Toolbox; +using System.Windows.Forms; +using Switch_Toolbox.Library; +using BcresLibrary; + +namespace FirstPlugin +{ + public class BCRES : TreeNodeFile, IFileFormat + { + public FileType FileType { get; set; } = FileType.Layout; + + public bool CanSave { get; set; } + public string[] Description { get; set; } = new string[] { "BCRES" }; + public string[] Extension { get; set; } = new string[] { "*.bcres" }; + public string FileName { get; set; } + public string FilePath { get; set; } + public IFileInfo IFileInfo { get; set; } + + public bool Identify(System.IO.Stream stream) + { + using (var reader = new Switch_Toolbox.Library.IO.FileReader(stream, true)) + { + return reader.CheckSignature(4, "CGFX"); + } + } + + public Type[] Types + { + get + { + List types = new List(); + return types.ToArray(); + } + } + + public BcresFile BcresFile; + + public void Load(System.IO.Stream stream) + { + Text = FileName; + BcresFile = new BcresFile(stream); + + AddNodeGroup(BcresFile.Data.Models, new BCRESGroupNode(BCRESGroupType.Models)); + AddNodeGroup(BcresFile.Data.Textures, new BCRESGroupNode(BCRESGroupType.Textures)); + AddNodeGroup(BcresFile.Data.Lookups, new BCRESGroupNode(BCRESGroupType.Lookups)); + AddNodeGroup(BcresFile.Data.Shaders, new BCRESGroupNode(BCRESGroupType.Shaders)); + AddNodeGroup(BcresFile.Data.Cameras, new BCRESGroupNode(BCRESGroupType.Cameras)); + AddNodeGroup(BcresFile.Data.Fogs, new BCRESGroupNode(BCRESGroupType.Fogs)); + AddNodeGroup(BcresFile.Data.Scenes, new BCRESGroupNode(BCRESGroupType.Scenes)); + AddNodeGroup(BcresFile.Data.SkeletalAnims, new BCRESGroupNode(BCRESGroupType.SkeletalAnim)); + AddNodeGroup(BcresFile.Data.MaterialAnims, new BCRESGroupNode(BCRESGroupType.MaterialAnim)); + AddNodeGroup(BcresFile.Data.VisibiltyAnims, new BCRESGroupNode(BCRESGroupType.VisibiltyAnim)); + AddNodeGroup(BcresFile.Data.CameraAnims, new BCRESGroupNode(BCRESGroupType.CameraAnim)); + AddNodeGroup(BcresFile.Data.LightAnims, new BCRESGroupNode(BCRESGroupType.LightAnim)); + AddNodeGroup(BcresFile.Data.EmitterAnims, new BCRESGroupNode(BCRESGroupType.EmitterAnim)); + AddNodeGroup(BcresFile.Data.Particles, new BCRESGroupNode(BCRESGroupType.Particles)); + } + + private void AddNodeGroup(ResDict SubSections, BCRESGroupNode Folder) + where T : CtrObject, new() + { + if (SubSections == null || SubSections.Count == 0) + return; + + Nodes.Add(Folder); + + foreach (CtrObject section in SubSections.Values) + { + switch (Folder.Type) + { + case BCRESGroupType.Models: + Folder.AddNode(new CMDLWrapper((Model)section)); + break; + case BCRESGroupType.Textures: + Folder.AddNode(new TXOBWrapper((Texture)section)); + break; + } + } + } + + public void Unload() + { + + } + public byte[] Save() + { + return null; + } + } +} diff --git a/Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/BCRESGroupNode.cs b/Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/BCRESGroupNode.cs new file mode 100644 index 00000000..2cc37d17 --- /dev/null +++ b/Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/BCRESGroupNode.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Switch_Toolbox.Library.NodeWrappers; +using Switch_Toolbox.Library.Forms; + +namespace FirstPlugin +{ + public enum BCRESGroupType + { + Models, + Textures, + Lookups, + Materials, + Shaders, + Cameras, + Lights, + Fogs, + Scenes, + SkeletalAnim, + MaterialAnim, + VisibiltyAnim, + CameraAnim, + LightAnim, + EmitterAnim, + Particles, + } + + public class BCRESGroupNode : STGenericWrapper + { + public Dictionary ResourceNodes = new Dictionary(); + + public BCRESGroupType Type; + + public BCRESGroupNode() : base() + { + ImageKey = "folder"; + + LoadContextMenus(); + } + + public BCRESGroupNode(string name) : base() { Text = name; } + public BCRESGroupNode(BCRESGroupType type) : base() { Type = type; SetNameByType(); } + + public override void LoadContextMenus() + { + ContextMenuStrip = new STContextMenuStrip(); + + CanExport = false; + CanReplace = false; + CanRename = false; + CanDelete = false; + } + + public void SetNameByType() + { + Text = SetName(); + } + + private string SetName() + { + switch (Type) + { + case BCRESGroupType.Models: return "Models"; + case BCRESGroupType.Textures: return "Textures"; + case BCRESGroupType.Lookups: return "Lookups"; + case BCRESGroupType.Materials: return "Materials"; + case BCRESGroupType.Shaders: return "Shaders"; + case BCRESGroupType.Cameras: return "Cameras"; + case BCRESGroupType.Lights: return "Lights"; + case BCRESGroupType.Fogs: return "Fogs"; + case BCRESGroupType.Scenes: return "Scenes"; + case BCRESGroupType.SkeletalAnim: return "Skeletal Animations"; + case BCRESGroupType.MaterialAnim: return "Material Animations"; + case BCRESGroupType.VisibiltyAnim: return "Visibilty Animations"; + case BCRESGroupType.CameraAnim: return "Camera Animations"; + case BCRESGroupType.LightAnim: return "Light Animations"; + case BCRESGroupType.EmitterAnim: return "Emitter Animations"; + case BCRESGroupType.Particles: return "Particles"; + default: + throw new System.Exception("Unknown type? " + Type); + } + } + + public void AddNode(STGenericWrapper node) + { + if (node.Text == string.Empty) + throw new System.Exception("Text invalid. Must not be empty! "); + + Nodes.Add(node); + ResourceNodes.Add(node.Text, node); + } + } +} diff --git a/Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/CMDLWrapper.cs b/Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/CMDLWrapper.cs new file mode 100644 index 00000000..737f3e7b --- /dev/null +++ b/Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/CMDLWrapper.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Switch_Toolbox.Library; +using BcresLibrary; + +namespace FirstPlugin +{ + public class CMDLWrapper : STGenericModel + { + public CMDLWrapper() + { + ImageKey = "Model"; + SelectedImageKey = "Model"; + } + public CMDLWrapper(Model model) : base() { LoadModel(model); } + + internal Model Model; + + public override void OnClick(TreeView treeview) + { + + } + + public void LoadModel(Model model) + { + Model = model; + + Text = model.Name; + } + } +} diff --git a/Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/TXOBWrapper.cs b/Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/TXOBWrapper.cs new file mode 100644 index 00000000..83cc73b2 --- /dev/null +++ b/Switch_FileFormatsMain/FileFormats/BCRES/Wrappers/TXOBWrapper.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Switch_Toolbox.Library; +using BcresLibrary; +using Switch_Toolbox.Library.Forms; + +namespace FirstPlugin +{ + public class TXOBWrapper : STGenericTexture + { + public TXOBWrapper() + { + ImageKey = "Texture"; + SelectedImageKey = "Texture"; + } + public TXOBWrapper(Texture texture) : base() { LoadTexture(texture); } + + internal Texture Texture; + + public override TEX_FORMAT[] SupportedFormats + { + get + { + return new TEX_FORMAT[] + { + + }; + } + } + + public override void OnClick(TreeView treeview) + { + UpdateEditor(); + } + + private void UpdateEditor() + { + ImageEditorBase editor = (ImageEditorBase)LibraryGUI.Instance.GetActiveContent(typeof(ImageEditorBase)); + if (editor == null) + { + editor = new ImageEditorBase(); + editor.Dock = DockStyle.Fill; + LibraryGUI.Instance.LoadEditor(editor); + } + + Properties prop = new Properties(); + prop.Width = Width; + prop.Height = Height; + prop.Depth = Depth; + prop.MipCount = MipCount; + prop.ArrayCount = ArrayCount; + prop.ImageSize = (uint)Texture.Images[0].ImageData.Length; + prop.Format = Format; + + editor.Text = Text; + editor.LoadProperties(prop); + editor.LoadImage(this); + } + + public void LoadTexture(Texture texture) + { + ImageKey = "Texture"; + SelectedImageKey = "Texture"; + + Texture = texture; + + Text = texture.Name; + + //Cube maps will use multiple images + //Break at the end as we only need the first part for generic things + foreach (var image in texture.Images) + { + Width = image.Width; + Height = image.Height; + MipCount = image.MipCount; + Format = CTR_3DS.ConvertPICAToGenericFormat( + (CTR_3DS.PICASurfaceFormat)image.ImageFormat); + + break; + } + } + + public override bool CanEdit { get; set; } = false; + + public override void SetImageData(Bitmap bitmap, int ArrayLevel) + { + throw new NotImplementedException(); + } + + public override byte[] GetImageData(int ArrayLevel = 0, int MipLevel = 0) + { + PlatformSwizzle = PlatformSwizzle.Platform_3DS; + + return Texture.Images[ArrayLevel].ImageData; + } + } +} diff --git a/Switch_FileFormatsMain/Main.cs b/Switch_FileFormatsMain/Main.cs index 071a1684..3185e675 100644 --- a/Switch_FileFormatsMain/Main.cs +++ b/Switch_FileFormatsMain/Main.cs @@ -111,6 +111,7 @@ namespace FirstPlugin List Formats = new List(); Formats.Add(typeof(SARC)); Formats.Add(typeof(BFRES)); + Formats.Add(typeof(BCRES)); Formats.Add(typeof(BNTX)); Formats.Add(typeof(BEA)); Formats.Add(typeof(BYAML)); diff --git a/Switch_FileFormatsMain/Switch_FileFormatsMain.csproj b/Switch_FileFormatsMain/Switch_FileFormatsMain.csproj index 64cbbdf4..195ab330 100644 --- a/Switch_FileFormatsMain/Switch_FileFormatsMain.csproj +++ b/Switch_FileFormatsMain/Switch_FileFormatsMain.csproj @@ -55,6 +55,9 @@ ..\Toolbox\Lib\BarsLibrary.dll False + + ..\Toolbox\Lib\BcresLibrary.dll + ..\Toolbox\Lib\BezelEngineArchive_Lib.dll False @@ -201,6 +204,10 @@ + + + + @@ -1180,5 +1187,6 @@ + \ No newline at end of file diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs index abeab9af..fd03685a 100644 --- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs @@ -30,10 +30,11 @@ { this.components = new System.ComponentModel.Container(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.stPanel2 = new Switch_Toolbox.Library.Forms.STPanel(); this.stPanel1 = new Switch_Toolbox.Library.Forms.STPanel(); this.stPanel4 = new Switch_Toolbox.Library.Forms.STPanel(); + this.stPanel5 = new Switch_Toolbox.Library.Forms.STPanel(); + this.bottomLabel = new Switch_Toolbox.Library.Forms.STLabel(); this.pictureBoxCustom1 = new Cyotek.Windows.Forms.ImageBox(); this.stPanel3 = new Switch_Toolbox.Library.Forms.STPanel(); this.alphaBtn = new Switch_Toolbox.Library.Forms.STButton(); @@ -72,19 +73,18 @@ this.adjustmentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.hueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.brightnessContrastToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.stContextMenuStrip2 = new Switch_Toolbox.Library.Forms.STContextMenuStrip(this.components); this.copyImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.bottomLabel = new Switch_Toolbox.Library.Forms.STLabel(); - this.stPanel5 = new Switch_Toolbox.Library.Forms.STPanel(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.SuspendLayout(); this.stPanel1.SuspendLayout(); this.stPanel4.SuspendLayout(); + this.stPanel5.SuspendLayout(); this.stPanel3.SuspendLayout(); this.stContextMenuStrip1.SuspendLayout(); this.stContextMenuStrip2.SuspendLayout(); - this.stPanel5.SuspendLayout(); this.SuspendLayout(); // // splitContainer1 @@ -141,11 +141,29 @@ this.stPanel4.Size = new System.Drawing.Size(514, 425); this.stPanel4.TabIndex = 8; // + // stPanel5 + // + this.stPanel5.Controls.Add(this.bottomLabel); + this.stPanel5.Dock = System.Windows.Forms.DockStyle.Bottom; + this.stPanel5.Location = new System.Drawing.Point(0, 405); + this.stPanel5.Name = "stPanel5"; + this.stPanel5.Size = new System.Drawing.Size(514, 20); + this.stPanel5.TabIndex = 1; + // + // bottomLabel + // + this.bottomLabel.AutoSize = true; + this.bottomLabel.Location = new System.Drawing.Point(-1, 4); + this.bottomLabel.Name = "bottomLabel"; + this.bottomLabel.Size = new System.Drawing.Size(0, 13); + this.bottomLabel.TabIndex = 18; + // // pictureBoxCustom1 // this.pictureBoxCustom1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBoxCustom1.ContextMenuStrip = this.stContextMenuStrip2; this.pictureBoxCustom1.Location = new System.Drawing.Point(0, 0); this.pictureBoxCustom1.Name = "pictureBoxCustom1"; this.pictureBoxCustom1.Size = new System.Drawing.Size(514, 406); @@ -520,23 +538,6 @@ this.copyImageToolStripMenuItem.Text = "Copy Image"; this.copyImageToolStripMenuItem.Click += new System.EventHandler(this.copyImageToolStripMenuItem_Click); // - // bottomLabel - // - this.bottomLabel.AutoSize = true; - this.bottomLabel.Location = new System.Drawing.Point(-1, 4); - this.bottomLabel.Name = "bottomLabel"; - this.bottomLabel.Size = new System.Drawing.Size(0, 13); - this.bottomLabel.TabIndex = 18; - // - // stPanel5 - // - this.stPanel5.Controls.Add(this.bottomLabel); - this.stPanel5.Dock = System.Windows.Forms.DockStyle.Bottom; - this.stPanel5.Location = new System.Drawing.Point(0, 405); - this.stPanel5.Name = "stPanel5"; - this.stPanel5.Size = new System.Drawing.Size(514, 20); - this.stPanel5.TabIndex = 1; - // // ImageEditorBase // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -550,13 +551,13 @@ this.stPanel1.ResumeLayout(false); this.stPanel1.PerformLayout(); this.stPanel4.ResumeLayout(false); + this.stPanel5.ResumeLayout(false); + this.stPanel5.PerformLayout(); this.stPanel3.ResumeLayout(false); this.stPanel3.PerformLayout(); this.stContextMenuStrip1.ResumeLayout(false); this.stContextMenuStrip1.PerformLayout(); this.stContextMenuStrip2.ResumeLayout(false); - this.stPanel5.ResumeLayout(false); - this.stPanel5.PerformLayout(); this.ResumeLayout(false); } diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs index bd7f63f4..625f5f66 100644 --- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs +++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs @@ -340,7 +340,7 @@ namespace Switch_Toolbox.Library.Forms DecodeProcessFinished = false; - PushImage(Properties.Resources.LoadingImage); + // PushImage(Properties.Resources.LoadingImage); var image = ActiveTexture.GetBitmap(CurArrayDisplayLevel, CurMipDisplayLevel); @@ -1146,13 +1146,24 @@ namespace Switch_Toolbox.Library.Forms private void SetZoomSetting() { - if (!IsFinished) - return; + if (pictureBoxCustom1.InvokeRequired) + { + pictureBoxCustom1.Invoke(new MethodInvoker( + delegate () + { + ApplyZoom(); + })); + } + else + ApplyZoom(); + } + private void ApplyZoom() + { if (Runtime.ImageEditor.EnableImageZoom) { pictureBoxCustom1.AllowZoom = true; - pictureBoxCustom1.AllowClickZoom = true; + pictureBoxCustom1.AllowClickZoom = false; pictureBoxCustom1.SizeMode = Cyotek.Windows.Forms.ImageBoxSizeMode.Normal; } else diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.resx b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.resx index 8a8b6301..6edb1efb 100644 --- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.resx +++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.resx @@ -117,15 +117,15 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 184, 17 + 351, 17 17, 17 - - 184, 17 - 108 diff --git a/Switch_Toolbox_Library/IO/STFileSaver.cs b/Switch_Toolbox_Library/IO/STFileSaver.cs index 25957f85..ee0ca2e9 100644 --- a/Switch_Toolbox_Library/IO/STFileSaver.cs +++ b/Switch_Toolbox_Library/IO/STFileSaver.cs @@ -18,6 +18,10 @@ namespace Switch_Toolbox.Library.IO /// public static void SaveFileFormat(IFileFormat FileFormat, string FileName, bool EnableDialog = true) { + //These always get created on loading a file,however not on creating a new file + if (FileFormat.IFileInfo == null) + throw new System.Exception("Make sure to impliment a IFileInfo instance if a format is being created!"); + Cursor.Current = Cursors.WaitCursor; FileFormat.FilePath = FileName; diff --git a/Switch_Toolbox_Library/Swizzling/GX2.cs b/Switch_Toolbox_Library/Swizzling/GX2.cs index ea65c7f6..452bad3b 100644 --- a/Switch_Toolbox_Library/Swizzling/GX2.cs +++ b/Switch_Toolbox_Library/Swizzling/GX2.cs @@ -488,6 +488,7 @@ namespace Switch_Toolbox.Library var surfOut = getSurfaceInfo((GX2SurfaceFormat)Format, Width, Height, Depth, SurfaceDim, TileMode, AAMode, 0); Console.WriteLine("Imported surfSize" + surfOut.surfSize); Console.WriteLine("Imported data block" + imageData.Length); + Console.WriteLine("GX2SurfaceFormat " + (GX2SurfaceFormat)Format); uint imageSize = (uint)surfOut.surfSize; uint alignment = surfOut.baseAlign; @@ -520,12 +521,20 @@ namespace Switch_Toolbox.Library if (TileMode == 0) TileMode = GX2.getDefaultGX2TileMode((uint)SurfaceDim, Width, Height, 1, (uint)Format, 0, 1); + uint tilingDepth = surfOut.depth; + + if (TileMode == 3) + tilingDepth /= 4; + int tiling1dLevel = 0; bool tiling1dLevelSet = false; List mipOffsets = new List(); List Swizzled = new List(); + if (MipCount == 0) + MipCount = 1; + for (int mipLevel = 0; mipLevel < MipCount; mipLevel++) { var result = TextureHelper.GetCurrentMipSize(Width, Height, blkWidth, blkHeight, bpp, mipLevel); diff --git a/Toolbox/GUI/GithubUpdateDialog.Designer.cs b/Toolbox/GUI/GithubUpdateDialog.Designer.cs new file mode 100644 index 00000000..78950e61 --- /dev/null +++ b/Toolbox/GUI/GithubUpdateDialog.Designer.cs @@ -0,0 +1,114 @@ +namespace Toolbox +{ + partial class GithubUpdateDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.stButton1 = new Switch_Toolbox.Library.Forms.STButton(); + this.stButton2 = new Switch_Toolbox.Library.Forms.STButton(); + this.listViewCustom1 = new Switch_Toolbox.Library.Forms.ListViewCustom(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contentContainer.SuspendLayout(); + this.SuspendLayout(); + // + // contentContainer + // + this.contentContainer.Controls.Add(this.listViewCustom1); + this.contentContainer.Controls.Add(this.stButton2); + this.contentContainer.Controls.Add(this.stButton1); + this.contentContainer.Controls.SetChildIndex(this.stButton1, 0); + this.contentContainer.Controls.SetChildIndex(this.stButton2, 0); + this.contentContainer.Controls.SetChildIndex(this.listViewCustom1, 0); + // + // stButton1 + // + this.stButton1.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.stButton1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.stButton1.Location = new System.Drawing.Point(459, 361); + this.stButton1.Name = "stButton1"; + this.stButton1.Size = new System.Drawing.Size(75, 23); + this.stButton1.TabIndex = 11; + this.stButton1.Text = "Cancel"; + this.stButton1.UseVisualStyleBackColor = false; + // + // stButton2 + // + this.stButton2.DialogResult = System.Windows.Forms.DialogResult.OK; + this.stButton2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.stButton2.Location = new System.Drawing.Point(378, 361); + this.stButton2.Name = "stButton2"; + this.stButton2.Size = new System.Drawing.Size(75, 23); + this.stButton2.TabIndex = 12; + this.stButton2.Text = "Ok"; + this.stButton2.UseVisualStyleBackColor = false; + // + // listViewCustom1 + // + this.listViewCustom1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.listViewCustom1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2}); + this.listViewCustom1.FullRowSelect = true; + this.listViewCustom1.Location = new System.Drawing.Point(3, 31); + this.listViewCustom1.Name = "listViewCustom1"; + this.listViewCustom1.OwnerDraw = true; + this.listViewCustom1.Size = new System.Drawing.Size(540, 324); + this.listViewCustom1.TabIndex = 13; + this.listViewCustom1.UseCompatibleStateImageBehavior = false; + this.listViewCustom1.View = System.Windows.Forms.View.Details; + // + // columnHeader1 + // + this.columnHeader1.Text = "Message"; + this.columnHeader1.Width = 172; + // + // columnHeader2 + // + this.columnHeader2.Text = "Date"; + // + // GithubUpdateDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(549, 398); + this.Name = "GithubUpdateDialog"; + this.Text = "Github Update"; + this.contentContainer.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private Switch_Toolbox.Library.Forms.STButton stButton1; + private Switch_Toolbox.Library.Forms.STButton stButton2; + private Switch_Toolbox.Library.Forms.ListViewCustom listViewCustom1; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + } +} \ No newline at end of file diff --git a/Toolbox/GUI/GithubUpdateDialog.cs b/Toolbox/GUI/GithubUpdateDialog.cs new file mode 100644 index 00000000..fdd1ca44 --- /dev/null +++ b/Toolbox/GUI/GithubUpdateDialog.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Switch_Toolbox.Library.Forms; +using Octokit; + +namespace Toolbox +{ + public partial class GithubUpdateDialog : STForm + { + public GithubUpdateDialog() + { + InitializeComponent(); + } + + public void LoadCommits(List Commits) + { + foreach (var commit in Commits) + { + listViewCustom1.Items.Add(commit.Commit.Message).SubItems.Add(commit.Commit.Author.Date.DateTime.ToString()); + } + } + } +} diff --git a/Toolbox/GUI/GithubUpdateDialog.resx b/Toolbox/GUI/GithubUpdateDialog.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/Toolbox/GUI/GithubUpdateDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Toolbox/Lib/BcresLibrary.deps.json b/Toolbox/Lib/BcresLibrary.deps.json new file mode 100644 index 00000000..39ac481f --- /dev/null +++ b/Toolbox/Lib/BcresLibrary.deps.json @@ -0,0 +1,75 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "cfe1dc2a80602aef150a12815387068463a61a0d" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "BcresLibrary/1.0.0": { + "dependencies": { + "NETStandard.Library": "2.0.3", + "Syroot.BinaryData": "2.0.1.0", + "Syroot.Maths": "1.5.3.0" + }, + "runtime": { + "BcresLibrary.dll": {} + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Syroot.BinaryData/2.0.1.0": { + "runtime": { + "Syroot.BinaryData.dll": { + "assemblyVersion": "2.0.1.0", + "fileVersion": "2.0.1.0" + } + } + }, + "Syroot.Maths/1.5.3.0": { + "runtime": { + "Syroot.Maths.dll": { + "assemblyVersion": "1.5.3.0", + "fileVersion": "1.5.3.0" + } + } + } + } + }, + "libraries": { + "BcresLibrary/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "Syroot.BinaryData/2.0.1.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + }, + "Syroot.Maths/1.5.3.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/Toolbox/Lib/BcresLibrary.dll b/Toolbox/Lib/BcresLibrary.dll new file mode 100644 index 0000000000000000000000000000000000000000..d21361d6446d42824f6b7a3395c99e554c8bcbd3 GIT binary patch literal 99840 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 literal 0 HcmV?d00001 diff --git a/Toolbox/Lib/BcresLibrary.pdb b/Toolbox/Lib/BcresLibrary.pdb new file mode 100644 index 0000000000000000000000000000000000000000..c6a183cbec4bf4619dd92d18655191b07c85b183 GIT binary patch literal 40332 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 z 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 literal 0 HcmV?d00001 diff --git a/Toolbox/Toolbox.csproj b/Toolbox/Toolbox.csproj index 44a996e6..a404eacb 100644 --- a/Toolbox/Toolbox.csproj +++ b/Toolbox/Toolbox.csproj @@ -82,6 +82,12 @@ GithubIssueDialog.cs + + Form + + + GithubUpdateDialog.cs + Form @@ -120,6 +126,9 @@ GithubIssueDialog.cs + + GithubUpdateDialog.cs + PluginManager.cs @@ -253,6 +262,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Toolbox/UpdateProgram.cs b/Toolbox/UpdateProgram.cs index 37df1313..b164797d 100644 --- a/Toolbox/UpdateProgram.cs +++ b/Toolbox/UpdateProgram.cs @@ -15,6 +15,7 @@ namespace Toolbox static Release[] releases; public static bool CanUpdate = false; public static Release LatestRelease; + public static List CommitList = new List(); public static void CheckLatest() { @@ -22,6 +23,7 @@ namespace Toolbox { var client = new GitHubClient(new ProductHeaderValue("ST_UpdateTool")); GetReleases(client).Wait(); + GetCommits(client).Wait(); foreach (Release latest in releases) { @@ -45,6 +47,20 @@ namespace Toolbox Console.WriteLine($"Failed to get latest update\n{ex.ToString()}"); } } + static async Task GetCommits(GitHubClient client) + { + var options = new ApiOptions + { + PageSize = 5, + PageCount = 1 + }; + + foreach (GitHubCommit c in await client.Repository.Commit.GetAll("KillzXGaming", "Switch-Toolbox", options)) + { + CommitList.Add(c); + } + } + static async Task GetReleases(GitHubClient client) { List Releases = new List();