Skip to content

Commit e32defc

Browse files
committed
Read csd colours as uint
1 parent 7488c0f commit e32defc

3 files changed

Lines changed: 50 additions & 5 deletions

File tree

Source/SharpNeedle/Ninja/Csd/Cast.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public void Read(BinaryObjectReader reader, Family family)
5959
BottomRight = reader.Read<Vector2>();
6060

6161
Field2C = reader.Read<uint>();
62-
Info = reader.ReadValueOffset<CastInfo>();
62+
Info = reader.ReadObjectOffset<CastInfo>();
6363
InheritanceFlags = reader.Read<BitSet<uint>>();
6464
Field38 = reader.Read<uint>();
6565
SpriteIndices = reader.ReadArrayOffset<int>(reader.Read<int>());
@@ -94,7 +94,7 @@ public void Write(BinaryObjectWriter writer, Family family)
9494
writer.Write(BottomRight);
9595

9696
writer.Write(Field2C);
97-
writer.WriteValueOffset(Info);
97+
writer.WriteObjectOffset(Info);
9898
writer.Write(InheritanceFlags);
9999
writer.Write(Field38);
100100

Source/SharpNeedle/Ninja/Csd/CastInfo.cs

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
namespace SharpNeedle.Ninja.Csd;
22

33
[StructLayout(LayoutKind.Sequential)]
4-
public struct CastInfo
4+
public struct CastInfo : IBinarySerializable
55
{
66
public uint HideFlag;
77
public Vector2 Translation;
@@ -16,4 +16,44 @@ public struct CastInfo
1616
public uint Field30;
1717
public uint Field34;
1818
public uint Field38;
19+
20+
public void Read(BinaryObjectReader reader)
21+
{
22+
HideFlag = reader.Read<uint>();
23+
Translation = reader.Read<Vector2>();
24+
Rotation = reader.Read<float>();
25+
Scale = reader.Read<Vector2>();
26+
SpriteIndex = reader.Read<float>();
27+
28+
// Colours are handled as uints for endianness
29+
Unsafe.As<Color<byte>, uint>(ref Color) = reader.Read<uint>();
30+
Unsafe.As<Color<byte>, uint>(ref GradientTopLeft) = reader.Read<uint>();
31+
Unsafe.As<Color<byte>, uint>(ref GradientBottomLeft) = reader.Read<uint>();
32+
Unsafe.As<Color<byte>, uint>(ref GradientTopRight) = reader.Read<uint>();
33+
Unsafe.As<Color<byte>, uint>(ref GradientBottomRight) = reader.Read<uint>();
34+
35+
Field30 = reader.Read<uint>();
36+
Field34 = reader.Read<uint>();
37+
Field38 = reader.Read<uint>();
38+
}
39+
40+
public void Write(BinaryObjectWriter writer)
41+
{
42+
writer.Write(HideFlag);
43+
writer.Write(Translation);
44+
writer.Write(Rotation);
45+
writer.Write(Scale);
46+
writer.Write(SpriteIndex);
47+
48+
// Colours are handled as uints for endianness
49+
writer.Write(Unsafe.As<Color<byte>, uint>(ref Color));
50+
writer.Write(Unsafe.As<Color<byte>, uint>(ref GradientTopLeft));
51+
writer.Write(Unsafe.As<Color<byte>, uint>(ref GradientBottomLeft));
52+
writer.Write(Unsafe.As<Color<byte>, uint>(ref GradientTopRight));
53+
writer.Write(Unsafe.As<Color<byte>, uint>(ref GradientBottomRight));
54+
55+
writer.Write(Field30);
56+
writer.Write(Field34);
57+
writer.Write(Field38);
58+
}
1959
}

Source/SharpNeedle/Ninja/Csd/Motions/KeyFrame.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class KeyFrame : IBinarySerializable
1313
public void Read(BinaryObjectReader reader)
1414
{
1515
Frame = reader.Read<uint>();
16-
Value = reader.Read<Union>();
16+
Value = reader.Read<uint>();
1717
Interpolation = reader.Read<InterpolationType>();
1818
InTangent = reader.Read<float>();
1919
OutTangent = reader.Read<float>();
@@ -23,7 +23,7 @@ public void Read(BinaryObjectReader reader)
2323
public void Write(BinaryObjectWriter writer)
2424
{
2525
writer.Write(Frame);
26-
writer.Write(Value);
26+
writer.Write(Value.Uint);
2727
writer.Write(Interpolation);
2828
writer.Write(InTangent);
2929
writer.Write(OutTangent);
@@ -34,18 +34,23 @@ public void Write(BinaryObjectWriter writer)
3434
public struct Union
3535
{
3636
[FieldOffset(0)] public Color<byte> Color;
37+
[FieldOffset(0)] public uint Uint;
3738
[FieldOffset(0)] public float Float;
3839

3940
public Union(Color<byte> value) : this() => Color = value;
41+
public Union(uint value) : this() => Uint = value;
4042
public Union(float value) : this() => Float = value;
4143

4244
public void Set(Color<byte> value) => Color = value;
45+
public void Set(uint value) => Uint = value;
4346
public void Set(float value) => Float = value;
4447

4548
public static implicit operator Union(float value) => new Union(value);
49+
public static implicit operator Union(uint value) => new Union(value);
4650
public static implicit operator Union(Color<byte> value) => new Union(value);
4751

4852
public static implicit operator float(Union value) => value.Float;
53+
public static implicit operator uint(Union value) => value.Uint;
4954
public static implicit operator Color<byte>(Union value) => value.Color;
5055
}
5156
}

0 commit comments

Comments
 (0)