Add support for Attributes!

This commit is contained in:
Max
2021-02-25 14:09:54 -06:00
parent 81d901cbcd
commit 83dd0af8d2
54 changed files with 1053 additions and 852 deletions

View File

@ -6,9 +6,11 @@ namespace RobloxFiles.DataTypes
{
public class CFrame
{
private float m11 = 1, m12, m13, m14;
private float m21, m22 = 1, m23, m24;
private float m31, m32, m33 = 1, m34;
private float m14, m24, m34;
private readonly float m11 = 1, m12, m13;
private readonly float m21, m22 = 1, m23;
private readonly float m31, m32, m33 = 1;
private const float m41 = 0, m42 = 0, m43 = 0, m44 = 1;
@ -160,49 +162,17 @@ namespace RobloxFiles.DataTypes
m31 = comp[9]; m32 = comp[10]; m33 = comp[11];
}
private void InitFromMatrix(Vector3 pos, Vector3 vX, Vector3 vY, Vector3 vZ = null)
public CFrame(Vector3 pos, Vector3 vX, Vector3 vY, Vector3 vZ = null)
{
Contract.Requires(pos != null && vX != null && vY != null);
if (vZ == null)
vZ = vX.Cross(vY);
m14 = pos.X; m24 = pos.Y; m34 = pos.Z;
m11 = vX.X; m12 = vX.Y; m13 = vX.Z;
m21 = vY.X; m22 = vY.Y; m23 = vY.Z;
m31 = vZ.X; m32 = vZ.Y; m33 = vZ.Z;
}
public CFrame(Vector3 pos, Vector3 vX, Vector3 vY, Vector3 vZ = null)
{
Contract.Requires(pos != null && vX != null && vY != null);
InitFromMatrix(pos, vX, vY, vZ);
}
internal CFrame(Attribute attr)
{
Vector3 pos = new Vector3(attr);
byte rawOrientId = attr.ReadByte();
if (rawOrientId > 0)
{
// Make sure this value is in a safe range.
int orientId = (rawOrientId - 1) % 36;
NormalId xColumn = (NormalId)(orientId / 6);
Vector3 vX = Vector3.FromNormalId(xColumn);
NormalId yColumn = (NormalId)(orientId % 6);
Vector3 vY = Vector3.FromNormalId(yColumn);
InitFromMatrix(pos, vX, vY);
}
else
{
Vector3 vX = new Vector3(attr),
vY = new Vector3(attr),
vZ = new Vector3(attr);
InitFromMatrix(pos, vX, vY, vZ);
}
m11 = vX.X; m12 = vX.Y; m13 = vX.Z;
m21 = vY.X; m22 = vY.Y; m23 = vY.Z;
m31 = vZ.X; m32 = vZ.Y; m33 = vZ.Z;
}
public static CFrame operator +(CFrame a, Vector3 b)

View File

@ -40,13 +40,6 @@ namespace RobloxFiles.DataTypes
return true;
}
internal Color3(Attribute attr)
{
R = attr.ReadFloat();
G = attr.ReadFloat();
B = attr.ReadFloat();
}
public static Color3 FromRGB(uint r = 0, uint g = 0, uint b = 0)
{
return new Color3(r / 255f, g / 255f, b / 255f);

View File

@ -86,16 +86,5 @@ namespace RobloxFiles.DataTypes
Keypoints = keypoints;
}
public ColorSequence(Attribute attr)
{
int numKeys = attr.ReadInt();
var keypoints = new ColorSequenceKeypoint[numKeys];
for (int i = 0; i < numKeys; i++)
keypoints[i] = new ColorSequenceKeypoint(attr);
Keypoints = keypoints;
}
}
}

View File

