diff --git a/src/Branch/BuildAttribute.cs b/src/Branch/BuildAttribute.cs index 670807d..4ef118c 100644 --- a/src/Branch/BuildAttribute.cs +++ b/src/Branch/BuildAttribute.cs @@ -15,4 +15,25 @@ public BuildAttribute(UnrealPackage.GameBuild.BuildName build) Build = build; } } -} + + /// + /// Not yet usable. + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property)] + public class BuildGenerationAttribute : Attribute + { + public readonly BuildGeneration Generation; + public readonly int EngineVersion = -1; + + public BuildGenerationAttribute(BuildGeneration generation) + { + Generation = generation; + } + + public BuildGenerationAttribute(BuildGeneration generation, int engineVersion) + { + Generation = generation; + EngineVersion = engineVersion; + } + } +} \ No newline at end of file diff --git a/src/Branch/PackageObjectLegacyVersion.cs b/src/Branch/PackageObjectLegacyVersion.cs index 48df2cc..a61913b 100644 --- a/src/Branch/PackageObjectLegacyVersion.cs +++ b/src/Branch/PackageObjectLegacyVersion.cs @@ -10,6 +10,8 @@ public enum PackageObjectLegacyVersion ReturnExpressionAddedToReturnToken = 62, SphereExtendsPlane = 62, + + CharRemapAddedToUFont = 69, /// /// FIXME: Unknown version. @@ -21,6 +23,10 @@ public enum PackageObjectLegacyVersion /// PrimitiveCastTokenAdded = 95, + + KerningAddedToUFont = 119, + FontPagesDisplaced = 122, + UE3 = 184, RangeConstTokenDeprecated = UE3, @@ -30,6 +36,10 @@ public enum PackageObjectLegacyVersion /// FIXME: Unknown version. /// IsLocalAddedToDelegateFunctionToken = 181, + + VerticalOffsetAddedToUFont = 506, + CleanupFonts = 511, + ProbeMaskReducedAndIgnoreMaskRemoved = 692, ForceScriptOrderAddedToUClass = 749, SuperReferenceMovedToUStruct = 756, diff --git a/src/Eliot.UELib.csproj b/src/Eliot.UELib.csproj index 95582df..7d56a28 100644 --- a/src/Eliot.UELib.csproj +++ b/src/Eliot.UELib.csproj @@ -180,7 +180,9 @@ - + + + diff --git a/src/Engine/Classes/UFont.cs b/src/Engine/Classes/UFont.cs index 5e87f75..527b08d 100644 --- a/src/Engine/Classes/UFont.cs +++ b/src/Engine/Classes/UFont.cs @@ -1,4 +1,4 @@ -using System; +using UELib.Branch; using UELib.Core; namespace UELib.Engine @@ -9,52 +9,150 @@ namespace UELib.Engine [UnrealRegisterClass] public class UFont : UObject, IUnrealViewable { + public UArray Characters; + public UArray Textures; + public int Kerning; + public UMap CharRemap; + public bool IsRemapped; + public UFont() { ShouldDeserializeOnDemand = true; } - - private struct FontCharacter : IUnrealSerializableClass + + protected override void Deserialize() { - private int _StartU; - private int _StartV; - private int _USize; - private int _VSize; - byte _TextureIndex; + base.Deserialize(); - public void Serialize(IUnrealStream stream) + if (_Buffer.Version < (uint)PackageObjectLegacyVersion.FontPagesDisplaced) + { + _Buffer.Read(out UArray pages); + Record(nameof(pages), pages); + + _Buffer.Read(out int charactersPerPage); + Record(nameof(charactersPerPage), charactersPerPage); + + Characters = new UArray(); + Textures = new UArray(); + for (var i = 0; i < pages.Count; i++) + { + Textures.Add(pages[i].Texture); + foreach (var c in pages[i].Characters) + { + var character = c; + character.TextureIndex = (byte)i; + Characters.Add(character); + } + } + + if (pages.Count == 0 && charactersPerPage == 0) + { + _Buffer.Read(out string fontName); + Record(nameof(fontName), fontName); + + _Buffer.Read(out int fontHeight); + Record(nameof(fontHeight), fontHeight); + } + } + else if (_Buffer.Version < (uint)PackageObjectLegacyVersion.CleanupFonts) { - throw new NotImplementedException(); + _Buffer.Read(out Characters); + Record(nameof(Characters), Characters); + + _Buffer.Read(out Textures); + Record(nameof(Textures), Textures); + + if (_Buffer.Version >= (uint)PackageObjectLegacyVersion.KerningAddedToUFont) + { + _Buffer.Read(out Kerning); + Record(nameof(Kerning), Kerning); + } } - public void Deserialize(IUnrealStream stream) + if (_Buffer.Version >= (uint)PackageObjectLegacyVersion.CharRemapAddedToUFont) { - _StartU = stream.ReadInt32(); - _StartV = stream.ReadInt32(); + _Buffer.Read(out CharRemap); + Record(nameof(CharRemap), CharRemap); - _USize = stream.ReadInt32(); - _VSize = stream.ReadInt32(); + if (_Buffer.Version >= (uint)PackageObjectLegacyVersion.CleanupFonts) + { + return; + } - _TextureIndex = stream.ReadByte(); + _Buffer.Read(out IsRemapped); + Record(nameof(IsRemapped), IsRemapped); + + //if (_Buffer.Package.Build == UnrealPackage.GameBuild.BuildName.Unreal2XMP && + // _Buffer.LicenseeVersion > 0) + //{ + // _Buffer.Read(out int xPad); + // _Buffer.Read(out int yPad); + //} } - }; + } - private UArray _Characters; + public struct FontPage : IUnrealSerializableClass + { + public UTexture Texture; + public UArray Characters; - protected override void Deserialize() + public void Deserialize(IUnrealStream stream) + { + stream.Read(out Texture); + stream.Read(out Characters); + } + + public void Serialize(IUnrealStream stream) + { + stream.Write(Texture); + stream.Write(ref Characters); + } + } + + public struct FontCharacter : IUnrealSerializableClass { - base.Deserialize(); + public int StartU; + public int StartV; + public int USize; + public int VSize; + public byte TextureIndex; + public int VerticalOffset; + + public void Deserialize(IUnrealStream stream) + { + stream.Read(out StartU); + stream.Read(out StartV); + stream.Read(out USize); + stream.Read(out VSize); - _Buffer.ReadArray(out _Characters); + if (stream.Version >= (uint)PackageObjectLegacyVersion.FontPagesDisplaced) + { + stream.Read(out TextureIndex); + } - // Textures + if (stream.Version >= (uint)PackageObjectLegacyVersion.VerticalOffsetAddedToUFont) + { + stream.Read(out VerticalOffset); + } + } - // Kerning - _Buffer.ReadInt32(); + public void Serialize(IUnrealStream stream) + { + stream.Write(StartU); + stream.Write(StartV); + stream.Write(USize); + stream.Write(VSize); - // Remap + if (stream.Version >= (uint)PackageObjectLegacyVersion.FontPagesDisplaced) + { + stream.Write(TextureIndex); + } - _Buffer.UR.ReadBoolean(); + if (stream.Version >= (uint)PackageObjectLegacyVersion.VerticalOffsetAddedToUFont) + { + stream.Write(VerticalOffset); + } + } } } } \ No newline at end of file diff --git a/src/Engine/Classes/UMultiFont.cs b/src/Engine/Classes/UMultiFont.cs new file mode 100644 index 0000000..1daccc5 --- /dev/null +++ b/src/Engine/Classes/UMultiFont.cs @@ -0,0 +1,25 @@ +using UELib.Branch; +using UELib.Core; + +namespace UELib.Engine +{ + /// + /// Represents the UMultiFont:Engine.MultiFont + /// + [UnrealRegisterClass] + [BuildGeneration(BuildGeneration.UE3)] + public class UMultiFont : UFont + { + public UArray ResolutionTestTable; + + protected override void Deserialize() + { + base.Deserialize(); + + if (_Buffer.Version < (uint)PackageObjectLegacyVersion.CleanupFonts) + { + _Buffer.ReadArray(out ResolutionTestTable); + } + } + } +} \ No newline at end of file