332 lines
11 KiB
C#
332 lines
11 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace LibDgf.Ps2.Vif
|
|
{
|
|
public static class BinaryReaderVifExtensions
|
|
{
|
|
public static VuFloat ReadPs2Float(this BinaryReader br)
|
|
{
|
|
return new VuFloat { Packed = br.ReadUInt32() };
|
|
}
|
|
|
|
public static VuVector[] ReadBoundingBox(this BinaryReader br)
|
|
{
|
|
var box = new VuVector[8];
|
|
for (int i = 0; i < box.Length; ++i)
|
|
{
|
|
box[i] = br.ReadV4_32();
|
|
}
|
|
return box;
|
|
}
|
|
|
|
public static VuVector ReadOneVifCodeUnpack(this BinaryReader br, VifCodeUnpack u)
|
|
{
|
|
switch (u.Vn)
|
|
{
|
|
case VifUnpackVnType.S:
|
|
switch (u.Vl)
|
|
{
|
|
case VifUnpackVlType.L_32:
|
|
return br.ReadS_32();
|
|
case VifUnpackVlType.L_16:
|
|
return u.Unsigned ? br.ReadS_16U() : br.ReadS_16S();
|
|
case VifUnpackVlType.L_8:
|
|
return u.Unsigned ? br.ReadS_8U() : br.ReadS_8S();
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case VifUnpackVnType.V2:
|
|
switch (u.Vl)
|
|
{
|
|
case VifUnpackVlType.L_32:
|
|
return br.ReadV2_32();
|
|
case VifUnpackVlType.L_16:
|
|
return u.Unsigned ? br.ReadV2_16U() : br.ReadV2_16S();
|
|
case VifUnpackVlType.L_8:
|
|
return u.Unsigned ? br.ReadV2_8U() : br.ReadV2_8S();
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case VifUnpackVnType.V3:
|
|
switch (u.Vl)
|
|
{
|
|
case VifUnpackVlType.L_32:
|
|
return br.ReadV3_32();
|
|
case VifUnpackVlType.L_16:
|
|
return u.Unsigned ? br.ReadV3_16U() : br.ReadV3_16S();
|
|
case VifUnpackVlType.L_8:
|
|
return u.Unsigned ? br.ReadV3_8U() : br.ReadV3_8S();
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case VifUnpackVnType.V4:
|
|
switch (u.Vl)
|
|
{
|
|
case VifUnpackVlType.L_32:
|
|
return br.ReadV4_32();
|
|
case VifUnpackVlType.L_16:
|
|
return u.Unsigned ? br.ReadV4_16U() : br.ReadV4_16S();
|
|
case VifUnpackVlType.L_8:
|
|
return u.Unsigned ? br.ReadV4_8U() : br.ReadV4_8S();
|
|
case VifUnpackVlType.L_5:
|
|
return br.ReadV4_5();
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
throw new ArgumentException("Invalid vn/vl combination", nameof(u));
|
|
}
|
|
|
|
public static VuVector ReadV4_32(this BinaryReader br)
|
|
{
|
|
return new VuVector
|
|
{
|
|
X = new VuFloat { Packed = br.ReadUInt32() },
|
|
Y = new VuFloat { Packed = br.ReadUInt32() },
|
|
Z = new VuFloat { Packed = br.ReadUInt32() },
|
|
W = new VuFloat { Packed = br.ReadUInt32() }
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV4_16U(this BinaryReader br)
|
|
{
|
|
return new VuVector
|
|
{
|
|
X = new VuFloat { Packed = br.ReadUInt16() },
|
|
Y = new VuFloat { Packed = br.ReadUInt16() },
|
|
Z = new VuFloat { Packed = br.ReadUInt16() },
|
|
W = new VuFloat { Packed = br.ReadUInt16() },
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV4_16S(this BinaryReader br)
|
|
{
|
|
return new VuVector
|
|
{
|
|
X = new VuFloat { Packed = unchecked((uint)br.ReadInt16()) },
|
|
Y = new VuFloat { Packed = unchecked((uint)br.ReadInt16()) },
|
|
Z = new VuFloat { Packed = unchecked((uint)br.ReadInt16()) },
|
|
W = new VuFloat { Packed = unchecked((uint)br.ReadInt16()) },
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV4_8U(this BinaryReader br)
|
|
{
|
|
return new VuVector
|
|
{
|
|
X = new VuFloat { Packed = br.ReadByte() },
|
|
Y = new VuFloat { Packed = br.ReadByte() },
|
|
Z = new VuFloat { Packed = br.ReadByte() },
|
|
W = new VuFloat { Packed = br.ReadByte() },
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV4_8S(this BinaryReader br)
|
|
{
|
|
return new VuVector
|
|
{
|
|
X = new VuFloat { Packed = unchecked((uint)br.ReadSByte()) },
|
|
Y = new VuFloat { Packed = unchecked((uint)br.ReadSByte()) },
|
|
Z = new VuFloat { Packed = unchecked((uint)br.ReadSByte()) },
|
|
W = new VuFloat { Packed = unchecked((uint)br.ReadSByte()) },
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV3_32(this BinaryReader br)
|
|
{
|
|
return new VuVector
|
|
{
|
|
X = new VuFloat { Packed = br.ReadUInt32() },
|
|
Y = new VuFloat { Packed = br.ReadUInt32() },
|
|
Z = new VuFloat { Packed = br.ReadUInt32() },
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV3_16U(this BinaryReader br)
|
|
{
|
|
return new VuVector
|
|
{
|
|
X = new VuFloat { Packed = br.ReadUInt16() },
|
|
Y = new VuFloat { Packed = br.ReadUInt16() },
|
|
Z = new VuFloat { Packed = br.ReadUInt16() },
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV3_16S(this BinaryReader br)
|
|
{
|
|
return new VuVector
|
|
{
|
|
X = new VuFloat { Packed = unchecked((uint)br.ReadInt16()) },
|
|
Y = new VuFloat { Packed = unchecked((uint)br.ReadInt16()) },
|
|
Z = new VuFloat { Packed = unchecked((uint)br.ReadInt16()) },
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV3_8U(this BinaryReader br)
|
|
{
|
|
return new VuVector
|
|
{
|
|
X = new VuFloat { Packed = br.ReadByte() },
|
|
Y = new VuFloat { Packed = br.ReadByte() },
|
|
Z = new VuFloat { Packed = br.ReadByte() },
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV3_8S(this BinaryReader br)
|
|
{
|
|
return new VuVector
|
|
{
|
|
X = new VuFloat { Packed = unchecked((uint)br.ReadSByte()) },
|
|
Y = new VuFloat { Packed = unchecked((uint)br.ReadSByte()) },
|
|
Z = new VuFloat { Packed = unchecked((uint)br.ReadSByte()) },
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV2_32(this BinaryReader br)
|
|
{
|
|
var x = new VuFloat { Packed = br.ReadUInt32() };
|
|
var y = new VuFloat { Packed = br.ReadUInt32() };
|
|
return new VuVector
|
|
{
|
|
X = x,
|
|
Y = y,
|
|
Z = x,
|
|
W = y
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV2_16U(this BinaryReader br)
|
|
{
|
|
var x = new VuFloat { Packed = br.ReadUInt16() };
|
|
var y = new VuFloat { Packed = br.ReadUInt16() };
|
|
return new VuVector
|
|
{
|
|
X = x,
|
|
Y = y,
|
|
Z = x,
|
|
W = y
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV2_16S(this BinaryReader br)
|
|
{
|
|
var x = new VuFloat { Packed = unchecked((uint)br.ReadInt16()) };
|
|
var y = new VuFloat { Packed = unchecked((uint)br.ReadInt16()) };
|
|
return new VuVector
|
|
{
|
|
X = x,
|
|
Y = y,
|
|
Z = x,
|
|
W = y
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV2_8U(this BinaryReader br)
|
|
{
|
|
var x = new VuFloat { Packed = (uint)br.ReadByte() };
|
|
var y = new VuFloat { Packed = (uint)br.ReadByte() };
|
|
return new VuVector
|
|
{
|
|
X = x,
|
|
Y = y,
|
|
Z = x,
|
|
W = y
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV2_8S(this BinaryReader br)
|
|
{
|
|
var x = new VuFloat { Packed = unchecked((uint)br.ReadSByte()) };
|
|
var y = new VuFloat { Packed = unchecked((uint)br.ReadSByte()) };
|
|
return new VuVector
|
|
{
|
|
X = x,
|
|
Y = y,
|
|
Z = x,
|
|
W = y
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadS_32(this BinaryReader br)
|
|
{
|
|
var s = new VuFloat { Packed = br.ReadUInt32() };
|
|
return new VuVector
|
|
{
|
|
X = s,
|
|
Y = s,
|
|
Z = s,
|
|
W = s
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadS_16U(this BinaryReader br)
|
|
{
|
|
var s = new VuFloat { Packed = (uint)br.ReadUInt16() };
|
|
return new VuVector
|
|
{
|
|
X = s,
|
|
Y = s,
|
|
Z = s,
|
|
W = s
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadS_16S(this BinaryReader br)
|
|
{
|
|
var s = new VuFloat { Packed = unchecked((uint)br.ReadInt16()) };
|
|
return new VuVector
|
|
{
|
|
X = s,
|
|
Y = s,
|
|
Z = s,
|
|
W = s
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadS_8U(this BinaryReader br)
|
|
{
|
|
var s = new VuFloat { Packed = (uint)br.ReadByte() };
|
|
return new VuVector
|
|
{
|
|
X = s,
|
|
Y = s,
|
|
Z = s,
|
|
W = s
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadS_8S(this BinaryReader br)
|
|
{
|
|
var s = new VuFloat { Packed = unchecked((uint)br.ReadSByte()) };
|
|
return new VuVector
|
|
{
|
|
X = s,
|
|
Y = s,
|
|
Z = s,
|
|
W = s
|
|
};
|
|
}
|
|
|
|
public static VuVector ReadV4_5(this BinaryReader br)
|
|
{
|
|
uint rgba = br.ReadUInt16();
|
|
return new VuVector
|
|
{
|
|
X = new VuFloat { Packed = (rgba << 3) & 0xf8 },
|
|
Y = new VuFloat { Packed = (rgba >> 2) & 0xf8 },
|
|
Z = new VuFloat { Packed = (rgba >> 7) & 0xf8 },
|
|
W = new VuFloat { Packed = (rgba >> 8) & 0x80 },
|
|
};
|
|
}
|
|
}
|
|
}
|