From 5dd4701c4c6cd853b56597920c4d99e9ff585b2f Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Sat, 31 Dec 2022 21:56:39 +0100 Subject: [PATCH] Improve AVFX writing. --- Penumbra.GameData/Files/AvfxFile.cs | 93 ++++++++++++++-------------- Penumbra.GameData/Files/AvfxMagic.cs | 32 +++++++--- 2 files changed, 69 insertions(+), 56 deletions(-) diff --git a/Penumbra.GameData/Files/AvfxFile.cs b/Penumbra.GameData/Files/AvfxFile.cs index 3077d960..330a8416 100644 --- a/Penumbra.GameData/Files/AvfxFile.cs +++ b/Penumbra.GameData/Files/AvfxFile.cs @@ -20,8 +20,8 @@ public class AvfxFile : IWritable Data = r.ReadBytes((int)Size.RoundTo4()); } - public bool ToBool() - => BitConverter.ToBoolean(Data); + public byte ToBool() + => BitConverter.ToBoolean(Data) ? (byte)1 : (byte)0; public uint ToUint() => BitConverter.ToUInt32(Data); @@ -36,51 +36,52 @@ public class AvfxFile : IWritable } } + public static readonly Vector3 BadVector = new(float.NaN); - public Vector3 ClipBox; - public Vector3 ClipBoxSize; - public Vector3 RevisedValuesPos; - public Vector3 RevisedValuesRot; - public Vector3 RevisedValuesScale; - public Vector3 RevisedValuesColor; + public Vector3 ClipBox = BadVector; + public Vector3 ClipBoxSize = BadVector; + public Vector3 RevisedValuesPos = BadVector; + public Vector3 RevisedValuesRot = BadVector; + public Vector3 RevisedValuesScale = BadVector; + public Vector3 RevisedValuesColor = BadVector; - public uint Version; - public uint DrawLayerType; - public uint DrawOrderType; - public uint DirectionalLightSourceType; - public uint PointLightsType1; - public uint PointLightsType2; + public uint Version = uint.MaxValue; + public uint DrawLayerType = uint.MaxValue; + public uint DrawOrderType = uint.MaxValue; + public uint DirectionalLightSourceType = uint.MaxValue; + public uint PointLightsType1 = uint.MaxValue; + public uint PointLightsType2 = uint.MaxValue; - public float BiasZmaxScale; - public float BiasZmaxDistance; - public float NearClipBegin; - public float NearClipEnd; - public float FadeInnerX; - public float FadeOuterX; - public float FadeInnerY; - public float FadeOuterY; - public float FadeInnerZ; - public float FadeOuterZ; - public float FarClipBegin; - public float FarClipEnd; - public float SoftParticleFadeRange; - public float SoftKeyOffset; - public float GlobalFogInfluence; + public float BiasZmaxScale = float.NaN; + public float BiasZmaxDistance = float.NaN; + public float NearClipBegin = float.NaN; + public float NearClipEnd = float.NaN; + public float FadeInnerX = float.NaN; + public float FadeOuterX = float.NaN; + public float FadeInnerY = float.NaN; + public float FadeOuterY = float.NaN; + public float FadeInnerZ = float.NaN; + public float FadeOuterZ = float.NaN; + public float FarClipBegin = float.NaN; + public float FarClipEnd = float.NaN; + public float SoftParticleFadeRange = float.NaN; + public float SoftKeyOffset = float.NaN; + public float GlobalFogInfluence = float.NaN; - public bool IsDelayFastParticle; - public bool IsFitGround; - public bool IsTransformSkip; - public bool IsAllStopOnHide; - public bool CanBeClippedOut; - public bool ClipBoxEnabled; - public bool IsCameraSpace; - public bool IsFullEnvLight; - public bool IsClipOwnSetting; - public bool FadeEnabledX; - public bool FadeEnabledY; - public bool FadeEnabledZ; - public bool GlobalFogEnabled; - public bool LtsEnabled; + public byte IsDelayFastParticle = byte.MaxValue; + public byte IsFitGround = byte.MaxValue; + public byte IsTransformSkip = byte.MaxValue; + public byte IsAllStopOnHide = byte.MaxValue; + public byte CanBeClippedOut = byte.MaxValue; + public byte ClipBoxEnabled = byte.MaxValue; + public byte IsCameraSpace = byte.MaxValue; + public byte IsFullEnvLight = byte.MaxValue; + public byte IsClipOwnSetting = byte.MaxValue; + public byte FadeEnabledX = byte.MaxValue; + public byte FadeEnabledY = byte.MaxValue; + public byte FadeEnabledZ = byte.MaxValue; + public byte GlobalFogEnabled = byte.MaxValue; + public byte LtsEnabled = byte.MaxValue; public Block[] Schedulers = Array.Empty(); public Block[] Timelines = Array.Empty(); @@ -91,7 +92,8 @@ public class AvfxFile : IWritable public string[] Textures = Array.Empty(); public Block[] Models = Array.Empty(); - public bool Valid { get; } = true; + public bool Valid + => true; public AvfxFile(byte[] data) { @@ -198,7 +200,6 @@ public class AvfxFile : IWritable var sizePos = w.BaseStream.Position; w.Write(0u); w.WriteBlock(AvfxMagic.Version, Version) - .WriteBlock(AvfxMagic.IsDelayFastParticle, IsDelayFastParticle) .WriteBlock(AvfxMagic.IsDelayFastParticle, IsDelayFastParticle) .WriteBlock(AvfxMagic.IsFitGround, IsFitGround) .WriteBlock(AvfxMagic.IsTransformSkip, IsTransformSkip) @@ -276,7 +277,7 @@ public class AvfxFile : IWritable foreach (var block in Models) w.WriteBlock(block); w.Seek((int)sizePos, SeekOrigin.Begin); - w.Write((uint)w.BaseStream.Length); + w.Write((uint)w.BaseStream.Length - 8u); return m.ToArray(); } } diff --git a/Penumbra.GameData/Files/AvfxMagic.cs b/Penumbra.GameData/Files/AvfxMagic.cs index 1c315711..0a78b4fb 100644 --- a/Penumbra.GameData/Files/AvfxMagic.cs +++ b/Penumbra.GameData/Files/AvfxMagic.cs @@ -108,25 +108,37 @@ public static class AvfxMagic internal static BinaryWriter WriteBlock(this BinaryWriter bw, uint magic, uint value) { - bw.Write(magic); - bw.Write(4u); - bw.Write(value); + if (value != uint.MaxValue) + { + bw.Write(magic); + bw.Write(4u); + bw.Write(value); + } + return bw; } - internal static BinaryWriter WriteBlock(this BinaryWriter bw, uint magic, bool value) + internal static BinaryWriter WriteBlock(this BinaryWriter bw, uint magic, byte value) { - bw.Write(magic); - bw.Write(4u); - bw.Write(value ? 1u : 0u); + if (value != byte.MaxValue) + { + bw.Write(magic); + bw.Write(4u); + bw.Write(value == 1 ? 1u : 0u); + } + return bw; } internal static BinaryWriter WriteBlock(this BinaryWriter bw, uint magic, float value) { - bw.Write(magic); - bw.Write(4u); - bw.Write(value); + if (!float.IsNaN(value)) + { + bw.Write(magic); + bw.Write(4u); + bw.Write(value); + } + return bw; }