diff --git a/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs b/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs index b5c11666..56e7a76a 100644 --- a/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs +++ b/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs @@ -1081,6 +1081,10 @@ namespace LayoutBXLYT.Cafe private float Unknown1 { get; set; } private float Unknown2 { get; set; } + public void CopyMaterial() { + Material = Material.Clone(); + } + public void UpdateTextRender() { if (RenderableFont == null) return; @@ -1123,8 +1127,9 @@ namespace LayoutBXLYT.Cafe ShadowForeColor = STColor8.FromBytes(reader.ReadBytes(4)); ShadowBackColor = STColor8.FromBytes(reader.ReadBytes(4)); ShadowItalic = reader.ReadSingle(); + uint perCharTransformOffset = reader.ReadUInt32(); + if (header.VersionMajor >= 8) { - Unknown1 = reader.ReadSingle(); Unknown2 = reader.ReadSingle(); } @@ -1186,19 +1191,25 @@ namespace LayoutBXLYT.Cafe writer.Write(ShadowForeColor.ToBytes()); writer.Write(ShadowBackColor.ToBytes()); writer.Write(ShadowItalic); + if (header.VersionMajor > 2) + writer.Write(0); //per character transform offset + if (header.VersionMajor >= 8) { - writer.Write(Unknown1); writer.Write(Unknown2); } if (Text != null) { + Encoding encoding = Encoding.Unicode; + if (writer.ByteOrder == Syroot.BinaryData.ByteOrder.BigEndian) + encoding = Encoding.BigEndianUnicode; + writer.WriteUint32Offset(_ofsTextPos, pos); if (RestrictedTextLengthEnabled) - writer.WriteString(Text, MaxTextLength, Encoding.Unicode); + writer.WriteString(Text, MaxTextLength, encoding); else - writer.WriteString(Text, TextLength, Encoding.Unicode); + writer.WriteString(Text, TextLength, encoding); writer.Align(4); } @@ -1222,6 +1233,12 @@ namespace LayoutBXLYT.Cafe } + public void CopyWindows() { + Content = (BxlytWindowContent)Content.Clone(); + for (int f = 0; f < WindowFrames.Count; f++) + WindowFrames[f] = (BxlytWindowFrame)WindowFrames[f].Clone(); + } + public WND1(Header header, string name) { layoutHeader = header; @@ -1761,6 +1778,7 @@ namespace LayoutBXLYT.Cafe if (openedFile == null) continue; + openedFile.CanSave = false; var bflan = openedFile as BXLAN; layoutFile.PartsManager.AddAnimation(bflan.BxlanHeader); } @@ -1774,6 +1792,7 @@ namespace LayoutBXLYT.Cafe var openedFile = STFileLoader.OpenFileFormat(file); if (openedFile == null) continue; + openedFile.CanSave = false; openedFile.IFileInfo = new IFileInfo(); openedFile.IFileInfo.ArchiveParent = fileFormat.IFileInfo.ArchiveParent; return (BFLYT)openedFile; @@ -2198,6 +2217,10 @@ namespace LayoutBXLYT.Cafe Material = new Material(name, header); } + public void CopyMaterial() { + Material = Material.Clone(); + } + public PIC1(FileReader reader, BFLYT.Header header) : base(reader, header) { ParentLayout = header; @@ -2562,6 +2585,24 @@ namespace LayoutBXLYT.Cafe return ""; } + public override BxlytMaterial Clone() + { + Material mat = new Material(); + return mat; + } + + public Material() + { + TextureMaps = new TextureRef[0]; + TextureTransforms = new TextureTransform[0]; + TexCoords = new TexCoordGen[0]; + TevStages = new TevStage[0]; + ProjTexGenParams = new ProjectionTexGenParam[0]; + + BlackColor = new STColor8(0, 0, 0, 0); + WhiteColor = STColor8.White; + } + public Material(string name, BxlytHeader header) { ParentLayout = header; @@ -2612,6 +2653,18 @@ namespace LayoutBXLYT.Cafe var projTexGenParamCount = Convert.ToUInt32((flags >> 15) & 0x3); var hasFontShadowParam = Convert.ToBoolean((flags >> 17) & 0x1); + Console.WriteLine($"texCount {texCount}"); + Console.WriteLine($"mtxCount {mtxCount}"); + Console.WriteLine($"texCoordGenCount {texCoordGenCount}"); + Console.WriteLine($"tevStageCount {tevStageCount}"); + Console.WriteLine($"hasAlphaCompare {hasAlphaCompare}"); + Console.WriteLine($"hasBlendMode {hasBlendMode}"); + Console.WriteLine($"useTextureOnly {useTextureOnly}"); + Console.WriteLine($"seperateBlendMode {seperateBlendMode}"); + Console.WriteLine($"hasIndParam {hasIndParam}"); + Console.WriteLine($"projTexGenParamCount {projTexGenParamCount}"); + Console.WriteLine($"hasFontShadowParam {hasFontShadowParam}"); + EnableAlphaCompare = hasAlphaCompare; EnableBlend = hasBlendMode; EnableBlendLogic = seperateBlendMode; diff --git a/File_Format_Library/FileFormats/Layout/CTR/BCLYT.cs b/File_Format_Library/FileFormats/Layout/CTR/BCLYT.cs index cf89a48d..03c7d082 100644 --- a/File_Format_Library/FileFormats/Layout/CTR/BCLYT.cs +++ b/File_Format_Library/FileFormats/Layout/CTR/BCLYT.cs @@ -692,6 +692,10 @@ namespace LayoutBXLYT TexCoords[0] = new TexCoord(); } + public void CopyMaterial() { + Material = (BxlytMaterial)Material.Clone(); + } + public PIC1(FileReader reader, BCLYT.Header header) : base(reader) { ParentLayout = header; diff --git a/File_Format_Library/FileFormats/Layout/Common.cs b/File_Format_Library/FileFormats/Layout/Common.cs index 8c17def9..9a4887d6 100644 --- a/File_Format_Library/FileFormats/Layout/Common.cs +++ b/File_Format_Library/FileFormats/Layout/Common.cs @@ -219,8 +219,15 @@ namespace LayoutBXLYT } public object Clone() - { - return this.MemberwiseClone(); + { + BasePane copiedPane = (BasePane)this.MemberwiseClone(); + if (copiedPane is IPicturePane) + ((IPicturePane)copiedPane).CopyMaterial(); + if (copiedPane is ITextPane) + ((ITextPane)copiedPane).CopyMaterial(); + if (copiedPane is IWindowPane) + ((IWindowPane)copiedPane).CopyWindows(); + return copiedPane; } public virtual UserData CreateUserData() @@ -1210,6 +1217,8 @@ namespace LayoutBXLYT STColor8 ColorTopRight { get; set; } STColor8 ColorBottomLeft { get; set; } STColor8 ColorBottomRight { get; set; } + + void CopyMaterial(); } public interface IBoundryPane @@ -1261,6 +1270,8 @@ namespace LayoutBXLYT bool ShadowEnabled { get; set; } string FontName { get; set; } ushort FontIndex { get; set; } + + void CopyMaterial(); } public interface IPartPane @@ -1291,6 +1302,8 @@ namespace LayoutBXLYT [Browsable(false)] List<BxlytWindowFrame> WindowFrames { get; set; } + + void CopyWindows(); } public class BXLAN @@ -1298,7 +1311,7 @@ namespace LayoutBXLYT public BxlanHeader BxlanHeader; } - public class BxlytWindowContent + public class BxlytWindowContent : ICloneable { public STColor8 ColorTopLeft { get; set; } public STColor8 ColorTopRight { get; set; } @@ -1314,6 +1327,11 @@ namespace LayoutBXLYT private BxlytHeader LayoutFile; + public object Clone() + { + return this.MemberwiseClone(); + } + public BxlytWindowContent(BxlytHeader header, string name) { LayoutFile = header; @@ -1372,7 +1390,7 @@ namespace LayoutBXLYT } } - public class BxlytWindowFrame + public class BxlytWindowFrame : ICloneable { [TypeConverter(typeof(ExpandableObjectConverter))] public BxlytMaterial Material { get; set; } @@ -1380,6 +1398,11 @@ namespace LayoutBXLYT public ushort MaterialIndex; public WindowFrameTexFlip TextureFlip { get; set; } + public object Clone() + { + return this.MemberwiseClone(); + } + public BxlytWindowFrame(BxlytHeader header, string materialName) { TextureFlip = WindowFrameTexFlip.None; @@ -2150,7 +2173,7 @@ namespace LayoutBXLYT } } - public class BxlytMaterial + public class BxlytMaterial { //Setup some enable booleans //These determine wether to switch to default values or not @@ -2193,6 +2216,11 @@ namespace LayoutBXLYT return false; } + public virtual BxlytMaterial Clone() + { + return (BxlytMaterial)this.MemberwiseClone(); + } + public void RemoveNodeWrapper() { if (NodeWrapper != null && NodeWrapper.Parent != null) @@ -2202,8 +2230,6 @@ namespace LayoutBXLYT } } - - public virtual void AddTexture(string texture) { int index = ParentLayout.AddTexture(texture); diff --git a/File_Format_Library/FileFormats/Layout/Rev/BRLYT.cs b/File_Format_Library/FileFormats/Layout/Rev/BRLYT.cs index 165aab80..23c303e8 100644 --- a/File_Format_Library/FileFormats/Layout/Rev/BRLYT.cs +++ b/File_Format_Library/FileFormats/Layout/Rev/BRLYT.cs @@ -665,6 +665,12 @@ namespace LayoutBXLYT } } + public void CopyWindows() { + Content = (BxlytWindowContent)Content.Clone(); + for (int f = 0; f < WindowFrames.Count; f++) + WindowFrames[f] = (BxlytWindowFrame)WindowFrames[f].Clone(); + } + [TypeConverter(typeof(ExpandableObjectConverter))] public BxlytWindowContent Content { get; set; } @@ -862,6 +868,10 @@ namespace LayoutBXLYT TexCoords[0] = new TexCoord(); } + public void CopyMaterial() { + Material = (BxlytMaterial)Material.Clone(); + } + public PIC1(FileReader reader, BRLYT.Header header) : base(reader) { ParentLayout = header; @@ -1115,6 +1125,14 @@ namespace LayoutBXLYT return ""; } + public override BxlytMaterial Clone() + { + Material mat = new Material(); + return mat; + } + + public Material() { } + public Material(string name, Header header) { TextureMaps = new TextureRef[0]; diff --git a/File_Format_Library/GUI/BFLYT/LayoutEditor.cs b/File_Format_Library/GUI/BFLYT/LayoutEditor.cs index 8e4e8b1c..50e13c97 100644 --- a/File_Format_Library/GUI/BFLYT/LayoutEditor.cs +++ b/File_Format_Library/GUI/BFLYT/LayoutEditor.cs @@ -151,6 +151,9 @@ namespace LayoutBXLYT LayoutFiles.Add(header); ActiveLayout = header; + //Update the saving for the layout + ActiveLayout.FileInfo.CanSave = true; + LayoutViewer Viewport = new LayoutViewer(this, header, Textures); Viewport.DockContent = new DockContent(); Viewport.DockContent.Text = header.FileName; @@ -1115,7 +1118,28 @@ namespace LayoutBXLYT name = name.Replace(numberedEnd, string.Empty); } - pane.Name = RenamePane(name); + name = RenamePane(name); + if (ActiveLayout.PaneLookup.ContainsKey(name)) + throw new Exception("Pane name duplicate! " + name); + + + pane.Name = name; + pane.LayoutFile = ActiveLayout; + + if (pane is IPicturePane) + { + ((IPicturePane)pane).Material.Name = pane.Name; + ((IPicturePane)pane).MaterialIndex = (ushort)ActiveLayout.AddMaterial(((IPicturePane)pane).Material); + } + if (pane is ITextPane) + { + ((ITextPane)pane).Material.Name = pane.Name; + ((ITextPane)pane).MaterialIndex = (ushort)ActiveLayout.AddMaterial(((ITextPane)pane).Material); + } + if (pane is IWindowPane) + { + } + pane.NodeWrapper = LayoutHierarchy.CreatePaneWrapper(pane); ActiveLayout.AddPane(pane, pane.Parent); }