@ -19,13 +19,6 @@
Envelope = envelope;
}
internal ColorSequenceKeypoint(Attribute attr)
{
Envelope = attr.ReadInt();
Time = attr.ReadFloat();
Value = new Color3(attr);
}
public override int GetHashCode()
{
int hash = Time.GetHashCode()

View File

@ -25,10 +25,6 @@ namespace RobloxFiles.DataTypes
Max = max;
}
internal NumberRange(Attribute attr) : this(attr.ReadFloat(), attr.ReadFloat())
{
}
public override int GetHashCode()
{
return Min.GetHashCode() ^ Max.GetHashCode();

View File

@ -52,17 +52,6 @@ namespace RobloxFiles.DataTypes
Keypoints = keypoints;
}
public NumberSequence(Attribute attr)
{
int numKeys = attr.ReadInt();
var keypoints = new NumberSequenceKeypoint[numKeys];
for (int i = 0; i < numKeys; i++)
keypoints[i] = new NumberSequenceKeypoint(attr);
Keypoints = keypoints;
}
public override int GetHashCode()
{
int hash = 0;

View File

@ -28,12 +28,6 @@
Direction = direction ?? new Vector3();
}
internal Ray(Attribute attr)
{
Origin = new Vector3(attr);
Direction = new Vector3(attr);
}
public Vector3 ClosestPoint(Vector3 point)
{
Vector3 result = Origin;

View File

@ -22,12 +22,6 @@
Max = new Vector2(maxX, maxY);
}
internal Rect(Attribute attr)
{
Min = new Vector2(attr);
Max = new Vector2(attr);
}
public override int GetHashCode()
{
int hash = Min.GetHashCode()

View File

@ -17,12 +17,6 @@ namespace RobloxFiles.DataTypes
Max = max;
}
internal Region3(Attribute attr)
{
Min = new Vector3(attr);
Max = new Vector3(attr);
}
public Region3 ExpandToGrid(float resolution)
{
Vector3 emin = new Vector3

View File

@ -13,12 +13,6 @@
Offset = offset;
}
internal UDim(Attribute attr)
{
Scale = attr.ReadFloat();
Offset = attr.ReadInt();
}
public static UDim operator+(UDim a, UDim b)
{
return new UDim(a.Scale + b.Scale, a.Offset + b.Offset);

View File

@ -20,12 +20,6 @@
Y = y;
}
internal UDim2(Attribute attr)
{
X = new UDim(attr);
Y = new UDim(attr);
}
public UDim2 Lerp(UDim2 other, float alpha)
{
float scaleX = X.Scale + ((other.X.Scale - X.Scale) * alpha);

View File

@ -29,27 +29,21 @@ namespace RobloxFiles.DataTypes
Y = y;
}
internal Vector2(float[] coords)
public Vector2(params float[] coords)
{
X = coords.Length > 0 ? coords[0] : 0;
Y = coords.Length > 1 ? coords[1] : 0;
}
internal Vector2(Attribute attr)
{
X = attr.ReadFloat();
Y = attr.ReadFloat();
}
private delegate Vector2 Operator(Vector2 a, Vector2 b);
private static Vector2 upcastFloatOp(Vector2 vec, float num, Operator upcast)
private static Vector2 UpcastFloatOp(Vector2 vec, float num, Operator upcast)
{
Vector2 numVec = new Vector2(num, num);
return upcast(vec, numVec);
}
private static Vector2 upcastFloatOp(float num, Vector2 vec, Operator upcast)
private static Vector2 UpcastFloatOp(float num, Vector2 vec, Operator upcast)
{
Vector2 numVec = new Vector2(num, num);
return upcast(numVec, vec);
@ -61,20 +55,20 @@ namespace RobloxFiles.DataTypes
private static readonly Operator div = new Operator((a, b) => new Vector2(a.X / b.X, a.Y / b.Y));
public static Vector2 operator +(Vector2 a, Vector2 b) => add(a, b);
public static Vector2 operator +(Vector2 v, float n) => upcastFloatOp(v, n, add);
public static Vector2 operator +(float n, Vector2 v) => upcastFloatOp(n, v, add);
public static Vector2 operator +(Vector2 v, float n) => UpcastFloatOp(v, n, add);
public static Vector2 operator +(float n, Vector2 v) => UpcastFloatOp(n, v, add);
public static Vector2 operator -(Vector2 a, Vector2 b) => sub(a, b);
public static Vector2 operator -(Vector2 v, float n) => upcastFloatOp(v, n, sub);
public static Vector2 operator -(float n, Vector2 v) => upcastFloatOp(n, v, sub);
public static Vector2 operator -(Vector2 v, float n) => UpcastFloatOp(v, n, sub);
public static Vector2 operator -(float n, Vector2 v) => UpcastFloatOp(n, v, sub);
public static Vector2 operator *(Vector2 a, Vector2 b) => mul(a, b);
public static Vector2 operator *(Vector2 v, float n) => upcastFloatOp(v, n, mul);
public static Vector2 operator *(float n, Vector2 v) => upcastFloatOp(n, v, mul);
public static Vector2 operator *(Vector2 v, float n) => UpcastFloatOp(v, n, mul);
public static Vector2 operator *(float n, Vector2 v) => UpcastFloatOp(n, v, mul);
public static Vector2 operator /(Vector2 a, Vector2 b) => div(a, b);
public static Vector2 operator /(Vector2 v, float n) => upcastFloatOp(v, n, div);
public static Vector2 operator /(float n, Vector2 v) => upcastFloatOp(n, v, div);
public static Vector2 operator /(Vector2 v, float n) => UpcastFloatOp(v, n, div);
public static Vector2 operator /(float n, Vector2 v) => UpcastFloatOp(n, v, div);
public static Vector2 operator -(Vector2 v)
{

View File

@ -32,20 +32,13 @@ namespace RobloxFiles.DataTypes
Z = z;
}
public Vector3(float[] coords)
public Vector3(params float[] coords)
{
X = coords.Length > 0 ? coords[0] : 0;
Y = coords.Length > 1 ? coords[1] : 0;
Z = coords.Length > 2 ? coords[2] : 0;
}
internal Vector3(Attribute attr)
{
X = attr.ReadFloat();
Y = attr.ReadFloat();
Z = attr.ReadFloat();
}
public static Vector3 FromAxis(Axis axis)
{
float[] coords = new float[3] { 0f, 0f, 0f };
@ -68,13 +61,13 @@ namespace RobloxFiles.DataTypes
private delegate Vector3 Operator(Vector3 a, Vector3 b);
private static Vector3 upcastFloatOp(Vector3 vec, float num, Operator upcast)
private static Vector3 UpcastFloatOp(Vector3 vec, float num, Operator upcast)
{
Vector3 numVec = new Vector3(num, num, num);
return upcast(vec, numVec);
}
private static Vector3 upcastFloatOp(float num, Vector3 vec, Operator upcast)
private static Vector3 UpcastFloatOp(float num, Vector3 vec, Operator upcast)
{
Vector3 numVec = new Vector3(num, num, num);
return upcast(numVec, vec);
@ -86,30 +79,30 @@ namespace RobloxFiles.DataTypes
private static readonly Operator div = new Operator((a, b) => new Vector3(a.X / b.X, a.Y / b.Y, a.Z / b.Z));
public static Vector3 operator +(Vector3 a, Vector3 b) => add(a, b);
public static Vector3 operator +(Vector3 v, float n) => upcastFloatOp(v, n, add);
public static Vector3 operator +(float n, Vector3 v) => upcastFloatOp(n, v, add);
public static Vector3 operator +(Vector3 v, float n) => UpcastFloatOp(v, n, add);
public static Vector3 operator +(float n, Vector3 v) => UpcastFloatOp(n, v, add);
public static Vector3 operator -(Vector3 a, Vector3 b) => sub(a, b);
public static Vector3 operator -(Vector3 v, float n) => upcastFloatOp(v, n, sub);
public static Vector3 operator -(float n, Vector3 v) => upcastFloatOp(n, v, sub);
public static Vector3 operator -(Vector3 v, float n) => UpcastFloatOp(v, n, sub);
public static Vector3 operator -(float n, Vector3 v) => UpcastFloatOp(n, v, sub);
public static Vector3 operator *(Vector3 a, Vector3 b) => mul(a, b);
public static Vector3 operator *(Vector3 v, float n) => upcastFloatOp(v, n, mul);
public static Vector3 operator *(float n, Vector3 v) => upcastFloatOp(n, v, mul);
public static Vector3 operator *(Vector3 v, float n) => UpcastFloatOp(v, n, mul);
public static Vector3 operator *(float n, Vector3 v) => UpcastFloatOp(n, v, mul);
public static Vector3 operator /(Vector3 a, Vector3 b) => div(a, b);
public static Vector3 operator /(Vector3 v, float n) => upcastFloatOp(v, n, div);
public static Vector3 operator /(float n, Vector3 v) => upcastFloatOp(n, v, div);
public static Vector3 operator /(Vector3 v, float n) => UpcastFloatOp(v, n, div);
public static Vector3 operator /(float n, Vector3 v) => UpcastFloatOp(n, v, div);
public static Vector3 operator -(Vector3 v)
{
return new Vector3(-v.X, -v.Y, -v.Z);
}
public static Vector3 Zero => new Vector3(0, 0, 0);
public static Vector3 Right => new Vector3(1, 0, 0);
public static Vector3 Up => new Vector3(0, 1, 0);
public static Vector3 Back => new Vector3(0, 0, 1);
public static readonly Vector3 Zero = new Vector3(0, 0, 0);
public static readonly Vector3 Right = new Vector3(1, 0, 0);
public static readonly Vector3 Up = new Vector3(0, 1, 0);
public static readonly Vector3 Back = new Vector3(0, 0, 1);
public float Dot(Vector3 other)
{