Add support for Attributes!
This commit is contained in:
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user