libdgf/LibDgf/Ps2/Vif/BinaryReaderVifExtensions.cs
2021-03-17 03:18:15 -06:00

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