From 9e38a01acc45dca23eb031c6fa7baf0c5958dca4 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Sun, 28 Jan 2024 20:52:25 +0100
Subject: [PATCH 01/19] add units support in float, double and Float3 input
---
.../CustomEditors/Editors/DoubleEditor.cs | 5 ++
.../CustomEditors/Editors/FloatEditor.cs | 5 ++
.../CustomEditors/Editors/Vector3Editor.cs | 15 +++++
.../Elements/DoubleValueElement.cs | 10 +++
.../Elements/FloatValueElement.cs | 10 +++
Source/Editor/GUI/Input/DoubleValueBox.cs | 8 ++-
Source/Editor/GUI/Input/FloatValueBox.cs | 8 ++-
Source/Editor/Utilities/ShuntingYardParser.cs | 17 ++++-
Source/Editor/Utilities/Units.cs | 9 +++
Source/Editor/Utilities/Utils.cs | 64 ++++++++++++++++++-
.../Editor/ValueCategoryAttribute.cs | 35 ++++++++++
.../Flax.Build.Tests/Flax.Build.Tests.csproj | 2 +-
Source/Tools/Flax.Build/Flax.Build.csproj | 1 -
13 files changed, 182 insertions(+), 7 deletions(-)
create mode 100644 Source/Editor/Utilities/Units.cs
create mode 100644 Source/Engine/Scripting/Attributes/Editor/ValueCategoryAttribute.cs
diff --git a/Source/Editor/CustomEditors/Editors/DoubleEditor.cs b/Source/Editor/CustomEditors/Editors/DoubleEditor.cs
index c490046b9..0906d22af 100644
--- a/Source/Editor/CustomEditors/Editors/DoubleEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/DoubleEditor.cs
@@ -4,6 +4,7 @@ using System;
using System.Linq;
using FlaxEditor.CustomEditors.Elements;
using FlaxEngine;
+using Utils = FlaxEditor.Utilities.Utils;
namespace FlaxEditor.CustomEditors.Editors
{
@@ -25,6 +26,8 @@ namespace FlaxEditor.CustomEditors.Editors
// Try get limit attribute for value min/max range setting and slider speed
var attributes = Values.GetAttributes();
+ var categoryAttribute = attributes.FirstOrDefault(x => x is ValueCategoryAttribute);
+ var valueCategory = ((ValueCategoryAttribute)categoryAttribute)?.Category ?? Utils.ValueCategory.None;
if (attributes != null)
{
var limit = attributes.FirstOrDefault(x => x is LimitAttribute);
@@ -32,6 +35,7 @@ namespace FlaxEditor.CustomEditors.Editors
{
// Use double value editor with limit
var doubleValue = layout.DoubleValue();
+ doubleValue.SetCategory(valueCategory);
doubleValue.SetLimits((LimitAttribute)limit);
doubleValue.ValueBox.ValueChanged += OnValueChanged;
doubleValue.ValueBox.SlidingEnd += ClearToken;
@@ -43,6 +47,7 @@ namespace FlaxEditor.CustomEditors.Editors
{
// Use double value editor
var doubleValue = layout.DoubleValue();
+ doubleValue.SetCategory(valueCategory);
doubleValue.ValueBox.ValueChanged += OnValueChanged;
doubleValue.ValueBox.SlidingEnd += ClearToken;
_element = doubleValue;
diff --git a/Source/Editor/CustomEditors/Editors/FloatEditor.cs b/Source/Editor/CustomEditors/Editors/FloatEditor.cs
index 07c07030e..525541e99 100644
--- a/Source/Editor/CustomEditors/Editors/FloatEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/FloatEditor.cs
@@ -4,6 +4,7 @@ using System;
using System.Linq;
using FlaxEditor.CustomEditors.Elements;
using FlaxEngine;
+using Utils = FlaxEditor.Utilities.Utils;
namespace FlaxEditor.CustomEditors.Editors
{
@@ -30,6 +31,8 @@ namespace FlaxEditor.CustomEditors.Editors
// Try get limit attribute for value min/max range setting and slider speed
var attributes = Values.GetAttributes();
+ var categoryAttribute = attributes.FirstOrDefault(x => x is ValueCategoryAttribute);
+ var valueCategory = ((ValueCategoryAttribute)categoryAttribute)?.Category ?? Utils.ValueCategory.None;
if (attributes != null)
{
var range = attributes.FirstOrDefault(x => x is RangeAttribute);
@@ -49,6 +52,7 @@ namespace FlaxEditor.CustomEditors.Editors
// Use float value editor with limit
var floatValue = layout.FloatValue();
floatValue.SetLimits((LimitAttribute)limit);
+ floatValue.SetCategory(valueCategory);
floatValue.ValueBox.ValueChanged += OnValueChanged;
floatValue.ValueBox.SlidingEnd += ClearToken;
_element = floatValue;
@@ -59,6 +63,7 @@ namespace FlaxEditor.CustomEditors.Editors
{
// Use float value editor
var floatValue = layout.FloatValue();
+ floatValue.SetCategory(valueCategory);
floatValue.ValueBox.ValueChanged += OnValueChanged;
floatValue.ValueBox.SlidingEnd += ClearToken;
_element = floatValue;
diff --git a/Source/Editor/CustomEditors/Editors/Vector3Editor.cs b/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
index c3edd3913..9826c339f 100644
--- a/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
+++ b/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
@@ -4,6 +4,7 @@ using System.Linq;
using FlaxEditor.CustomEditors.Elements;
using FlaxEngine;
using FlaxEngine.GUI;
+using Utils = FlaxEditor.Utilities.Utils;
namespace FlaxEditor.CustomEditors.Editors
{
@@ -70,23 +71,30 @@ namespace FlaxEditor.CustomEditors.Editors
LimitAttribute limit = null;
var attributes = Values.GetAttributes();
+ var category = Utils.ValueCategory.None;
if (attributes != null)
{
limit = (LimitAttribute)attributes.FirstOrDefault(x => x is LimitAttribute);
+ var categoryAttribute = (ValueCategoryAttribute)attributes.FirstOrDefault(x => x is ValueCategoryAttribute);
+ if (categoryAttribute != null)
+ category = categoryAttribute.Category;
}
XElement = grid.FloatValue();
XElement.SetLimits(limit);
+ XElement.SetCategory(category);
XElement.ValueBox.ValueChanged += OnXValueChanged;
XElement.ValueBox.SlidingEnd += ClearToken;
YElement = grid.FloatValue();
YElement.SetLimits(limit);
+ YElement.SetCategory(category);
YElement.ValueBox.ValueChanged += OnYValueChanged;
YElement.ValueBox.SlidingEnd += ClearToken;
ZElement = grid.FloatValue();
ZElement.SetLimits(limit);
+ ZElement.SetCategory(category);
ZElement.ValueBox.ValueChanged += OnZValueChanged;
ZElement.ValueBox.SlidingEnd += ClearToken;
}
@@ -248,24 +256,31 @@ namespace FlaxEditor.CustomEditors.Editors
gridControl.SlotsVertically = 1;
LimitAttribute limit = null;
+ Utils.ValueCategory category = Utils.ValueCategory.None;
var attributes = Values.GetAttributes();
if (attributes != null)
{
limit = (LimitAttribute)attributes.FirstOrDefault(x => x is LimitAttribute);
+ var categoryAttribute = (ValueCategoryAttribute)attributes.FirstOrDefault(x => x is ValueCategoryAttribute);
+ if (categoryAttribute != null)
+ category = categoryAttribute.Category;
}
XElement = grid.DoubleValue();
XElement.SetLimits(limit);
+ XElement.SetCategory(category);
XElement.ValueBox.ValueChanged += OnValueChanged;
XElement.ValueBox.SlidingEnd += ClearToken;
YElement = grid.DoubleValue();
YElement.SetLimits(limit);
+ YElement.SetCategory(category);
YElement.ValueBox.ValueChanged += OnValueChanged;
YElement.ValueBox.SlidingEnd += ClearToken;
ZElement = grid.DoubleValue();
ZElement.SetLimits(limit);
+ ZElement.SetCategory(category);
ZElement.ValueBox.ValueChanged += OnValueChanged;
ZElement.ValueBox.SlidingEnd += ClearToken;
}
diff --git a/Source/Editor/CustomEditors/Elements/DoubleValueElement.cs b/Source/Editor/CustomEditors/Elements/DoubleValueElement.cs
index 07af5e991..460a344ff 100644
--- a/Source/Editor/CustomEditors/Elements/DoubleValueElement.cs
+++ b/Source/Editor/CustomEditors/Elements/DoubleValueElement.cs
@@ -5,6 +5,7 @@ using System.Reflection;
using FlaxEditor.GUI.Input;
using FlaxEngine;
using FlaxEngine.GUI;
+using Utils = FlaxEditor.Utilities.Utils;
namespace FlaxEditor.CustomEditors.Elements
{
@@ -51,6 +52,15 @@ namespace FlaxEditor.CustomEditors.Elements
}
}
+ ///
+ /// Set the value category of this float element
+ ///
+ ///
+ public void SetCategory(Utils.ValueCategory category)
+ {
+ ValueBox.Category = category;
+ }
+
///
/// Sets the editor limits from member .
///
diff --git a/Source/Editor/CustomEditors/Elements/FloatValueElement.cs b/Source/Editor/CustomEditors/Elements/FloatValueElement.cs
index 789d8966e..413a341c1 100644
--- a/Source/Editor/CustomEditors/Elements/FloatValueElement.cs
+++ b/Source/Editor/CustomEditors/Elements/FloatValueElement.cs
@@ -5,6 +5,7 @@ using System.Reflection;
using FlaxEditor.GUI.Input;
using FlaxEngine;
using FlaxEngine.GUI;
+using Utils = FlaxEditor.Utilities.Utils;
namespace FlaxEditor.CustomEditors.Elements
{
@@ -51,6 +52,15 @@ namespace FlaxEditor.CustomEditors.Elements
}
}
+ ///
+ /// Set the value category of this float element
+ ///
+ ///
+ public void SetCategory(Utils.ValueCategory category)
+ {
+ ValueBox.Category = category;
+ }
+
///
/// Sets the editor limits from member .
///
diff --git a/Source/Editor/GUI/Input/DoubleValueBox.cs b/Source/Editor/GUI/Input/DoubleValueBox.cs
index 0ceb10114..46e6402cb 100644
--- a/Source/Editor/GUI/Input/DoubleValueBox.cs
+++ b/Source/Editor/GUI/Input/DoubleValueBox.cs
@@ -3,6 +3,7 @@
using System;
using FlaxEditor.Utilities;
using FlaxEngine;
+using Utils = FlaxEditor.Utilities.Utils;
namespace FlaxEditor.GUI.Input
{
@@ -129,10 +130,15 @@ namespace FlaxEditor.GUI.Input
Value = Value;
}
+ ///
+ /// Get or set the category of the value. This can either be none for just a number, a distance or an angle.
+ ///
+ public Utils.ValueCategory Category = Utils.ValueCategory.None;
+
///
protected sealed override void UpdateText()
{
- SetText(Utilities.Utils.FormatFloat(_value));
+ SetText(Utilities.Utils.FormatFloat(_value, Category));
}
///
diff --git a/Source/Editor/GUI/Input/FloatValueBox.cs b/Source/Editor/GUI/Input/FloatValueBox.cs
index cdb3b08b1..64ea000fa 100644
--- a/Source/Editor/GUI/Input/FloatValueBox.cs
+++ b/Source/Editor/GUI/Input/FloatValueBox.cs
@@ -4,6 +4,7 @@ using System;
using System.Globalization;
using FlaxEditor.Utilities;
using FlaxEngine;
+using Utils = FlaxEditor.Utilities.Utils;
namespace FlaxEditor.GUI.Input
{
@@ -137,10 +138,15 @@ namespace FlaxEditor.GUI.Input
Value = Value;
}
+ ///
+ /// Get or set the category of the value. This can either be none for just a number, a distance or an angle.
+ ///
+ public Utils.ValueCategory Category = Utils.ValueCategory.None;
+
///
protected sealed override void UpdateText()
{
- SetText(Utilities.Utils.FormatFloat(_value));
+ SetText(Utilities.Utils.FormatFloat(_value, Category));
}
///
diff --git a/Source/Editor/Utilities/ShuntingYardParser.cs b/Source/Editor/Utilities/ShuntingYardParser.cs
index d139b003a..e7c5b5298 100644
--- a/Source/Editor/Utilities/ShuntingYardParser.cs
+++ b/Source/Editor/Utilities/ShuntingYardParser.cs
@@ -121,6 +121,9 @@ namespace FlaxEditor.Utilities
["e"] = Math.E,
["infinity"] = double.MaxValue,
["-infinity"] = -double.MaxValue,
+ ["m"] = Units.Meters2Units,
+ ["cm"] = Units.Meters2Units / 100,
+ ["km"] = Units.Meters2Units * 1000
};
///
@@ -170,7 +173,7 @@ namespace FlaxEditor.Utilities
public static IEnumerable Tokenize(string text)
{
// Prepare text
- text = text.Replace(',', '.');
+ text = text.Replace(',', '.').Replace("°", "");
// Necessary to correctly parse negative numbers
var previous = TokenType.WhiteSpace;
@@ -372,6 +375,18 @@ namespace FlaxEditor.Utilities
}
}
+ // if stack has more than one item we're not finished with evaluating
+ // we assume the remaining values are all factors to be multiplied
+ if (stack.Count > 1)
+ {
+ var stackContent = string.Join(",", stack.ToList());
+ Debug.Log($"parsing numbers, stack is {stackContent}");
+ var v1 = stack.Pop();
+ Debug.Log($"first on stack: {v1}");
+ while (stack.Count > 0)
+ v1 *= stack.Pop();
+ return v1;
+ }
return stack.Pop();
}
diff --git a/Source/Editor/Utilities/Units.cs b/Source/Editor/Utilities/Units.cs
new file mode 100644
index 000000000..00d53a463
--- /dev/null
+++ b/Source/Editor/Utilities/Units.cs
@@ -0,0 +1,9 @@
+namespace FlaxEditor.Utilities;
+
+public class Units
+{
+ ///
+ /// Factor of units per meter.
+ ///
+ public static readonly float Meters2Units = 100f;
+}
diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs
index 3d790ff81..0df4fe573 100644
--- a/Source/Editor/Utilities/Utils.cs
+++ b/Source/Editor/Utilities/Utils.cs
@@ -58,6 +58,16 @@ namespace FlaxEditor.Utilities
///
public static readonly string FlaxEngineAssemblyName = "FlaxEngine.CSharp";
+ ///
+ /// A category of number values used for formatting and input boxes
+ ///
+ public enum ValueCategory
+ {
+ None,
+ Distance,
+ Angle
+ }
+
///
/// Tries to parse number in the name brackets at the end of the value and then increment it to create a new name.
/// Supports numbers at the end without brackets.
@@ -1171,6 +1181,56 @@ namespace FlaxEditor.Utilities
return StringUtils.GetPathWithoutExtension(path);
}
+ ///
+ /// Format a float value either as-is, with a distance unit or with a degree sign
+ ///
+ /// the value to format
+ /// the value type: none means just a number, distance will format in cm/m/km, angle with an appended degree sign
+ /// the formatted string
+ public static string FormatFloat(float value, ValueCategory category)
+ {
+ switch (category)
+ {
+ case ValueCategory.Distance:
+ var absValue = Mathf.Abs(value);
+ // in case a unit != cm this would be (value / Maters2Units * 100)
+ if (absValue < Units.Meters2Units)
+ return value.ToString("g7", CultureInfo.InvariantCulture) + "cm";
+ if (absValue < Units.Meters2Units * 1000)
+ return (value / Units.Meters2Units).ToString("g7", CultureInfo.InvariantCulture) + "m";
+ return (value / 1000 / Units.Meters2Units).ToString("g7", CultureInfo.InvariantCulture) + "km";
+ case ValueCategory.Angle: return value.ToString("g7", CultureInfo.InvariantCulture) + "°";
+ case ValueCategory.None:
+ default:
+ return FormatFloat(value);
+ }
+ }
+
+ ///
+ /// Format a double value either as-is, with a distance unit or with a degree sign
+ ///
+ /// the value to format
+ /// the value type: none means just a number, distance will format in cm/m/km, angle with an appended degree sign
+ /// the formatted string
+ public static string FormatFloat(double value, ValueCategory category)
+ {
+ switch (category)
+ {
+ case ValueCategory.Distance:
+ var absValue = Mathf.Abs(value);
+ // in case a unit != cm this would be (value / Maters2Units * 100)
+ if (absValue < Units.Meters2Units)
+ return value.ToString("g17", CultureInfo.InvariantCulture) + "cm";
+ if (absValue < Units.Meters2Units * 1000)
+ return (value / Units.Meters2Units).ToString("g17", CultureInfo.InvariantCulture) + "m";
+ return (value / 1000 / Units.Meters2Units).ToString("g17", CultureInfo.InvariantCulture) + "km";
+ case ValueCategory.Angle: return value.ToString("g17", CultureInfo.InvariantCulture) + "°";
+ case ValueCategory.None:
+ default:
+ return FormatFloat(value);
+ }
+ }
+
///
/// Formats the floating point value (double precision) into the readable text representation.
///
@@ -1182,7 +1242,7 @@ namespace FlaxEditor.Utilities
return "Infinity";
if (float.IsNegativeInfinity(value) || value == float.MinValue)
return "-Infinity";
- string str = value.ToString("r", CultureInfo.InvariantCulture);
+ string str = value.ToString("g7", CultureInfo.InvariantCulture);
return FormatFloat(str, value < 0);
}
@@ -1197,7 +1257,7 @@ namespace FlaxEditor.Utilities
return "Infinity";
if (double.IsNegativeInfinity(value) || value == double.MinValue)
return "-Infinity";
- string str = value.ToString("r", CultureInfo.InvariantCulture);
+ string str = value.ToString("g17", CultureInfo.InvariantCulture);
return FormatFloat(str, value < 0);
}
diff --git a/Source/Engine/Scripting/Attributes/Editor/ValueCategoryAttribute.cs b/Source/Engine/Scripting/Attributes/Editor/ValueCategoryAttribute.cs
new file mode 100644
index 000000000..3c6da2286
--- /dev/null
+++ b/Source/Engine/Scripting/Attributes/Editor/ValueCategoryAttribute.cs
@@ -0,0 +1,35 @@
+// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
+
+using System;
+
+namespace FlaxEngine
+{
+ ///
+ /// Used to specify the value category of a numeric value as either as-is (a scalar), a distance (formatted as cm/m/km)
+ /// or an angle (formatted with a degree sign).
+ ///
+ ///
+ [Serializable]
+ [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
+ public sealed class ValueCategoryAttribute : Attribute
+ {
+ ///
+ /// The value category used for formatting.
+ ///
+ public FlaxEditor.Utilities.Utils.ValueCategory Category;
+
+ private ValueCategoryAttribute()
+ {
+ Category = FlaxEditor.Utilities.Utils.ValueCategory.None;
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The value category.
+ public ValueCategoryAttribute(FlaxEditor.Utilities.Utils.ValueCategory category)
+ {
+ Category = category;
+ }
+ }
+}
diff --git a/Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj b/Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj
index df3b9851b..78b23ec07 100644
--- a/Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj
+++ b/Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj
@@ -2,7 +2,7 @@
net7.0
- 11.0
+ 12
disable
annotations
true
diff --git a/Source/Tools/Flax.Build/Flax.Build.csproj b/Source/Tools/Flax.Build/Flax.Build.csproj
index 1837bf0ec..7b189ce56 100644
--- a/Source/Tools/Flax.Build/Flax.Build.csproj
+++ b/Source/Tools/Flax.Build/Flax.Build.csproj
@@ -2,7 +2,6 @@
Exe
net7.0
- 11.0
disable
annotations
false
From d28b0ab2a6d354336d6178b92e849f5950b880bb Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Sun, 28 Jan 2024 21:41:08 +0100
Subject: [PATCH 02/19] revert unrelated change in .csproj
---
Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj | 2 +-
Source/Tools/Flax.Build/Flax.Build.csproj | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj b/Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj
index 78b23ec07..df3b9851b 100644
--- a/Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj
+++ b/Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj
@@ -2,7 +2,7 @@
net7.0
- 12
+ 11.0
disable
annotations
true
diff --git a/Source/Tools/Flax.Build/Flax.Build.csproj b/Source/Tools/Flax.Build/Flax.Build.csproj
index 7b189ce56..1837bf0ec 100644
--- a/Source/Tools/Flax.Build/Flax.Build.csproj
+++ b/Source/Tools/Flax.Build/Flax.Build.csproj
@@ -2,6 +2,7 @@
Exe
net7.0
+ 11.0
disable
annotations
false
From 2625144945e42da581a2285a1d81e280bb3561b5 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Sun, 28 Jan 2024 23:28:35 +0100
Subject: [PATCH 03/19] rename attribute and fix parsing
---
.../CustomEditors/Editors/DoubleEditor.cs | 6 ++---
.../CustomEditors/Editors/FloatEditor.cs | 6 ++---
.../CustomEditors/Editors/Vector3Editor.cs | 6 ++---
.../Elements/DoubleValueElement.cs | 2 +-
.../Elements/FloatValueElement.cs | 2 +-
Source/Editor/GUI/Input/DoubleValueBox.cs | 2 +-
Source/Editor/GUI/Input/FloatValueBox.cs | 2 +-
Source/Editor/Utilities/ShuntingYardParser.cs | 8 +++---
Source/Editor/Utilities/Utils.cs | 26 ++++++-------------
...ttribute.cs => NumberCategoryAttribute.cs} | 12 ++++-----
Source/Engine/Utilities/Utils.cs | 10 +++++++
11 files changed, 42 insertions(+), 40 deletions(-)
rename Source/Engine/Scripting/Attributes/Editor/{ValueCategoryAttribute.cs => NumberCategoryAttribute.cs} (64%)
diff --git a/Source/Editor/CustomEditors/Editors/DoubleEditor.cs b/Source/Editor/CustomEditors/Editors/DoubleEditor.cs
index 0906d22af..a428fd448 100644
--- a/Source/Editor/CustomEditors/Editors/DoubleEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/DoubleEditor.cs
@@ -4,7 +4,7 @@ using System;
using System.Linq;
using FlaxEditor.CustomEditors.Elements;
using FlaxEngine;
-using Utils = FlaxEditor.Utilities.Utils;
+using Utils = FlaxEngine.Utils;
namespace FlaxEditor.CustomEditors.Editors
{
@@ -26,8 +26,8 @@ namespace FlaxEditor.CustomEditors.Editors
// Try get limit attribute for value min/max range setting and slider speed
var attributes = Values.GetAttributes();
- var categoryAttribute = attributes.FirstOrDefault(x => x is ValueCategoryAttribute);
- var valueCategory = ((ValueCategoryAttribute)categoryAttribute)?.Category ?? Utils.ValueCategory.None;
+ var categoryAttribute = attributes.FirstOrDefault(x => x is NumberCategoryAttribute);
+ var valueCategory = ((NumberCategoryAttribute)categoryAttribute)?.Category ?? Utils.ValueCategory.None;
if (attributes != null)
{
var limit = attributes.FirstOrDefault(x => x is LimitAttribute);
diff --git a/Source/Editor/CustomEditors/Editors/FloatEditor.cs b/Source/Editor/CustomEditors/Editors/FloatEditor.cs
index 525541e99..c739269ab 100644
--- a/Source/Editor/CustomEditors/Editors/FloatEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/FloatEditor.cs
@@ -4,7 +4,7 @@ using System;
using System.Linq;
using FlaxEditor.CustomEditors.Elements;
using FlaxEngine;
-using Utils = FlaxEditor.Utilities.Utils;
+using Utils = FlaxEngine.Utils;
namespace FlaxEditor.CustomEditors.Editors
{
@@ -31,8 +31,8 @@ namespace FlaxEditor.CustomEditors.Editors
// Try get limit attribute for value min/max range setting and slider speed
var attributes = Values.GetAttributes();
- var categoryAttribute = attributes.FirstOrDefault(x => x is ValueCategoryAttribute);
- var valueCategory = ((ValueCategoryAttribute)categoryAttribute)?.Category ?? Utils.ValueCategory.None;
+ var categoryAttribute = attributes.FirstOrDefault(x => x is NumberCategoryAttribute);
+ var valueCategory = ((NumberCategoryAttribute)categoryAttribute)?.Category ?? Utils.ValueCategory.None;
if (attributes != null)
{
var range = attributes.FirstOrDefault(x => x is RangeAttribute);
diff --git a/Source/Editor/CustomEditors/Editors/Vector3Editor.cs b/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
index 9826c339f..fe3ff2b74 100644
--- a/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
+++ b/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
@@ -4,7 +4,7 @@ using System.Linq;
using FlaxEditor.CustomEditors.Elements;
using FlaxEngine;
using FlaxEngine.GUI;
-using Utils = FlaxEditor.Utilities.Utils;
+using Utils = FlaxEngine.Utils;
namespace FlaxEditor.CustomEditors.Editors
{
@@ -75,7 +75,7 @@ namespace FlaxEditor.CustomEditors.Editors
if (attributes != null)
{
limit = (LimitAttribute)attributes.FirstOrDefault(x => x is LimitAttribute);
- var categoryAttribute = (ValueCategoryAttribute)attributes.FirstOrDefault(x => x is ValueCategoryAttribute);
+ var categoryAttribute = (NumberCategoryAttribute)attributes.FirstOrDefault(x => x is NumberCategoryAttribute);
if (categoryAttribute != null)
category = categoryAttribute.Category;
}
@@ -261,7 +261,7 @@ namespace FlaxEditor.CustomEditors.Editors
if (attributes != null)
{
limit = (LimitAttribute)attributes.FirstOrDefault(x => x is LimitAttribute);
- var categoryAttribute = (ValueCategoryAttribute)attributes.FirstOrDefault(x => x is ValueCategoryAttribute);
+ var categoryAttribute = (NumberCategoryAttribute)attributes.FirstOrDefault(x => x is NumberCategoryAttribute);
if (categoryAttribute != null)
category = categoryAttribute.Category;
}
diff --git a/Source/Editor/CustomEditors/Elements/DoubleValueElement.cs b/Source/Editor/CustomEditors/Elements/DoubleValueElement.cs
index 460a344ff..4f121204f 100644
--- a/Source/Editor/CustomEditors/Elements/DoubleValueElement.cs
+++ b/Source/Editor/CustomEditors/Elements/DoubleValueElement.cs
@@ -5,7 +5,7 @@ using System.Reflection;
using FlaxEditor.GUI.Input;
using FlaxEngine;
using FlaxEngine.GUI;
-using Utils = FlaxEditor.Utilities.Utils;
+using Utils = FlaxEngine.Utils;
namespace FlaxEditor.CustomEditors.Elements
{
diff --git a/Source/Editor/CustomEditors/Elements/FloatValueElement.cs b/Source/Editor/CustomEditors/Elements/FloatValueElement.cs
index 413a341c1..9661e391d 100644
--- a/Source/Editor/CustomEditors/Elements/FloatValueElement.cs
+++ b/Source/Editor/CustomEditors/Elements/FloatValueElement.cs
@@ -5,7 +5,7 @@ using System.Reflection;
using FlaxEditor.GUI.Input;
using FlaxEngine;
using FlaxEngine.GUI;
-using Utils = FlaxEditor.Utilities.Utils;
+using Utils = FlaxEngine.Utils;
namespace FlaxEditor.CustomEditors.Elements
{
diff --git a/Source/Editor/GUI/Input/DoubleValueBox.cs b/Source/Editor/GUI/Input/DoubleValueBox.cs
index 46e6402cb..d7c4950f6 100644
--- a/Source/Editor/GUI/Input/DoubleValueBox.cs
+++ b/Source/Editor/GUI/Input/DoubleValueBox.cs
@@ -3,7 +3,7 @@
using System;
using FlaxEditor.Utilities;
using FlaxEngine;
-using Utils = FlaxEditor.Utilities.Utils;
+using Utils = FlaxEngine.Utils;
namespace FlaxEditor.GUI.Input
{
diff --git a/Source/Editor/GUI/Input/FloatValueBox.cs b/Source/Editor/GUI/Input/FloatValueBox.cs
index 64ea000fa..2fccba8e8 100644
--- a/Source/Editor/GUI/Input/FloatValueBox.cs
+++ b/Source/Editor/GUI/Input/FloatValueBox.cs
@@ -4,7 +4,7 @@ using System;
using System.Globalization;
using FlaxEditor.Utilities;
using FlaxEngine;
-using Utils = FlaxEditor.Utilities.Utils;
+using Utils = FlaxEngine.Utils;
namespace FlaxEditor.GUI.Input
{
diff --git a/Source/Editor/Utilities/ShuntingYardParser.cs b/Source/Editor/Utilities/ShuntingYardParser.cs
index e7c5b5298..f8fa05e5b 100644
--- a/Source/Editor/Utilities/ShuntingYardParser.cs
+++ b/Source/Editor/Utilities/ShuntingYardParser.cs
@@ -243,6 +243,11 @@ namespace FlaxEditor.Utilities
}
else if (type == TokenType.Variable)
{
+ if (previous == TokenType.Number)
+ {
+ previous = TokenType.Operator;
+ yield return new Token(TokenType.Operator, "*");
+ }
// Continue till the end of the variable
while (i + 1 < text.Length && DetermineType(text[i + 1]) == TokenType.Variable)
{
@@ -379,10 +384,7 @@ namespace FlaxEditor.Utilities
// we assume the remaining values are all factors to be multiplied
if (stack.Count > 1)
{
- var stackContent = string.Join(",", stack.ToList());
- Debug.Log($"parsing numbers, stack is {stackContent}");
var v1 = stack.Pop();
- Debug.Log($"first on stack: {v1}");
while (stack.Count > 0)
v1 *= stack.Pop();
return v1;
diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs
index 0df4fe573..d1db68046 100644
--- a/Source/Editor/Utilities/Utils.cs
+++ b/Source/Editor/Utilities/Utils.cs
@@ -58,16 +58,6 @@ namespace FlaxEditor.Utilities
///
public static readonly string FlaxEngineAssemblyName = "FlaxEngine.CSharp";
- ///
- /// A category of number values used for formatting and input boxes
- ///
- public enum ValueCategory
- {
- None,
- Distance,
- Angle
- }
-
///
/// Tries to parse number in the name brackets at the end of the value and then increment it to create a new name.
/// Supports numbers at the end without brackets.
@@ -1187,11 +1177,11 @@ namespace FlaxEditor.Utilities
/// the value to format
/// the value type: none means just a number, distance will format in cm/m/km, angle with an appended degree sign
/// the formatted string
- public static string FormatFloat(float value, ValueCategory category)
+ public static string FormatFloat(float value, FlaxEngine.Utils.ValueCategory category)
{
switch (category)
{
- case ValueCategory.Distance:
+ case FlaxEngine.Utils.ValueCategory.Distance:
var absValue = Mathf.Abs(value);
// in case a unit != cm this would be (value / Maters2Units * 100)
if (absValue < Units.Meters2Units)
@@ -1199,8 +1189,8 @@ namespace FlaxEditor.Utilities
if (absValue < Units.Meters2Units * 1000)
return (value / Units.Meters2Units).ToString("g7", CultureInfo.InvariantCulture) + "m";
return (value / 1000 / Units.Meters2Units).ToString("g7", CultureInfo.InvariantCulture) + "km";
- case ValueCategory.Angle: return value.ToString("g7", CultureInfo.InvariantCulture) + "°";
- case ValueCategory.None:
+ case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString("g7", CultureInfo.InvariantCulture) + "°";
+ case FlaxEngine.Utils.ValueCategory.None:
default:
return FormatFloat(value);
}
@@ -1212,11 +1202,11 @@ namespace FlaxEditor.Utilities
/// the value to format
/// the value type: none means just a number, distance will format in cm/m/km, angle with an appended degree sign
/// the formatted string
- public static string FormatFloat(double value, ValueCategory category)
+ public static string FormatFloat(double value, FlaxEngine.Utils.ValueCategory category)
{
switch (category)
{
- case ValueCategory.Distance:
+ case FlaxEngine.Utils.ValueCategory.Distance:
var absValue = Mathf.Abs(value);
// in case a unit != cm this would be (value / Maters2Units * 100)
if (absValue < Units.Meters2Units)
@@ -1224,8 +1214,8 @@ namespace FlaxEditor.Utilities
if (absValue < Units.Meters2Units * 1000)
return (value / Units.Meters2Units).ToString("g17", CultureInfo.InvariantCulture) + "m";
return (value / 1000 / Units.Meters2Units).ToString("g17", CultureInfo.InvariantCulture) + "km";
- case ValueCategory.Angle: return value.ToString("g17", CultureInfo.InvariantCulture) + "°";
- case ValueCategory.None:
+ case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString("g17", CultureInfo.InvariantCulture) + "°";
+ case FlaxEngine.Utils.ValueCategory.None:
default:
return FormatFloat(value);
}
diff --git a/Source/Engine/Scripting/Attributes/Editor/ValueCategoryAttribute.cs b/Source/Engine/Scripting/Attributes/Editor/NumberCategoryAttribute.cs
similarity index 64%
rename from Source/Engine/Scripting/Attributes/Editor/ValueCategoryAttribute.cs
rename to Source/Engine/Scripting/Attributes/Editor/NumberCategoryAttribute.cs
index 3c6da2286..6b5726bb1 100644
--- a/Source/Engine/Scripting/Attributes/Editor/ValueCategoryAttribute.cs
+++ b/Source/Engine/Scripting/Attributes/Editor/NumberCategoryAttribute.cs
@@ -11,23 +11,23 @@ namespace FlaxEngine
///
[Serializable]
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
- public sealed class ValueCategoryAttribute : Attribute
+ public sealed class NumberCategoryAttribute : Attribute
{
///
/// The value category used for formatting.
///
- public FlaxEditor.Utilities.Utils.ValueCategory Category;
+ public Utils.ValueCategory Category;
- private ValueCategoryAttribute()
+ private NumberCategoryAttribute()
{
- Category = FlaxEditor.Utilities.Utils.ValueCategory.None;
+ Category = Utils.ValueCategory.None;
}
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The value category.
- public ValueCategoryAttribute(FlaxEditor.Utilities.Utils.ValueCategory category)
+ public NumberCategoryAttribute(Utils.ValueCategory category)
{
Category = category;
}
diff --git a/Source/Engine/Utilities/Utils.cs b/Source/Engine/Utilities/Utils.cs
index cb385efcf..195bacf96 100644
--- a/Source/Engine/Utilities/Utils.cs
+++ b/Source/Engine/Utilities/Utils.cs
@@ -1038,5 +1038,15 @@ namespace FlaxEngine
parameterTypes = Array.Empty();
return parameterTypes;
}
+
+ ///
+ /// A category of number values used for formatting and input boxes
+ ///
+ public enum ValueCategory
+ {
+ None,
+ Distance,
+ Angle
+ }
}
}
From 20dbe1565198b8241a81451a4472232364f067d2 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Sun, 28 Jan 2024 23:52:52 +0100
Subject: [PATCH 04/19] add configuration options
---
Source/Editor/Utilities/Units.cs | 12 ++++++++++++
Source/Editor/Utilities/Utils.cs | 8 ++++++++
2 files changed, 20 insertions(+)
diff --git a/Source/Editor/Utilities/Units.cs b/Source/Editor/Utilities/Units.cs
index 00d53a463..1256ccd63 100644
--- a/Source/Editor/Utilities/Units.cs
+++ b/Source/Editor/Utilities/Units.cs
@@ -6,4 +6,16 @@ public class Units
/// Factor of units per meter.
///
public static readonly float Meters2Units = 100f;
+
+ // the next two bools could be cached values in the user preferences
+
+ ///
+ /// Set it to false to always show game units without any postfix
+ ///
+ public static bool UseUnitsFormatting = true;
+
+ ///
+ /// If set to true, the distance unit is chosen on the magnitude, otherwise it's meters
+ ///
+ public static bool AutomaticUnitsFormatting = true;
}
diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs
index d1db68046..c5e418ae2 100644
--- a/Source/Editor/Utilities/Utils.cs
+++ b/Source/Editor/Utilities/Utils.cs
@@ -1179,9 +1179,13 @@ namespace FlaxEditor.Utilities
/// the formatted string
public static string FormatFloat(float value, FlaxEngine.Utils.ValueCategory category)
{
+ if (!Units.UseUnitsFormatting)
+ return FormatFloat(value);
switch (category)
{
case FlaxEngine.Utils.ValueCategory.Distance:
+ if (!Units.AutomaticUnitsFormatting)
+ return (value / Units.Meters2Units).ToString("g7", CultureInfo.InvariantCulture) + "m";
var absValue = Mathf.Abs(value);
// in case a unit != cm this would be (value / Maters2Units * 100)
if (absValue < Units.Meters2Units)
@@ -1204,9 +1208,13 @@ namespace FlaxEditor.Utilities
/// the formatted string
public static string FormatFloat(double value, FlaxEngine.Utils.ValueCategory category)
{
+ if (!Units.UseUnitsFormatting)
+ return FormatFloat(value);
switch (category)
{
case FlaxEngine.Utils.ValueCategory.Distance:
+ if (!Units.AutomaticUnitsFormatting)
+ return (value / Units.Meters2Units).ToString("g17", CultureInfo.InvariantCulture) + "m";
var absValue = Mathf.Abs(value);
// in case a unit != cm this would be (value / Maters2Units * 100)
if (absValue < Units.Meters2Units)
From ef41ad6074a9e157496b2be3d46e0c195668ddc3 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Mon, 29 Jan 2024 07:34:58 +0100
Subject: [PATCH 05/19] add units to transform editor, some collider values
---
Source/Editor/CustomEditors/Editors/ActorTransformEditor.cs | 6 ++++++
Source/Engine/Physics/Colliders/Collider.h | 4 ++--
Source/Engine/Physics/Colliders/SphereCollider.h | 2 +-
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/Source/Editor/CustomEditors/Editors/ActorTransformEditor.cs b/Source/Editor/CustomEditors/Editors/ActorTransformEditor.cs
index 4c153e759..a33163aab 100644
--- a/Source/Editor/CustomEditors/Editors/ActorTransformEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/ActorTransformEditor.cs
@@ -42,10 +42,13 @@ namespace FlaxEditor.CustomEditors.Editors
var grayOutFactor = 0.6f;
XElement.ValueBox.BorderColor = Color.Lerp(AxisColorX, back, grayOutFactor);
XElement.ValueBox.BorderSelectedColor = AxisColorX;
+ XElement.ValueBox.Category = Utils.ValueCategory.Distance;
YElement.ValueBox.BorderColor = Color.Lerp(AxisColorY, back, grayOutFactor);
YElement.ValueBox.BorderSelectedColor = AxisColorY;
+ YElement.ValueBox.Category = Utils.ValueCategory.Distance;
ZElement.ValueBox.BorderColor = Color.Lerp(AxisColorZ, back, grayOutFactor);
ZElement.ValueBox.BorderSelectedColor = AxisColorZ;
+ ZElement.ValueBox.Category = Utils.ValueCategory.Distance;
}
}
@@ -65,10 +68,13 @@ namespace FlaxEditor.CustomEditors.Editors
var grayOutFactor = 0.6f;
XElement.ValueBox.BorderColor = Color.Lerp(AxisColorX, back, grayOutFactor);
XElement.ValueBox.BorderSelectedColor = AxisColorX;
+ XElement.ValueBox.Category = Utils.ValueCategory.Angle;
YElement.ValueBox.BorderColor = Color.Lerp(AxisColorY, back, grayOutFactor);
YElement.ValueBox.BorderSelectedColor = AxisColorY;
+ YElement.ValueBox.Category = Utils.ValueCategory.Angle;
ZElement.ValueBox.BorderColor = Color.Lerp(AxisColorZ, back, grayOutFactor);
ZElement.ValueBox.BorderSelectedColor = AxisColorZ;
+ ZElement.ValueBox.Category = Utils.ValueCategory.Angle;
}
}
diff --git a/Source/Engine/Physics/Colliders/Collider.h b/Source/Engine/Physics/Colliders/Collider.h
index bd17aa27a..e5a873b77 100644
--- a/Source/Engine/Physics/Colliders/Collider.h
+++ b/Source/Engine/Physics/Colliders/Collider.h
@@ -52,7 +52,7 @@ public:
///
/// Gets the center of the collider, measured in the object's local space.
///
- API_PROPERTY(Attributes="EditorOrder(10), DefaultValue(typeof(Vector3), \"0,0,0\"), EditorDisplay(\"Collider\")")
+ API_PROPERTY(Attributes="EditorOrder(10), DefaultValue(typeof(Vector3), \"0,0,0\"), EditorDisplay(\"Collider\"), NumberCategory(Utils.ValueCategory.Distance)")
FORCE_INLINE Vector3 GetCenter() const
{
return _center;
@@ -66,7 +66,7 @@ public:
///
/// Gets the contact offset. Colliders whose distance is less than the sum of their ContactOffset values will generate contacts. The contact offset must be positive. Contact offset allows the collision detection system to predictively enforce the contact constraint even when the objects are slightly separated.
///
- API_PROPERTY(Attributes="EditorOrder(1), DefaultValue(2.0f), Limit(0, 100), EditorDisplay(\"Collider\")")
+ API_PROPERTY(Attributes="EditorOrder(1), DefaultValue(2.0f), Limit(0, 100), EditorDisplay(\"Collider\"), NumberCategory(Utils.ValueCategory.Distance)")
FORCE_INLINE float GetContactOffset() const
{
return _contactOffset;
diff --git a/Source/Engine/Physics/Colliders/SphereCollider.h b/Source/Engine/Physics/Colliders/SphereCollider.h
index 061372af4..6adaf76ba 100644
--- a/Source/Engine/Physics/Colliders/SphereCollider.h
+++ b/Source/Engine/Physics/Colliders/SphereCollider.h
@@ -21,7 +21,7 @@ public:
/// Gets the radius of the sphere, measured in the object's local space.
///
/// The sphere radius will be scaled by the actor's world scale.
- API_PROPERTY(Attributes="EditorOrder(100), DefaultValue(50.0f), EditorDisplay(\"Collider\")")
+ API_PROPERTY(Attributes="EditorOrder(100), DefaultValue(50.0f), EditorDisplay(\"Collider\"), NumberCategory(Utils.ValueCategory.Distance)")
FORCE_INLINE float GetRadius() const
{
return _radius;
From a0741dd9de409a1090e216623072a077952d7d19 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Mon, 29 Jan 2024 08:24:55 +0100
Subject: [PATCH 06/19] units for quaternion, transform and more collider
values
---
.../Editor/CustomEditors/Editors/QuaternionEditor.cs | 3 +++
Source/Engine/Core/Math/Transform.h | 4 ++--
Source/Engine/Physics/Colliders/BoxCollider.h | 2 +-
Source/Engine/Physics/Colliders/CapsuleCollider.h | 4 ++--
Source/Engine/Physics/Colliders/CharacterController.h | 10 +++++-----
5 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/Source/Editor/CustomEditors/Editors/QuaternionEditor.cs b/Source/Editor/CustomEditors/Editors/QuaternionEditor.cs
index 3a469dd1a..1e41264d0 100644
--- a/Source/Editor/CustomEditors/Editors/QuaternionEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/QuaternionEditor.cs
@@ -45,14 +45,17 @@ namespace FlaxEditor.CustomEditors.Editors
gridControl.SlotsVertically = 1;
XElement = grid.FloatValue();
+ XElement.ValueBox.Category = Utils.ValueCategory.Angle;
XElement.ValueBox.ValueChanged += OnValueChanged;
XElement.ValueBox.SlidingEnd += ClearToken;
YElement = grid.FloatValue();
+ YElement.ValueBox.Category = Utils.ValueCategory.Angle;
YElement.ValueBox.ValueChanged += OnValueChanged;
YElement.ValueBox.SlidingEnd += ClearToken;
ZElement = grid.FloatValue();
+ ZElement.ValueBox.Category = Utils.ValueCategory.Angle;
ZElement.ValueBox.ValueChanged += OnValueChanged;
ZElement.ValueBox.SlidingEnd += ClearToken;
diff --git a/Source/Engine/Core/Math/Transform.h b/Source/Engine/Core/Math/Transform.h
index 1079b4c23..46b3168c4 100644
--- a/Source/Engine/Core/Math/Transform.h
+++ b/Source/Engine/Core/Math/Transform.h
@@ -18,12 +18,12 @@ API_STRUCT() struct FLAXENGINE_API Transform
///
/// The translation vector of the transform.
///
- API_FIELD(Attributes="EditorOrder(10), EditorDisplay(null, \"Position\")") Vector3 Translation;
+ API_FIELD(Attributes="EditorOrder(10), EditorDisplay(null, \"Position\"), NumberCategory(Utils.ValueCategory.Distance)") Vector3 Translation;
///
/// The rotation of the transform.
///
- API_FIELD(Attributes="EditorOrder(20), EditorDisplay(null, \"Rotation\")") Quaternion Orientation;
+ API_FIELD(Attributes="EditorOrder(20), EditorDisplay(null, \"Rotation\"), NumberCategory(Utils.ValueCategory.Angle)") Quaternion Orientation;
///
/// The scale vector of the transform.
diff --git a/Source/Engine/Physics/Colliders/BoxCollider.h b/Source/Engine/Physics/Colliders/BoxCollider.h
index 3c15ce640..a52817d66 100644
--- a/Source/Engine/Physics/Colliders/BoxCollider.h
+++ b/Source/Engine/Physics/Colliders/BoxCollider.h
@@ -23,7 +23,7 @@ public:
/// Gets the size of the box, measured in the object's local space.
///
/// The box size will be scaled by the actor's world scale.
- API_PROPERTY(Attributes="EditorOrder(100), DefaultValue(typeof(Float3), \"100,100,100\"), EditorDisplay(\"Collider\")")
+ API_PROPERTY(Attributes="EditorOrder(100), DefaultValue(typeof(Float3), \"100,100,100\"), EditorDisplay(\"Collider\"), NumberCategory(Utils.ValueCategory.Distance)")
FORCE_INLINE Float3 GetSize() const
{
return _size;
diff --git a/Source/Engine/Physics/Colliders/CapsuleCollider.h b/Source/Engine/Physics/Colliders/CapsuleCollider.h
index 8eff1c164..e6be1e2c2 100644
--- a/Source/Engine/Physics/Colliders/CapsuleCollider.h
+++ b/Source/Engine/Physics/Colliders/CapsuleCollider.h
@@ -25,7 +25,7 @@ public:
/// Gets the radius of the sphere, measured in the object's local space.
///
/// The sphere radius will be scaled by the actor's world scale.
- API_PROPERTY(Attributes="EditorOrder(100), DefaultValue(20.0f), EditorDisplay(\"Collider\")")
+ API_PROPERTY(Attributes="EditorOrder(100), DefaultValue(20.0f), EditorDisplay(\"Collider\"), NumberCategory(Utils.ValueCategory.Distance)")
FORCE_INLINE float GetRadius() const
{
return _radius;
@@ -41,7 +41,7 @@ public:
/// Gets the height of the capsule, measured in the object's local space between the centers of the hemispherical ends.
///
/// The capsule height will be scaled by the actor's world scale.
- API_PROPERTY(Attributes="EditorOrder(110), DefaultValue(100.0f), EditorDisplay(\"Collider\")")
+ API_PROPERTY(Attributes="EditorOrder(110), DefaultValue(100.0f), EditorDisplay(\"Collider\"), NumberCategory(Utils.ValueCategory.Distance)")
FORCE_INLINE float GetHeight() const
{
return _height;
diff --git a/Source/Engine/Physics/Colliders/CharacterController.h b/Source/Engine/Physics/Colliders/CharacterController.h
index 737d98728..5eb4df965 100644
--- a/Source/Engine/Physics/Colliders/CharacterController.h
+++ b/Source/Engine/Physics/Colliders/CharacterController.h
@@ -73,7 +73,7 @@ public:
///
/// Gets the radius of the sphere, measured in the object's local space. The sphere radius will be scaled by the actor's world scale.
///
- API_PROPERTY(Attributes="EditorOrder(100), DefaultValue(50.0f), EditorDisplay(\"Collider\")")
+ API_PROPERTY(Attributes="EditorOrder(100), DefaultValue(50.0f), EditorDisplay(\"Collider\"), NumberCategory(Utils.ValueCategory.Distance)")
float GetRadius() const;
///
@@ -84,7 +84,7 @@ public:
///
/// Gets the height of the capsule, measured in the object's local space. The capsule height will be scaled by the actor's world scale.
///
- API_PROPERTY(Attributes="EditorOrder(110), DefaultValue(150.0f), EditorDisplay(\"Collider\")")
+ API_PROPERTY(Attributes="EditorOrder(110), DefaultValue(150.0f), EditorDisplay(\"Collider\"), NumberCategory(Utils.ValueCategory.Distance)")
float GetHeight() const;
///
@@ -95,7 +95,7 @@ public:
///
/// Gets the slope limit (in degrees). Limits the collider to only climb slopes that are less steep (in degrees) than the indicated value.
///
- API_PROPERTY(Attributes="EditorOrder(210), DefaultValue(45.0f), Limit(0, 100), EditorDisplay(\"Character Controller\")")
+ API_PROPERTY(Attributes="EditorOrder(210), DefaultValue(45.0f), Limit(0, 100), EditorDisplay(\"Character Controller\"), NumberCategory(Utils.ValueCategory.Angle)")
float GetSlopeLimit() const;
///
@@ -117,7 +117,7 @@ public:
///
/// Gets the step height. The character will step up a stair only if it is closer to the ground than the indicated value. This should not be greater than the Character Controller’s height or it will generate an error.
///
- API_PROPERTY(Attributes="EditorOrder(220), DefaultValue(30.0f), Limit(0), EditorDisplay(\"Character Controller\")")
+ API_PROPERTY(Attributes="EditorOrder(220), DefaultValue(30.0f), Limit(0), EditorDisplay(\"Character Controller\"), NumberCategory(Utils.ValueCategory.Distance)")
float GetStepOffset() const;
///
@@ -139,7 +139,7 @@ public:
///
/// Gets the minimum move distance of the character controller. The minimum traveled distance to consider. If traveled distance is smaller, the character doesn't move. This is used to stop the recursive motion algorithm when remaining distance to travel is small.
///
- API_PROPERTY(Attributes="EditorOrder(230), DefaultValue(0.0f), Limit(0, 1000), EditorDisplay(\"Character Controller\")")
+ API_PROPERTY(Attributes="EditorOrder(230), DefaultValue(0.0f), Limit(0, 1000), EditorDisplay(\"Character Controller\"), NumberCategory(Utils.ValueCategory.Distance)")
float GetMinMoveDistance() const;
///
From dcda7d96bbaea79143a59d44b94ce237598beb5e Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Mon, 29 Jan 2024 09:06:05 +0100
Subject: [PATCH 07/19] use C# default for double formatting
---
Source/Editor/Utilities/Utils.cs | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs
index c5e418ae2..ac5a3c3c6 100644
--- a/Source/Editor/Utilities/Utils.cs
+++ b/Source/Editor/Utilities/Utils.cs
@@ -1214,15 +1214,15 @@ namespace FlaxEditor.Utilities
{
case FlaxEngine.Utils.ValueCategory.Distance:
if (!Units.AutomaticUnitsFormatting)
- return (value / Units.Meters2Units).ToString("g17", CultureInfo.InvariantCulture) + "m";
+ return (value / Units.Meters2Units).ToString("g15", CultureInfo.InvariantCulture) + "m";
var absValue = Mathf.Abs(value);
// in case a unit != cm this would be (value / Maters2Units * 100)
if (absValue < Units.Meters2Units)
- return value.ToString("g17", CultureInfo.InvariantCulture) + "cm";
+ return value.ToString("g15", CultureInfo.InvariantCulture) + "cm";
if (absValue < Units.Meters2Units * 1000)
- return (value / Units.Meters2Units).ToString("g17", CultureInfo.InvariantCulture) + "m";
- return (value / 1000 / Units.Meters2Units).ToString("g17", CultureInfo.InvariantCulture) + "km";
- case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString("g17", CultureInfo.InvariantCulture) + "°";
+ return (value / Units.Meters2Units).ToString("g15", CultureInfo.InvariantCulture) + "m";
+ return (value / 1000 / Units.Meters2Units).ToString("g15", CultureInfo.InvariantCulture) + "km";
+ case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString("g15", CultureInfo.InvariantCulture) + "°";
case FlaxEngine.Utils.ValueCategory.None:
default:
return FormatFloat(value);
@@ -1255,7 +1255,7 @@ namespace FlaxEditor.Utilities
return "Infinity";
if (double.IsNegativeInfinity(value) || value == double.MinValue)
return "-Infinity";
- string str = value.ToString("g17", CultureInfo.InvariantCulture);
+ string str = value.ToString("g15", CultureInfo.InvariantCulture);
return FormatFloat(str, value < 0);
}
From 3dc34e2d9c6d585bd20a4a7a0a822cdcad482d63 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Mon, 29 Jan 2024 22:51:02 +0100
Subject: [PATCH 08/19] add more units and categories
---
Source/Editor/Utilities/ShuntingYardParser.cs | 46 ++++++++++++++++++-
Source/Editor/Utilities/Utils.cs | 21 ++++++---
Source/Engine/Utilities/Utils.cs | 9 +++-
3 files changed, 68 insertions(+), 8 deletions(-)
diff --git a/Source/Editor/Utilities/ShuntingYardParser.cs b/Source/Editor/Utilities/ShuntingYardParser.cs
index f8fa05e5b..0034896e1 100644
--- a/Source/Editor/Utilities/ShuntingYardParser.cs
+++ b/Source/Editor/Utilities/ShuntingYardParser.cs
@@ -123,7 +123,34 @@ namespace FlaxEditor.Utilities
["-infinity"] = -double.MaxValue,
["m"] = Units.Meters2Units,
["cm"] = Units.Meters2Units / 100,
- ["km"] = Units.Meters2Units * 1000
+ ["km"] = Units.Meters2Units * 1000,
+ ["s"] = 1,
+ ["ms"] = 0.001,
+ ["min"] = 60,
+ ["h"] = 3600,
+ ["cm²"] = (Units.Meters2Units / 100) * (Units.Meters2Units / 100),
+ ["cm³"] = (Units.Meters2Units / 100) * (Units.Meters2Units / 100) * (Units.Meters2Units / 100),
+ ["dm²"] = (Units.Meters2Units / 10) * (Units.Meters2Units / 10),
+ ["dm³"] = (Units.Meters2Units / 10) * (Units.Meters2Units / 10) * (Units.Meters2Units / 10),
+ ["l"] = (Units.Meters2Units / 10) * (Units.Meters2Units / 10) * (Units.Meters2Units / 10),
+ ["m²"] = Units.Meters2Units * Units.Meters2Units,
+ ["m³"] = Units.Meters2Units * Units.Meters2Units * Units.Meters2Units,
+ ["kg"] = 1,
+ ["g"] = 0.001,
+ ["N"] = Units.Meters2Units
+ };
+
+ ///
+ /// List known units which cannot be handled as a variable easily because they contain operator
+ /// symbols (mostly a forward slash). The value is the factor to calculate game units.
+ ///
+ private static readonly IDictionary UnitSymbols = new Dictionary
+ {
+ ["cm/s"] = Units.Meters2Units / 100,
+ ["cm/s²"] = Units.Meters2Units / 100,
+ ["m/s"] = Units.Meters2Units,
+ ["m/s²"] = Units.Meters2Units,
+ ["km/h"] = 1/3.6 * Units.Meters2Units
};
///
@@ -174,6 +201,23 @@ namespace FlaxEditor.Utilities
{
// Prepare text
text = text.Replace(',', '.').Replace("°", "");
+ foreach (var kv in UnitSymbols)
+ {
+ int idx;
+ do
+ {
+ idx = text.IndexOf(kv.Key, StringComparison.InvariantCulture);
+ if (idx > 0)
+ {
+ if (DetermineType(text[idx - 1]) != TokenType.Number)
+ throw new ParsingException($"unit found without a number: {kv.Key} at {idx} in {text}");
+ if (Mathf.Abs(kv.Value - 1) < Mathf.Epsilon)
+ text = text.Remove(idx, kv.Key.Length);
+ else
+ text = text.Replace(kv.Key, "*" + kv.Value);
+ }
+ } while (idx > 0);
+ }
// Necessary to correctly parse negative numbers
var previous = TokenType.WhiteSpace;
diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs
index ac5a3c3c6..be5399111 100644
--- a/Source/Editor/Utilities/Utils.cs
+++ b/Source/Editor/Utilities/Utils.cs
@@ -1179,21 +1179,30 @@ namespace FlaxEditor.Utilities
/// the formatted string
public static string FormatFloat(float value, FlaxEngine.Utils.ValueCategory category)
{
+ const string format = "g7";
if (!Units.UseUnitsFormatting)
return FormatFloat(value);
switch (category)
{
case FlaxEngine.Utils.ValueCategory.Distance:
if (!Units.AutomaticUnitsFormatting)
- return (value / Units.Meters2Units).ToString("g7", CultureInfo.InvariantCulture) + "m";
+ return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
var absValue = Mathf.Abs(value);
- // in case a unit != cm this would be (value / Maters2Units * 100)
+ // in case a unit != cm this would be (value / Meters2Units * 100)
if (absValue < Units.Meters2Units)
- return value.ToString("g7", CultureInfo.InvariantCulture) + "cm";
+ return value.ToString(format, CultureInfo.InvariantCulture) + "cm";
if (absValue < Units.Meters2Units * 1000)
- return (value / Units.Meters2Units).ToString("g7", CultureInfo.InvariantCulture) + "m";
- return (value / 1000 / Units.Meters2Units).ToString("g7", CultureInfo.InvariantCulture) + "km";
- case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString("g7", CultureInfo.InvariantCulture) + "°";
+ return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
+ return (value / 1000 / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "km";
+ case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString(format, CultureInfo.InvariantCulture) + "°";
+ case FlaxEngine.Utils.ValueCategory.Time: return value.ToString(format, CultureInfo.InvariantCulture) + "s";
+ // some fonts have a symbol for that: "\u33A7"
+ case FlaxEngine.Utils.ValueCategory.Speed: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m/s";
+ case FlaxEngine.Utils.ValueCategory.Acceleration: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m/s²";
+ case FlaxEngine.Utils.ValueCategory.Area: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m²";
+ case FlaxEngine.Utils.ValueCategory.Volume: return (value / Units.Meters2Units / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m³";
+ case FlaxEngine.Utils.ValueCategory.Mass: return value.ToString(format, CultureInfo.InvariantCulture) + "kg";
+ case FlaxEngine.Utils.ValueCategory.Force: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "N";
case FlaxEngine.Utils.ValueCategory.None:
default:
return FormatFloat(value);
diff --git a/Source/Engine/Utilities/Utils.cs b/Source/Engine/Utilities/Utils.cs
index 195bacf96..9ae42fa43 100644
--- a/Source/Engine/Utilities/Utils.cs
+++ b/Source/Engine/Utilities/Utils.cs
@@ -1046,7 +1046,14 @@ namespace FlaxEngine
{
None,
Distance,
- Angle
+ Area,
+ Volume,
+ Mass,
+ Angle,
+ Speed,
+ Acceleration,
+ Time,
+ Force
}
}
}
From 9e5f866b75011dd0d0b49ce069a598c69c990a67 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Tue, 30 Jan 2024 07:44:50 +0100
Subject: [PATCH 09/19] fix Newton parsing
---
Source/Editor/Utilities/ShuntingYardParser.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Source/Editor/Utilities/ShuntingYardParser.cs b/Source/Editor/Utilities/ShuntingYardParser.cs
index 0034896e1..ca3780e8f 100644
--- a/Source/Editor/Utilities/ShuntingYardParser.cs
+++ b/Source/Editor/Utilities/ShuntingYardParser.cs
@@ -137,7 +137,7 @@ namespace FlaxEditor.Utilities
["m³"] = Units.Meters2Units * Units.Meters2Units * Units.Meters2Units,
["kg"] = 1,
["g"] = 0.001,
- ["N"] = Units.Meters2Units
+ ["n"] = Units.Meters2Units
};
///
@@ -387,7 +387,7 @@ namespace FlaxEditor.Utilities
}
else
{
- throw new ParsingException("unknown variable");
+ throw new ParsingException($"unknown variable : {token.Value}");
}
}
else
From e7b0375a0e062c43a30b626273b7f81989e4f139 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Tue, 30 Jan 2024 07:45:19 +0100
Subject: [PATCH 10/19] code cleanup
---
Source/Editor/Utilities/Utils.cs | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs
index be5399111..531f2b50b 100644
--- a/Source/Editor/Utilities/Utils.cs
+++ b/Source/Editor/Utilities/Utils.cs
@@ -1179,7 +1179,7 @@ namespace FlaxEditor.Utilities
/// the formatted string
public static string FormatFloat(float value, FlaxEngine.Utils.ValueCategory category)
{
- const string format = "g7";
+ const string format = "g7";
if (!Units.UseUnitsFormatting)
return FormatFloat(value);
switch (category)
@@ -1217,21 +1217,22 @@ namespace FlaxEditor.Utilities
/// the formatted string
public static string FormatFloat(double value, FlaxEngine.Utils.ValueCategory category)
{
+ const string format = "g15";
if (!Units.UseUnitsFormatting)
return FormatFloat(value);
switch (category)
{
case FlaxEngine.Utils.ValueCategory.Distance:
if (!Units.AutomaticUnitsFormatting)
- return (value / Units.Meters2Units).ToString("g15", CultureInfo.InvariantCulture) + "m";
+ return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
var absValue = Mathf.Abs(value);
// in case a unit != cm this would be (value / Maters2Units * 100)
if (absValue < Units.Meters2Units)
- return value.ToString("g15", CultureInfo.InvariantCulture) + "cm";
+ return value.ToString(format, CultureInfo.InvariantCulture) + "cm";
if (absValue < Units.Meters2Units * 1000)
- return (value / Units.Meters2Units).ToString("g15", CultureInfo.InvariantCulture) + "m";
- return (value / 1000 / Units.Meters2Units).ToString("g15", CultureInfo.InvariantCulture) + "km";
- case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString("g15", CultureInfo.InvariantCulture) + "°";
+ return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
+ return (value / 1000 / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "km";
+ case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString(format, CultureInfo.InvariantCulture) + "°";
case FlaxEngine.Utils.ValueCategory.None:
default:
return FormatFloat(value);
From 49beb2c7bab76d75a993249182d9380d257c35ed Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Tue, 30 Jan 2024 08:52:27 +0100
Subject: [PATCH 11/19] add toggle formatting
---
.../CustomEditors/Editors/DoubleEditor.cs | 14 +++++++++++
.../CustomEditors/Editors/FloatEditor.cs | 15 ++++++++++++
.../CustomEditors/Editors/Vector3Editor.cs | 24 +++++++++++++++++++
Source/Editor/GUI/Input/FloatValueBox.cs | 10 +++++---
4 files changed, 60 insertions(+), 3 deletions(-)
diff --git a/Source/Editor/CustomEditors/Editors/DoubleEditor.cs b/Source/Editor/CustomEditors/Editors/DoubleEditor.cs
index a428fd448..97c0d4782 100644
--- a/Source/Editor/CustomEditors/Editors/DoubleEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/DoubleEditor.cs
@@ -40,6 +40,13 @@ namespace FlaxEditor.CustomEditors.Editors
doubleValue.ValueBox.ValueChanged += OnValueChanged;
doubleValue.ValueBox.SlidingEnd += ClearToken;
_element = doubleValue;
+ LinkedLabel.SetupContextMenu += (label, menu, editor) =>
+ {
+ menu.AddSeparator();
+ var mb = menu.AddButton("Show formatted", bt => { doubleValue.SetCategory(bt.Checked ? valueCategory : Utils.ValueCategory.None);});
+ mb.AutoCheck = true;
+ mb.Checked = doubleValue.ValueBox.Category != Utils.ValueCategory.None;
+ };
return;
}
}
@@ -50,6 +57,13 @@ namespace FlaxEditor.CustomEditors.Editors
doubleValue.SetCategory(valueCategory);
doubleValue.ValueBox.ValueChanged += OnValueChanged;
doubleValue.ValueBox.SlidingEnd += ClearToken;
+ LinkedLabel.SetupContextMenu += (label, menu, editor) =>
+ {
+ menu.AddSeparator();
+ var mb = menu.AddButton("Show formatted", bt => { doubleValue.SetCategory(bt.Checked ? valueCategory : Utils.ValueCategory.None);});
+ mb.AutoCheck = true;
+ mb.Checked = doubleValue.ValueBox.Category != Utils.ValueCategory.None;
+ };
_element = doubleValue;
}
}
diff --git a/Source/Editor/CustomEditors/Editors/FloatEditor.cs b/Source/Editor/CustomEditors/Editors/FloatEditor.cs
index c739269ab..88777474b 100644
--- a/Source/Editor/CustomEditors/Editors/FloatEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/FloatEditor.cs
@@ -3,6 +3,7 @@
using System;
using System.Linq;
using FlaxEditor.CustomEditors.Elements;
+using FlaxEditor.GUI.ContextMenu;
using FlaxEngine;
using Utils = FlaxEngine.Utils;
@@ -56,6 +57,13 @@ namespace FlaxEditor.CustomEditors.Editors
floatValue.ValueBox.ValueChanged += OnValueChanged;
floatValue.ValueBox.SlidingEnd += ClearToken;
_element = floatValue;
+ LinkedLabel.SetupContextMenu += (label, menu, editor) =>
+ {
+ menu.AddSeparator();
+ var mb = menu.AddButton("Show formatted", bt => { floatValue.SetCategory(bt.Checked ? valueCategory : Utils.ValueCategory.None);});
+ mb.AutoCheck = true;
+ mb.Checked = floatValue.ValueBox.Category != Utils.ValueCategory.None;
+ };
return;
}
}
@@ -67,6 +75,13 @@ namespace FlaxEditor.CustomEditors.Editors
floatValue.ValueBox.ValueChanged += OnValueChanged;
floatValue.ValueBox.SlidingEnd += ClearToken;
_element = floatValue;
+ LinkedLabel.SetupContextMenu += (label, menu, editor) =>
+ {
+ menu.AddSeparator();
+ var mb = menu.AddButton("Show formatted", bt => { floatValue.SetCategory(bt.Checked ? valueCategory : Utils.ValueCategory.None);});
+ mb.AutoCheck = true;
+ mb.Checked = floatValue.ValueBox.Category != Utils.ValueCategory.None;
+ };
}
}
diff --git a/Source/Editor/CustomEditors/Editors/Vector3Editor.cs b/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
index fe3ff2b74..c01a841c2 100644
--- a/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
+++ b/Source/Editor/CustomEditors/Editors/Vector3Editor.cs
@@ -97,6 +97,18 @@ namespace FlaxEditor.CustomEditors.Editors
ZElement.SetCategory(category);
ZElement.ValueBox.ValueChanged += OnZValueChanged;
ZElement.ValueBox.SlidingEnd += ClearToken;
+ LinkedLabel.SetupContextMenu += (label, menu, editor) =>
+ {
+ menu.AddSeparator();
+ var mb = menu.AddButton("Show formatted", bt =>
+ {
+ XElement.SetCategory(bt.Checked ? category : Utils.ValueCategory.None);
+ YElement.SetCategory(bt.Checked ? category : Utils.ValueCategory.None);
+ ZElement.SetCategory(bt.Checked ? category : Utils.ValueCategory.None);
+ });
+ mb.AutoCheck = true;
+ mb.Checked = XElement.ValueBox.Category != Utils.ValueCategory.None;
+ };
}
private void OnXValueChanged()
@@ -283,6 +295,18 @@ namespace FlaxEditor.CustomEditors.Editors
ZElement.SetCategory(category);
ZElement.ValueBox.ValueChanged += OnValueChanged;
ZElement.ValueBox.SlidingEnd += ClearToken;
+ LinkedLabel.SetupContextMenu += (label, menu, editor) =>
+ {
+ menu.AddSeparator();
+ var mb = menu.AddButton("Show formatted", bt =>
+ {
+ XElement.SetCategory(bt.Checked ? category : Utils.ValueCategory.None);
+ YElement.SetCategory(bt.Checked ? category : Utils.ValueCategory.None);
+ ZElement.SetCategory(bt.Checked ? category : Utils.ValueCategory.None);
+ });
+ mb.AutoCheck = true;
+ mb.Checked = XElement.ValueBox.Category != Utils.ValueCategory.None;
+ };
}
private void OnValueChanged()
diff --git a/Source/Editor/GUI/Input/FloatValueBox.cs b/Source/Editor/GUI/Input/FloatValueBox.cs
index 2fccba8e8..5495fe534 100644
--- a/Source/Editor/GUI/Input/FloatValueBox.cs
+++ b/Source/Editor/GUI/Input/FloatValueBox.cs
@@ -1,7 +1,6 @@
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
using System;
-using System.Globalization;
using FlaxEditor.Utilities;
using FlaxEngine;
using Utils = FlaxEngine.Utils;
@@ -138,10 +137,15 @@ namespace FlaxEditor.GUI.Input
Value = Value;
}
+ private Utils.ValueCategory _category = Utils.ValueCategory.None;
+
///
- /// Get or set the category of the value. This can either be none for just a number, a distance or an angle.
+ /// Get or set the category of the value. This can be none for just a number or a more specific one like a distance.
///
- public Utils.ValueCategory Category = Utils.ValueCategory.None;
+ public Utils.ValueCategory Category {
+ get => _category;
+ set { _category = value; UpdateText(); }
+ }
///
protected sealed override void UpdateText()
From 2a0320677849698e388dcf95cb2e6e769f2634a5 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Tue, 30 Jan 2024 09:24:44 +0100
Subject: [PATCH 12/19] add formatting preference to editor options
---
Source/Editor/Options/InterfaceOptions.cs | 37 +++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/Source/Editor/Options/InterfaceOptions.cs b/Source/Editor/Options/InterfaceOptions.cs
index 95a273f19..482946e9a 100644
--- a/Source/Editor/Options/InterfaceOptions.cs
+++ b/Source/Editor/Options/InterfaceOptions.cs
@@ -2,6 +2,7 @@
using System.ComponentModel;
using FlaxEditor.GUI.Docking;
+using FlaxEditor.Utilities;
using FlaxEngine;
namespace FlaxEditor.Options
@@ -90,6 +91,25 @@ namespace FlaxEditor.Options
PlayScenes,
}
+ ///
+ /// Options for formatting numerical values
+ ///
+ public enum ValueFormattingType
+ {
+ ///
+ /// No formatting
+ ///
+ None,
+ ///
+ /// Format using the base SI unit
+ ///
+ BaseUnit,
+ ///
+ /// Format using a unit that matches the value best
+ ///
+ AutoUnit
+ }
+
///
/// Gets or sets the Editor User Interface scale. Applied to all UI elements, windows and text. Can be used to scale the interface up on a bigger display. Editor restart required.
///
@@ -148,6 +168,23 @@ namespace FlaxEditor.Options
[EditorDisplay("Interface"), EditorOrder(280), Tooltip("Editor content window orientation.")]
public FlaxEngine.GUI.Orientation ContentWindowOrientation { get; set; } = FlaxEngine.GUI.Orientation.Horizontal;
+ private ValueFormattingType _valueFormatting = ValueFormattingType.None;
+
+ ///
+ /// Gets or sets the formatting option for numeric values in the editor.
+ ///
+ [DefaultValue(ValueFormattingType.None)]
+ [EditorDisplay("Interface"), EditorOrder(300), Tooltip("Formatting of numeric values.")]
+ public ValueFormattingType ValueFormating {
+ get => _valueFormatting;
+ set
+ {
+ _valueFormatting = value;
+ Units.UseUnitsFormatting = _valueFormatting != ValueFormattingType.None;
+ Units.AutomaticUnitsFormatting = _valueFormatting == ValueFormattingType.AutoUnit;
+ }
+ }
+
///
/// Gets or sets the timestamps prefix mode for output log messages.
///
From 1f8314b66302f2a5242ce818e1ec96933c963160 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Tue, 30 Jan 2024 09:29:05 +0100
Subject: [PATCH 13/19] fixed typo
---
Source/Editor/Options/InterfaceOptions.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Source/Editor/Options/InterfaceOptions.cs b/Source/Editor/Options/InterfaceOptions.cs
index 482946e9a..5c4a88b1e 100644
--- a/Source/Editor/Options/InterfaceOptions.cs
+++ b/Source/Editor/Options/InterfaceOptions.cs
@@ -175,7 +175,7 @@ namespace FlaxEditor.Options
///
[DefaultValue(ValueFormattingType.None)]
[EditorDisplay("Interface"), EditorOrder(300), Tooltip("Formatting of numeric values.")]
- public ValueFormattingType ValueFormating {
+ public ValueFormattingType ValueFormatting {
get => _valueFormatting;
set
{
From 22600a2c29e6a005e6d9ba0f8aba23bc78af99f2 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Wed, 31 Jan 2024 11:01:22 +0100
Subject: [PATCH 14/19] add torque unit
---
Source/Editor/Utilities/ShuntingYardParser.cs | 5 ++++-
Source/Editor/Utilities/Utils.cs | 1 +
Source/Engine/Physics/Actors/RigidBody.h | 2 +-
Source/Engine/Utilities/Utils.cs | 3 ++-
4 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/Source/Editor/Utilities/ShuntingYardParser.cs b/Source/Editor/Utilities/ShuntingYardParser.cs
index ca3780e8f..356fec2b5 100644
--- a/Source/Editor/Utilities/ShuntingYardParser.cs
+++ b/Source/Editor/Utilities/ShuntingYardParser.cs
@@ -144,13 +144,16 @@ namespace FlaxEditor.Utilities
/// List known units which cannot be handled as a variable easily because they contain operator
/// symbols (mostly a forward slash). The value is the factor to calculate game units.
///
+ // Nm is here because these values are compared case-sensitive and we don't want to confuse
+ // nanometers and Newtonmeters
private static readonly IDictionary UnitSymbols = new Dictionary
{
["cm/s"] = Units.Meters2Units / 100,
["cm/s²"] = Units.Meters2Units / 100,
["m/s"] = Units.Meters2Units,
["m/s²"] = Units.Meters2Units,
- ["km/h"] = 1/3.6 * Units.Meters2Units
+ ["km/h"] = 1/3.6 * Units.Meters2Units,
+ ["Nm"] = Units.Meters2Units * Units.Meters2Units
};
///
diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs
index 531f2b50b..a0422bf7d 100644
--- a/Source/Editor/Utilities/Utils.cs
+++ b/Source/Editor/Utilities/Utils.cs
@@ -1203,6 +1203,7 @@ namespace FlaxEditor.Utilities
case FlaxEngine.Utils.ValueCategory.Volume: return (value / Units.Meters2Units / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m³";
case FlaxEngine.Utils.ValueCategory.Mass: return value.ToString(format, CultureInfo.InvariantCulture) + "kg";
case FlaxEngine.Utils.ValueCategory.Force: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "N";
+ case FlaxEngine.Utils.ValueCategory.Torque: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "Nm";
case FlaxEngine.Utils.ValueCategory.None:
default:
return FormatFloat(value);
diff --git a/Source/Engine/Physics/Actors/RigidBody.h b/Source/Engine/Physics/Actors/RigidBody.h
index 2ef50ca7a..c7fb20038 100644
--- a/Source/Engine/Physics/Actors/RigidBody.h
+++ b/Source/Engine/Physics/Actors/RigidBody.h
@@ -181,7 +181,7 @@ public:
///
/// Gets the mass value measured in kilograms (use override value only if OverrideMass is checked).
///
- API_PROPERTY(Attributes="EditorOrder(110), Limit(0), EditorDisplay(\"Rigid Body\")")
+ API_PROPERTY(Attributes="EditorOrder(110), Limit(0), EditorDisplay(\"Rigid Body\"), NumberCategory(Utils.ValueCategory.Mass)")
float GetMass() const;
///
diff --git a/Source/Engine/Utilities/Utils.cs b/Source/Engine/Utilities/Utils.cs
index 9ae42fa43..e4b7c544b 100644
--- a/Source/Engine/Utilities/Utils.cs
+++ b/Source/Engine/Utilities/Utils.cs
@@ -1053,7 +1053,8 @@ namespace FlaxEngine
Speed,
Acceleration,
Time,
- Force
+ Force,
+ Torque
}
}
}
From 7a802a2eeef381904300c3cc69e4ec3cbe5c1979 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Wed, 31 Jan 2024 20:39:39 +0100
Subject: [PATCH 15/19] format +/- infinity
---
Source/Editor/Utilities/Utils.cs | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs
index a0422bf7d..445520f76 100644
--- a/Source/Editor/Utilities/Utils.cs
+++ b/Source/Editor/Utilities/Utils.cs
@@ -1179,6 +1179,10 @@ namespace FlaxEditor.Utilities
/// the formatted string
public static string FormatFloat(float value, FlaxEngine.Utils.ValueCategory category)
{
+ if (float.IsPositiveInfinity(value) || value == float.MaxValue)
+ return "Infinity";
+ if (float.IsNegativeInfinity(value) || value == float.MinValue)
+ return "-Infinity";
const string format = "g7";
if (!Units.UseUnitsFormatting)
return FormatFloat(value);
@@ -1218,6 +1222,10 @@ namespace FlaxEditor.Utilities
/// the formatted string
public static string FormatFloat(double value, FlaxEngine.Utils.ValueCategory category)
{
+ if (double.IsPositiveInfinity(value) || value == double.MaxValue)
+ return "Infinity";
+ if (double.IsNegativeInfinity(value) || value == double.MinValue)
+ return "-Infinity";
const string format = "g15";
if (!Units.UseUnitsFormatting)
return FormatFloat(value);
From 245cf63b0b5c269a248def238897f7f85c888352 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Wed, 31 Jan 2024 20:40:06 +0100
Subject: [PATCH 16/19] format break limits on joints
---
Source/Engine/Physics/Joints/Joint.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Source/Engine/Physics/Joints/Joint.h b/Source/Engine/Physics/Joints/Joint.h
index f96e47b71..e5805631d 100644
--- a/Source/Engine/Physics/Joints/Joint.h
+++ b/Source/Engine/Physics/Joints/Joint.h
@@ -38,7 +38,7 @@ public:
///
/// Gets the break force. Determines the maximum force the joint can apply before breaking. Broken joints no longer participate in physics simulation.
///
- API_PROPERTY(Attributes="EditorOrder(10), DefaultValue(float.MaxValue), EditorDisplay(\"Joint\")")
+ API_PROPERTY(Attributes="EditorOrder(10), DefaultValue(float.MaxValue), EditorDisplay(\"Joint\"), NumberCategory(Utils.ValueCategory.Force)")
FORCE_INLINE float GetBreakForce() const
{
return _breakForce;
@@ -52,7 +52,7 @@ public:
///
/// Gets the break torque. Determines the maximum torque the joint can apply before breaking. Broken joints no longer participate in physics simulation.
///
- API_PROPERTY(Attributes="EditorOrder(20), DefaultValue(float.MaxValue), EditorDisplay(\"Joint\")")
+ API_PROPERTY(Attributes="EditorOrder(20), DefaultValue(float.MaxValue), EditorDisplay(\"Joint\"), NumberCategory(Utils.ValueCategory.Torque)")
FORCE_INLINE float GetBreakTorque() const
{
return _breakTorque;
From 54658cbb3b7083385817b4f35dbae965882c08da Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Wed, 31 Jan 2024 22:05:24 +0100
Subject: [PATCH 17/19] =?UTF-8?q?fix=20=C2=B2=20and=20=C2=B3=20in=20parser?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Source/Editor/Utilities/ShuntingYardParser.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Source/Editor/Utilities/ShuntingYardParser.cs b/Source/Editor/Utilities/ShuntingYardParser.cs
index 356fec2b5..b362823eb 100644
--- a/Source/Editor/Utilities/ShuntingYardParser.cs
+++ b/Source/Editor/Utilities/ShuntingYardParser.cs
@@ -189,7 +189,7 @@ namespace FlaxEditor.Utilities
if (Operators.ContainsKey(str))
return TokenType.Operator;
- if (char.IsLetter(c))
+ if (char.IsLetter(c) || c=='²' || c=='³')
return TokenType.Variable;
throw new ParsingException("wrong character");
From 7f95dab511cf38990520cd2b9c2641d6a4f138f2 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Wed, 31 Jan 2024 22:05:54 +0100
Subject: [PATCH 18/19] more joint values formatted
---
Source/Engine/Physics/Joints/DistanceJoint.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Source/Engine/Physics/Joints/DistanceJoint.h b/Source/Engine/Physics/Joints/DistanceJoint.h
index 96ddc9538..0ae98414e 100644
--- a/Source/Engine/Physics/Joints/DistanceJoint.h
+++ b/Source/Engine/Physics/Joints/DistanceJoint.h
@@ -67,7 +67,7 @@ public:
/// Gets the allowed minimum distance for the joint.
///
/// Used only when DistanceJointFlag.MinDistance flag is set. The minimum distance must be no more than the maximum distance. Default: 0, Range: [0, float.MaxValue].
- API_PROPERTY(Attributes="EditorOrder(110), DefaultValue(0.0f), Limit(0.0f), EditorDisplay(\"Joint\")")
+ API_PROPERTY(Attributes="EditorOrder(110), DefaultValue(0.0f), Limit(0.0f), EditorDisplay(\"Joint\"), NumberCategory(Utils.ValueCategory.Distance)")
FORCE_INLINE float GetMinDistance() const
{
return _minDistance;
@@ -83,7 +83,7 @@ public:
/// Gets the allowed maximum distance for the joint.
///
/// Used only when DistanceJointFlag.MaxDistance flag is set. The maximum distance must be no less than the minimum distance. Default: 0, Range: [0, float.MaxValue].
- API_PROPERTY(Attributes="EditorOrder(120), DefaultValue(10.0f), Limit(0.0f), EditorDisplay(\"Joint\")")
+ API_PROPERTY(Attributes="EditorOrder(120), DefaultValue(10.0f), Limit(0.0f), EditorDisplay(\"Joint\"), NumberCategory(Utils.ValueCategory.Distance)")
FORCE_INLINE float GetMaxDistance() const
{
return _maxDistance;
From 8aa402bcb9b7ec22cb68d98011c6832d85b1c381 Mon Sep 17 00:00:00 2001
From: nothingTVatYT <34131388+nothingTVatYT@users.noreply.github.com>
Date: Wed, 31 Jan 2024 23:21:57 +0100
Subject: [PATCH 19/19] add space option and avoid duplicated code
---
Source/Editor/Options/InterfaceOptions.cs | 15 ++++
Source/Editor/Utilities/Units.cs | 23 ++++--
Source/Editor/Utilities/Utils.cs | 87 ++++++++++-------------
3 files changed, 72 insertions(+), 53 deletions(-)
diff --git a/Source/Editor/Options/InterfaceOptions.cs b/Source/Editor/Options/InterfaceOptions.cs
index 5c4a88b1e..3e32b0933 100644
--- a/Source/Editor/Options/InterfaceOptions.cs
+++ b/Source/Editor/Options/InterfaceOptions.cs
@@ -185,6 +185,21 @@ namespace FlaxEditor.Options
}
}
+ private bool _spaceNumberAndUnits = false;
+
+ ///
+ /// Gets or sets the option to put a space between numbers and units for unit formatting
+ ///
+ [DefaultValue(false)]
+ [EditorDisplay("Interface"), EditorOrder(310), Tooltip("Put a space between numbers and units.")]
+ public bool SpaceNumberAndUnits { get => _spaceNumberAndUnits;
+ set
+ {
+ _spaceNumberAndUnits = value;
+ Units.SpaceNumberAndUnits = _spaceNumberAndUnits;
+ }
+ }
+
///
/// Gets or sets the timestamps prefix mode for output log messages.
///
diff --git a/Source/Editor/Utilities/Units.cs b/Source/Editor/Utilities/Units.cs
index 1256ccd63..cd4e67882 100644
--- a/Source/Editor/Utilities/Units.cs
+++ b/Source/Editor/Utilities/Units.cs
@@ -7,15 +7,30 @@ public class Units
///
public static readonly float Meters2Units = 100f;
- // the next two bools could be cached values in the user preferences
-
///
- /// Set it to false to always show game units without any postfix
+ /// Set it to false to always show game units without any postfix.
///
public static bool UseUnitsFormatting = true;
///
- /// If set to true, the distance unit is chosen on the magnitude, otherwise it's meters
+ /// Add a space between numbers and units for readability.
+ ///
+ public static bool SpaceNumberAndUnits = true;
+
+ ///
+ /// If set to true, the distance unit is chosen on the magnitude, otherwise it's meters.
///
public static bool AutomaticUnitsFormatting = true;
+
+ ///
+ /// Return the unit according to user settings.
+ ///
+ ///
+ ///
+ public static string Unit(string unit)
+ {
+ if (SpaceNumberAndUnits)
+ return $" {unit}";
+ return unit;
+ }
}
diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs
index 445520f76..17456babf 100644
--- a/Source/Editor/Utilities/Utils.cs
+++ b/Source/Editor/Utilities/Utils.cs
@@ -1171,6 +1171,36 @@ namespace FlaxEditor.Utilities
return StringUtils.GetPathWithoutExtension(path);
}
+ private static string InternalFormat(double value, string format, FlaxEngine.Utils.ValueCategory category)
+ {
+ switch (category)
+ {
+ case FlaxEngine.Utils.ValueCategory.Distance:
+ if (!Units.AutomaticUnitsFormatting)
+ return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m");
+ var absValue = Mathf.Abs(value);
+ // in case a unit != cm this would be (value / Meters2Units * 100)
+ if (absValue < Units.Meters2Units)
+ return value.ToString(format, CultureInfo.InvariantCulture) + Units.Unit("cm");
+ if (absValue < Units.Meters2Units * 1000)
+ return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m");
+ return (value / 1000 / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("km");
+ case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString(format, CultureInfo.InvariantCulture) + "°";
+ case FlaxEngine.Utils.ValueCategory.Time: return value.ToString(format, CultureInfo.InvariantCulture) + Units.Unit("s");
+ // some fonts have a symbol for that: "\u33A7"
+ case FlaxEngine.Utils.ValueCategory.Speed: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m/s");
+ case FlaxEngine.Utils.ValueCategory.Acceleration: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m/s²");
+ case FlaxEngine.Utils.ValueCategory.Area: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m²");
+ case FlaxEngine.Utils.ValueCategory.Volume: return (value / Units.Meters2Units / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m³");
+ case FlaxEngine.Utils.ValueCategory.Mass: return value.ToString(format, CultureInfo.InvariantCulture) + Units.Unit("kg");
+ case FlaxEngine.Utils.ValueCategory.Force: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("N");
+ case FlaxEngine.Utils.ValueCategory.Torque: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("Nm");
+ case FlaxEngine.Utils.ValueCategory.None:
+ default:
+ return FormatFloat(value);
+ }
+ }
+
///
/// Format a float value either as-is, with a distance unit or with a degree sign
///
@@ -1183,35 +1213,10 @@ namespace FlaxEditor.Utilities
return "Infinity";
if (float.IsNegativeInfinity(value) || value == float.MinValue)
return "-Infinity";
- const string format = "g7";
- if (!Units.UseUnitsFormatting)
+ if (!Units.UseUnitsFormatting || category == FlaxEngine.Utils.ValueCategory.None)
return FormatFloat(value);
- switch (category)
- {
- case FlaxEngine.Utils.ValueCategory.Distance:
- if (!Units.AutomaticUnitsFormatting)
- return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
- var absValue = Mathf.Abs(value);
- // in case a unit != cm this would be (value / Meters2Units * 100)
- if (absValue < Units.Meters2Units)
- return value.ToString(format, CultureInfo.InvariantCulture) + "cm";
- if (absValue < Units.Meters2Units * 1000)
- return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
- return (value / 1000 / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "km";
- case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString(format, CultureInfo.InvariantCulture) + "°";
- case FlaxEngine.Utils.ValueCategory.Time: return value.ToString(format, CultureInfo.InvariantCulture) + "s";
- // some fonts have a symbol for that: "\u33A7"
- case FlaxEngine.Utils.ValueCategory.Speed: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m/s";
- case FlaxEngine.Utils.ValueCategory.Acceleration: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m/s²";
- case FlaxEngine.Utils.ValueCategory.Area: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m²";
- case FlaxEngine.Utils.ValueCategory.Volume: return (value / Units.Meters2Units / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m³";
- case FlaxEngine.Utils.ValueCategory.Mass: return value.ToString(format, CultureInfo.InvariantCulture) + "kg";
- case FlaxEngine.Utils.ValueCategory.Force: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "N";
- case FlaxEngine.Utils.ValueCategory.Torque: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "Nm";
- case FlaxEngine.Utils.ValueCategory.None:
- default:
- return FormatFloat(value);
- }
+ const string format = "G7";
+ return InternalFormat(value, format, category);
}
///
@@ -1226,26 +1231,10 @@ namespace FlaxEditor.Utilities
return "Infinity";
if (double.IsNegativeInfinity(value) || value == double.MinValue)
return "-Infinity";
- const string format = "g15";
- if (!Units.UseUnitsFormatting)
+ if (!Units.UseUnitsFormatting || category == FlaxEngine.Utils.ValueCategory.None)
return FormatFloat(value);
- switch (category)
- {
- case FlaxEngine.Utils.ValueCategory.Distance:
- if (!Units.AutomaticUnitsFormatting)
- return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
- var absValue = Mathf.Abs(value);
- // in case a unit != cm this would be (value / Maters2Units * 100)
- if (absValue < Units.Meters2Units)
- return value.ToString(format, CultureInfo.InvariantCulture) + "cm";
- if (absValue < Units.Meters2Units * 1000)
- return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
- return (value / 1000 / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "km";
- case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString(format, CultureInfo.InvariantCulture) + "°";
- case FlaxEngine.Utils.ValueCategory.None:
- default:
- return FormatFloat(value);
- }
+ const string format = "G15";
+ return InternalFormat(value, format, category);
}
///
@@ -1259,7 +1248,7 @@ namespace FlaxEditor.Utilities
return "Infinity";
if (float.IsNegativeInfinity(value) || value == float.MinValue)
return "-Infinity";
- string str = value.ToString("g7", CultureInfo.InvariantCulture);
+ string str = value.ToString("R", CultureInfo.InvariantCulture);
return FormatFloat(str, value < 0);
}
@@ -1274,7 +1263,7 @@ namespace FlaxEditor.Utilities
return "Infinity";
if (double.IsNegativeInfinity(value) || value == double.MinValue)
return "-Infinity";
- string str = value.ToString("g15", CultureInfo.InvariantCulture);
+ string str = value.ToString("R", CultureInfo.InvariantCulture);
return FormatFloat(str, value < 0);
}