From 0f19107dd269a1029777969115218601981d6c96 Mon Sep 17 00:00:00 2001 From: KillzXGaming Date: Wed, 18 Sep 2019 18:23:27 -0400 Subject: [PATCH] More layout editor improvements Window panes render near perfectly aside from materials. Update fixes the texture flip flags and other uv fixes, Fixed UV transformation issues. Commonly when a uv is suppose to be centered but it shifts wrong. Add basic white and black color blending. Fix LA8 texture rendering. Start on BRLAN support. --- .../BFRES/Bfres Structs/SubFiles/FMDL/FMAT.cs | 2 +- .../FileFormats/Layout/BxlytToGL.cs | 96 ++- .../FileFormats/Layout/CAFE/BFLAN.cs | 133 +---- .../FileFormats/Layout/CAFE/BFLYT.cs | 9 +- .../FileFormats/Layout/CAFE/BflytShader.cs | 10 +- .../FileFormats/Layout/Common.cs | 153 ++++- .../FileFormats/Layout/Rev/BRLAN.cs | 553 ++++++++++++++++++ .../FileFormats/Texture/BFLIM.cs | 2 +- .../FileFormats/Texture/TVOL.cs | 25 +- .../FileFormats/Texture/XTX.cs | 12 +- .../File_Format_Library.csproj | 2 +- .../GUI/BFLYT/LayoutHierarchy.cs | 8 +- File_Format_Library/Main.cs | 3 +- .../FileFormats/DDS/RGBAPixelDecoder.cs | 42 +- Switch_Toolbox_Library/Forms/ColorSelector.cs | 18 +- .../Dialogs/ColorSelectorDropdown.Designer.cs | 23 +- .../Forms/Dialogs/ColorSelectorDropdown.cs | 18 +- .../IO/Colors/ColorEditor.cs | 18 +- Toolbox/Shader/Layout/Legacy/Bflyt.frag | 6 +- Toolbox/Shader/Layout/Legacy/Bflyt.vert | 8 +- 20 files changed, 919 insertions(+), 222 deletions(-) create mode 100644 File_Format_Library/FileFormats/Layout/Rev/BRLAN.cs diff --git a/File_Format_Library/FileFormats/BFRES/Bfres Structs/SubFiles/FMDL/FMAT.cs b/File_Format_Library/FileFormats/BFRES/Bfres Structs/SubFiles/FMDL/FMAT.cs index 7ccaa3bc..7664282c 100644 --- a/File_Format_Library/FileFormats/BFRES/Bfres Structs/SubFiles/FMDL/FMAT.cs +++ b/File_Format_Library/FileFormats/BFRES/Bfres Structs/SubFiles/FMDL/FMAT.cs @@ -289,7 +289,7 @@ namespace Bfres.Structs if (ShaderName == "alRenderMaterial" || ShaderName == "alRenderCloudLayer" || ShaderName == "alRenderSky") Runtime.activeGame = Runtime.ActiveGame.SMO; - else if (ShaderName == "forward_plus_char") + else if (ShaderName == "forward_plus_char" || ShaderName == "bezel_pbr") Runtime.activeGame = Runtime.ActiveGame.Bezel; else if (ShaderName == "Turbo_UBER") Runtime.activeGame = Runtime.ActiveGame.MK8D; diff --git a/File_Format_Library/FileFormats/Layout/BxlytToGL.cs b/File_Format_Library/FileFormats/Layout/BxlytToGL.cs index e871e2ae..0ab18f93 100644 --- a/File_Format_Library/FileFormats/Layout/BxlytToGL.cs +++ b/File_Format_Library/FileFormats/Layout/BxlytToGL.cs @@ -323,6 +323,13 @@ namespace LayoutBXLYT float contentWidth = ((window.StretchLeft + (pane.Width - frameLeft)) - frameRight) + window.StretchRight; float contentHeight = ((window.StretchTop + (pane.Height - frameTop)) - frameBottom) + window.StretchBottm; + //Apply pane alpha + for (int i = 0; i < colors.Length; i++) + { + uint setalpha = (uint)((colors[i].A * effectiveAlpha) / 255); + colors[i] = Color.FromArgb((int)setalpha, colors[i]); + } + if (!window.NotDrawnContent && window.WindowKind != WindowKind.HorizontalNoContent) { SetupShaders(window.Content.Material, Textures); @@ -475,6 +482,8 @@ namespace LayoutBXLYT { SetupShaders(matTL, Textures); + matTL.Shader.SetInt("flipTexture", (int)window.WindowFrames[0].TextureFlip); + float pieceWidth = pane.Width - frameRight; float pieceHeight = frameTop; @@ -492,15 +501,17 @@ namespace LayoutBXLYT { SetupShaders(matTR, Textures); + matTR.Shader.SetInt("flipTexture", (int)window.WindowFrames[1].TextureFlip); + float pieceWidth = frameRight; float pieceHeight = pane.Height - frameBottom; texCoords = new Vector2[] { - new Vector2(1, 0), new Vector2(0, 0), - new Vector2(0,(pane.Height - frameTop) / frameTop), + new Vector2(1, 0), new Vector2(1,(pane.Height - frameTop) / frameTop), + new Vector2(0,(pane.Height - frameTop) / frameTop), }; DrawQuad(dX + pane.Width - frameRight, dY, pieceWidth, pieceHeight, texCoords, colors); @@ -509,15 +520,17 @@ namespace LayoutBXLYT { SetupShaders(matBL, Textures); + matBL.Shader.SetInt("flipTexture", (int)window.WindowFrames[2].TextureFlip); + float pieceWidth = frameLeft; float pieceHeight = pane.Height - frameTop; texCoords = new Vector2[] { - new Vector2(0,(pane.Height - frameBottom) / frameBottom), - new Vector2(1,(pane.Height - frameBottom) / frameBottom), - new Vector2(1, 0), - new Vector2(0, 0), + new Vector2(0,1 - ((pane.Height - frameTop) / frameTop)), + new Vector2(1,1 - ((pane.Height - frameTop) / frameTop)), + new Vector2(1, 1), + new Vector2(0, 1), }; DrawQuad(dX, dY - frameTop, pieceWidth, pieceHeight, texCoords, colors); @@ -526,15 +539,17 @@ namespace LayoutBXLYT { SetupShaders(matBR, Textures); + matBR.Shader.SetInt("flipTexture", (int)window.WindowFrames[3].TextureFlip); + float pieceWidth = pane.Width - frameLeft; float pieceHeight = frameBottom; texCoords = new Vector2[] { - new Vector2((pane.Width - frameLeft) / frameLeft, 1), - new Vector2(0, 1), - new Vector2(0, 0), - new Vector2((pane.Width - frameLeft) / frameLeft, 0), + new Vector2(1 - ((pane.Width - frameLeft) / frameLeft), 0), + new Vector2(1, 0), + new Vector2(1, 1), + new Vector2(1 - ((pane.Width - frameLeft) / frameLeft), 1), }; DrawQuad(dX + frameLeft, dY - pane.Height + frameBottom, pieceWidth, pieceHeight, texCoords, colors); @@ -556,30 +571,71 @@ namespace LayoutBXLYT if (matTL.TextureMaps.Length > 0) { SetupShaders(matTL, Textures); + matTL.Shader.SetInt("flipTexture", (int)window.WindowFrames[0].TextureFlip); + + texCoords = new Vector2[] + { + new Vector2(0, 0), + new Vector2(1, 0), + new Vector2(1, 1), + new Vector2(0, 1), + }; + DrawQuad(dX, dY, frameLeft, frameTop, texCoords, colors); } if (matTR.TextureMaps.Length > 0) { SetupShaders(matTR, Textures); + matTR.Shader.SetInt("flipTexture", (int)window.WindowFrames[1].TextureFlip); + + texCoords = new Vector2[] + { + new Vector2(0, 0), + new Vector2(1, 0), + new Vector2(1, 1), + new Vector2(0, 1), + }; + DrawQuad(dX + pane.Width - frameRight, dY, frameRight, frameTop, texCoords, colors); } if (matBL.TextureMaps.Length > 0) { SetupShaders(matBL, Textures); + matBL.Shader.SetInt("flipTexture", (int)window.WindowFrames[2].TextureFlip); + + texCoords = new Vector2[] + { + new Vector2(0, 0), + new Vector2(1, 0), + new Vector2(1, 1), + new Vector2(0, 1), + }; + DrawQuad(dX, dY - pane.Height + frameTop, frameLeft, frameBottom, texCoords, colors); } if (matBR.TextureMaps.Length > 0) { SetupShaders(matBR, Textures); + matBR.Shader.SetInt("flipTexture", (int)window.WindowFrames[3].TextureFlip); + + texCoords = new Vector2[] + { + new Vector2(0, 0), + new Vector2(1, 0), + new Vector2(1, 1), + new Vector2(0, 1), + }; + DrawQuad(dX + pane.Width - frameLeft, dY - pane.Height + frameBottom, frameRight, frameBottom, texCoords, colors); } if (matT.TextureMaps.Length > 0) { SetupShaders(matT, Textures); + matT.Shader.SetInt("flipTexture", (int)window.WindowFrames[4].TextureFlip); texCoords = new Vector2[] { @@ -595,13 +651,14 @@ namespace LayoutBXLYT if (matB.TextureMaps.Length > 0) { SetupShaders(matB, Textures); + matB.Shader.SetInt("flipTexture", (int)window.WindowFrames[5].TextureFlip); texCoords = new Vector2[] { - new Vector2((pane.Width - frameLeft) / frameLeft, 1), - new Vector2(0, 1), - new Vector2(0, 0), - new Vector2((pane.Width - frameLeft) / frameLeft, 0), + new Vector2(1-((pane.Width - frameLeft) / frameLeft), 0), + new Vector2(1, 0), + new Vector2(1, 1), + new Vector2(1-((pane.Width - frameLeft) / frameLeft), 1), }; DrawQuad(dX + frameRight, dY - (pane.Height - frameBottom), contentWidth, frameTop, texCoords, colors); @@ -610,13 +667,14 @@ namespace LayoutBXLYT if (matL.TextureMaps.Length > 0) { SetupShaders(matL, Textures); + matL.Shader.SetInt("flipTexture", (int)window.WindowFrames[6].TextureFlip); texCoords = new Vector2[] { - new Vector2(0,(pane.Height - frameTop) / frameTop), - new Vector2(1,(pane.Height - frameTop) / frameTop), - new Vector2(1, 0), - new Vector2(0, 0), + new Vector2(0,1-((pane.Height - frameTop) / frameTop)), + new Vector2(1,1-((pane.Height - frameTop) / frameTop)), + new Vector2(1, 1), + new Vector2(0, 1), }; DrawQuad(dX, dY - frameTop, frameLeft, contentHeight, texCoords, colors); @@ -625,6 +683,8 @@ namespace LayoutBXLYT if (matR.TextureMaps.Length > 0) { SetupShaders(matR, Textures); + matR.Shader.SetInt("flipTexture", (int)window.WindowFrames[7].TextureFlip); + texCoords = new Vector2[] { new Vector2(0, 0), diff --git a/File_Format_Library/FileFormats/Layout/CAFE/BFLAN.cs b/File_Format_Library/FileFormats/Layout/CAFE/BFLAN.cs index 01587cb3..b87623c3 100644 --- a/File_Format_Library/FileFormats/Layout/CAFE/BFLAN.cs +++ b/File_Format_Library/FileFormats/Layout/CAFE/BFLAN.cs @@ -109,9 +109,6 @@ namespace LayoutBXLYT //As of now this should be empty but just for future proofing private List UnknownSections = new List(); - public PAT1 AnimationTag; - public PAI1 AnimationInfo; - public void Read(FileReader reader, BFLAN bflan) { AnimationTag = new PAT1(); @@ -201,28 +198,9 @@ namespace LayoutBXLYT } } - public class PAT1 : SectionCommon + public class PAT1 : BxlanPAT1 { - [DisplayName("Name"), CategoryAttribute("Animation")] - public string Name { get; set; } - - [DisplayName("Groups"), CategoryAttribute("Animation")] - public List Groups { get; set; } - - [DisplayName("Start"), CategoryAttribute("Frames")] - public short StartFrame { get; set; } - - [DisplayName("End"), CategoryAttribute("Frames")] - public short EndFrame { get; set; } - - [DisplayName("Animation Order"), CategoryAttribute("Parameters")] - public ushort AnimationOrder { get; set; } - - [DisplayName("Child Binding"), CategoryAttribute("Parameters")] - public bool ChildBinding { get; set; } - private byte[] UnknownData; - private byte flags; public PAT1() @@ -281,14 +259,9 @@ namespace LayoutBXLYT } } - public class PAI1 : SectionCommon + public class PAI1 : BxlanPAI1 { - public ushort FrameSize; - public bool Loop; - - public List Textures { get; set; } - public List Entries = new List(); public PAI1() { @@ -355,22 +328,14 @@ namespace LayoutBXLYT for (int i = 0; i < Entries.Count; i++) { writer.WriteUint32Offset(startOfsPos + (i * 4), startPos); - Entries[i].Write(writer, header); + ((PaiEntry)Entries[i]).Write(writer, header); } } } } - public class PaiEntry + public class PaiEntry : BxlanPaiEntry { - [DisplayName("Name"), CategoryAttribute("Animation")] - public string Name { get; set; } - - [DisplayName("Target"), CategoryAttribute("Animation")] - public AnimationTarget Target { get; set; } - - public List Tags = new List(); - public PaiEntry(FileReader reader, Header header) { long startPos = reader.Position; @@ -402,37 +367,14 @@ namespace LayoutBXLYT for (int i = 0; i < Tags.Count; i++) { writer.WriteUint32Offset(startPos + 32 + (i * 4), startPos); - Tags[i].Write(writer, header, Target); + ((PaiTag)Tags[i]).Write(writer, header, Target); } } } } - public class PaiTag + public class PaiTag : BxlanPaiTag { - public List Entries = new List(); - - private string Tag; - - public string Type - { - get { return TypeDefine.ContainsKey(Tag) ? TypeDefine[Tag] : Tag; } - } - - public Dictionary TypeDefine = new Dictionary() - { - {"FLPA","PaneSRT" }, - {"FLVI","Visibility" }, - {"FLTS","TextureSRT" }, - {"FLVC","VertexColor" }, - {"FLMC","MaterialColor" }, - {"FLTP","TexturePattern" }, - {"FLIM","IndTextureSRT" }, - {"FLAC","AlphaTest" }, - {"FLCT","FontShadow" }, - {"FLCC","PerCharacterTransformCurve" }, - }; - private uint Unknown {get;set;} public PaiTag(FileReader reader, Header header, AnimationTarget target) @@ -489,31 +431,15 @@ namespace LayoutBXLYT for (int i = 0; i < Entries.Count; i++) { writer.WriteUint32Offset(startPos + 8 + (i * 4), startPos); - Entries[i].Write(writer, header); + ((PaiTagEntry)Entries[i]).Write(writer, header); } } } - public class PaiTagEntry + public class PaiTagEntry : BxlanPaiTagEntry { - [Browsable(false)] - public virtual string TargetName - { - get { return AnimationTarget.ToString(); } - } - - public byte AnimationTarget; - - [DisplayName("Index"), CategoryAttribute("Tag")] - public byte Index { get; private set; } - - [DisplayName("Data Type"), CategoryAttribute("Tag")] - public KeyType DataType { get; private set; } - public byte Unknown; - public List KeyFrames = new List(); - public PaiTagEntry(FileReader reader, Header header) { long startPos = reader.Position; @@ -525,7 +451,6 @@ namespace LayoutBXLYT reader.ReadUInt16(); //Padding uint keyFrameOffset = reader.ReadUInt32(); - reader.SeekBegin(startPos + keyFrameOffset); for (int i = 0; i < KeyFrameCount; i++) KeyFrames.Add(new KeyFrame(reader, DataType)); @@ -552,48 +477,6 @@ namespace LayoutBXLYT } } - public class KeyFrame - { - [DisplayName("Blend"), CategoryAttribute("Key Frame")] - public float Blend { get; set; } - [DisplayName("Frame"), CategoryAttribute("Key Frame")] - public float Frame { get; set; } - [DisplayName("Value"), CategoryAttribute("Key Frame")] - public float Value { get; set; } - - public KeyFrame(FileReader reader, KeyType DataType) - { - Frame = reader.ReadSingle(); - switch (DataType) - { - case KeyType.Float: - Value = reader.ReadSingle(); - Blend = reader.ReadSingle(); - break; - case KeyType.Uin16: - Value = (float)reader.ReadInt16(); - Blend = (float)reader.ReadInt16(); - break; - } - } - - public void Write(FileWriter writer, KeyType DataType) - { - writer.Write(Frame); - switch (DataType) - { - case KeyType.Float: - writer.Write(Value); - writer.Write(Blend); - break; - case KeyType.Uin16: - writer.Write((ushort)Value); - writer.Write((ushort)Blend); - break; - } - } - } - public class FLPATagEntry : PaiTagEntry { public override string TargetName => Target.ToString(); diff --git a/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs b/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs index 6e34fb88..2b1168ae 100644 --- a/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs +++ b/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs @@ -477,7 +477,8 @@ namespace LayoutBXLYT.Cafe parentPane = currentPane; break; case "pae1": - currentPane = parentPane; + if (parentPane != null) + currentPane = parentPane; parentPane = currentPane.Parent; break; case "grp1": @@ -1341,12 +1342,10 @@ namespace LayoutBXLYT.Cafe } } - foreach (var archive in PluginRuntime.SarcArchives) + for (int i = 0; i < PluginRuntime.SarcArchives.Count; i++) { - Console.WriteLine("Searching archive! " + archive.FileName); - BFLYT bflyt = null; - SearchArchive(archive, ref bflyt); + SearchArchive(PluginRuntime.SarcArchives[i], ref bflyt); if (bflyt != null) return bflyt; } diff --git a/File_Format_Library/FileFormats/Layout/CAFE/BflytShader.cs b/File_Format_Library/FileFormats/Layout/CAFE/BflytShader.cs index 8415a480..ca88f033 100644 --- a/File_Format_Library/FileFormats/Layout/CAFE/BflytShader.cs +++ b/File_Format_Library/FileFormats/Layout/CAFE/BflytShader.cs @@ -50,17 +50,13 @@ namespace LayoutBXLYT BindTextureUniforms(); - string textureMap0 = ""; - if (material.TextureMaps.Length > 0) - textureMap0 = material.GetTexture(0); - for (int i = 0; i < material.TextureMaps.Length; i++) { if (textures.ContainsKey(material.TextureMaps[i].Name)) { GL.ActiveTexture(TextureUnit.Texture0 + i); SetInt($"textures{i}", 0); - bool isBinded = BxlytToGL.BindGLTexture(material.TextureMaps[i], textures[textureMap0]); + bool isBinded = BxlytToGL.BindGLTexture(material.TextureMaps[i], textures[material.TextureMaps[i].Name]); if (isBinded) SetInt($"hasTexture{i}", 1); } @@ -72,10 +68,6 @@ namespace LayoutBXLYT var transform = material.TextureTransforms[0]; float shiftX = 0; float shiftY = 0; - if (transform.Scale.X < 0) - shiftX = -1; - if (transform.Scale.Y < 0) - shiftY = -1; SetVec2("uvScale0",new Vector2(transform.Scale.X, transform.Scale.Y)); SetFloat("uvRotate0", transform.Rotate); diff --git a/File_Format_Library/FileFormats/Layout/Common.cs b/File_Format_Library/FileFormats/Layout/Common.cs index 17ddf461..345cf792 100644 --- a/File_Format_Library/FileFormats/Layout/Common.cs +++ b/File_Format_Library/FileFormats/Layout/Common.cs @@ -482,7 +482,7 @@ namespace LayoutBXLYT public BxlytMaterial Material { get; set; } public ushort MaterialIndex; - public WindowFrameTexFlip TextureFlip; + public WindowFrameTexFlip TextureFlip { get; set; } } public class TexCoord @@ -573,7 +573,158 @@ namespace LayoutBXLYT public class BxlanHeader : LayoutHeader { + public BxlanPAT1 AnimationTag; + public BxlanPAI1 AnimationInfo; + } + public class BxlanPAT1 : SectionCommon + { + [DisplayName("Name"), CategoryAttribute("Animation")] + public string Name { get; set; } + + [DisplayName("Groups"), CategoryAttribute("Animation")] + public List Groups { get; set; } + + [DisplayName("Start"), CategoryAttribute("Frames")] + public short StartFrame { get; set; } + + [DisplayName("End"), CategoryAttribute("Frames")] + public short EndFrame { get; set; } + + [DisplayName("Animation Order"), CategoryAttribute("Parameters")] + public ushort AnimationOrder { get; set; } + + [DisplayName("Child Binding"), CategoryAttribute("Parameters")] + public bool ChildBinding { get; set; } + } + + public class BxlanPAI1 : SectionCommon + { + public ushort FrameSize; + public bool Loop; + + public List Textures { get; set; } + public List Entries = new List(); + } + + public class BxlanPaiEntry + { + [DisplayName("Name"), CategoryAttribute("Animation")] + public string Name { get; set; } + + [DisplayName("Target"), CategoryAttribute("Animation")] + public AnimationTarget Target { get; set; } + + public List Tags = new List(); + } + + public class BxlanPaiTag + { + public List Entries = new List(); + + public string Tag; + + public string Type + { + get { return TypeDefine.ContainsKey(Tag) ? TypeDefine[Tag] : Tag; } + } + + public Dictionary TypeDefine = new Dictionary() + { + {"FLPA","PaneSRT" }, + {"FLVI","Visibility" }, + {"FLTS","TextureSRT" }, + {"FLVC","VertexColor" }, + {"FLMC","MaterialColor" }, + {"FLTP","TexturePattern" }, + {"FLIM","IndTextureSRT" }, + {"FLAC","AlphaTest" }, + {"FLCT","FontShadow" }, + {"FLCC","PerCharacterTransformCurve" }, + + {"RLPA","PaneSRT" }, + {"RLVI","Visibility" }, + {"RLTS","TextureSRT" }, + {"RLVC","VertexColor" }, + {"RLMC","MaterialColor" }, + {"RLTP","TexturePattern" }, + {"RLIM","IndTextureSRT" }, + {"RLAC","AlphaTest" }, + {"RLCT","FontShadow" }, + {"RLCC","PerCharacterTransformCurve" }, + + {"CLPA","PaneSRT" }, + {"CLVI","Visibility" }, + {"CLTS","TextureSRT" }, + {"CLVC","VertexColor" }, + {"CLMC","MaterialColor" }, + {"CLTP","TexturePattern" }, + {"CLIM","IndTextureSRT" }, + {"CLAC","AlphaTest" }, + {"CLCT","FontShadow" }, + {"CLCC","PerCharacterTransformCurve" }, + }; + } + + public class BxlanPaiTagEntry + { + [Browsable(false)] + public virtual string TargetName + { + get { return AnimationTarget.ToString(); } + } + + public byte AnimationTarget; + + [DisplayName("Index"), CategoryAttribute("Tag")] + public byte Index { get; set; } + + [DisplayName("Data Type"), CategoryAttribute("Tag")] + public KeyType DataType { get; set; } + + public List KeyFrames = new List(); + } + + public class KeyFrame + { + [DisplayName("Blend"), CategoryAttribute("Key Frame")] + public float Blend { get; set; } + [DisplayName("Frame"), CategoryAttribute("Key Frame")] + public float Frame { get; set; } + [DisplayName("Value"), CategoryAttribute("Key Frame")] + public float Value { get; set; } + + public KeyFrame(FileReader reader, KeyType DataType) + { + Frame = reader.ReadSingle(); + switch (DataType) + { + case KeyType.Float: + Value = reader.ReadSingle(); + Blend = reader.ReadSingle(); + break; + case KeyType.Uin16: + Value = (float)reader.ReadInt16(); + Blend = (float)reader.ReadInt16(); + break; + } + } + + public void Write(FileWriter writer, KeyType DataType) + { + writer.Write(Frame); + switch (DataType) + { + case KeyType.Float: + writer.Write(Value); + writer.Write(Blend); + break; + case KeyType.Uin16: + writer.Write((ushort)Value); + writer.Write((ushort)Blend); + break; + } + } } public class BxlytHeader : LayoutHeader diff --git a/File_Format_Library/FileFormats/Layout/Rev/BRLAN.cs b/File_Format_Library/FileFormats/Layout/Rev/BRLAN.cs new file mode 100644 index 00000000..040cf8a8 --- /dev/null +++ b/File_Format_Library/FileFormats/Layout/Rev/BRLAN.cs @@ -0,0 +1,553 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.ComponentModel; +using Toolbox; +using System.Windows.Forms; +using Toolbox.Library; +using Toolbox.Library.IO; +using SharpYaml.Serialization; + +namespace LayoutBXLYT +{ + public class BRLAN : IEditorForm, IFileFormat, IConvertableTextFormat + { + public FileType FileType { get; set; } = FileType.Layout; + + public bool CanSave { get; set; } + public string[] Description { get; set; } = new string[] { "Revolution Layout Animation (GUI)" }; + public string[] Extension { get; set; } = new string[] { "*.brlan" }; + 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 Toolbox.Library.IO.FileReader(stream, true)) + { + return reader.CheckSignature(4, "RLAN"); + } + } + + public Type[] Types + { + get + { + List types = new List(); + return types.ToArray(); + } + } + + #region Text Converter Interface + public TextFileType TextFileType => TextFileType.Xml; + public bool CanConvertBack => false; + + public string ConvertToString() + { + return ""; + + /* var serializerSettings = new SerializerSettings() +/ + // EmitTags = false + }; + + serializerSettings.DefaultStyle = SharpYaml.YamlStyle.Any; + serializerSettings.ComparerForKeySorting = null; + serializerSettings.RegisterTagMapping("Header", typeof(Header)); + + // return FLAN.ToXml(header); + + var serializer = new Serializer(serializerSettings); + string yaml = serializer.Serialize(header, typeof(Header)); + return yaml;*/ + } + + public void ConvertFromString(string text) + { + // header = RLAN.FromXml(text); + // header.FileInfo = this; + } + + #endregion + + Header header; + + public void Load(System.IO.Stream stream) + { + CanSave = true; + + header = new Header(); + header.Read(new FileReader(stream),this); + } + public void Unload() + { + + } + + public void Save(System.IO.Stream stream) { + header.Write(new FileWriter(stream)); + } + + public LayoutEditor OpenForm() + { + LayoutEditor editor = new LayoutEditor(); + editor.Dock = DockStyle.Fill; + editor.LoadBxlan(header); + return editor; + } + + public void FillEditor(Form control) + { + ((LayoutEditor)control).LoadBxlan(header); + } + + public class Header : BxlanHeader + { + private const string Magic = "RLAN"; + private ushort ByteOrderMark; + private ushort HeaderSize; + + //As of now this should be empty but just for future proofing + private List UnknownSections = new List(); + + public void Read(FileReader reader, BRLAN bflan) + { + AnimationTag = new PAT1(); + AnimationInfo = new PAI1(); + + reader.SetByteOrder(true); + reader.ReadSignature(4, Magic); + ByteOrderMark = reader.ReadUInt16(); + reader.CheckByteOrderMark(ByteOrderMark); + Version = reader.ReadUInt16(); + uint FileSize = reader.ReadUInt32(); + HeaderSize = reader.ReadUInt16(); + ushort sectionCount = reader.ReadUInt16(); + reader.ReadUInt16(); //Padding + + FileInfo = bflan; + IsBigEndian = reader.ByteOrder == Syroot.BinaryData.ByteOrder.BigEndian; + + reader.SeekBegin(HeaderSize); + for (int i = 0; i < sectionCount; i++) + { + long pos = reader.Position; + string Signature = reader.ReadString(4, Encoding.ASCII); + uint SectionSize = reader.ReadUInt32(); + + SectionCommon section = new SectionCommon(Signature); + switch (Signature) + { + case "pat1": + AnimationTag = new PAT1(reader, this); + break; + case "pai1": + AnimationInfo = new PAI1(reader, this); + break; + default: + section.Data = reader.ReadBytes((int)SectionSize - 8); + UnknownSections.Add(section); + break; + } + + section.SectionSize = SectionSize; + reader.SeekBegin(pos + SectionSize); + } + } + + public void Write(FileWriter writer) + { + writer.SetByteOrder(true); + writer.WriteSignature(Magic); + if (!IsBigEndian) + writer.Write((ushort)0xFFFE); + else + writer.Write((ushort)0xFEFF); + writer.SetByteOrder(IsBigEndian); + writer.Write((ushort)Version); + writer.Write(uint.MaxValue); //Reserve space for file size later + writer.Write(HeaderSize); + writer.Write(ushort.MaxValue); //Reserve space for section count later + + int sectionCount = 0; + + WriteSection(writer, "pat1", AnimationTag, () => AnimationTag.Write(writer, this)); + sectionCount++; + + WriteSection(writer, "pai1", AnimationInfo, () => AnimationInfo.Write(writer, this)); + sectionCount++; + + foreach (var section in UnknownSections) + { + WriteSection(writer, section.Signature, section, () => section.Write(writer, this)); + sectionCount++; + } + + //Write the total section count + using (writer.TemporarySeek(0x10, System.IO.SeekOrigin.Begin)) + { + writer.Write((ushort)sectionCount); + } + + //Write the total file size + using (writer.TemporarySeek(0x0C, System.IO.SeekOrigin.Begin)) + { + writer.Write((uint)writer.BaseStream.Length); + } + } + } + + + public class PAT1 : BxlanPAT1 + { + private byte[] UnknownData; + private byte flags; + + public PAT1() + { + AnimationOrder = 2; + Name = ""; + EndFrame = 0; + StartFrame = 0; + ChildBinding = false; + Groups = new List(); + } + + public PAT1(FileReader reader, Header header) + { + long startPos = reader.Position - 8; + + Groups = new List(); + + AnimationOrder = reader.ReadUInt16(); + ushort groupCount = reader.ReadUInt16(); + uint animNameOffset = reader.ReadUInt32(); + uint groupNamesOffset = reader.ReadUInt32(); + StartFrame = reader.ReadInt16(); + EndFrame = reader.ReadInt16(); + ChildBinding = reader.ReadBoolean(); + UnknownData = reader.ReadBytes((int)(startPos + animNameOffset - reader.Position)); + + reader.SeekBegin(startPos + animNameOffset); + Name = reader.ReadZeroTerminatedString(); + + reader.SeekBegin(startPos + groupNamesOffset); + for (int i = 0; i < groupCount; i++) + Groups.Add(reader.ReadString(28, true)); + } + + public override void Write(FileWriter writer, LayoutHeader header) + { + long startPos = writer.Position - 8; + + writer.Write(AnimationOrder); + writer.Write((ushort)Groups.Count); + writer.Write(uint.MaxValue); //animNameOffset + writer.Write(uint.MaxValue); //groupNamesOffset + writer.Write(StartFrame); + writer.Write(EndFrame); + writer.Write(ChildBinding); + writer.Write(UnknownData); + + writer.WriteUint32Offset(startPos + 12, startPos); + writer.WriteString(Name); + writer.Align(4); + + writer.WriteUint32Offset(startPos + 16, startPos); + for (int i = 0; i < Groups.Count; i++) + writer.WriteString(Groups[i], 28); + } + } + + public class PAI1 : BxlanPAI1 + { + + + public PAI1() + { + Textures = new List(); + } + + public PAI1(FileReader reader, Header header) + { + long startPos = reader.Position - 8; + + Textures = new List(); + + FrameSize = reader.ReadUInt16(); + Loop = reader.ReadBoolean(); + reader.ReadByte(); //padding + var numTextures = reader.ReadUInt16(); + var numEntries = reader.ReadUInt16(); + var entryOffsetTbl = reader.ReadUInt32(); + + var texOffsets = reader.ReadUInt32s(numTextures); + for (int i = 0; i < numTextures; i++) + { + reader.SeekBegin(startPos + texOffsets[i]); + Textures.Add(reader.ReadZeroTerminatedString()); + } + + reader.SeekBegin(startPos + entryOffsetTbl); + var entryOffsets = reader.ReadUInt32s(numEntries); + for (int i = 0; i < numEntries; i++) + { + reader.SeekBegin(startPos + entryOffsets[i]); + Entries.Add(new PaiEntry(reader, header)); + } + } + + public override void Write(FileWriter writer, LayoutHeader header) + { + long startPos = writer.Position - 8; + + writer.Write(FrameSize); + writer.Write(Loop); + writer.Write((byte)0); + writer.Write((ushort)Textures.Count); + writer.Write((ushort)Entries.Count); + long entryOfsTblPos = writer.Position; + writer.Write(0); + + if (Textures.Count > 0) + { + long startOfsPos = writer.Position; + writer.Write(new uint[Textures.Count]); + for (int i = 0; i < Textures.Count; i++) + { + writer.WriteUint32Offset(startOfsPos + (i * 4), startPos); + writer.WriteString(Textures[i]); + } + } + if (Entries.Count > 0) + { + writer.WriteUint32Offset(entryOfsTblPos, startPos); + + long startOfsPos = writer.Position; + writer.Write(new uint[Entries.Count]); + for (int i = 0; i < Entries.Count; i++) + { + writer.WriteUint32Offset(startOfsPos + (i * 4), startPos); + ((PaiEntry)Entries[i]).Write(writer, header); + } + } + } + } + + public class PaiEntry : BxlanPaiEntry + { + public PaiEntry(FileReader reader, Header header) + { + long startPos = reader.Position; + + Name = reader.ReadString(0x14, true); + var numTags = reader.ReadByte(); + Target = reader.ReadEnum(false); + reader.ReadUInt16(); //padding + + var offsets = reader.ReadUInt32s(numTags); + for (int i = 0; i < numTags; i++) + { + reader.SeekBegin(startPos + offsets[i]); + Tags.Add(new PaiTag(reader, header, Target)); + } + } + + public void Write(FileWriter writer, LayoutHeader header) + { + long startPos = writer.Position; + + writer.WriteString(Name, 0x14); + writer.Write((byte)Tags.Count); + writer.Write(Target, false); + writer.Write((ushort)0); + if (Tags.Count > 0) + { + writer.Write(new uint[Tags.Count]); + for (int i = 0; i < Tags.Count; i++) + { + writer.WriteUint32Offset(startPos + 32 + (i * 4), startPos); + ((PaiTag)Tags[i]).Write(writer, header, Target); + } + } + } + } + + public class PaiTag : BxlanPaiTag + { + private uint Unknown { get; set; } + + public PaiTag(FileReader reader, Header header, AnimationTarget target) + { + if ((byte)target == 2) + Unknown = reader.ReadUInt32(); //This doesn't seem to be included in the offsets to the entries (?) + + long startPos = reader.Position; + Tag = reader.ReadString(4, Encoding.ASCII); + var numEntries = reader.ReadByte(); + reader.Seek(3); + var offsets = reader.ReadUInt32s((int)numEntries); + for (int i = 0; i < numEntries; i++) + { + reader.SeekBegin(startPos + offsets[i]); + switch (Tag) + { + case "RLPA": + Entries.Add(new FLPATagEntry(reader, header)); + break; + case "RLTS": + Entries.Add(new FLTSTagEntry(reader, header)); + break; + case "RLVI": + Entries.Add(new FLVITagEntry(reader, header)); + break; + case "RLVC": + Entries.Add(new FLVCTagEntry(reader, header)); + break; + case "RLMC": + Entries.Add(new FLMCTagEntry(reader, header)); + break; + case "RLTP": + Entries.Add(new FLTPTagEntry(reader, header)); + break; + default: + Entries.Add(new PaiTagEntry(reader, header)); + break; + } + } + } + + public void Write(FileWriter writer, LayoutHeader header, AnimationTarget target) + { + if ((byte)target == 2) + writer.Write(Unknown); + + long startPos = writer.Position; + + writer.WriteSignature(Tag); + writer.Write((byte)Entries.Count); + writer.Seek(3); + writer.Write(new uint[Entries.Count]); + for (int i = 0; i < Entries.Count; i++) + { + writer.WriteUint32Offset(startPos + 8 + (i * 4), startPos); + ((PaiTagEntry)Entries[i]).Write(writer, header); + } + } + } + + public class PaiTagEntry : BxlanPaiTagEntry + { + public byte Unknown; + + public PaiTagEntry(FileReader reader, Header header) + { + long startPos = reader.Position; + Index = reader.ReadByte(); + AnimationTarget = reader.ReadByte(); + DataType = reader.ReadEnum(true); + Unknown = reader.ReadByte(); + var KeyFrameCount = reader.ReadUInt16(); + reader.ReadUInt16(); //Padding + uint keyFrameOffset = reader.ReadUInt32(); + + reader.SeekBegin(startPos + keyFrameOffset); + for (int i = 0; i < KeyFrameCount; i++) + KeyFrames.Add(new KeyFrame(reader, DataType)); + } + + public void Write(FileWriter writer, LayoutHeader header) + { + long startPos = writer.Position; + + writer.Write(Index); + writer.Write(AnimationTarget); + writer.Write(DataType, true); + writer.Write(Unknown); + writer.Write((ushort)KeyFrames.Count); + writer.Write((ushort)0); //padding + writer.Write(0); //key offset + + if (KeyFrames.Count > 0) + { + writer.WriteUint32Offset(startPos + 8, startPos); + for (int i = 0; i < KeyFrames.Count; i++) + KeyFrames[i].Write(writer, DataType); + } + } + } + + public class FLPATagEntry : PaiTagEntry + { + public override string TargetName => Target.ToString(); + [DisplayName("Target"), CategoryAttribute("Tag")] + public LPATarget Target + { + get { return (LPATarget)AnimationTarget; } + set { AnimationTarget = (byte)value; } + } + public FLPATagEntry(FileReader reader, Header header) : base(reader, header) { } + } + + public class FLTSTagEntry : PaiTagEntry + { + public override string TargetName => Target.ToString(); + [DisplayName("Target"), CategoryAttribute("Tag")] + public LTSTarget Target + { + get { return (LTSTarget)AnimationTarget; } + set { AnimationTarget = (byte)value; } + } + public FLTSTagEntry(FileReader reader, Header header) : base(reader, header) { } + } + + public class FLVITagEntry : PaiTagEntry + { + public override string TargetName => Target.ToString(); + [DisplayName("Target"), CategoryAttribute("Tag")] + public LVITarget Target + { + get { return (LVITarget)AnimationTarget; } + set { AnimationTarget = (byte)value; } + } + public FLVITagEntry(FileReader reader, Header header) : base(reader, header) { } + } + + public class FLVCTagEntry : PaiTagEntry + { + public override string TargetName => Target.ToString(); + [DisplayName("Target"), CategoryAttribute("Tag")] + public LVCTarget Target + { + get { return (LVCTarget)AnimationTarget; } + set { AnimationTarget = (byte)value; } + } + public FLVCTagEntry(FileReader reader, Header header) : base(reader, header) { } + } + + public class FLMCTagEntry : PaiTagEntry + { + public override string TargetName => Target.ToString(); + [DisplayName("Target"), CategoryAttribute("Tag")] + public LMCTarget Target + { + get { return (LMCTarget)AnimationTarget; } + set { AnimationTarget = (byte)value; } + } + public FLMCTagEntry(FileReader reader, Header header) : base(reader, header) { } + } + + public class FLTPTagEntry : PaiTagEntry + { + public override string TargetName => Target.ToString(); + [DisplayName("Target"), CategoryAttribute("Tag")] + public LTPTarget Target + { + get { return (LTPTarget)AnimationTarget; } + set { AnimationTarget = (byte)value; } + } + public FLTPTagEntry(FileReader reader, Header header) : base(reader, header) { } + } + } +} diff --git a/File_Format_Library/FileFormats/Texture/BFLIM.cs b/File_Format_Library/FileFormats/Texture/BFLIM.cs index 3f3673ff..f800dc4d 100644 --- a/File_Format_Library/FileFormats/Texture/BFLIM.cs +++ b/File_Format_Library/FileFormats/Texture/BFLIM.cs @@ -579,7 +579,7 @@ namespace FirstPlugin surf.numMips = 1; surf.mipOffset = new uint[0]; surf.mipData = ImageData; - surf.tileMode = (uint)GX2.GX2TileMode.MODE_2D_TILED_THIN1; + surf.tileMode = (uint)image.TileMode; surf.swizzle = image.Swizzle; surf.numArray = 1; diff --git a/File_Format_Library/FileFormats/Texture/TVOL.cs b/File_Format_Library/FileFormats/Texture/TVOL.cs index df5554fc..8a7c8ff3 100644 --- a/File_Format_Library/FileFormats/Texture/TVOL.cs +++ b/File_Format_Library/FileFormats/Texture/TVOL.cs @@ -76,7 +76,7 @@ namespace FirstPlugin reader.SeekBegin(offset + 48); ulong unk = reader.ReadUInt64(); //Varies. Shifts like a offset or size - ulong headerOffset = reader.ReadUInt64(); + ulong headerOffset = reader.ReadUInt64(); ulong sectionSize = reader.ReadUInt64(); ulong unk3 = reader.ReadUInt64(); //16 ulong unk4 = reader.ReadUInt64(); //4 @@ -87,16 +87,17 @@ namespace FirstPlugin ulong unk6 = reader.ReadUInt64(); //32 ulong unk7 = reader.ReadUInt64(); //24 ulong unk8 = reader.ReadUInt64(); //40 - ulong imageSize = reader.ReadUInt64(); + + //Matches XTX info header + uint imageSize = reader.ReadUInt32(); + uint Alignment = reader.ReadUInt32(); entry.Width = reader.ReadUInt32(); entry.Height = reader.ReadUInt32(); entry.Depth = reader.ReadUInt32(); - entry.ArrayCount = reader.ReadUInt32(); + entry.Target = reader.ReadUInt32(); uint Format = reader.ReadUInt32(); - if (Formats.ContainsKey(Format)) - entry.Format = Formats[Format]; - else - Console.WriteLine("Unsupported format! " + Format.ToString("X")); + + XTX.TextureInfo.ConvertFormat(Format); uint unk10 = reader.ReadUInt32(); //1 entry.ImageData = reader.ReadBytes((int)imageSize); @@ -106,12 +107,6 @@ namespace FirstPlugin } } - private Dictionary Formats = new Dictionary() - { - {0x25 , TEX_FORMAT.R8G8B8A8_UNORM}, - {0x4d , TEX_FORMAT.BC7_UNORM}, - }; - public void Unload() { @@ -123,6 +118,8 @@ namespace FirstPlugin public class TextureWrapper : STGenericTexture { + public uint Target = 1; + public byte[] ImageData; public TextureWrapper() @@ -161,7 +158,7 @@ namespace FirstPlugin private bool hasShownDialog = false; public override byte[] GetImageData(int ArrayLevel = 0, int MipLevel = 0) { - return TegraX1Swizzle.GetImageData(this, ImageData, ArrayLevel, MipLevel, 1); + return TegraX1Swizzle.GetImageData(this, ImageData, ArrayLevel, MipLevel, (int)Target); } diff --git a/File_Format_Library/FileFormats/Texture/XTX.cs b/File_Format_Library/FileFormats/Texture/XTX.cs index c531c166..1f8b7fc1 100644 --- a/File_Format_Library/FileFormats/Texture/XTX.cs +++ b/File_Format_Library/FileFormats/Texture/XTX.cs @@ -98,6 +98,7 @@ namespace FirstPlugin BC4S = 0x0000004a, BC5U = 0x0000004b, BC5S = 0x0000004c, + BC7U = 0x0000004d, //Same order as this https://github.com/aboood40091/BNTX-Editor/blob/master/globals.py //However SRGB goes after unorm @@ -515,7 +516,7 @@ namespace FirstPlugin editor.LoadProperties(GenericProperties); } - private static XTXFormats.XTXImageFormat ConvertFromGenericFormat(TEX_FORMAT Format) + public static XTXFormats.XTXImageFormat ConvertFromGenericFormat(TEX_FORMAT Format) { switch (Format) { @@ -525,6 +526,7 @@ namespace FirstPlugin case TEX_FORMAT.BC4_UNORM: return XTXFormats.XTXImageFormat.BC4U; case TEX_FORMAT.BC4_SNORM: return XTXFormats.XTXImageFormat.BC4S; case TEX_FORMAT.BC5_UNORM: return XTXFormats.XTXImageFormat.BC5U; + case TEX_FORMAT.BC7_UNORM: return XTXFormats.XTXImageFormat.BC7U; case TEX_FORMAT.R8_UNORM: return XTXFormats.XTXImageFormat.NVN_FORMAT_R8; case TEX_FORMAT.R8G8_UNORM: return XTXFormats.XTXImageFormat.NVN_FORMAT_RG8; case TEX_FORMAT.R10G10B10A2_UNORM: return XTXFormats.XTXImageFormat.NVN_FORMAT_RGB10A2; @@ -564,7 +566,12 @@ namespace FirstPlugin } } - private static TEX_FORMAT ConvertFormat(XTXFormats.XTXImageFormat Format) + public static TEX_FORMAT ConvertFormat(uint Format) + { + return ConvertFormat((XTXFormats.XTXImageFormat)Format); + } + + public static TEX_FORMAT ConvertFormat(XTXFormats.XTXImageFormat Format) { switch (Format) { @@ -575,6 +582,7 @@ namespace FirstPlugin case XTXFormats.XTXImageFormat.BC4S: return TEX_FORMAT.BC4_SNORM; case XTXFormats.XTXImageFormat.BC5U: return TEX_FORMAT.BC5_UNORM; case XTXFormats.XTXImageFormat.BC5S: return TEX_FORMAT.BC5_SNORM; + case XTXFormats.XTXImageFormat.BC7U: return TEX_FORMAT.BC7_UNORM; case XTXFormats.XTXImageFormat.NVN_FORMAT_R8: return TEX_FORMAT.R8_UNORM; case XTXFormats.XTXImageFormat.NVN_FORMAT_RG8: return TEX_FORMAT.R8G8_UNORM; case XTXFormats.XTXImageFormat.NVN_FORMAT_RGB10A2: return TEX_FORMAT.R10G10B10A2_UNORM; diff --git a/File_Format_Library/File_Format_Library.csproj b/File_Format_Library/File_Format_Library.csproj index c8307526..42704daa 100644 --- a/File_Format_Library/File_Format_Library.csproj +++ b/File_Format_Library/File_Format_Library.csproj @@ -149,7 +149,6 @@ ..\Toolbox\Lib\Syroot.Maths.dll - False ..\Toolbox\Lib\Syroot.NintenTools.Bfres.dll @@ -314,6 +313,7 @@ + diff --git a/File_Format_Library/GUI/BFLYT/LayoutHierarchy.cs b/File_Format_Library/GUI/BFLYT/LayoutHierarchy.cs index 5ee685b5..07dd875b 100644 --- a/File_Format_Library/GUI/BFLYT/LayoutHierarchy.cs +++ b/File_Format_Library/GUI/BFLYT/LayoutHierarchy.cs @@ -95,9 +95,9 @@ namespace LayoutBXLYT private void LoadAnimations(BxlanHeader bxlan, TreeNode root) { treeView1.Nodes.Add(root); - if (bxlan is BFLAN.Header) + if (bxlan is BxlanHeader) { - var header = bxlan as BFLAN.Header; + var header = bxlan as BxlanHeader; var pat1 = new TreeNode("Tag Info") { Tag = header.AnimationTag }; var pai1 = new TreeNode("Animation Info") { Tag = header.AnimationInfo }; @@ -109,7 +109,7 @@ namespace LayoutBXLYT } } - private void LoadAnimationEntry(BFLAN.PaiEntry entry, TreeNode root) + private void LoadAnimationEntry(BxlanPaiEntry entry, TreeNode root) { var nodeEntry = new TreeNode(entry.Name) { Tag = entry }; root.Nodes.Add(nodeEntry); @@ -123,7 +123,7 @@ namespace LayoutBXLYT } } - private void LoadTagEntry(BFLAN.PaiTagEntry entry, TreeNode root, int index) + private void LoadTagEntry(BxlanPaiTagEntry entry, TreeNode root, int index) { var nodeEntry = new TreeNode(entry.TargetName) { Tag = entry }; root.Nodes.Add(nodeEntry); diff --git a/File_Format_Library/Main.cs b/File_Format_Library/Main.cs index 16fed1a9..571167e9 100644 --- a/File_Format_Library/Main.cs +++ b/File_Format_Library/Main.cs @@ -367,6 +367,8 @@ namespace FirstPlugin Formats.Add(typeof(LayoutBXLYT.Cafe.BFLYT)); Formats.Add(typeof(LayoutBXLYT.BCLYT)); Formats.Add(typeof(LayoutBXLYT.BRLYT)); + Formats.Add(typeof(LayoutBXLYT.BFLAN)); + Formats.Add(typeof(LayoutBXLYT.BRLAN)); Formats.Add(typeof(ZSI)); Formats.Add(typeof(IGZ_TEX)); Formats.Add(typeof(MOD)); @@ -383,7 +385,6 @@ namespace FirstPlugin Formats.Add(typeof(DARC)); Formats.Add(typeof(BFLIM)); Formats.Add(typeof(BCLIM)); - Formats.Add(typeof(LayoutBXLYT.BFLAN)); Formats.Add(typeof(DAT_Bayonetta)); Formats.Add(typeof(XCI)); Formats.Add(typeof(TVOL)); diff --git a/Switch_Toolbox_Library/FileFormats/DDS/RGBAPixelDecoder.cs b/Switch_Toolbox_Library/FileFormats/DDS/RGBAPixelDecoder.cs index a9996e2b..66ba14be 100644 --- a/Switch_Toolbox_Library/FileFormats/DDS/RGBAPixelDecoder.cs +++ b/Switch_Toolbox_Library/FileFormats/DDS/RGBAPixelDecoder.cs @@ -8,32 +8,30 @@ namespace Toolbox.Library { public class RGBAPixelDecoder { - private static byte[] GetComponentsFromPixel(TEX_FORMAT format, int pixel) + private static byte[] GetComponentsFromPixel(TEX_FORMAT format, int pixel, byte[] comp) { - byte[] comp = new byte[] { 0, 0xFF, 0, 0, 0, 0xFF }; - switch (format) { case TEX_FORMAT.L8: - comp[2] = (byte)(pixel & 0xFF); - break; - case TEX_FORMAT.L4: - comp[2] = (byte)((pixel & 0xF) * 17); - comp[3] = (byte)(((pixel & 0xF0) >> 4) * 17); + comp[0] = (byte)(pixel & 0xFF); break; case TEX_FORMAT.LA8: - comp[2] = (byte)(pixel & 0xFF); - comp[3] = (byte)((pixel & 0xFF00) >> 8); + comp[0] = (byte)(pixel & 0xFF); + comp[1] = (byte)((pixel & 0xFF00) >> 8); + break; + case TEX_FORMAT.LA4: + comp[0] = (byte)((pixel & 0xF) * 17); + comp[1] = (byte)(((pixel & 0xF0) >> 4) * 17); break; case TEX_FORMAT.R5G5B5_UNORM: - comp[2] = (byte)((pixel & 0x1F) / 0x1F * 0xFF); - comp[3] = (byte)(((pixel & 0x7E0) >> 5) / 0x3F * 0xFF); - comp[4] = (byte)(((pixel & 0xF800) >> 11) / 0x1F * 0xFF); + comp[0] = (byte)((pixel & 0x1F) / 0x1F * 0xFF); + comp[1] = (byte)(((pixel & 0x7E0) >> 5) / 0x3F * 0xFF); + comp[2] = (byte)(((pixel & 0xF800) >> 11) / 0x1F * 0xFF); break; case TEX_FORMAT.B5G6R5_UNORM: - comp[2] = (byte)(((pixel & 0xF800) >> 11) / 0x1F * 0xFF); - comp[3] = (byte)(((pixel & 0x7E0) >> 5) / 0x3F * 0xFF); - comp[4] = (byte)((pixel & 0x1F) / 0x1F * 0xFF); + comp[0] = (byte)(((pixel & 0xF800) >> 11) / 0x1F * 0xFF); + comp[1] = (byte)(((pixel & 0x7E0) >> 5) / 0x3F * 0xFF); + comp[2] = (byte)((pixel & 0x1F) / 0x1F * 0xFF); break; } @@ -54,10 +52,16 @@ namespace Toolbox.Library int inPos = 0; int outPos = 0; + byte[] comp = new byte[] { 0, 0, 0, 0xFF, 0, 0xFF }; byte[] compSel = new byte[4] {0,1,2,3 }; - if (format == TEX_FORMAT.L8 || format == TEX_FORMAT.LA8) - compSel = new byte[4] { 2, 2, 2, 3 }; + if (format == TEX_FORMAT.LA8) + { + compSel = new byte[4] { 0, 0, 0, 1 }; + bpp = 2; + } + else if (format == TEX_FORMAT.L8) + compSel = new byte[4] { 0, 0, 0, 5 }; for (int Y = 0; Y < height; Y++) { @@ -70,7 +74,7 @@ namespace Toolbox.Library for (int i = 0; i < bpp; i++) pixel |= data[inPos + i] << (8 * i); - byte[] comp = GetComponentsFromPixel(format, pixel); + comp = GetComponentsFromPixel(format, pixel, comp); output[outPos + 3] = comp[compSel[3]]; output[outPos + 2] = comp[compSel[2]]; diff --git a/Switch_Toolbox_Library/Forms/ColorSelector.cs b/Switch_Toolbox_Library/Forms/ColorSelector.cs index 9a497f24..a8b7eff1 100644 --- a/Switch_Toolbox_Library/Forms/ColorSelector.cs +++ b/Switch_Toolbox_Library/Forms/ColorSelector.cs @@ -31,7 +31,21 @@ namespace Toolbox.Library.Forms } } - public STColor8 Color8 { get; set; } + public STColor8 Color8 + { + get { return new STColor8(NewColor); } + } + + public STColor16 Color16 + { + get { return new STColor16(NewColor); } + } + + public STColor Color32 + { + get { return new STColor(NewColor); } + } + /// /// The color the dialog gets and sets. @@ -328,8 +342,6 @@ namespace Toolbox.Library.Forms protected virtual void OnColorChanged(bool hsvToRgb) { - Color8 = new STColor8(NewColor); - colorSquare.Invalidate(); huePanel.Invalidate(); diff --git a/Switch_Toolbox_Library/Forms/Dialogs/ColorSelectorDropdown.Designer.cs b/Switch_Toolbox_Library/Forms/Dialogs/ColorSelectorDropdown.Designer.cs index 57512f6e..7a0d5b25 100644 --- a/Switch_Toolbox_Library/Forms/Dialogs/ColorSelectorDropdown.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Dialogs/ColorSelectorDropdown.Designer.cs @@ -33,6 +33,7 @@ this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.pictureBox2 = new System.Windows.Forms.PictureBox(); this.pictureBoxCustom1 = new Toolbox.Library.Forms.PictureBoxCustom(); + this.stButton1 = new Toolbox.Library.Forms.STButton(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCustom1)).BeginInit(); @@ -44,7 +45,6 @@ this.colorSelector1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); this.colorSelector1.Color = System.Drawing.Color.Empty; - this.colorSelector1.Color8 = null; this.colorSelector1.DisplayAlpha = true; this.colorSelector1.DisplayColor = true; this.colorSelector1.Location = new System.Drawing.Point(3, 3); @@ -56,7 +56,7 @@ // pictureBox1 // this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBox1.Location = new System.Drawing.Point(254, 3); + this.pictureBox1.Location = new System.Drawing.Point(272, 40); this.pictureBox1.Name = "pictureBox1"; this.pictureBox1.Size = new System.Drawing.Size(30, 30); this.pictureBox1.TabIndex = 1; @@ -65,7 +65,7 @@ // pictureBox2 // this.pictureBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBox2.Location = new System.Drawing.Point(254, 39); + this.pictureBox2.Location = new System.Drawing.Point(272, 76); this.pictureBox2.Name = "pictureBox2"; this.pictureBox2.Size = new System.Drawing.Size(30, 30); this.pictureBox2.TabIndex = 2; @@ -75,23 +75,35 @@ // this.pictureBoxCustom1.BackColor = System.Drawing.Color.Transparent; this.pictureBoxCustom1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("pictureBoxCustom1.BackgroundImage"))); - this.pictureBoxCustom1.Location = new System.Drawing.Point(254, 75); + this.pictureBoxCustom1.Location = new System.Drawing.Point(272, 112); this.pictureBoxCustom1.Name = "pictureBoxCustom1"; this.pictureBoxCustom1.Size = new System.Drawing.Size(30, 30); this.pictureBoxCustom1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.pictureBoxCustom1.TabIndex = 3; this.pictureBoxCustom1.TabStop = false; // + // stButton1 + // + this.stButton1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.stButton1.Location = new System.Drawing.Point(252, 4); + this.stButton1.Name = "stButton1"; + this.stButton1.Size = new System.Drawing.Size(50, 30); + this.stButton1.TabIndex = 4; + this.stButton1.Text = "Apply"; + this.stButton1.UseVisualStyleBackColor = false; + this.stButton1.Click += new System.EventHandler(this.stButton1_Click); + // // ColorSelectorDropdown // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.stButton1); this.Controls.Add(this.pictureBoxCustom1); this.Controls.Add(this.pictureBox2); this.Controls.Add(this.pictureBox1); this.Controls.Add(this.colorSelector1); this.Name = "ColorSelectorDropdown"; - this.Size = new System.Drawing.Size(292, 244); + this.Size = new System.Drawing.Size(310, 244); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCustom1)).EndInit(); @@ -105,5 +117,6 @@ private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.PictureBox pictureBox2; private PictureBoxCustom pictureBoxCustom1; + private STButton stButton1; } } diff --git a/Switch_Toolbox_Library/Forms/Dialogs/ColorSelectorDropdown.cs b/Switch_Toolbox_Library/Forms/Dialogs/ColorSelectorDropdown.cs index f7d27510..cfd72462 100644 --- a/Switch_Toolbox_Library/Forms/Dialogs/ColorSelectorDropdown.cs +++ b/Switch_Toolbox_Library/Forms/Dialogs/ColorSelectorDropdown.cs @@ -12,10 +12,21 @@ namespace Toolbox.Library.Forms { public partial class ColorSelectorDropdown : STUserControl { + public EventHandler ColorApplied; + public STColor8 Color8 { get { return colorSelector1.Color8; } - set { colorSelector1.Color8 = value; } + } + + public STColor16 Color16 + { + get { return colorSelector1.Color16; } + } + + public STColor Color32 + { + get { return colorSelector1.Color32; } } public Color Color @@ -48,5 +59,10 @@ namespace Toolbox.Library.Forms var fullColor = Color.FromArgb(colorSelector1.Alpha, colorSelector1.Color); pictureBoxCustom1.Image = BitmapExtension.FillColor(30,30, fullColor); } + + private void stButton1_Click(object sender, EventArgs e) + { + ColorApplied?.Invoke(sender,e); + } } } diff --git a/Switch_Toolbox_Library/IO/Colors/ColorEditor.cs b/Switch_Toolbox_Library/IO/Colors/ColorEditor.cs index 308fa50e..a1bae5fe 100644 --- a/Switch_Toolbox_Library/IO/Colors/ColorEditor.cs +++ b/Switch_Toolbox_Library/IO/Colors/ColorEditor.cs @@ -16,6 +16,7 @@ namespace Toolbox.Library.IO return UITypeEditorEditStyle.DropDown; } + IWindowsFormsEditorService _service; public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { if (value.GetType() != typeof(STColor8) && @@ -25,11 +26,12 @@ namespace Toolbox.Library.IO return value; } - IWindowsFormsEditorService frmsvr = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); - if (frmsvr == null) + _service = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); + if (_service == null) return null; var control = new ColorSelectorDropdown(); + control.ColorApplied += ColorSelectorClose; Color color = Color.White; if (value is STColor8) @@ -42,18 +44,24 @@ namespace Toolbox.Library.IO control.Color = color; control.Alpha = color.A; - frmsvr.DropDownControl(control); + _service.DropDownControl(control); if (value is STColor8) return control.Color8; if (value is STColor16) - return (STColor16)value; + return control.Color16; if (value is STColor) - return (STColor)value; + return control.Color32; return value; } + private void ColorSelectorClose(object sender, EventArgs e) + { + if (_service != null) + _service.CloseDropDown(); + } + private void OnColorChanged(object sender, EventArgs e) { diff --git a/Toolbox/Shader/Layout/Legacy/Bflyt.frag b/Toolbox/Shader/Layout/Legacy/Bflyt.frag index 1a323590..43522fc4 100644 --- a/Toolbox/Shader/Layout/Legacy/Bflyt.frag +++ b/Toolbox/Shader/Layout/Legacy/Bflyt.frag @@ -28,10 +28,10 @@ void main() if (debugShading == 0) { - vec3 whiteInterpolation = mix(textureMap0.rgb, whiteColor.rgb, vec3(1)); - vec3 blackInterpolation = mix(vec3(1) - textureMap0.rgb, blackColor.rgb, vec3(1)); + vec3 whiteInterpolation = whiteColor.rgb * textureMap0.rgb; + vec3 blackInterpolation = (vec3(1) - textureMap0.rgb) * blackColor.rgb; - vec3 colorBlend = textureMap0.rgb * whiteColor.rgb; + vec3 colorBlend = whiteInterpolation + blackInterpolation; float alpha = textureMap0.a * whiteColor.a; gl_FragColor = gl_Color * vec4(colorBlend,alpha); } diff --git a/Toolbox/Shader/Layout/Legacy/Bflyt.vert b/Toolbox/Shader/Layout/Legacy/Bflyt.vert index c7a573ad..47428ffa 100644 --- a/Toolbox/Shader/Layout/Legacy/Bflyt.vert +++ b/Toolbox/Shader/Layout/Legacy/Bflyt.vert @@ -21,11 +21,11 @@ vec2 SetFlip(vec2 tex) else if (flipTexture == 2) //FlipV return vec2(1, -1) * tex + vec2(0, 1); else if (flipTexture == 3) //Rotate90 - return rotateUV(tex, 90.0); + return rotateUV(tex, radians(90.0)); else if (flipTexture == 4) //Rotate180 - return rotateUV(tex, 180.0); + return rotateUV(tex, radians(180.0)); else if (flipTexture == 5) //Rotate270 - return rotateUV(tex, 270.0); + return rotateUV(tex, radians(270.0)); return outTexCoord; } @@ -33,7 +33,7 @@ vec2 SetFlip(vec2 tex) void main() { gl_FrontColor = gl_Color; - vec2 texCoord0 = uvScale0 * (gl_MultiTexCoord0.xy + uvTranslate0); + vec2 texCoord0 = vec2(0.5, 0.5) + uvScale0 * (gl_MultiTexCoord0.xy + (uvTranslate0 / uvScale0 - 0.5)); gl_TexCoord[0].st = SetFlip(texCoord0); gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; } \ No newline at end of file