Improve AVFX writing.

This commit is contained in:
Ottermandias 2022-12-31 21:56:39 +01:00
parent ab53f17a7e
commit 5dd4701c4c
2 changed files with 69 additions and 56 deletions

View file

@ -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<Block>();
public Block[] Timelines = Array.Empty<Block>();
@ -91,7 +92,8 @@ public class AvfxFile : IWritable
public string[] Textures = Array.Empty<string>();
public Block[] Models = Array.Empty<Block>();
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();
}
}

View file

@ -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;
}