Skip to content

Commit

Permalink
Read csd colours as uint
Browse files Browse the repository at this point in the history
  • Loading branch information
Sajidur78 committed Jan 29, 2025
1 parent 7488c0f commit e32defc
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 5 deletions.
4 changes: 2 additions & 2 deletions Source/SharpNeedle/Ninja/Csd/Cast.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public void Read(BinaryObjectReader reader, Family family)
BottomRight = reader.Read<Vector2>();

Field2C = reader.Read<uint>();
Info = reader.ReadValueOffset<CastInfo>();
Info = reader.ReadObjectOffset<CastInfo>();
InheritanceFlags = reader.Read<BitSet<uint>>();
Field38 = reader.Read<uint>();
SpriteIndices = reader.ReadArrayOffset<int>(reader.Read<int>());
Expand Down Expand Up @@ -94,7 +94,7 @@ public void Write(BinaryObjectWriter writer, Family family)
writer.Write(BottomRight);

writer.Write(Field2C);
writer.WriteValueOffset(Info);
writer.WriteObjectOffset(Info);
writer.Write(InheritanceFlags);
writer.Write(Field38);

Expand Down
42 changes: 41 additions & 1 deletion Source/SharpNeedle/Ninja/Csd/CastInfo.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
namespace SharpNeedle.Ninja.Csd;

[StructLayout(LayoutKind.Sequential)]
public struct CastInfo
public struct CastInfo : IBinarySerializable
{
public uint HideFlag;
public Vector2 Translation;
Expand All @@ -16,4 +16,44 @@ public struct CastInfo
public uint Field30;
public uint Field34;
public uint Field38;

public void Read(BinaryObjectReader reader)
{
HideFlag = reader.Read<uint>();
Translation = reader.Read<Vector2>();
Rotation = reader.Read<float>();
Scale = reader.Read<Vector2>();
SpriteIndex = reader.Read<float>();

// Colours are handled as uints for endianness
Unsafe.As<Color<byte>, uint>(ref Color) = reader.Read<uint>();
Unsafe.As<Color<byte>, uint>(ref GradientTopLeft) = reader.Read<uint>();
Unsafe.As<Color<byte>, uint>(ref GradientBottomLeft) = reader.Read<uint>();
Unsafe.As<Color<byte>, uint>(ref GradientTopRight) = reader.Read<uint>();
Unsafe.As<Color<byte>, uint>(ref GradientBottomRight) = reader.Read<uint>();

Field30 = reader.Read<uint>();
Field34 = reader.Read<uint>();
Field38 = reader.Read<uint>();
}

public void Write(BinaryObjectWriter writer)
{
writer.Write(HideFlag);
writer.Write(Translation);
writer.Write(Rotation);
writer.Write(Scale);
writer.Write(SpriteIndex);

// Colours are handled as uints for endianness
writer.Write(Unsafe.As<Color<byte>, uint>(ref Color));
writer.Write(Unsafe.As<Color<byte>, uint>(ref GradientTopLeft));
writer.Write(Unsafe.As<Color<byte>, uint>(ref GradientBottomLeft));
writer.Write(Unsafe.As<Color<byte>, uint>(ref GradientTopRight));
writer.Write(Unsafe.As<Color<byte>, uint>(ref GradientBottomRight));

writer.Write(Field30);
writer.Write(Field34);
writer.Write(Field38);
}
}
9 changes: 7 additions & 2 deletions Source/SharpNeedle/Ninja/Csd/Motions/KeyFrame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class KeyFrame : IBinarySerializable
public void Read(BinaryObjectReader reader)
{
Frame = reader.Read<uint>();
Value = reader.Read<Union>();
Value = reader.Read<uint>();
Interpolation = reader.Read<InterpolationType>();
InTangent = reader.Read<float>();
OutTangent = reader.Read<float>();
Expand All @@ -23,7 +23,7 @@ public void Read(BinaryObjectReader reader)
public void Write(BinaryObjectWriter writer)
{
writer.Write(Frame);
writer.Write(Value);
writer.Write(Value.Uint);
writer.Write(Interpolation);
writer.Write(InTangent);
writer.Write(OutTangent);
Expand All @@ -34,18 +34,23 @@ public void Write(BinaryObjectWriter writer)
public struct Union
{
[FieldOffset(0)] public Color<byte> Color;
[FieldOffset(0)] public uint Uint;
[FieldOffset(0)] public float Float;

public Union(Color<byte> value) : this() => Color = value;
public Union(uint value) : this() => Uint = value;
public Union(float value) : this() => Float = value;

public void Set(Color<byte> value) => Color = value;
public void Set(uint value) => Uint = value;
public void Set(float value) => Float = value;

public static implicit operator Union(float value) => new Union(value);
public static implicit operator Union(uint value) => new Union(value);
public static implicit operator Union(Color<byte> value) => new Union(value);

public static implicit operator float(Union value) => value.Float;
public static implicit operator uint(Union value) => value.Uint;
public static implicit operator Color<byte>(Union value) => value.Color;
}
}

0 comments on commit e32defc

Please sign in to comment.