diff --git a/Source/SharpNeedle/Framework/BINA/BinaryResource.cs b/Source/SharpNeedle/Framework/BINA/BinaryResource.cs index 2e2d047..2d71864 100644 --- a/Source/SharpNeedle/Framework/BINA/BinaryResource.cs +++ b/Source/SharpNeedle/Framework/BINA/BinaryResource.cs @@ -35,8 +35,8 @@ public override void Read(IFile file) reader.Endianness = Version.Endianness; - Size = reader.Read(); - ushort chunkCount = reader.Read(); + Size = reader.ReadUInt32(); + ushort chunkCount = reader.ReadUInt16(); reader.Skip(2); ChunkParseOptions options = new() @@ -113,13 +113,13 @@ private void WriteV1(BinaryObjectWriter writer) { long begin = writer.Position; SeekToken sizeToken = writer.At(); - writer.Write(0); - writer.Write(0L); // Offset table - writer.Write(0L); // what + writer.WriteInt32(0); + writer.WriteInt64(0); // Offset table + writer.WriteInt64(0); // what writer.WriteObject(Version); - writer.Write(Signature); - writer.Write(0); + writer.WriteUInt32(Signature); + writer.WriteInt32(0); writer.PushOffsetOrigin(); ChunkParseOptions options = new() @@ -146,14 +146,14 @@ private void WriteV1(BinaryObjectWriter writer) byte[] offTableEncoded = offTable.Encode(); writer.Skip(4); // Skip size for now writer.WriteArrayOffset(offTableEncoded); - writer.Write(offTableEncoded.Length); + writer.WriteInt32(offTableEncoded.Length); endToken.Dispose(); writer.Flush(); endToken = writer.At(writer.Length, SeekOrigin.End); sizeToken.Dispose(); - writer.Write((int)((long)endToken - begin)); + writer.WriteInt32((int)((long)endToken - begin)); writer.PopOffsetOrigin(); endToken.Dispose(); } @@ -165,8 +165,8 @@ private void WriteV2(BinaryObjectWriter writer) writer.WriteObject(Version); SeekToken sizeToken = writer.At(); - writer.Write(0); - writer.Write((short)Chunks.Count); + writer.WriteInt32(0); + writer.WriteInt16((short)Chunks.Count); writer.Align(4); ChunkParseOptions options = new() @@ -181,7 +181,7 @@ private void WriteV2(BinaryObjectWriter writer) using SeekToken end = writer.At(writer.Length, SeekOrigin.Begin); sizeToken.Dispose(); - writer.Write((int)((long)end - begin)); + writer.WriteInt32((int)((long)end - begin)); } public abstract void Read(BinaryObjectReader reader); diff --git a/Source/SharpNeedle/Framework/BINA/ChunkHeader.cs b/Source/SharpNeedle/Framework/BINA/ChunkHeader.cs index d17c25b..f6147d4 100644 --- a/Source/SharpNeedle/Framework/BINA/ChunkHeader.cs +++ b/Source/SharpNeedle/Framework/BINA/ChunkHeader.cs @@ -10,12 +10,12 @@ public struct ChunkHeader : IBinarySerializable public void Read(BinaryObjectReader reader) { Signature = reader.ReadNative(); - reader.Read(out Size); + Size = reader.ReadUInt32(); } public void Write(BinaryObjectWriter writer) { writer.WriteNative(Signature); - writer.Write(ref Size); + writer.WriteUInt32(Size); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/BINA/DataChunk.cs b/Source/SharpNeedle/Framework/BINA/DataChunk.cs index a76db37..5c9cb82 100644 --- a/Source/SharpNeedle/Framework/BINA/DataChunk.cs +++ b/Source/SharpNeedle/Framework/BINA/DataChunk.cs @@ -22,11 +22,11 @@ public void Read(BinaryObjectReader reader, ChunkParseOptions options) Signature = options.Header.Value.Signature; BinaryHelper.EnsureSignature(Signature, true, BinSignature, AltBinSignature); - uint strTableOffset = reader.Read(); - uint strTableSize = reader.Read(); - int offTableSize = reader.Read(); + uint strTableOffset = reader.ReadUInt32(); + uint strTableSize = reader.ReadUInt32(); + int offTableSize = reader.ReadInt32(); - ushort dataOffset = reader.Read(); + ushort dataOffset = reader.ReadUInt16(); reader.Skip(2); reader.Skip(dataOffset); @@ -65,16 +65,16 @@ public void Write(BinaryObjectWriter writer, ChunkParseOptions options) writer.WriteNative(Signature); - writer.Write((int)(baseSize + table.Length + 0x34)); // Size - writer.Write((int)baseSize); // String Table - writer.Write(0); // String Table Size - writer.Write(table.Length); // Offset Table Size + writer.WriteInt32((int)(baseSize + table.Length + 0x34)); // Size + writer.WriteInt32((int)baseSize); // String Table + writer.WriteInt32(0); // String Table Size + writer.WriteInt32(table.Length); // Offset Table Size - writer.Write((short)0x18); - writer.Write((short)0x00); + writer.WriteInt16(0x18); + writer.WriteInt16(0x00); // Reserved - writer.WriteCollection(Enumerable.Repeat(0, 3)); + writer.Skip(24); // Slice the buffer because the capacity can be bigger writer.WriteArray(dataStream.GetBuffer().AsSpan()[..(int)dataStream.Length]); diff --git a/Source/SharpNeedle/Framework/BINA/OffsetTable.cs b/Source/SharpNeedle/Framework/BINA/OffsetTable.cs index 3f12764..7fa16f4 100644 --- a/Source/SharpNeedle/Framework/BINA/OffsetTable.cs +++ b/Source/SharpNeedle/Framework/BINA/OffsetTable.cs @@ -90,19 +90,19 @@ public static void Encode(IEnumerable offsets, BinaryValueWriter writer) long d = (offset - lastOffset) >> 2; if (d > 0x3FFF) { - writer.WriteBig((byte)(0xC0 | (d >> 24))); - writer.WriteBig((byte)(d >> 16)); - writer.WriteBig((byte)(d >> 8)); - writer.WriteBig((byte)(d & 0xFF)); + writer.WriteByte((byte)(0xC0 | (d >> 24))); + writer.WriteByte((byte)(d >> 16)); + writer.WriteByte((byte)(d >> 8)); + writer.WriteByte((byte)(d & 0xFF)); } else if (d > 0x3F) { - writer.WriteBig((byte)(0x80 | (d >> 8))); - writer.WriteBig((byte)d); + writer.WriteByte((byte)(0x80 | (d >> 8))); + writer.WriteByte((byte)d); } else { - writer.Write((byte)(0x40 | d)); + writer.WriteByte((byte)(0x40 | d)); } lastOffset = offset; diff --git a/Source/SharpNeedle/Framework/BINA/RawChunk.cs b/Source/SharpNeedle/Framework/BINA/RawChunk.cs index 8b412a3..13b9606 100644 --- a/Source/SharpNeedle/Framework/BINA/RawChunk.cs +++ b/Source/SharpNeedle/Framework/BINA/RawChunk.cs @@ -18,8 +18,8 @@ public void Write(BinaryObjectWriter writer, ChunkParseOptions options) throw new InvalidDataException("RawChunk has no data"); } - writer.Write(Signature); - writer.Write(Data.Length + ChunkHeader.BinarySize); + writer.WriteUInt32(Signature); + writer.WriteInt32(Data.Length + ChunkHeader.BinarySize); writer.WriteArray(Data); } diff --git a/Source/SharpNeedle/Framework/BINA/Version.cs b/Source/SharpNeedle/Framework/BINA/Version.cs index f6cf94e..7bafb0f 100644 --- a/Source/SharpNeedle/Framework/BINA/Version.cs +++ b/Source/SharpNeedle/Framework/BINA/Version.cs @@ -20,15 +20,15 @@ public Version(byte major, byte minor, byte revision, Endianness endianness) public void Read(BinaryObjectReader reader) { - byte ma = reader.Read(); - byte mi = reader.Read(); - byte r = reader.Read(); + byte ma = reader.ReadByte(); + byte mi = reader.ReadByte(); + byte r = reader.ReadByte(); Major = ma < 0x30 ? ma : (byte)(ma - 0x30); Minor = mi < 0x30 ? mi : (byte)(mi - 0x30); Revision = r < 0x30 ? r : (byte)(r - 0x30); - byte e = reader.Read(); + byte e = reader.ReadByte(); switch (e) { case 0x4C: @@ -45,25 +45,25 @@ public readonly void Write(BinaryObjectWriter writer) { if (Major == 0) { - writer.Write(Major); - writer.Write(Minor); - writer.Write((byte)(Revision + 0x30)); + writer.WriteByte(Major); + writer.WriteByte(Minor); + writer.WriteByte((byte)(Revision + 0x30)); } else { - writer.Write((byte)(Major + 0x30)); - writer.Write((byte)(Minor + 0x30)); - writer.Write((byte)(Revision + 0x30)); + writer.WriteByte((byte)(Major + 0x30)); + writer.WriteByte((byte)(Minor + 0x30)); + writer.WriteByte((byte)(Revision + 0x30)); } switch (Endianness) { case Endianness.Little: - writer.Write((byte)0x4C); + writer.WriteByte(0x4C); break; case Endianness.Big: - writer.Write((byte)0x42); + writer.WriteByte(0x42); break; } } diff --git a/Source/SharpNeedle/Framework/Glitter/AnimationParameter.cs b/Source/SharpNeedle/Framework/Glitter/AnimationParameter.cs index a990721..3ebdbf4 100644 --- a/Source/SharpNeedle/Framework/Glitter/AnimationParameter.cs +++ b/Source/SharpNeedle/Framework/Glitter/AnimationParameter.cs @@ -9,7 +9,7 @@ public class AnimationParameter : IBinarySerializable public void Read(BinaryObjectReader reader) { long keyframeOffset = reader.ReadOffsetValue(); - int keyframeCount = reader.Read(); + int keyframeCount = reader.ReadInt32(); reader.ReadAtOffset(keyframeOffset, () => { @@ -19,8 +19,8 @@ public void Read(BinaryObjectReader reader) } }); - Field08 = reader.Read(); - Field0C = reader.Read(); + Field08 = reader.ReadInt32(); + Field0C = reader.ReadInt32(); } public void Write(BinaryObjectWriter writer) @@ -33,9 +33,9 @@ public void Write(BinaryObjectWriter writer) } }); - writer.Write(Keyframes.Count); + writer.WriteInt32(Keyframes.Count); - writer.Write(Field08); - writer.Write(Field0C); + writer.WriteInt32(Field08); + writer.WriteInt32(Field0C); } } diff --git a/Source/SharpNeedle/Framework/Glitter/Effect.cs b/Source/SharpNeedle/Framework/Glitter/Effect.cs index 7819338..e172a31 100644 --- a/Source/SharpNeedle/Framework/Glitter/Effect.cs +++ b/Source/SharpNeedle/Framework/Glitter/Effect.cs @@ -13,7 +13,7 @@ public override void Read(BinaryObjectReader reader) { reader.EnsureSignature(Signature); - Version = reader.Read(); + Version = reader.ReadUInt32(); if (Version != 0x01060000) { throw new NotSupportedException(); @@ -31,10 +31,10 @@ public override void Write(BinaryObjectWriter writer) throw new NotSupportedException(); } - writer.Write(Signature); - writer.Write(Version); + writer.WriteUInt32(Signature); + writer.WriteUInt32(Version); - writer.Write(0); // Always 0? + writer.WriteInt32(0); // Always 0? if (Parameters.First != null) { diff --git a/Source/SharpNeedle/Framework/Glitter/EffectParameter.cs b/Source/SharpNeedle/Framework/Glitter/EffectParameter.cs index 829ad9a..42884ce 100644 --- a/Source/SharpNeedle/Framework/Glitter/EffectParameter.cs +++ b/Source/SharpNeedle/Framework/Glitter/EffectParameter.cs @@ -1,5 +1,7 @@ namespace SharpNeedle.Framework.Glitter; +using System.Net; + public class EffectParameter : IBinarySerializable { public string? Name { get; set; } @@ -26,32 +28,32 @@ public void Read(BinaryObjectReader reader, Effect parent) { Name = reader.ReadStringOffset(); - StartTime = reader.Read(); - LifeTime = reader.Read(); + StartTime = reader.ReadSingle(); + LifeTime = reader.ReadSingle(); - PreprocessFrame = reader.Read(); + PreprocessFrame = reader.ReadInt32(); - EffectScale = reader.Read(); - EmittingScale = reader.Read(); - Opacity = reader.Read(); + EffectScale = reader.ReadSingle(); + EmittingScale = reader.ReadSingle(); + Opacity = reader.ReadSingle(); - Field1C = reader.Read(); + Field1C = reader.ReadSingle(); reader.Align(16); - Position = reader.Read(); + Position = reader.ReadVector3(); reader.Align(16); - Rotation = reader.Read().ToDegrees(); + Rotation = reader.ReadVector3().ToDegrees(); reader.Align(16); - Scale = reader.Read(); + Scale = reader.ReadVector3(); reader.Align(16); - Field50 = reader.Read(); - Field54 = reader.Read(); - Field58 = reader.Read(); - Field5C = reader.Read(); - Field60 = reader.Read(); + Field50 = reader.ReadInt32(); + Field54 = reader.ReadInt32(); + Field58 = reader.ReadInt32(); + Field5C = reader.ReadInt32(); + Field60 = reader.ReadInt32(); - Loop = Convert.ToBoolean(reader.Read()); + Loop = Convert.ToBoolean(reader.ReadInt32()); for (int i = 0; i < Animations.Capacity; i++) { @@ -81,31 +83,31 @@ public void Write(BinaryObjectWriter writer, Effect parent) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(StartTime); - writer.Write(LifeTime); + writer.WriteSingle(StartTime); + writer.WriteSingle(LifeTime); - writer.Write(PreprocessFrame); + writer.WriteInt32(PreprocessFrame); - writer.Write(EffectScale); - writer.Write(EmittingScale); - writer.Write(Opacity); - writer.Write(Field1C); + writer.WriteSingle(EffectScale); + writer.WriteSingle(EmittingScale); + writer.WriteSingle(Opacity); + writer.WriteSingle(Field1C); writer.Align(16); - writer.Write(Position); + writer.WriteVector3(Position); writer.Align(16); - writer.Write(Rotation.ToRadians()); + writer.WriteVector3(Rotation.ToRadians()); writer.Align(16); - writer.Write(Scale); + writer.WriteVector3(Scale); writer.Align(16); - writer.Write(Field50); - writer.Write(Field54); - writer.Write(Field58); - writer.Write(Field5C); - writer.Write(Field60); + writer.WriteInt32(Field50); + writer.WriteInt32(Field54); + writer.WriteInt32(Field58); + writer.WriteInt32(Field5C); + writer.WriteInt32(Field60); - writer.Write(Convert.ToInt32(Loop)); + writer.WriteInt32(Convert.ToInt32(Loop)); foreach (AnimationParameter animation in Animations) { diff --git a/Source/SharpNeedle/Framework/Glitter/EmitterParameter.cs b/Source/SharpNeedle/Framework/Glitter/EmitterParameter.cs index d391e14..801af25 100644 --- a/Source/SharpNeedle/Framework/Glitter/EmitterParameter.cs +++ b/Source/SharpNeedle/Framework/Glitter/EmitterParameter.cs @@ -34,42 +34,42 @@ public void Read(BinaryObjectReader reader, EffectParameter parent) { Name = reader.ReadStringOffset(); - EmitterType = reader.Read(); + EmitterType = (EEmitterType)reader.ReadInt32(); - StartTime = reader.Read(); - LifeTime = reader.Read(); + StartTime = reader.ReadSingle(); + LifeTime = reader.ReadSingle(); reader.Align(16); - InitialPosition = reader.Read(); + InitialPosition = reader.ReadVector3(); reader.Align(16); - InitialRotation = reader.Read().ToDegrees(); + InitialRotation = reader.ReadVector3().ToDegrees(); reader.Align(16); - Rotation = reader.Read().ToDegrees(); + Rotation = reader.ReadVector3().ToDegrees(); reader.Align(16); - RotationRandomMargin = reader.Read().ToDegrees(); + RotationRandomMargin = reader.ReadVector3().ToDegrees(); reader.Align(16); - InitialScale = reader.Read(); + InitialScale = reader.ReadVector3(); reader.Align(16); - LoopStartPosition = reader.Read(); - LoopEndPosition = reader.Read(); + LoopStartPosition = reader.ReadSingle(); + LoopEndPosition = reader.ReadSingle(); - EmitCondition = reader.Read(); - DirectionType = reader.Read(); + EmitCondition = (EEmitCondition)reader.ReadInt32(); + DirectionType = (EDirectionType)reader.ReadInt32(); - EmissionInterval = reader.Read(); - ParticlePerEmission = reader.Read(); + EmissionInterval = reader.ReadSingle(); + ParticlePerEmission = reader.ReadSingle(); - Field78 = reader.Read(); - Field7C = reader.Read(); + Field78 = reader.ReadInt32(); + Field7C = reader.ReadInt32(); - ShapeParameter = reader.Read(); + ShapeParameter = reader.ReadObject(); - Field94 = reader.Read(); - Field98 = reader.Read(); - Field9C = reader.Read(); - Field100 = reader.Read(); - Field104 = reader.Read(); + Field94 = reader.ReadInt32(); + Field98 = reader.ReadInt32(); + Field9C = reader.ReadInt32(); + Field100 = reader.ReadInt32(); + Field104 = reader.ReadInt32(); for (int i = 0; i < Animations.Capacity; i++) { @@ -99,42 +99,42 @@ public void Write(BinaryObjectWriter writer, EffectParameter parent) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(EmitterType); + writer.WriteInt32((int)EmitterType); - writer.Write(StartTime); - writer.Write(LifeTime); + writer.WriteSingle(StartTime); + writer.WriteSingle(LifeTime); writer.Align(16); - writer.Write(InitialPosition); + writer.WriteVector3(InitialPosition); writer.Align(16); - writer.Write(InitialRotation.ToRadians()); + writer.WriteVector3(InitialRotation.ToRadians()); writer.Align(16); - writer.Write(Rotation.ToRadians()); + writer.WriteVector3(Rotation.ToRadians()); writer.Align(16); - writer.Write(RotationRandomMargin.ToRadians()); + writer.WriteVector3(RotationRandomMargin.ToRadians()); writer.Align(16); - writer.Write(InitialScale); + writer.WriteVector3(InitialScale); writer.Align(16); - writer.Write(LoopStartPosition); - writer.Write(LoopEndPosition); + writer.WriteSingle(LoopStartPosition); + writer.WriteSingle(LoopEndPosition); - writer.Write(EmitCondition); - writer.Write(DirectionType); + writer.WriteInt32((int)EmitCondition); + writer.WriteInt32((int)DirectionType); - writer.Write(EmissionInterval); - writer.Write(ParticlePerEmission); + writer.WriteSingle(EmissionInterval); + writer.WriteSingle(ParticlePerEmission); - writer.Write(Field78); - writer.Write(Field7C); + writer.WriteInt32(Field78); + writer.WriteInt32(Field7C); - writer.Write(ShapeParameter); + writer.WriteObject(ShapeParameter); - writer.Write(Field94); - writer.Write(Field98); - writer.Write(Field9C); - writer.Write(Field100); - writer.Write(Field104); + writer.WriteInt32(Field94); + writer.WriteInt32(Field98); + writer.WriteInt32(Field9C); + writer.WriteInt32(Field100); + writer.WriteInt32(Field104); foreach (AnimationParameter animation in Animations) { @@ -226,8 +226,15 @@ public struct PolygonParameter : IShapeParameter } [StructLayout(LayoutKind.Explicit, Size = 20)] - public struct ShapeParameterUnion + public struct ShapeParameterUnion : IBinarySerializable { + // for reading / writing, to ensure correct endianness (for AOT) + [FieldOffset(0)] private int _field0; + [FieldOffset(4)] private int _field1; + [FieldOffset(8)] private int _field2; + [FieldOffset(12)] private int _field3; + [FieldOffset(16)] private int _field4; + [FieldOffset(0)] public BoxParameter Box; [FieldOffset(0)] public SphereParameter Sphere; [FieldOffset(0)] public CylinderParameter Cylinder; @@ -259,6 +266,26 @@ public ShapeParameterUnion(PolygonParameter value) : this() Polygon = value; } + + public void Read(BinaryObjectReader reader) + { + _field0 = reader.ReadInt32(); + _field1 = reader.ReadInt32(); + _field2 = reader.ReadInt32(); + _field3 = reader.ReadInt32(); + _field4 = reader.ReadInt32(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteInt32(_field0); + writer.WriteInt32(_field1); + writer.WriteInt32(_field2); + writer.WriteInt32(_field3); + writer.WriteInt32(_field4); + } + + public void Set(BoxParameter value) { Box = value; @@ -284,6 +311,7 @@ public void Set(PolygonParameter value) Polygon = value; } + public static implicit operator ShapeParameterUnion(BoxParameter value) { return new(value); diff --git a/Source/SharpNeedle/Framework/Glitter/Keyframe.cs b/Source/SharpNeedle/Framework/Glitter/Keyframe.cs index 3f7cbe6..e770a31 100644 --- a/Source/SharpNeedle/Framework/Glitter/Keyframe.cs +++ b/Source/SharpNeedle/Framework/Glitter/Keyframe.cs @@ -17,27 +17,27 @@ public enum EInterpolationType : int public void Read(BinaryObjectReader reader) { - Frame = reader.Read(); - Value = reader.Read(); + Frame = reader.ReadInt32(); + Value = reader.ReadSingle(); - InterpolationType = reader.Read(); + InterpolationType = (EInterpolationType)reader.ReadInt32(); - In = reader.Read(); - Out = reader.Read(); + In = reader.ReadSingle(); + Out = reader.ReadSingle(); - Random = reader.Read(); + Random = reader.ReadSingle(); } public void Write(BinaryObjectWriter writer) { - writer.Write(Frame); - writer.Write(Value); + writer.WriteInt32(Frame); + writer.WriteSingle(Value); - writer.Write(InterpolationType); + writer.WriteInt32((int)InterpolationType); - writer.Write(In); - writer.Write(Out); + writer.WriteSingle(In); + writer.WriteSingle(Out); - writer.Write(Random); + writer.WriteSingle(Random); } } diff --git a/Source/SharpNeedle/Framework/Glitter/MaterialParameter.cs b/Source/SharpNeedle/Framework/Glitter/MaterialParameter.cs index dc6f73b..7412e10 100644 --- a/Source/SharpNeedle/Framework/Glitter/MaterialParameter.cs +++ b/Source/SharpNeedle/Framework/Glitter/MaterialParameter.cs @@ -25,24 +25,24 @@ public void Read(BinaryObjectReader reader) TextureDatas.Insert(i, reader.ReadObject()); } - int textureCount = reader.Read(); - TextureAddresMode = reader.Read(); + int textureCount = reader.ReadInt32(); + TextureAddresMode = reader.ReadInt32(); - Field2C = reader.Read(); - Field30 = reader.Read(); - Field34 = reader.Read(); - Field38 = reader.Read(); + Field2C = reader.ReadInt32(); + Field30 = reader.ReadSingle(); + Field34 = reader.ReadInt32(); + Field38 = reader.ReadInt32(); ShaderName = reader.ReadStringOffset(); reader.Skip(reader.GetOffsetSize()); // VertexShaderDataOffset reader.Skip(reader.GetOffsetSize()); // PixelShaderDataOffset - Field48 = reader.Read(); - Field4C = reader.Read(); - Field50 = reader.Read(); - Field54 = reader.Read(); - Field58 = reader.Read(); + Field48 = reader.ReadSingle(); + Field4C = reader.ReadInt32(); + Field50 = reader.ReadInt32(); + Field54 = reader.ReadInt32(); + Field58 = reader.ReadInt32(); } public void Write(BinaryObjectWriter writer) @@ -54,24 +54,24 @@ public void Write(BinaryObjectWriter writer) writer.WriteObject(TextureDatas[i]); } - writer.Write(TextureDatas.Capacity); - writer.Write(TextureAddresMode); + writer.WriteInt32(TextureDatas.Capacity); + writer.WriteInt32(TextureAddresMode); - writer.Write(Field2C); - writer.Write(Field30); - writer.Write(Field34); - writer.Write(Field38); + writer.WriteInt32(Field2C); + writer.WriteSingle(Field30); + writer.WriteInt32(Field34); + writer.WriteInt32(Field38); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, ShaderName); writer.Skip(writer.GetOffsetSize()); // VertexShaderDataOffset writer.Skip(writer.GetOffsetSize()); // PixelShaderDataOffset - writer.Write(Field48); - writer.Write(Field4C); - writer.Write(Field50); - writer.Write(Field54); - writer.Write(Field58); + writer.WriteSingle(Field48); + writer.WriteInt32(Field4C); + writer.WriteInt32(Field50); + writer.WriteInt32(Field54); + writer.WriteInt32(Field58); } public struct TextureData : IBinarySerializable @@ -85,20 +85,20 @@ public void Read(BinaryObjectReader reader) { Name = reader.ReadStringOffset(); - Field04 = reader.Read(); + Field04 = reader.ReadSingle(); - Field08 = reader.Read(); - Field0C = reader.Read(); + Field08 = reader.ReadInt32(); + Field0C = reader.ReadInt32(); } public readonly void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(Field04); + writer.WriteSingle(Field04); - writer.Write(Field08); - writer.Write(Field0C); + writer.WriteInt32(Field08); + writer.WriteInt32(Field0C); } } } diff --git a/Source/SharpNeedle/Framework/Glitter/ParticleParameter.cs b/Source/SharpNeedle/Framework/Glitter/ParticleParameter.cs index 7ad91f7..8fdf55f 100644 --- a/Source/SharpNeedle/Framework/Glitter/ParticleParameter.cs +++ b/Source/SharpNeedle/Framework/Glitter/ParticleParameter.cs @@ -95,103 +95,103 @@ public void Read(BinaryObjectReader reader, EmitterParameter parent) { Name = reader.ReadStringOffset(); - ParticleType = reader.Read(); + ParticleType = (EParticleType)reader.ReadInt32(); - LifeTime = reader.Read(); + LifeTime = reader.ReadSingle(); - ZOffset = reader.Read(); + ZOffset = reader.ReadInt32(); - DirectionType = reader.Read(); + DirectionType = (EDirectionType)reader.ReadInt32(); - Field14 = reader.Read(); + Field14 = reader.ReadSingle(); - InitialSpeed = reader.Read(); - InitialSpeedRandomMargin = reader.Read(); - Deceleration = reader.Read(); - DecelerationRandomMargin = reader.Read(); - FollowEmitterTranslationRatio = reader.Read(); - FollowEmitterTranslationYRatio = reader.Read(); + InitialSpeed = reader.ReadSingle(); + InitialSpeedRandomMargin = reader.ReadSingle(); + Deceleration = reader.ReadSingle(); + DecelerationRandomMargin = reader.ReadSingle(); + FollowEmitterTranslationRatio = reader.ReadSingle(); + FollowEmitterTranslationYRatio = reader.ReadSingle(); - BaseColor = reader.Read().AsColor(); - MultiPurposeColor = reader.Read().AsColor(); + BaseColor = reader.ReadVector4().AsColor(); + MultiPurposeColor = reader.ReadVector4().AsColor(); long colorTableOffset = reader.ReadOffsetValue(); if (colorTableOffset != 0) { - ColorTables.AddRange(reader.ReadArrayAtOffset>(colorTableOffset, reader.Read())); + ColorTables.AddRange(reader.ReadObjectArrayAtOffset>(colorTableOffset, reader.ReadInt32())); } long colorTable2Offset = reader.ReadOffsetValue(); if (colorTable2Offset != 0) { - ColorTable2s.AddRange(reader.ReadArrayAtOffset>(colorTable2Offset, reader.Read())); + ColorTable2s.AddRange(reader.ReadObjectArrayAtOffset>(colorTable2Offset, reader.ReadInt32())); } reader.Align(16); - InitialSize = reader.Read(); + InitialSize = reader.ReadVector3(); reader.Align(16); - InitialSizeRandomMargin = reader.Read(); + InitialSizeRandomMargin = reader.ReadVector3(); reader.Align(16); - InitialRotation = reader.Read().ToDegrees(); + InitialRotation = reader.ReadVector3().ToDegrees(); reader.Align(16); - InitialRotationRandomMargin = reader.Read().ToDegrees(); + InitialRotationRandomMargin = reader.ReadVector3().ToDegrees(); reader.Align(16); - Rotation = reader.Read().ToDegrees(); + Rotation = reader.ReadVector3().ToDegrees(); reader.Align(16); - RotationRandomMargin = reader.Read().ToDegrees(); + RotationRandomMargin = reader.ReadVector3().ToDegrees(); reader.Align(16); - InitialDirection = reader.Read(); + InitialDirection = reader.ReadVector3(); reader.Align(16); - InitialDirectionRandomMargin = reader.Read(); + InitialDirectionRandomMargin = reader.ReadVector3(); reader.Align(16); - GravitionalAcceleration = reader.Read(); + GravitionalAcceleration = reader.ReadVector3(); reader.Align(16); - ExternalAcceleration = reader.Read(); + ExternalAcceleration = reader.ReadVector3(); reader.Align(16); - ExternalAccelerationRandomMargin = reader.Read(); + ExternalAccelerationRandomMargin = reader.ReadVector3(); reader.Align(16); - EmitterTranslationEffectRatio = reader.Read(); - - LocusInterval = reader.Read(); - - Field118 = reader.Read(); - Field11C = reader.Read(); - Field120 = reader.Read(); - Field124 = reader.Read(); - Field128 = reader.Read(); - Field12C = reader.Read(); - Field130 = reader.Read(); - Field134 = reader.Read(); - Field138 = reader.Read(); - Field13C = reader.Read(); - - TextureIndexType = reader.Read(); - TextureIndex = reader.Read(); - TextureIndexRangeStart = reader.Read(); - TextureIndexRangeEnd = reader.Read(); - - Field150 = reader.Read(); - Field154 = reader.Read(); - Field158 = reader.Read(); - Field15C = reader.Read(); - Field160 = reader.Read(); - Field164 = reader.Read(); - Field168 = reader.Read(); - Field16C = reader.Read(); - Field170 = reader.Read(); - Field174 = reader.Read(); - Field178 = reader.Read(); - Field17C = reader.Read(); - Field180 = reader.Read(); - Field184 = reader.Read(); - Field188 = reader.Read(); - Field18C = reader.Read(); - Field190 = reader.Read(); - Field194 = reader.Read(); - Field198 = reader.Read(); - Field19C = reader.Read(); - Field1A0 = reader.Read(); + EmitterTranslationEffectRatio = reader.ReadSingle(); + + LocusInterval = reader.ReadSingle(); + + Field118 = reader.ReadInt32(); + Field11C = reader.ReadInt32(); + Field120 = reader.ReadInt32(); + Field124 = reader.ReadInt32(); + Field128 = reader.ReadInt32(); + Field12C = reader.ReadInt32(); + Field130 = reader.ReadInt32(); + Field134 = reader.ReadInt32(); + Field138 = reader.ReadInt32(); + Field13C = reader.ReadInt32(); + + TextureIndexType = (ETextureIndexType)reader.ReadInt32(); + TextureIndex = reader.ReadInt32(); + TextureIndexRangeStart = reader.ReadInt32(); + TextureIndexRangeEnd = reader.ReadInt32(); + + Field150 = reader.ReadInt32(); + Field154 = reader.ReadInt32(); + Field158 = reader.ReadInt32(); + Field15C = reader.ReadInt32(); + Field160 = reader.ReadInt32(); + Field164 = reader.ReadSingle(); + Field168 = reader.ReadInt32(); + Field16C = reader.ReadInt32(); + Field170 = reader.ReadInt32(); + Field174 = reader.ReadInt32(); + Field178 = reader.ReadInt32(); + Field17C = reader.ReadInt32(); + Field180 = reader.ReadInt32(); + Field184 = reader.ReadInt32(); + Field188 = reader.ReadInt32(); + Field18C = reader.ReadInt32(); + Field190 = reader.ReadInt32(); + Field194 = reader.ReadInt32(); + Field198 = reader.ReadInt32(); + Field19C = reader.ReadInt32(); + Field1A0 = reader.ReadInt32(); long materialOffset = reader.ReadOffsetValue(); if (materialOffset != 0) @@ -199,11 +199,11 @@ public void Read(BinaryObjectReader reader, EmitterParameter parent) Material = reader.ReadObjectAtOffset(materialOffset); } - BlendMode = reader.Read(); - CompositeMode = reader.Read(); - SecondaryBlendMode = reader.Read(); - SecondaryBlend = reader.Read(); - TextureAddressMode = reader.Read(); + BlendMode = (EBlendMode)reader.ReadInt32(); + CompositeMode = (ECompositeMode)reader.ReadInt32(); + SecondaryBlendMode = (ESecondaryBlendMode)reader.ReadInt32(); + SecondaryBlend = reader.ReadInt32(); + TextureAddressMode = (ETextureAddressMode)reader.ReadInt32(); Field1BC = (int)reader.ReadOffsetValue(); if (ParticleType == EParticleType.Mesh && Field1BC != 0) @@ -211,20 +211,20 @@ public void Read(BinaryObjectReader reader, EmitterParameter parent) Mesh = reader.ReadObjectAtOffset(Field1BC); } - Field1C0 = reader.Read(); - Field1C4 = reader.Read(); - Field1C8 = reader.Read(); - Field1CC = reader.Read(); - Field1D0 = reader.Read(); - Field1D4 = reader.Read(); - Field1D8 = reader.Read(); - Field1DC = reader.Read(); - Field1E0 = reader.Read(); - Field1E4 = reader.Read(); - Field1E8 = reader.Read(); - Field1EC = reader.Read(); - - Flags = reader.Read(); + Field1C0 = reader.ReadInt32(); + Field1C4 = reader.ReadInt32(); + Field1C8 = reader.ReadInt32(); + Field1CC = reader.ReadSingle(); + Field1D0 = reader.ReadSingle(); + Field1D4 = reader.ReadInt32(); + Field1D8 = reader.ReadSingle(); + Field1DC = reader.ReadInt32(); + Field1E0 = reader.ReadInt32(); + Field1E4 = reader.ReadInt32(); + Field1E8 = reader.ReadInt32(); + Field1EC = reader.ReadInt32(); + + Flags = reader.ReadInt32(); for (int i = 0; i < Animations.Capacity; i++) { @@ -248,109 +248,97 @@ public void Write(BinaryObjectWriter writer, EmitterParameter parent) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(ParticleType); + writer.WriteInt32((int)ParticleType); - writer.Write(LifeTime); + writer.WriteSingle(LifeTime); - writer.Write(ZOffset); + writer.WriteSingle(ZOffset); - writer.Write(DirectionType); + writer.WriteInt32((int)DirectionType); - writer.Write(Field14); + writer.WriteSingle(Field14); - writer.Write(InitialSpeed); - writer.Write(InitialSpeedRandomMargin); - writer.Write(Deceleration); - writer.Write(DecelerationRandomMargin); - writer.Write(FollowEmitterTranslationRatio); - writer.Write(FollowEmitterTranslationYRatio); + writer.WriteSingle(InitialSpeed); + writer.WriteSingle(InitialSpeedRandomMargin); + writer.WriteSingle(Deceleration); + writer.WriteSingle(DecelerationRandomMargin); + writer.WriteSingle(FollowEmitterTranslationRatio); + writer.WriteSingle(FollowEmitterTranslationYRatio); - writer.Write(BaseColor); - writer.Write(MultiPurposeColor); + writer.WriteObject(BaseColor); + writer.WriteObject(MultiPurposeColor); - writer.WriteOffset(() => - { - foreach (Color colorTable in ColorTables) - { - writer.Write(colorTable); - } - }); - writer.Write(ColorTables.Count); + writer.WriteObjectCollectionOffset(ColorTables); + writer.WriteSingle(ColorTables.Count); - writer.WriteOffset(() => - { - foreach (Color colorTable2 in ColorTable2s) - { - writer.Write(colorTable2); - } - }); - writer.Write(ColorTable2s.Count); + writer.WriteObjectCollectionOffset(ColorTable2s); + writer.WriteSingle(ColorTable2s.Count); writer.Align(16); - writer.Write(InitialSize); + writer.WriteVector3(InitialSize); writer.Align(16); - writer.Write(InitialSizeRandomMargin); + writer.WriteVector3(InitialSizeRandomMargin); writer.Align(16); - writer.Write(InitialRotation.ToRadians()); + writer.WriteVector3(InitialRotation.ToRadians()); writer.Align(16); - writer.Write(InitialRotationRandomMargin.ToRadians()); + writer.WriteVector3(InitialRotationRandomMargin.ToRadians()); writer.Align(16); - writer.Write(Rotation.ToRadians()); + writer.WriteVector3(Rotation.ToRadians()); writer.Align(16); - writer.Write(RotationRandomMargin.ToRadians()); + writer.WriteVector3(RotationRandomMargin.ToRadians()); writer.Align(16); - writer.Write(InitialDirection); + writer.WriteVector3(InitialDirection); writer.Align(16); - writer.Write(InitialDirectionRandomMargin); + writer.WriteVector3(InitialDirectionRandomMargin); writer.Align(16); - writer.Write(GravitionalAcceleration); + writer.WriteVector3(GravitionalAcceleration); writer.Align(16); - writer.Write(ExternalAcceleration); + writer.WriteVector3(ExternalAcceleration); writer.Align(16); - writer.Write(ExternalAccelerationRandomMargin); + writer.WriteVector3(ExternalAccelerationRandomMargin); writer.Align(16); - writer.Write(EmitterTranslationEffectRatio); - - writer.Write(LocusInterval); - - writer.Write(Field118); - writer.Write(Field11C); - writer.Write(Field120); - writer.Write(Field124); - writer.Write(Field128); - writer.Write(Field12C); - writer.Write(Field130); - writer.Write(Field134); - writer.Write(Field138); - writer.Write(Field13C); - - writer.Write(TextureIndexType); - writer.Write(TextureIndex); - writer.Write(TextureIndexRangeStart); - writer.Write(TextureIndexRangeEnd); - - writer.Write(Field150); - writer.Write(Field154); - writer.Write(Field158); - writer.Write(Field15C); - writer.Write(Field160); - writer.Write(Field164); - writer.Write(Field168); - writer.Write(Field16C); - writer.Write(Field170); - writer.Write(Field174); - writer.Write(Field178); - writer.Write(Field17C); - writer.Write(Field180); - writer.Write(Field184); - writer.Write(Field188); - writer.Write(Field18C); - writer.Write(Field190); - writer.Write(Field194); - writer.Write(Field198); - writer.Write(Field19C); - writer.Write(Field1A0); + writer.WriteSingle(EmitterTranslationEffectRatio); + + writer.WriteSingle(LocusInterval); + + writer.WriteSingle(Field118); + writer.WriteSingle(Field11C); + writer.WriteSingle(Field120); + writer.WriteSingle(Field124); + writer.WriteSingle(Field128); + writer.WriteSingle(Field12C); + writer.WriteSingle(Field130); + writer.WriteSingle(Field134); + writer.WriteSingle(Field138); + writer.WriteSingle(Field13C); + + writer.WriteInt32((int)TextureIndexType); + writer.WriteSingle(TextureIndex); + writer.WriteSingle(TextureIndexRangeStart); + writer.WriteSingle(TextureIndexRangeEnd); + + writer.WriteSingle(Field150); + writer.WriteSingle(Field154); + writer.WriteSingle(Field158); + writer.WriteSingle(Field15C); + writer.WriteSingle(Field160); + writer.WriteSingle(Field164); + writer.WriteSingle(Field168); + writer.WriteSingle(Field16C); + writer.WriteSingle(Field170); + writer.WriteSingle(Field174); + writer.WriteSingle(Field178); + writer.WriteSingle(Field17C); + writer.WriteSingle(Field180); + writer.WriteSingle(Field184); + writer.WriteSingle(Field188); + writer.WriteSingle(Field18C); + writer.WriteSingle(Field190); + writer.WriteSingle(Field194); + writer.WriteSingle(Field198); + writer.WriteSingle(Field19C); + writer.WriteSingle(Field1A0); if (Material != null) { @@ -361,11 +349,11 @@ public void Write(BinaryObjectWriter writer, EmitterParameter parent) writer.WriteOffsetValue(0); } - writer.Write(BlendMode); - writer.Write(CompositeMode); - writer.Write(SecondaryBlendMode); - writer.Write(SecondaryBlend); - writer.Write(TextureAddressMode); + writer.WriteInt32((int)BlendMode); + writer.WriteInt32((int)CompositeMode); + writer.WriteInt32((int)SecondaryBlendMode); + writer.WriteSingle(SecondaryBlend); + writer.WriteInt32((int)TextureAddressMode); if (ParticleType == EParticleType.Mesh && Mesh != null) { @@ -376,20 +364,20 @@ public void Write(BinaryObjectWriter writer, EmitterParameter parent) writer.WriteOffsetValue(Field1BC); } - writer.Write(Field1C0); - writer.Write(Field1C4); - writer.Write(Field1C8); - writer.Write(Field1CC); - writer.Write(Field1D0); - writer.Write(Field1D4); - writer.Write(Field1D8); - writer.Write(Field1DC); - writer.Write(Field1E0); - writer.Write(Field1E4); - writer.Write(Field1E8); - writer.Write(Field1EC); - - writer.Write(Flags); + writer.WriteSingle(Field1C0); + writer.WriteSingle(Field1C4); + writer.WriteSingle(Field1C8); + writer.WriteSingle(Field1CC); + writer.WriteSingle(Field1D0); + writer.WriteSingle(Field1D4); + writer.WriteSingle(Field1D8); + writer.WriteSingle(Field1DC); + writer.WriteSingle(Field1E0); + writer.WriteSingle(Field1E4); + writer.WriteSingle(Field1E8); + writer.WriteSingle(Field1EC); + + writer.WriteSingle(Flags); foreach (AnimationParameter animation in Animations) { diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Archive.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Archive.cs index c918683..0316884 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Archive.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Archive.cs @@ -91,16 +91,16 @@ public override void Read(IFile file) BaseStream = file.Open(); BinaryValueReader reader = new(file.Open(), StreamOwnership.Retain, Endianness.Little); reader.Skip(0xC); - DataAlignment = reader.Read(); + DataAlignment = reader.ReadInt32(); while (reader.Position < reader.Length) { long baseOffset = reader.Position; - int dataEnd = reader.Read(); - uint dataLength = reader.Read(); - int dataStart = reader.Read(); - long lastModifiedBinary = reader.Read(); + int dataEnd = reader.ReadInt32(); + uint dataLength = reader.ReadUInt32(); + int dataStart = reader.ReadInt32(); + long lastModifiedBinary = reader.ReadInt64(); DateTime lastModified = lastModifiedBinary != 0 ? new DateTime(lastModifiedBinary) : DateTime.Now; string name = reader.ReadString(StringBinaryFormat.NullTerminated); @@ -120,10 +120,10 @@ public override void Write(IFile file) using Stream stream = file.Open(FileAccess.Write); BinaryObjectWriter writer = new(stream, StreamOwnership.Transfer, Endianness.Little, Encoding.ASCII); - writer.Write(0u); - writer.Write(0x10u); - writer.Write(0x14u); - writer.Write(DataAlignment); + writer.WriteUInt32(0u); + writer.WriteUInt32(0x10u); + writer.WriteUInt32(0x14u); + writer.WriteInt32(DataAlignment); foreach (IFile arFile in this) { @@ -131,10 +131,10 @@ public override void Write(IFile file) long dataOffset = AlignmentHelper.Align(curPos + 21 + Encoding.UTF8.GetByteCount(arFile.Name), DataAlignment); long blockSize = dataOffset + arFile.Length; - writer.Write((uint)(blockSize - curPos)); - writer.Write((uint)arFile.Length); - writer.Write((uint)(dataOffset - curPos)); - writer.Write(arFile.LastModified.Ticks); + writer.WriteUInt32((uint)(blockSize - curPos)); + writer.WriteUInt32((uint)arFile.Length); + writer.WriteUInt32((uint)(dataOffset - curPos)); + writer.WriteInt64(arFile.LastModified.Ticks); writer.WriteString(StringBinaryFormat.NullTerminated, arFile.Name); writer.Align(DataAlignment); arFile.Open().CopyTo(writer.GetBaseStream()); diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/ArchiveList.cs b/Source/SharpNeedle/Framework/HedgehogEngine/ArchiveList.cs index 52e8c55..aaceccd 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/ArchiveList.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/ArchiveList.cs @@ -104,13 +104,13 @@ public override void Write(IFile file) Name = file.Name; using BinaryValueWriter writer = new(file.Open(FileAccess.Write), StreamOwnership.Transfer, Endianness.Little); - writer.Write(Signature); + writer.WriteUInt32(Signature); if (Archives == null) { - writer.Write(ArchiveSizes.Count); + writer.WriteInt32(ArchiveSizes.Count); foreach (uint size in ArchiveSizes) { - writer.Write(size); + writer.WriteUInt32(size); } foreach (string name in Files) @@ -120,10 +120,10 @@ public override void Write(IFile file) } else { - writer.Write(Archives.Count); + writer.WriteInt32(Archives.Count); foreach (Archive archive in Archives) { - writer.Write((uint)archive.CalculateFileSize()); + writer.WriteUInt32((uint)archive.CalculateFileSize()); } foreach (IFile aFile in this) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletMesh.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletMesh.cs index b260b98..fe4d723 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletMesh.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletMesh.cs @@ -2,6 +2,7 @@ using Amicitia.IO.Binary; using SharpNeedle.Framework.BINA; +using SharpNeedle.Utilities; [NeedleResource("hh/btmesh", ResourceType.Model, @"\.btmesh$")] public class BulletMesh : BinaryResource @@ -28,16 +29,10 @@ public override void Read(BinaryObjectReader reader) } BulletMeshVersion = version; - long shapesOffset = reader.ReadOffsetValue(); - Shapes = new BulletShape[reader.ReadInt32()]; - reader.ReadAtOffset(shapesOffset, () => - { - for (int i = 0; i < Shapes.Length; i++) - { - Shapes[i] = reader.ReadObject(BulletMeshVersion); - } - }); + long shapesOffset = reader.ReadOffsetValue(); + int shapesCount = reader.ReadInt32(); + Shapes = reader.ReadObjectArrayAtOffset(BulletMeshVersion, shapesOffset, shapesCount); int primitiveCount = reader.ReadInt32(); Primitives = reader.ReadObjectArrayOffset(primitiveCount); @@ -54,13 +49,7 @@ public override void Write(BinaryObjectWriter writer) } else { - writer.WriteOffset(() => - { - foreach (BulletShape shape in Shapes) - { - writer.WriteObject(shape, BulletMeshVersion); - } - }); + writer.WriteObjectCollectionOffset(BulletMeshVersion, Shapes); } writer.WriteInt32(Shapes.Length); diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletPrimitive.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletPrimitive.cs index 1e76e76..1d59c40 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletPrimitive.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletPrimitive.cs @@ -26,9 +26,9 @@ public void Read(BinaryObjectReader reader) SurfaceType = (byte)(typeFlag >> 24); SurfaceFlags = typeFlag & 0xFFFFFF; - Position = reader.Read(); - Rotation = reader.Read(); - Dimensions = reader.Read(); + Position = reader.ReadVector3(); + Rotation = reader.ReadQuaternion(); + Dimensions = reader.ReadVector3(); } public void Write(BinaryObjectWriter writer) @@ -36,9 +36,12 @@ public void Write(BinaryObjectWriter writer) writer.WriteByte((byte)ShapeType); writer.WriteByte(SurfaceLayer); writer.Align(4); - writer.WriteUInt32(SurfaceFlags); - writer.Write(Position); - writer.Write(Rotation); - writer.Write(Dimensions); + + uint typeFlag = (SurfaceFlags & 0xFFFFFF) | ((uint)SurfaceType << 24); + writer.WriteUInt32(typeFlag); + + writer.WriteVector3(Position); + writer.WriteQuaternion(Rotation); + writer.WriteVector3(Dimensions); } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletShape.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletShape.cs index bab6237..c7caf74 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletShape.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Bullet/BulletShape.cs @@ -48,7 +48,7 @@ public void Read(BinaryObjectReader reader, int version) Unknown2 = reader.ReadUInt32(); } - Vertices = reader.ReadArrayOffset((int)vertexCount); + reader.ReadOffset(() => Vertices = reader.ReadVector3Array((int)vertexCount)); if (IsConvex) { @@ -125,7 +125,7 @@ public void Write(BinaryObjectWriter writer, int version) writer.WriteUInt32(Unknown2); } - writer.WriteArrayOffset(Vertices, 0x10); + writer.WriteOffset(() => writer.WriteVector3Array(Vertices), 0x10); if (IsConvex) { @@ -167,38 +167,4 @@ public void Write(BinaryObjectWriter writer, int version) }, 0x10); } } - - public unsafe void GenerateBVH() - { - if (Faces == null || Faces.Length == 0 || Vertices.Length == 0) - { - BVH = []; - return; - } - - Vector3 aabbMin = new(float.PositiveInfinity); - Vector3 aabbMax = new(float.NegativeInfinity); - - foreach (Vector3 vertex in Vertices) - { - aabbMin = Vector3.Min(vertex, aabbMin); - aabbMax = Vector3.Max(vertex, aabbMax); - } - - BulletSharp.TriangleIndexVertexArray vertexArray = new( - (int[])(object)Faces, - Vertices - ); - - BulletSharp.OptimizedBvh bvhBuider = new(); - bvhBuider.Build(vertexArray, true, aabbMin, aabbMax); - - uint size = bvhBuider.CalculateSerializeBufferSize(); - BVH = new byte[size]; - - fixed (byte* bvh = BVH) - { - bvhBuider.SerializeInPlace((nint)bvh, (uint)BVH.Length, false); - } - } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/MetaInstancer.cs b/Source/SharpNeedle/Framework/HedgehogEngine/MetaInstancer.cs index 0f26607..0abad6f 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/MetaInstancer.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/MetaInstancer.cs @@ -33,10 +33,10 @@ public override void Write(IFile file) public void Read(BinaryObjectReader reader) { reader.EnsureSignatureNative(Signature); - FormatVersion = reader.Read(); + FormatVersion = reader.ReadUInt32(); - int instanceCount = reader.Read(); - int instanceSize = reader.Read(); + int instanceCount = reader.ReadInt32(); + int instanceSize = reader.ReadInt32(); if (instanceSize != InstanceSize) { @@ -51,14 +51,14 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { writer.WriteNative(Signature); - writer.Write(FormatVersion); + writer.WriteUInt32(FormatVersion); - writer.Write(Instances.Count); - writer.Write(InstanceSize); + writer.WriteInt32(Instances.Count); + writer.WriteUInt32(InstanceSize); writer.Skip(12); - writer.Write(HeaderSize); + writer.WriteUInt32(HeaderSize); writer.WriteObjectCollection(Instances); } @@ -78,36 +78,36 @@ public class Instance : IBinarySerializable public void Read(BinaryObjectReader reader) { - Position = reader.Read(); - Type = reader.Read(); - Sway = reader.Read(); + Position = reader.ReadVector3(); + Type = reader.ReadByte(); + Sway = reader.ReadByte(); - PitchAfterSway = reader.Read(); - YawAfterSway = reader.Read(); + PitchAfterSway = reader.ReadByte(); + YawAfterSway = reader.ReadByte(); - PitchBeforeSway = reader.Read(); - YawBeforeSway = reader.Read(); + PitchBeforeSway = reader.ReadInt16(); + YawBeforeSway = reader.ReadInt16(); - byte colorA = reader.Read(); - Color = new Color(reader.Read(), reader.Read(), reader.Read(), colorA); + byte colorA = reader.ReadByte(); + Color = new Color(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), colorA); } public void Write(BinaryObjectWriter writer) { - writer.Write(Position); - writer.Write(Type); - writer.Write(Sway); + writer.WriteVector3(Position); + writer.WriteByte(Type); + writer.WriteByte(Sway); - writer.Write(PitchAfterSway); - writer.Write(YawAfterSway); + writer.WriteByte(PitchAfterSway); + writer.WriteByte(YawAfterSway); - writer.Write(PitchBeforeSway); - writer.Write(YawBeforeSway); + writer.WriteInt32(PitchBeforeSway); + writer.WriteInt32(YawBeforeSway); - writer.Write(Color.A); - writer.Write(Color.R); - writer.Write(Color.G); - writer.Write(Color.B); + writer.WriteInt32(Color.A); + writer.WriteInt32(Color.R); + writer.WriteInt32(Color.G); + writer.WriteInt32(Color.B); } } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ArchiveInfo.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ArchiveInfo.cs index d3fc425..ff7a87c 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ArchiveInfo.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ArchiveInfo.cs @@ -12,28 +12,28 @@ public ArchiveInfo() public override void Read(BinaryObjectReader reader) { - int entryCount = reader.Read(); + int entryCount = reader.ReadInt32(); Entries.AddRange(reader.ReadObjectArrayOffset(entryCount)); reader.ReadOffset(() => { for (int i = 0; i < entryCount; i++) { - Entries[i].Field04 = reader.Read(); + Entries[i].Field04 = reader.ReadByte(); } }); } public override void Write(BinaryObjectWriter writer) { - writer.Write(Entries.Count); + writer.WriteInt32(Entries.Count); writer.WriteObjectCollectionOffset(Entries); writer.WriteOffset(() => { for (int i = 0; i < Entries.Count; i++) { - writer.Write(Entries[i].Field04); + writer.WriteByte(Entries[i].Field04); } writer.Align(4); diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/GITextureGroup.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/GITextureGroup.cs index 2830760..f1c7229 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/GITextureGroup.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/GITextureGroup.cs @@ -12,34 +12,23 @@ public class GITextureGroup : IBinarySerializable public void Read(BinaryObjectReader reader) { - Quality = reader.Read(); - reader.Read(out int indexCount); - Indices = new List(indexCount); - reader.ReadOffset(() => - { - for (int i = 0; i < indexCount; i++) - { - Indices.Add(reader.Read()); - } - }); + Quality = (GIQualityLevel)reader.ReadInt32(); - Bounds = reader.ReadValueOffset(); - MemorySize = reader.Read(); + int indexCount = reader.ReadInt32(); + Indices = new List(indexCount); + reader.ReadOffset(() => reader.ReadCollection(indexCount, Indices)); + + Bounds = reader.ReadObjectOffset(); + MemorySize = reader.ReadUInt32(); } public void Write(BinaryObjectWriter writer) { - writer.Write(Quality); - writer.Write(Indices.Count); - writer.WriteOffset(() => - { - foreach (int index in Indices) - { - writer.Write(index); - } - }); - writer.WriteValueOffset(Bounds); - writer.Write(MemorySize); + writer.WriteInt32((int)Quality); + writer.WriteInt32(Indices.Count); + writer.WriteCollectionOffset(Indices); + writer.WriteObjectOffset(Bounds); + writer.WriteUInt32(MemorySize); } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/GITextureGroupInfo.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/GITextureGroupInfo.cs index 57d0fa5..d5ffbd9 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/GITextureGroupInfo.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/GITextureGroupInfo.cs @@ -16,7 +16,7 @@ public GITextureGroupInfo() public override void Read(BinaryObjectReader reader) { - reader.Read(out int instanceCount); + int instanceCount = reader.ReadInt32(); Instances = new(instanceCount); reader.ReadOffset(() => { @@ -31,11 +31,11 @@ public override void Read(BinaryObjectReader reader) Span<(string? Name, Sphere Bounds)> span = CollectionsMarshal.AsSpan(Instances); for (int i = 0; i < span.Length; i++) { - span[i].Bounds = reader.ReadValueOffset(); + span[i].Bounds = reader.ReadObjectOffset(); } }); - reader.Read(out int groupCount); + int groupCount = reader.ReadInt32(); Groups = new(groupCount); reader.ReadOffset(() => @@ -46,20 +46,15 @@ public override void Read(BinaryObjectReader reader) } }); - reader.Read(out int lowCount); + int lowCount = reader.ReadInt32(); LowQualityGroups = new(lowCount); - reader.ReadOffset(() => - { - for (int i = 0; i < lowCount; i++) - { - LowQualityGroups.Add(reader.Read()); - } - }); + + reader.ReadOffset(() => reader.ReadCollection(lowCount, LowQualityGroups)); } public override void Write(BinaryObjectWriter writer) { - writer.Write(Instances.Count); + writer.WriteInt32(Instances.Count); writer.WriteOffset(() => { foreach ((string? name, Sphere bounds) in Instances) @@ -72,26 +67,14 @@ public override void Write(BinaryObjectWriter writer) { foreach ((string? name, Sphere bounds) in Instances) { - writer.WriteValueOffset(bounds); + writer.WriteObjectOffset(bounds); } }); - writer.Write(Groups.Count); - writer.WriteOffset(() => - { - foreach (GITextureGroup group in Groups) - { - writer.WriteObjectOffset(group); - } - }); + writer.WriteInt32(Groups.Count); + writer.WriteObjectCollectionOffset(Groups); - writer.Write(LowQualityGroups.Count); - writer.WriteOffset(() => - { - foreach (int group in LowQualityGroups) - { - writer.Write(group); - } - }); + writer.WriteInt32(LowQualityGroups.Count); + writer.WriteCollectionOffset(LowQualityGroups); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/Light.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/Light.cs index 97bda57..4335864 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/Light.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/Light.cs @@ -20,24 +20,22 @@ public Light() public override void Read(BinaryObjectReader reader) { - Type = reader.Read(); - Position = reader.Read(); - Color = reader.Read(); + Type = (LightType)reader.ReadInt32(); + Position = reader.ReadVector3(); + Color = reader.ReadVector3(); - if (Type != LightType.Point) + if (Type == LightType.Point) { - return; + Attribute = reader.ReadInt32(); + Range = reader.ReadVector4(); } - - Attribute = reader.Read(); - Range = reader.Read(); } public override void Write(BinaryObjectWriter writer) { - writer.Write(Type); - writer.Write(Position); - writer.Write(Color); + writer.WriteInt32((int)Type); + writer.WriteVector3(Position); + writer.WriteVector3(Color); if (DataVersion == 0) { @@ -48,8 +46,8 @@ public override void Write(BinaryObjectWriter writer) { case LightType.Point: { - writer.Write(Attribute); - writer.Write(Range); + writer.WriteInt32(Attribute); + writer.WriteVector4(Range); break; } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightFieldTree.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightFieldTree.cs index f8fb9c1..fbe41b9 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightFieldTree.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightFieldTree.cs @@ -18,24 +18,24 @@ public LightFieldTree() public override void Read(BinaryObjectReader reader) { - Bounds = reader.Read(); + Bounds = reader.ReadObject(); - Cells.AddRange(reader.ReadObjectArrayOffset(reader.Read())); - Probes.AddRange(reader.ReadObjectArrayOffset(DataVersion, reader.Read())); - Indices.AddRange(reader.ReadArrayOffset(reader.Read())); + Cells.AddRange(reader.ReadObjectArrayOffset(reader.ReadInt32())); + Probes.AddRange(reader.ReadObjectArrayOffset(DataVersion, reader.ReadInt32())); + Indices.AddRange(reader.ReadArrayOffset(reader.ReadInt32())); } public override void Write(BinaryObjectWriter writer) { - writer.Write(Bounds); + writer.WriteObject(Bounds); - writer.Write(Cells.Count); + writer.WriteInt32(Cells.Count); writer.WriteObjectCollectionOffset(Cells); - writer.Write(Probes.Count); + writer.WriteInt32(Probes.Count); writer.WriteObjectCollectionOffset(DataVersion, Probes); - writer.Write(Indices.Count); + writer.WriteInt32(Indices.Count); writer.WriteCollectionOffset(Indices); } } @@ -47,14 +47,14 @@ public class LightFieldCell : IBinarySerializable public void Read(BinaryObjectReader reader) { - Type = (CellType)reader.Read(); - Index = reader.Read(); + Type = (CellType)reader.ReadInt32(); + Index = reader.ReadUInt32(); } public void Write(BinaryObjectWriter writer) { - writer.Write((int)Type); - writer.Write(Index); + writer.WriteInt32((int)Type); + writer.WriteUInt32(Index); } public enum CellType : int @@ -73,14 +73,14 @@ public class LightFieldProbe : IBinarySerializable public void Read(BinaryObjectReader reader, uint version) { - for(int i=0; i<8; i++) + for (int i = 0; i < 8; i++) { - Colors[i] = new Color(reader.Read(), reader.Read(), reader.Read(), 255); + Colors[i] = new Color(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), 255); } - if(version >= 1) + if (version >= 1) { - Shadow = reader.Read(); + Shadow = reader.ReadByte(); } } @@ -88,14 +88,14 @@ public void Write(BinaryObjectWriter writer, uint version) { for (int i = 0; i < 8; i++) { - writer.Write(Colors[i].R); - writer.Write(Colors[i].G); - writer.Write(Colors[i].B); + writer.WriteByte(Colors[i].R); + writer.WriteByte(Colors[i].G); + writer.WriteByte(Colors[i].B); } - if(version >= 1) + if (version >= 1) { - writer.Write(Shadow); + writer.WriteByte(Shadow); } } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexData.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexData.cs index 79d3f34..acc2340 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexData.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexData.cs @@ -7,19 +7,19 @@ public class LightIndexData : IBinarySerializable public void Read(BinaryObjectReader reader) { - int lightsCount = reader.Read(); - reader.ReadOffset(() => LightIndices = reader.ReadArray(lightsCount)); + int lightsCount = reader.ReadInt32(); + LightIndices = reader.ReadArrayOffset(lightsCount); - int verticesCount = reader.Read(); - reader.ReadOffset(() => VertexIndices = reader.ReadArray(verticesCount)); + int verticesCount = reader.ReadInt32(); + VertexIndices = reader.ReadArrayOffset(verticesCount); } public void Write(BinaryObjectWriter writer) { - writer.Write(LightIndices.Length); + writer.WriteInt32(LightIndices.Length); writer.WriteArrayOffset(LightIndices); - writer.Write(VertexIndices.Length); + writer.WriteInt32(VertexIndices.Length); writer.WriteArrayOffset(VertexIndices); } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexMesh.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexMesh.cs index 080beb8..d803c28 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexMesh.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexMesh.cs @@ -8,8 +8,9 @@ public class LightIndexMesh : List, IBinarySerializable public void Read(BinaryObjectReader reader) { - int dataCount = reader.Read(); + int dataCount = reader.ReadInt32(); Capacity = dataCount; + reader.ReadOffset(() => { for (int i = 0; i < dataCount; i++) @@ -21,7 +22,7 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { - writer.Write(Count); + writer.WriteInt32(Count); writer.WriteOffset(() => { foreach (LightIndexData mesh in this) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexMeshGroup.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexMeshGroup.cs index 5dc9a51..edfe73b 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexMeshGroup.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightIndexMeshGroup.cs @@ -33,7 +33,7 @@ public void Write(BinaryObjectWriter writer) void WriteMeshes(IEnumerable meshes) { - writer.Write(meshes.Count()); + writer.WriteInt32(meshes.Count()); writer.WriteOffset(() => { foreach (LightIndexMesh mesh in meshes) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightList.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightList.cs index 1994ca5..ed0500e 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightList.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/LightData/LightList.cs @@ -6,7 +6,7 @@ public class LightList : SampleChunkResource public override void Read(BinaryObjectReader reader) { - int count = reader.Read(); + int count = reader.ReadInt32(); Lights = new(count); reader.ReadOffset(() => { @@ -20,7 +20,7 @@ public override void Read(BinaryObjectReader reader) public override void Write(BinaryObjectWriter writer) { int count = Lights.Count; - writer.Write(count); + writer.WriteInt32(count); writer.WriteOffset(() => { foreach (ResourceReference light in Lights) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Material.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Material.cs index c2298c7..3e35e84 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Material.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Material.cs @@ -53,15 +53,15 @@ public override void Read(BinaryObjectReader reader) texturesOffset = reader.ReadOffsetValue(); } - AlphaThreshold = reader.Read(); + AlphaThreshold = reader.ReadByte(); NoBackFaceCulling = reader.Read(); BlendMode = (MaterialBlendMode)reader.ReadByte(); reader.Skip(1); // Alignment padding - byte floatParamsCount = reader.Read(); - byte intParamsCount = reader.Read(); - byte boolParamsCount = reader.Read(); - byte textureCount = reader.Read(); // Reserved in version 1 + byte floatParamsCount = reader.ReadByte(); + byte intParamsCount = reader.ReadByte(); + byte boolParamsCount = reader.ReadByte(); + byte textureCount = reader.ReadByte(); // Reserved in version 1 long floatParamOffset = reader.ReadOffsetValue(); long intParamOffset = reader.ReadOffsetValue(); @@ -130,7 +130,7 @@ public override void Write(BinaryObjectWriter writer) if (DataVersion <= 1) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Texset.Name); - writer.Write(0); // Reserved + writer.WriteInt32(0); // Reserved } else if (DataVersion == 2) { @@ -149,15 +149,15 @@ public override void Write(BinaryObjectWriter writer) }); } - writer.Write(AlphaThreshold); + writer.WriteByte(AlphaThreshold); writer.Write(NoBackFaceCulling); - writer.Write(BlendMode); + writer.WriteByte((byte)BlendMode); writer.Align(4); - writer.Write((byte)FloatParameters.Count); - writer.Write((byte)IntParameters.Count); - writer.Write((byte)BoolParameters.Count); - writer.Write((byte)Texset.Textures.Count); + writer.WriteByte((byte)FloatParameters.Count); + writer.WriteByte((byte)IntParameters.Count); + writer.WriteByte((byte)BoolParameters.Count); + writer.WriteByte((byte)Texset.Textures.Count); WriteParameters(FloatParameters); WriteParameters(IntParameters); @@ -178,7 +178,7 @@ void WriteParameters(Dictionary> parameters) whe { if (parameters.Count == 0) { - writer.Write(0); + writer.WriteInt32(0); return; } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/MaterialParameter.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/MaterialParameter.cs index 576ca20..249e28b 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/MaterialParameter.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/MaterialParameter.cs @@ -1,4 +1,6 @@ namespace SharpNeedle.Framework.HedgehogEngine.Mirage.MaterialData; + +using SharpNeedle.Structs; using System.Collections.Generic; using System.Linq; using System.Text.Json.Serialization; @@ -39,50 +41,74 @@ public T Value public void Read(BinaryObjectReader reader) { reader.Skip(2); - byte valueCount = reader.Read(); + byte valueCount = reader.ReadByte(); reader.Skip(1); Name = reader.ReadStringOffsetOrEmpty(); if (valueCount != 0) { using SeekToken token = reader.ReadOffset(); - for (byte i = 0; i < valueCount; i++) + switch (Values) { - // Handle booleans - if (typeof(T) == typeof(bool)) - { - Unsafe.As>(Values)!.Add(reader.Read() != 0); - } - else - { - Values!.Add(reader.Read()); - } + case List booleanValues: + for (int i = 0; i < valueCount; i++) + { + booleanValues.Add(reader.ReadInt32() != 0); + } + break; + case List vector4Values: + for (int i = 0; i < valueCount; i++) + { + vector4Values.Add(reader.ReadVector4()); + } + break; + case List vector4IntValues: + for (int i = 0; i < valueCount; i++) + { + vector4IntValues.Add(reader.ReadObject()); + } + break; + + default: + throw new NotSupportedException($"Type {typeof(T)} is not a valid material parameter type!"); } } } public void Write(BinaryObjectWriter writer) { - writer.Write((byte)(typeof(T) == typeof(bool) ? 0 : 2)); - writer.Write((byte)0); - writer.Write((byte)Values.Count); - writer.Write((byte)0); + writer.WriteByte((byte)(typeof(T) == typeof(bool) ? 0 : 2)); + writer.WriteByte(0); + writer.WriteByte((byte)Values.Count); + writer.WriteByte(0); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - if (typeof(T) != typeof(bool)) - { - writer.WriteCollectionOffset(Values, 4); - } - else + writer.WriteOffset(() => { - List values = Unsafe.As>(Values); - writer.WriteOffset(() => + switch (Values) { - foreach (bool value in values!) - { - writer.Write(value ? 1 : 0); - } - }); - } + case List booleanValues: + foreach (bool value in booleanValues) + { + writer.WriteInt32(value ? 1 : 0); + } + break; + case List vector4Values: + foreach (Vector4 value in vector4Values) + { + writer.WriteVector4(value); + } + break; + case List vector4IntValues: + foreach (Vector4Int value in vector4IntValues) + { + writer.WriteObject(value); + } + break; + default: + throw new NotSupportedException($"Type {typeof(T)} is not a valid material parameter type!"); + } + + }); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Texset.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Texset.cs index 7a7effb..4757cb4 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Texset.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Texset.cs @@ -6,7 +6,7 @@ public class Texset : SampleChunkResource public override void Read(BinaryObjectReader reader) { - int textureCount = reader.Read(); + int textureCount = reader.ReadInt32(); reader.ReadOffset(() => { for (int i = 0; i < textureCount; i++) @@ -21,7 +21,7 @@ public override void Read(BinaryObjectReader reader) public override void Write(BinaryObjectWriter writer) { - writer.Write(Textures.Count); + writer.WriteInt32(Textures.Count); writer.WriteOffset(() => { foreach (Texture texture in Textures) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Texture.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Texture.cs index b2c65db..3e88099 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Texture.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/MaterialData/Texture.cs @@ -18,9 +18,9 @@ public Texture() public override void Read(BinaryObjectReader reader) { PictureName = reader.ReadStringOffset(); - TexCoordIndex = reader.Read(); - WrapModeU = reader.Read(); - WrapModeV = reader.Read(); + TexCoordIndex = reader.ReadByte(); + WrapModeU = (WrapMode)reader.ReadByte(); + WrapModeV = (WrapMode)reader.ReadByte(); reader.Skip(1); // Padding Type = reader.ReadStringOffset(); } @@ -28,9 +28,9 @@ public override void Read(BinaryObjectReader reader) public override void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, PictureName); - writer.Write(TexCoordIndex); - writer.Write(WrapModeU); - writer.Write(WrapModeV); + writer.WriteByte(TexCoordIndex); + writer.WriteByte((byte)WrapModeU); + writer.WriteByte((byte)WrapModeV); writer.Align(4); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Type); } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/Mesh.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/Mesh.cs index be86681..b54ab10 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/Mesh.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/Mesh.cs @@ -1,8 +1,9 @@ namespace SharpNeedle.Framework.HedgehogEngine.Mirage.ModelData; + using SharpNeedle.Framework.HedgehogEngine.Mirage.MaterialData; using SharpNeedle.Structs; -public class Mesh : IBinarySerializable, IDisposable, ICloneable +public class Mesh : IBinarySerializable, IDisposable, ICloneable { public ResourceReference Material { get; set; } public ushort[] Faces { get; set; } = []; @@ -14,21 +15,21 @@ public class Mesh : IBinarySerializable, IDisposable, ICloneable public List Textures { get; set; } = []; public MeshSlot Slot { get; set; } - public void Read(BinaryObjectReader reader, uint version) + public void Read(BinaryObjectReader reader, MeshSerializeContext context) { Elements = []; Material = reader.ReadStringOffsetOrEmpty(); - Faces = reader.ReadArrayOffset(reader.Read()); - VertexCount = reader.Read(); - VertexSize = reader.Read(); + Faces = reader.ReadArrayOffset(reader.ReadInt32()); + VertexCount = reader.ReadUInt32(); + VertexSize = reader.ReadUInt32(); Vertices = reader.ReadArrayOffset((int)(VertexCount * VertexSize)); reader.ReadOffset(() => { while (true) { - VertexElement element = reader.Read(); + VertexElement element = reader.ReadObject(); if (element.Format == VertexFormat.Invalid) { break; @@ -46,7 +47,7 @@ public void Read(BinaryObjectReader reader, uint version) BoneIndices = []; reader.ReadOffsetValue(); } - else if (version >= 6) + else if (context.Version >= 6) { BoneIndices = reader.ReadArrayOffset(boneCount); } @@ -59,38 +60,45 @@ public void Read(BinaryObjectReader reader, uint version) SwapVertexEndianness(); } - public void Write(BinaryObjectWriter writer, uint version) + public void Write(BinaryObjectWriter writer, MeshSerializeContext context) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Path.GetFileNameWithoutExtension(Material.Name)); - writer.Write(Faces.Length); + writer.WriteInt32(Faces.Length); writer.WriteArrayOffset(Faces); - byte[] verticesClone = new byte[Vertices.Length]; - Array.Copy(Vertices, verticesClone, verticesClone.LongLength); - VertexElement.SwapEndianness([.. Elements], verticesClone.AsSpan(), (nint)VertexCount, (nint)VertexSize); + writer.WriteUInt32(context.IsMorphModel ? 0 : VertexCount); + writer.WriteUInt32(VertexSize); - writer.Write(VertexCount); - writer.Write(VertexSize); - writer.WriteArrayOffset(verticesClone); + if (context.IsMorphModel) + { + writer.WriteOffset(() => { }); + } + else + { + byte[] verticesClone = new byte[Vertices.Length]; + Array.Copy(Vertices, verticesClone, verticesClone.LongLength); + VertexElement.SwapEndianness([.. Elements], verticesClone.AsSpan(), (nint)VertexCount, (nint)VertexSize); + writer.WriteArrayOffset(verticesClone); + } writer.WriteOffset(() => { foreach (VertexElement element in Elements) { - writer.Write(element); + writer.WriteObject(element); writer.Align(4); } - writer.Write(VertexElement.Invalid); + writer.WriteObject(VertexElement.Invalid); }); - writer.Write(BoneIndices.Length); + writer.WriteInt32(BoneIndices.Length); if (BoneIndices.Length == 0) { writer.WriteOffsetValue(0); } else - if (version >= 6) + if (context.Version >= 6) { writer.WriteArrayOffset(BoneIndices); } @@ -99,7 +107,7 @@ public void Write(BinaryObjectWriter writer, uint version) writer.WriteArrayOffset(BoneIndices.Select(Convert.ToByte).ToArray()); } - writer.Write(Textures.Count); + writer.WriteInt32(Textures.Count); if (Textures.Count == 0) { writer.WriteOffsetValue(0); diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MeshGroup.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MeshGroup.cs index c3fc783..78ea1db 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MeshGroup.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MeshGroup.cs @@ -1,18 +1,19 @@ namespace SharpNeedle.Framework.HedgehogEngine.Mirage.ModelData; using SharpNeedle.Structs; +using MeshList = BinaryList, MeshSerializeContext>; -public class MeshGroup : List, IBinarySerializable, IDisposable, ICloneable +public class MeshGroup : List, IBinarySerializable, IDisposable, ICloneable { public string? Name { get; set; } - public void Read(BinaryObjectReader reader, uint version) + public void Read(BinaryObjectReader reader, MeshSerializeContext context) { - bool readSpecial = version >= 5; + bool readSpecial = context.Version >= 5; - BinaryList, uint> opaqMeshes = reader.ReadObject, uint>, uint>(version); - BinaryList, uint> transMeshes = reader.ReadObject, uint>, uint>(version); - BinaryList, uint> punchMeshes = reader.ReadObject, uint>, uint>(version); + MeshList opaqMeshes = reader.ReadObject(context); + MeshList transMeshes = reader.ReadObject(context); + MeshList punchMeshes = reader.ReadObject(context); Clear(); @@ -26,7 +27,7 @@ public void Read(BinaryObjectReader reader, uint version) return; } - int specialMeshCount = reader.Read(); + int specialMeshCount = reader.ReadInt32(); Capacity += specialMeshCount; (string Name, int Count)[] slots = new (string Name, int Count)[specialMeshCount]; @@ -66,9 +67,9 @@ public void Read(BinaryObjectReader reader, uint version) Name = reader.ReadString(StringBinaryFormat.NullTerminated); - void AddMeshes(BinaryList, uint> meshes, MeshSlot slot) + void AddMeshes(MeshList meshes, MeshSlot slot) { - foreach (BinaryPointer mesh in meshes) + foreach (BinaryPointer mesh in meshes) { mesh.Value.Slot = slot; Add(mesh); @@ -76,9 +77,9 @@ void AddMeshes(BinaryList, uint> meshes, MeshSlot slot } } - public void Write(BinaryObjectWriter writer, uint version) + public void Write(BinaryObjectWriter writer, MeshSerializeContext context) { - bool writeSpecial = version >= 5; + bool writeSpecial = context.Version >= 5; WriteMeshes(this.Where(x => x.Slot == MeshType.Opaque)); WriteMeshes(this.Where(x => x.Slot == MeshType.Transparent)); @@ -107,7 +108,7 @@ public void Write(BinaryObjectWriter writer, uint version) } } - writer.Write(specialGroups.Count); + writer.WriteInt32(specialGroups.Count); if (specialGroups.Count == 0) { writer.WriteUInt32(uint.MaxValue); @@ -152,12 +153,12 @@ public void Write(BinaryObjectWriter writer, uint version) void WriteMeshes(IEnumerable meshes) { - writer.Write(meshes.Count()); + writer.WriteInt32(meshes.Count()); writer.WriteOffset(() => { foreach (Mesh mesh in meshes) { - writer.WriteObjectOffset(mesh, version); + writer.WriteObjectOffset(mesh, context); } }); } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MeshSerializeContext.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MeshSerializeContext.cs new file mode 100644 index 0000000..a2846df --- /dev/null +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MeshSerializeContext.cs @@ -0,0 +1,13 @@ +namespace SharpNeedle.Framework.HedgehogEngine.Mirage.ModelData; + +public readonly struct MeshSerializeContext +{ + public uint Version { get; } + public bool IsMorphModel { get; } + + public MeshSerializeContext(uint version, bool isMorphModel) + { + Version = version; + IsMorphModel = isMorphModel; + } +} diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MeshSlot.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MeshSlot.cs index eb44846..371b87e 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MeshSlot.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MeshSlot.cs @@ -11,7 +11,7 @@ public struct MeshSlot public readonly string? Name; [JsonConstructor] - internal MeshSlot(MeshType type, string name) + public MeshSlot(MeshType type, string name) { Type = type; diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/Model.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/Model.cs index daf710d..690e199 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/Model.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/Model.cs @@ -18,7 +18,7 @@ public override void Read(BinaryObjectReader reader) Morphs = reader.ReadObject, uint>, uint>(DataVersion).Unwind(); } - reader.Read(out int nodeCount); + int nodeCount = reader.ReadInt32(); Nodes = new List(nodeCount); reader.ReadOffset(() => { @@ -38,7 +38,7 @@ public override void Read(BinaryObjectReader reader) } Node node = Nodes[i]; - node.Transform = Matrix4x4.Transpose(reader.Read()); + node.Transform = Matrix4x4.Transpose(reader.ReadMatrix4x4()); Nodes[i] = node; } }); @@ -54,7 +54,7 @@ public override void Write(BinaryObjectWriter writer) CommonWrite(writer); if (DataVersion >= 4) { - writer.Write(Morphs?.Count ?? 0); + writer.WriteInt32(Morphs?.Count ?? 0); writer.WriteOffset(() => { if (Morphs == null) @@ -69,7 +69,7 @@ public override void Write(BinaryObjectWriter writer) }); } - writer.Write(Nodes.Count); + writer.WriteInt32(Nodes.Count); writer.WriteOffset(() => { foreach (Node node in Nodes) @@ -82,7 +82,7 @@ public override void Write(BinaryObjectWriter writer) { foreach (Node node in Nodes) { - writer.Write(Matrix4x4.Transpose(node.Transform)); + writer.WriteMatrix4x4(Matrix4x4.Transpose(node.Transform)); } }); @@ -126,14 +126,14 @@ public struct Node : IBinarySerializable public void Read(BinaryObjectReader reader) { - ParentIndex = reader.Read(); + ParentIndex = reader.ReadInt32(); Name = reader.ReadStringOffset(); Transform = Matrix4x4.Identity; } public readonly void Write(BinaryObjectWriter writer) { - writer.Write(ParentIndex); + writer.WriteInt32(ParentIndex); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/ModelBase.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/ModelBase.cs index 12da047..715b010 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/ModelBase.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/ModelBase.cs @@ -53,27 +53,31 @@ protected override void Dispose(bool disposing) [MethodImpl(MethodImplOptions.AggressiveInlining)] protected void CommonRead(BinaryObjectReader reader) { + MeshSerializeContext context = new(DataVersion, false); + if (DataVersion >= 5) { - Groups = reader.ReadObject, uint>, uint>(DataVersion).Unwind(); + Groups = reader.ReadObject, MeshSerializeContext>, MeshSerializeContext>(context).Unwind(); } else { - Groups = [reader.ReadObject(DataVersion)]; + Groups = [reader.ReadObject(context)]; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] protected void CommonWrite(BinaryObjectWriter writer) { + MeshSerializeContext context = new(DataVersion, false); + if (DataVersion >= 5) { - writer.Write(Groups.Count); + writer.WriteInt32(Groups.Count); writer.WriteOffset(() => { foreach (MeshGroup group in Groups) { - writer.WriteObjectOffset(group, DataVersion); + writer.WriteObjectOffset(group, context); } }); } @@ -81,14 +85,14 @@ protected void CommonWrite(BinaryObjectWriter writer) { if (Groups.Count == 1) { - writer.WriteObject(Groups[0], DataVersion); + writer.WriteObject(Groups[0], context); } else { MeshGroup dummyMeshGroup = []; dummyMeshGroup.Capacity = Groups.Sum(x => x.Count); dummyMeshGroup.AddRange(Groups.SelectMany(x => x)); - writer.WriteObject(dummyMeshGroup, DataVersion); + writer.WriteObject(dummyMeshGroup, context); } } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MorphModel.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MorphModel.cs index 7e27a69..c10dea3 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MorphModel.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/MorphModel.cs @@ -11,17 +11,17 @@ public class MorphModel : IBinarySerializable public void Read(BinaryObjectReader reader, uint version) { - reader.Read(out uint vertexCount); + int vertexCount = reader.ReadInt32(); long vertexOffset = reader.ReadOffsetValue(); - uint flags = reader.Read(); + uint flags = reader.ReadUInt32(); if (flags != 1) { throw new Exception($"{flags} is not 1! Report this model!"); } - reader.Read(out uint shapeCount); - Targets = new List((int)shapeCount); + int shapeCount = reader.ReadInt32(); + Targets = new List(shapeCount); for (uint i = 0; i < shapeCount; i++) { Targets.Add(new()); @@ -39,11 +39,11 @@ public void Read(BinaryObjectReader reader, uint version) { foreach (MorphTarget mesh in Targets) { - mesh.Positions = reader.ReadArrayOffset((int)vertexCount); + reader.ReadOffset(() => mesh.Positions = reader.ReadVector3Array(vertexCount)); } }); - MeshGroup = reader.ReadObject(version); + MeshGroup = reader.ReadObject(new(version, true)); byte[] vertexData = []; @@ -56,7 +56,7 @@ public void Read(BinaryObjectReader reader, uint version) vertexData = reader.ReadArrayAtOffset(vertexOffset, (int)(vertexCount * mesh.VertexSize)); } - mesh.VertexCount = vertexCount; + mesh.VertexCount = (uint)vertexCount; mesh.Vertices = vertexData; if (i == 0) @@ -84,11 +84,11 @@ public void Write(BinaryObjectWriter writer, uint version) Array.Copy(mesh.Vertices, verticesClone, verticesClone.LongLength); VertexElement.SwapEndianness([.. mesh.Elements], verticesClone.AsSpan(), (nint)mesh.VertexCount, (nint)mesh.VertexSize); - writer.Write(mesh.VertexCount); + writer.WriteUInt32(mesh.VertexCount); writer.WriteArrayOffset(verticesClone); - writer.Write(1); // Some kind of flags - writer.Write(Targets.Count); + writer.WriteInt32(1); // Some kind of flags + writer.WriteInt32(Targets.Count); writer.WriteOffset(() => { @@ -102,11 +102,11 @@ public void Write(BinaryObjectWriter writer, uint version) { foreach (MorphTarget shape in Targets) { - writer.WriteArrayOffset(shape.Positions); + writer.WriteOffset(() => writer.WriteVector3Array(shape.Positions)); } }); - writer.WriteObject(MeshGroup, version); + writer.WriteObject(MeshGroup, new MeshSerializeContext(version, true)); } public void ResolveDependencies(IResourceResolver dir) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/TerrainModel.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/TerrainModel.cs index a1f7b7e..0b6daa1 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/TerrainModel.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/TerrainModel.cs @@ -27,7 +27,7 @@ public override void Read(BinaryObjectReader reader) if (DataVersion >= 5) { Name = reader.ReadStringOffsetOrEmpty(); - Flags = reader.Read(); + Flags = (TerrainModelFlags)reader.ReadUInt32(); } } @@ -37,7 +37,7 @@ public override void Write(BinaryObjectWriter writer) if (DataVersion >= 5) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(Flags); + writer.WriteUInt32((uint)Flags); } } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/TextureUnit.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/TextureUnit.cs index e4c39d0..99340ff 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/TextureUnit.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/TextureUnit.cs @@ -15,7 +15,7 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(Index); + writer.WriteByte(Index); writer.Align(4); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/VertexElement.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/VertexElement.cs index 045469b..055dcee 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/VertexElement.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ModelData/VertexElement.cs @@ -1,9 +1,7 @@ namespace SharpNeedle.Framework.HedgehogEngine.Mirage.ModelData; -using SharpNeedle.Structs; - [StructLayout(LayoutKind.Sequential)] -public struct VertexElement +public struct VertexElement : IBinarySerializable { public static readonly VertexElement Invalid = new() { Stream = 0xFF, Format = VertexFormat.Invalid }; @@ -14,6 +12,28 @@ public struct VertexElement public VertexType Type; public byte UsageIndex; + public void Read(BinaryObjectReader reader) + { + Stream = reader.ReadUInt16(); + Offset = reader.ReadUInt16(); + Format = (VertexFormat)reader.ReadUInt32(); + Method = (VertexMethod)reader.ReadByte(); + Type = (VertexType)reader.ReadByte(); + UsageIndex = reader.ReadByte(); + reader.Align(4); + } + + public readonly void Write(BinaryObjectWriter writer) + { + writer.WriteUInt16(Stream); + writer.WriteUInt16(Offset); + writer.WriteUInt32((uint)Format); + writer.WriteByte((byte)Method); + writer.WriteByte((byte)Type); + writer.WriteByte(UsageIndex); + writer.Align(4); + } + public static unsafe void SwapEndianness(VertexElement[] elements, Span vertices, nint count, nint size) { // I'm going to have a breakdown @@ -28,16 +48,22 @@ public static unsafe void SwapEndianness(VertexElement[] elements, Span ve switch (element.Format) { case VertexFormat.Float1: - Swap(); + Swap(0); break; case VertexFormat.Float2: - Swap(); + Swap(0); + Swap(1); break; case VertexFormat.Float3: - Swap(); + Swap(0); + Swap(1); + Swap(2); break; case VertexFormat.Float4: - Swap(); + Swap(0); + Swap(1); + Swap(2); + Swap(3); break; case VertexFormat.Byte4: @@ -65,21 +91,25 @@ public static unsafe void SwapEndianness(VertexElement[] elements, Span ve case VertexFormat.Dhen3: case VertexFormat.Dhen3Norm: case VertexFormat.Udhen3Norm: - Swap(); + Swap(0); break; case VertexFormat.Int2: case VertexFormat.Int2Norm: case VertexFormat.Uint2: case VertexFormat.Uint2Norm: - Swap(); + Swap(0); + Swap(1); break; case VertexFormat.Int4: case VertexFormat.Uint4: case VertexFormat.Int4Norm: case VertexFormat.Uint4Norm: - Swap(); + Swap(0); + Swap(1); + Swap(2); + Swap(3); break; case VertexFormat.Short2: @@ -87,9 +117,8 @@ public static unsafe void SwapEndianness(VertexElement[] elements, Span ve case VertexFormat.Short2Norm: case VertexFormat.Ushort2Norm: case VertexFormat.Float16_2: - Swap(); - pData += sizeof(ushort); - Swap(); + Swap(0); + Swap(1); break; case VertexFormat.Short4: @@ -97,13 +126,10 @@ public static unsafe void SwapEndianness(VertexElement[] elements, Span ve case VertexFormat.Ushort4Norm: case VertexFormat.Short4Norm: case VertexFormat.Float16_4: - Swap(); - pData += sizeof(ushort); - Swap(); - pData += sizeof(ushort); - Swap(); - pData += sizeof(ushort); - Swap(); + Swap(0); + Swap(1); + Swap(2); + Swap(3); break; case VertexFormat.Invalid: @@ -114,9 +140,9 @@ public static unsafe void SwapEndianness(VertexElement[] elements, Span ve } [MethodImpl(MethodImplOptions.AggressiveInlining)] - void Swap() where T : unmanaged + void Swap(int index) where T : unmanaged { - BinaryOperations.Reverse(ref Unsafe.AsRef(pData)); + BinaryOperations.Reverse(ref Unsafe.AsRef(((T*)pData) + index)); } } @@ -124,4 +150,6 @@ void Swap() where T : unmanaged } } } + + } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/PackedFileInfo.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/PackedFileInfo.cs index 509e427..9a58b4d 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/PackedFileInfo.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/PackedFileInfo.cs @@ -8,8 +8,8 @@ public class PackedFileInfo : SampleChunkResource public override void Read(BinaryObjectReader reader) { - reader.Read(out int fileCount); - Files = []; + int fileCount = reader.ReadInt32(); + Files = new(fileCount); reader.ReadOffset(() => { @@ -22,7 +22,7 @@ public override void Read(BinaryObjectReader reader) public override void Write(BinaryObjectWriter writer) { - writer.Write(Files.Count); + writer.WriteInt32(Files.Count); writer.WriteOffset(() => { foreach (File file in Files) @@ -41,15 +41,15 @@ public struct File : IBinarySerializable public void Read(BinaryObjectReader reader) { Name = reader.ReadStringOffset(); - Offset = reader.Read(); - Size = reader.Read(); + Offset = reader.ReadUInt32(); + Size = reader.ReadUInt32(); } public readonly void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(Offset); - writer.Write(Size); + writer.WriteUInt32(Offset); + writer.WriteUInt32(Size); } public override readonly string ToString() diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/SampleChunkNode.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/SampleChunkNode.cs index 761a8e7..454c19a 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/SampleChunkNode.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/SampleChunkNode.cs @@ -4,10 +4,10 @@ using System.Text.Json; using System.Text.Json.Serialization; -[JsonConverter(typeof(JsonConverter))] +[JsonConverter(typeof(SampleChunkNode.JsonConverter))] public class SampleChunkNode : IBinarySerializable, IEnumerable { - private class JsonConverter : JsonConverter + public class JsonConverter : JsonConverter { public override SampleChunkNode? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { @@ -76,6 +76,7 @@ public override void Write(Utf8JsonWriter writer, SampleChunkNode value, JsonSer writer.WriteEndArray(); } + writer.WriteEndObject(); } } @@ -183,11 +184,8 @@ public SampleChunkNode(string name, IBinarySerializable data, uint dataVersion) /// public void Detach() { - if (Parent != null) - { - Parent._children.Remove(this); - Parent = null; - } + Parent?._children.Remove(this); + Parent = null; } /// @@ -301,7 +299,7 @@ public bool Read(BinaryValueReader reader) Flags flags = (Flags)header & Flags.Mask; uint size = header & (uint)Flags.SizeMask; - Value = reader.Read(); + Value = reader.ReadUInt32(); Name = reader.ReadString(StringBinaryFormat.FixedLength, 8); int spaceIdx = Name.IndexOf(' '); @@ -341,14 +339,14 @@ private void Write(BinaryObjectWriter writer, bool lastNode) { long start = writer.Position; SeekToken flagsToken = writer.At(); - writer.Write(0u); + writer.WriteUInt32(0u); Flags flags = default; if (Parent == null) { flags = Flags.Root; - writer.Write(RootSignature); - writer.Write(0ul); + writer.WriteUInt32(RootSignature); + writer.WriteUInt64(0ul); writer.PushOffsetOrigin(); } else @@ -358,7 +356,7 @@ private void Write(BinaryObjectWriter writer, bool lastNode) flags = Flags.LastChild; } - writer.Write(Value); + writer.WriteUInt32(Value); writer.WriteLittle(BinaryHelper.MakeSignature(Name, 0x20)); } @@ -403,11 +401,11 @@ private void Write(BinaryObjectWriter writer, bool lastNode) long nodeContentOffset = start + 0x10; foreach (long offset in offsets) { - writer.Write((uint)(offset - nodeContentOffset)); + writer.WriteUInt32((uint)(offset - nodeContentOffset)); } }); - writer.Write(offsets.Length); + writer.WriteInt32(offsets.Length); } else if (lastNode && Parent.Parent == null) { @@ -427,7 +425,7 @@ private void Write(BinaryObjectWriter writer, bool lastNode) using SeekToken endToken = writer.At(); flagsToken.Dispose(); - writer.Write((uint)((long)endToken - start) | (uint)flags); + writer.WriteUInt32((uint)((long)endToken - start) | (uint)flags); } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/SampleChunkResource.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/SampleChunkResource.cs index e581d2f..faa502c 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/SampleChunkResource.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/SampleChunkResource.cs @@ -1,5 +1,6 @@ namespace SharpNeedle.Framework.HedgehogEngine.Mirage; +using SharpNeedle.Framework.SurfRide.Draw; using System.Reflection; public abstract class SampleChunkResource : ResourceBase, IBinarySerializable @@ -51,7 +52,7 @@ public override void Read(IFile file) public void ReadResource(BinaryObjectReader reader) { - SampleChunkNode.Flags v2Flags = reader.Read(); + SampleChunkNode.Flags v2Flags = (SampleChunkNode.Flags)reader.ReadUInt32(); reader.Seek(-4, SeekOrigin.Current); if (v2Flags.HasFlag(SampleChunkNode.Flags.Root)) @@ -67,17 +68,17 @@ public void ReadResource(BinaryObjectReader reader) private void ReadResourceV1(BinaryObjectReader reader) { reader.Skip(4); // filesize - DataVersion = reader.Read(); + DataVersion = reader.ReadUInt32(); - uint dataSize = reader.Read(); + reader.Skip(4); // data size long dataOffset = reader.ReadOffsetValue(); using (SeekToken token = reader.At()) { - // Using a substream to ensure we can't read outside the nodes data - SubStream dataStream = new(reader.GetBaseStream(), dataOffset, dataSize); - BinaryObjectReader dataReader = new(dataStream, StreamOwnership.Retain, reader.Endianness); - Read(dataReader); + reader.Seek(dataOffset, SeekOrigin.Begin); + reader.OffsetHandler.PushOffsetOrigin(dataOffset); + Read(reader); + reader.PopOffsetOrigin(); } reader.ReadOffsetValue(); // offset table @@ -165,11 +166,11 @@ private void WriteResourceV1(string filename, BinaryObjectWriter writer) { SeekToken beginToken = writer.At(); - writer.Write(0); // File Size - writer.Write(DataVersion); + writer.WriteInt32(0); // File Size + writer.WriteUInt32(DataVersion); SeekToken dataToken = writer.At(); - writer.Write(0); // Data Size + writer.WriteInt32(0); // Data Size long baseOffset = 0; writer.WriteOffset(() => @@ -187,11 +188,11 @@ private void WriteResourceV1(string filename, BinaryObjectWriter writer) using SeekToken token = writer.At(); dataToken.Dispose(); - writer.Write((uint)size); + writer.WriteUInt32((uint)size); }); SeekToken offsetsToken = writer.At(); - writer.Write(0ul); + writer.WriteUInt64(0ul); writer.Flush(); @@ -200,10 +201,10 @@ private void WriteResourceV1(string filename, BinaryObjectWriter writer) writer.WriteOffset(() => { long[] offsets = writer.OffsetHandler.OffsetPositions.ToArray(); - writer.Write(offsets.Length - 1); + writer.WriteInt32(offsets.Length - 1); for (int i = 0; i < offsets.Length - 1; i++) { - writer.Write((uint)(offsets[i] - baseOffset)); + writer.WriteUInt32((uint)(offsets[i] - baseOffset)); } writer.PopOffsetOrigin(); @@ -221,7 +222,7 @@ private void WriteResourceV1(string filename, BinaryObjectWriter writer) using SeekToken token = writer.At(); beginToken.Dispose(); - writer.Write((uint)((long)token - (long)beginToken)); + writer.WriteUInt32((uint)((long)token - (long)beginToken)); } private void WriteResourceV2(BinaryObjectWriter writer) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/BaseShaderPermutation.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/BaseShaderPermutation.cs index 35627a7..cfbedf7 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/BaseShaderPermutation.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/BaseShaderPermutation.cs @@ -77,7 +77,7 @@ public virtual void Read(BinaryObjectReader reader) public virtual void Write(BinaryObjectWriter writer) { - writer.Write(Convert.ToUInt32(SubPermutations)); + writer.WriteUInt32(Convert.ToUInt32(SubPermutations)); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, PermutationName, -1, 1); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, ShaderName, -1, 1); } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/PixelShaderPermutation.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/PixelShaderPermutation.cs index d2316ad..73b2cb3 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/PixelShaderPermutation.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/PixelShaderPermutation.cs @@ -58,7 +58,7 @@ public override void Write(BinaryObjectWriter writer) { base.Write(writer); - writer.Write(VertexShaderPermutations.Count); + writer.WriteInt32(VertexShaderPermutations.Count); writer.WriteOffset(() => { foreach (VertexShaderPermutation vertexShaderPermutation in VertexShaderPermutations) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderConstantUsage.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderConstantUsage.cs index f6d3872..535b49a 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderConstantUsage.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderConstantUsage.cs @@ -10,8 +10,8 @@ public class ShaderConstantUsage : IBinarySerializable public void Read(BinaryObjectReader reader) { Name = reader.ReadStringOffset(); - Index = reader.Read(); - Size = reader.Read(); + Index = reader.ReadByte(); + Size = reader.ReadByte(); reader.Align(reader.GetOffsetSize()); } @@ -19,8 +19,8 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(Index); - writer.Write(Size); + writer.WriteByte(Index); + writer.WriteByte(Size); writer.Align(writer.GetOffsetSize()); } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderList.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderList.cs index 187c99f..ca5e073 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderList.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderList.cs @@ -50,7 +50,7 @@ public override void Read(BinaryObjectReader reader) public override void Write(BinaryObjectWriter writer) { - writer.Write(PixelShaderPermutations.Count); + writer.WriteInt32(PixelShaderPermutations.Count); writer.WriteOffset(() => { foreach (PixelShaderPermutation pixelShaderPermutation in PixelShaderPermutations) @@ -64,7 +64,7 @@ public override void Write(BinaryObjectWriter writer) return; } - writer.Write(ParameterInputs.Count); + writer.WriteInt32(ParameterInputs.Count); writer.WriteOffset(() => { foreach (ShaderListParameter parameter in ParameterInputs) @@ -73,7 +73,7 @@ public override void Write(BinaryObjectWriter writer) } }, 4); - writer.Write(TextureInputs.Count); + writer.WriteInt32(TextureInputs.Count); writer.WriteOffset(() => { foreach (ShaderListTexture texture in TextureInputs) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderListParameter.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderListParameter.cs index fb1b5e8..97402e5 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderListParameter.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderListParameter.cs @@ -9,21 +9,13 @@ public struct ShaderListParameter : IBinarySerializable public void Read(BinaryObjectReader reader) { Name = reader.ReadStringOffset(StringBinaryFormat.NullTerminated); - DefaultValue = new( - reader.ReadSingle(), - reader.ReadSingle(), - reader.ReadSingle(), - reader.ReadSingle() - ); + DefaultValue = reader.ReadVector4(); } public void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name, alignment: 4); - writer.WriteSingle(DefaultValue.X); - writer.WriteSingle(DefaultValue.Y); - writer.WriteSingle(DefaultValue.Z); - writer.WriteSingle(DefaultValue.W); + writer.WriteVector4(DefaultValue); } public override string ToString() diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderParameter.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderParameter.cs index a8ca26e..197d89e 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderParameter.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/ShaderData/ShaderParameter.cs @@ -61,8 +61,8 @@ public override void Write(BinaryObjectWriter writer) foreach (List usages in UsageSet) { - writer.Write(usages.Count); - ; + writer.WriteInt32(usages.Count); + writer.WriteOffset(() => { foreach (ShaderConstantUsage c in usages) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/Terrain.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/Terrain.cs index 82e5279..3b98764 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/Terrain.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/Terrain.cs @@ -11,7 +11,7 @@ public override void Read(BinaryObjectReader reader) public override void Write(BinaryObjectWriter writer) { - writer.Write(Groups.Count); + writer.WriteInt32(Groups.Count); writer.WriteOffset(() => { foreach (TerrainGroupInfo group in Groups) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainBlockSphereTree.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainBlockSphereTree.cs index 69bcd2a..3b2f63c 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainBlockSphereTree.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainBlockSphereTree.cs @@ -44,7 +44,7 @@ public bool Traverse(TPoint point, Action { @@ -53,7 +53,8 @@ public override void Read(BinaryObjectReader reader) nodes[i] = reader.ReadObjectOffset(); } }); - reader.Read(out int rootIndex); + + int rootIndex = reader.ReadInt32(); Root = BuildNode(ref nodes[rootIndex]); BVHNode BuildNode(ref BinaryNode node) @@ -79,15 +80,15 @@ public override void Write(BinaryObjectWriter writer) List nodes = []; BuildNodes(Root, nodes); - writer.Write(nodes.Count); + writer.WriteInt32(nodes.Count); writer.WriteOffset(() => { foreach (BinaryNode node in nodes) { - writer.WriteOffset(() => writer.WriteObject(node)); + writer.WriteObjectOffset(node); } }); - writer.Write(nodes.Count - 1); + writer.WriteInt32(nodes.Count - 1); static void BuildNodes(BVHNode node, List result) { @@ -135,18 +136,18 @@ private struct BinaryNode : IBinarySerializable public void Read(BinaryObjectReader reader) { - Type = reader.Read(); - LeftIndex = reader.Read(); - RightIndex = reader.Read(); - Bounds = reader.ReadValueOffset(); + Type = (NodeType)reader.ReadInt32(); + LeftIndex = reader.ReadInt32(); + RightIndex = reader.ReadInt32(); + Bounds = reader.ReadObjectOffset(); } public readonly void Write(BinaryObjectWriter writer) { - writer.Write(Type); - writer.Write(LeftIndex); - writer.Write(RightIndex); - writer.WriteValueOffset(Bounds); + writer.WriteInt32((int)Type); + writer.WriteInt32(LeftIndex); + writer.WriteInt32(RightIndex); + writer.WriteObjectOffset(Bounds); } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroup.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroup.cs index 491e55e..0a4ab9e 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroup.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroup.cs @@ -21,7 +21,8 @@ public class TerrainGroup : SampleChunkResource public override void Read(BinaryObjectReader reader) { Subsets = reader.ReadObject>>().Unwind(); - reader.Read(out int modelCount); + + int modelCount = reader.ReadInt32(); ModelNames = new(modelCount); reader.ReadOffset(() => @@ -35,7 +36,7 @@ public override void Read(BinaryObjectReader reader) public override void Write(BinaryObjectWriter writer) { - writer.Write(Subsets.Count); + writer.WriteInt32(Subsets.Count); writer.WriteOffset(() => { foreach (TerrainGroupSubset set in Subsets) @@ -44,7 +45,7 @@ public override void Write(BinaryObjectWriter writer) } }); - writer.Write(ModelNames.Count); + writer.WriteInt32(ModelNames.Count); writer.WriteOffset(() => { foreach (string? name in ModelNames) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroupInfo.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroupInfo.cs index 86dd56b..b6f5990 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroupInfo.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroupInfo.cs @@ -13,34 +13,34 @@ public class TerrainGroupInfo : IBinarySerializable public void Read(BinaryObjectReader reader) { - Bounds = reader.ReadValueOffset(); + Bounds = reader.ReadObjectOffset(); Name = reader.ReadStringOffset(); - MemorySize = reader.Read(); + MemorySize = reader.ReadUInt32(); - reader.Read(out int instancesCount); + int instancesCount = reader.ReadInt32(); Instances = new List(instancesCount); reader.ReadOffset(() => { for (int i = 0; i < instancesCount; i++) { - Instances.Add(reader.ReadValueOffset()); + Instances.Add(reader.ReadObjectOffset()); } }); - SubsetID = reader.Read(); + SubsetID = reader.ReadInt32(); } public void Write(BinaryObjectWriter writer) { - writer.WriteValueOffset(Bounds); + writer.WriteObjectOffset(Bounds); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(MemorySize); - writer.Write(Instances.Count); + writer.WriteUInt32(MemorySize); + writer.WriteInt32(Instances.Count); writer.WriteOffset(() => { foreach (Sphere instance in Instances) { - writer.WriteValueOffset(instance); + writer.WriteObjectOffset(instance); } }); } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroupSubset.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroupSubset.cs index 03b1e71..d908383 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroupSubset.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainGroupSubset.cs @@ -9,7 +9,7 @@ public class TerrainGroupSubset : List, IBinarySerializable public void Read(BinaryObjectReader reader) { - reader.Read(out int instanceCount); + int instanceCount = reader.ReadInt32(); Clear(); Capacity = instanceCount; @@ -21,12 +21,12 @@ public void Read(BinaryObjectReader reader) } }); - Bounds = reader.ReadValueOffset(); + Bounds = reader.ReadObjectOffset(); } public void Write(BinaryObjectWriter writer) { - writer.Write(Count); + writer.WriteInt32(Count); writer.WriteOffset(() => { @@ -35,6 +35,6 @@ public void Write(BinaryObjectWriter writer) writer.WriteStringOffset(StringBinaryFormat.NullTerminated, instance); } }); - writer.WriteValueOffset(Bounds); + writer.WriteObjectOffset(Bounds); } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainInstanceInfo.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainInstanceInfo.cs index 44ef67e..660bbd1 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainInstanceInfo.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Mirage/TerrainData/TerrainInstanceInfo.cs @@ -1,7 +1,6 @@ -using SharpNeedle.Framework.HedgehogEngine.Mirage.ModelData; - -namespace SharpNeedle.Framework.HedgehogEngine.Mirage.TerrainData; +namespace SharpNeedle.Framework.HedgehogEngine.Mirage.TerrainData; +using SharpNeedle.Framework.HedgehogEngine.Mirage.ModelData; using SharpNeedle.Framework.HedgehogEngine.Mirage.LightData; [NeedleResource("hh/terrain-instance-info", $@"\{Extension}$")] @@ -16,7 +15,8 @@ public class TerrainInstanceInfo : SampleChunkResource public override void Read(BinaryObjectReader reader) { Model = reader.ReadStringOffsetOrEmpty(); - Transform = Matrix4x4.Transpose(reader.ReadValueOffset()); + reader.ReadOffset(() => Transform = Matrix4x4.Transpose(reader.ReadMatrix4x4())); + Name = reader.ReadStringOffsetOrEmpty(); if (DataVersion >= 5) @@ -32,11 +32,11 @@ public override void Read(BinaryObjectReader reader) public override void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Model.Name); - writer.WriteValueOffset(Matrix4x4.Transpose(Transform)); + writer.WriteOffset(() => writer.WriteMatrix4x4(Matrix4x4.Transpose(Transform))); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); if (DataVersion >= 5) { - writer.Write(LightGroups.Count); + writer.WriteInt32(LightGroups.Count); writer.WriteOffset(() => { foreach (LightIndexMeshGroup group in LightGroups) diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/Shader.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/Shader.cs index ce9f34f..55dbcf2 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/Shader.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/Shader.cs @@ -130,13 +130,13 @@ public void Write(BinaryObjectWriter writer) using (SeekToken temp = writer.At()) { fileSizeToken.Dispose(); - writer.Write((int)(dataEnd - fileDataStart)); + writer.WriteInt32((int)(dataEnd - fileDataStart)); } using (SeekToken temp = writer.At()) { shaderSizeToken.Dispose(); - writer.Write((int)(dataEnd - shaderDataStart)); + writer.WriteInt32((int)(dataEnd - shaderDataStart)); } } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderGlobalVariables.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderGlobalVariables.cs index aa50359..d041141 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderGlobalVariables.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderGlobalVariables.cs @@ -109,7 +109,7 @@ void WriteArray(List list, VariantVariableType type) where T : IBinarySeri using (SeekToken temp = writer.At()) { sizeToken.Dispose(); - writer.Write((int)(endPosition - startPosition)); + writer.WriteInt32((int)(endPosition - startPosition)); } } @@ -137,7 +137,7 @@ void WriteArray(List list, VariantVariableType type) where T : IBinarySeri using (SeekToken temp = writer.At()) { sizeToken.Dispose(); - writer.Write((int)(endPosition - startPosition)); + writer.WriteInt32((int)(endPosition - startPosition)); } } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderList.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderList.cs index dfe353c..b6b345f 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderList.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderList.cs @@ -39,14 +39,14 @@ public struct Input : IBinarySerializable public void Read(BinaryObjectReader reader) { Name = reader.ReadStringOffset(); - UVIndex = reader.Read(); + UVIndex = reader.ReadInt32(); reader.Align(8); } public readonly void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(UVIndex); + writer.WriteInt32(UVIndex); writer.Align(8); } @@ -104,13 +104,7 @@ public override void Write(BinaryObjectWriter writer) { writer.Align(8); - writer.WriteOffset(() => - { - foreach (Shader input in Shaders) - { - writer.WriteObject(input); - } - }); + writer.WriteObjectCollectionOffset(Shaders); writer.WriteInt32(Shaders.Count); } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderVariant.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderVariant.cs index 9df48c9..dbf75b9 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderVariant.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Needle/Shader/ShaderVariant.cs @@ -45,7 +45,7 @@ public void Write(BinaryObjectWriter writer) using (SeekToken temp = writer.At()) { sizeToken.Dispose(); - writer.Write((int)(endPosition - startPosition)); + writer.WriteInt32((int)(endPosition - startPosition)); } } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Material/Material.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Material/Material.cs index be110f1..2db408a 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Material/Material.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Material/Material.cs @@ -28,7 +28,7 @@ public void Write(BinaryObjectWriter writer) writer.WriteStringPaddedByte(ShaderName, 4); writer.WriteStringPaddedByte(TextureName, 4); writer.WriteStringPaddedByte(DeflectionTextureName, 4); - writer.Write(AddressMode); - writer.Write(BlendMode); + writer.WriteInt32((int)AddressMode); + writer.WriteInt32((int)BlendMode); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Cylinder.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Cylinder.cs index 98afafb..d8869f1 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Cylinder.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Cylinder.cs @@ -26,14 +26,14 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { - writer.Write(Enquiangular ? 1 : 0); - writer.Write(IsCircumference ? 1 : 0); - writer.Write(IsCone ? 1 : 0); - writer.Write(Angle); - writer.Write(Radius); - writer.Write(Height); - writer.Write(MinAngle); - writer.Write(MaxAngle); - writer.Write(CylinderEmissionType); + writer.WriteInt32(Enquiangular ? 1 : 0); + writer.WriteInt32(IsCircumference ? 1 : 0); + writer.WriteInt32(IsCone ? 1 : 0); + writer.WriteSingle(Angle); + writer.WriteSingle(Radius); + writer.WriteSingle(Height); + writer.WriteSingle(MinAngle); + writer.WriteSingle(MaxAngle); + writer.WriteInt32((int)CylinderEmissionType); } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Effect.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Effect.cs index d324745..fe9479c 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Effect.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Effect.cs @@ -3,7 +3,7 @@ namespace SharpNeedle.Framework.HedgehogEngine.Sparkle; public class Effect : IBinarySerializable { - public string Name { get; set; } + public string? Name { get; set; } public float InitialLifeTime { get; set; } public float ScaleRatio { get; set; } public float GenerateCountRatio { get; set; } @@ -24,8 +24,8 @@ public void Read(BinaryObjectReader reader) ScaleRatio = reader.ReadSingle(); GenerateCountRatio = reader.ReadSingle(); - InitialPosition = reader.Read(); - InitialRotation = reader.Read(); + InitialPosition = reader.ReadVector4(); + InitialRotation = reader.ReadVector4(); IsLoop = reader.ReadUInt32() == 1; DeleteChildren = reader.ReadUInt32() == 1; @@ -37,39 +37,32 @@ public void Read(BinaryObjectReader reader) FieldU4 = reader.ReadInt32(); //Footer SEGA - reader.Seek(16, SeekOrigin.Current); + reader.Skip(16); } public void Write(BinaryObjectWriter writer) { writer.WriteStringPaddedByte(Name, 4); - writer.Write(InitialLifeTime); - writer.Write(ScaleRatio); - writer.Write(GenerateCountRatio); + writer.WriteSingle(InitialLifeTime); + writer.WriteSingle(ScaleRatio); + writer.WriteSingle(GenerateCountRatio); - writer.Write(InitialPosition.X); - writer.Write(InitialPosition.Y); - writer.Write(InitialPosition.Z); - writer.Write(InitialPosition.W); + writer.WriteVector4(InitialPosition); + writer.WriteVector4(InitialRotation); - writer.Write(InitialRotation.X); - writer.Write(InitialRotation.Y); - writer.Write(InitialRotation.Z); - writer.Write(InitialRotation.W); + writer.WriteInt32(IsLoop ? 1 : 0); + writer.WriteInt32(DeleteChildren ? 1 : 0); + writer.WriteSingle(VelocityOffset); - writer.Write(IsLoop ? 1 : 0); - writer.Write(DeleteChildren ? 1 : 0); - writer.Write(VelocityOffset); - - writer.Write(FieldU1); - writer.Write(FieldU2); - writer.Write(FieldU3); - writer.Write(FieldU4); + writer.WriteInt32(FieldU1); + writer.WriteInt32(FieldU2); + writer.WriteInt32(FieldU3); + writer.WriteInt32(FieldU4); //S E G A - writer.Write(83); - writer.Write(69); - writer.Write(71); - writer.Write(65); + writer.WriteInt32(83); + writer.WriteInt32(69); + writer.WriteInt32(71); + writer.WriteInt32(65); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Emitter.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Emitter.cs index 552d849..a754894 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Emitter.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Emitter.cs @@ -46,11 +46,11 @@ public void Read(BinaryObjectReader reader) Infinite = reader.ReadUInt32() == 1; InitialEmissionGap = reader.ReadSingle(); - InitialPosition = reader.Read(); - RotationXYZ = reader.Read(); - RotationXYZBias = reader.Read(); - InitialRotationXYZ = reader.Read(); - InitialRotation = reader.Read(); + InitialPosition = reader.ReadVector4(); + RotationXYZ = reader.ReadVector4(); + RotationXYZBias = reader.ReadVector4(); + InitialRotationXYZ = reader.ReadVector4(); + InitialRotation = reader.ReadVector4(); InitialEmitterLifeTime = reader.ReadSingle(); EmitStartTime = reader.ReadSingle(); @@ -59,7 +59,7 @@ public void Read(BinaryObjectReader reader) CylinderParams = reader.ReadObject(); SphereParams = reader.ReadObject(); - Size = reader.Read(); + Size = reader.ReadVector4(); MeshName = reader.ReadStringPaddedByte(4); FieldU1 = reader.ReadInt32(); @@ -91,36 +91,36 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { writer.WriteStringPaddedByte("EmitterChunk", 4); - writer.Write(ParticleCount); + writer.WriteInt32(ParticleCount); writer.WriteStringPaddedByte(Name, 4); - writer.Write(MaxGenerateCount); - writer.Write(GenerateCount); - writer.Write(ParticleDataFlags); - writer.Write(Infinite ? 1 : 0); - writer.Write(InitialEmissionGap); - - writer.Write(InitialPosition); - writer.Write(RotationXYZ); - writer.Write(RotationXYZBias); - writer.Write(InitialRotationXYZ); - writer.Write(InitialRotation); - - writer.Write(InitialEmitterLifeTime); - writer.Write(EmitStartTime); - writer.Write(EmitCondition); - writer.Write(EmitterType); + writer.WriteInt32(MaxGenerateCount); + writer.WriteInt32(GenerateCount); + writer.WriteInt32(ParticleDataFlags); + writer.WriteInt32(Infinite ? 1 : 0); + writer.WriteSingle(InitialEmissionGap); + + writer.WriteVector4(InitialPosition); + writer.WriteVector4(RotationXYZ); + writer.WriteVector4(RotationXYZBias); + writer.WriteVector4(InitialRotationXYZ); + writer.WriteVector4(InitialRotation); + + writer.WriteSingle(InitialEmitterLifeTime); + writer.WriteSingle(EmitStartTime); + writer.WriteInt32(EmitCondition); + writer.WriteInt32(EmitterType); writer.WriteObject(CylinderParams); writer.WriteObject(SphereParams); - writer.Write(Size); + writer.WriteVector4(Size); writer.WriteStringPaddedByte(MeshName, 4); - writer.Write(FieldU1); - writer.Write(FieldU2); - writer.Write(FieldU3); - writer.Write(FieldU4); + writer.WriteInt32(FieldU1); + writer.WriteInt32(FieldU2); + writer.WriteInt32(FieldU3); + writer.WriteInt32(FieldU4); - writer.Write(AnimCount); + writer.WriteInt32(AnimCount); if (AnimCount > 0) { writer.WriteObject(EmitterAnim); diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Particle.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Particle.cs index 166f862..ca60d1c 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Particle.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Particle.cs @@ -106,26 +106,26 @@ public void Read(BinaryObjectReader reader) DirectionType = (DirectionType)reader.ReadInt32(); ParticleDataFlags = reader.ReadInt32(); - Color = reader.Read(); + Color = reader.ReadObject(); - Gravity = reader.Read(); - ExternalForce = reader.Read(); + Gravity = reader.ReadVector4(); + ExternalForce = reader.ReadVector4(); - InitialDirection = reader.Read(); - InitialDirectionBias = reader.Read(); + InitialDirection = reader.ReadVector4(); + InitialDirectionBias = reader.ReadVector4(); - InitialScale = reader.Read(); - InitialScaleBias = reader.Read(); + InitialScale = reader.ReadVector4(); + InitialScaleBias = reader.ReadVector4(); MeshName = reader.ReadStringPaddedByte(4); - RotationXYZ = reader.Read(); - RotationXYZBias = reader.Read(); - InitialRotationXYZ = reader.Read(); - InitialRotationXYZBias = reader.Read(); + RotationXYZ = reader.ReadVector4(); + RotationXYZBias = reader.ReadVector4(); + InitialRotationXYZ = reader.ReadVector4(); + InitialRotationXYZBias = reader.ReadVector4(); - UVScrollParam = reader.Read(); - UVScrollParamAlpha = reader.Read(); + UVScrollParam = reader.ReadVector4(); + UVScrollParamAlpha = reader.ReadVector4(); RefEffectName = reader.ReadStringPaddedByte(4); RefEffectEmitTimingType = reader.ReadInt32(); @@ -153,71 +153,71 @@ public void Write(BinaryObjectWriter writer) { writer.WriteStringPaddedByte("ParticleChunk", 4); writer.WriteStringPaddedByte(ParticleName, 4); - writer.Write(LifeTime); - writer.Write(LifeTimeBias); + writer.WriteSingle(LifeTime); + writer.WriteSingle(LifeTimeBias); - writer.Write(RotationZ); - writer.Write(RotationZBias); - writer.Write(InitialRotationZ); - writer.Write(InitialRotationZBias); + writer.WriteSingle(RotationZ); + writer.WriteSingle(RotationZBias); + writer.WriteSingle(InitialRotationZ); + writer.WriteSingle(InitialRotationZBias); - writer.Write(InitialSpeed); - writer.Write(InitialSpeedBias); + writer.WriteSingle(InitialSpeed); + writer.WriteSingle(InitialSpeedBias); - writer.Write(ZOffset); - writer.Write(LocusDiff); - writer.Write(NumDivision); - writer.Write(LocusUVType); - writer.Write(IsBillboard ? 1 : 0); - writer.Write(IsEmitterLocal ? 1 : 0); + writer.WriteSingle(ZOffset); + writer.WriteSingle(LocusDiff); + writer.WriteSingle(NumDivision); + writer.WriteInt32((int)LocusUVType); + writer.WriteSingle(IsBillboard ? 1 : 0); + writer.WriteSingle(IsEmitterLocal ? 1 : 0); - writer.Write(LayerType); - writer.Write(PivotType); - writer.Write(UVDescType); + writer.WriteInt32((int)LayerType); + writer.WriteInt32((int)PivotType); + writer.WriteInt32((int)UVDescType); - writer.Write(TextureIndexType); - writer.Write(TextureIndexChangeInterval); - writer.Write(TextureIndexChangeIntervalBias); - writer.Write(InitialTextureIndex); + writer.WriteInt32((int)TextureIndexType); + writer.WriteSingle(TextureIndexChangeInterval); + writer.WriteSingle(TextureIndexChangeIntervalBias); + writer.WriteSingle(InitialTextureIndex); - writer.Write(DirectionType); - writer.Write(ParticleDataFlags); + writer.WriteInt32((int)DirectionType); + writer.WriteSingle(ParticleDataFlags); - writer.Write(Color); + writer.WriteObject(Color); - writer.Write(Gravity); - writer.Write(ExternalForce); - writer.Write(InitialDirection); - writer.Write(InitialDirectionBias); - writer.Write(InitialScale); - writer.Write(InitialScaleBias); + writer.WriteVector4(Gravity); + writer.WriteVector4(ExternalForce); + writer.WriteVector4(InitialDirection); + writer.WriteVector4(InitialDirectionBias); + writer.WriteVector4(InitialScale); + writer.WriteVector4(InitialScaleBias); writer.WriteStringPaddedByte(MeshName, 4); - writer.Write(RotationXYZ); - writer.Write(RotationXYZBias); - writer.Write(InitialRotationXYZ); - writer.Write(InitialRotationXYZBias); - writer.Write(UVScrollParam); - writer.Write(UVScrollParamAlpha); + writer.WriteVector4(RotationXYZ); + writer.WriteVector4(RotationXYZBias); + writer.WriteVector4(InitialRotationXYZ); + writer.WriteVector4(InitialRotationXYZBias); + writer.WriteVector4(UVScrollParam); + writer.WriteVector4(UVScrollParamAlpha); writer.WriteStringPaddedByte(RefEffectName, 4); - writer.Write(RefEffectEmitTimingType); - writer.Write(RefEffectDelayTime); - - writer.Write(DirectionalVelocityRatio); - writer.Write(DeflectionScale); - writer.Write(SoftScale); - writer.Write(VelocityOffset); - writer.Write(UserData); + writer.WriteSingle(RefEffectEmitTimingType); + writer.WriteSingle(RefEffectDelayTime); + + writer.WriteSingle(DirectionalVelocityRatio); + writer.WriteSingle(DeflectionScale); + writer.WriteSingle(SoftScale); + writer.WriteSingle(VelocityOffset); + writer.WriteSingle(UserData); writer.WriteStringPaddedByte(MaterialName, 4); - writer.Write(FieldU1); - writer.Write(FieldU2); - writer.Write(FieldU3); - writer.Write(FieldU4); + writer.WriteSingle(FieldU1); + writer.WriteSingle(FieldU2); + writer.WriteSingle(FieldU3); + writer.WriteSingle(FieldU4); - writer.Write(AnimCount); + writer.WriteSingle(AnimCount); if (AnimCount > 0) { writer.WriteObject(ParticleAnim); diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Sphere.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Sphere.cs index e2611f3..88489aa 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Sphere.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Sphere.cs @@ -13,7 +13,7 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { - writer.Write(LatitudeMaxAngle); - writer.Write(LongitudeMaxAngle); + writer.WriteSingle(LatitudeMaxAngle); + writer.WriteSingle(LongitudeMaxAngle); } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Track.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Track.cs index 4bd0812..81074c9 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Track.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/Particle/Track.cs @@ -19,7 +19,7 @@ public void Read(BinaryObjectReader reader) if (KeyCount > 0) { - KeyFrames = new List(); + KeyFrames = new(KeyCount); for (int i = 0; i < KeyCount; i++) { KeyFrame keyFrame = new() @@ -34,7 +34,7 @@ public void Read(BinaryObjectReader reader) SlopeLLowerBias = reader.ReadSingle(), SlopeRUpperBias = reader.ReadSingle(), SlopeRLowerBias = reader.ReadSingle(), - KeyBreak = reader.Read() == 1 + KeyBreak = reader.ReadInt32() == 1 }; KeyFrames.Add(keyFrame); } @@ -43,23 +43,23 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { - writer.Write(CurveType); - writer.Write(KeyFrames.Count); - writer.Write(41); + writer.WriteInt32(CurveType); + writer.WriteInt32(KeyFrames.Count); + writer.WriteInt32(41); for (int i = 0; i < KeyFrames.Count; i++) { - writer.Write(KeyFrames[i].Time); - writer.Write(KeyFrames[i].Value); - writer.Write(KeyFrames[i].ValueUpperBias); - writer.Write(KeyFrames[i].ValueLowerBias); - writer.Write(KeyFrames[i].SlopeL); - writer.Write(KeyFrames[i].SlopeR); - writer.Write(KeyFrames[i].SlopeLUpperBias); - writer.Write(KeyFrames[i].SlopeLLowerBias); - writer.Write(KeyFrames[i].SlopeRUpperBias); - writer.Write(KeyFrames[i].SlopeRLowerBias); - writer.Write(KeyFrames[i].KeyBreak ? 1 : 0); + writer.WriteSingle(KeyFrames[i].Time); + writer.WriteSingle(KeyFrames[i].Value); + writer.WriteSingle(KeyFrames[i].ValueUpperBias); + writer.WriteSingle(KeyFrames[i].ValueLowerBias); + writer.WriteSingle(KeyFrames[i].SlopeL); + writer.WriteSingle(KeyFrames[i].SlopeR); + writer.WriteSingle(KeyFrames[i].SlopeLUpperBias); + writer.WriteSingle(KeyFrames[i].SlopeLLowerBias); + writer.WriteSingle(KeyFrames[i].SlopeRUpperBias); + writer.WriteSingle(KeyFrames[i].SlopeRLowerBias); + writer.WriteInt32(KeyFrames[i].KeyBreak ? 1 : 0); } } } diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/ProjectInfo.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/ProjectInfo.cs index ec515fe..ddc376f 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/ProjectInfo.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/ProjectInfo.cs @@ -18,6 +18,7 @@ public void Read(BinaryObjectReader reader) EmitterCount = reader.ReadInt32(); ParticleCount = reader.ReadInt32(); } + ExportDate = DateTime.ParseExact(reader.ReadInt64().ToString(), "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture); Version = DateTime.ParseExact(reader.ReadInt32().ToString(), "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); } @@ -29,11 +30,11 @@ public void Write(BinaryObjectWriter writer) if (Type == ProjectType.Effect) { - writer.Write(EmitterCount); - writer.Write(ParticleCount); + writer.WriteInt32(EmitterCount); + writer.WriteInt32(ParticleCount); } - writer.Write(long.Parse(ExportDate.ToString("yyyyMMddHHmmss"))); - writer.Write(int.Parse(Version.ToString("yyyyMMdd"))); + writer.WriteInt64(long.Parse(ExportDate.ToString("yyyyMMddHHmmss"))); + writer.WriteInt32(int.Parse(Version.ToString("yyyyMMdd"))); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/SparkleMaterialProject.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/SparkleMaterialProject.cs index c735a81..764b981 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/SparkleMaterialProject.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/SparkleMaterialProject.cs @@ -26,8 +26,10 @@ public void Read(BinaryObjectReader reader) { ProjectInfo = reader.ReadObject(); - //InportExportMaterial + //ImportExportMaterial Material = reader.ReadObject(); + + reader.Skip(16); } public void Write(BinaryObjectWriter writer) { @@ -35,9 +37,9 @@ public void Write(BinaryObjectWriter writer) writer.WriteObject(Material); //S E G A - writer.Write(83); - writer.Write(69); - writer.Write(71); - writer.Write(65); + writer.WriteInt32(83); + writer.WriteInt32(69); + writer.WriteInt32(71); + writer.WriteInt32(65); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/SparkleParticleProject.cs b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/SparkleParticleProject.cs index 9db9cc3..fade733 100644 --- a/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/SparkleParticleProject.cs +++ b/Source/SharpNeedle/Framework/HedgehogEngine/Sparkle/SparkleParticleProject.cs @@ -33,21 +33,23 @@ public void Read(BinaryObjectReader reader) { Emitters.Add(reader.ReadObject()); } + + reader.Skip(16); } public void Write(BinaryObjectWriter writer) { writer.WriteObject(ProjectInfo); writer.WriteObject(Effect); - for (int i = 0; i < ProjectInfo.EmitterCount; i++) + for (int i = 0; i < ProjectInfo!.EmitterCount; i++) { writer.WriteObject(Emitters[i]); } //S E G A - writer.Write(83); - writer.Write(69); - writer.Write(71); - writer.Write(65); + writer.WriteInt32(83); + writer.WriteInt32(69); + writer.WriteInt32(71); + writer.WriteInt32(65); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/LostWorld/Animation/AnimationDef.cs b/Source/SharpNeedle/Framework/LostWorld/Animation/AnimationDef.cs index ede4274..9524161 100644 --- a/Source/SharpNeedle/Framework/LostWorld/Animation/AnimationDef.cs +++ b/Source/SharpNeedle/Framework/LostWorld/Animation/AnimationDef.cs @@ -16,15 +16,15 @@ public AnimationDef(AnimationType type) public virtual void Read(BinaryObjectReader reader) { Name = reader.ReadStringOffset(); - reader.EnsureSignatureNative(Type); - Layer = reader.Read(); + reader.EnsureSignatureNative((short)Type); + Layer = reader.ReadInt16(); } public virtual void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(Type); - writer.Write(Layer); + writer.WriteInt16((short)Type); + writer.WriteInt16(Layer); } public override string ToString() diff --git a/Source/SharpNeedle/Framework/LostWorld/Animation/BlenderData.cs b/Source/SharpNeedle/Framework/LostWorld/Animation/BlenderData.cs index e777bef..e055ad8 100644 --- a/Source/SharpNeedle/Framework/LostWorld/Animation/BlenderData.cs +++ b/Source/SharpNeedle/Framework/LostWorld/Animation/BlenderData.cs @@ -9,7 +9,7 @@ public void Read(BinaryObjectReader reader, bool readType) reader.EnsureSignatureNative(1); } - int nodeCount = reader.Read(); + int nodeCount = reader.ReadInt32(); reader.ReadOffset(() => { for (int i = 0; i < nodeCount; i++) @@ -23,10 +23,10 @@ public void Write(BinaryObjectWriter writer, bool writeType) { if (writeType) { - writer.Write(1); + writer.WriteInt32(1); } - writer.Write(Count); + writer.WriteInt32(Count); writer.WriteOffset(() => { foreach (Blender blender in this) @@ -47,15 +47,15 @@ public void Read(BinaryObjectReader reader) { reader.EnsureSignatureNative(0); Name = reader.ReadStringOffset(); - Weight = reader.Read(); + Weight = reader.ReadSingle(); Nodes = reader.ReadObject>(); } public void Write(BinaryObjectWriter writer) { - writer.Write(0); + writer.WriteInt32(0); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(Weight); + writer.WriteSingle(Weight); writer.WriteObject>(Nodes); } @@ -68,15 +68,15 @@ public struct Node : IBinarySerializable public void Read(BinaryObjectReader reader) { Name = reader.ReadStringOffset(); - Weight = reader.Read(); - Priority = reader.Read(); + Weight = reader.ReadSingle(); + Priority = reader.ReadInt32(); } public readonly void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(Weight); - writer.Write(Priority); + writer.WriteSingle(Weight); + writer.WriteInt32(Priority); } } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/LostWorld/Animation/CharAnimScript.cs b/Source/SharpNeedle/Framework/LostWorld/Animation/CharAnimScript.cs index 3fe6746..077f21e 100644 --- a/Source/SharpNeedle/Framework/LostWorld/Animation/CharAnimScript.cs +++ b/Source/SharpNeedle/Framework/LostWorld/Animation/CharAnimScript.cs @@ -30,8 +30,8 @@ public override void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, "ANIM"); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, ScriptVersion); - writer.Write((short)CountLayers()); - writer.Write((short)CountTriggers()); + writer.WriteInt16((short)CountLayers()); + writer.WriteInt16((short)CountTriggers()); writer.WriteOffset(() => { diff --git a/Source/SharpNeedle/Framework/LostWorld/Animation/ComplexAnimation.cs b/Source/SharpNeedle/Framework/LostWorld/Animation/ComplexAnimation.cs index e73bfc4..6c21a9e 100644 --- a/Source/SharpNeedle/Framework/LostWorld/Animation/ComplexAnimation.cs +++ b/Source/SharpNeedle/Framework/LostWorld/Animation/ComplexAnimation.cs @@ -22,7 +22,7 @@ public override void Read(BinaryObjectReader reader) Animations = reader.ReadObject>(); reader.ReadOffset(() => { - ComplexDataType type = reader.Read(); + ComplexDataType type = (ComplexDataType)reader.ReadInt32(); switch (type) { case ComplexDataType.SequenceTable: @@ -45,7 +45,7 @@ public override void Write(BinaryObjectWriter writer) base.Write(writer); writer.WriteObject>(Animations); - writer.WriteOffset(() => writer.WriteObject(Data, true)); + writer.WriteObjectOffset(Data, true); } } diff --git a/Source/SharpNeedle/Framework/LostWorld/Animation/InterpolateInfo.cs b/Source/SharpNeedle/Framework/LostWorld/Animation/InterpolateInfo.cs index a0fe14c..c092a72 100644 --- a/Source/SharpNeedle/Framework/LostWorld/Animation/InterpolateInfo.cs +++ b/Source/SharpNeedle/Framework/LostWorld/Animation/InterpolateInfo.cs @@ -9,17 +9,17 @@ public struct InterpolateInfo : IBinarySerializable public void Read(BinaryObjectReader reader) { - reader.Read(out EnterInterpolation); - reader.Read(out ExitInterpolation); - reader.Read(out Time); + EnterInterpolation = (InterpolateMode)reader.ReadInt32(); + ExitInterpolation = (InterpolateMode)reader.ReadInt32(); + Time = reader.ReadSingle(); From = reader.ReadStringOffset(); } public void Write(BinaryObjectWriter writer) { - writer.Write(ref EnterInterpolation); - writer.Write(ref ExitInterpolation); - writer.Write(ref Time); + writer.WriteInt32((int)EnterInterpolation); + writer.WriteInt32((int)ExitInterpolation); + writer.WriteSingle(Time); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, From); } } diff --git a/Source/SharpNeedle/Framework/LostWorld/Animation/PlayModeInfo.cs b/Source/SharpNeedle/Framework/LostWorld/Animation/PlayModeInfo.cs index 15d4ab1..e82484a 100644 --- a/Source/SharpNeedle/Framework/LostWorld/Animation/PlayModeInfo.cs +++ b/Source/SharpNeedle/Framework/LostWorld/Animation/PlayModeInfo.cs @@ -1,10 +1,24 @@ namespace SharpNeedle.Framework.LostWorld.Animation; -public struct PlayModeInfo +public struct PlayModeInfo : IBinarySerializable { public PlayMode Mode; public short RandomMin; public short RandomMax; + + public void Read(BinaryObjectReader reader) + { + Mode = (PlayMode)reader.ReadInt32(); + RandomMin = reader.ReadInt16(); + RandomMax = reader.ReadInt16(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteInt32((int)Mode); + writer.WriteInt16(RandomMin); + writer.WriteInt16(RandomMax); + } } public enum PlayMode diff --git a/Source/SharpNeedle/Framework/LostWorld/Animation/SequenceTable.cs b/Source/SharpNeedle/Framework/LostWorld/Animation/SequenceTable.cs index cddddb5..bb88bb9 100644 --- a/Source/SharpNeedle/Framework/LostWorld/Animation/SequenceTable.cs +++ b/Source/SharpNeedle/Framework/LostWorld/Animation/SequenceTable.cs @@ -12,8 +12,8 @@ public void Read(BinaryObjectReader reader, bool readType) } Clear(); - PlayMode = reader.Read(); - int seqCount = reader.Read(); + PlayMode = reader.ReadObject(); + int seqCount = reader.ReadInt32(); if (seqCount == 0) { return; @@ -32,11 +32,11 @@ public void Write(BinaryObjectWriter writer, bool writeType) { if (writeType) { - writer.Write(0); + writer.WriteInt32(0); } - writer.Write(PlayMode); - writer.Write(Count); + writer.WriteObject(PlayMode); + writer.WriteInt32(Count); writer.WriteOffset(() => { foreach (string? seq in this) diff --git a/Source/SharpNeedle/Framework/LostWorld/Animation/SimpleAnimation.cs b/Source/SharpNeedle/Framework/LostWorld/Animation/SimpleAnimation.cs index fe8028d..debaf5c 100644 --- a/Source/SharpNeedle/Framework/LostWorld/Animation/SimpleAnimation.cs +++ b/Source/SharpNeedle/Framework/LostWorld/Animation/SimpleAnimation.cs @@ -20,11 +20,11 @@ public override void Read(BinaryObjectReader reader) { base.Read(reader); ResourceName = reader.ReadStringOffset(); - StartFrame = reader.Read(); - EndFrame = reader.Read(); - Speed = reader.Read(); - PlayMode = reader.Read(); - Options = reader.Read(); + StartFrame = reader.ReadSingle(); + EndFrame = reader.ReadSingle(); + Speed = reader.ReadSingle(); + PlayMode = reader.ReadObject(); + Options = (AnimOptions)reader.ReadInt32(); Interpolations = reader.ReadObject>(); Triggers = reader.ReadObject>(); } @@ -33,11 +33,11 @@ public override void Write(BinaryObjectWriter writer) { base.Write(writer); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, ResourceName); - writer.Write(StartFrame); - writer.Write(EndFrame); - writer.Write(Speed); - writer.Write(PlayMode); - writer.Write(Options); + writer.WriteSingle(StartFrame); + writer.WriteSingle(EndFrame); + writer.WriteSingle(Speed); + writer.WriteObject(PlayMode); + writer.WriteInt32((int)Options); writer.WriteObject>(Interpolations); writer.WriteObject>(Triggers); } diff --git a/Source/SharpNeedle/Framework/LostWorld/Animation/TransitionTable.cs b/Source/SharpNeedle/Framework/LostWorld/Animation/TransitionTable.cs index 5e1c88a..f283b8f 100644 --- a/Source/SharpNeedle/Framework/LostWorld/Animation/TransitionTable.cs +++ b/Source/SharpNeedle/Framework/LostWorld/Animation/TransitionTable.cs @@ -5,7 +5,7 @@ public class TransitionTable : Dictionary, IBinarySerializable public void Read(BinaryObjectReader reader) { Clear(); - int count = reader.Read(); + int count = reader.ReadInt32(); reader.ReadOffset(() => { for (int i = 0; i < count; i++) @@ -17,7 +17,7 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { - writer.Write(Count); + writer.WriteInt32(Count); writer.WriteOffset(() => { diff --git a/Source/SharpNeedle/Framework/LostWorld/Animation/TriggerInfo.cs b/Source/SharpNeedle/Framework/LostWorld/Animation/TriggerInfo.cs index 3ac552a..9a05cf4 100644 --- a/Source/SharpNeedle/Framework/LostWorld/Animation/TriggerInfo.cs +++ b/Source/SharpNeedle/Framework/LostWorld/Animation/TriggerInfo.cs @@ -10,16 +10,16 @@ public struct TriggerInfo : IBinarySerializable public void Read(BinaryObjectReader reader) { - reader.Read(out Frame); - reader.Read(out ID); - reader.ReadObject(ref Param); + Frame = reader.ReadSingle(); + ID = reader.ReadUInt32(); + Param = reader.ReadObject(); } public void Write(BinaryObjectWriter writer) { - writer.Write(ref Frame); - writer.Write(ref ID); - Param.Write(writer); + writer.WriteSingle(Frame); + writer.WriteUInt32(ID); + writer.WriteObject(Param); } public struct CallbackParam : IBinarySerializable @@ -56,16 +56,16 @@ public CallbackParam(string value) public void Read(BinaryObjectReader reader) { - reader.Read(out Type); + Type = (TriggerValueType)reader.ReadInt32(); switch (Type) { case TriggerValueType.Enum: case TriggerValueType.Int: - reader.Read(out Integer); + Integer = reader.ReadInt32(); break; case TriggerValueType.Float: - reader.Read(out Float); + Float = reader.ReadSingle(); break; case TriggerValueType.String: @@ -76,16 +76,16 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { - writer.Write(Type); + writer.WriteInt32((int)Type); switch (Type) { case TriggerValueType.Enum: case TriggerValueType.Int: - writer.Write(Integer); + writer.WriteInt32(Integer); break; case TriggerValueType.Float: - writer.Write(ref Float); + writer.WriteSingle(Float); break; case TriggerValueType.String: diff --git a/Source/SharpNeedle/Framework/LostWorld/ShadowModel.cs b/Source/SharpNeedle/Framework/LostWorld/ShadowModel.cs index c834fae..a33e6d7 100644 --- a/Source/SharpNeedle/Framework/LostWorld/ShadowModel.cs +++ b/Source/SharpNeedle/Framework/LostWorld/ShadowModel.cs @@ -6,6 +6,15 @@ namespace SharpNeedle.Framework.LostWorld; public class ShadowModel : BinaryResource { public new static readonly uint Signature = BinaryHelper.MakeSignature("SVLM"); + + private static readonly ushort[] _unusedData = [ + 0, 0, 2, 0, + 0, 12, 2, 3, + 0, 24, 8, 1, + 0, 28, 5, 2, + 255, 0, 17, 0, + ]; + public List Meshes { get; set; } = []; public override void Read(BinaryObjectReader reader) @@ -18,42 +27,16 @@ public override void Read(BinaryObjectReader reader) public override void Write(BinaryObjectWriter writer) { - writer.Write(Signature); - writer.Write(1); // Version + writer.WriteUInt32(Signature); + writer.WriteInt32(1); // Version writer.WriteObject>(Meshes); // Unused data, probably means something - writer.Write(5); - writer.WriteOffset(() => - { - writer.Write(0); - writer.Write(0); - writer.Write(2); - writer.Write(0); - - writer.Write(0); - writer.Write(12); - writer.Write(2); - writer.Write(3); - - writer.Write(0); - writer.Write(24); - writer.Write(8); - writer.Write(1); - - writer.Write(0); - writer.Write(28); - writer.Write(5); - writer.Write(2); - - writer.Write(255); - writer.Write(0); - writer.Write(17); - writer.Write(0); - }, 16); - - writer.Write(0); + writer.WriteInt32(_unusedData.Length / 4); + writer.WriteArrayOffset(_unusedData, 16); + + writer.WriteInt32(0); } } @@ -65,11 +48,11 @@ public class ShadowMesh : IBinarySerializable public void Read(BinaryObjectReader reader) { - Indices = reader.ReadArrayOffset(reader.Read()); + Indices = reader.ReadArrayOffset(reader.ReadInt32()); reader.Skip(4); - Vertices = reader.ReadArrayOffset(reader.Read()); + Vertices = reader.ReadObjectArrayOffset(reader.ReadInt32()); reader.Skip(4); - int bufferCount = reader.Read(); + int bufferCount = reader.ReadInt32(); reader.ReadOffset(() => { for (int i = 0; i < bufferCount; i++) @@ -83,13 +66,19 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { - writer.Write(Indices.Length); + writer.WriteInt32(Indices.Length); writer.WriteArrayOffset(Indices, 16); - writer.Write(0); - writer.Write(Vertices.Length); - writer.WriteArrayOffset(Vertices, 16); - writer.Write(0); - writer.Write(Buffers.Count); + writer.WriteInt32(0); + writer.WriteInt32(Vertices.Length); + + writer.WriteOffset(() => + { + writer.WriteObjectCollection(Vertices); + writer.Align(16); + }); + + writer.WriteInt32(0); + writer.WriteInt32(Buffers.Count); writer.WriteOffset(() => { foreach (ShadowPrimitiveBuffer buffer in Buffers) @@ -111,33 +100,49 @@ public class ShadowPrimitiveBuffer : IBinarySerializable public void Read(BinaryObjectReader reader) { - PrimitiveType = reader.Read(); + PrimitiveType = (ShadowPrimitiveType)reader.ReadInt32(); IndexOffset = reader.ReadInt32(); IndexCount = reader.ReadInt32(); VertexOffset = reader.ReadInt32(); VertexStride = reader.ReadInt32(); - BonePalette = reader.ReadArrayOffset(reader.Read()); + BonePalette = reader.ReadArrayOffset(reader.ReadInt32()); } public void Write(BinaryObjectWriter writer) { - writer.Write(PrimitiveType); - writer.Write(IndexOffset); - writer.Write(IndexCount); - writer.Write(VertexOffset); - writer.Write(VertexStride); - writer.Write(BonePalette.Length); + writer.WriteInt32((int)PrimitiveType); + writer.WriteInt32(IndexOffset); + writer.WriteInt32(IndexCount); + writer.WriteInt32(VertexOffset); + writer.WriteInt32(VertexStride); + writer.WriteInt32(BonePalette.Length); writer.WriteArrayOffset(BonePalette, 16); } } -public struct ShadowVertex +public struct ShadowVertex : IBinarySerializable { public Vector3 Position; public Vector3 Normal; public int BlendWeight; public int BlendIndices; + public void Read(BinaryObjectReader reader) + { + Position = reader.ReadVector3(); + Normal = reader.ReadVector3(); + BlendWeight = reader.ReadInt32(); + BlendIndices = reader.ReadInt32(); + } + + public readonly void Write(BinaryObjectWriter writer) + { + writer.WriteVector3(Position); + writer.WriteVector3(Normal); + writer.WriteInt32(BlendWeight); + writer.WriteInt32(BlendIndices); + } + public void AddBlendWeight(int weight, int index) { for (int i = 0; i < 4; i++) diff --git a/Source/SharpNeedle/Framework/Ninja/ChunkHeader.cs b/Source/SharpNeedle/Framework/Ninja/ChunkHeader.cs index f914f28..15ae423 100644 --- a/Source/SharpNeedle/Framework/Ninja/ChunkHeader.cs +++ b/Source/SharpNeedle/Framework/Ninja/ChunkHeader.cs @@ -1,9 +1,21 @@ namespace SharpNeedle.Framework.Ninja; [StructLayout(LayoutKind.Sequential, Size = BinarySize)] -public struct ChunkHeader +public struct ChunkHeader : IBinarySerializable { public const int BinarySize = 8; public uint Signature; public int Size; + + public void Read(BinaryObjectReader reader) + { + Signature = reader.ReadLittle(); + Size = reader.ReadLittle(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteLittle(Signature); + writer.WriteLittle(Size); + } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/Cast.cs b/Source/SharpNeedle/Framework/Ninja/Csd/Cast.cs index 2426f2f..72f8b20 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/Cast.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/Cast.cs @@ -53,20 +53,20 @@ public int Priority public void Read(BinaryObjectReader reader, Family family) { - Field00 = reader.Read(); - Type = reader.Read(); - Enabled = reader.Read() != 0; + Field00 = reader.ReadUInt32(); + Type = (EType)reader.ReadInt32(); + Enabled = reader.ReadInt32() != 0; - TopLeft = reader.Read(); - BottomLeft = reader.Read(); - TopRight = reader.Read(); - BottomRight = reader.Read(); + TopLeft = reader.ReadVector2(); + BottomLeft = reader.ReadVector2(); + TopRight = reader.ReadVector2(); + BottomRight = reader.ReadVector2(); - Field2C = reader.Read>(); + Field2C = reader.ReadObject>(); Info = reader.ReadObjectOffset(); - InheritanceFlags = reader.Read>(); - MaterialFlags = reader.Read>(); - SpriteIndices = reader.ReadArrayOffset(reader.Read()); + InheritanceFlags = reader.ReadObject>(); + MaterialFlags = reader.ReadObject>(); + SpriteIndices = reader.ReadArrayOffset(reader.ReadInt32()); Text = reader.ReadStringOffset(); FontName = reader.ReadStringOffset(); @@ -79,39 +79,39 @@ public void Read(BinaryObjectReader reader, Family family) if (family.Scene.Version >= 3) { - Width = reader.Read(); - Height = reader.Read(); - Field58 = reader.Read(); - Field5C = reader.Read(); - - Origin = reader.Read(); - Position = reader.Read(); - Field70 = reader.Read(); + Width = reader.ReadUInt32(); + Height = reader.ReadUInt32(); + Field58 = reader.ReadUInt32(); + Field5C = reader.ReadUInt32(); + + Origin = reader.ReadVector2(); + Position = reader.ReadVector2(); + Field70 = reader.ReadUInt32(); } } public void Write(BinaryObjectWriter writer, Family? family) { - writer.Write(Field00); - writer.Write(Type); - writer.Write(Convert.ToInt32(Enabled)); + writer.WriteUInt32(Field00); + writer.WriteInt32((int)Type); + writer.WriteInt32(Convert.ToInt32(Enabled)); - writer.Write(TopLeft); - writer.Write(BottomLeft); - writer.Write(TopRight); - writer.Write(BottomRight); + writer.WriteVector2(TopLeft); + writer.WriteVector2(BottomLeft); + writer.WriteVector2(TopRight); + writer.WriteVector2(BottomRight); - writer.Write(Field2C); + writer.WriteObject(Field2C); // Info is written after the sprite indices, despite appearing in the struct earlier. long infoOffset = writer.Position; writer.OffsetHandler.RegisterOffsetPosition(infoOffset); writer.WriteOffsetValue(0); - writer.Write(InheritanceFlags); - writer.Write(MaterialFlags); + writer.WriteObject(InheritanceFlags); + writer.WriteObject(MaterialFlags); - writer.Write(SpriteIndices.Length); + writer.WriteInt32(SpriteIndices.Length); writer.WriteOffset(() => { writer.WriteArray(SpriteIndices); @@ -130,7 +130,7 @@ public void Write(BinaryObjectWriter writer, Family? family) writer.WriteOffset(() => { writer.WriteString(StringBinaryFormat.NullTerminated, Text); - writer.Write(0); + writer.WriteByte(0); }); } else @@ -143,7 +143,7 @@ public void Write(BinaryObjectWriter writer, Family? family) writer.WriteOffset(() => { writer.WriteString(StringBinaryFormat.NullTerminated, FontName); - writer.Write(0); + writer.WriteByte(0); }); } else @@ -151,7 +151,7 @@ public void Write(BinaryObjectWriter writer, Family? family) writer.WriteOffsetValue(0); } - writer.Write(FontKerning); + writer.WriteSingle(FontKerning); family ??= Family; @@ -167,14 +167,14 @@ public void Write(BinaryObjectWriter writer, Family? family) if (family.Scene.Version >= 3) { - writer.Write(Width); - writer.Write(Height); - writer.Write(Field58); - writer.Write(Field5C); - - writer.Write(Origin); - writer.Write(Position); - writer.Write(Field70); + writer.WriteSingle(Width); + writer.WriteSingle(Height); + writer.WriteSingle(Field58); + writer.WriteSingle(Field5C); + + writer.WriteVector2(Origin); + writer.WriteVector2(Position); + writer.WriteSingle(Field70); } } diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/CastInfo.cs b/Source/SharpNeedle/Framework/Ninja/Csd/CastInfo.cs index a7759da..f8fe19d 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/CastInfo.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/CastInfo.cs @@ -21,41 +21,41 @@ public struct CastInfo : IBinarySerializable public void Read(BinaryObjectReader reader) { - HideFlag = reader.Read(); - Translation = reader.Read(); - Rotation = reader.Read(); - Scale = reader.Read(); - SpriteIndex = reader.Read(); + HideFlag = reader.ReadUInt32(); + Translation = reader.ReadVector2(); + Rotation = reader.ReadSingle(); + Scale = reader.ReadVector2(); + SpriteIndex = reader.ReadSingle(); // Colours are handled as uints for endianness - Unsafe.As, uint>(ref Color) = reader.Read(); - Unsafe.As, uint>(ref GradientTopLeft) = reader.Read(); - Unsafe.As, uint>(ref GradientBottomLeft) = reader.Read(); - Unsafe.As, uint>(ref GradientTopRight) = reader.Read(); - Unsafe.As, uint>(ref GradientBottomRight) = reader.Read(); - - UserData0 = reader.Read(); - UserData1 = reader.Read(); - UserData2 = reader.Read(); + Unsafe.As, uint>(ref Color) = reader.ReadUInt32(); + Unsafe.As, uint>(ref GradientTopLeft) = reader.ReadUInt32(); + Unsafe.As, uint>(ref GradientBottomLeft) = reader.ReadUInt32(); + Unsafe.As, uint>(ref GradientTopRight) = reader.ReadUInt32(); + Unsafe.As, uint>(ref GradientBottomRight) = reader.ReadUInt32(); + + UserData0 = reader.ReadUInt32(); + UserData1 = reader.ReadUInt32(); + UserData2 = reader.ReadUInt32(); } public void Write(BinaryObjectWriter writer) { - writer.Write(HideFlag); - writer.Write(Translation); - writer.Write(Rotation); - writer.Write(Scale); - writer.Write(SpriteIndex); + writer.WriteUInt32(HideFlag); + writer.WriteVector2(Translation); + writer.WriteSingle(Rotation); + writer.WriteVector2(Scale); + writer.WriteSingle(SpriteIndex); // Colours are handled as uints for endianness - writer.Write(Unsafe.As, uint>(ref Color)); - writer.Write(Unsafe.As, uint>(ref GradientTopLeft)); - writer.Write(Unsafe.As, uint>(ref GradientBottomLeft)); - writer.Write(Unsafe.As, uint>(ref GradientTopRight)); - writer.Write(Unsafe.As, uint>(ref GradientBottomRight)); - - writer.Write(UserData0); - writer.Write(UserData1); - writer.Write(UserData2); + writer.WriteUInt32(Unsafe.As, uint>(ref Color)); + writer.WriteUInt32(Unsafe.As, uint>(ref GradientTopLeft)); + writer.WriteUInt32(Unsafe.As, uint>(ref GradientBottomLeft)); + writer.WriteUInt32(Unsafe.As, uint>(ref GradientTopRight)); + writer.WriteUInt32(Unsafe.As, uint>(ref GradientBottomRight)); + + writer.WriteUInt32(UserData0); + writer.WriteUInt32(UserData1); + writer.WriteUInt32(UserData2); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/CastInfoTable.cs b/Source/SharpNeedle/Framework/Ninja/Csd/CastInfoTable.cs index aac7cb9..29171b7 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/CastInfoTable.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/CastInfoTable.cs @@ -4,7 +4,7 @@ public class CastInfoTable : List<(string? Name, int FamilyIdx, int CastIdx)>, I { public void Read(BinaryObjectReader reader) { - int count = reader.Read(); + int count = reader.ReadInt32(); if (count == 0) { reader.Skip(reader.GetOffsetSize()); @@ -15,14 +15,14 @@ public void Read(BinaryObjectReader reader) { for (int i = 0; i < count; i++) { - Add(new(reader.ReadStringOffset(), reader.Read(), reader.Read())); + Add(new(reader.ReadStringOffset(), reader.ReadInt32(), reader.ReadInt32())); } }); } public void Write(BinaryObjectWriter writer) { - writer.Write(Count); + writer.WriteInt32(Count); if (Count == 0) { @@ -38,10 +38,10 @@ public void Write(BinaryObjectWriter writer) writer.WriteOffset(() => { writer.WriteString(StringBinaryFormat.NullTerminated, Name); - writer.Write(0); + writer.WriteByte(0); }); - writer.Write(FamilyIdx); - writer.Write(CastIdx); + writer.WriteInt32(FamilyIdx); + writer.WriteInt32(CastIdx); } }); } diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/CharacterMapping.cs b/Source/SharpNeedle/Framework/Ninja/Csd/CharacterMapping.cs index 18fd9f5..23b8b92 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/CharacterMapping.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/CharacterMapping.cs @@ -1,7 +1,19 @@ namespace SharpNeedle.Framework.Ninja.Csd; -public struct CharacterMapping +public struct CharacterMapping : IBinarySerializable { public int SourceIndex; public int DestinationIndex; + + public void Read(BinaryObjectReader reader) + { + SourceIndex = reader.ReadInt32(); + DestinationIndex = reader.ReadInt32(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteInt32(SourceIndex); + writer.WriteInt32(DestinationIndex); + } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/CsdDictionary.cs b/Source/SharpNeedle/Framework/Ninja/Csd/CsdDictionary.cs index 75bbe5e..8dc047a 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/CsdDictionary.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/CsdDictionary.cs @@ -72,7 +72,7 @@ public bool Remove(KeyValuePair item) public void Read(BinaryObjectReader reader) { - int count = reader.Read(); + int count = reader.ReadInt32(); if (count == 0) { reader.Skip(reader.GetOffsetSize() * 2); @@ -87,13 +87,13 @@ public void Write(BinaryObjectWriter writer) { if (Items?.Count is null or 0) { - writer.Write(0); + writer.WriteInt32(0); writer.WriteOffsetValue(0); writer.WriteOffsetValue(0); return; } - writer.Write(NameTable.Count); + writer.WriteInt32(NameTable.Count); writer.WriteObjectCollectionOffset(Items); writer.WriteObjectCollectionOffset(NameTable); } @@ -232,7 +232,7 @@ public NameIndexPair(string? name, int idx) public void Read(BinaryObjectReader reader) { Name = reader.ReadStringOffset(); - Index = reader.Read(); + Index = reader.ReadInt32(); } public void Write(BinaryObjectWriter writer) @@ -242,9 +242,9 @@ public void Write(BinaryObjectWriter writer) writer.WriteOffset(() => { writer.WriteString(StringBinaryFormat.NullTerminated, name); - writer.Write(0); + writer.WriteByte(0); }); - writer.Write(ref Index); + writer.WriteInt32(Index); } internal class Comparer : IComparer diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/CsdPackage.cs b/Source/SharpNeedle/Framework/Ninja/Csd/CsdPackage.cs index 29067dc..ed499a5 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/CsdPackage.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/CsdPackage.cs @@ -65,17 +65,17 @@ public void Read(BinaryObjectReader reader) reader.Endianness = Endianness; while (reader.Position < reader.Length) { - Files.Add(reader.ReadArray(reader.Read())); + Files.Add(reader.ReadArray(reader.ReadInt32())); } } public void Write(BinaryObjectWriter writer) { writer.Endianness = Endianness; - writer.Write(Signature); + writer.WriteNative(Signature); foreach (byte[] file in Files) { - writer.Write(file.Length); + writer.WriteInt32(file.Length); writer.WriteArray(file); } } diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/CsdProject.cs b/Source/SharpNeedle/Framework/Ninja/Csd/CsdProject.cs index 35a586f..baff78f 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/CsdProject.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/CsdProject.cs @@ -34,7 +34,10 @@ public void Read(BinaryObjectReader reader) for (int i = 0; i < Package.Files.Count; i++) { if (Package.Files[i].Length == 0) + { continue; + } + Stream stream = Package.GetStream(i); using BinaryObjectReader infoReader = new(stream, StreamOwnership.Transfer, Package.Endianness); try diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/Family.cs b/Source/SharpNeedle/Framework/Ninja/Csd/Family.cs index bdfa338..b24b809 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/Family.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/Family.cs @@ -21,7 +21,7 @@ public void AttachMotion(FamilyMotion motion) public void Read(BinaryObjectReader reader, Scene context) { Scene = context; - int castCount = reader.Read(); + int castCount = reader.ReadInt32(); CastBuffer = new List(castCount); reader.ReadOffset(() => { @@ -31,8 +31,8 @@ public void Read(BinaryObjectReader reader, Scene context) } }); - int root = reader.Read(); - TreeDescriptorNode[] tree = reader.ReadArrayOffset(CastBuffer.Count); + int root = reader.ReadInt32(); + TreeDescriptorNode[] tree = reader.ReadObjectArrayOffset(CastBuffer.Count); if (CastBuffer.Count != 0) { ParseTree(root); @@ -74,7 +74,7 @@ void ParseTree(int idx, int p = -1) public void Write(BinaryObjectWriter writer, Scene context) { - writer.Write(CastBuffer.Count); + writer.WriteInt32(CastBuffer.Count); writer.WriteOffset(() => { foreach (Cast cast in CastBuffer) @@ -83,7 +83,7 @@ public void Write(BinaryObjectWriter writer, Scene context) } }); - writer.Write(0); + writer.WriteInt32(0); TreeDescriptorNode[] nodes = new TreeDescriptorNode[CastBuffer.Count]; @@ -95,7 +95,7 @@ public void Write(BinaryObjectWriter writer, Scene context) BuildTree(Children); - writer.WriteArrayOffset(nodes); + writer.WriteObjectCollectionOffset(nodes); void BuildTree(IList casts) { @@ -254,7 +254,7 @@ public Cast this[int index] set => Children[index] = value; } - internal struct TreeDescriptorNode + internal struct TreeDescriptorNode : IBinarySerializable { public int ChildIndex; public int SiblingIndex; @@ -265,6 +265,18 @@ public TreeDescriptorNode() SiblingIndex = -1; } + public void Read(BinaryObjectReader reader) + { + ChildIndex = reader.ReadInt32(); + SiblingIndex = reader.ReadInt32(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteInt32(ChildIndex); + writer.WriteInt32(SiblingIndex); + } + public override readonly string ToString() { return $"{{ ChildIndex: {ChildIndex}, SiblingIndex: {SiblingIndex} }}"; diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/Font.cs b/Source/SharpNeedle/Framework/Ninja/Csd/Font.cs index 2598577..af9aa9b 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/Font.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/Font.cs @@ -5,13 +5,13 @@ public class Font : List, IBinarySerializable public void Read(BinaryObjectReader reader) { Clear(); - Capacity = reader.Read(); - AddRange(reader.ReadArrayOffset(Capacity)); + Capacity = reader.ReadInt32(); + AddRange(reader.ReadObjectArrayOffset(Capacity)); } public void Write(BinaryObjectWriter writer) { - writer.Write(Count); - writer.WriteCollectionOffset(this); + writer.WriteInt32(Count); + writer.WriteObjectCollectionOffset(this); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/AspectRatioCorrection.cs b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/AspectRatioCorrection.cs index b169580..c12e1c2 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/AspectRatioCorrection.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/AspectRatioCorrection.cs @@ -1,8 +1,20 @@ namespace SharpNeedle.Framework.Ninja.Csd.Motions; [StructLayout(LayoutKind.Sequential)] -public struct AspectRatioCorrection +public struct AspectRatioCorrection : IBinarySerializable { public Vector2 Center; public float Offset; + + public void Read(BinaryObjectReader reader) + { + Center = reader.ReadVector2(); + Offset = reader.ReadSingle(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteVector2(Center); + writer.WriteSingle(Offset); + } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/CastMotion.cs b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/CastMotion.cs index e2d36cd..cf38306 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/CastMotion.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/CastMotion.cs @@ -18,7 +18,7 @@ public CastMotion(Cast cast) public void Read(BinaryObjectReader reader) { Clear(); - Flags = reader.Read>(); + Flags = reader.ReadObject>(); int count = Flags.PopCount(); if (count == 0) @@ -48,7 +48,7 @@ public void Write(BinaryObjectWriter writer) { if (Count == 0) { - writer.Write(0); + writer.WriteInt32(0); writer.WriteOffsetValue(0); return; } @@ -59,7 +59,7 @@ public void Write(BinaryObjectWriter writer) Flags.Set((int)list.Property); } - writer.Write(Flags); + writer.WriteObject(Flags); writer.WriteObjectCollectionOffset(this); } diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/InterpolationType.cs b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/InterpolationType.cs index 9f33d27..2197065 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/InterpolationType.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/InterpolationType.cs @@ -2,5 +2,7 @@ public enum InterpolationType : uint { - Const, Linear, Hermite + Const, + Linear, + Hermite } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/KeyFrame.cs b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/KeyFrame.cs index 9cb19a2..764df00 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/KeyFrame.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/KeyFrame.cs @@ -14,22 +14,22 @@ public class KeyFrame : IBinarySerializable public void Read(BinaryObjectReader reader) { - Frame = reader.Read(); - Value = reader.Read(); - Interpolation = reader.Read(); - InTangent = reader.Read(); - OutTangent = reader.Read(); - Field14 = reader.Read(); + Frame = reader.ReadInt32(); + Value = reader.ReadUInt32(); + Interpolation = (InterpolationType)reader.ReadUInt32(); + InTangent = reader.ReadSingle(); + OutTangent = reader.ReadSingle(); + Field14 = reader.ReadUInt32(); } public void Write(BinaryObjectWriter writer) { - writer.Write(Frame); - writer.Write(Value.Uint); - writer.Write(Interpolation); - writer.Write(InTangent); - writer.Write(OutTangent); - writer.Write(Field14); + writer.WriteInt32(Frame); + writer.WriteUInt32(Value.Uint); + writer.WriteUInt32((uint)Interpolation); + writer.WriteSingle(InTangent); + writer.WriteSingle(OutTangent); + writer.WriteUInt32(Field14); } [StructLayout(LayoutKind.Explicit, Size = 4)] diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/KeyFrameList.cs b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/KeyFrameList.cs index 1540124..b241bf3 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/KeyFrameList.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/KeyFrameList.cs @@ -11,15 +11,14 @@ public class KeyFrameList : IBinarySerializable, IList public void Read(BinaryObjectReader reader) { - Field00 = reader.Read(); - Frames = new List(reader.ReadObjectArrayOffset(reader.Read())); + Field00 = reader.ReadUInt32(); + Frames = [.. reader.ReadObjectArrayOffset(reader.ReadInt32())]; } public void Write(BinaryObjectWriter writer) { - writer.Write(Field00); - writer.Write(Frames.Count); - + writer.WriteUInt32(Field00); + writer.WriteInt32(Frames.Count); writer.WriteObjectCollectionOffset(Frames); } @@ -33,7 +32,7 @@ public void ReadExtended(BinaryObjectReader reader) long offset = reader.ReadOffsetValue(); if (offset != 0) { - frame.Correction = reader.ReadValueAtOffset(offset); + frame.Correction = reader.ReadObjectAtOffset(offset); } } })); @@ -48,7 +47,7 @@ public void WriteExtended(BinaryObjectWriter writer) { if (frame.Correction.HasValue) { - writer.WriteOffset(() => writer.Write(frame.Correction.Value)); + writer.WriteObjectOffset(frame.Correction.Value); } else { diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/Motion.cs b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/Motion.cs index e51245f..b599dd9 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/Motions/Motion.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/Motions/Motion.cs @@ -80,7 +80,7 @@ public void ReadExtended(BinaryObjectReader reader) { reader.ReadOffset(() => { - int unused = reader.Read(); + int unused = reader.ReadInt32(); reader.ReadOffset(() => { @@ -96,7 +96,7 @@ public void WriteExtended(BinaryObjectWriter writer) { writer.WriteOffset(() => { - writer.Write(0); + writer.WriteInt32(0); writer.WriteOffset(() => { diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/ProjectChunk.cs b/Source/SharpNeedle/Framework/Ninja/Csd/ProjectChunk.cs index 5a9b22e..f39c581 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/ProjectChunk.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/ProjectChunk.cs @@ -15,28 +15,28 @@ public class ProjectChunk : IChunk public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { - options.Header ??= reader.ReadLittle(); + options.Header ??= reader.ReadObject(); Signature = options.Header.Value.Signature; - Field08 = reader.Read(); - Field0C = reader.Read(); + Field08 = reader.ReadUInt32(); + Field0C = reader.ReadUInt32(); Root = reader.ReadObjectOffset(); Name = reader.ReadStringOffset(); - TextureFormat = reader.Read(); + TextureFormat = (TextureFormat)reader.ReadInt32(); Fonts = reader.ReadObjectOffset(); } public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { writer.WriteLittle(Signature); - writer.Write(0); // Size + writer.WriteLittle(0); // Size SeekToken start = writer.At(); - writer.Write(Field08); - writer.Write(Field0C); + writer.WriteUInt32(Field08); + writer.WriteUInt32(Field0C); writer.WriteObjectOffset(Root); - writer.WriteOffset(() => writer.WriteString(StringBinaryFormat.NullTerminated, Name)); - writer.Write(TextureFormat); + writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); + writer.WriteInt32((int)TextureFormat); writer.WriteObjectOffset(Fonts); writer.Flush(); writer.Align(16); diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/Scene.cs b/Source/SharpNeedle/Framework/Ninja/Csd/Scene.cs index ac9bd33..fac68f6 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/Scene.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/Scene.cs @@ -1,7 +1,6 @@ namespace SharpNeedle.Framework.Ninja.Csd; using SharpNeedle.Framework.Ninja.Csd.Motions; -using FrameInfo = ValueTuple; public class Scene : IBinarySerializable { @@ -16,15 +15,18 @@ public class Scene : IBinarySerializable public void Read(BinaryObjectReader reader) { - Version = reader.Read(); - Priority = reader.Read(); - FrameRate = reader.Read(); - float motionBegin = reader.Read(); - float motionEnd = reader.Read(); - Textures = new List(reader.ReadArrayOffset(reader.Read())); - Sprites = new List(reader.ReadArrayOffset(reader.Read())); - - int familyCount = reader.Read(); + Version = reader.ReadInt32(); + Priority = reader.ReadSingle(); + FrameRate = reader.ReadSingle(); + float motionBegin = reader.ReadSingle(); + float motionEnd = reader.ReadSingle(); + + int texturesCount = reader.ReadInt32(); + reader.ReadOffset(() => Textures = [.. reader.ReadVector2Array(texturesCount)]); + + Sprites = [.. reader.ReadObjectArrayOffset(reader.ReadInt32())]; + + int familyCount = reader.ReadInt32(); Families = new List(familyCount); reader.ReadOffset(() => { @@ -50,17 +52,19 @@ public void Read(BinaryObjectReader reader) if (Version >= 1) { - AspectRatio = reader.Read(); + AspectRatio = reader.ReadSingle(); } if (Version >= 2) { - (float, float)[] frameInfo = reader.ReadArrayOffset(Motions.Count); - for (int i = 0; i < Motions.Count; i++) + reader.ReadOffset(() => { - Motions[i].StartFrame = frameInfo[i].Item1; - Motions[i].EndFrame = frameInfo[i].Item2; - } + for(int i = 0; i < Motions.Count; i++) + { + Motions[i].StartFrame = reader.ReadSingle(); + Motions[i].EndFrame = reader.ReadSingle(); + } + }); } if (Version >= 3) @@ -82,19 +86,19 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { - writer.Write(Version); - writer.Write(Priority); - writer.Write(FrameRate); - writer.Write(Motions.Count != 0 ? Motions.Min(x => x.Value.StartFrame) : 0); - writer.Write(Motions.Count != 0 ? Motions.Max(x => x.Value.EndFrame) : 0); + writer.WriteInt32(Version); + writer.WriteSingle(Priority); + writer.WriteSingle(FrameRate); + writer.WriteSingle(Motions.Count != 0 ? Motions.Min(x => x.Value.StartFrame) : 0); + writer.WriteSingle(Motions.Count != 0 ? Motions.Max(x => x.Value.EndFrame) : 0); - writer.Write(Textures.Count); - writer.WriteArrayOffset(CollectionsMarshal.AsSpan(Textures).AsMemory()); + writer.WriteInt32(Textures.Count); + writer.WriteOffset(() => writer.WriteVector2Array(Textures.ToArray())); - writer.Write(Sprites.Count); - writer.WriteArrayOffset(CollectionsMarshal.AsSpan(Sprites).AsMemory()); + writer.WriteInt32(Sprites.Count); + writer.WriteObjectCollectionOffset(Sprites); - writer.Write(Families.Count); + writer.WriteInt32(Families.Count); writer.WriteOffset(() => { foreach (Family family in Families) @@ -108,7 +112,7 @@ public void Write(BinaryObjectWriter writer) if (Version >= 1) { - writer.Write(AspectRatio); + writer.WriteSingle(AspectRatio); } if (Version >= 2) @@ -117,7 +121,8 @@ public void Write(BinaryObjectWriter writer) { for (int i = 0; i < Motions.Count; i++) { - writer.Write(new FrameInfo(Motions[i].StartFrame, Motions[i].EndFrame)); + writer.WriteSingle(Motions[i].StartFrame); + writer.WriteSingle(Motions[i].EndFrame); } }); } diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/Sprite.cs b/Source/SharpNeedle/Framework/Ninja/Csd/Sprite.cs index 60faa02..a226c3f 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/Sprite.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/Sprite.cs @@ -1,6 +1,6 @@ namespace SharpNeedle.Framework.Ninja.Csd; -public struct Sprite +public struct Sprite : IBinarySerializable { public int TextureIndex; public Vector2 TopLeft; @@ -12,4 +12,19 @@ public Sprite() TextureIndex = default; BottomRight = new(1, 1); } + + public void Read(BinaryObjectReader reader) + { + TextureIndex = reader.ReadInt32(); + TopLeft = reader.ReadVector2(); + BottomRight = reader.ReadVector2(); + + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteInt32(TextureIndex); + writer.WriteVector2(TopLeft); + writer.WriteVector2(BottomRight); + } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/TextureListMirage.cs b/Source/SharpNeedle/Framework/Ninja/Csd/TextureListMirage.cs index 49f9214..0fc3b7d 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/TextureListMirage.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/TextureListMirage.cs @@ -11,7 +11,7 @@ public class TextureListMirage : ITextureList public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { - options.Header ??= reader.ReadLittle(); + options.Header ??= reader.ReadObject(); Signature = options.Header.Value.Signature; Textures.Clear(); @@ -47,17 +47,17 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) } } }); - FieldC = reader.Read(); + FieldC = reader.ReadUInt32(); } public void Write(BinaryObjectWriter writer, ChunkBinaryOptions context) { writer.WriteLittle(Signature); - writer.Write(0); + writer.WriteLittle(0); SeekToken start = writer.At(); - writer.Write(0x10); // List offset, untracked - writer.Write(FieldC); + writer.WriteInt32(0x10); // List offset, untracked + writer.WriteUInt32(FieldC); int memoryTextureCount = 0; foreach (TextureMirage texture in Textures) { @@ -79,7 +79,7 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions context) continue; } - writer.Write(texture.Data.Length); + writer.WriteInt32(texture.Data.Length); writer.WriteArrayOffset(texture.Data); } }); diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/TextureListNN.cs b/Source/SharpNeedle/Framework/Ninja/Csd/TextureListNN.cs index e28f13d..ce983e6 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/TextureListNN.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/TextureListNN.cs @@ -11,22 +11,22 @@ public class TextureListNN : ITextureList public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { - options.Header ??= reader.ReadLittle(); + options.Header ??= reader.ReadObject(); Signature = options.Header.Value.Signature; Textures.Clear(); reader.ReadOffset(() => Textures.AddRange(reader.ReadObject>())); - FieldC = reader.Read(); + FieldC = reader.ReadUInt32(); } public void Write(BinaryObjectWriter writer, ChunkBinaryOptions context) { writer.WriteLittle(Signature); - writer.Write(0); + writer.WriteLittle(0); SeekToken start = writer.At(); - writer.Write(0x10); // List offset, untracked - writer.Write(FieldC); + writer.WriteInt32(0x10); // List offset, untracked + writer.WriteUInt32(FieldC); writer.WriteObject>(Textures); diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/TextureMirage.cs b/Source/SharpNeedle/Framework/Ninja/Csd/TextureMirage.cs index bbb7a71..b904c50 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/TextureMirage.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/TextureMirage.cs @@ -19,7 +19,7 @@ public TextureMirage(string name) public void Read(BinaryObjectReader reader) { Name = reader.ReadStringOffset(); - MemoryDataIndex = reader.Read(); + MemoryDataIndex = reader.ReadInt32(); } public void Write(BinaryObjectWriter writer) @@ -33,7 +33,7 @@ public void Write(BinaryObjectWriter writer) writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); } - writer.Write(MemoryDataIndex); + writer.WriteInt32(MemoryDataIndex); } public override string ToString() diff --git a/Source/SharpNeedle/Framework/Ninja/Csd/TextureNN.cs b/Source/SharpNeedle/Framework/Ninja/Csd/TextureNN.cs index 5435217..fb14098 100644 --- a/Source/SharpNeedle/Framework/Ninja/Csd/TextureNN.cs +++ b/Source/SharpNeedle/Framework/Ninja/Csd/TextureNN.cs @@ -21,22 +21,22 @@ public TextureNN(string name) public void Read(BinaryObjectReader reader) { - Field00 = reader.Read(); + Field00 = reader.ReadUInt32(); Name = reader.ReadStringOffset(); - Field08 = reader.Read(); - Field0A = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); + Field08 = reader.ReadUInt16(); + Field0A = reader.ReadUInt16(); + Field0C = reader.ReadUInt32(); + Field10 = reader.ReadUInt32(); } public void Write(BinaryObjectWriter writer) { - writer.Write(Field00); + writer.WriteUInt32(Field00); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(Field08); - writer.Write(Field0A); - writer.Write(Field0C); - writer.Write(Field10); + writer.WriteUInt16(Field08); + writer.WriteUInt16(Field0A); + writer.WriteUInt32(Field0C); + writer.WriteUInt32(Field10); } public override string ToString() diff --git a/Source/SharpNeedle/Framework/Ninja/InfoChunk.cs b/Source/SharpNeedle/Framework/Ninja/InfoChunk.cs index 4f640a9..ddd085b 100644 --- a/Source/SharpNeedle/Framework/Ninja/InfoChunk.cs +++ b/Source/SharpNeedle/Framework/Ninja/InfoChunk.cs @@ -11,9 +11,9 @@ public class InfoChunk : IChunk public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { - options.Header ??= reader.ReadLittle(); + options.Header ??= reader.ReadObject(); Signature = options.Header.Value.Signature; - int chunkCount = reader.Read(); + int chunkCount = reader.ReadInt32(); // Check if Signature ends with IF if (((Signature >> 16) & 0xFFFF) != 0x4649) @@ -28,7 +28,7 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) reader.PushOffsetOrigin(); for (int i = 0; i < chunkCount; i++) { - ChunkHeader header = reader.ReadLittle(); + ChunkHeader header = reader.ReadObject(); long begin = reader.Position; options.Header = header; if (header.Signature == ProjectChunk.BinSignature) @@ -59,23 +59,23 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) Offsets = reader.ReadObjectOffset(); reader.Skip(4); // Offsets.BinarySize - Field1C = reader.Read(); + Field1C = reader.ReadUInt32(); } public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { writer.WriteLittle(Signature); writer.WriteLittle(0x18); // Always constant - writer.Write(Chunks.Count); + writer.WriteInt32(Chunks.Count); - writer.Write(0x20); // Always at the end of the chunk + writer.WriteInt32(0x20); // Always at the end of the chunk SeekToken sizePos = writer.At(); - writer.Write(0); // Chunk list size + writer.WriteInt32(0); // Chunk list size - writer.Write(0); // OffsetChunk Ptr - writer.Write(0); // OffsetChunk.BinarySize - writer.Write(Field1C); + writer.WriteInt32(0); // OffsetChunk Ptr + writer.WriteInt32(0); // OffsetChunk.BinarySize + writer.WriteUInt32(Field1C); writer.PushOffsetOrigin(); long offsetBase = writer.OffsetHandler.OffsetOrigin; @@ -99,14 +99,14 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) writer.WriteObject(Offsets); { writer.WriteNative(BinaryHelper.MakeSignature("NEND")); - writer.Write(0); - writer.Write(0L); + writer.WriteInt32(0); + writer.WriteInt64(0L); } sizePos.Dispose(); - writer.Write((int)chunkEnd - (int)chunkBegin); - writer.Write((int)offsetChunkPos); - writer.Write(Offsets.BinarySize); + writer.WriteInt32((int)chunkEnd - (int)chunkBegin); + writer.WriteInt32((int)offsetChunkPos); + writer.WriteInt32(Offsets.BinarySize); writer.Flush(); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/Ninja/OffsetChunk.cs b/Source/SharpNeedle/Framework/Ninja/OffsetChunk.cs index d3a04fc..833245f 100644 --- a/Source/SharpNeedle/Framework/Ninja/OffsetChunk.cs +++ b/Source/SharpNeedle/Framework/Ninja/OffsetChunk.cs @@ -12,10 +12,10 @@ public class OffsetChunk : IChunk, IList public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { - options.Header ??= reader.ReadLittle(); + options.Header ??= reader.ReadObject(); Signature = options.Header.Value.Signature; - int count = reader.Read(); + int count = reader.ReadInt32(); reader.Skip(4); // Runtime flags Offsets.AddRange(reader.ReadArray(count)); } @@ -25,8 +25,8 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions context) writer.WriteLittle(Signature); writer.WriteLittle(BinarySize - 8); // Size excluding header - writer.Write(Offsets.Count); - writer.Write(0); // Runtime flags, make this 0 to kill the game + writer.WriteInt32(Offsets.Count); + writer.WriteInt32(0); // Runtime flags, make this 0 to kill the game writer.WriteCollection(Offsets); writer.Align(16); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Node.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Node.cs index c435191..c10c454 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Node.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Node.cs @@ -40,50 +40,52 @@ public Node(BinaryObjectReader reader, GameType game) public void Read(BinaryObjectReader reader, GameType game) { - GUID = reader.Read(); - Type = reader.Read(); - int dataSize = reader.Read(); + GUID = reader.ReadGuid(); + Type = reader.ReadInt32(); + int dataSize = reader.ReadInt32(); - int childCount = reader.Read(); - Flags = reader.Read(); + int childCount = reader.ReadInt32(); + Flags = reader.ReadUInt32(); - Priority = reader.Read(); - Field24 = reader.Read(); - Field28 = reader.Read(); - Field2C = reader.Read(); + Priority = reader.ReadInt32(); + Field24 = reader.ReadInt32(); + Field28 = reader.ReadInt32(); + Field2C = reader.ReadInt32(); Name = reader.ReadDiString(64); switch ((NodeType)Type) { case NodeType.Path: - Data = new PathData(reader, game); + Data = reader.ReadObject(game); break; case NodeType.Camera: - Data = new CameraData(reader, game); + Data = reader.ReadObject(game); break; case NodeType.CameraMotion: - Data = new CameraMotionData(reader, game); + Data = reader.ReadObject(game); break; case NodeType.ModelCustom: case NodeType.Character: - Data = new ModelData(reader, game); + Data = reader.ReadObject(game); break; case NodeType.CharacterMotion: case NodeType.ModelMotion: - Data = new ModelMotionData(reader, game); + Data = reader.ReadObject(game); break; case NodeType.Attachment: - Data = new AttachmentData(reader, game); + Data = reader.ReadObject(game); break; case NodeType.Parameter: - Data = new ParameterData(reader, game, dataSize); + ParameterData parameterData = new(dataSize); + parameterData.Read(reader, game); + Data = parameterData; break; default: @@ -96,19 +98,19 @@ public void Read(BinaryObjectReader reader, GameType game) public void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(GUID); - writer.Write(Type); + writer.WriteGuid(GUID); + writer.WriteInt32(Type); long dataSizePos = writer.Position; writer.WriteNulls(4); - writer.Write(Children.Count); - writer.Write(Flags); + writer.WriteInt32(Children.Count); + writer.WriteUInt32(Flags); - writer.Write(Priority); - writer.Write(Field24); - writer.Write(Field28); - writer.Write(Field2C); + writer.WriteInt32(Priority); + writer.WriteInt32(Field24); + writer.WriteInt32(Field28); + writer.WriteInt32(Field2C); writer.WriteDiString(Name, 64); @@ -116,9 +118,9 @@ public void Write(BinaryObjectWriter writer, GameType game) Data.Write(writer, game); long dataEnd = writer.Position; - writer.Seek(dataSizePos, System.IO.SeekOrigin.Begin); - writer.Write((int)(dataEnd - dataStart) / 4); - writer.Seek(dataEnd, System.IO.SeekOrigin.Begin); + writer.Seek(dataSizePos, SeekOrigin.Begin); + writer.WriteInt32((int)(dataEnd - dataStart) / 4); + writer.Seek(dataEnd, SeekOrigin.Begin); writer.WriteObjectCollection(game, Children); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/AttachmentData.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/AttachmentData.cs index a00583b..587acda 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/AttachmentData.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/AttachmentData.cs @@ -9,26 +9,22 @@ public class AttachmentData : BaseNodeData public int Field4C { get; set; } public AttachmentData() { } - public AttachmentData(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); + Field00 = reader.ReadInt32(); NodeName = reader.ReadDiString(64); - Field44 = reader.Read(); - Field48 = reader.Read(); - Field4C = reader.Read(); + Field44 = reader.ReadInt32(); + Field48 = reader.ReadInt32(); + Field4C = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); + writer.WriteInt32(Field00); writer.WriteDiString(NodeName, 64); - writer.Write(Field44); - writer.Write(Field48); - writer.Write(Field4C); + writer.WriteInt32(Field44); + writer.WriteInt32(Field48); + writer.WriteInt32(Field4C); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/CameraData.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/CameraData.cs index 0344bd4..5d7ed61 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/CameraData.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/CameraData.cs @@ -10,17 +10,13 @@ public class CameraData : BaseNodeData public List FrameData { get; set; } = []; public CameraData() { } - public CameraData(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - FrameCount = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); + Field00 = reader.ReadInt32(); + FrameCount = reader.ReadInt32(); + Field08 = reader.ReadInt32(); + Field0C = reader.ReadInt32(); if (FrameCount > 0) { @@ -31,10 +27,10 @@ public override void Read(BinaryObjectReader reader, GameType game) public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(FrameCount); - writer.Write(Field08); - writer.Write(Field0C); + writer.WriteInt32(Field00); + writer.WriteInt32(FrameCount); + writer.WriteInt32(Field08); + writer.WriteInt32(Field0C); if (FrameCount > 0) { diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/CameraMotionData.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/CameraMotionData.cs index 9d43b24..a310b99 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/CameraMotionData.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/CameraMotionData.cs @@ -8,24 +8,20 @@ public class CameraMotionData : BaseNodeData public int Field0C { get; set; } public CameraMotionData() { } - public CameraMotionData(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); + Field08 = reader.ReadInt32(); + Field0C = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); + writer.WriteInt32(Field08); + writer.WriteInt32(Field0C); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ModelData.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ModelData.cs index 0b67f30..d87ad2b 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ModelData.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ModelData.cs @@ -8,14 +8,10 @@ public class ModelData : BaseNodeData public string Field84 { get; set; } = string.Empty; public ModelData() { } - public ModelData(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); + Field00 = reader.ReadInt32(); ModelName = reader.ReadDiString(64); SkeletonName = reader.ReadDiString(64); Field84 = reader.ReadDiString(64); @@ -25,7 +21,7 @@ public override void Read(BinaryObjectReader reader, GameType game) public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); + writer.WriteInt32(Field00); writer.WriteDiString(ModelName, 64); writer.WriteDiString(SkeletonName, 64); writer.WriteDiString(Field84, 64); diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ModelMotionData.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ModelMotionData.cs index 81c91c0..eefcd28 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ModelMotionData.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ModelMotionData.cs @@ -10,31 +10,27 @@ public class ModelMotionData : BaseNodeData public float Field18 { get; set; } public ModelMotionData() { } - public ModelMotionData(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); + Field08 = reader.ReadInt32(); + Field0C = reader.ReadInt32(); Field10 = reader.ReadDiString(8); - Field18 = reader.Read(); + Field18 = reader.ReadSingle(); reader.Skip(20); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); + writer.WriteInt32(Field08); + writer.WriteInt32(Field0C); writer.WriteDiString(Field10, 8); - writer.Write(Field18); + writer.WriteSingle(Field18); writer.WriteNulls(20); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ParameterData.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ParameterData.cs index 6c109bf..3cbede3 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ParameterData.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/ParameterData.cs @@ -16,10 +16,10 @@ public class ParameterData : BaseNodeData public BaseParam? Parameter { get; set; } public ParameterData() { } - public ParameterData(BinaryObjectReader reader, GameType game, int size) + + public ParameterData(int dataSize) { - _unknownDataSize = size - 8; - Read(reader, game); + _unknownDataSize = dataSize - 8; } public ParameterData(float startTime, float endTime) @@ -33,286 +33,135 @@ public ParameterData(float startTime, float endTime, BaseParam parameter) : this Parameter = parameter; } - public void ReadFrontiersParameter(BinaryObjectReader reader, int type) + private static Func? GetCommonReadFunc(BinaryObjectReader reader, int type) { - switch ((FrontiersParams)type) + return (ParameterType)type switch { - case FrontiersParams.DepthOfField: - Parameter = new DOFParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.ColorCorrection: - Parameter = new ColorCorrectionParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.CameraExposure: - Parameter = new CameraExposureParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.ShadowResolution: - Parameter = new ShadowResolutionParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.ChromaticAberration: - Parameter = new ChromaAberrationParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.Vignette: - Parameter = new VignetteParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.Fade: - Parameter = new FadeParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.Letterbox: - Parameter = new LetterboxParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.BossName: - Parameter = new BossNameParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.Subtitle: - Parameter = new SubtitleParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.Sound: - Parameter = new SoundParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.Time: - Parameter = new TimeParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.CameraBlur: - Parameter = new CameraBlurParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.GeneralPurposeTrigger: - Parameter = new GeneralTriggerParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.DitherDepth: - Parameter = new DitherDepthParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.QTE: - Parameter = new QTEParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.ASMForcedOverwrite: - Parameter = new ASMOverrideParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.Aura: - Parameter = new AuraParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.TimescaleChange: - Parameter = new TimescaleParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.CyberNoise: - Parameter = new CyberNoiseParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.MovieDisplay: - Parameter = new MovieDisplayParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.Weather: - Parameter = new WeatherParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.TheEndCable: - Parameter = new TheEndCableParam(reader, GameType.Frontiers); - break; - - case FrontiersParams.FinalBossLighting: - Parameter = new FinalBossLightingParam(reader, GameType.Frontiers); - break; - - default: - Parameter = new UnknownParam(reader, _unknownDataSize, type); - break; - } + ParameterType.DrawingOff => reader.ReadObject, + ParameterType.PathAdjust => reader.ReadObject, + ParameterType.CameraShake => reader.ReadObject, + ParameterType.CameraShakeLoop => reader.ReadObject, + ParameterType.Effect => reader.ReadObject, + ParameterType.CullDisabled => reader.ReadObject, + ParameterType.UVAnimation => reader.ReadObject, + ParameterType.VisibilityAnimation => reader.ReadObject, + ParameterType.MaterialAnimation => reader.ReadObject, + ParameterType.CompositeAnimation => reader.ReadObject, + ParameterType.SonicCamera => reader.ReadObject, + ParameterType.GameCamera => reader.ReadObject, + ParameterType.ControllerVibration => reader.ReadObject, + ParameterType.MaterialParameter => reader.ReadObject, + _ => null, + }; } - public void ReadShadowGensParameter(BinaryObjectReader reader, int type) + private static Func? GetFrontiersReadFunc(BinaryObjectReader reader, int type) { - switch ((ShadowGensParams)type) + return (FrontiersParams)type switch { - case ShadowGensParams.DepthOfField: - Parameter = new DOFParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.Fade: - Parameter = new FadeParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.BossName: - Parameter = new BossNameParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.Subtitle: - Parameter = new SubtitleParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.Sound: - Parameter = new SoundParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.GeneralPurposeTrigger: - Parameter = new GeneralTriggerParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.QTE: - Parameter = new QTEParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.MovieDisplay: - Parameter = new MovieDisplayParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.TimeStop: - Parameter = new TimeStopParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.TimeStopControl: - Parameter = new TimeStopControlParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.TimeStopObjectBehavior: - Parameter = new TimeStopObjectBehaviorParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.ShadowAfterimage: - Parameter = new ShadowAfterimageParam(reader, GameType.ShadowGenerations); - break; - - case ShadowGensParams.FalloffToggle: - Parameter = new FalloffToggleParam(reader, GameType.ShadowGenerations); - break; - - default: - Parameter = new UnknownParam(reader, _unknownDataSize, type); - break; - } + FrontiersParams.DepthOfField => reader.ReadObject, + FrontiersParams.ColorCorrection => reader.ReadObject, + FrontiersParams.CameraExposure => reader.ReadObject, + FrontiersParams.ShadowResolution => reader.ReadObject, + FrontiersParams.ChromaticAberration => reader.ReadObject, + FrontiersParams.Vignette => reader.ReadObject, + FrontiersParams.Fade => reader.ReadObject, + FrontiersParams.Letterbox => reader.ReadObject, + FrontiersParams.BossName => reader.ReadObject, + FrontiersParams.Subtitle => reader.ReadObject, + FrontiersParams.Sound => reader.ReadObject, + FrontiersParams.Time => reader.ReadObject, + FrontiersParams.CameraBlur => reader.ReadObject, + FrontiersParams.GeneralPurposeTrigger => reader.ReadObject, + FrontiersParams.DitherDepth => reader.ReadObject, + FrontiersParams.QTE => reader.ReadObject, + FrontiersParams.ASMForcedOverwrite => reader.ReadObject, + FrontiersParams.Aura => reader.ReadObject, + FrontiersParams.TimescaleChange => reader.ReadObject, + FrontiersParams.CyberNoise => reader.ReadObject, + FrontiersParams.MovieDisplay => reader.ReadObject, + FrontiersParams.Weather => reader.ReadObject, + FrontiersParams.TheEndCable => reader.ReadObject, + FrontiersParams.FinalBossLighting => reader.ReadObject, + _ => null, + }; } - public void ReadGameSpecificParameter(BinaryObjectReader reader, GameType game, int type) + private static Func? GetShadowGenerationsReadFunc(BinaryObjectReader reader, int type) { - switch (game) + return (ShadowGensParams)type switch { - case GameType.Frontiers: - ReadFrontiersParameter(reader, type); - break; - - case GameType.ShadowGenerations: - ReadShadowGensParameter(reader, type); - break; - - default: - Parameter = new UnknownParam(reader, _unknownDataSize, type); - break; - } + ShadowGensParams.DepthOfField => reader.ReadObject, + ShadowGensParams.Fade => reader.ReadObject, + ShadowGensParams.BossName => reader.ReadObject, + ShadowGensParams.Subtitle => reader.ReadObject, + ShadowGensParams.Sound => reader.ReadObject, + ShadowGensParams.GeneralPurposeTrigger => reader.ReadObject, + ShadowGensParams.QTE => reader.ReadObject, + ShadowGensParams.MovieDisplay => reader.ReadObject, + ShadowGensParams.TimeStop => reader.ReadObject, + ShadowGensParams.TimeStopControl => reader.ReadObject, + ShadowGensParams.TimeStopObjectBehavior => reader.ReadObject, + ShadowGensParams.ShadowAfterimage => reader.ReadObject, + ShadowGensParams.FalloffToggle => reader.ReadObject, + _ => null, + }; } - public override void Read(BinaryObjectReader reader, GameType game) + private BaseParam ReadParameter(BinaryObjectReader reader, GameType game, int type) { - int type = reader.Read(); - StartTime = reader.Read(); - EndTime = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); + Func? readFunc; - if (type < 1000) + if(type < 1000) { - switch ((ParameterType)type) - { - case ParameterType.DrawingOff: - Parameter = new DrawOffParam(reader, GameType.Common); - break; - - case ParameterType.PathAdjust: - Parameter = new PathAdjustParam(reader, GameType.Common); - break; - - case ParameterType.CameraShake: - Parameter = new CameraShakeParam(reader, GameType.Common); - break; - - case ParameterType.CameraShakeLoop: - Parameter = new CameraShakeLoopParam(reader, GameType.Common); - break; - - case ParameterType.Effect: - Parameter = new EffectParam(reader, GameType.Common); - break; - - case ParameterType.CullDisabled: - Parameter = new CullDisabledParam(reader, GameType.Common); - break; - - case ParameterType.UVAnimation: - Parameter = new UVAnimParam(reader, GameType.Common); - break; - - case ParameterType.VisibilityAnimation: - Parameter = new VisibilityAnimParam(reader, GameType.Common); - break; - - case ParameterType.MaterialAnimation: - Parameter = new MaterialAnimParam(reader, GameType.Common); - break; - - case ParameterType.CompositeAnimation: - Parameter = new CompositeAnimParam(reader, GameType.Common); - break; - - case ParameterType.SonicCamera: - Parameter = new SonicCameraParam(reader, GameType.Common); - break; - - case ParameterType.GameCamera: - Parameter = new GameCameraParam(reader, GameType.Common); - break; - - case ParameterType.ControllerVibration: - Parameter = new ControllerVibrationParam(reader, GameType.Common); - break; + game = GameType.Common; + } - case ParameterType.MaterialParameter: - Parameter = new MaterialParameterParam(reader, GameType.Common); - break; + readFunc = game switch + { + GameType.Frontiers => GetFrontiersReadFunc(reader, type), + GameType.ShadowGenerations => GetShadowGenerationsReadFunc(reader, type), + _ => GetCommonReadFunc(reader, type), + }; + - default: - Parameter = new UnknownParam(reader, _unknownDataSize, type); - break; - } + if(readFunc == null) + { + UnknownParam result = new(_unknownDataSize, type); + result.Read(reader, game); + return result; } else { - ReadGameSpecificParameter(reader, game, type); + return readFunc(game); } } + public override void Read(BinaryObjectReader reader, GameType game) + { + int type = reader.ReadInt32(); + StartTime = reader.ReadSingle(); + EndTime = reader.ReadSingle(); + Field0C = reader.ReadInt32(); + Field10 = reader.ReadInt32(); + Field14 = reader.ReadInt32(); + Field18 = reader.ReadInt32(); + Field1C = reader.ReadInt32(); + Parameter = ReadParameter(reader, game, type); + } + public override void Write(BinaryObjectWriter writer, GameType game) { int type = Parameter == null ? 0 : Parameter.GetTypeID(game); - writer.Write(type); - writer.Write(StartTime); - writer.Write(EndTime); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); + writer.WriteInt32(type); + writer.WriteSingle(StartTime); + writer.WriteSingle(EndTime); + writer.WriteInt32(Field0C); + writer.WriteInt32(Field10); + writer.WriteInt32(Field14); + writer.WriteInt32(Field18); + writer.WriteInt32(Field1C); if (Parameter != null) { diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/PathData.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/PathData.cs index cbe8b2c..6f4f5a1 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/PathData.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/NodeData/PathData.cs @@ -9,26 +9,22 @@ public class PathData : BaseNodeData public int Field4C { get; set; } public PathData() { } - public PathData(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Transform = reader.Read(); - Field40 = reader.Read(); - Field44 = reader.Read(); - Field48 = reader.Read(); - Field4C = reader.Read(); + Transform = reader.ReadMatrix4x4(); + Field40 = reader.ReadInt32(); + Field44 = reader.ReadInt32(); + Field48 = reader.ReadInt32(); + Field4C = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Transform); - writer.Write(Field40); - writer.Write(Field44); - writer.Write(Field48); - writer.Write(Field4C); + writer.WriteMatrix4x4(Transform); + writer.WriteInt32(Field40); + writer.WriteInt32(Field44); + writer.WriteInt32(Field48); + writer.WriteInt32(Field4C); } } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Page.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Page.cs index 85e9a1e..c9fdc3f 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Page.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Page.cs @@ -22,18 +22,18 @@ public class Page : IBinarySerializable public void Read(BinaryObjectReader reader) { - Version = reader.Read(); - Flag = reader.Read(); - StartFrame = reader.Read(); - EndFrame = reader.Read(); - Field10 = reader.Read(); - int dataSize = reader.Read(); - SceneEndFrame = reader.Read(); - Field1C = reader.Read(); - int unknownCount = reader.Read(); - Field24 = reader.Read(); - Field28 = reader.Read(); - Field2C = reader.Read(); + Version = reader.ReadUInt32(); + Flag = reader.ReadUInt32(); + StartFrame = reader.ReadUInt32(); + EndFrame = reader.ReadUInt32(); + Field10 = reader.ReadInt32(); + int dataSize = reader.ReadInt32(); + SceneEndFrame = reader.ReadInt32(); + Field1C = reader.ReadInt32(); + int unknownCount = reader.ReadInt32(); + Field24 = reader.ReadInt32(); + Field28 = reader.ReadInt32(); + Field2C = reader.ReadInt32(); Name = reader.ReadString(StringBinaryFormat.FixedLength, 32); UnknownArray = new int[unknownCount]; @@ -45,18 +45,18 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { - writer.Write(Version); - writer.Write(Flag); - writer.Write(StartFrame); - writer.Write(EndFrame); - writer.Write(Field10); - writer.Write(Data.Length); - writer.Write(SceneEndFrame); - writer.Write(Field1C); - writer.Write(UnknownArray.Length); - writer.Write(Field24); - writer.Write(Field28); - writer.Write(Field2C); + writer.WriteUInt32(Version); + writer.WriteUInt32(Flag); + writer.WriteUInt32(StartFrame); + writer.WriteUInt32(EndFrame); + writer.WriteInt32(Field10); + writer.WriteInt32(Data.Length); + writer.WriteInt32(SceneEndFrame); + writer.WriteInt32(Field1C); + writer.WriteInt32(UnknownArray.Length); + writer.WriteInt32(Field24); + writer.WriteInt32(Field28); + writer.WriteInt32(Field2C); writer.WriteString(StringBinaryFormat.FixedLength, Name, 32); writer.WriteArray(UnknownArray); diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ASMOverrideParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ASMOverrideParam.cs index 0c9ac23..c8dc6f5 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ASMOverrideParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ASMOverrideParam.cs @@ -7,11 +7,6 @@ public class ASMOverrideParam : BaseParam public ASMOverrideParam() { } - public ASMOverrideParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } - public override void Read(BinaryObjectReader reader, GameType game) { OverriddenASMName = reader.ReadString(StringBinaryFormat.FixedLength, 64); diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/AuraParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/AuraParam.cs index 951fbf6..178d7b0 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/AuraParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/AuraParam.cs @@ -24,56 +24,52 @@ public class AuraParam : BaseParam public float[] ValuesTimeline { get; set; } = new float[32]; public AuraParam() { } - public AuraParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); - Field20 = reader.Read(); - Field24 = reader.Read(); - Field28 = reader.Read(); - Field2C = reader.Read(); - Field30 = reader.Read(); - Field34 = reader.Read(); - Field38 = reader.Read(); - Field3C = reader.Read(); - Field40 = reader.Read(); - Field44 = reader.Read(); - Field48 = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); + Field08 = reader.ReadInt32(); + Field0C = reader.ReadInt32(); + Field10 = reader.ReadSingle(); + Field14 = reader.ReadSingle(); + Field18 = reader.ReadSingle(); + Field1C = reader.ReadSingle(); + Field20 = reader.ReadSingle(); + Field24 = reader.ReadInt32(); + Field28 = reader.ReadInt32(); + Field2C = reader.ReadInt32(); + Field30 = reader.ReadInt32(); + Field34 = reader.ReadSingle(); + Field38 = reader.ReadSingle(); + Field3C = reader.ReadSingle(); + Field40 = reader.ReadSingle(); + Field44 = reader.ReadSingle(); + Field48 = reader.ReadInt32(); reader.ReadArray(32, ValuesTimeline); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); - writer.Write(Field20); - writer.Write(Field24); - writer.Write(Field28); - writer.Write(Field2C); - writer.Write(Field30); - writer.Write(Field34); - writer.Write(Field38); - writer.Write(Field3C); - writer.Write(Field40); - writer.Write(Field44); - writer.Write(Field48); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); + writer.WriteInt32(Field08); + writer.WriteInt32(Field0C); + writer.WriteSingle(Field10); + writer.WriteSingle(Field14); + writer.WriteSingle(Field18); + writer.WriteSingle(Field1C); + writer.WriteSingle(Field20); + writer.WriteInt32(Field24); + writer.WriteInt32(Field28); + writer.WriteInt32(Field2C); + writer.WriteInt32(Field30); + writer.WriteSingle(Field34); + writer.WriteSingle(Field38); + writer.WriteSingle(Field3C); + writer.WriteSingle(Field40); + writer.WriteSingle(Field44); + writer.WriteInt32(Field48); writer.WriteArrayFixedLength(ValuesTimeline, 32); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/BossNameParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/BossNameParam.cs index 5f52a2b..081a0b4 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/BossNameParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/BossNameParam.cs @@ -6,21 +6,17 @@ public class BossNameParam : BaseParam public int NameType { get; set; } public BossNameParam() { } - public BossNameParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - NameType = reader.Read(); + Field00 = reader.ReadInt32(); + NameType = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(NameType); + writer.WriteInt32(Field00); + writer.WriteInt32(NameType); } public override int GetTypeID(GameType game) diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraBlurParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraBlurParam.cs index 90c47a4..d979870 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraBlurParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraBlurParam.cs @@ -9,27 +9,23 @@ public class CameraBlurParam : BaseParam public uint Flags { get; set; } public CameraBlurParam() { } - public CameraBlurParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); + Field00 = reader.ReadUInt32(); + Field04 = reader.ReadUInt32(); + Field08 = reader.ReadSingle(); reader.ReadArray(32, CurveData); - Flags = reader.Read(); + Flags = reader.ReadUInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); + writer.WriteUInt32(Field00); + writer.WriteUInt32(Field04); + writer.WriteSingle(Field08); writer.WriteArrayFixedLength(CurveData, 32); - writer.Write(Flags); + writer.WriteUInt32(Flags); } public override int GetTypeID(GameType game) diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraExposureParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraExposureParam.cs index 6d843dc..402f884 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraExposureParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraExposureParam.cs @@ -13,34 +13,30 @@ public class CameraExposureParam : BaseParam public float[] CurveData { get; set; } = new float[32]; public CameraExposureParam() { } - public CameraExposureParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); + Field00 = reader.ReadUInt32(); + Field04 = reader.ReadSingle(); + Field08 = reader.ReadUInt32(); + Field0C = reader.ReadUInt32(); + Field10 = reader.ReadUInt32(); + Field14 = reader.ReadUInt32(); + Field18 = reader.ReadUInt32(); + Field1C = reader.ReadUInt32(); reader.ReadArray(32, CurveData); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); + writer.WriteUInt32(Field00); + writer.WriteSingle(Field04); + writer.WriteUInt32(Field08); + writer.WriteUInt32(Field0C); + writer.WriteUInt32(Field10); + writer.WriteUInt32(Field14); + writer.WriteUInt32(Field18); + writer.WriteUInt32(Field1C); writer.WriteArrayFixedLength(CurveData, 32); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraShakeLoopParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraShakeLoopParam.cs index 6ebf1c6..d3b32b2 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraShakeLoopParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraShakeLoopParam.cs @@ -13,34 +13,30 @@ public class CameraShakeLoopParam : BaseParam public float[] CurveData { get; set; } = new float[64]; public CameraShakeLoopParam() { } - public CameraShakeLoopParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); + Field08 = reader.ReadSingle(); + Field0C = reader.ReadSingle(); + Field10 = reader.ReadSingle(); + Field14 = reader.ReadSingle(); + Field18 = reader.ReadSingle(); + Field1C = reader.ReadSingle(); reader.ReadArray(64, CurveData); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); + writer.WriteSingle(Field08); + writer.WriteSingle(Field0C); + writer.WriteSingle(Field10); + writer.WriteSingle(Field14); + writer.WriteSingle(Field18); + writer.WriteSingle(Field1C); writer.WriteArrayFixedLength(CurveData, 64); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraShakeParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraShakeParam.cs index d861ed0..0da1407 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraShakeParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CameraShakeParam.cs @@ -12,33 +12,29 @@ public class CameraShakeParam : BaseParam public int Field1C { get; set; } public CameraShakeParam() { } - public CameraShakeParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); + Field08 = reader.ReadSingle(); + Field0C = reader.ReadSingle(); + Field10 = reader.ReadInt32(); + Field14 = reader.ReadInt32(); + Field18 = reader.ReadInt32(); + Field1C = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); + writer.WriteSingle(Field08); + writer.WriteSingle(Field0C); + writer.WriteInt32(Field10); + writer.WriteInt32(Field14); + writer.WriteInt32(Field18); + writer.WriteInt32(Field1C); } public override int GetTypeID(GameType game) { return (int)ParameterType.CameraShake; } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ChromaAberrationParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ChromaAberrationParam.cs index fc0d337..cf44d83 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ChromaAberrationParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ChromaAberrationParam.cs @@ -10,15 +10,11 @@ public class ChromaAberrationParam : BaseParam public float[] CurveData { get; set; } = new float[32]; public ChromaAberrationParam() { } - public ChromaAberrationParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { EndpointA = reader.ReadObject(); - Field20 = reader.Read(); + Field20 = reader.ReadSingle(); EndpointB = reader.ReadObject(); reader.ReadArray(32, CurveData); @@ -27,7 +23,7 @@ public override void Read(BinaryObjectReader reader, GameType game) public override void Write(BinaryObjectWriter writer, GameType game) { writer.WriteObject(EndpointA); - writer.Write(Field20); + writer.WriteSingle(Field20); writer.WriteObject(EndpointB); writer.WriteArrayFixedLength(CurveData, 32); @@ -57,25 +53,20 @@ public class Endpoint : IBinarySerializable public Endpoint() { } - public Endpoint(BinaryObjectReader reader) - { - Read(reader); - } - public void Read(BinaryObjectReader reader) { - ColorOffset = new Color(reader.Read(), reader.Read(), reader.Read(), 1.0f); - SphereCurve = reader.Read(); - Scale = reader.Read(); - Position = reader.Read(); + ColorOffset = new Color(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), 1.0f); + SphereCurve = reader.ReadSingle(); + Scale = reader.ReadVector2(); + Position = reader.ReadVector2(); } public void Write(BinaryObjectWriter writer) { - writer.Write(new Vector3(ColorOffset.R, ColorOffset.G, ColorOffset.B)); - writer.Write(SphereCurve); - writer.Write(Scale); - writer.Write(Position); + writer.WriteVector3(new Vector3(ColorOffset.R, ColorOffset.G, ColorOffset.B)); + writer.WriteSingle(SphereCurve); + writer.WriteVector2(Scale); + writer.WriteVector2(Position); } } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ColorCorrectionParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ColorCorrectionParam.cs index 7b7930a..2d6a514 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ColorCorrectionParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ColorCorrectionParam.cs @@ -13,34 +13,30 @@ public class ColorCorrectionParam : BaseParam public float[] CurveData { get; set; } = new float[32]; public ColorCorrectionParam() { } - public ColorCorrectionParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); + Field00 = reader.ReadUInt32(); + Field04 = reader.ReadSingle(); + Field08 = reader.ReadSingle(); + Field0C = reader.ReadSingle(); + Field10 = reader.ReadSingle(); + Field14 = reader.ReadUInt32(); + Field18 = reader.ReadSingle(); + Field1C = reader.ReadUInt32(); reader.ReadArray(32, CurveData); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); + writer.WriteSingle(Field00); + writer.WriteSingle(Field04); + writer.WriteSingle(Field08); + writer.WriteSingle(Field0C); + writer.WriteSingle(Field10); + writer.WriteSingle(Field14); + writer.WriteSingle(Field18); + writer.WriteSingle(Field1C); writer.WriteArrayFixedLength(CurveData, 32); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CompositeAnimParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CompositeAnimParam.cs index f079124..a92dd17 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CompositeAnimParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CompositeAnimParam.cs @@ -9,25 +9,20 @@ public class CompositeAnimParam : BaseParam public CompositeAnimParam() { } - public CompositeAnimParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } - public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); + Field00 = reader.ReadInt32(); StateName = reader.ReadString(StringBinaryFormat.FixedLength, 12); Animations = reader.ReadObjectArray(16); - ActiveAnimCount = reader.Read(); + ActiveAnimCount = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); + writer.WriteInt32(Field00); writer.WriteString(StringBinaryFormat.FixedLength, StateName, 12); writer.WriteObjectCollection(Animations); - writer.Write(ActiveAnimCount); + writer.WriteInt32(ActiveAnimCount); } public override int GetTypeID(GameType game) { return (int)ParameterType.CompositeAnimation; } @@ -45,13 +40,13 @@ public Animation() public void Read(BinaryObjectReader reader) { - Type = reader.Read(); + Type = reader.ReadInt32(); Name = reader.ReadString(StringBinaryFormat.FixedLength, 64); } public void Write(BinaryObjectWriter writer) { - writer.Write(Type); + writer.WriteInt32(Type); writer.WriteString(StringBinaryFormat.FixedLength, Name, 64); } } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ControllerVibrationParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ControllerVibrationParam.cs index db1ede1..6a8a426 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ControllerVibrationParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ControllerVibrationParam.cs @@ -11,29 +11,24 @@ public class ControllerVibrationParam : BaseParam public ControllerVibrationParam() { } - public ControllerVibrationParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } - public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); + Field00 = reader.ReadInt32(); Group = reader.ReadString(StringBinaryFormat.FixedLength, 64); Mode = reader.ReadString(StringBinaryFormat.FixedLength, 64); - Field84 = reader.Read(); - Field88 = reader.Read(); - Field8C = reader.Read(); + Field84 = reader.ReadUInt32(); + Field88 = reader.ReadUInt32(); + Field8C = reader.ReadUInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); + writer.WriteInt32(Field00); writer.WriteString(StringBinaryFormat.FixedLength, Group, 64); writer.WriteString(StringBinaryFormat.FixedLength, Mode, 64); - writer.Write(Field84); - writer.Write(Field88); - writer.Write(Field8C); + writer.WriteUInt32(Field84); + writer.WriteUInt32(Field88); + writer.WriteUInt32(Field8C); } public override int GetTypeID(GameType game) { return (int)ParameterType.ControllerVibration; } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CullDisabledParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CullDisabledParam.cs index d2f61c8..46cae30 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CullDisabledParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CullDisabledParam.cs @@ -3,10 +3,6 @@ namespace SharpNeedle.Framework.SonicTeam.DiEvent.Parameters; public class CullDisabledParam : BaseParam { public CullDisabledParam() { } - public CullDisabledParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CyberNoiseParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CyberNoiseParam.cs index fd8cf54..de41a6c 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CyberNoiseParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/CyberNoiseParam.cs @@ -6,20 +6,16 @@ public class CyberNoiseParam : BaseParam public float[] CurveData { get; set; } = new float[32]; public CyberNoiseParam() { } - public CyberNoiseParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); + Field00 = reader.ReadUInt32(); reader.ReadArray(32, CurveData); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); + writer.WriteUInt32(Field00); writer.WriteArrayFixedLength(CurveData, 32); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DOFParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DOFParam.cs index 39ccf23..5e91f72 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DOFParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DOFParam.cs @@ -19,46 +19,42 @@ public class DOFParam : BaseParam public float[] CurveData { get; set; } = new float[32]; public DOFParam() { } - public DOFParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); + Field00 = reader.ReadInt32(); EndpointA = reader.ReadObject(); EndpointB = reader.ReadObject(); - Field24 = reader.Read(); - Field28 = reader.Read(); - Field2C = reader.Read(); - Field30 = reader.Read(); - Field34 = reader.Read(); - Field38 = reader.Read(); - Field3C = reader.Read(); - Field40 = reader.Read(); - Field44 = reader.Read(); - Field48 = reader.Read(); - Field4C = reader.Read(); + Field24 = reader.ReadSingle(); + Field28 = reader.ReadSingle(); + Field2C = reader.ReadInt32(); + Field30 = reader.ReadInt32(); + Field34 = reader.ReadSingle(); + Field38 = reader.ReadInt32(); + Field3C = reader.ReadInt32(); + Field40 = reader.ReadInt32(); + Field44 = reader.ReadInt32(); + Field48 = reader.ReadInt32(); + Field4C = reader.ReadInt32(); reader.ReadArray(32, CurveData); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); + writer.WriteInt32(Field00); writer.WriteObject(EndpointA); writer.WriteObject(EndpointB); - writer.Write(Field24); - writer.Write(Field28); - writer.Write(Field2C); - writer.Write(Field30); - writer.Write(Field34); - writer.Write(Field38); - writer.Write(Field3C); - writer.Write(Field40); - writer.Write(Field44); - writer.Write(Field48); - writer.Write(Field4C); + writer.WriteSingle(Field24); + writer.WriteSingle(Field28); + writer.WriteInt32(Field2C); + writer.WriteInt32(Field30); + writer.WriteSingle(Field34); + writer.WriteInt32(Field38); + writer.WriteInt32(Field3C); + writer.WriteInt32(Field40); + writer.WriteInt32(Field44); + writer.WriteInt32(Field48); + writer.WriteInt32(Field4C); writer.WriteArrayFixedLength(CurveData, 32); } @@ -71,25 +67,20 @@ public class Endpoint : IBinarySerializable public Endpoint() { } - public Endpoint(BinaryObjectReader reader) - { - Read(reader); - } - public void Read(BinaryObjectReader reader) { - Focus = reader.Read(); - FocusRange = reader.Read(); - Near = reader.Read(); - Far = reader.Read(); + Focus = reader.ReadSingle(); + FocusRange = reader.ReadSingle(); + Near = reader.ReadSingle(); + Far = reader.ReadSingle(); } public void Write(BinaryObjectWriter writer) { - writer.Write(Focus); - writer.Write(FocusRange); - writer.Write(Near); - writer.Write(Far); + writer.WriteSingle(Focus); + writer.WriteSingle(FocusRange); + writer.WriteSingle(Near); + writer.WriteSingle(Far); } } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DitherDepthParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DitherDepthParam.cs index 8b71177..93e59ca 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DitherDepthParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DitherDepthParam.cs @@ -5,21 +5,17 @@ public class DitherDepthParam : BaseParam public float Field04 { get; set; } public DitherDepthParam() { } - public DitherDepthParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); + Field00 = reader.ReadUInt32(); + Field04 = reader.ReadSingle(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); + writer.WriteUInt32(Field00); + writer.WriteSingle(Field04); } public override int GetTypeID(GameType game) diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DrawOffParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DrawOffParam.cs index 2fcec09..0eab86e 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DrawOffParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/DrawOffParam.cs @@ -8,25 +8,21 @@ class DrawOffParam : BaseParam public int Field0C { get; set; } public DrawOffParam() { } - public DrawOffParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); + Field08 = reader.ReadInt32(); + Field0C = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); + writer.WriteInt32(Field08); + writer.WriteInt32(Field0C); } public override int GetTypeID(GameType game) { return (int)ParameterType.DrawingOff; } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/EffectParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/EffectParam.cs index d610ec7..faab258 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/EffectParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/EffectParam.cs @@ -16,40 +16,36 @@ public class EffectParam : BaseParam public float[] AnimationData { get; set; } = new float[128]; public EffectParam() { } - public EffectParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - LocalTransform = reader.Read(); - Field40 = reader.Read(); + LocalTransform = reader.ReadMatrix4x4(); + Field40 = reader.ReadInt32(); Name = reader.ReadDiString(64); - Field84 = reader.Read(); - Field88 = reader.Read(); - Field8C = reader.Read(); - Field90 = reader.Read(); - Field94 = reader.Read(); - Field98 = reader.Read(); - Field9C = reader.Read(); - FieldA0 = reader.Read(); + Field84 = reader.ReadInt32(); + Field88 = reader.ReadInt32(); + Field8C = reader.ReadInt32(); + Field90 = reader.ReadInt32(); + Field94 = reader.ReadInt32(); + Field98 = reader.ReadInt32(); + Field9C = reader.ReadInt32(); + FieldA0 = reader.ReadInt32(); reader.ReadArray(128, AnimationData); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(LocalTransform); - writer.Write(Field40); + writer.WriteMatrix4x4(LocalTransform); + writer.WriteInt32(Field40); writer.WriteDiString(Name); - writer.Write(Field84); - writer.Write(Field88); - writer.Write(Field8C); - writer.Write(Field90); - writer.Write(Field94); - writer.Write(Field98); - writer.Write(Field9C); - writer.Write(FieldA0); + writer.WriteInt32(Field84); + writer.WriteInt32(Field88); + writer.WriteInt32(Field8C); + writer.WriteInt32(Field90); + writer.WriteInt32(Field94); + writer.WriteInt32(Field98); + writer.WriteInt32(Field9C); + writer.WriteInt32(FieldA0); writer.WriteArrayFixedLength(AnimationData, 128); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FadeParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FadeParam.cs index 46a8d24..a323535 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FadeParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FadeParam.cs @@ -8,20 +8,16 @@ public class FadeParam : BaseParam public float[] CurveData { get; set; } = new float[32]; public FadeParam() { } - public FadeParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Color = reader.Read>(); + Color = reader.ReadObject>(); reader.ReadArray(32, CurveData); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Color); + writer.WriteObject(Color); writer.WriteArrayFixedLength(CurveData, 32); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FalloffToggleParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FalloffToggleParam.cs index 8dd92c0..351b2dc 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FalloffToggleParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FalloffToggleParam.cs @@ -5,19 +5,15 @@ public class FalloffToggleParam : BaseParam public float Intensity { get; set; } public FalloffToggleParam() { } - public FalloffToggleParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Intensity = reader.Read(); + Intensity = reader.ReadSingle(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Intensity); + writer.WriteSingle(Intensity); } public override int GetTypeID(GameType game) diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FinalBossLightingParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FinalBossLightingParam.cs index f536322..b1d57d9 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FinalBossLightingParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/FinalBossLightingParam.cs @@ -2,10 +2,6 @@ public class FinalBossLightingParam : BaseParam { public FinalBossLightingParam() { } - public FinalBossLightingParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/GameCameraParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/GameCameraParam.cs index 3c611ac..b787e54 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/GameCameraParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/GameCameraParam.cs @@ -30,69 +30,65 @@ public class GameCameraParam : BaseParam public int Field64 { get; set; } public GameCameraParam() { } - public GameCameraParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); - Field20 = reader.Read(); - Field24 = reader.Read(); - Field28 = reader.Read(); - Field2C = reader.Read(); - Field30 = reader.Read(); - Field34 = reader.Read(); - Field38 = reader.Read(); - Field3C = reader.Read(); - Field40 = reader.Read(); - Field44 = reader.Read(); - Field48 = reader.Read(); - Field4C = reader.Read(); - NearCullingPlane = reader.Read(); - FarCullingPlane = reader.Read(); - Field58 = reader.Read(); - Field5C = reader.Read(); - Field60 = reader.Read(); - Field64 = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); + Field08 = reader.ReadInt32(); + Field0C = reader.ReadInt32(); + Field10 = reader.ReadSingle(); + Field14 = reader.ReadSingle(); + Field18 = reader.ReadSingle(); + Field1C = reader.ReadInt32(); + Field20 = reader.ReadInt32(); + Field24 = reader.ReadInt32(); + Field28 = reader.ReadSingle(); + Field2C = reader.ReadSingle(); + Field30 = reader.ReadSingle(); + Field34 = reader.ReadInt32(); + Field38 = reader.ReadInt32(); + Field3C = reader.ReadInt32(); + Field40 = reader.ReadInt32(); + Field44 = reader.ReadSingle(); + Field48 = reader.ReadInt32(); + Field4C = reader.ReadInt32(); + NearCullingPlane = reader.ReadSingle(); + FarCullingPlane = reader.ReadSingle(); + Field58 = reader.ReadSingle(); + Field5C = reader.ReadInt32(); + Field60 = reader.ReadInt32(); + Field64 = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); - writer.Write(Field20); - writer.Write(Field24); - writer.Write(Field28); - writer.Write(Field2C); - writer.Write(Field30); - writer.Write(Field34); - writer.Write(Field38); - writer.Write(Field3C); - writer.Write(Field40); - writer.Write(Field44); - writer.Write(Field48); - writer.Write(Field4C); - writer.Write(NearCullingPlane); - writer.Write(FarCullingPlane); - writer.Write(Field58); - writer.Write(Field5C); - writer.Write(Field60); - writer.Write(Field64); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); + writer.WriteInt32(Field08); + writer.WriteInt32(Field0C); + writer.WriteSingle(Field10); + writer.WriteSingle(Field14); + writer.WriteSingle(Field18); + writer.WriteInt32(Field1C); + writer.WriteInt32(Field20); + writer.WriteInt32(Field24); + writer.WriteSingle(Field28); + writer.WriteSingle(Field2C); + writer.WriteSingle(Field30); + writer.WriteInt32(Field34); + writer.WriteInt32(Field38); + writer.WriteInt32(Field3C); + writer.WriteInt32(Field40); + writer.WriteSingle(Field44); + writer.WriteInt32(Field48); + writer.WriteInt32(Field4C); + writer.WriteSingle(NearCullingPlane); + writer.WriteSingle(FarCullingPlane); + writer.WriteSingle(Field58); + writer.WriteInt32(Field5C); + writer.WriteInt32(Field60); + writer.WriteInt32(Field64); } public override int GetTypeID(GameType game) { return (int)ParameterType.GameCamera; } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/GeneralTriggerParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/GeneralTriggerParam.cs index a37abab..631f64d 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/GeneralTriggerParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/GeneralTriggerParam.cs @@ -7,20 +7,15 @@ public class GeneralTriggerParam : BaseParam public GeneralTriggerParam() { } - public GeneralTriggerParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } - public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); + Field00 = reader.ReadUInt32(); TriggerName = reader.ReadString(StringBinaryFormat.FixedLength, 64); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); + writer.WriteUInt32(Field00); writer.WriteString(StringBinaryFormat.FixedLength, TriggerName, 64); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/LetterboxParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/LetterboxParam.cs index 73f6c93..dc2a51b 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/LetterboxParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/LetterboxParam.cs @@ -5,10 +5,6 @@ public class LetterboxParam : BaseParam public float[] CurveData { get; set; } = new float[32]; public LetterboxParam() { } - public LetterboxParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MaterialAnimParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MaterialAnimParam.cs index 243e90c..789fa3d 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MaterialAnimParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MaterialAnimParam.cs @@ -11,29 +11,24 @@ public class MaterialAnimParam : BaseParam public MaterialAnimParam() { } - public MaterialAnimParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } - public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); + Field00 = reader.ReadInt32(); Name = reader.ReadDiString(64); - Field44 = reader.Read(); - Field48 = reader.Read(); - Field4C = reader.Read(); - Field50 = reader.Read(); + Field44 = reader.ReadInt32(); + Field48 = reader.ReadSingle(); + Field4C = reader.ReadInt32(); + Field50 = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); + writer.WriteInt32(Field00); writer.WriteDiString(Name, 64); - writer.Write(Field44); - writer.Write(Field48); - writer.Write(Field4C); - writer.Write(Field50); + writer.WriteInt32(Field44); + writer.WriteSingle(Field48); + writer.WriteInt32(Field4C); + writer.WriteInt32(Field50); } public override int GetTypeID(GameType game) { return (int)ParameterType.MaterialAnimation; } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MaterialParameterParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MaterialParameterParam.cs index 010286d..b39558d 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MaterialParameterParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MaterialParameterParam.cs @@ -9,16 +9,11 @@ public class MaterialParameterParam : BaseParam public MaterialParameterParam() { } - public MaterialParameterParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } - public override void Read(BinaryObjectReader reader, GameType game) { MaterialName = reader.ReadString(StringBinaryFormat.FixedLength, 64); ParamName = reader.ReadString(StringBinaryFormat.FixedLength, 64); - Type = reader.Read(); + Type = reader.ReadUInt32(); reader.ReadArray(40, UnknownData); } @@ -26,7 +21,7 @@ public override void Write(BinaryObjectWriter writer, GameType game) { writer.WriteString(StringBinaryFormat.FixedLength, MaterialName, 64); writer.WriteString(StringBinaryFormat.FixedLength, ParamName, 64); - writer.Write(Type); + writer.WriteUInt32(Type); writer.WriteArrayFixedLength(UnknownData, 40); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MovieDisplayParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MovieDisplayParam.cs index 2e41a71..400dffe 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MovieDisplayParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/MovieDisplayParam.cs @@ -3,10 +3,6 @@ namespace SharpNeedle.Framework.SonicTeam.DiEvent.Parameters; public class MovieDisplayParam : BaseParam { public MovieDisplayParam() { } - public MovieDisplayParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/PathAdjustParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/PathAdjustParam.cs index c608a35..0eb9efd 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/PathAdjustParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/PathAdjustParam.cs @@ -9,27 +9,23 @@ public class PathAdjustParam : BaseParam public int Field4C { get; set; } public PathAdjustParam() { } - public PathAdjustParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - LocalTransform = reader.Read(); - Field40 = reader.Read(); - Field44 = reader.Read(); - Field48 = reader.Read(); - Field4C = reader.Read(); + LocalTransform = reader.ReadMatrix4x4(); + Field40 = reader.ReadInt32(); + Field44 = reader.ReadInt32(); + Field48 = reader.ReadInt32(); + Field4C = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(LocalTransform); - writer.Write(Field40); - writer.Write(Field44); - writer.Write(Field48); - writer.Write(Field4C); + writer.WriteMatrix4x4(LocalTransform); + writer.WriteInt32(Field40); + writer.WriteInt32(Field44); + writer.WriteInt32(Field48); + writer.WriteInt32(Field4C); } public override int GetTypeID(GameType game) { return (int)ParameterType.PathAdjust; } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/QTEParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/QTEParam.cs index 638c75f..fdea638 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/QTEParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/QTEParam.cs @@ -41,45 +41,41 @@ public class QTEParam : BaseParam public uint Field1C0 { get; set; } public QTEParam() { } - public QTEParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); - Field20 = reader.Read(); - Field24 = reader.Read(); - Field28 = reader.Read(); - Field2C = reader.Read(); - Field30 = reader.Read(); - Field34 = reader.Read(); - Field38 = reader.Read(); - Field3C = reader.Read(); - Field40 = reader.Read(); - Field44 = reader.Read(); - Field48 = reader.Read(); - Field4C = reader.Read(); - Field50 = reader.Read(); - Field54 = reader.Read(); - Field58 = reader.Read(); - Field5C = reader.Read(); - Field60 = reader.Read(); - Field64 = reader.Read(); - Field68 = reader.Read(); - Field6C = reader.Read(); - Field70 = reader.Read(); - Field74 = reader.Read(); - Field78 = reader.Read(); - Field7C = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); + Field08 = reader.ReadSingle(); + Field0C = reader.ReadSingle(); + Field10 = reader.ReadSingle(); + Field14 = reader.ReadSingle(); + Field18 = reader.ReadSingle(); + Field1C = reader.ReadInt32(); + Field20 = reader.ReadInt32(); + Field24 = reader.ReadInt32(); + Field28 = reader.ReadInt32(); + Field2C = reader.ReadInt32(); + Field30 = reader.ReadInt32(); + Field34 = reader.ReadInt32(); + Field38 = reader.ReadInt32(); + Field3C = reader.ReadInt32(); + Field40 = reader.ReadInt32(); + Field44 = reader.ReadInt32(); + Field48 = reader.ReadInt32(); + Field4C = reader.ReadInt32(); + Field50 = reader.ReadInt32(); + Field54 = reader.ReadInt32(); + Field58 = reader.ReadInt32(); + Field5C = reader.ReadInt32(); + Field60 = reader.ReadInt32(); + Field64 = reader.ReadInt32(); + Field68 = reader.ReadInt32(); + Field6C = reader.ReadInt32(); + Field70 = reader.ReadSingle(); + Field74 = reader.ReadSingle(); + Field78 = reader.ReadSingle(); + Field7C = reader.ReadSingle(); reader.ReadArray(32, Field80); Field100 = reader.ReadString(StringBinaryFormat.FixedLength, 64); @@ -88,44 +84,44 @@ public override void Read(BinaryObjectReader reader, GameType game) if (game == GameType.ShadowGenerations) { Field180 = reader.ReadString(StringBinaryFormat.FixedLength, 64); - Field1C0 = reader.Read(); + Field1C0 = reader.ReadUInt32(); } } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); - writer.Write(Field20); - writer.Write(Field24); - writer.Write(Field28); - writer.Write(Field2C); - writer.Write(Field30); - writer.Write(Field34); - writer.Write(Field38); - writer.Write(Field3C); - writer.Write(Field40); - writer.Write(Field44); - writer.Write(Field48); - writer.Write(Field4C); - writer.Write(Field50); - writer.Write(Field54); - writer.Write(Field58); - writer.Write(Field5C); - writer.Write(Field60); - writer.Write(Field64); - writer.Write(Field68); - writer.Write(Field6C); - writer.Write(Field70); - writer.Write(Field74); - writer.Write(Field78); - writer.Write(Field7C); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); + writer.WriteSingle(Field08); + writer.WriteSingle(Field0C); + writer.WriteSingle(Field10); + writer.WriteSingle(Field14); + writer.WriteSingle(Field18); + writer.WriteSingle(Field1C); + writer.WriteSingle(Field20); + writer.WriteInt32(Field24); + writer.WriteInt32(Field28); + writer.WriteInt32(Field2C); + writer.WriteInt32(Field30); + writer.WriteInt32(Field34); + writer.WriteInt32(Field38); + writer.WriteInt32(Field3C); + writer.WriteInt32(Field40); + writer.WriteInt32(Field44); + writer.WriteInt32(Field48); + writer.WriteInt32(Field4C); + writer.WriteInt32(Field50); + writer.WriteInt32(Field54); + writer.WriteInt32(Field58); + writer.WriteInt32(Field5C); + writer.WriteInt32(Field60); + writer.WriteInt32(Field64); + writer.WriteInt32(Field68); + writer.WriteInt32(Field6C); + writer.WriteSingle(Field70); + writer.WriteSingle(Field74); + writer.WriteSingle(Field78); + writer.WriteSingle(Field7C); writer.WriteArrayFixedLength(Field80, 32); writer.WriteString(StringBinaryFormat.FixedLength, Field100, 64); @@ -134,7 +130,7 @@ public override void Write(BinaryObjectWriter writer, GameType game) if (game == GameType.ShadowGenerations) { writer.WriteString(StringBinaryFormat.FixedLength, Field180, 64); - writer.Write(Field1C0); + writer.WriteUInt32(Field1C0); } } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ShadowAfterimageParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ShadowAfterimageParam.cs index d17d486..4805791 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ShadowAfterimageParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ShadowAfterimageParam.cs @@ -15,35 +15,31 @@ public class ShadowAfterimageParam : BaseParam public int Field2C { get; set; } public ShadowAfterimageParam() { } - public ShadowAfterimageParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Color = reader.Read>(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); - Field20 = reader.Read(); - Field24 = reader.Read(); - Field28 = reader.Read(); - Field2C = reader.Read(); + Color = reader.ReadObject>(); + Field10 = reader.ReadInt32(); + Field14 = reader.ReadInt32(); + Field18 = reader.ReadInt32(); + Field1C = reader.ReadInt32(); + Field20 = reader.ReadInt32(); + Field24 = reader.ReadSingle(); + Field28 = reader.ReadSingle(); + Field2C = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Color); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); - writer.Write(Field20); - writer.Write(Field24); - writer.Write(Field28); - writer.Write(Field2C); + writer.WriteObject(Color); + writer.WriteInt32(Field10); + writer.WriteInt32(Field14); + writer.WriteInt32(Field18); + writer.WriteInt32(Field1C); + writer.WriteInt32(Field20); + writer.WriteSingle(Field24); + writer.WriteSingle(Field28); + writer.WriteInt32(Field2C); } public override int GetTypeID(GameType game) diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ShadowResolutionParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ShadowResolutionParam.cs index 8f35a2e..803b53c 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ShadowResolutionParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/ShadowResolutionParam.cs @@ -7,19 +7,15 @@ public class ShadowResolutionParam : BaseParam public Vector2Int Resolution { get; set; } public ShadowResolutionParam() { } - public ShadowResolutionParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Resolution = reader.Read(); + Resolution = reader.ReadObject(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Resolution); + writer.WriteObject(Resolution); } public override int GetTypeID(GameType game) diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SonicCameraParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SonicCameraParam.cs index 8ff6ce2..a93cb6b 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SonicCameraParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SonicCameraParam.cs @@ -14,36 +14,32 @@ public class SonicCameraParam : BaseParam public byte[] UnknownData { get; set; } = new byte[268]; public SonicCameraParam() { } - public SonicCameraParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Flags = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field1C = reader.Read(); - Field20 = reader.Read(); - Field24 = reader.Read(); - Field28 = reader.Read(); + Flags = reader.ReadUInt32(); + Field04 = reader.ReadUInt32(); + Field08 = reader.ReadUInt32(); + Field0C = reader.ReadUInt32(); + Field10 = reader.ReadVector3(); + Field1C = reader.ReadUInt32(); + Field20 = reader.ReadUInt32(); + Field24 = reader.ReadUInt32(); + Field28 = reader.ReadVector3(); reader.ReadArray(268, UnknownData); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Flags); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field1C); - writer.Write(Field20); - writer.Write(Field24); - writer.Write(Field28); + writer.WriteUInt32(Flags); + writer.WriteUInt32(Field04); + writer.WriteUInt32(Field08); + writer.WriteUInt32(Field0C); + writer.WriteVector3(Field10); + writer.WriteUInt32(Field1C); + writer.WriteUInt32(Field20); + writer.WriteUInt32(Field24); + writer.WriteVector3(Field28); writer.WriteArrayFixedLength(UnknownData, 268); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SoundParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SoundParam.cs index b98fd5b..3b0cf4d 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SoundParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SoundParam.cs @@ -8,23 +8,19 @@ public class SoundParam : BaseParam public SoundParam() { } - public SoundParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { CueName = reader.ReadDiString(64); - Field40 = reader.Read(); - Field44 = reader.Read(); + Field40 = reader.ReadInt32(); + Field44 = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { writer.WriteDiString(CueName); - writer.Write(Field40); - writer.Write(Field44); + writer.WriteInt32(Field40); + writer.WriteInt32(Field44); } public override int GetTypeID(GameType game) diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SubtitleParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SubtitleParam.cs index a0703e5..adf9fc4 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SubtitleParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/SubtitleParam.cs @@ -10,27 +10,23 @@ public class SubtitleParam : BaseParam public string CellName2 { get; set; } = string.Empty; public SubtitleParam() { } - public SubtitleParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { if (game == GameType.ShadowGenerations) { CellName = reader.ReadDiString(32); - Language = (SubtitleLanguage)reader.Read(); - Field14 = reader.Read(); - Field24 = reader.Read(); - Field28 = reader.Read(); + Language = (SubtitleLanguage)reader.ReadInt32(); + Field14 = reader.ReadInt32(); + Field24 = reader.ReadInt32(); + Field28 = reader.ReadInt32(); CellName2 = reader.ReadDiString(32); } else { CellName = reader.ReadDiString(16); - Language = (SubtitleLanguage)reader.Read(); - Field14 = reader.Read(); + Language = (SubtitleLanguage)reader.ReadInt32(); + Field14 = reader.ReadInt32(); } } @@ -39,17 +35,17 @@ public override void Write(BinaryObjectWriter writer, GameType game) if (game == GameType.ShadowGenerations) { writer.WriteDiString(CellName, 32); - writer.Write((int)Language); - writer.Write(Field14); - writer.Write(Field24); - writer.Write(Field28); + writer.WriteInt32((int)Language); + writer.WriteInt32(Field14); + writer.WriteInt32(Field24); + writer.WriteInt32(Field28); writer.WriteDiString(CellName2, 32); } else { writer.WriteDiString(CellName, 16); - writer.Write((int)Language); - writer.Write(Field14); + writer.WriteInt32((int)Language); + writer.WriteInt32(Field14); } } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TheEndCableParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TheEndCableParam.cs index d4cd289..364bc52 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TheEndCableParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TheEndCableParam.cs @@ -7,22 +7,18 @@ public class TheEndCableParam : BaseParam public float[] Field08 { get; set; } = new float[1024]; public TheEndCableParam() { } - public TheEndCableParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); reader.ReadArray(1024, Field08); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); writer.WriteArrayFixedLength(Field08, 1024); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeParam.cs index 66621f3..b638448 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeParam.cs @@ -14,36 +14,32 @@ public class TimeParam : BaseParam public float[] DataCurve { get; set; } = new float[32]; public TimeParam() { } - public TimeParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); - Field20 = reader.Read(); + Field00 = reader.ReadUInt32(); + Field04 = reader.ReadUInt32(); + Field08 = reader.ReadUInt32(); + Field0C = reader.ReadUInt32(); + Field10 = reader.ReadUInt32(); + Field14 = reader.ReadUInt32(); + Field18 = reader.ReadUInt32(); + Field1C = reader.ReadUInt32(); + Field20 = reader.ReadUInt32(); reader.ReadArray(32, DataCurve); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); - writer.Write(Field20); + writer.WriteUInt32(Field00); + writer.WriteUInt32(Field04); + writer.WriteUInt32(Field08); + writer.WriteUInt32(Field0C); + writer.WriteUInt32(Field10); + writer.WriteUInt32(Field14); + writer.WriteUInt32(Field18); + writer.WriteUInt32(Field1C); + writer.WriteUInt32(Field20); writer.WriteArrayFixedLength(DataCurve, 32); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopControlParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopControlParam.cs index cd39678..299bbb8 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopControlParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopControlParam.cs @@ -7,23 +7,19 @@ public class TimeStopControlParam : BaseParam public float TransitionDuration { get; set; } public TimeStopControlParam() { } - public TimeStopControlParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Behavior = reader.Read(); - Field04 = reader.Read(); - TransitionDuration = reader.Read(); + Behavior = reader.ReadInt32(); + Field04 = reader.ReadSingle(); + TransitionDuration = reader.ReadSingle(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Behavior); - writer.Write(Field04); - writer.Write(TransitionDuration); + writer.WriteInt32(Behavior); + writer.WriteSingle(Field04); + writer.WriteSingle(TransitionDuration); } public override int GetTypeID(GameType game) diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopObjectBehaviorParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopObjectBehaviorParam.cs index 88fce26..9b9d462 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopObjectBehaviorParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopObjectBehaviorParam.cs @@ -5,19 +5,15 @@ public class TimeStopObjectBehaviorParam : BaseParam public int Mode { get; set; } public TimeStopObjectBehaviorParam() { } - public TimeStopObjectBehaviorParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Mode = reader.Read(); + Mode = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Mode); + writer.WriteInt32(Mode); } public override int GetTypeID(GameType game) diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopParam.cs index cc97546..7cd0f11 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimeStopParam.cs @@ -7,23 +7,19 @@ public class TimeStopParam : BaseParam public float Field08 { get; set; } public TimeStopParam() { } - public TimeStopParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadSingle(); + Field08 = reader.ReadSingle(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); + writer.WriteInt32(Field00); + writer.WriteSingle(Field04); + writer.WriteSingle(Field08); } public override int GetTypeID(GameType game) diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimescaleParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimescaleParam.cs index 2dcd9a9..8b00bbd 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimescaleParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/TimescaleParam.cs @@ -8,25 +8,21 @@ public class TimescaleParam : BaseParam public int Field0C { get; set; } public TimescaleParam() { } - public TimescaleParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Scale = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); + Field00 = reader.ReadInt32(); + Scale = reader.ReadSingle(); + Field08 = reader.ReadInt32(); + Field0C = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Scale); - writer.Write(Field08); - writer.Write(Field0C); + writer.WriteInt32(Field00); + writer.WriteSingle(Scale); + writer.WriteInt32(Field08); + writer.WriteInt32(Field0C); } public override int GetTypeID(GameType game) diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/UVAnimParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/UVAnimParam.cs index 3acaae7..eea509f 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/UVAnimParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/UVAnimParam.cs @@ -11,29 +11,25 @@ public class UVAnimParam : BaseParam public UVAnimParam() { } - public UVAnimParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); + Field00 = reader.ReadInt32(); Name = reader.ReadDiString(64); - Field44 = reader.Read(); - Field48 = reader.Read(); - Field4C = reader.Read(); - Field50 = reader.Read(); + Field44 = reader.ReadInt32(); + Field48 = reader.ReadSingle(); + Field4C = reader.ReadInt32(); + Field50 = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); + writer.WriteInt32(Field00); writer.WriteDiString(Name, 64); - writer.Write(Field44); - writer.Write(Field48); - writer.Write(Field4C); - writer.Write(Field50); + writer.WriteInt32(Field44); + writer.WriteSingle(Field48); + writer.WriteInt32(Field4C); + writer.WriteInt32(Field50); } public override int GetTypeID(GameType game) { return (int)ParameterType.UVAnimation; } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/UnknownParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/UnknownParam.cs index 3d1f679..341c0cc 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/UnknownParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/UnknownParam.cs @@ -8,17 +8,15 @@ public class UnknownParam : BaseParam public UnknownParam() { } - public UnknownParam(BinaryObjectReader reader, int size, int type) + public UnknownParam(int size, int type) { Size = size; Type = type; - Data = new byte[Size * 4]; - - Read(reader, GameType.Common); } public override void Read(BinaryObjectReader reader, GameType game) { + Data = new byte[Size * 4]; reader.ReadArray(Size * 4, Data); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/VignetteParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/VignetteParam.cs index a2ac07d..ebe751d 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/VignetteParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/VignetteParam.cs @@ -55,119 +55,115 @@ public class VignetteParam : BaseParam public float[] ValuesTimeline { get; set; } = new float[32]; public VignetteParam() { } - public VignetteParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); - Field20 = reader.Read(); - Field24 = reader.Read(); - Field28 = reader.Read(); - Field2C = reader.Read(); - Field30 = reader.Read(); - Field34 = reader.Read(); - Field38 = reader.Read(); - Field3C = reader.Read(); - Field40 = reader.Read(); - Field44 = reader.Read(); - Field48 = reader.Read(); - Field4C = reader.Read(); - Field50 = reader.Read(); - Field54 = reader.Read(); - Field58 = reader.Read(); - Field5C = reader.Read(); - Field60 = reader.Read(); - Field64 = reader.Read(); - Field68 = reader.Read(); - Field6C = reader.Read(); - Field70 = reader.Read(); - Field74 = reader.Read(); - Field78 = reader.Read(); - Field7C = reader.Read(); - Field80 = reader.Read(); - Field84 = reader.Read(); - Field88 = reader.Read(); - Field8C = reader.Read(); - Field90 = reader.Read(); - Field94 = reader.Read(); - Field98 = reader.Read(); - Field9C = reader.Read(); - FieldA0 = reader.Read(); - FieldA4 = reader.Read(); - FieldA8 = reader.Read(); - FieldAC = reader.Read(); - FieldB0 = reader.Read(); - FieldB4 = reader.Read(); - FieldB8 = reader.Read(); - FieldBC = reader.Read(); - FieldC0 = reader.Read(); - FieldC4 = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); + Field08 = reader.ReadSingle(); + Field0C = reader.ReadSingle(); + Field10 = reader.ReadSingle(); + Field14 = reader.ReadSingle(); + Field18 = reader.ReadSingle(); + Field1C = reader.ReadSingle(); + Field20 = reader.ReadSingle(); + Field24 = reader.ReadInt32(); + Field28 = reader.ReadSingle(); + Field2C = reader.ReadSingle(); + Field30 = reader.ReadSingle(); + Field34 = reader.ReadSingle(); + Field38 = reader.ReadSingle(); + Field3C = reader.ReadSingle(); + Field40 = reader.ReadSingle(); + Field44 = reader.ReadSingle(); + Field48 = reader.ReadSingle(); + Field4C = reader.ReadSingle(); + Field50 = reader.ReadSingle(); + Field54 = reader.ReadSingle(); + Field58 = reader.ReadSingle(); + Field5C = reader.ReadSingle(); + Field60 = reader.ReadSingle(); + Field64 = reader.ReadSingle(); + Field68 = reader.ReadSingle(); + Field6C = reader.ReadSingle(); + Field70 = reader.ReadSingle(); + Field74 = reader.ReadSingle(); + Field78 = reader.ReadSingle(); + Field7C = reader.ReadSingle(); + Field80 = reader.ReadSingle(); + Field84 = reader.ReadSingle(); + Field88 = reader.ReadInt32(); + Field8C = reader.ReadSingle(); + Field90 = reader.ReadSingle(); + Field94 = reader.ReadSingle(); + Field98 = reader.ReadSingle(); + Field9C = reader.ReadSingle(); + FieldA0 = reader.ReadSingle(); + FieldA4 = reader.ReadSingle(); + FieldA8 = reader.ReadSingle(); + FieldAC = reader.ReadSingle(); + FieldB0 = reader.ReadSingle(); + FieldB4 = reader.ReadSingle(); + FieldB8 = reader.ReadSingle(); + FieldBC = reader.ReadSingle(); + FieldC0 = reader.ReadSingle(); + FieldC4 = reader.ReadSingle(); reader.ReadArray(32, ValuesTimeline); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); - writer.Write(Field20); - writer.Write(Field24); - writer.Write(Field28); - writer.Write(Field2C); - writer.Write(Field30); - writer.Write(Field34); - writer.Write(Field38); - writer.Write(Field3C); - writer.Write(Field40); - writer.Write(Field44); - writer.Write(Field48); - writer.Write(Field4C); - writer.Write(Field50); - writer.Write(Field54); - writer.Write(Field58); - writer.Write(Field5C); - writer.Write(Field60); - writer.Write(Field64); - writer.Write(Field68); - writer.Write(Field6C); - writer.Write(Field70); - writer.Write(Field74); - writer.Write(Field78); - writer.Write(Field7C); - writer.Write(Field80); - writer.Write(Field84); - writer.Write(Field88); - writer.Write(Field8C); - writer.Write(Field90); - writer.Write(Field94); - writer.Write(Field98); - writer.Write(Field9C); - writer.Write(FieldA0); - writer.Write(FieldA4); - writer.Write(FieldA8); - writer.Write(FieldAC); - writer.Write(FieldB0); - writer.Write(FieldB4); - writer.Write(FieldB8); - writer.Write(FieldBC); - writer.Write(FieldC0); - writer.Write(FieldC4); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); + writer.WriteSingle(Field08); + writer.WriteSingle(Field0C); + writer.WriteSingle(Field10); + writer.WriteSingle(Field14); + writer.WriteSingle(Field18); + writer.WriteSingle(Field1C); + writer.WriteSingle(Field20); + writer.WriteSingle(Field24); + writer.WriteSingle(Field28); + writer.WriteSingle(Field2C); + writer.WriteSingle(Field30); + writer.WriteSingle(Field34); + writer.WriteSingle(Field38); + writer.WriteSingle(Field3C); + writer.WriteSingle(Field40); + writer.WriteSingle(Field44); + writer.WriteSingle(Field48); + writer.WriteSingle(Field4C); + writer.WriteSingle(Field50); + writer.WriteSingle(Field54); + writer.WriteSingle(Field58); + writer.WriteSingle(Field5C); + writer.WriteSingle(Field60); + writer.WriteSingle(Field64); + writer.WriteSingle(Field68); + writer.WriteSingle(Field6C); + writer.WriteSingle(Field70); + writer.WriteSingle(Field74); + writer.WriteSingle(Field78); + writer.WriteSingle(Field7C); + writer.WriteSingle(Field80); + writer.WriteSingle(Field84); + writer.WriteInt32(Field88); + writer.WriteSingle(Field8C); + writer.WriteSingle(Field90); + writer.WriteSingle(Field94); + writer.WriteSingle(Field98); + writer.WriteSingle(Field9C); + writer.WriteSingle(FieldA0); + writer.WriteSingle(FieldA4); + writer.WriteSingle(FieldA8); + writer.WriteSingle(FieldAC); + writer.WriteSingle(FieldB0); + writer.WriteSingle(FieldB4); + writer.WriteSingle(FieldB8); + writer.WriteSingle(FieldBC); + writer.WriteSingle(FieldC0); + writer.WriteSingle(FieldC4); writer.WriteArrayFixedLength(ValuesTimeline, 32); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/VisibilityAnimParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/VisibilityAnimParam.cs index 2caefe2..97e33d5 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/VisibilityAnimParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/VisibilityAnimParam.cs @@ -11,29 +11,24 @@ public class VisibilityAnimParam : BaseParam public VisibilityAnimParam() { } - public VisibilityAnimParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } - public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); + Field00 = reader.ReadInt32(); Name = reader.ReadDiString(64); - Field44 = reader.Read(); - Field48 = reader.Read(); - Field4C = reader.Read(); - Field50 = reader.Read(); + Field44 = reader.ReadInt32(); + Field48 = reader.ReadSingle(); + Field4C = reader.ReadInt32(); + Field50 = reader.ReadInt32(); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); + writer.WriteInt32(Field00); writer.WriteDiString(Name, 64); - writer.Write(Field44); - writer.Write(Field48); - writer.Write(Field4C); - writer.Write(Field50); + writer.WriteInt32(Field44); + writer.WriteSingle(Field48); + writer.WriteInt32(Field4C); + writer.WriteInt32(Field50); } public override int GetTypeID(GameType game) { return (int)ParameterType.VisibilityAnimation; } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/WeatherParam.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/WeatherParam.cs index 1e7c4f5..b995a41 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/WeatherParam.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Parameters/WeatherParam.cs @@ -6,20 +6,16 @@ public class WeatherParam : BaseParam public float[] DataCurve { get; set; } = new float[32]; public WeatherParam() { } - public WeatherParam(BinaryObjectReader reader, GameType game) - { - Read(reader, game); - } public override void Read(BinaryObjectReader reader, GameType game) { - Field00 = reader.Read(); + Field00 = reader.ReadUInt32(); reader.ReadArray(32, DataCurve); } public override void Write(BinaryObjectWriter writer, GameType game) { - writer.Write(Field00); + writer.WriteUInt32(Field00); writer.WriteArrayFixedLength(DataCurve, 32); } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Resource.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Resource.cs index afffcbb..a313e7c 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Resource.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Resource.cs @@ -23,19 +23,19 @@ public Resource(string name, ResourceType type) : this(name) public void Read(BinaryObjectReader reader) { - GUID = reader.Read(); - ResType = (ResourceType)reader.Read(); - Flags = reader.Read(); - Field18 = reader.Read(); + GUID = reader.ReadGuid(); + ResType = (ResourceType)reader.ReadInt32(); + Flags = reader.ReadUInt32(); + Field18 = reader.ReadInt32(); Name = reader.ReadString(StringBinaryFormat.FixedLength, 788); } public void Write(BinaryObjectWriter writer) { - writer.Write(GUID); - writer.Write((int)ResType); - writer.Write(Flags); - writer.Write(Field18); + writer.WriteGuid(GUID); + writer.WriteInt32((int)ResType); + writer.WriteUInt32(Flags); + writer.WriteInt32(Field18); writer.WriteString(StringBinaryFormat.FixedLength, Name, 788); } } diff --git a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Scene.cs b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Scene.cs index 4414bcf..97d4e49 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Scene.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/DiEvent/Scene.cs @@ -52,10 +52,14 @@ public void Read(IFile file, GameType game) } public override void Write(IFile file) - => Write(file, LastGame); + { + Write(file, LastGame); + } public void Write(string path, GameType game) - => Write(FileSystem.Instance.Create(path), game); + { + Write(FileSystem.Instance.Create(path), game); + } public void Write(IFile file, GameType game) { @@ -80,14 +84,14 @@ public void Read(BinaryObjectReader reader, GameType game) { reader.Skip(8); - StartFrame = reader.Read(); - EndFrame = reader.Read(); - NodeDrawCount = reader.Read(); + StartFrame = reader.ReadSingle(); + EndFrame = reader.ReadSingle(); + NodeDrawCount = reader.ReadInt32(); reader.ReadOffset(() => { - int cutCount = reader.Read(); - int allocSize = reader.Read(); + int cutCount = reader.ReadInt32(); + int allocSize = reader.ReadInt32(); reader.Skip(8); reader.ReadCollection(cutCount, Cuts); @@ -95,8 +99,8 @@ public void Read(BinaryObjectReader reader, GameType game) reader.ReadOffset(() => { - int pageCount = reader.Read(); - int allocSize = reader.Read(); + int pageCount = reader.ReadInt32(); + int allocSize = reader.ReadInt32(); reader.Skip(8); Pages.AddRange(reader.ReadObjectArray(pageCount)); @@ -104,15 +108,15 @@ public void Read(BinaryObjectReader reader, GameType game) reader.ReadOffset(() => { - int unknownCount = reader.Read(); - int allocSize = reader.Read(); + int unknownCount = reader.ReadInt32(); + int allocSize = reader.ReadInt32(); reader.Skip(8); }); reader.ReadOffset(() => { - int resourceCutCount = reader.Read(); - int allocSize = reader.Read(); + int resourceCutCount = reader.ReadInt32(); + int allocSize = reader.ReadInt32(); reader.Skip(8); reader.ReadCollection(resourceCutCount, ResourceCuts); @@ -120,25 +124,25 @@ public void Read(BinaryObjectReader reader, GameType game) reader.ReadOffset(() => { - int unknownCount = reader.Read(); - int allocSize = reader.Read(); + int unknownCount = reader.ReadInt32(); + int allocSize = reader.ReadInt32(); reader.Skip(8); }); reader.ReadOffset(() => RootNode.Read(reader, game)); - ChainCameraIn = reader.Read(); - ChainCameraOut = reader.Read(); - Type = reader.Read(); - SkipPointTick = reader.Read(); + ChainCameraIn = reader.ReadSingle(); + ChainCameraOut = reader.ReadSingle(); + Type = reader.ReadInt32(); + SkipPointTick = reader.ReadInt32(); reader.Skip(4); } reader.ReadAtOffset(resourcesOffset, () => { - int resourceCount = reader.Read(); - int allocSize = reader.Read(); + int resourceCount = reader.ReadInt32(); + int allocSize = reader.ReadInt32(); reader.Skip(8); Resources.AddRange(reader.ReadObjectArray(resourceCount)); @@ -154,9 +158,9 @@ public void Write(BinaryObjectWriter writer, GameType game) { writer.WriteNulls(8); - writer.Write(StartFrame); - writer.Write(EndFrame); - writer.Write(NodeDrawCount); + writer.WriteSingle(StartFrame); + writer.WriteSingle(EndFrame); + writer.WriteInt32(NodeDrawCount); long posCutsOffset = writer.Position; long posPagesOffset = writer.Position + 4; @@ -166,19 +170,19 @@ public void Write(BinaryObjectWriter writer, GameType game) long rootNodeOffsetPos = writer.Position + 20; writer.WriteNulls(24); - writer.Write(ChainCameraIn); - writer.Write(ChainCameraOut); - writer.Write(Type); - writer.Write(SkipPointTick); + writer.WriteSingle(ChainCameraIn); + writer.WriteSingle(ChainCameraOut); + writer.WriteInt32(Type); + writer.WriteInt32(SkipPointTick); writer.WriteNulls(4); { long posCuts = writer.Position; writer.Seek(posCutsOffset, SeekOrigin.Begin); - writer.Write((int)(posCuts - posStart)); + writer.WriteInt32((int)(posCuts - posStart)); writer.Seek(posCuts, SeekOrigin.Begin); - writer.Write(Cuts.Count); + writer.WriteInt32(Cuts.Count); writer.WriteNulls(12); writer.WriteCollection(Cuts); } @@ -186,10 +190,10 @@ public void Write(BinaryObjectWriter writer, GameType game) { long posPages = writer.Position; writer.Seek(posPagesOffset, SeekOrigin.Begin); - writer.Write((int)(posPages - posStart)); + writer.WriteInt32((int)(posPages - posStart)); writer.Seek(posPages, SeekOrigin.Begin); - writer.Write(Pages.Count); + writer.WriteInt32(Pages.Count); long pageAllocSizePos = writer.Position; writer.WriteNulls(12); @@ -199,7 +203,7 @@ public void Write(BinaryObjectWriter writer, GameType game) long pageChunkSize = pageChunkEndPos - pageChunkStartPos; writer.Seek(pageAllocSizePos, SeekOrigin.Begin); - writer.Write((int)pageChunkSize); + writer.WriteInt32((int)pageChunkSize); writer.Seek(pageChunkEndPos, SeekOrigin.Begin); } @@ -207,7 +211,7 @@ public void Write(BinaryObjectWriter writer, GameType game) { long posUnknownList2 = writer.Position; writer.Seek(unknownList2OffsetPos, SeekOrigin.Begin); - writer.Write((int)(posUnknownList2 - posStart)); + writer.WriteInt32((int)(posUnknownList2 - posStart)); writer.Seek(posUnknownList2, SeekOrigin.Begin); writer.WriteNulls(16); @@ -216,10 +220,10 @@ public void Write(BinaryObjectWriter writer, GameType game) { long posResourceCuts = writer.Position; writer.Seek(posResourceCutsOffset, SeekOrigin.Begin); - writer.Write((int)(posResourceCuts - posStart)); + writer.WriteInt32((int)(posResourceCuts - posStart)); writer.Seek(posResourceCuts, SeekOrigin.Begin); - writer.Write(ResourceCuts.Count); + writer.WriteInt32(ResourceCuts.Count); writer.WriteNulls(12); writer.WriteCollection(ResourceCuts); } @@ -227,7 +231,7 @@ public void Write(BinaryObjectWriter writer, GameType game) { long posUnknownList4 = writer.Position; writer.Seek(unknownList4OffsetPos, SeekOrigin.Begin); - writer.Write((int)(posUnknownList4 - posStart)); + writer.WriteInt32((int)(posUnknownList4 - posStart)); writer.Seek(posUnknownList4, SeekOrigin.Begin); writer.WriteNulls(16); @@ -236,7 +240,7 @@ public void Write(BinaryObjectWriter writer, GameType game) { long posRootNode = writer.Position; writer.Seek(rootNodeOffsetPos, SeekOrigin.Begin); - writer.Write((int)(posRootNode - posStart)); + writer.WriteInt32((int)(posRootNode - posStart)); writer.Seek(posRootNode, SeekOrigin.Begin); RootNode.Write(writer, game); @@ -246,10 +250,10 @@ public void Write(BinaryObjectWriter writer, GameType game) { long posResources = writer.Position; writer.Seek(resourcesOffsetPos, SeekOrigin.Begin); - writer.Write((int)(posResources - posStart)); + writer.WriteInt32((int)(posResources - posStart)); writer.Seek(posResources, SeekOrigin.Begin); - writer.Write(Resources.Count); + writer.WriteInt32(Resources.Count); writer.WriteNulls(12); writer.WriteObjectCollection(Resources); diff --git a/Source/SharpNeedle/Framework/SonicTeam/GismoConfig.cs b/Source/SharpNeedle/Framework/SonicTeam/GismoConfig.cs index b95138b..7178388 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/GismoConfig.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/GismoConfig.cs @@ -21,9 +21,9 @@ public override void Read(BinaryObjectReader reader) reader.EnsureSignatureNative(Signature)); } - Version = reader.Read(); + Version = reader.ReadUInt32(); - int objectCount = reader.Read(); + int objectCount = reader.ReadInt32(); Objects.AddRange(reader.ReadObjectArrayOffset(base.Version.IsV1, objectCount)); } @@ -39,9 +39,9 @@ public override void Write(BinaryObjectWriter writer) writer.WriteNative(Signature)); } - writer.Write(Version); + writer.WriteUInt32(Version); - writer.Write(Objects.Count); + writer.WriteInt32(Objects.Count); writer.WriteObjectCollectionOffset(base.Version.IsV1, Objects); } @@ -83,26 +83,26 @@ public void Read(BinaryObjectReader reader, bool isV1) { if (isV1) { - Field00 = reader.Read(); - Field04 = reader.Read(); - Field08 = reader.Read(); - Field0A = reader.Read(); - Field0C = reader.Read(); - - ShapeType = (ShapeType)reader.Read(); - - Field0F = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - Field1C = reader.Read(); - Field20 = reader.Read(); - Field24 = reader.Read(); - Field28 = reader.Read(); - - Size = reader.Read(); // TODO: Unpack reading all 3 float values at once into individual reads based on ShapeType - - Field38 = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); + Field08 = reader.ReadInt16(); + Field0A = reader.ReadInt16(); + Field0C = reader.ReadInt16(); + + ShapeType = (ShapeType)reader.ReadByte(); + + Field0F = reader.ReadByte(); + Field10 = reader.ReadInt32(); + Field14 = reader.ReadInt32(); + Field18 = reader.ReadInt32(); + Field1C = reader.ReadInt32(); + Field20 = reader.ReadSingle(); + Field24 = reader.ReadSingle(); + Field28 = reader.ReadSingle(); + + Size = reader.ReadVector3(); // TODO: Unpack reading all 3 float values at once into individual reads based on ShapeType + + Field38 = reader.ReadInt32(); } Name = reader.ReadStringOffset(); @@ -116,14 +116,14 @@ public void Read(BinaryObjectReader reader, bool isV1) { ModelName = reader.ReadStringOffset(); SkeletonName = reader.ReadStringOffset(); - ShapeType = reader.Read(); - CollisionRadius = reader.Read(); - CollisionHeight = reader.Read(); + ShapeType = (ShapeType)reader.ReadByte(); + CollisionRadius = reader.ReadSingle(); + CollisionHeight = reader.ReadSingle(); - IsMotionOn = Convert.ToBoolean(reader.Read()); + IsMotionOn = Convert.ToBoolean(reader.ReadInt32()); Motion = reader.ReadObjectOffset(); - IsProgramMotionOn = Convert.ToBoolean(reader.Read()); + IsProgramMotionOn = Convert.ToBoolean(reader.ReadInt32()); ProgramMotion = reader.ReadObjectOffset(); } } @@ -133,42 +133,47 @@ public void Write(BinaryObjectWriter writer, bool isV1) if (isV1) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(Field08); - writer.Write(Field0A); - writer.Write(Field0C); - - writer.Write((byte)ShapeType); - - writer.Write(Field0F); - writer.Write(Field10); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(Field1C); - writer.Write(Field20); - writer.Write(Field24); - writer.Write(Field28); - - writer.Write(Size); // TODO: Unpack writing all 3 float values at once into individual reads based on ShapeType - - writer.Write(Field38); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); + writer.WriteInt16(Field08); + writer.WriteInt16(Field0A); + writer.WriteInt16(Field0C); + + writer.WriteByte((byte)ShapeType); + + writer.WriteByte(Field0F); + writer.WriteInt32(Field10); + writer.WriteInt32(Field14); + writer.WriteInt32(Field18); + writer.WriteInt32(Field1C); + writer.WriteSingle(Field20); + writer.WriteSingle(Field24); + writer.WriteSingle(Field28); + + writer.WriteVector3(Size); // TODO: Unpack writing all 3 float values at once into individual reads based on ShapeType + + writer.WriteInt32(Field38); } writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.WriteStringOffset(StringBinaryFormat.NullTerminated, ModelName); - writer.WriteStringOffset(StringBinaryFormat.NullTerminated, SkeletonName); - if (!isV1) + if (isV1) + { + writer.WriteStringOffset(StringBinaryFormat.NullTerminated, ParticleName); + writer.WriteStringOffset(StringBinaryFormat.NullTerminated, SoundCueName); + } + else { - writer.Write(ShapeType); - writer.Write(CollisionRadius); - writer.Write(CollisionHeight); + writer.WriteStringOffset(StringBinaryFormat.NullTerminated, ModelName); + writer.WriteStringOffset(StringBinaryFormat.NullTerminated, SkeletonName); + writer.WriteByte((byte)ShapeType); + writer.WriteSingle(CollisionRadius); + writer.WriteSingle(CollisionHeight); - writer.Write(Convert.ToInt32(IsMotionOn)); + writer.WriteInt32(Convert.ToInt32(IsMotionOn)); writer.WriteObjectOffset(Motion); - writer.Write(Convert.ToInt32(IsProgramMotionOn)); + writer.WriteInt32(Convert.ToInt32(IsProgramMotionOn)); writer.WriteObjectOffset(ProgramMotion); } } @@ -181,13 +186,13 @@ public class MotionData : IBinarySerializable public void Read(BinaryObjectReader reader) { - PlayPolicy = reader.Read(); + PlayPolicy = (PlayPolicy)reader.ReadInt32(); AnimationName = reader.ReadStringOffset(); } public void Write(BinaryObjectWriter writer) { - writer.Write(PlayPolicy); + writer.WriteInt32((int)PlayPolicy); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, AnimationName); } } @@ -203,28 +208,28 @@ public class ProgramMotionData : IBinarySerializable public void Read(BinaryObjectReader reader) { - Field00 = reader.Read(); + Field00 = reader.ReadInt32(); - MotionType = reader.Read(); + MotionType = (MotionType)reader.ReadInt32(); - Axis = reader.Read(); + Axis = reader.ReadVector3(); - Power = reader.Read(); - SpeedScale = reader.Read(); - Time = reader.Read(); + Power = reader.ReadSingle(); + SpeedScale = reader.ReadSingle(); + Time = reader.ReadSingle(); } public void Write(BinaryObjectWriter writer) { - writer.Write(Field00); + writer.WriteInt32(Field00); - writer.Write(MotionType); + writer.WriteInt32((int)MotionType); - writer.Write(Axis); + writer.WriteVector3(Axis); - writer.Write(Power); - writer.Write(SpeedScale); - writer.Write(Time); + writer.WriteSingle(Power); + writer.WriteSingle(SpeedScale); + writer.WriteSingle(Time); } } } diff --git a/Source/SharpNeedle/Framework/SonicTeam/MasterLevel.cs b/Source/SharpNeedle/Framework/SonicTeam/MasterLevel.cs index 5603301..4736d0c 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/MasterLevel.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/MasterLevel.cs @@ -40,11 +40,11 @@ public override void Write(BinaryObjectWriter writer) { Levels = [.. Levels.OrderBy(o => o.Name)]; - writer.Write(Signature); + writer.WriteUInt32(Signature); writer.Align(writer.GetOffsetSize()); - writer.Write(Levels.Count); + writer.WriteInt64(Levels.Count); writer.WriteOffset(() => { LevelInfoBinaryOptions options = new(); @@ -75,8 +75,8 @@ public void Read(BinaryObjectReader reader, LevelInfoBinaryOptions options) Name = reader.ReadStringOffset(StringBinaryFormat.NullTerminated); - int fileCount = reader.Read(); - int dependencyCount = reader.Read(); + int fileCount = reader.ReadInt32(); + int dependencyCount = reader.ReadInt32(); reader.ReadOffset(() => { @@ -127,8 +127,8 @@ public void Write(BinaryObjectWriter writer, LevelInfoBinaryOptions options) writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name, writer.GetOffsetSize()); - writer.Write(Files.Count); - writer.Write(Dependencies.Count); + writer.WriteInt32(Files.Count); + writer.WriteInt32(Dependencies.Count); writer.WriteOffset(() => { @@ -184,7 +184,7 @@ public void Read(BinaryObjectReader reader, FileInfoBinaryOptions options) } else { - reader.ReadOffset(() => Field08 = reader.Read()); + Field08 = reader.ReadValueOffset(); } if (!options.IsLastLevel) @@ -219,7 +219,7 @@ public void Write(BinaryObjectWriter writer, FileInfoBinaryOptions options) } else { - writer.WriteOffset(() => writer.Write(Field08)); + writer.WriteValueOffset(Field08); } if (!options.IsLastLevel) diff --git a/Source/SharpNeedle/Framework/SonicTeam/PointCloud.cs b/Source/SharpNeedle/Framework/SonicTeam/PointCloud.cs index abb7ad0..2bbccb9 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/PointCloud.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/PointCloud.cs @@ -17,7 +17,7 @@ public PointCloud() public override void Read(BinaryObjectReader reader) { reader.EnsureSignature(Signature); - FormatVersion = reader.Read(); + FormatVersion = reader.ReadUInt32(); long instancesOffset = reader.ReadOffsetValue(); long instanceCount = reader.ReadOffsetValue(); @@ -33,8 +33,8 @@ public override void Read(BinaryObjectReader reader) public override void Write(BinaryObjectWriter writer) { - writer.Write(Signature); - writer.Write(FormatVersion); + writer.WriteUInt32(Signature); + writer.WriteUInt32(FormatVersion); writer.WriteOffset(() => { @@ -44,7 +44,7 @@ public override void Write(BinaryObjectWriter writer) } }); - writer.Write(Instances.Count); + writer.WriteInt64(Instances.Count); } public class InstanceData : IBinarySerializable @@ -60,10 +60,10 @@ public void Read(BinaryObjectReader reader, bool isLast = false) { Name = reader.ReadStringOffset(StringBinaryFormat.NullTerminated); ResourceName = reader.ReadStringOffset(StringBinaryFormat.NullTerminated); - Position = reader.Read(); - Rotation = reader.Read(); - Field28 = reader.Read(); - Scale = reader.Read(); + Position = reader.ReadVector3(); + Rotation = reader.ReadVector3(); + Field28 = reader.ReadInt32(); + Scale = reader.ReadVector3(); reader.Skip(4); @@ -78,10 +78,10 @@ public void Write(BinaryObjectWriter writer, bool isLast = false) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name, -1, 1); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, ResourceName, -1, 1); - writer.Write(Position); - writer.Write(Rotation); - writer.Write(Field28); - writer.Write(Scale); + writer.WriteVector3(Position); + writer.WriteVector3(Rotation); + writer.WriteInt32(Field28); + writer.WriteVector3(Scale); writer.Skip(4); diff --git a/Source/SharpNeedle/Framework/SonicTeam/SHLightField.cs b/Source/SharpNeedle/Framework/SonicTeam/SHLightField.cs index 647e62a..056f0c1 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/SHLightField.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/SHLightField.cs @@ -18,10 +18,10 @@ public override void Read(BinaryObjectReader reader) { bool inMeters = Path.GetExtension(BaseFile?.Name) == ".lf"; - FormatVersion = reader.Read(); + FormatVersion = reader.ReadUInt32(); reader.ReadArray(36, DefaultProbeLightingData); - int probeCount = reader.Read(); + int probeCount = reader.ReadInt32(); Nodes.AddRange(reader.ReadObjectArrayOffset(inMeters, probeCount)); } @@ -29,10 +29,10 @@ public override void Write(BinaryObjectWriter writer) { bool inMeters = Path.GetExtension(BaseFile?.Name) == ".lf"; - writer.Write(FormatVersion); + writer.WriteUInt32(FormatVersion); writer.WriteArrayFixedLength(DefaultProbeLightingData, 36); - writer.Write(Nodes.Count); + writer.WriteInt32(Nodes.Count); writer.WriteObjectCollectionOffset(inMeters, Nodes); } @@ -52,26 +52,26 @@ public void Read(BinaryObjectReader reader, bool inMeters = false) { Name = reader.ReadStringOffset(StringBinaryFormat.NullTerminated); - ProbeCountX = reader.Read(); - ProbeCountY = reader.Read(); - ProbeCountZ = reader.Read(); + ProbeCountX = reader.ReadInt32(); + ProbeCountY = reader.ReadInt32(); + ProbeCountZ = reader.ReadInt32(); - Position = inMeters ? reader.Read() : reader.Read() / 10; - Rotation = reader.Read(); - Scale = inMeters ? reader.Read() : reader.Read() / 10; + Position = inMeters ? reader.ReadVector3() : reader.ReadVector3() / 10; + Rotation = reader.ReadVector3(); + Scale = inMeters ? reader.ReadVector3() : reader.ReadVector3() / 10; } public void Write(BinaryObjectWriter writer, bool inMeters = false) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name, -1, 1); - writer.Write(ProbeCountX); - writer.Write(ProbeCountY); - writer.Write(ProbeCountZ); + writer.WriteInt32(ProbeCountX); + writer.WriteInt32(ProbeCountY); + writer.WriteInt32(ProbeCountZ); - writer.Write(inMeters ? Position : Position * 10); - writer.Write(Rotation); - writer.Write(inMeters ? Scale : Scale * 10); + writer.WriteVector3(inMeters ? Position : Position * 10); + writer.WriteVector3(Rotation); + writer.WriteVector3(inMeters ? Scale : Scale * 10); } } } diff --git a/Source/SharpNeedle/Framework/SonicTeam/SplinePath.cs b/Source/SharpNeedle/Framework/SonicTeam/SplinePath.cs index 8cabc3a..818ee8d 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/SplinePath.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/SplinePath.cs @@ -14,9 +14,9 @@ public override void Read(BinaryObjectReader reader) { reader.EnsureSignature(Signature); - Version = reader.Read(); + Version = reader.ReadUInt32(); - int pathCount = reader.Read(); + int pathCount = reader.ReadInt32(); long pathOffset = reader.ReadOffsetValue(); Dictionary paths = []; @@ -26,13 +26,13 @@ public override void Read(BinaryObjectReader reader) { for (uint i = 0; i < pathCount; i++) { - paths.Add(reader.ReadStringOffsetOrEmpty(), reader.Read()); + paths.Add(reader.ReadStringOffsetOrEmpty(), reader.ReadUInt32()); } }); paths = paths.OrderBy(x => x.Value).ToDictionary(x => x.Key, x => x.Value); - pathCount = reader.Read(); + pathCount = reader.ReadInt32(); pathOffset = reader.ReadOffsetValue(); if (pathCount != 0 && pathOffset == 0) // Sonic Colours Ultimate { @@ -52,8 +52,8 @@ public override void Read(BinaryObjectReader reader) public override void Write(BinaryObjectWriter writer) { - writer.Write(Signature); - writer.Write(Version); + writer.WriteUInt32(Signature); + writer.WriteUInt32(Version); writer.WriteOffsetValue(Paths.Count); @@ -64,12 +64,12 @@ public override void Write(BinaryObjectWriter writer) for (int i = 0; i < Paths.Count; i++) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Paths[i].Name); - writer.Write(i); + writer.WriteInt32(i); } }); } - writer.Write(Paths.Count); + writer.WriteInt32(Paths.Count); if (Paths.Count != 0) { @@ -134,7 +134,7 @@ public override void Write(BinaryObjectWriter writer) foreach (List list in paths) { - writer.Write(list.Count); + writer.WriteInt32(list.Count); if (list.Count != 0) { writer.WriteOffset(() => @@ -185,9 +185,9 @@ public void Read(BinaryObjectReader reader, uint version) reader.Skip(4); // Always 0? reader.Skip(4); // Always 1? - Distance = reader.Read(); + Distance = reader.ReadSingle(); - uint knotCount = reader.Read(); + uint knotCount = reader.ReadUInt32(); if (reader.OffsetBinaryFormat == OffsetBinaryFormat.U64) { @@ -198,16 +198,16 @@ public void Read(BinaryObjectReader reader, uint version) { for (int i = 0; i < knotCount; i++) { - KnotDistances.Add(reader.Read()); - KnotFlags.Add(reader.Read()); - Knots.Add(reader.Read()); - KnotTangentIns.Add(reader.Read()); - KnotTangentOuts.Add(reader.Read()); - KnotField2Cs.Add(reader.Read()); + KnotDistances.Add(reader.ReadSingle()); + KnotFlags.Add(reader.ReadInt32()); + Knots.Add(reader.ReadVector3()); + KnotTangentIns.Add(reader.ReadVector3()); + KnotTangentOuts.Add(reader.ReadVector3()); + KnotField2Cs.Add(reader.ReadSingle()); } }); - int doubleKnotCount = reader.Read() / 2; + int doubleKnotCount = reader.ReadInt32() / 2; if (reader.OffsetBinaryFormat == OffsetBinaryFormat.U64) { @@ -216,7 +216,7 @@ public void Read(BinaryObjectReader reader, uint version) if (doubleKnotCount != 0) { - DoubleKnots.AddRange(reader.ReadArrayOffset(doubleKnotCount)); + DoubleKnots.AddRange(reader.ReadObjectArrayOffset(doubleKnotCount)); } else { @@ -225,13 +225,13 @@ public void Read(BinaryObjectReader reader, uint version) } else { - Field04 = reader.Read(); + Field04 = reader.ReadByte(); reader.Skip(1); // Padding? - short knotCount = reader.Read(); + short knotCount = reader.ReadInt16(); - Distance = reader.Read(); + Distance = reader.ReadSingle(); if (reader.OffsetBinaryFormat == OffsetBinaryFormat.U64) { @@ -244,20 +244,20 @@ public void Read(BinaryObjectReader reader, uint version) { for (int i = 0; i < knotCount; i++) { - KnotFlags.Add(reader.Read()); + KnotFlags.Add(reader.ReadByte()); } }); KnotDistances.AddRange(reader.ReadArrayOffset(knotCount)); - Knots.AddRange(reader.ReadArrayOffset(knotCount)); - KnotTangentIns.AddRange(reader.ReadArrayOffset(knotCount)); - KnotTangentOuts.AddRange(reader.ReadArrayOffset(knotCount)); + reader.ReadOffset(() => Knots.AddRange(reader.ReadVector3Array(knotCount))); + reader.ReadOffset(() => KnotTangentIns.AddRange(reader.ReadVector3Array(knotCount))); + reader.ReadOffset(() => KnotTangentOuts.AddRange(reader.ReadVector3Array(knotCount))); } else { reader.Skip(reader.OffsetBinaryFormat == OffsetBinaryFormat.U32 ? 20 : 40); } - int doubleKnotCount = reader.Read() / 2; + int doubleKnotCount = reader.ReadInt32() / 2; if (reader.OffsetBinaryFormat == OffsetBinaryFormat.U64) { @@ -266,16 +266,16 @@ public void Read(BinaryObjectReader reader, uint version) if (doubleKnotCount != 0) { - DoubleKnots.AddRange(reader.ReadArrayOffset(doubleKnotCount)); + DoubleKnots.AddRange(reader.ReadObjectArrayOffset(doubleKnotCount)); } else { reader.Skip(reader.OffsetBinaryFormat == OffsetBinaryFormat.U32 ? 4 : 8); } - Bounds = reader.Read(); + Bounds = reader.ReadObject(); - int userDataCount = reader.Read(); + int userDataCount = reader.ReadInt32(); if (reader.OffsetBinaryFormat == OffsetBinaryFormat.U64) { @@ -284,7 +284,7 @@ public void Read(BinaryObjectReader reader, uint version) UserDatas.AddRange(reader.ReadObjectArrayOffset(userDataCount)); - Field48 = reader.Read(); // Always 0? + Field48 = reader.ReadInt32(); // Always 0? if (reader.OffsetBinaryFormat == OffsetBinaryFormat.U64) { @@ -303,12 +303,12 @@ public void Write(BinaryObjectWriter writer, uint version) if (version == 1) { - writer.Write(0); // Always 0? - writer.Write(1); // Always 1? + writer.WriteInt32(0); // Always 0? + writer.WriteInt32(1); // Always 1? - writer.Write(Distance); + writer.WriteSingle(Distance); - writer.Write(Knots.Count); + writer.WriteInt32(Knots.Count); writer.Align(writer.GetOffsetSize()); @@ -318,12 +318,12 @@ public void Write(BinaryObjectWriter writer, uint version) { for (int i = 0; i < Knots.Count; i++) { - writer.Write(KnotDistances[i]); - writer.Write(KnotFlags[i]); - writer.Write(Knots[i]); - writer.Write(KnotTangentIns[i]); - writer.Write(KnotTangentOuts[i]); - writer.Write(KnotField2Cs[i]); + writer.WriteSingle(KnotDistances[i]); + writer.WriteInt32(KnotFlags[i]); + writer.WriteVector3(Knots[i]); + writer.WriteVector3(KnotTangentIns[i]); + writer.WriteVector3(KnotTangentOuts[i]); + writer.WriteSingle(KnotField2Cs[i]); } }); } @@ -332,7 +332,7 @@ public void Write(BinaryObjectWriter writer, uint version) writer.WriteOffsetValue(0); } - writer.Write(DoubleKnots.Count * 2); + writer.WriteInt32(DoubleKnots.Count * 2); writer.Align(writer.GetOffsetSize()); @@ -347,12 +347,12 @@ public void Write(BinaryObjectWriter writer, uint version) } else { - writer.Write(Field04); - writer.Write((byte)0); + writer.WriteInt32(Field04); + writer.WriteByte(0); - writer.Write((short)Knots.Count); + writer.WriteInt16((short)Knots.Count); - writer.Write(Distance); + writer.WriteSingle(Distance); writer.Align(writer.GetOffsetSize()); @@ -362,13 +362,13 @@ public void Write(BinaryObjectWriter writer, uint version) { for (int i = 0; i < Knots.Count; i++) { - writer.Write((byte)KnotFlags[i]); + writer.WriteByte((byte)KnotFlags[i]); } }); writer.WriteArrayOffset(KnotDistances.ToArray()); - writer.WriteArrayOffset(Knots.ToArray()); - writer.WriteArrayOffset(KnotTangentIns.ToArray()); - writer.WriteArrayOffset(KnotTangentOuts.ToArray()); + writer.WriteOffset(() => writer.WriteVector3Array(Knots.ToArray())); + writer.WriteOffset(() => writer.WriteVector3Array(KnotTangentIns.ToArray())); + writer.WriteOffset(() => writer.WriteVector3Array(KnotTangentOuts.ToArray())); } else { @@ -390,7 +390,7 @@ public void Write(BinaryObjectWriter writer, uint version) writer.WriteOffsetValue(0); } - writer.Write(Bounds); + writer.WriteObject(Bounds); writer.WriteOffsetValue(UserDatas.Count); if (UserDatas.Count != 0) @@ -418,10 +418,22 @@ public override string ToString() return Name ?? string.Empty; } - public struct DoubleKnot + public struct DoubleKnot : IBinarySerializable { public Vector3 Left { get; set; } public Vector3 Right { get; set; } + + public void Read(BinaryObjectReader reader) + { + Left = reader.ReadVector3(); + Right = reader.ReadVector3(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteVector3(Left); + writer.WriteVector3(Right); + } } public class UserData : IBinarySerializable @@ -451,7 +463,7 @@ public void Read(BinaryObjectReader reader) Name = reader.ReadStringOffset(); - Type = reader.Read(); + Type = (DataType)reader.ReadByte(); reader.Align(reader.GetOffsetSize()); if (reader.OffsetBinaryFormat == OffsetBinaryFormat.U64) @@ -463,7 +475,7 @@ public void Read(BinaryObjectReader reader) { case DataType.Float: case DataType.Integer: - Value = reader.Read(); + Value = reader.ReadUInt32(); break; case DataType.String: @@ -480,18 +492,18 @@ public void Write(BinaryObjectWriter writer) writer.Align(writer.GetOffsetSize()); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(Type); + writer.WriteByte((byte)Type); writer.Align(writer.GetOffsetSize()); switch (Type) { case DataType.Integer: case DataType.Float: - writer.Write(Value); + writer.WriteUInt32(Value); if (writer.OffsetBinaryFormat == OffsetBinaryFormat.U64) { - writer.Write(0); + writer.WriteInt32(0); } break; @@ -527,14 +539,14 @@ public struct SubUnknown1 : IBinarySerializable public void Read(BinaryObjectReader reader) { - Field00 = reader.Read(); - Field04 = reader.Read(); + Field00 = reader.ReadSingle(); + Field04 = reader.ReadSingle(); } public readonly void Write(BinaryObjectWriter writer) { - writer.Write(Field00); - writer.Write(Field04); + writer.WriteSingle(Field00); + writer.WriteSingle(Field04); } } @@ -545,14 +557,14 @@ public struct SubUnknown2 : IBinarySerializable public void Read(BinaryObjectReader reader) { - Field00 = reader.Read(); - Field04 = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); } public readonly void Write(BinaryObjectWriter writer) { - writer.Write(Field00); - writer.Write(Field04); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); } } @@ -563,7 +575,7 @@ public readonly void Write(BinaryObjectWriter writer) public void Read(BinaryObjectReader reader) { - Field00 = reader.Read(); + Field00 = reader.ReadInt32(); int subUnknown1Count = (int)reader.ReadOffsetValue(); @@ -578,7 +590,7 @@ public void Read(BinaryObjectReader reader) public void Write(BinaryObjectWriter writer) { - writer.Write(Field00); + writer.WriteInt32(Field00); writer.WriteOffsetValue(SubUnknown1s.Count); diff --git a/Source/SharpNeedle/Framework/SonicTeam/TerrainMaterial.cs b/Source/SharpNeedle/Framework/SonicTeam/TerrainMaterial.cs index ec3430a..0ecb939 100644 --- a/Source/SharpNeedle/Framework/SonicTeam/TerrainMaterial.cs +++ b/Source/SharpNeedle/Framework/SonicTeam/TerrainMaterial.cs @@ -17,21 +17,21 @@ public TerrainMaterial() public override void Read(BinaryObjectReader reader) { reader.EnsureSignature(Signature); - FormatVersion = reader.Read(); + FormatVersion = reader.ReadUInt32(); long instancesOffset = reader.ReadOffsetValue(); - int instanceCount = (int)reader.Read(); + int instanceCount = (int)reader.ReadInt64(); reader.ReadAtOffset(instancesOffset, () => Layers.AddRange(reader.ReadObjectArray(instanceCount))); } public override void Write(BinaryObjectWriter writer) { - writer.Write(Signature); - writer.Write(FormatVersion); + writer.WriteUInt32(Signature); + writer.WriteUInt32(FormatVersion); writer.WriteObjectCollectionOffset(Layers); - writer.Write(Layers.Count); + writer.WriteInt64(Layers.Count); } public class TerrainLayer : IBinarySerializable @@ -53,10 +53,10 @@ public void Read(BinaryObjectReader reader) { Type = reader.ReadStringOffset(StringBinaryFormat.NullTerminated); - SplatIndex = reader.Read(); - Field0C = reader.Read(); - Field10 = reader.Read(); - Field14 = reader.Read(); + SplatIndex = reader.ReadInt32(); + Field0C = reader.ReadInt32(); + Field10 = reader.ReadInt32(); + Field14 = reader.ReadInt32(); DetailAlbedoMap = reader.ReadStringOffset(StringBinaryFormat.NullTerminated); DetailNormalMap = reader.ReadStringOffset(StringBinaryFormat.NullTerminated); @@ -70,10 +70,10 @@ public void Write(BinaryObjectWriter writer) { writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Type, -1, 1); - writer.Write(SplatIndex); - writer.Write(Field0C); - writer.Write(Field10); - writer.Write(Field14); + writer.WriteInt32(SplatIndex); + writer.WriteInt32(Field0C); + writer.WriteInt32(Field10); + writer.WriteInt32(Field14); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, DetailAlbedoMap, -1, 1); writer.WriteStringOffset(StringBinaryFormat.NullTerminated, DetailNormalMap, -1, 1); diff --git a/Source/SharpNeedle/Framework/SurfRide/ChunkHeader.cs b/Source/SharpNeedle/Framework/SurfRide/ChunkHeader.cs index 952eed6..0653bca 100644 --- a/Source/SharpNeedle/Framework/SurfRide/ChunkHeader.cs +++ b/Source/SharpNeedle/Framework/SurfRide/ChunkHeader.cs @@ -10,12 +10,12 @@ public struct ChunkHeader : IBinarySerializable public void Read(BinaryObjectReader reader) { Signature = reader.ReadLittle(); - reader.Read(out Size); + Size = reader.ReadInt32(); } public readonly void Write(BinaryObjectWriter writer) { writer.WriteLittle(Signature); - writer.Write(Size); + writer.WriteInt32(Size); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/Animation.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/Animation.cs index 9e23627..a30f485 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/Animation.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/Animation.cs @@ -17,9 +17,9 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) } Name = reader.ReadStringOffset(); - ID = reader.Read(); - Capacity = reader.Read(); - EndFrame = reader.Read(); + ID = reader.ReadInt32(); + Capacity = reader.ReadInt32(); + EndFrame = reader.ReadUInt32(); if (options.Version >= 3) { reader.Align(8); @@ -57,9 +57,9 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) } writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(ID); - writer.Write(Count); - writer.Write(EndFrame); + writer.WriteInt32(ID); + writer.WriteInt32(Count); + writer.WriteUInt32(EndFrame); if (options.Version >= 3) { writer.Align(8); diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/BlurEffectData.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/BlurEffectData.cs index 3fb8837..7a82b5b 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/BlurEffectData.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/BlurEffectData.cs @@ -18,26 +18,26 @@ public class BlurEffectData : IEffectData public void Read(BinaryObjectReader reader, ChunkBinaryOptions context) { - Field00 = reader.Read(); - Field04 = reader.Read(); - CropCount = reader.Read(); - Step = reader.Read(); - Blend = reader.Read(); - Color = reader.Read>(); - Field18 = reader.Read(); - Field1C = reader.Read(); + Field00 = reader.ReadInt32(); + Field04 = reader.ReadInt32(); + CropCount = reader.ReadInt32(); + Step = reader.ReadInt32(); + Blend = (BlendMode)reader.ReadInt32(); + Color = reader.ReadObject>(); + Field18 = reader.ReadInt32(); + Field1C = reader.ReadInt32(); } public void Write(BinaryObjectWriter writer, ChunkBinaryOptions context) { - writer.Write(Field00); - writer.Write(Field04); - writer.Write(CropCount); - writer.Write(Step); - writer.Write(Blend); - writer.Write(Color); - writer.Write(Field18); - writer.Write(Field1C); + writer.WriteInt32(Field00); + writer.WriteInt32(Field04); + writer.WriteInt32(CropCount); + writer.WriteInt32(Step); + writer.WriteInt32((int)Blend); + writer.WriteObject(Color); + writer.WriteInt32(Field18); + writer.WriteInt32(Field1C); } public enum BlendMode diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/Camera.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/Camera.cs index 5c0154c..73232f4 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/Camera.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/Camera.cs @@ -23,27 +23,27 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) } Name = reader.ReadStringOffset(); - ID = reader.Read(); + ID = reader.ReadInt32(); } if (options.Version >= 4) { reader.Align(16); - Position = reader.Read(); + Position = reader.ReadVector3(); reader.Align(16); - Target = reader.Read(); + Target = reader.ReadVector3(); reader.Align(16); - Field30 = reader.Read(); + Field30 = reader.ReadInt64(); } else { - Position = reader.Read(); - Target = reader.Read(); + Position = reader.ReadVector3(); + Target = reader.ReadVector3(); } - FieldOfView = reader.Read(); - NearPlane = reader.Read(); - FarPlane = reader.Read(); + FieldOfView = reader.ReadUInt32(); + NearPlane = reader.ReadSingle(); + FarPlane = reader.ReadSingle(); if (options.Version >= 1) { Field48 = reader.ReadOffsetValue(); @@ -61,27 +61,27 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) } writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(ID); + writer.WriteInt32(ID); } if (options.Version >= 4) { writer.Align(16); - writer.Write(Position); + writer.WriteVector3(Position); writer.Align(16); - writer.Write(Target); + writer.WriteVector3(Target); writer.Align(16); - writer.Write(Field30); + writer.WriteInt64(Field30); } else { - writer.Write(Position); - writer.Write(Target); + writer.WriteVector3(Position); + writer.WriteVector3(Target); } - writer.Write(FieldOfView); - writer.Write(NearPlane); - writer.Write(FarPlane); + writer.WriteUInt32(FieldOfView); + writer.WriteSingle(NearPlane); + writer.WriteSingle(FarPlane); if (options.Version >= 1) { writer.WriteOffsetValue(Field48); diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/CastNode.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/CastNode.cs index 9f69999..6f4d0f3 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/CastNode.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/CastNode.cs @@ -13,8 +13,8 @@ public class CastNode : IBinarySerializable public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { Name = reader.ReadStringOffset(); - ID = reader.Read(); - Flags = reader.Read(); + ID = reader.ReadInt32(); + Flags = reader.ReadUInt32(); switch (Flags & 0xF) { case 1: @@ -31,8 +31,8 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) break; } - ChildIndex = reader.Read(); - SiblingIndex = reader.Read(); + ChildIndex = reader.ReadInt16(); + SiblingIndex = reader.ReadInt16(); if (options.Version >= 3) { reader.Align(8); @@ -53,8 +53,8 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) } writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(ID); - writer.Write(Flags); + writer.WriteInt32(ID); + writer.WriteUInt32(Flags); if (Data != null) { writer.WriteObjectOffset(Data, options); @@ -64,8 +64,8 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) writer.WriteOffsetValue(0); } - writer.Write(ChildIndex); - writer.Write(SiblingIndex); + writer.WriteInt16(ChildIndex); + writer.WriteInt16(SiblingIndex); if (options.Version >= 3) { writer.Align(8); diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/Cell2D.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/Cell2D.cs index 1183219..1177bc2 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/Cell2D.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/Cell2D.cs @@ -16,52 +16,52 @@ public class Cell2D : ICell public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { - MaterialColor = reader.Read>(); - IlluminationColor = reader.Read>(); - Field08 = reader.Read(); - Field09 = reader.Read(); - Field0A = reader.Read(); - Field0B = reader.Read(); - Translation = reader.Read(); + MaterialColor = reader.ReadObject>(); + IlluminationColor = reader.ReadObject>(); + Field08 = reader.ReadByte(); + Field09 = reader.ReadByte(); + Field0A = reader.ReadByte(); + Field0B = reader.ReadByte(); + Translation = reader.ReadVector2(); if (options.Version >= 4) { reader.Align(16); - Translation = reader.Read(); + Translation = reader.ReadVector2(); reader.Align(16); - Scale = reader.Read(); - RotationZ = reader.Read(); + Scale = reader.ReadVector2(); + RotationZ = reader.ReadUInt32(); reader.Align(16); } else { - Translation = reader.Read(); - Scale = reader.Read(); - RotationZ = reader.Read(); + Translation = reader.ReadVector2(); + Scale = reader.ReadVector2(); + RotationZ = reader.ReadUInt32(); } } public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { - writer.Write(MaterialColor); - writer.Write(IlluminationColor); - writer.Write(Field08); - writer.Write(Field09); - writer.Write(Field0A); - writer.Write(Field0B); + writer.WriteObject(MaterialColor); + writer.WriteObject(IlluminationColor); + writer.WriteByte(Field08); + writer.WriteByte(Field09); + writer.WriteByte(Field0A); + writer.WriteByte(Field0B); if (options.Version >= 4) { writer.Align(16); - writer.Write(Translation); + writer.WriteVector2(Translation); writer.Align(16); - writer.Write(Scale); - writer.Write(RotationZ); + writer.WriteVector2(Scale); + writer.WriteUInt32(RotationZ); writer.Align(16); } else { - writer.Write(Translation); - writer.Write(Scale); - writer.Write(RotationZ); + writer.WriteVector2(Translation); + writer.WriteVector2(Scale); + writer.WriteUInt32(RotationZ); } } } diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/Cell3D.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/Cell3D.cs index 020456e..2bc66d5 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/Cell3D.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/Cell3D.cs @@ -18,61 +18,61 @@ public class Cell3D : ICell public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { - MaterialColor = reader.Read>(); - IlluminationColor = reader.Read>(); - Field08 = reader.Read(); - Field09 = reader.Read(); - Field0A = reader.Read(); - Field0B = reader.Read(); + MaterialColor = reader.ReadObject>(); + IlluminationColor = reader.ReadObject>(); + Field08 = reader.ReadByte(); + Field09 = reader.ReadByte(); + Field0A = reader.ReadByte(); + Field0B = reader.ReadByte(); if (options.Version >= 4) { reader.Align(16); - Position = reader.Read(); + Position = reader.ReadVector3(); reader.Align(16); - RotationX = reader.Read(); - RotationY = reader.Read(); - RotationZ = reader.Read(); + RotationX = reader.ReadInt32(); + RotationY = reader.ReadInt32(); + RotationZ = reader.ReadInt32(); reader.Align(16); - Scale = reader.Read(); + Scale = reader.ReadVector3(); reader.Align(16); } else { - Position = reader.Read(); - RotationX = reader.Read(); - RotationY = reader.Read(); - RotationZ = reader.Read(); - Scale = reader.Read(); + Position = reader.ReadVector3(); + RotationX = reader.ReadInt32(); + RotationY = reader.ReadInt32(); + RotationZ = reader.ReadInt32(); + Scale = reader.ReadVector3(); } } public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { - writer.Write(MaterialColor); - writer.Write(IlluminationColor); - writer.Write(Field08); - writer.Write(Field09); - writer.Write(Field0A); - writer.Write(Field0B); + writer.WriteObject(MaterialColor); + writer.WriteObject(IlluminationColor); + writer.WriteByte(Field08); + writer.WriteByte(Field09); + writer.WriteByte(Field0A); + writer.WriteByte(Field0B); if (options.Version >= 4) { writer.Align(16); - writer.Write(Position); + writer.WriteVector3(Position); writer.Align(16); - writer.Write(RotationX); - writer.Write(RotationY); - writer.Write(RotationZ); + writer.WriteInt32(RotationX); + writer.WriteInt32(RotationY); + writer.WriteInt32(RotationZ); writer.Align(16); - writer.Write(Scale); + writer.WriteVector3(Scale); writer.Align(16); } else { - writer.Write(Position); - writer.Write(RotationX); - writer.Write(RotationY); - writer.Write(RotationZ); - writer.Write(Scale); + writer.WriteVector3(Position); + writer.WriteInt32(RotationX); + writer.WriteInt32(RotationY); + writer.WriteInt32(RotationZ); + writer.WriteVector3(Scale); } } } diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/Crop.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/Crop.cs index a6244c0..27721ab 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/Crop.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/Crop.cs @@ -9,17 +9,17 @@ public class Crop : IBinarySerializable public void Read(BinaryObjectReader reader) { - Left = reader.Read(); - Top = reader.Read(); - Right = reader.Read(); - Bottom = reader.Read(); + Left = reader.ReadSingle(); + Top = reader.ReadSingle(); + Right = reader.ReadSingle(); + Bottom = reader.ReadSingle(); } public void Write(BinaryObjectWriter writer) { - writer.Write(Left); - writer.Write(Top); - writer.Write(Right); - writer.Write(Bottom); + writer.WriteSingle(Left); + writer.WriteSingle(Top); + writer.WriteSingle(Right); + writer.WriteSingle(Bottom); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/Font.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/Font.cs index a34921a..231a18b 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/Font.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/Font.cs @@ -19,15 +19,15 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) } Name = reader.ReadStringOffset(); - ID = reader.Read(); - Field0C = reader.Read(); + ID = reader.ReadInt32(); + Field0C = reader.ReadUInt32(); if (options.Version >= 4) { - Field10 = reader.Read(); + Field10 = reader.ReadInt16(); } - Capacity = reader.Read(); - Field14 = reader.Read(); + Capacity = reader.ReadUInt16(); + Field14 = reader.ReadUInt16(); if (options.Version >= 3) { reader.Align(8); @@ -54,15 +54,15 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) } writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(ID); - writer.Write(Field0C); + writer.WriteInt32(ID); + writer.WriteUInt32(Field0C); if (options.Version >= 4) { - writer.Write(Field10); + writer.WriteInt16(Field10); } - writer.Write((ushort)Count); - writer.Write(Field14); + writer.WriteUInt16((ushort)Count); + writer.WriteUInt16(Field14); if (options.Version >= 3) { writer.Align(8); @@ -94,17 +94,17 @@ public class CharData : IBinarySerializable public void Read(BinaryObjectReader reader) { - Code = reader.Read(); - TextureListIndex = reader.Read(); - TextureIndex = reader.Read(); - CropIndex = reader.Read(); + Code = reader.ReadUInt16(); + TextureListIndex = reader.ReadUInt16(); + TextureIndex = reader.ReadUInt16(); + CropIndex = reader.ReadUInt16(); } public void Write(BinaryObjectWriter writer) { - writer.Write(Code); - writer.Write(TextureListIndex); - writer.Write(TextureIndex); - writer.Write(CropIndex); + writer.WriteUInt16(Code); + writer.WriteUInt16(TextureListIndex); + writer.WriteUInt16(TextureIndex); + writer.WriteUInt16(CropIndex); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/ImageCastData.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/ImageCastData.cs index 153606a..9ced8e9 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/ImageCastData.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/ImageCastData.cs @@ -18,17 +18,17 @@ public class ImageCastData : IImageDataBase public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { - Flags = reader.Read(); - Size = reader.Read(); - PivotPoint = reader.Read(); - VertexColorTopLeft = reader.Read>(); - VertexColorBottomLeft = reader.Read>(); - VertexColorTopRight = reader.Read>(); - VertexColorBottomRight = reader.Read>(); - Surface.CropIndex = reader.Read(); - Surface1.CropIndex = reader.Read(); - Surface.CropRefs.Capacity = reader.Read(); - Surface1.CropRefs.Capacity = reader.Read(); + Flags = (CastAttribute)reader.ReadInt32(); + Size = reader.ReadVector2(); + PivotPoint = reader.ReadVector2(); + VertexColorTopLeft = reader.ReadObject>(); + VertexColorBottomLeft = reader.ReadObject>(); + VertexColorTopRight = reader.ReadObject>(); + VertexColorBottomRight = reader.ReadObject>(); + Surface.CropIndex = reader.ReadInt16(); + Surface1.CropIndex = reader.ReadInt16(); + Surface.CropRefs.Capacity = reader.ReadInt16(); + Surface1.CropRefs.Capacity = reader.ReadInt16(); if (options.Version >= 3) { reader.Align(8); @@ -36,7 +36,7 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) if (Surface.CropRefs.Capacity > 0) { - Surface.CropRefs.AddRange(reader.ReadArrayOffset(Surface.CropRefs.Capacity)); + Surface.CropRefs.AddRange(reader.ReadObjectArrayOffset(Surface.CropRefs.Capacity)); } else { @@ -45,7 +45,7 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) if (Surface1.CropRefs.Capacity > 0) { - Surface1.CropRefs.AddRange(reader.ReadArrayOffset(Surface1.CropRefs.Capacity)); + Surface1.CropRefs.AddRange(reader.ReadObjectArrayOffset(Surface1.CropRefs.Capacity)); } else { @@ -61,7 +61,7 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) reader.ReadOffsetValue(); } - EffectType type = reader.Read(); + EffectType type = (EffectType)reader.ReadInt32(); if (options.Version >= 3) { reader.Align(8); @@ -72,17 +72,17 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { - writer.Write(Flags); - writer.Write(Size); - writer.Write(PivotPoint); - writer.Write(VertexColorTopLeft); - writer.Write(VertexColorBottomLeft); - writer.Write(VertexColorTopRight); - writer.Write(VertexColorBottomRight); - writer.Write(Surface.CropIndex); - writer.Write(Surface1.CropIndex); - writer.Write((short)Surface.CropRefs.Count); - writer.Write((short)Surface1.CropRefs.Count); + writer.WriteInt32((int)Flags); + writer.WriteVector2(Size); + writer.WriteVector2(PivotPoint); + writer.WriteObject(VertexColorTopLeft); + writer.WriteObject(VertexColorBottomLeft); + writer.WriteObject(VertexColorTopRight); + writer.WriteObject(VertexColorBottomRight); + writer.WriteInt16(Surface.CropIndex); + writer.WriteInt16(Surface1.CropIndex); + writer.WriteInt16((short)Surface.CropRefs.Count); + writer.WriteInt16((short)Surface1.CropRefs.Count); if (options.Version >= 3) { writer.Align(8); @@ -90,7 +90,7 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) if (Surface.CropRefs.Count != 0) { - writer.WriteCollectionOffset(Surface.CropRefs); + writer.WriteObjectCollectionOffset(Surface.CropRefs); } else { @@ -99,7 +99,7 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) if (Surface1.CropRefs.Count != 0) { - writer.WriteCollectionOffset(Surface1.CropRefs); + writer.WriteObjectCollectionOffset(Surface1.CropRefs); } else { @@ -115,7 +115,7 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) writer.WriteOffsetValue(0); } - writer.Write(Effect?.Type ?? EffectType.None); + writer.WriteInt32((int)(Effect?.Type ?? EffectType.None)); if (options.Version >= 3) { writer.Align(8); @@ -139,19 +139,19 @@ public class FontData : IBinarySerializable public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { - Field00 = reader.Read(); - FontListIndex = reader.Read(); + Field00 = reader.ReadUInt32(); + FontListIndex = reader.ReadUInt32(); if (options.Version >= 3) { reader.Align(8); } Characters = reader.ReadStringOffset(); - Scale = reader.Read(); - Field14 = reader.Read(); - Field18 = reader.Read(); - SpaceCorrection = reader.Read(); - Field1E = reader.Read(); + Scale = reader.ReadVector2(); + Field14 = reader.ReadUInt32(); + Field18 = reader.ReadUInt32(); + SpaceCorrection = reader.ReadInt16(); + Field1E = reader.ReadUInt16(); if (options.Version >= 3) { reader.Align(8); @@ -162,19 +162,19 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { - writer.Write(Field00); - writer.Write(FontListIndex); + writer.WriteUInt32(Field00); + writer.WriteUInt32(FontListIndex); if (options.Version >= 3) { writer.Align(8); } writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Characters); - writer.Write(Scale); - writer.Write(Field14); - writer.Write(Field18); - writer.Write(SpaceCorrection); - writer.Write(Field1E); + writer.WriteVector2(Scale); + writer.WriteUInt32(Field14); + writer.WriteUInt32(Field18); + writer.WriteInt16(SpaceCorrection); + writer.WriteUInt16(Field1E); if (options.Version >= 3) { writer.Align(8); diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/ImageCastSurface.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/ImageCastSurface.cs index 4d19784..4a08a07 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/ImageCastSurface.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/ImageCastSurface.cs @@ -6,9 +6,23 @@ public class ImageCastSurface public List CropRefs { get; set; } = []; } -public struct CropRef +public struct CropRef : IBinarySerializable { public short TextureListIndex; public short TextureIndex; public short CropIndex; + + public void Read(BinaryObjectReader reader) + { + TextureListIndex = reader.ReadInt16(); + TextureIndex = reader.ReadInt16(); + CropIndex = reader.ReadInt16(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteInt16(TextureListIndex); + writer.WriteInt16(TextureIndex); + writer.WriteInt16(CropIndex); + } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/KeyFrame.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/KeyFrame.cs index b29c749..5f4d212 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/KeyFrame.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/KeyFrame.cs @@ -14,17 +14,17 @@ public void Read(BinaryObjectReader reader, uint flags) { InterpolationType interpolation = (InterpolationType)(flags & 3); - Frame = reader.Read(); + Frame = reader.ReadInt32(); Value = reader.ReadObject(flags); if (interpolation >= InterpolationType.Hermite) { - InParam = reader.Read(); - OutParam = reader.Read(); + InParam = reader.ReadSingle(); + OutParam = reader.ReadSingle(); } if (interpolation == InterpolationType.Individual) { - Field10 = reader.Read(); + Field10 = reader.ReadInt32(); } } @@ -32,17 +32,17 @@ public void Write(BinaryObjectWriter writer, uint flags) { InterpolationType interpolation = (InterpolationType)(flags & 3); - writer.Write(Frame); + writer.WriteInt32(Frame); writer.WriteObject(Value, flags); if (interpolation >= InterpolationType.Hermite) { - writer.Write(InParam); - writer.Write(OutParam); + writer.WriteSingle(InParam); + writer.WriteSingle(OutParam); } if (interpolation == InterpolationType.Individual) { - writer.Write(Field10); + writer.WriteInt32(Field10); } } } @@ -211,25 +211,25 @@ public void Read(BinaryObjectReader reader, uint flags) switch (flags & 0xF0) { case 0x10: - Float = reader.Read(); + Float = reader.ReadSingle(); break; case 0x20: - Integer = reader.Read(); + Integer = reader.ReadInt32(); break; case 0x30: Boolean = reader.Read(); break; case 0x40: - Integer = reader.Read(); + Integer = reader.ReadInt32(); break; case 0x50: - Color = reader.Read>(); + Color = reader.ReadObject>(); break; case 0x60: - UnsignedInteger = reader.Read(); + UnsignedInteger = reader.ReadUInt32(); break; case 0x70: - Double = reader.Read(); + Double = reader.ReadDouble(); break; case 0x80: Character = reader.Read(); @@ -246,25 +246,25 @@ public readonly void Write(BinaryObjectWriter writer, uint flags) switch (flags & 0xF0) { case 0x10: - writer.Write(Float); + writer.WriteSingle(Float); break; case 0x20: - writer.Write(Integer); + writer.WriteInt32(Integer); break; case 0x30: writer.Write(Boolean); break; case 0x40: - writer.Write(Integer); + writer.WriteInt32(Integer); break; case 0x50: - writer.Write(Color); + writer.WriteObject(Color); break; case 0x60: - writer.Write(UnsignedInteger); + writer.WriteUInt32(UnsignedInteger); break; case 0x70: - writer.Write(Double); + writer.WriteDouble(Double); break; case 0x80: writer.Write(Character); diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/Layer.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/Layer.cs index 6600450..9c5d6e7 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/Layer.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/Layer.cs @@ -19,9 +19,9 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) } Name = reader.ReadStringOffset(); - ID = reader.Read(); - Flags = reader.Read(); - int castCount = reader.Read(); + ID = reader.ReadInt32(); + Flags = reader.ReadUInt32(); + int castCount = reader.ReadInt32(); if (options.Version >= 3) { reader.Align(8); @@ -42,14 +42,14 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) throw new NotImplementedException(); } - int animCount = reader.Read(); + int animCount = reader.ReadInt32(); if (options.Version >= 3) { reader.Align(8); } Animations.AddRange(reader.ReadObjectArrayOffset(options, animCount)); - CurrentAnimationIndex = reader.Read(); + CurrentAnimationIndex = reader.ReadUInt32(); if (options.Version >= 3) { reader.Align(8); @@ -70,9 +70,9 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) } writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(ID); - writer.Write(Flags); - writer.Write(Nodes.Count); + writer.WriteInt32(ID); + writer.WriteUInt32(Flags); + writer.WriteInt32(Nodes.Count); if (options.Version >= 3) { writer.Align(8); @@ -102,7 +102,7 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) writer.WriteOffsetValue(0); } - writer.Write(Animations.Count); + writer.WriteInt32(Animations.Count); if (options.Version >= 3) { writer.Align(8); @@ -117,7 +117,7 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) writer.WriteOffsetValue(0); } - writer.Write(CurrentAnimationIndex); + writer.WriteUInt32(CurrentAnimationIndex); if (options.Version >= 3) { writer.Align(8); diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/Motion.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/Motion.cs index 03068f4..00f8975 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/Motion.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/Motion.cs @@ -7,8 +7,8 @@ public class Motion : IBinarySerializable public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { - CastID = reader.Read(); - ushort trackCount = reader.Read(); + CastID = reader.ReadUInt16(); + ushort trackCount = reader.ReadUInt16(); if (options.Version >= 3) { reader.Align(8); @@ -19,8 +19,8 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { - writer.Write(CastID); - writer.Write((ushort)Tracks.Count); + writer.WriteUInt16(CastID); + writer.WriteUInt16((ushort)Tracks.Count); if (options.Version >= 3) { writer.Align(8); diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/ProjectChunk.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/ProjectChunk.cs index 919c933..fec826d 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/ProjectChunk.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/ProjectChunk.cs @@ -16,18 +16,18 @@ public class ProjectChunk : ProjectNode, IChunk reader.OffsetBinaryFormat = OffsetBinaryFormat.U64; } - reader.ReadAtOffset((int)start - 8 + reader.Read(), () => base.Read(reader, options)); - Field0C = reader.Read(); + reader.ReadAtOffset((int)start - 8 + reader.ReadInt32(), () => base.Read(reader, options)); + Field0C = reader.ReadUInt32(); } public new void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { writer.WriteLittle(Signature); - writer.Write(0); // Size + writer.WriteInt32(0); // Size SeekToken start = writer.At(); - writer.Write(0x10); // Project Offset, untracked - writer.Write(Field0C); + writer.WriteInt32(0x10); // Project Offset, untracked + writer.WriteUInt32(Field0C); base.Write(writer, options); writer.Flush(); @@ -36,7 +36,7 @@ public class ProjectChunk : ProjectNode, IChunk long size = (long)end - (long)start; writer.At((long)start - sizeof(int), SeekOrigin.Begin); - writer.Write((int)size); + writer.WriteInt32((int)size); end.Dispose(); } @@ -58,19 +58,19 @@ public class ProjectNode : IBinarySerializable public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { Name = reader.ReadStringOffset(); - ushort sceneCount = reader.Read(); - Field06 = reader.Read(); - ushort texListCount = reader.Read(); - ushort fontCount = reader.Read(); + ushort sceneCount = reader.ReadUInt16(); + Field06 = reader.ReadInt16(); + ushort texListCount = reader.ReadUInt16(); + ushort fontCount = reader.ReadUInt16(); Scenes.AddRange(reader.ReadObjectArrayOffset(options, sceneCount)); TextureLists.AddRange(reader.ReadObjectArrayOffset(options, texListCount)); Fonts.AddRange(reader.ReadObjectArrayOffset(options, fontCount)); Camera = reader.ReadObject(options); - StartFrame = reader.Read(); - EndFrame = reader.Read(); + StartFrame = reader.ReadUInt32(); + EndFrame = reader.ReadUInt32(); if (options.Version >= 1) { - FrameRate = reader.Read(); + FrameRate = reader.ReadSingle(); } if (options.Version >= 3) @@ -93,10 +93,10 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) } writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write((ushort)Scenes.Count); - writer.Write(Field06); - writer.Write((ushort)TextureLists.Count); - writer.Write((ushort)Fonts.Count); + writer.WriteUInt16((ushort)Scenes.Count); + writer.WriteInt16(Field06); + writer.WriteUInt16((ushort)TextureLists.Count); + writer.WriteUInt16((ushort)Fonts.Count); if (Scenes.Count != 0) { writer.WriteObjectCollectionOffset(options, Scenes); @@ -125,11 +125,11 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) } writer.WriteObject(Camera, options); - writer.Write(StartFrame); - writer.Write(EndFrame); + writer.WriteUInt32(StartFrame); + writer.WriteUInt32(EndFrame); if (options.Version >= 1) { - writer.Write(FrameRate); + writer.WriteSingle(FrameRate); } if (options.Version >= 3) diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/ReferenceCastData.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/ReferenceCastData.cs index f7c8115..92e2e00 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/ReferenceCastData.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/ReferenceCastData.cs @@ -16,10 +16,10 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) } Layer = reader.ReadObjectOffset(options); - Field04 = reader.Read(); - AnimationID = reader.Read(); - AnimationFrame = reader.Read(); - Field10 = reader.Read(); + Field04 = reader.ReadInt32(); + AnimationID = reader.ReadInt32(); + AnimationFrame = reader.ReadInt32(); + Field10 = reader.ReadInt32(); } public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) @@ -35,9 +35,9 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) } writer.WriteObjectOffset(Layer, options); - writer.Write(Field04); - writer.Write(AnimationID); - writer.Write(AnimationFrame); - writer.Write(Field10); + writer.WriteInt32(Field04); + writer.WriteInt32(AnimationID); + writer.WriteInt32(AnimationFrame); + writer.WriteInt32(Field10); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/ReflectEffectData.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/ReflectEffectData.cs index fe2bd15..d226999 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/ReflectEffectData.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/ReflectEffectData.cs @@ -18,21 +18,21 @@ public class ReflectEffectData : IEffectData public void Read(BinaryObjectReader reader, ChunkBinaryOptions context) { - Field00 = reader.Read(); - Field08 = reader.Read(); - Field10 = reader.Read(); - Flags = reader.Read>(); - Color = reader.Read>(); - Field20 = reader.Read(); + Field00 = reader.ReadVector2(); + Field08 = reader.ReadVector2(); + Field10 = reader.ReadVector2(); + Flags = reader.ReadObject>(); + Color = reader.ReadObject>(); + Field20 = reader.ReadSingle(); } public void Write(BinaryObjectWriter writer, ChunkBinaryOptions context) { - writer.Write(Field00); - writer.Write(Field08); - writer.Write(Field10); - writer.Write(Flags); - writer.Write(Color); - writer.Write(Field20); + writer.WriteVector2(Field00); + writer.WriteVector2(Field08); + writer.WriteVector2(Field10); + writer.WriteObject(Flags); + writer.WriteObject(Color); + writer.WriteSingle(Field20); } } diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/Scene.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/Scene.cs index 7e568f0..bbddc49 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/Scene.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/Scene.cs @@ -24,30 +24,30 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) } Name = reader.ReadStringOffset(); - ID = reader.Read(); - Flags = reader.Read(); + ID = reader.ReadInt32(); + Flags = reader.ReadUInt32(); if (options.Version >= 4) { - Field10 = reader.Read(); + Field10 = reader.ReadUInt32(); } - int layerCount = reader.Read(); + int layerCount = reader.ReadInt32(); if (options.Version >= 3) { reader.Align(8); } Layers.AddRange(reader.ReadObjectArrayOffset(options, layerCount)); - ushort camCount = reader.Read(); - CurrentCameraIndex = reader.Read(); + ushort camCount = reader.ReadUInt16(); + CurrentCameraIndex = reader.ReadInt16(); if (options.Version >= 3) { reader.Align(8); } Cameras.AddRange(reader.ReadObjectArrayOffset(options, camCount)); - BackgroundColor = reader.Read>(); - Resolution = reader.Read(); + BackgroundColor = reader.ReadObject>(); + Resolution = reader.ReadVector2(); if (options.Version >= 3) { reader.Align(8); @@ -68,14 +68,14 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) } writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(ID); - writer.Write(Flags); + writer.WriteInt32(ID); + writer.WriteUInt32(Flags); if (options.Version >= 4) { - writer.Write(Field10); + writer.WriteUInt32(Field10); } - writer.Write(Layers.Count); + writer.WriteInt32(Layers.Count); if (Layers.Count != 0) { writer.WriteObjectCollectionOffset(options, Layers); @@ -85,8 +85,8 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) writer.WriteOffsetValue(0); } - writer.Write((short)Cameras.Count); - writer.Write(CurrentCameraIndex); + writer.WriteInt16((short)Cameras.Count); + writer.WriteInt16(CurrentCameraIndex); if (options.Version >= 3) { writer.Align(8); @@ -114,8 +114,8 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) writer.WriteOffsetValue(0); } - writer.Write(BackgroundColor); - writer.Write(Resolution); + writer.WriteObject(BackgroundColor); + writer.WriteVector2(Resolution); if (options.Version >= 3) { writer.Align(8); diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/SliceCastData.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/SliceCastData.cs index 42c0a89..f87b9b8 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/SliceCastData.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/SliceCastData.cs @@ -23,20 +23,20 @@ public class SliceCastData : IImageDataBase public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { - Flags = reader.Read(); - Size = reader.Read(); - PivotPoint = reader.Read(); - VertexColorTopLeft = reader.Read>(); - VertexColorBottomLeft = reader.Read>(); - VertexColorTopRight = reader.Read>(); - VertexColorBottomRight = reader.Read>(); - HorizontalFixedSize = reader.Read(); - VerticalFixedSize = reader.Read(); - SliceHorizontalCount = reader.Read(); - SliceVerticalCount = reader.Read(); - HorizontalFixedCount = reader.Read(); - VerticalFixedCount = reader.Read(); - Surface.CropRefs.Capacity = reader.Read(); + Flags = (CastAttribute)reader.ReadInt32(); + Size = reader.ReadVector2(); + PivotPoint = reader.ReadVector2(); + VertexColorTopLeft = reader.ReadObject>(); + VertexColorBottomLeft = reader.ReadObject>(); + VertexColorTopRight = reader.ReadObject>(); + VertexColorBottomRight = reader.ReadObject>(); + HorizontalFixedSize = reader.ReadSingle(); + VerticalFixedSize = reader.ReadSingle(); + SliceHorizontalCount = reader.ReadInt16(); + SliceVerticalCount = reader.ReadInt16(); + HorizontalFixedCount = reader.ReadInt16(); + VerticalFixedCount = reader.ReadInt16(); + Surface.CropRefs.Capacity = reader.ReadInt16(); reader.Skip(2); // Alignment if (options.Version >= 3) @@ -46,14 +46,14 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) if (Surface.CropRefs.Capacity != 0) { - Surface.CropRefs.AddRange(reader.ReadArrayOffset(Surface.CropRefs.Capacity)); + Surface.CropRefs.AddRange(reader.ReadObjectArrayOffset(Surface.CropRefs.Capacity)); } else { reader.ReadOffsetValue(); } - EffectType type = reader.Read(); + EffectType type = (EffectType)reader.ReadInt32(); if (options.Version >= 3) { reader.Align(8); @@ -65,21 +65,21 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { - writer.Write(Flags); - writer.Write(Size); - writer.Write(PivotPoint); - writer.Write(VertexColorTopLeft); - writer.Write(VertexColorBottomLeft); - writer.Write(VertexColorTopRight); - writer.Write(VertexColorBottomRight); - writer.Write(HorizontalFixedSize); - writer.Write(VerticalFixedSize); - writer.Write(SliceHorizontalCount); - writer.Write(SliceVerticalCount); - writer.Write(HorizontalFixedCount); - writer.Write(VerticalFixedCount); - writer.Write((short)Surface.CropRefs.Count); - writer.Write((short)0); // Alignment + writer.WriteInt32((int)Flags); + writer.WriteVector2(Size); + writer.WriteVector2(PivotPoint); + writer.WriteObject(VertexColorTopLeft); + writer.WriteObject(VertexColorBottomLeft); + writer.WriteObject(VertexColorTopRight); + writer.WriteObject(VertexColorBottomRight); + writer.WriteSingle(HorizontalFixedSize); + writer.WriteSingle(VerticalFixedSize); + writer.WriteInt16(SliceHorizontalCount); + writer.WriteInt16(SliceVerticalCount); + writer.WriteInt16(HorizontalFixedCount); + writer.WriteInt16(VerticalFixedCount); + writer.WriteInt16((short)Surface.CropRefs.Count); + writer.WriteInt16(0); // Alignment if (options.Version >= 3) { @@ -95,7 +95,7 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) writer.WriteOffsetValue(0); } - writer.Write(Effect?.Type ?? EffectType.None); + writer.WriteInt32((int)(Effect?.Type ?? EffectType.None)); if (options.Version >= 3) { writer.Align(8); @@ -122,31 +122,31 @@ public class Slice : IBinarySerializable public void Read(BinaryObjectReader reader) { - Flags = reader.Read(); - FixedWidth = reader.Read(); - FixedHeight = reader.Read(); - MaterialColor = reader.Read>(); - IlluminationColor = reader.Read>(); - VertexColorTopLeft = reader.Read>(); - VertexColorBottomLeft = reader.Read>(); - VertexColorTopRight = reader.Read>(); - VertexColorBottomRight = reader.Read>(); - CropIndex0 = reader.Read(); - CropIndex1 = reader.Read(); + Flags = reader.ReadUInt32(); + FixedWidth = reader.ReadSingle(); + FixedHeight = reader.ReadSingle(); + MaterialColor = reader.ReadObject>(); + IlluminationColor = reader.ReadObject>(); + VertexColorTopLeft = reader.ReadObject>(); + VertexColorBottomLeft = reader.ReadObject>(); + VertexColorTopRight = reader.ReadObject>(); + VertexColorBottomRight = reader.ReadObject>(); + CropIndex0 = reader.ReadInt16(); + CropIndex1 = reader.ReadInt16(); } public void Write(BinaryObjectWriter writer) { - writer.Write(Flags); - writer.Write(FixedWidth); - writer.Write(FixedHeight); - writer.Write(MaterialColor); - writer.Write(IlluminationColor); - writer.Write(VertexColorTopLeft); - writer.Write(VertexColorBottomLeft); - writer.Write(VertexColorTopRight); - writer.Write(VertexColorBottomRight); - writer.Write(CropIndex0); - writer.Write(CropIndex1); + writer.WriteUInt32(Flags); + writer.WriteSingle(FixedWidth); + writer.WriteSingle(FixedHeight); + writer.WriteObject(MaterialColor); + writer.WriteObject(IlluminationColor); + writer.WriteObject(VertexColorTopLeft); + writer.WriteObject(VertexColorBottomLeft); + writer.WriteObject(VertexColorTopRight); + writer.WriteObject(VertexColorBottomRight); + writer.WriteInt16(CropIndex0); + writer.WriteInt16(CropIndex1); } } \ No newline at end of file diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/Texture.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/Texture.cs index 6fabc38..4a4d7f3 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/Texture.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/Texture.cs @@ -24,11 +24,11 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) TextureFileName = reader.ReadStringOffset(); } - ID = reader.Read(); - Width = reader.Read(); - Height = reader.Read(); - Flags = reader.Read(); - Capacity = reader.Read(); + ID = reader.ReadInt32(); + Width = reader.ReadUInt16(); + Height = reader.ReadUInt16(); + Flags = reader.ReadUInt32(); + Capacity = reader.ReadInt32(); if (Capacity != 0) { AddRange(reader.ReadObjectArrayOffset(Capacity)); @@ -63,11 +63,11 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) writer.WriteStringOffset(StringBinaryFormat.NullTerminated, TextureFileName); } - writer.Write(ID); - writer.Write(Width); - writer.Write(Height); - writer.Write(Flags); - writer.Write(Count); + writer.WriteInt32(ID); + writer.WriteUInt16(Width); + writer.WriteUInt16(Height); + writer.WriteUInt32(Flags); + writer.WriteInt32(Count); if (Count != 0) { writer.WriteObjectCollectionOffset(this); diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/TextureListChunk.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/TextureListChunk.cs index 2f358a9..2c8c959 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/TextureListChunk.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/TextureListChunk.cs @@ -11,19 +11,19 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) SeekToken start = reader.At(); options.Header ??= reader.ReadObject(); Signature = options.Header.Value.Signature; - int listOffset = reader.Read(); - Capacity = reader.Read(); + int listOffset = reader.ReadInt32(); + Capacity = reader.ReadInt32(); reader.ReadAtOffset((int)start - 8 + listOffset, () => AddRange(reader.ReadObjectArray(options, Capacity))); } public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { writer.WriteLittle(Signature); - writer.Write(0); // Size + writer.WriteInt32(0); // Size SeekToken start = writer.At(); - writer.Write(0x10); // List Offset, untracked - writer.Write(Count); + writer.WriteInt32(0x10); // List Offset, untracked + writer.WriteInt32(Count); writer.WriteObjectCollection(options, this); @@ -33,7 +33,7 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) long size = (long)end - (long)start; writer.At((long)start - sizeof(int), SeekOrigin.Begin); - writer.Write((int)size); + writer.WriteInt32((int)size); end.Dispose(); } @@ -62,10 +62,10 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) Name = reader.ReadStringOffset(); if (options.Version >= 4) { - Field08 = reader.Read(); + Field08 = reader.ReadUInt32(); } - Capacity = reader.Read(); + Capacity = reader.ReadInt32(); if (options.Version >= 3) { reader.Align(8); @@ -80,7 +80,7 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) if (options.Version == 0) { - Field14 = reader.Read(); + Field14 = reader.ReadUInt32(); } } @@ -95,10 +95,10 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); if (options.Version >= 4) { - writer.Write(Field08); + writer.WriteUInt32(Field08); } - writer.Write(Count); + writer.WriteInt32(Count); writer.WriteObjectCollectionOffset(options, this); if (UserData != null) { @@ -111,7 +111,7 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) if (options.Version == 0) { - writer.Write(Field14); + writer.WriteUInt32(Field14); } } diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/Track.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/Track.cs index 632db9c..28a5174 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/Track.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/Track.cs @@ -10,11 +10,11 @@ public class Track : List, IBinarySerializable public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { Clear(); - CurveType = reader.Read(); - Capacity = reader.Read(); - Flags = reader.Read(); - StartFrame = reader.Read(); - EndFrame = reader.Read(); + CurveType = (FCurveType)reader.ReadInt16(); + Capacity = reader.ReadUInt16(); + Flags = reader.ReadUInt32(); + StartFrame = reader.ReadUInt32(); + EndFrame = reader.ReadUInt32(); if (options.Version >= 3) { reader.Align(8); @@ -25,11 +25,11 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { - writer.Write(CurveType); - writer.Write((ushort)Count); - writer.Write(Flags); - writer.Write(StartFrame); - writer.Write(EndFrame); + writer.WriteInt16((short)CurveType); + writer.WriteUInt16((ushort)Count); + writer.WriteUInt32(Flags); + writer.WriteUInt32(StartFrame); + writer.WriteUInt32(EndFrame); if (options.Version >= 3) { writer.Align(8); diff --git a/Source/SharpNeedle/Framework/SurfRide/Draw/UserData.cs b/Source/SharpNeedle/Framework/SurfRide/Draw/UserData.cs index 6498632..a0cc8e6 100644 --- a/Source/SharpNeedle/Framework/SurfRide/Draw/UserData.cs +++ b/Source/SharpNeedle/Framework/SurfRide/Draw/UserData.cs @@ -5,7 +5,7 @@ public class UserData : List, IBinarySerializable public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) { Clear(); - Capacity = reader.Read(); + Capacity = reader.ReadInt32(); if (options.Version >= 3) { reader.Align(8); @@ -16,7 +16,7 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { - writer.Write(Count); + writer.WriteInt32(Count); if (options.Version >= 3) { writer.Align(8); @@ -41,7 +41,7 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) } Name = reader.ReadStringOffset(); - Type = reader.Read(); + Type = reader.ReadInt32(); if (options.Version >= 3) { reader.Align(8); @@ -87,7 +87,7 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) } writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name); - writer.Write(Type); + writer.WriteInt32(Type); if (options.Version >= 3) { writer.Align(8); diff --git a/Source/SharpNeedle/Framework/SurfRide/InfoChunk.cs b/Source/SharpNeedle/Framework/SurfRide/InfoChunk.cs index 99266c5..6b572db 100644 --- a/Source/SharpNeedle/Framework/SurfRide/InfoChunk.cs +++ b/Source/SharpNeedle/Framework/SurfRide/InfoChunk.cs @@ -14,11 +14,11 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) options.Header ??= reader.ReadObject(); reader.Endianness = (options.Header.Value.Size & 0xFFFF0000) != 0 ? Endianness.Big : Endianness.Little; Signature = options.Header.Value.Signature; - int chunkCount = reader.Read(); + int chunkCount = reader.ReadInt32(); SeekToken beforeChunk = reader.At(); reader.Skip(12); - Version = reader.Read(); + Version = reader.ReadInt32(); if (options.Version <= 2) { switch (Version) @@ -70,16 +70,16 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) { writer.WriteLittle(Signature); - writer.Write(0x18); // Always constant - writer.Write(Chunks.Count); - writer.Write(0x20); // Always at the end of the chunk + writer.WriteInt32(0x18); // Always constant + writer.WriteInt32(Chunks.Count); + writer.WriteInt32(0x20); // Always at the end of the chunk SeekToken sizePos = writer.At(); - writer.Write(0); // Chunk list size + writer.WriteInt32(0); // Chunk list size - writer.Write(0); // OffsetChunk Ptr - writer.Write(Version); - writer.Write(0); // Padding + writer.WriteInt32(0); // OffsetChunk Ptr + writer.WriteInt32(Version); + writer.WriteInt32(0); // Padding SeekToken chunkBegin = writer.At(); foreach (IChunk chunk in Chunks) @@ -99,13 +99,13 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options) writer.WriteObject(Offsets); { writer.WriteNative(BinaryHelper.MakeSignature("SEND")); - writer.Write(0); - writer.Write(0); + writer.WriteInt32(0); + writer.WriteInt64(0); } sizePos.Dispose(); - writer.Write((int)chunkEnd - (int)chunkBegin); - writer.Write((int)offsetChunkPos); + writer.WriteInt32((int)chunkEnd - (int)chunkBegin); + writer.WriteInt32((int)offsetChunkPos); writer.Flush(); } } diff --git a/Source/SharpNeedle/Framework/SurfRide/OffsetChunk.cs b/Source/SharpNeedle/Framework/SurfRide/OffsetChunk.cs index f8d2c3b..1081252 100644 --- a/Source/SharpNeedle/Framework/SurfRide/OffsetChunk.cs +++ b/Source/SharpNeedle/Framework/SurfRide/OffsetChunk.cs @@ -15,7 +15,7 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) options.Header ??= reader.ReadObject(); Signature = options.Header.Value.Signature; - int count = reader.Read(); + int count = reader.ReadInt32(); reader.Skip(4); // Runtime flags Offsets.AddRange(reader.ReadArray(count)); } @@ -23,10 +23,10 @@ public void Read(BinaryObjectReader reader, ChunkBinaryOptions options) public void Write(BinaryObjectWriter writer, ChunkBinaryOptions context) { writer.WriteLittle(Signature); - writer.Write(BinarySize - 8); // Size excluding header + writer.WriteInt32(BinarySize - 8); // Size excluding header - writer.Write(Offsets.Count); - writer.Write(0); // Runtime flags, make this 0 to kill the game + writer.WriteInt32(Offsets.Count); + writer.WriteInt32(0); // Runtime flags, make this 0 to kill the game writer.WriteCollection(Offsets); writer.Align(16); } diff --git a/Source/SharpNeedle/Resource/ResourceManager.cs b/Source/SharpNeedle/Resource/ResourceManager.cs index 7609382..c05153d 100644 --- a/Source/SharpNeedle/Resource/ResourceManager.cs +++ b/Source/SharpNeedle/Resource/ResourceManager.cs @@ -33,7 +33,7 @@ public void Dispose() } - private IResource OpenBase(IFile file, Type resourceType, bool resolveDepends = true) + private IResource OpenBase(IFile file, Func createResource, bool resolveDepends = true) { Func addUpdateFunc; @@ -55,7 +55,7 @@ private IResource OpenBase(IFile file, Type resourceType, bool resolveDepends = return cacheRes; } - IResource result = (IResource)Activator.CreateInstance(resourceType)!; + IResource result = createResource(); lock (_readingResources) { @@ -103,13 +103,13 @@ private IResource OpenBase(IFile file, Type resourceType, bool resolveDepends = public T Open(IFile file, bool resolveDepends = true) where T : IResource, new() { - return (T)OpenBase(file, typeof(T), resolveDepends); + return (T)OpenBase(file, () => new T(), resolveDepends); } public IResource Open(IFile file, bool resolveDepends = true) { Type type = ResourceTypeManager.DetectType(file)?.Owner ?? typeof(ResourceRaw); - return OpenBase(file, type, resolveDepends); + return OpenBase(file, () => (IResource)Activator.CreateInstance(type)!, resolveDepends); } public bool IsOpen(string path) diff --git a/Source/SharpNeedle/SharpNeedle.csproj b/Source/SharpNeedle/SharpNeedle.csproj index dafbce2..eaa316d 100644 --- a/Source/SharpNeedle/SharpNeedle.csproj +++ b/Source/SharpNeedle/SharpNeedle.csproj @@ -9,9 +9,8 @@ - - - + + diff --git a/Source/SharpNeedle/Structs/AABB.cs b/Source/SharpNeedle/Structs/AABB.cs index d6e165a..073f542 100644 --- a/Source/SharpNeedle/Structs/AABB.cs +++ b/Source/SharpNeedle/Structs/AABB.cs @@ -160,26 +160,26 @@ public bool Intersects(AABB aabb) public void Read(BinaryObjectReader reader) { - Min.X = reader.Read(); - Max.X = reader.Read(); + Min.X = reader.ReadSingle(); + Max.X = reader.ReadSingle(); - Min.Y = reader.Read(); - Max.Y = reader.Read(); + Min.Y = reader.ReadSingle(); + Max.Y = reader.ReadSingle(); - Min.Z = reader.Read(); - Max.Z = reader.Read(); + Min.Z = reader.ReadSingle(); + Max.Z = reader.ReadSingle(); } public void Write(BinaryObjectWriter writer) { - writer.Write(ref Min.X); - writer.Write(ref Max.X); + writer.WriteSingle(Min.X); + writer.WriteSingle(Max.X); - writer.Write(ref Min.Y); - writer.Write(ref Max.Y); + writer.WriteSingle(Min.Y); + writer.WriteSingle(Max.Y); - writer.Write(ref Min.Z); - writer.Write(ref Max.Z); + writer.WriteSingle(Min.Z); + writer.WriteSingle(Max.Z); } public override readonly string ToString() diff --git a/Source/SharpNeedle/Structs/BitSet.cs b/Source/SharpNeedle/Structs/BitSet.cs index aac3161..8013bfd 100644 --- a/Source/SharpNeedle/Structs/BitSet.cs +++ b/Source/SharpNeedle/Structs/BitSet.cs @@ -1,6 +1,6 @@ namespace SharpNeedle.Structs; -public struct BitSet : IEnumerable where T : INumberBase, IBinaryInteger +public struct BitSet : IBinarySerializable, IEnumerable where T : unmanaged, INumberBase, IBinaryInteger { public T Value; public readonly int BitCount => Unsafe.SizeOf() * 8; @@ -19,6 +19,16 @@ public BitSet(params T[] activeBits) : this() } } + public void Read(BinaryObjectReader reader) + { + Value = reader.Read(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.Write(Value); + } + [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public T GetField(Range range) { diff --git a/Source/SharpNeedle/Structs/Color.cs b/Source/SharpNeedle/Structs/Color.cs index e028935..300ee93 100644 --- a/Source/SharpNeedle/Structs/Color.cs +++ b/Source/SharpNeedle/Structs/Color.cs @@ -1,7 +1,7 @@ namespace SharpNeedle.Structs; [StructLayout(LayoutKind.Sequential)] -public struct Color where T : struct, INumber +public struct Color : IBinarySerializable where T : unmanaged, INumber { public T R; public T G; @@ -40,6 +40,22 @@ public override readonly string ToString() { return $"{{ R:{R}, G:{G}, B:{B}, A:{A} }}"; } + + public void Read(BinaryObjectReader reader) + { + R = reader.Read(); + G = reader.Read(); + B = reader.Read(); + A = reader.Read(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.Write(R); + writer.Write(G); + writer.Write(B); + writer.Write(A); + } } public static class ColorExtensions diff --git a/Source/SharpNeedle/Structs/Sphere.cs b/Source/SharpNeedle/Structs/Sphere.cs index 35e6cc6..9619864 100644 --- a/Source/SharpNeedle/Structs/Sphere.cs +++ b/Source/SharpNeedle/Structs/Sphere.cs @@ -1,7 +1,7 @@ namespace SharpNeedle.Structs; [StructLayout(LayoutKind.Sequential)] -public struct Sphere : IIntersectable, IIntersectable +public struct Sphere : IBinarySerializable, IIntersectable, IIntersectable { public Vector3 Center; public float Radius; @@ -24,6 +24,20 @@ public Sphere(AABB volume) Radius = volume.Radius; } + + public void Read(BinaryObjectReader reader) + { + Center = reader.ReadVector3(); + Radius = reader.ReadSingle(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteVector3(Center); + writer.WriteSingle(Radius); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly bool Intersects(Vector3 point) { diff --git a/Source/SharpNeedle/Structs/Vector2Int.cs b/Source/SharpNeedle/Structs/Vector2Int.cs index bb95a78..4055799 100644 --- a/Source/SharpNeedle/Structs/Vector2Int.cs +++ b/Source/SharpNeedle/Structs/Vector2Int.cs @@ -1,6 +1,6 @@ namespace SharpNeedle.Structs; -public struct Vector2Int +public struct Vector2Int : IBinarySerializable { public int X, Y; @@ -10,6 +10,18 @@ public Vector2Int(int x, int y) Y = y; } + public void Read(BinaryObjectReader reader) + { + X = reader.ReadInt32(); + Y = reader.ReadInt32(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteInt32(X); + writer.WriteInt32(Y); + } + public static Vector2Int operator +(Vector2Int a, Vector2Int b) { return new(a.X + b.X, a.Y + b.Y); diff --git a/Source/SharpNeedle/Structs/Vector4Int.cs b/Source/SharpNeedle/Structs/Vector4Int.cs index 1123109..9d1a3b4 100644 --- a/Source/SharpNeedle/Structs/Vector4Int.cs +++ b/Source/SharpNeedle/Structs/Vector4Int.cs @@ -1,6 +1,6 @@ namespace SharpNeedle.Structs; -public struct Vector4Int +public struct Vector4Int : IBinarySerializable { public int X, Y, Z, W; @@ -12,6 +12,22 @@ public Vector4Int(int x, int y, int z, int w) W = w; } + public void Read(BinaryObjectReader reader) + { + X = reader.ReadInt32(); + Y = reader.ReadInt32(); + Z = reader.ReadInt32(); + W = reader.ReadInt32(); + } + + public void Write(BinaryObjectWriter writer) + { + writer.WriteInt32(X); + writer.WriteInt32(Y); + writer.WriteInt32(Z); + writer.WriteInt32(W); + } + public static Vector4Int operator +(Vector4Int a, Vector4Int b) { return new(a.X + b.X, a.Y + b.Y, a.Z + b.Z, a.W + b.W); diff --git a/Source/SharpNeedle/Utilities/BinaryHelper.cs b/Source/SharpNeedle/Utilities/BinaryHelper.cs index 7e2d8ab..eb7fc43 100644 --- a/Source/SharpNeedle/Utilities/BinaryHelper.cs +++ b/Source/SharpNeedle/Utilities/BinaryHelper.cs @@ -254,11 +254,11 @@ public static void WriteOffsetValue(this BinaryObjectWriter writer, long value) { if (writer.OffsetBinaryFormat == OffsetBinaryFormat.U32) { - writer.Write((uint)value); + writer.WriteUInt32((uint)value); } else { - writer.Write(value); + writer.WriteInt64(value); } } @@ -322,7 +322,7 @@ public static void WriteStringPaddedByte(this BinaryObjectWriter writer, string? writer.WriteString(StringBinaryFormat.PrefixedLength8, str); while ((writer.Position % alignment) != 0) { - writer.Write((byte)paddingCharacter); + writer.WriteByte((byte)paddingCharacter); } } } \ No newline at end of file diff --git a/Source/SharpNeedle/Utilities/BinaryPrimitive.cs b/Source/SharpNeedle/Utilities/BinaryPrimitive.cs index 8508cc8..3e627e8 100644 --- a/Source/SharpNeedle/Utilities/BinaryPrimitive.cs +++ b/Source/SharpNeedle/Utilities/BinaryPrimitive.cs @@ -11,12 +11,12 @@ public BinaryPrimitive(T value) public void Read(BinaryObjectReader reader) { - reader.Read(out Value); + Value = reader.Read(); } public void Write(BinaryObjectWriter writer) { - writer.Write(ref Value); + writer.Write(Value); } public static implicit operator T(BinaryPrimitive self) diff --git a/Source/SharpNeedle/Utilities/StructBinaryHelper.cs b/Source/SharpNeedle/Utilities/StructBinaryHelper.cs new file mode 100644 index 0000000..1d4acae --- /dev/null +++ b/Source/SharpNeedle/Utilities/StructBinaryHelper.cs @@ -0,0 +1,170 @@ +namespace SharpNeedle.Utilities; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +public static class StructBinaryHelper +{ + // use these to avoid AOT endian byte swapping issues + + public static Vector2 ReadVector2(this BinaryValueReader reader) + { + return new Vector2( + reader.ReadSingle(), + reader.ReadSingle() + ); + } + + public static void WriteVector2(this BinaryValueWriter writer, Vector2 value) + { + writer.WriteSingle(value.X); + writer.WriteSingle(value.Y); + } + + public static Vector2[] ReadVector2Array(this BinaryValueReader reader, int count) + { + Vector2[] result = new Vector2[count]; + + for (int i = 0; i < count; i++) + { + result[i] = reader.ReadVector2(); + } + + return result; + } + + public static void WriteVector2Array(this BinaryValueWriter writer, Vector2[] array) + { + foreach (Vector2 value in array) + { + writer.WriteVector2(value); + } + } + + public static Vector3 ReadVector3(this BinaryValueReader reader) + { + return new Vector3( + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle() + ); + } + + public static void WriteVector3(this BinaryValueWriter writer, Vector3 value) + { + writer.WriteSingle(value.X); + writer.WriteSingle(value.Y); + writer.WriteSingle(value.Z); + } + + public static Vector3[] ReadVector3Array(this BinaryValueReader reader, int count) + { + Vector3[] result = new Vector3[count]; + + for(int i = 0; i < count; i++) + { + result[i] = reader.ReadVector3(); + } + + return result; + } + + public static void WriteVector3Array(this BinaryValueWriter writer, Vector3[] array) + { + foreach (Vector3 value in array) + { + writer.WriteVector3(value); + } + } + + public static Vector4 ReadVector4(this BinaryValueReader reader) + { + return new Vector4( + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle() + ); + } + + public static void WriteVector4(this BinaryValueWriter writer, Vector4 value) + { + writer.WriteSingle(value.X); + writer.WriteSingle(value.Y); + writer.WriteSingle(value.Z); + writer.WriteSingle(value.W); + } + + public static Quaternion ReadQuaternion(this BinaryValueReader reader) + { + return new Quaternion( + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle() + ); + } + + public static void WriteQuaternion(this BinaryValueWriter writer, Quaternion value) + { + writer.WriteSingle(value.X); + writer.WriteSingle(value.Y); + writer.WriteSingle(value.Z); + writer.WriteSingle(value.W); + } + + public static Matrix4x4 ReadMatrix4x4(this BinaryValueReader reader) + { + return new Matrix4x4( + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle(), + reader.ReadSingle() + ); + } + + public static void WriteMatrix4x4(this BinaryValueWriter writer, Matrix4x4 value) + { + writer.WriteSingle(value.M11); + writer.WriteSingle(value.M12); + writer.WriteSingle(value.M13); + writer.WriteSingle(value.M14); + writer.WriteSingle(value.M21); + writer.WriteSingle(value.M22); + writer.WriteSingle(value.M23); + writer.WriteSingle(value.M24); + writer.WriteSingle(value.M31); + writer.WriteSingle(value.M32); + writer.WriteSingle(value.M33); + writer.WriteSingle(value.M34); + writer.WriteSingle(value.M41); + writer.WriteSingle(value.M42); + writer.WriteSingle(value.M43); + writer.WriteSingle(value.M44); + } + + public static Guid ReadGuid(this BinaryValueReader reader) + { + return new Guid(reader.ReadArray(16), reader.Endianness == Endianness.Big); + } + + public static void WriteGuid(this BinaryValueWriter writer, Guid guid) + { + writer.WriteBytes(guid.ToByteArray(writer.Endianness == Endianness.Big)); + } +}