1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-10 13:00:37 +00:00

Merge pull request #104991 from nikitalita/fix_inf_neg

`VariantWriter::write`: fix writing negative infinity when `p_compat` is true
This commit is contained in:
Thaddeus Crews
2025-04-07 08:43:21 -05:00

View File

@@ -1934,7 +1934,7 @@ Error VariantParser::parse(Stream *p_stream, Variant &r_ret, String &r_err_str,
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
static String rtos_fix(double p_value) { static String rtos_fix(double p_value, bool p_compat) {
if (p_value == 0.0) { if (p_value == 0.0) {
return "0"; //avoid negative zero (-0) being written, which may annoy git, svn, etc. for changes when they don't exist. return "0"; //avoid negative zero (-0) being written, which may annoy git, svn, etc. for changes when they don't exist.
} else if (isnan(p_value)) { } else if (isnan(p_value)) {
@@ -1942,6 +1942,8 @@ static String rtos_fix(double p_value) {
} else if (isinf(p_value)) { } else if (isinf(p_value)) {
if (p_value > 0) { if (p_value > 0) {
return "inf"; return "inf";
} else if (p_compat) {
return "inf_neg";
} else { } else {
return "-inf"; return "-inf";
} }
@@ -1962,7 +1964,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
p_store_string_func(p_store_string_ud, itos(p_variant.operator int64_t())); p_store_string_func(p_store_string_ud, itos(p_variant.operator int64_t()));
} break; } break;
case Variant::FLOAT: { case Variant::FLOAT: {
String s = rtos_fix(p_variant.operator double()); String s = rtos_fix(p_variant.operator double(), p_compat);
if (s != "inf" && s != "-inf" && s != "nan") { if (s != "inf" && s != "-inf" && s != "nan") {
if (!s.contains_char('.') && !s.contains_char('e') && !s.contains_char('E')) { if (!s.contains_char('.') && !s.contains_char('e') && !s.contains_char('E')) {
s += ".0"; s += ".0";
@@ -1979,7 +1981,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
// Math types. // Math types.
case Variant::VECTOR2: { case Variant::VECTOR2: {
Vector2 v = p_variant; Vector2 v = p_variant;
p_store_string_func(p_store_string_ud, "Vector2(" + rtos_fix(v.x) + ", " + rtos_fix(v.y) + ")"); p_store_string_func(p_store_string_ud, "Vector2(" + rtos_fix(v.x, p_compat) + ", " + rtos_fix(v.y, p_compat) + ")");
} break; } break;
case Variant::VECTOR2I: { case Variant::VECTOR2I: {
Vector2i v = p_variant; Vector2i v = p_variant;
@@ -1987,7 +1989,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
} break; } break;
case Variant::RECT2: { case Variant::RECT2: {
Rect2 aabb = p_variant; Rect2 aabb = p_variant;
p_store_string_func(p_store_string_ud, "Rect2(" + rtos_fix(aabb.position.x) + ", " + rtos_fix(aabb.position.y) + ", " + rtos_fix(aabb.size.x) + ", " + rtos_fix(aabb.size.y) + ")"); p_store_string_func(p_store_string_ud, "Rect2(" + rtos_fix(aabb.position.x, p_compat) + ", " + rtos_fix(aabb.position.y, p_compat) + ", " + rtos_fix(aabb.size.x, p_compat) + ", " + rtos_fix(aabb.size.y, p_compat) + ")");
} break; } break;
case Variant::RECT2I: { case Variant::RECT2I: {
Rect2i aabb = p_variant; Rect2i aabb = p_variant;
@@ -1995,7 +1997,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
} break; } break;
case Variant::VECTOR3: { case Variant::VECTOR3: {
Vector3 v = p_variant; Vector3 v = p_variant;
p_store_string_func(p_store_string_ud, "Vector3(" + rtos_fix(v.x) + ", " + rtos_fix(v.y) + ", " + rtos_fix(v.z) + ")"); p_store_string_func(p_store_string_ud, "Vector3(" + rtos_fix(v.x, p_compat) + ", " + rtos_fix(v.y, p_compat) + ", " + rtos_fix(v.z, p_compat) + ")");
} break; } break;
case Variant::VECTOR3I: { case Variant::VECTOR3I: {
Vector3i v = p_variant; Vector3i v = p_variant;
@@ -2003,7 +2005,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
} break; } break;
case Variant::VECTOR4: { case Variant::VECTOR4: {
Vector4 v = p_variant; Vector4 v = p_variant;
p_store_string_func(p_store_string_ud, "Vector4(" + rtos_fix(v.x) + ", " + rtos_fix(v.y) + ", " + rtos_fix(v.z) + ", " + rtos_fix(v.w) + ")"); p_store_string_func(p_store_string_ud, "Vector4(" + rtos_fix(v.x, p_compat) + ", " + rtos_fix(v.y, p_compat) + ", " + rtos_fix(v.z, p_compat) + ", " + rtos_fix(v.w, p_compat) + ")");
} break; } break;
case Variant::VECTOR4I: { case Variant::VECTOR4I: {
Vector4i v = p_variant; Vector4i v = p_variant;
@@ -2011,15 +2013,15 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
} break; } break;
case Variant::PLANE: { case Variant::PLANE: {
Plane p = p_variant; Plane p = p_variant;
p_store_string_func(p_store_string_ud, "Plane(" + rtos_fix(p.normal.x) + ", " + rtos_fix(p.normal.y) + ", " + rtos_fix(p.normal.z) + ", " + rtos_fix(p.d) + ")"); p_store_string_func(p_store_string_ud, "Plane(" + rtos_fix(p.normal.x, p_compat) + ", " + rtos_fix(p.normal.y, p_compat) + ", " + rtos_fix(p.normal.z, p_compat) + ", " + rtos_fix(p.d, p_compat) + ")");
} break; } break;
case Variant::AABB: { case Variant::AABB: {
AABB aabb = p_variant; AABB aabb = p_variant;
p_store_string_func(p_store_string_ud, "AABB(" + rtos_fix(aabb.position.x) + ", " + rtos_fix(aabb.position.y) + ", " + rtos_fix(aabb.position.z) + ", " + rtos_fix(aabb.size.x) + ", " + rtos_fix(aabb.size.y) + ", " + rtos_fix(aabb.size.z) + ")"); p_store_string_func(p_store_string_ud, "AABB(" + rtos_fix(aabb.position.x, p_compat) + ", " + rtos_fix(aabb.position.y, p_compat) + ", " + rtos_fix(aabb.position.z, p_compat) + ", " + rtos_fix(aabb.size.x, p_compat) + ", " + rtos_fix(aabb.size.y, p_compat) + ", " + rtos_fix(aabb.size.z, p_compat) + ")");
} break; } break;
case Variant::QUATERNION: { case Variant::QUATERNION: {
Quaternion quaternion = p_variant; Quaternion quaternion = p_variant;
p_store_string_func(p_store_string_ud, "Quaternion(" + rtos_fix(quaternion.x) + ", " + rtos_fix(quaternion.y) + ", " + rtos_fix(quaternion.z) + ", " + rtos_fix(quaternion.w) + ")"); p_store_string_func(p_store_string_ud, "Quaternion(" + rtos_fix(quaternion.x, p_compat) + ", " + rtos_fix(quaternion.y, p_compat) + ", " + rtos_fix(quaternion.z, p_compat) + ", " + rtos_fix(quaternion.w, p_compat) + ")");
} break; } break;
case Variant::TRANSFORM2D: { case Variant::TRANSFORM2D: {
String s = "Transform2D("; String s = "Transform2D(";
@@ -2029,7 +2031,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
if (i != 0 || j != 0) { if (i != 0 || j != 0) {
s += ", "; s += ", ";
} }
s += rtos_fix(m3.columns[i][j]); s += rtos_fix(m3.columns[i][j], p_compat);
} }
} }
@@ -2043,7 +2045,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
if (i != 0 || j != 0) { if (i != 0 || j != 0) {
s += ", "; s += ", ";
} }
s += rtos_fix(m3.rows[i][j]); s += rtos_fix(m3.rows[i][j], p_compat);
} }
} }
@@ -2058,11 +2060,11 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
if (i != 0 || j != 0) { if (i != 0 || j != 0) {
s += ", "; s += ", ";
} }
s += rtos_fix(m3.rows[i][j]); s += rtos_fix(m3.rows[i][j], p_compat);
} }
} }
s = s + ", " + rtos_fix(t.origin.x) + ", " + rtos_fix(t.origin.y) + ", " + rtos_fix(t.origin.z); s = s + ", " + rtos_fix(t.origin.x, p_compat) + ", " + rtos_fix(t.origin.y, p_compat) + ", " + rtos_fix(t.origin.z, p_compat);
p_store_string_func(p_store_string_ud, s + ")"); p_store_string_func(p_store_string_ud, s + ")");
} break; } break;
@@ -2074,7 +2076,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
if (i != 0 || j != 0) { if (i != 0 || j != 0) {
s += ", "; s += ", ";
} }
s += rtos_fix(t.columns[i][j]); s += rtos_fix(t.columns[i][j], p_compat);
} }
} }
@@ -2084,7 +2086,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
// Misc types. // Misc types.
case Variant::COLOR: { case Variant::COLOR: {
Color c = p_variant; Color c = p_variant;
p_store_string_func(p_store_string_ud, "Color(" + rtos_fix(c.r) + ", " + rtos_fix(c.g) + ", " + rtos_fix(c.b) + ", " + rtos_fix(c.a) + ")"); p_store_string_func(p_store_string_ud, "Color(" + rtos_fix(c.r, p_compat) + ", " + rtos_fix(c.g, p_compat) + ", " + rtos_fix(c.b, p_compat) + ", " + rtos_fix(c.a, p_compat) + ")");
} break; } break;
case Variant::STRING_NAME: { case Variant::STRING_NAME: {
String str = p_variant; String str = p_variant;
@@ -2399,7 +2401,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
if (i > 0) { if (i > 0) {
p_store_string_func(p_store_string_ud, ", "); p_store_string_func(p_store_string_ud, ", ");
} }
p_store_string_func(p_store_string_ud, rtos_fix(ptr[i])); p_store_string_func(p_store_string_ud, rtos_fix(ptr[i], p_compat));
} }
p_store_string_func(p_store_string_ud, ")"); p_store_string_func(p_store_string_ud, ")");
@@ -2414,7 +2416,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
if (i > 0) { if (i > 0) {
p_store_string_func(p_store_string_ud, ", "); p_store_string_func(p_store_string_ud, ", ");
} }
p_store_string_func(p_store_string_ud, rtos_fix(ptr[i])); p_store_string_func(p_store_string_ud, rtos_fix(ptr[i], p_compat));
} }
p_store_string_func(p_store_string_ud, ")"); p_store_string_func(p_store_string_ud, ")");
@@ -2444,7 +2446,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
if (i > 0) { if (i > 0) {
p_store_string_func(p_store_string_ud, ", "); p_store_string_func(p_store_string_ud, ", ");
} }
p_store_string_func(p_store_string_ud, rtos_fix(ptr[i].x) + ", " + rtos_fix(ptr[i].y)); p_store_string_func(p_store_string_ud, rtos_fix(ptr[i].x, p_compat) + ", " + rtos_fix(ptr[i].y, p_compat));
} }
p_store_string_func(p_store_string_ud, ")"); p_store_string_func(p_store_string_ud, ")");
@@ -2459,7 +2461,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
if (i > 0) { if (i > 0) {
p_store_string_func(p_store_string_ud, ", "); p_store_string_func(p_store_string_ud, ", ");
} }
p_store_string_func(p_store_string_ud, rtos_fix(ptr[i].x) + ", " + rtos_fix(ptr[i].y) + ", " + rtos_fix(ptr[i].z)); p_store_string_func(p_store_string_ud, rtos_fix(ptr[i].x, p_compat) + ", " + rtos_fix(ptr[i].y, p_compat) + ", " + rtos_fix(ptr[i].z, p_compat));
} }
p_store_string_func(p_store_string_ud, ")"); p_store_string_func(p_store_string_ud, ")");
@@ -2474,7 +2476,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
if (i > 0) { if (i > 0) {
p_store_string_func(p_store_string_ud, ", "); p_store_string_func(p_store_string_ud, ", ");
} }
p_store_string_func(p_store_string_ud, rtos_fix(ptr[i].r) + ", " + rtos_fix(ptr[i].g) + ", " + rtos_fix(ptr[i].b) + ", " + rtos_fix(ptr[i].a)); p_store_string_func(p_store_string_ud, rtos_fix(ptr[i].r, p_compat) + ", " + rtos_fix(ptr[i].g, p_compat) + ", " + rtos_fix(ptr[i].b, p_compat) + ", " + rtos_fix(ptr[i].a, p_compat));
} }
p_store_string_func(p_store_string_ud, ")"); p_store_string_func(p_store_string_ud, ")");
@@ -2489,7 +2491,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
if (i > 0) { if (i > 0) {
p_store_string_func(p_store_string_ud, ", "); p_store_string_func(p_store_string_ud, ", ");
} }
p_store_string_func(p_store_string_ud, rtos_fix(ptr[i].x) + ", " + rtos_fix(ptr[i].y) + ", " + rtos_fix(ptr[i].z) + ", " + rtos_fix(ptr[i].w)); p_store_string_func(p_store_string_ud, rtos_fix(ptr[i].x, p_compat) + ", " + rtos_fix(ptr[i].y, p_compat) + ", " + rtos_fix(ptr[i].z, p_compat) + ", " + rtos_fix(ptr[i].w, p_compat));
} }
p_store_string_func(p_store_string_ud, ")"); p_store_string_func(p_store_string_ud, ")");