de8df15d3f
Instance classes are now strongly typed with real property fields that are derived from the JSON API Dump! This required a lot of reworking across the board: - Classes and Enums are auto-generated in the 'Generated' folder now. This is done using a custom built-in plugin, which can be found in the Plugins folder of this project. - Property objects are now tied to .NET's reflection system. Reading and writing from them will try to redirect into a field of the Instance they are bound to. - Property types that were loosely defined now have proper data types (such as Color3uint8, Content, ProtectedString, SharedString, etc) - Fixed an error with the CFrame directional vectors. - The binary PRNT chunk now writes instances in child->parent order. - Enums are now generated correctly, with up-to-date values. - INST chunks are now referred to as 'Classes' instead of 'Types'. - Unary operator added to Vector2 and Vector3. - CollectionService tags can now be manipulated per-instance using the Instance.Tags member. - The Instance.Archivable property now works correctly. - XML files now save/load metadata correctly. - Cleaned up the property tokens directory. I probably missed a few things, but that's a general overview of everything that changed.
115 lines
2.7 KiB
C#
115 lines
2.7 KiB
C#
using System;
|
|
using System.Globalization;
|
|
|
|
internal static class Formatting
|
|
{
|
|
private static CultureInfo invariant => CultureInfo.InvariantCulture;
|
|
|
|
public static string ToInvariantString(this float value)
|
|
{
|
|
string result;
|
|
|
|
if (float.IsPositiveInfinity(value))
|
|
result = "INF";
|
|
else if (float.IsNegativeInfinity(value))
|
|
result = "-INF";
|
|
else if (float.IsNaN(value))
|
|
result = "NAN";
|
|
else
|
|
result = value.ToString(invariant);
|
|
|
|
return result;
|
|
}
|
|
|
|
public static string ToInvariantString(this double value)
|
|
{
|
|
string result;
|
|
|
|
if (double.IsPositiveInfinity(value))
|
|
result = "INF";
|
|
else if (double.IsNegativeInfinity(value))
|
|
result = "-INF";
|
|
else if (double.IsNaN(value))
|
|
result = "NAN";
|
|
else
|
|
result = value.ToString(invariant);
|
|
|
|
return result;
|
|
}
|
|
|
|
public static string ToInvariantString(this int value)
|
|
{
|
|
return value.ToString(invariant);
|
|
}
|
|
|
|
public static string ToInvariantString(this object value)
|
|
{
|
|
if (value is float)
|
|
{
|
|
float f = (float)value;
|
|
return f.ToInvariantString();
|
|
}
|
|
else if (value is double)
|
|
{
|
|
double d = (double)value;
|
|
return d.ToInvariantString();
|
|
}
|
|
else if (value is int)
|
|
{
|
|
int i = (int)value;
|
|
return i.ToInvariantString();
|
|
}
|
|
else
|
|
{
|
|
// Unhandled
|
|
return value.ToString();
|
|
}
|
|
}
|
|
|
|
public static float ParseFloat(string value)
|
|
{
|
|
float result;
|
|
|
|
if (value == "INF")
|
|
result = float.PositiveInfinity;
|
|
else if (value == "-INF")
|
|
result = float.NegativeInfinity;
|
|
else if (value == "NAN")
|
|
result = float.NaN;
|
|
else
|
|
result = float.Parse(value, invariant);
|
|
|
|
return result;
|
|
}
|
|
|
|
public static double ParseDouble(string value)
|
|
{
|
|
double result;
|
|
|
|
if (value == "INF")
|
|
result = double.PositiveInfinity;
|
|
else if (value == "-INF")
|
|
result = double.NegativeInfinity;
|
|
else if (value == "NAN")
|
|
result = double.NaN;
|
|
else
|
|
result = double.Parse(value, invariant);
|
|
|
|
return result;
|
|
}
|
|
|
|
public static int ParseInt(string s)
|
|
{
|
|
return int.Parse(s, invariant);
|
|
}
|
|
|
|
public static bool FuzzyEquals(this float a, float b, float epsilon = 10e-5f)
|
|
{
|
|
return Math.Abs(a - b) < epsilon;
|
|
}
|
|
|
|
public static bool FuzzyEquals(this double a, double b, double epsilon = 10e-5)
|
|
{
|
|
return Math.Abs(a - b) < epsilon;
|
|
}
|
|
} |