diff --git a/Source/Editor/Content/GUI/ContentView.cs b/Source/Editor/Content/GUI/ContentView.cs
index b56672f44..4928722b6 100644
--- a/Source/Editor/Content/GUI/ContentView.cs
+++ b/Source/Editor/Content/GUI/ContentView.cs
@@ -145,7 +145,7 @@ namespace FlaxEditor.Content.GUI
set
{
value = Mathf.Clamp(value, 0.3f, 3.0f);
- if (!Mathf.NearEqual(value, _viewScale))
+ if (value != _viewScale)
{
_viewScale = value;
ViewScaleChanged?.Invoke();
diff --git a/Source/Editor/CustomEditors/Editors/LocalizedStringEditor.cs b/Source/Editor/CustomEditors/Editors/LocalizedStringEditor.cs
index 76ceb7488..221bfd7a9 100644
--- a/Source/Editor/CustomEditors/Editors/LocalizedStringEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/LocalizedStringEditor.cs
@@ -21,6 +21,7 @@ namespace FlaxEditor.CustomEditors.Editors
public sealed class LocalizedStringEditor : GenericEditor
{
private TextBoxElement _idElement, _valueElement;
+ private Button _viewStringButton;
///
public override DisplayStyle Style => DisplayStyle.Inline;
@@ -70,6 +71,21 @@ namespace FlaxEditor.CustomEditors.Editors
};
addString.SetAnchorPreset(AnchorPresets.MiddleRight, false, true);
addString.ButtonClicked += OnAddStringClicked;
+
+ var viewString = new Button
+ {
+ Visible = false,
+ Width = 16.0f,
+ BackgroundColor = Color.White,
+ BackgroundColorHighlighted = Color.Gray,
+ BackgroundBrush = new SpriteBrush(Editor.Instance.Icons.Search12),
+ TooltipText = "Find localized text in Localized String Table asset for the current locale...",
+ Parent = valueElement.TextBox,
+ };
+ viewString.SetAnchorPreset(AnchorPresets.MiddleRight, false, true);
+ viewString.LocalX -= 16.0f;
+ viewString.ButtonClicked += OnViewStringClicked;
+ _viewStringButton = viewString;
}
///
@@ -80,6 +96,7 @@ namespace FlaxEditor.CustomEditors.Editors
if (_valueElement != null)
{
_valueElement.TextBox.WatermarkText = Localization.GetString(_idElement.Text);
+ _viewStringButton.Visible = !string.IsNullOrEmpty(_valueElement.TextBox.WatermarkText);
}
}
@@ -92,14 +109,21 @@ namespace FlaxEditor.CustomEditors.Editors
_valueElement = null;
}
- private void OnSelectStringClicked(Button button)
+ private bool GetSettings(out LocalizationSettings settings)
{
- var settings = GameSettings.Load();
+ settings = GameSettings.Load();
if (settings?.LocalizedStringTables == null || settings.LocalizedStringTables.Length == 0)
{
MessageBox.Show("No valid localization settings setup.");
- return;
+ return true;
}
+ return false;
+ }
+
+ private void OnSelectStringClicked(Button button)
+ {
+ if (GetSettings(out var settings))
+ return;
Profiler.BeginEvent("LocalizedStringEditor.OnSelectStringClicked");
var allKeys = new HashSet();
for (int i = 0; i < settings.LocalizedStringTables.Length; i++)
@@ -136,6 +160,7 @@ namespace FlaxEditor.CustomEditors.Editors
{
menu.Hide();
_idElement.TextBox.SetTextAsUser(after[0].Text);
+ _valueElement.TextBox.SetTextAsUser(string.Empty);
}
};
searchBox.TextChanged += delegate
@@ -158,12 +183,8 @@ namespace FlaxEditor.CustomEditors.Editors
private void OnAddStringClicked(Button button)
{
- var settings = GameSettings.Load();
- if (settings?.LocalizedStringTables == null || settings.LocalizedStringTables.Length == 0)
- {
- MessageBox.Show("No valid localization settings setup.");
+ if (GetSettings(out var settings))
return;
- }
Profiler.BeginEvent("LocalizedStringEditor.OnAddStringClicked");
var allKeys = new HashSet();
for (int i = 0; i < settings.LocalizedStringTables.Length; i++)
@@ -231,5 +252,30 @@ namespace FlaxEditor.CustomEditors.Editors
_idElement.TextBox.SetTextAsUser(newKey);
Profiler.EndEvent();
}
+
+ private void OnViewStringClicked(Button button)
+ {
+ if (GetSettings(out var settings))
+ return;
+ var id = _idElement.TextBox.Text;
+ var value = _valueElement.TextBox.WatermarkText;
+ for (int i = 0; i < settings.LocalizedStringTables.Length; i++)
+ {
+ var table = settings.LocalizedStringTables[i];
+ if (table && !table.WaitForLoaded())
+ {
+ var entries = table.Entries;
+ if (entries.TryGetValue(id, out var messages))
+ {
+ if (messages.Length != 0 && messages[0] == value)
+ {
+ Editor.Instance.ContentEditing.Open(table);
+ return;
+ }
+ }
+ }
+ }
+ MessageBox.Show("Unable to find localized string table.");
+ }
}
}
diff --git a/Source/Editor/CustomEditors/Editors/StringEditor.cs b/Source/Editor/CustomEditors/Editors/StringEditor.cs
index 12cd29b8b..7eaf26186 100644
--- a/Source/Editor/CustomEditors/Editors/StringEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/StringEditor.cs
@@ -35,7 +35,7 @@ namespace FlaxEditor.CustomEditors.Editors
}
_element = layout.TextBox(isMultiLine);
- _defaultWatermarkColor = _element.TextBox.WatermarkTextColor;
+ _watermarkColor = _defaultWatermarkColor = _element.TextBox.WatermarkTextColor;
if (watermarkAttribute is WatermarkAttribute watermark)
{
_watermarkText = watermark.WatermarkText;
diff --git a/Source/Editor/GUI/ContextMenu/ContextMenuBase.cs b/Source/Editor/GUI/ContextMenu/ContextMenuBase.cs
index 8e878e878..37b52b20e 100644
--- a/Source/Editor/GUI/ContextMenu/ContextMenuBase.cs
+++ b/Source/Editor/GUI/ContextMenu/ContextMenuBase.cs
@@ -296,6 +296,17 @@ namespace FlaxEditor.GUI.ContextMenu
}
}
+ private static void ForceDefocus(ContainerControl c)
+ {
+ foreach (var cc in c.Children)
+ {
+ if (cc.ContainsFocus)
+ cc.Defocus();
+ if (cc is ContainerControl ccc)
+ ForceDefocus(ccc);
+ }
+ }
+
///
/// Hide popup menu and all child menus.
///
@@ -310,6 +321,9 @@ namespace FlaxEditor.GUI.ContextMenu
// Close child
HideChild();
+ // Force defocus
+ ForceDefocus(this);
+
// Unlink from window
Parent = null;
diff --git a/Source/Editor/GUI/Input/DoubleValueBox.cs b/Source/Editor/GUI/Input/DoubleValueBox.cs
index 7399f4621..a50fa86cc 100644
--- a/Source/Editor/GUI/Input/DoubleValueBox.cs
+++ b/Source/Editor/GUI/Input/DoubleValueBox.cs
@@ -41,7 +41,7 @@ namespace FlaxEditor.GUI.Input
get => _min;
set
{
- if (!Mathd.NearEqual(_min, value))
+ if (_min != value)
{
if (value > _max)
throw new ArgumentException();
@@ -58,7 +58,7 @@ namespace FlaxEditor.GUI.Input
get => _max;
set
{
- if (!Mathd.NearEqual(_max, value))
+ if (_max != value)
{
if (value < _min)
throw new ArgumentException();
diff --git a/Source/Editor/GUI/Input/FloatValueBox.cs b/Source/Editor/GUI/Input/FloatValueBox.cs
index 46e9e6502..d49f277d3 100644
--- a/Source/Editor/GUI/Input/FloatValueBox.cs
+++ b/Source/Editor/GUI/Input/FloatValueBox.cs
@@ -38,7 +38,7 @@ namespace FlaxEditor.GUI.Input
get => _min;
set
{
- if (!Mathf.NearEqual(_min, value))
+ if (_min != value)
{
if (value > _max)
throw new ArgumentException();
@@ -54,7 +54,7 @@ namespace FlaxEditor.GUI.Input
get => _max;
set
{
- if (!Mathf.NearEqual(_max, value))
+ if (_max != value)
{
if (value < _min)
throw new ArgumentException();
diff --git a/Source/Editor/GUI/Input/SliderControl.cs b/Source/Editor/GUI/Input/SliderControl.cs
index bc2523ae5..8e3efe956 100644
--- a/Source/Editor/GUI/Input/SliderControl.cs
+++ b/Source/Editor/GUI/Input/SliderControl.cs
@@ -54,7 +54,7 @@ namespace FlaxEditor.GUI.Input
set
{
value = Mathf.Clamp(value, Minimum, Maximum);
- if (!Mathf.NearEqual(value, _value))
+ if (value != _value)
{
_value = value;
@@ -311,7 +311,7 @@ namespace FlaxEditor.GUI.Input
get => _min;
set
{
- if (!Mathf.NearEqual(_min, value))
+ if (_min != value)
{
if (value > _max)
throw new ArgumentException();
@@ -330,7 +330,7 @@ namespace FlaxEditor.GUI.Input
get => _max;
set
{
- if (!Mathf.NearEqual(_max, value))
+ if (_max != value)
{
if (value < _min)
throw new ArgumentException();
diff --git a/Source/Editor/SceneGraph/ActorNodeWithIcon.cs b/Source/Editor/SceneGraph/ActorNodeWithIcon.cs
index 9e66f5d5a..f9820bb55 100644
--- a/Source/Editor/SceneGraph/ActorNodeWithIcon.cs
+++ b/Source/Editor/SceneGraph/ActorNodeWithIcon.cs
@@ -35,7 +35,8 @@ namespace FlaxEditor.SceneGraph
return false;
}
- BoundingSphere sphere = new BoundingSphere(Transform.Translation, 7.0f);
+ var center = _actor.Transform.Translation;
+ ViewportIconsRenderer.GetBounds(ref center, ref ray.Ray.Position, out var sphere);
return CollisionsHelper.RayIntersectsSphere(ref ray.Ray, ref sphere, out distance);
}
}
diff --git a/Source/Editor/Surface/Archetypes/Material.cs b/Source/Editor/Surface/Archetypes/Material.cs
index 37d6801a4..e46b1c6fb 100644
--- a/Source/Editor/Surface/Archetypes/Material.cs
+++ b/Source/Editor/Surface/Archetypes/Material.cs
@@ -534,7 +534,7 @@ namespace FlaxEditor.Surface.Archetypes
Title = "Tangent Vector",
Description = "World space tangent vector",
Flags = NodeFlags.MaterialGraph,
- Size = new Float2(160, 40),
+ Size = new Float2(160, 30),
Elements = new[]
{
NodeElementArchetype.Factory.Output(0, "Tangent", typeof(Float3), 0),
@@ -546,7 +546,7 @@ namespace FlaxEditor.Surface.Archetypes
Title = "Bitangent Vector",
Description = "World space bitangent vector",
Flags = NodeFlags.MaterialGraph,
- Size = new Float2(160, 40),
+ Size = new Float2(160, 30),
Elements = new[]
{
NodeElementArchetype.Factory.Output(0, "Bitangent", typeof(Float3), 0),
@@ -558,7 +558,7 @@ namespace FlaxEditor.Surface.Archetypes
Title = "Camera Position",
Description = "World space camera location",
Flags = NodeFlags.MaterialGraph,
- Size = new Float2(160, 40),
+ Size = new Float2(160, 30),
Elements = new[]
{
NodeElementArchetype.Factory.Output(0, "XYZ", typeof(Float3), 0),
@@ -570,7 +570,7 @@ namespace FlaxEditor.Surface.Archetypes
Title = "Per Instance Random",
Description = "Per object instance random value (normalized to range 0-1)",
Flags = NodeFlags.MaterialGraph,
- Size = new Float2(200, 40),
+ Size = new Float2(200, 30),
Elements = new[]
{
NodeElementArchetype.Factory.Output(0, "", typeof(float), 0),
diff --git a/Source/Editor/Surface/VisjectSurface.Input.cs b/Source/Editor/Surface/VisjectSurface.Input.cs
index 95610b73c..a874db681 100644
--- a/Source/Editor/Surface/VisjectSurface.Input.cs
+++ b/Source/Editor/Surface/VisjectSurface.Input.cs
@@ -488,11 +488,9 @@ namespace FlaxEditor.Surface
// Check if user is pressing control
if (Root.GetKey(KeyboardKeys.Control))
{
- // Add to selection
- if (!controlUnderMouse.IsSelected)
- {
- AddToSelection(controlUnderMouse);
- }
+ // Add/remove from selection
+ controlUnderMouse.IsSelected = !controlUnderMouse.IsSelected;
+ SelectionChanged?.Invoke();
}
// Check if node isn't selected
else if (!controlUnderMouse.IsSelected)
diff --git a/Source/Editor/Utilities/ViewportIconsRenderer.cpp b/Source/Editor/Utilities/ViewportIconsRenderer.cpp
index 2562c9bf5..1f721d289 100644
--- a/Source/Editor/Utilities/ViewportIconsRenderer.cpp
+++ b/Source/Editor/Utilities/ViewportIconsRenderer.cpp
@@ -23,8 +23,6 @@
#include "Engine/Level/Actors/SpotLight.h"
#include "Engine/Video/VideoPlayer.h"
-#define ICON_RADIUS 7.0f
-
enum class IconTypes
{
PointLight,
@@ -66,6 +64,16 @@ public:
};
ViewportIconsRendererService ViewportIconsRendererServiceInstance;
+float ViewportIconsRenderer::Scale = 1.0f;
+
+void ViewportIconsRenderer::GetBounds(const Vector3& position, const Vector3& viewPosition, BoundingSphere& bounds)
+{
+ constexpr Real minSize = 7.0;
+ constexpr Real maxSize = 30.0;
+ Real scale = Math::Square(Vector3::Distance(position, viewPosition) / 1000.0f);
+ Real radius = minSize + Math::Min(scale, 1.0f) * (maxSize - minSize);
+ bounds = BoundingSphere(position, radius * Scale);
+}
void ViewportIconsRenderer::DrawIcons(RenderContext& renderContext, Actor* actor)
{
@@ -133,7 +141,8 @@ void ViewportIconsRendererService::DrawIcons(RenderContext& renderContext, Scene
AssetReference texture;
for (Actor* icon : icons)
{
- BoundingSphere sphere(icon->GetPosition() - renderContext.View.Origin, ICON_RADIUS);
+ BoundingSphere sphere;
+ ViewportIconsRenderer::GetBounds(icon->GetPosition() - renderContext.View.Origin, renderContext.View.Position, sphere);
if (!frustum.Intersects(sphere))
continue;
IconTypes iconType;
@@ -173,7 +182,7 @@ void ViewportIconsRendererService::DrawIcons(RenderContext& renderContext, Scene
if (draw.Buffer)
{
// Create world matrix
- Matrix::Scaling(ICON_RADIUS * 2.0f, m2);
+ Matrix::Scaling((float)sphere.Radius * 2.0f, m2);
Matrix::RotationY(PI, world);
Matrix::Multiply(m2, world, m1);
Matrix::Billboard(sphere.Center, view.Position, Vector3::Up, view.Direction, m2);
@@ -193,14 +202,15 @@ void ViewportIconsRendererService::DrawIcons(RenderContext& renderContext, Actor
auto& view = renderContext.View;
const BoundingFrustum frustum = view.Frustum;
Matrix m1, m2, world;
- BoundingSphere sphere(actor->GetPosition() - renderContext.View.Origin, ICON_RADIUS);
+ BoundingSphere sphere;
+ ViewportIconsRenderer::GetBounds(actor->GetPosition() - renderContext.View.Origin, renderContext.View.Position, sphere);
IconTypes iconType;
AssetReference texture;
if (frustum.Intersects(sphere) && ActorTypeToIconType.TryGet(actor->GetTypeHandle(), iconType))
{
// Create world matrix
- Matrix::Scaling(ICON_RADIUS * 2.0f, m2);
+ Matrix::Scaling((float)sphere.Radius * 2.0f, m2);
Matrix::RotationY(PI, world);
Matrix::Multiply(m2, world, m1);
Matrix::Billboard(sphere.Center, view.Position, Vector3::Up, view.Direction, m2);
diff --git a/Source/Editor/Utilities/ViewportIconsRenderer.h b/Source/Editor/Utilities/ViewportIconsRenderer.h
index 8dab1bbf4..c7bf7e1c3 100644
--- a/Source/Editor/Utilities/ViewportIconsRenderer.h
+++ b/Source/Editor/Utilities/ViewportIconsRenderer.h
@@ -17,6 +17,19 @@ API_CLASS(Static, Namespace="FlaxEditor") class FLAXENGINE_API ViewportIconsRend
DECLARE_SCRIPTING_TYPE_NO_SPAWN(ViewportIconsRenderer);
public:
+ ///
+ /// Global scale of the icons.
+ ///
+ API_FIELD() static float Scale;
+
+ ///
+ /// Draws the icons for the actors in the given scene (or actor tree).
+ ///
+ /// The icon position.
+ /// The viewer position.
+ /// The computed bounds for the icon.
+ API_FUNCTION() static void GetBounds(API_PARAM(Ref) const Vector3& position, API_PARAM(Ref) const Vector3& viewPosition, API_PARAM(Out) BoundingSphere& bounds);
+
///
/// Draws the icons for the actors in the given scene (or actor tree).
///
diff --git a/Source/Editor/Viewport/EditorViewport.cs b/Source/Editor/Viewport/EditorViewport.cs
index 738e468b8..5956de87d 100644
--- a/Source/Editor/Viewport/EditorViewport.cs
+++ b/Source/Editor/Viewport/EditorViewport.cs
@@ -1008,6 +1008,18 @@ namespace FlaxEditor.Viewport
ViewWidgetButtonMenu.VisibleChanged += control => resolutionValue.Value = ResolutionScale;
}
+ // Icons Scale
+ {
+ var icons = ViewWidgetButtonMenu.AddButton("Icons");
+ icons.CloseMenuOnClick = false;
+ var iconsValue = new FloatValueBox(ViewportIconsRenderer.Scale, xLocationForExtras, 2, 70.0f, 0.01f, 100.0f, 0.001f)
+ {
+ Parent = icons
+ };
+ iconsValue.ValueChanged += () => ViewportIconsRenderer.Scale = iconsValue.Value;
+ ViewWidgetButtonMenu.VisibleChanged += control => iconsValue.Value = ViewportIconsRenderer.Scale;
+ }
+
#endregion View mode widget
}
diff --git a/Source/Editor/Windows/Assets/MaterialWindow.cs b/Source/Editor/Windows/Assets/MaterialWindow.cs
index c6fb5675a..df227c733 100644
--- a/Source/Editor/Windows/Assets/MaterialWindow.cs
+++ b/Source/Editor/Windows/Assets/MaterialWindow.cs
@@ -76,29 +76,29 @@ namespace FlaxEditor.Windows.Assets
// Transparency
- [EditorOrder(200), DefaultValue(MaterialTransparentLightingMode.Surface), VisibleIf(nameof(IsStandard)), EditorDisplay("Transparency"), Tooltip("Transparent material lighting mode.")]
+ [EditorOrder(200), DefaultValue(MaterialTransparentLightingMode.Surface), VisibleIf(nameof(IsForward)), EditorDisplay("Transparency"), Tooltip("Transparent material lighting mode.")]
public MaterialTransparentLightingMode TransparentLightingMode;
- [EditorOrder(205), DefaultValue(true), VisibleIf(nameof(IsStandard)), EditorDisplay("Transparency"), Tooltip("Enables reflections when rendering material.")]
+ [EditorOrder(205), DefaultValue(true), VisibleIf(nameof(IsForward)), EditorDisplay("Transparency"), Tooltip("Enables reflections when rendering material.")]
public bool EnableReflections;
[VisibleIf(nameof(EnableReflections))]
- [EditorOrder(210), DefaultValue(false), VisibleIf(nameof(IsStandard)), EditorDisplay("Transparency"), Tooltip("Enables Screen Space Reflections when rendering material.")]
+ [EditorOrder(210), DefaultValue(false), VisibleIf(nameof(IsForward)), EditorDisplay("Transparency"), Tooltip("Enables Screen Space Reflections when rendering material.")]
public bool EnableScreenSpaceReflections;
- [EditorOrder(210), DefaultValue(true), VisibleIf(nameof(IsStandard)), EditorDisplay("Transparency"), Tooltip("Enables fog effects when rendering material.")]
+ [EditorOrder(210), DefaultValue(true), VisibleIf(nameof(IsForward)), EditorDisplay("Transparency"), Tooltip("Enables fog effects when rendering material.")]
public bool EnableFog;
- [EditorOrder(220), DefaultValue(true), VisibleIf(nameof(IsStandard)), EditorDisplay("Transparency"), Tooltip("Enables distortion effect when rendering.")]
+ [EditorOrder(220), DefaultValue(true), VisibleIf(nameof(IsForward)), EditorDisplay("Transparency"), Tooltip("Enables distortion effect when rendering.")]
public bool EnableDistortion;
- [EditorOrder(224), DefaultValue(false), VisibleIf(nameof(IsStandard)), EditorDisplay("Transparency"), Tooltip("Enables sampling Global Illumination in material (eg. light probes or volumetric lightmap).")]
+ [EditorOrder(224), DefaultValue(false), VisibleIf(nameof(IsForward)), EditorDisplay("Transparency"), Tooltip("Enables sampling Global Illumination in material (eg. light probes or volumetric lightmap).")]
public bool EnableGlobalIllumination;
- [EditorOrder(225), DefaultValue(false), VisibleIf(nameof(IsStandard)), EditorDisplay("Transparency"), Tooltip("Enables refraction offset based on the difference between the per-pixel normal and the per-vertex normal. Useful for large water-like surfaces.")]
+ [EditorOrder(225), DefaultValue(false), VisibleIf(nameof(IsForward)), EditorDisplay("Transparency"), Tooltip("Enables refraction offset based on the difference between the per-pixel normal and the per-vertex normal. Useful for large water-like surfaces.")]
public bool PixelNormalOffsetRefraction;
- [EditorOrder(230), DefaultValue(0.12f), VisibleIf(nameof(IsStandard)), EditorDisplay("Transparency"), Tooltip("Controls opacity values clipping point."), Limit(0.0f, 1.0f, 0.01f)]
+ [EditorOrder(230), DefaultValue(0.12f), VisibleIf(nameof(IsForward)), EditorDisplay("Transparency"), Tooltip("Controls opacity values clipping point."), Limit(0.0f, 1.0f, 0.01f)]
public float OpacityThreshold;
// Tessellation
@@ -146,6 +146,7 @@ namespace FlaxEditor.Windows.Assets
private bool IsDecal => Domain == MaterialDomain.Decal;
private bool IsGUI => Domain == MaterialDomain.GUI;
private bool IsStandard => Domain == MaterialDomain.Surface || Domain == MaterialDomain.Terrain || Domain == MaterialDomain.Particle || Domain == MaterialDomain.Deformable;
+ private bool IsForward => Domain == MaterialDomain.Particle || ((Domain == MaterialDomain.Deformable || Domain == MaterialDomain.Surface) && BlendMode != MaterialBlendMode.Opaque);
private bool IsStandardOrGUI => IsStandard || IsGUI;
///
diff --git a/Source/Editor/Windows/Assets/ModelBaseWindow.cs b/Source/Editor/Windows/Assets/ModelBaseWindow.cs
index 1214e9427..14344ef71 100644
--- a/Source/Editor/Windows/Assets/ModelBaseWindow.cs
+++ b/Source/Editor/Windows/Assets/ModelBaseWindow.cs
@@ -254,7 +254,8 @@ namespace FlaxEditor.Windows.Assets
if (lodIndex >= countLODs - loadedLODs)
{
var mesh = lod.GetMesh(0);
- vertexLayout = mesh.VertexLayout;
+ if (mesh != null)
+ vertexLayout = mesh.VertexLayout;
if (vertexLayout != null && vertexLayout.Elements.Length != 0)
break;
vertexLayout = null;
diff --git a/Source/Engine/Content/Assets/Model.cpp b/Source/Engine/Content/Assets/Model.cpp
index 1f5768e6c..246bee3b4 100644
--- a/Source/Engine/Content/Assets/Model.cpp
+++ b/Source/Engine/Content/Assets/Model.cpp
@@ -324,7 +324,7 @@ bool Model::Init(const Span& meshesCountPerLod)
lod.Link(this, lodIndex);
lod.ScreenSize = 1.0f;
const int32 meshesCount = meshesCountPerLod[lodIndex];
- if (meshesCount <= 0 || meshesCount > MODEL_MAX_MESHES)
+ if (meshesCount < 0 || meshesCount > MODEL_MAX_MESHES)
return true;
lod.Meshes.Resize(meshesCount);
@@ -362,7 +362,7 @@ bool Model::LoadHeader(ReadStream& stream, byte& headerVersion)
// Meshes
uint16 meshesCount;
stream.ReadUint16(&meshesCount);
- if (meshesCount == 0 || meshesCount > MODEL_MAX_MESHES)
+ if (meshesCount > MODEL_MAX_MESHES)
return true;
ASSERT(lodIndex == 0 || LODs[0].Meshes.Count() >= meshesCount);
lod.Meshes.Resize(meshesCount, false);
diff --git a/Source/Engine/Content/Assets/ModelBase.cpp b/Source/Engine/Content/Assets/ModelBase.cpp
index 243e429a5..e993bbec6 100644
--- a/Source/Engine/Content/Assets/ModelBase.cpp
+++ b/Source/Engine/Content/Assets/ModelBase.cpp
@@ -665,6 +665,8 @@ bool ModelBase::SaveLOD(WriteStream& stream, const ModelData& modelData, int32 l
Array> vbElements;
const bool useSeparatePositions = !isSkinned;
const bool useSeparateColors = !isSkinned;
+ PixelFormat positionsFormat = modelData.PositionFormat == ModelData::PositionFormats::Float32 ? PixelFormat::R32G32B32_Float : PixelFormat::R16G16B16A16_Float;
+ PixelFormat texCoordsFormat = modelData.TexCoordFormat == ModelData::TexCoordFormats::Float16 ? PixelFormat::R16G16_Float : PixelFormat::R8G8_UNorm;
PixelFormat blendIndicesFormat = PixelFormat::R8G8B8A8_UInt;
PixelFormat blendWeightsFormat = PixelFormat::R8G8B8A8_UNorm;
for (const Int4& indices : mesh.BlendIndices)
@@ -677,14 +679,13 @@ bool ModelBase::SaveLOD(WriteStream& stream, const ModelData& modelData, int32 l
}
{
byte vbIndex = 0;
- // TODO: add option to quantize vertex positions (eg. 16-bit)
// TODO: add option to quantize vertex attributes (eg. 8-bit blend weights, 8-bit texcoords)
// Position
if (useSeparatePositions)
{
auto& vb0 = vbElements.AddOne();
- vb0.Add({ VertexElement::Types::Position, vbIndex, 0, 0, PixelFormat::R32G32B32_Float });
+ vb0.Add({ VertexElement::Types::Position, vbIndex, 0, 0, positionsFormat });
vbIndex++;
}
@@ -692,13 +693,13 @@ bool ModelBase::SaveLOD(WriteStream& stream, const ModelData& modelData, int32 l
{
auto& vb = vbElements.AddOne();
if (!useSeparatePositions)
- vb.Add({ VertexElement::Types::Position, vbIndex, 0, 0, PixelFormat::R32G32B32_Float });
+ vb.Add({ VertexElement::Types::Position, vbIndex, 0, 0, positionsFormat });
for (int32 channelIdx = 0; channelIdx < mesh.UVs.Count(); channelIdx++)
{
auto& channel = mesh.UVs.Get()[channelIdx];
if (channel.HasItems())
{
- vb.Add({ (VertexElement::Types)((int32)VertexElement::Types::TexCoord0 + channelIdx), vbIndex, 0, 0, PixelFormat::R16G16_Float });
+ vb.Add({ (VertexElement::Types)((int32)VertexElement::Types::TexCoord0 + channelIdx), vbIndex, 0, 0, texCoordsFormat });
}
}
vb.Add({ VertexElement::Types::Normal, vbIndex, 0, 0, PixelFormat::R10G10B10A2_UNorm });
@@ -733,7 +734,7 @@ bool ModelBase::SaveLOD(WriteStream& stream, const ModelData& modelData, int32 l
// Write vertex buffers
for (int32 vbIndex = 0; vbIndex < vbCount; vbIndex++)
{
- if (useSeparatePositions && vbIndex == 0)
+ if (useSeparatePositions && vbIndex == 0 && positionsFormat == PixelFormat::R32G32B32_Float)
{
// Fast path for vertex positions of static models using the first buffer
stream.WriteBytes(mesh.Positions.Get(), sizeof(Float3) * vertices);
@@ -751,7 +752,15 @@ bool ModelBase::SaveLOD(WriteStream& stream, const ModelData& modelData, int32 l
case VertexElement::Types::Position:
{
const Float3 position = mesh.Positions.Get()[vertex];
- stream.Write(position);
+ if (positionsFormat == PixelFormat::R16G16B16A16_Float)
+ {
+ const Half4 positionEnc(Float4(position, 0.0f));
+ stream.Write(positionEnc);
+ }
+ else //if (positionsFormat == PixelFormat::R32G32B32_Float)
+ {
+ stream.Write(position);
+ }
break;
}
case VertexElement::Types::Color:
@@ -817,8 +826,16 @@ bool ModelBase::SaveLOD(WriteStream& stream, const ModelData& modelData, int32 l
{
const int32 channelIdx = (int32)element.Type - (int32)VertexElement::Types::TexCoord0;
const Float2 uv = mesh.UVs.Get()[channelIdx].Get()[vertex];
- const Half2 uvEnc(uv);
- stream.Write(uvEnc);
+ if (texCoordsFormat == PixelFormat::R8G8_UNorm)
+ {
+ stream.Write((uint8)Math::Clamp((int32)(uv.X * 255), 0, 255));
+ stream.Write((uint8)Math::Clamp((int32)(uv.Y * 255), 0, 255));
+ }
+ else //if (texCoordsFormat == PixelFormat::R16G16_Float)
+ {
+ const Half2 uvEnc(uv);
+ stream.Write(uvEnc);
+ }
break;
}
default:
diff --git a/Source/Engine/Content/Assets/SkinnedModel.cpp b/Source/Engine/Content/Assets/SkinnedModel.cpp
index 5271df723..9ca530a53 100644
--- a/Source/Engine/Content/Assets/SkinnedModel.cpp
+++ b/Source/Engine/Content/Assets/SkinnedModel.cpp
@@ -476,7 +476,7 @@ bool SkinnedModel::Init(const Span& meshesCountPerLod)
lod._lodIndex = lodIndex;
lod.ScreenSize = 1.0f;
const int32 meshesCount = meshesCountPerLod[lodIndex];
- if (meshesCount <= 0 || meshesCount > MODEL_MAX_MESHES)
+ if (meshesCount < 0 || meshesCount > MODEL_MAX_MESHES)
return true;
lod.Meshes.Resize(meshesCount);
diff --git a/Source/Engine/Core/Math/BoundingBox.cs b/Source/Engine/Core/Math/BoundingBox.cs
index e0abe7e03..cd702d531 100644
--- a/Source/Engine/Core/Math/BoundingBox.cs
+++ b/Source/Engine/Core/Math/BoundingBox.cs
@@ -673,23 +673,23 @@ namespace FlaxEngine
///
/// Determines whether the specified is equal to this instance.
///
- /// The to compare with this instance.
+ /// The to compare with this instance.
/// true if the specified is equal to this instance; otherwise, false.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(ref BoundingBox value)
+ public bool Equals(ref BoundingBox other)
{
- return Minimum == value.Minimum && Maximum == value.Maximum;
+ return Minimum == other.Minimum && Maximum == other.Maximum;
}
///
/// Determines whether the specified is equal to this instance.
///
- /// The to compare with this instance.
+ /// The to compare with this instance.
/// true if the specified is equal to this instance; otherwise, false.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(BoundingBox value)
+ public bool Equals(BoundingBox other)
{
- return Equals(ref value);
+ return Equals(ref other);
}
///
diff --git a/Source/Engine/Core/Math/BoundingSphere.cs b/Source/Engine/Core/Math/BoundingSphere.cs
index 1a03967f4..b57177d77 100644
--- a/Source/Engine/Core/Math/BoundingSphere.cs
+++ b/Source/Engine/Core/Math/BoundingSphere.cs
@@ -487,23 +487,23 @@ namespace FlaxEngine
///
/// Determines whether the specified is equal to this instance.
///
- /// The to compare with this instance.
+ /// The to compare with this instance.
/// true if the specified is equal to this instance; otherwise, false.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(ref BoundingSphere value)
+ public bool Equals(ref BoundingSphere other)
{
- return (Center == value.Center) && (Radius == value.Radius);
+ return Center == other.Center && Radius == other.Radius;
}
///
/// Determines whether the specified is equal to this instance.
///
- /// The to compare with this instance.
+ /// The to compare with this instance.
/// true if the specified is equal to this instance; otherwise, false.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(BoundingSphere value)
+ public bool Equals(BoundingSphere other)
{
- return Equals(ref value);
+ return Equals(ref other);
}
///
diff --git a/Source/Engine/Core/Math/Color.cs b/Source/Engine/Core/Math/Color.cs
index ee7190b53..2d779dcfa 100644
--- a/Source/Engine/Core/Math/Color.cs
+++ b/Source/Engine/Core/Math/Color.cs
@@ -197,12 +197,9 @@ namespace FlaxEngine
}
///
- public override bool Equals(object other)
+ public override bool Equals(object value)
{
- if (!(other is Color))
- return false;
- var color = (Color)other;
- return Equals(ref color);
+ return value is Color other && Equals(ref other);
}
///
@@ -213,7 +210,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(ref Color other)
{
- return Mathf.NearEqual(other.R, R) && Mathf.NearEqual(other.G, G) && Mathf.NearEqual(other.B, B) && Mathf.NearEqual(other.A, A);
+ return R == other.R && G == other.G && B == other.B && A == other.A;
}
///
@@ -661,23 +658,23 @@ namespace FlaxEngine
///
/// Compares two colors.
///
- /// The left.
- /// The right.
+ /// The left.
+ /// The right.
/// True if colors are equal, otherwise false.
- public static bool operator ==(Color lhs, Color rhs)
+ public static bool operator ==(Color left, Color right)
{
- return lhs.Equals(ref rhs);
+ return left.Equals(ref right);
}
///
/// Compares two colors.
///
- /// The left.
- /// The right.
+ /// The left.
+ /// The right.
/// True if colors are not equal, otherwise false.
- public static bool operator !=(Color lhs, Color rhs)
+ public static bool operator !=(Color left, Color right)
{
- return !lhs.Equals(ref rhs);
+ return !left.Equals(ref right);
}
///
diff --git a/Source/Engine/Core/Math/Double2.cs b/Source/Engine/Core/Math/Double2.cs
index b6ef33146..9594b22cb 100644
--- a/Source/Engine/Core/Math/Double2.cs
+++ b/Source/Engine/Core/Math/Double2.cs
@@ -1464,7 +1464,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator ==(Double2 left, Double2 right)
{
- return Mathd.NearEqual(left.X, right.X) && Mathd.NearEqual(left.Y, right.Y);
+ return left.Equals(ref right);
}
///
@@ -1476,7 +1476,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator !=(Double2 left, Double2 right)
{
- return !Mathd.NearEqual(left.X, right.X) || !Mathd.NearEqual(left.Y, right.Y);
+ return !left.Equals(ref right);
}
///
@@ -1582,7 +1582,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(ref Double2 other)
{
- return Mathd.NearEqual(other.X, X) && Mathd.NearEqual(other.Y, Y);
+ return X == other.X && Y == other.Y;
}
///
@@ -1590,7 +1590,7 @@ namespace FlaxEngine
///
public static bool Equals(ref Double2 a, ref Double2 b)
{
- return Mathd.NearEqual(a.X, b.X) && Mathd.NearEqual(a.Y, b.Y);
+ return a.Equals(ref b);
}
///
@@ -1601,7 +1601,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(Double2 other)
{
- return Mathd.NearEqual(other.X, X) && Mathd.NearEqual(other.Y, Y);
+ return Equals(ref other);
}
///
@@ -1611,7 +1611,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- return value is Double2 other && Mathd.NearEqual(other.X, X) && Mathd.NearEqual(other.Y, Y);
+ return value is Double2 other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Math/Double3.cs b/Source/Engine/Core/Math/Double3.cs
index 0271612f4..cb26cf071 100644
--- a/Source/Engine/Core/Math/Double3.cs
+++ b/Source/Engine/Core/Math/Double3.cs
@@ -1759,7 +1759,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator ==(Double3 left, Double3 right)
{
- return Mathd.NearEqual(left.X, right.X) && Mathd.NearEqual(left.Y, right.Y) && Mathd.NearEqual(left.Z, right.Z);
+ return left.Equals(ref right);
}
///
@@ -1771,7 +1771,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator !=(Double3 left, Double3 right)
{
- return !Mathd.NearEqual(left.X, right.X) || !Mathd.NearEqual(left.Y, right.Y) || !Mathd.NearEqual(left.Z, right.Z);
+ return !left.Equals(ref right);
}
///
@@ -1880,7 +1880,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(ref Double3 other)
{
- return Mathd.NearEqual(other.X, X) && Mathd.NearEqual(other.Y, Y) && Mathd.NearEqual(other.Z, Z);
+ return X == other.X && Y == other.Y && Z == other.Z;
}
///
@@ -1891,7 +1891,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(Double3 other)
{
- return Mathd.NearEqual(other.X, X) && Mathd.NearEqual(other.Y, Y) && Mathd.NearEqual(other.Z, Z);
+ return Equals(ref other);
}
///
@@ -1901,7 +1901,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- return value is Double3 other && Mathd.NearEqual(other.X, X) && Mathd.NearEqual(other.Y, Y) && Mathd.NearEqual(other.Z, Z);
+ return value is Double3 other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Math/Double4.cs b/Source/Engine/Core/Math/Double4.cs
index f9f79069c..70d27cb28 100644
--- a/Source/Engine/Core/Math/Double4.cs
+++ b/Source/Engine/Core/Math/Double4.cs
@@ -1258,7 +1258,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator ==(Double4 left, Double4 right)
{
- return Mathd.NearEqual(left.X, right.X) && Mathd.NearEqual(left.Y, right.Y) && Mathd.NearEqual(left.Z, right.Z) && Mathd.NearEqual(left.W, right.W);
+ return left.Equals(ref right);
}
///
@@ -1379,7 +1379,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public bool Equals(ref Double4 other)
{
- return Mathd.NearEqual(other.X, X) && Mathd.NearEqual(other.Y, Y) && Mathd.NearEqual(other.Z, Z) && Mathd.NearEqual(other.W, W);
+ return X == other.X && Y == other.Y && Z == other.Z && W == other.W;
}
///
@@ -1390,7 +1390,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(Double4 other)
{
- return Mathd.NearEqual(other.X, X) && Mathd.NearEqual(other.Y, Y) && Mathd.NearEqual(other.Z, Z) && Mathd.NearEqual(other.W, W);
+ return Equals(ref other);
}
///
@@ -1400,7 +1400,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- return value is Double4 other && Mathd.NearEqual(other.X, X) && Mathd.NearEqual(other.Y, Y) && Mathd.NearEqual(other.Z, Z) && Mathd.NearEqual(other.W, W);
+ return value is Double4 other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Math/Float2.cs b/Source/Engine/Core/Math/Float2.cs
index 0da460889..1b70dd0a6 100644
--- a/Source/Engine/Core/Math/Float2.cs
+++ b/Source/Engine/Core/Math/Float2.cs
@@ -1540,7 +1540,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator ==(Float2 left, Float2 right)
{
- return Mathf.NearEqual(left.X, right.X) && Mathf.NearEqual(left.Y, right.Y);
+ return left.Equals(ref right);
}
///
@@ -1552,7 +1552,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator !=(Float2 left, Float2 right)
{
- return !Mathf.NearEqual(left.X, right.X) || !Mathf.NearEqual(left.Y, right.Y);
+ return !left.Equals(ref right);
}
///
@@ -1658,7 +1658,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(ref Float2 other)
{
- return Mathf.NearEqual(other.X, X) && Mathf.NearEqual(other.Y, Y);
+ return X == other.X && Y == other.Y;
}
///
@@ -1666,7 +1666,7 @@ namespace FlaxEngine
///
public static bool Equals(ref Float2 a, ref Float2 b)
{
- return Mathf.NearEqual(a.X, b.X) && Mathf.NearEqual(a.Y, b.Y);
+ return a.Equals(ref b);
}
///
@@ -1677,7 +1677,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(Float2 other)
{
- return Mathf.NearEqual(other.X, X) && Mathf.NearEqual(other.Y, Y);
+ return Equals(ref other);
}
///
@@ -1687,7 +1687,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- return value is Float2 other && Mathf.NearEqual(other.X, X) && Mathf.NearEqual(other.Y, Y);
+ return value is Float2 other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Math/Float3.cs b/Source/Engine/Core/Math/Float3.cs
index 659e6562a..5e8dceed6 100644
--- a/Source/Engine/Core/Math/Float3.cs
+++ b/Source/Engine/Core/Math/Float3.cs
@@ -1791,7 +1791,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator ==(Float3 left, Float3 right)
{
- return Mathf.NearEqual(left.X, right.X) && Mathf.NearEqual(left.Y, right.Y) && Mathf.NearEqual(left.Z, right.Z);
+ return left.Equals(ref right);
}
///
@@ -1803,7 +1803,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator !=(Float3 left, Float3 right)
{
- return !Mathf.NearEqual(left.X, right.X) || !Mathf.NearEqual(left.Y, right.Y) || !Mathf.NearEqual(left.Z, right.Z);
+ return !left.Equals(ref right);
}
///
@@ -1912,7 +1912,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(ref Float3 other)
{
- return Mathf.NearEqual(other.X, X) && Mathf.NearEqual(other.Y, Y) && Mathf.NearEqual(other.Z, Z);
+ return X == other.X && Y == other.Y && Z == other.Z;
}
///
@@ -1923,7 +1923,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(Float3 other)
{
- return Mathf.NearEqual(other.X, X) && Mathf.NearEqual(other.Y, Y) && Mathf.NearEqual(other.Z, Z);
+ return Equals(ref other);
}
///
@@ -1933,7 +1933,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- return value is Float3 other && Mathf.NearEqual(other.X, X) && Mathf.NearEqual(other.Y, Y) && Mathf.NearEqual(other.Z, Z);
+ return value is Float3 other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Math/Float4.cs b/Source/Engine/Core/Math/Float4.cs
index 2e48c9d7f..b6eb6dd9e 100644
--- a/Source/Engine/Core/Math/Float4.cs
+++ b/Source/Engine/Core/Math/Float4.cs
@@ -1288,7 +1288,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator ==(Float4 left, Float4 right)
{
- return Mathf.NearEqual(left.X, right.X) && Mathf.NearEqual(left.Y, right.Y) && Mathf.NearEqual(left.Z, right.Z) && Mathf.NearEqual(left.W, right.W);
+ return left.Equals(ref right);
}
///
@@ -1419,7 +1419,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public bool Equals(ref Float4 other)
{
- return Mathf.NearEqual(other.X, X) && Mathf.NearEqual(other.Y, Y) && Mathf.NearEqual(other.Z, Z) && Mathf.NearEqual(other.W, W);
+ return X == other.X && Y == other.Y && Z == other.Z && W == other.W;
}
///
@@ -1430,7 +1430,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(Float4 other)
{
- return Mathf.NearEqual(other.X, X) && Mathf.NearEqual(other.Y, Y) && Mathf.NearEqual(other.Z, Z) && Mathf.NearEqual(other.W, W);
+ return Equals(ref other);
}
///
@@ -1440,7 +1440,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- return value is Float4 other && Mathf.NearEqual(other.X, X) && Mathf.NearEqual(other.Y, Y) && Mathf.NearEqual(other.Z, Z) && Mathf.NearEqual(other.W, W);
+ return value is Float4 other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Math/Matrix.cpp b/Source/Engine/Core/Math/Matrix.cpp
index dea1d77d2..4a73323d3 100644
--- a/Source/Engine/Core/Math/Matrix.cpp
+++ b/Source/Engine/Core/Math/Matrix.cpp
@@ -163,7 +163,7 @@ bool Matrix::operator==(const Matrix& other) const
{
for (int32 i = 0; i < 16; i++)
{
- if (Math::NotNearEqual(other.Raw[i], Raw[i]))
+ if (other.Raw[i] != Raw[i])
return false;
}
return true;
diff --git a/Source/Engine/Core/Math/Matrix.cs b/Source/Engine/Core/Math/Matrix.cs
index 9fe1bdc49..07ab2dea9 100644
--- a/Source/Engine/Core/Math/Matrix.cs
+++ b/Source/Engine/Core/Math/Matrix.cs
@@ -3236,22 +3236,22 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public bool Equals(ref Matrix other)
{
- return Mathf.NearEqual(other.M11, M11) &&
- Mathf.NearEqual(other.M12, M12) &&
- Mathf.NearEqual(other.M13, M13) &&
- Mathf.NearEqual(other.M14, M14) &&
- Mathf.NearEqual(other.M21, M21) &&
- Mathf.NearEqual(other.M22, M22) &&
- Mathf.NearEqual(other.M23, M23) &&
- Mathf.NearEqual(other.M24, M24) &&
- Mathf.NearEqual(other.M31, M31) &&
- Mathf.NearEqual(other.M32, M32) &&
- Mathf.NearEqual(other.M33, M33) &&
- Mathf.NearEqual(other.M34, M34) &&
- Mathf.NearEqual(other.M41, M41) &&
- Mathf.NearEqual(other.M42, M42) &&
- Mathf.NearEqual(other.M43, M43) &&
- Mathf.NearEqual(other.M44, M44);
+ return other.M11 == M11 &&
+ other.M12 == M12 &&
+ other.M13 == M13 &&
+ other.M14 == M14 &&
+ other.M21 == M21 &&
+ other.M22 == M22 &&
+ other.M23 == M23 &&
+ other.M24 == M24 &&
+ other.M31 == M31 &&
+ other.M32 == M32 &&
+ other.M33 == M33 &&
+ other.M34 == M34 &&
+ other.M41 == M41 &&
+ other.M42 == M42 &&
+ other.M43 == M43 &&
+ other.M44 == M44;
}
///
@@ -3272,10 +3272,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- if (!(value is Matrix))
- return false;
- var v = (Matrix)value;
- return Equals(ref v);
+ return value is Matrix other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Math/Matrix2x2.cs b/Source/Engine/Core/Math/Matrix2x2.cs
index 250789e80..7244d41bd 100644
--- a/Source/Engine/Core/Math/Matrix2x2.cs
+++ b/Source/Engine/Core/Math/Matrix2x2.cs
@@ -483,7 +483,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public bool Equals(ref Matrix2x2 other)
{
- return Mathf.NearEqual(other.M11, M11) && Mathf.NearEqual(other.M12, M12) && Mathf.NearEqual(other.M21, M21) && Mathf.NearEqual(other.M22, M22);
+ return M11 == other.M11 && M12 == other.M12 && M21 == other.M21 && M22 == other.M22;
}
///
@@ -502,7 +502,7 @@ namespace FlaxEngine
///
public static bool Equals(ref Matrix2x2 a, ref Matrix2x2 b)
{
- return Mathf.NearEqual(a.M11, b.M11) && Mathf.NearEqual(a.M12, b.M12) && Mathf.NearEqual(a.M21, b.M21) && Mathf.NearEqual(a.M22, b.M22);
+ return a.Equals(ref b);
}
///
diff --git a/Source/Engine/Core/Math/Matrix3x3.cpp b/Source/Engine/Core/Math/Matrix3x3.cpp
index 8478b2ca1..218f2dad6 100644
--- a/Source/Engine/Core/Math/Matrix3x3.cpp
+++ b/Source/Engine/Core/Math/Matrix3x3.cpp
@@ -242,14 +242,13 @@ void Matrix3x3::Decompose(Float3& scale, Quaternion& rotation) const
bool Matrix3x3::operator==(const Matrix3x3& other) const
{
- return
- Math::NearEqual(M11, other.M11) &&
- Math::NearEqual(M12, other.M12) &&
- Math::NearEqual(M13, other.M13) &&
- Math::NearEqual(M21, other.M21) &&
- Math::NearEqual(M22, other.M22) &&
- Math::NearEqual(M23, other.M23) &&
- Math::NearEqual(M31, other.M31) &&
- Math::NearEqual(M32, other.M32) &&
- Math::NearEqual(M33, other.M33);
+ return M11 == other.M11 &&
+ M12 == other.M12 &&
+ M13 == other.M13 &&
+ M21 == other.M21 &&
+ M22 == other.M22 &&
+ M23 == other.M23 &&
+ M31 == other.M31 &&
+ M32 == other.M32 &&
+ M33 == other.M33;
}
diff --git a/Source/Engine/Core/Math/Matrix3x3.cs b/Source/Engine/Core/Math/Matrix3x3.cs
index 9522c4087..76e10ed1a 100644
--- a/Source/Engine/Core/Math/Matrix3x3.cs
+++ b/Source/Engine/Core/Math/Matrix3x3.cs
@@ -2125,15 +2125,15 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public bool Equals(ref Matrix3x3 other)
{
- return (Mathf.NearEqual(other.M11, M11) &&
- Mathf.NearEqual(other.M12, M12) &&
- Mathf.NearEqual(other.M13, M13) &&
- Mathf.NearEqual(other.M21, M21) &&
- Mathf.NearEqual(other.M22, M22) &&
- Mathf.NearEqual(other.M23, M23) &&
- Mathf.NearEqual(other.M31, M31) &&
- Mathf.NearEqual(other.M32, M32) &&
- Mathf.NearEqual(other.M33, M33));
+ return M11 == other.M11 &&
+ M12 == other.M12 &&
+ M13 == other.M13 &&
+ M21 == other.M21 &&
+ M22 == other.M22 &&
+ M23 == other.M23 &&
+ M31 == other.M31 &&
+ M32 == other.M32 &&
+ M33 == other.M33;
}
///
@@ -2152,17 +2152,7 @@ namespace FlaxEngine
///
public static bool Equals(ref Matrix3x3 a, ref Matrix3x3 b)
{
- return
- Mathf.NearEqual(a.M11, b.M11) &&
- Mathf.NearEqual(a.M12, b.M12) &&
- Mathf.NearEqual(a.M13, b.M13) &&
- Mathf.NearEqual(a.M21, b.M21) &&
- Mathf.NearEqual(a.M22, b.M22) &&
- Mathf.NearEqual(a.M23, b.M23) &&
- Mathf.NearEqual(a.M31, b.M31) &&
- Mathf.NearEqual(a.M32, b.M32) &&
- Mathf.NearEqual(a.M33, b.M33)
- ;
+ return a.Equals(ref b);
}
///
diff --git a/Source/Engine/Core/Math/OrientedBoundingBox.cs b/Source/Engine/Core/Math/OrientedBoundingBox.cs
index 8171247e6..59ffd0009 100644
--- a/Source/Engine/Core/Math/OrientedBoundingBox.cs
+++ b/Source/Engine/Core/Math/OrientedBoundingBox.cs
@@ -397,7 +397,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(ref OrientedBoundingBox value)
{
- return (Extents == value.Extents) && (Transformation == value.Transformation);
+ return Extents == value.Extents && Transformation == value.Transformation;
}
///
diff --git a/Source/Engine/Core/Math/Plane.cs b/Source/Engine/Core/Math/Plane.cs
index dc565b054..7156f4562 100644
--- a/Source/Engine/Core/Math/Plane.cs
+++ b/Source/Engine/Core/Math/Plane.cs
@@ -582,23 +582,23 @@ namespace FlaxEngine
///
/// Determines whether the specified is equal to this instance.
///
- /// The to compare with this instance.
+ /// The to compare with this instance.
/// true if the specified is equal to this instance; otherwise, false.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(ref Plane value)
+ public bool Equals(ref Plane other)
{
- return Normal == value.Normal && D == value.D;
+ return Normal == other.Normal && D == other.D;
}
///
/// Determines whether the specified is equal to this instance.
///
- /// The to compare with this instance.
+ /// The to compare with this instance.
/// true if the specified is equal to this instance; otherwise, false.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(Plane value)
+ public bool Equals(Plane other)
{
- return Equals(ref value);
+ return Equals(ref other);
}
///
@@ -608,10 +608,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- if (!(value is Plane))
- return false;
- var strongValue = (Plane)value;
- return Equals(ref strongValue);
+ return value is Plane other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Math/Quaternion.cs b/Source/Engine/Core/Math/Quaternion.cs
index 9029ed365..d89b71488 100644
--- a/Source/Engine/Core/Math/Quaternion.cs
+++ b/Source/Engine/Core/Math/Quaternion.cs
@@ -1602,7 +1602,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator ==(Quaternion left, Quaternion right)
{
- return Dot(ref left, ref right) > Tolerance;
+ return left.Equals(ref right);
}
///
@@ -1614,7 +1614,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator !=(Quaternion left, Quaternion right)
{
- return Dot(ref left, ref right) <= Tolerance;
+ return !left.Equals(ref right);
}
///
@@ -1714,8 +1714,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(ref Quaternion other)
{
- //return Dot(ref this, ref other) > Tolerance;
- return Mathf.NearEqual(other.X, X) && Mathf.NearEqual(other.Y, Y) && Mathf.NearEqual(other.Z, Z) && Mathf.NearEqual(other.W, W);
+ return X == other.X && Y == other.Y && Z == other.Z && W == other.W;
}
///
@@ -1736,10 +1735,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- if (!(value is Quaternion))
- return false;
- var strongValue = (Quaternion)value;
- return Equals(ref strongValue);
+ return value is Quaternion other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Math/Quaternion.h b/Source/Engine/Core/Math/Quaternion.h
index 2e300811a..965f92078 100644
--- a/Source/Engine/Core/Math/Quaternion.h
+++ b/Source/Engine/Core/Math/Quaternion.h
@@ -348,7 +348,7 @@ public:
/// true if the specified is equal to this instance; otherwise, false.
FORCE_INLINE bool operator==(const Quaternion& other) const
{
- return Dot(*this, other) > Tolerance;
+ return X == other.X && Y == other.Y && Z == other.Z && W == other.W;
}
///
@@ -358,7 +358,7 @@ public:
/// true if the specified isn't equal to this instance; otherwise, false.
FORCE_INLINE bool operator!=(const Quaternion& other) const
{
- return Dot(*this, other) < Tolerance;
+ return X != other.X || Y != other.Y || Z != other.Z || W != other.W;
}
public:
diff --git a/Source/Engine/Core/Math/Ray.cs b/Source/Engine/Core/Math/Ray.cs
index 3f5bde0e6..36203cbf7 100644
--- a/Source/Engine/Core/Math/Ray.cs
+++ b/Source/Engine/Core/Math/Ray.cs
@@ -428,23 +428,23 @@ namespace FlaxEngine
///
/// Determines whether the specified is equal to this instance.
///
- /// The to compare with this instance.
+ /// The to compare with this instance.
/// true if the specified is equal to this instance; otherwise, false.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(ref Ray value)
+ public bool Equals(ref Ray other)
{
- return (Position == value.Position) && (Direction == value.Direction);
+ return Position == other.Position && Direction == other.Direction;
}
///
/// Determines whether the specified is equal to this instance.
///
- /// The to compare with this instance.
+ /// The to compare with this instance.
/// true if the specified is equal to this instance; otherwise, false.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(Ray value)
+ public bool Equals(Ray other)
{
- return Equals(ref value);
+ return Equals(ref other);
}
///
diff --git a/Source/Engine/Core/Math/Rectangle.cs b/Source/Engine/Core/Math/Rectangle.cs
index ee2a1703c..81c689d48 100644
--- a/Source/Engine/Core/Math/Rectangle.cs
+++ b/Source/Engine/Core/Math/Rectangle.cs
@@ -499,21 +499,19 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(ref Rectangle other)
{
- return Location.Equals(ref other.Location) && Size.Equals(ref other.Size);
+ return Location == other.Location && Size == other.Size;
}
///
public bool Equals(Rectangle other)
{
- return Location.Equals(ref other.Location) && Size.Equals(ref other.Size);
+ return Equals(ref other);
}
///
public override bool Equals(object obj)
{
- if (ReferenceEquals(null, obj))
- return false;
- return obj is Rectangle && Equals((Rectangle)obj);
+ return obj is Rectangle other && Equals(ref other);
}
///
diff --git a/Source/Engine/Core/Math/Vector2.cs b/Source/Engine/Core/Math/Vector2.cs
index ae317897b..8e1599513 100644
--- a/Source/Engine/Core/Math/Vector2.cs
+++ b/Source/Engine/Core/Math/Vector2.cs
@@ -1654,7 +1654,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator ==(Vector2 left, Vector2 right)
{
- return Mathr.NearEqual(left.X, right.X) && Mathr.NearEqual(left.Y, right.Y);
+ return left.Equals(ref right);
}
///
@@ -1666,7 +1666,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator !=(Vector2 left, Vector2 right)
{
- return !Mathr.NearEqual(left.X, right.X) || !Mathr.NearEqual(left.Y, right.Y);
+ return !left.Equals(ref right);
}
///
@@ -1782,7 +1782,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(ref Vector2 other)
{
- return Mathr.NearEqual(other.X, X) && Mathr.NearEqual(other.Y, Y);
+ return X == other.X && Y == other.Y;
}
///
@@ -1790,7 +1790,7 @@ namespace FlaxEngine
///
public static bool Equals(ref Vector2 a, ref Vector2 b)
{
- return Mathr.NearEqual(a.X, b.X) && Mathr.NearEqual(a.Y, b.Y);
+ return a.Equals(ref b);
}
///
@@ -1801,7 +1801,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(Vector2 other)
{
- return Mathr.NearEqual(other.X, X) && Mathr.NearEqual(other.Y, Y);
+ return Equals(ref other);
}
///
@@ -1811,7 +1811,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- return value is Vector2 other && Mathr.NearEqual(other.X, X) && Mathr.NearEqual(other.Y, Y);
+ return value is Vector2 other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Math/Vector3.cs b/Source/Engine/Core/Math/Vector3.cs
index 845cf2f97..5e01a7a6c 100644
--- a/Source/Engine/Core/Math/Vector3.cs
+++ b/Source/Engine/Core/Math/Vector3.cs
@@ -2010,7 +2010,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator ==(Vector3 left, Vector3 right)
{
- return Mathr.NearEqual(left.X, right.X) && Mathr.NearEqual(left.Y, right.Y) && Mathr.NearEqual(left.Z, right.Z);
+ return left.Equals(ref right);
}
///
@@ -2022,7 +2022,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator !=(Vector3 left, Vector3 right)
{
- return !Mathr.NearEqual(left.X, right.X) || !Mathr.NearEqual(left.Y, right.Y) || !Mathr.NearEqual(left.Z, right.Z);
+ return !left.Equals(ref right);
}
///
@@ -2141,7 +2141,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(ref Vector3 other)
{
- return Mathr.NearEqual(other.X, X) && Mathr.NearEqual(other.Y, Y) && Mathr.NearEqual(other.Z, Z);
+ return X == other.X && Y == other.Y && Z == other.Z;
}
///
@@ -2152,7 +2152,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(Vector3 other)
{
- return Mathr.NearEqual(other.X, X) && Mathr.NearEqual(other.Y, Y) && Mathr.NearEqual(other.Z, Z);
+ return Equals(ref other);
}
///
@@ -2162,7 +2162,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- return value is Vector3 other && Mathr.NearEqual(other.X, X) && Mathr.NearEqual(other.Y, Y) && Mathr.NearEqual(other.Z, Z);
+ return value is Vector3 other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Math/Vector4.cs b/Source/Engine/Core/Math/Vector4.cs
index 1564a9ee0..e50d03ca0 100644
--- a/Source/Engine/Core/Math/Vector4.cs
+++ b/Source/Engine/Core/Math/Vector4.cs
@@ -1362,7 +1362,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator ==(Vector4 left, Vector4 right)
{
- return Mathr.NearEqual(left.X, right.X) && Mathr.NearEqual(left.Y, right.Y) && Mathr.NearEqual(left.Z, right.Z) && Mathr.NearEqual(left.W, right.W);
+ return left.Equals(ref right);
}
///
@@ -1493,7 +1493,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public bool Equals(ref Vector4 other)
{
- return Mathr.NearEqual(other.X, X) && Mathr.NearEqual(other.Y, Y) && Mathr.NearEqual(other.Z, Z) && Mathr.NearEqual(other.W, W);
+ return X == other.X && Y == other.Y && Z == other.Z && W == other.W;
}
///
@@ -1504,7 +1504,7 @@ namespace FlaxEngine
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(Vector4 other)
{
- return Mathr.NearEqual(other.X, X) && Mathr.NearEqual(other.Y, Y) && Mathr.NearEqual(other.Z, Z) && Mathr.NearEqual(other.W, W);
+ return Equals(ref other);
}
///
@@ -1514,7 +1514,7 @@ namespace FlaxEngine
/// true if the specified is equal to this instance; otherwise, false.
public override bool Equals(object value)
{
- return value is Vector4 other && Mathr.NearEqual(other.X, X) && Mathr.NearEqual(other.Y, Y) && Mathr.NearEqual(other.Z, Z) && Mathr.NearEqual(other.W, W);
+ return value is Vector4 other && Equals(ref other);
}
}
}
diff --git a/Source/Engine/Core/Types/Variant.cpp b/Source/Engine/Core/Types/Variant.cpp
index f45856443..a8a3b6b9f 100644
--- a/Source/Engine/Core/Types/Variant.cpp
+++ b/Source/Engine/Core/Types/Variant.cpp
@@ -1162,9 +1162,9 @@ bool Variant::operator==(const Variant& other) const
case VariantType::Enum:
return AsEnum == other.AsEnum;
case VariantType::Float:
- return Math::NearEqual(AsFloat, other.AsFloat);
+ return AsFloat == other.AsFloat;
case VariantType::Double:
- return Math::Abs(AsDouble - other.AsDouble) < ZeroTolerance;
+ return AsDouble == other.AsDouble;
case VariantType::Pointer:
return AsPointer == other.AsPointer;
case VariantType::String:
diff --git a/Source/Engine/Foliage/FoliageInstance.h b/Source/Engine/Foliage/FoliageInstance.h
index 5022d12be..76037f0f4 100644
--- a/Source/Engine/Foliage/FoliageInstance.h
+++ b/Source/Engine/Foliage/FoliageInstance.h
@@ -52,7 +52,7 @@ API_STRUCT(NoPod) struct FLAXENGINE_API FoliageInstance
public:
bool operator==(const FoliageInstance& v) const
{
- return Type == v.Type && Math::NearEqual(Random, v.Random) && Transform == v.Transform;
+ return Type == v.Type && Random == v.Random && Transform == v.Transform;
}
///
diff --git a/Source/Engine/Graphics/Models/ModelData.h b/Source/Engine/Graphics/Models/ModelData.h
index 4566e764b..8e401b973 100644
--- a/Source/Engine/Graphics/Models/ModelData.h
+++ b/Source/Engine/Graphics/Models/ModelData.h
@@ -428,6 +428,21 @@ public:
///
Array Animations;
+public:
+ // See ModelTool::PositionFormat
+ enum class PositionFormats
+ {
+ Float32,
+ Float16,
+ } PositionFormat = PositionFormats::Float32;
+
+ // See ModelTool::TexCoordFormats
+ enum class TexCoordFormats
+ {
+ Float16,
+ UNorm8,
+ } TexCoordFormat = TexCoordFormats::Float16;
+
public:
///
/// Automatically calculates the screen size for every model LOD for a proper transitions.
diff --git a/Source/Engine/Input/Input.cpp b/Source/Engine/Input/Input.cpp
index b2850b2d5..eaff89ad5 100644
--- a/Source/Engine/Input/Input.cpp
+++ b/Source/Engine/Input/Input.cpp
@@ -1236,7 +1236,7 @@ void InputService::Update()
{
for (auto i = Axes.Begin(); i.IsNotEnd(); ++i)
{
- if (Math::NotNearEqual(i->Value.Value, i->Value.PrevValue))
+ if (i->Value.Value != i->Value.PrevValue)
{
Input::AxisValueChanged(i->Key);
}
diff --git a/Source/Engine/Level/Actor.cpp b/Source/Engine/Level/Actor.cpp
index 4989f2c49..0c0a98e14 100644
--- a/Source/Engine/Level/Actor.cpp
+++ b/Source/Engine/Level/Actor.cpp
@@ -36,8 +36,6 @@
#define CHECK_EXECUTE_IN_EDITOR
#endif
-#define ACTOR_ORIENTATION_EPSILON 0.000000001f
-
// Start loop over actor children/scripts from the beginning to account for any newly added or removed actors.
#define ACTOR_LOOP_START_MODIFIED_HIERARCHY() _isHierarchyDirty = false
#define ACTOR_LOOP_CHECK_MODIFIED_HIERARCHY() if (_isHierarchyDirty) { _isHierarchyDirty = false; i = -1; }
@@ -660,7 +658,7 @@ void Actor::SetStaticFlags(StaticFlags value)
void Actor::SetTransform(const Transform& value)
{
CHECK(!value.IsNanOrInfinity());
- if (!(Vector3::NearEqual(_transform.Translation, value.Translation) && Quaternion::NearEqual(_transform.Orientation, value.Orientation, ACTOR_ORIENTATION_EPSILON) && Float3::NearEqual(_transform.Scale, value.Scale)))
+ if (_transform.Translation != value.Translation || _transform.Orientation != value.Orientation || _transform.Scale != value.Scale)
{
if (_parent)
_parent->_transform.WorldToLocal(value, _localTransform);
@@ -673,7 +671,7 @@ void Actor::SetTransform(const Transform& value)
void Actor::SetPosition(const Vector3& value)
{
CHECK(!value.IsNanOrInfinity());
- if (!Vector3::NearEqual(_transform.Translation, value))
+ if (_transform.Translation != value)
{
if (_parent)
_localTransform.Translation = _parent->_transform.WorldToLocal(value);
@@ -686,7 +684,7 @@ void Actor::SetPosition(const Vector3& value)
void Actor::SetOrientation(const Quaternion& value)
{
CHECK(!value.IsNanOrInfinity());
- if (!Quaternion::NearEqual(_transform.Orientation, value, ACTOR_ORIENTATION_EPSILON))
+ if (_transform.Orientation != value)
{
if (_parent)
_parent->_transform.WorldToLocal(value, _localTransform.Orientation);
@@ -699,7 +697,7 @@ void Actor::SetOrientation(const Quaternion& value)
void Actor::SetScale(const Float3& value)
{
CHECK(!value.IsNanOrInfinity());
- if (!Float3::NearEqual(_transform.Scale, value))
+ if (_transform.Scale != value)
{
if (_parent)
Float3::Divide(value, _parent->_transform.Scale, _localTransform.Scale);
@@ -748,7 +746,7 @@ void Actor::ResetLocalTransform()
void Actor::SetLocalTransform(const Transform& value)
{
CHECK(!value.IsNanOrInfinity());
- if (!(Vector3::NearEqual(_localTransform.Translation, value.Translation) && Quaternion::NearEqual(_localTransform.Orientation, value.Orientation, ACTOR_ORIENTATION_EPSILON) && Float3::NearEqual(_localTransform.Scale, value.Scale)))
+ if (_localTransform.Translation != value.Translation || _localTransform.Orientation != value.Orientation || _localTransform.Scale != value.Scale)
{
_localTransform = value;
OnTransformChanged();
@@ -758,7 +756,7 @@ void Actor::SetLocalTransform(const Transform& value)
void Actor::SetLocalPosition(const Vector3& value)
{
CHECK(!value.IsNanOrInfinity());
- if (!Vector3::NearEqual(_localTransform.Translation, value))
+ if (_localTransform.Translation != value)
{
_localTransform.Translation = value;
OnTransformChanged();
@@ -770,7 +768,7 @@ void Actor::SetLocalOrientation(const Quaternion& value)
CHECK(!value.IsNanOrInfinity());
Quaternion v = value;
v.Normalize();
- if (!Quaternion::NearEqual(_localTransform.Orientation, v, ACTOR_ORIENTATION_EPSILON))
+ if (_localTransform.Orientation != value)
{
_localTransform.Orientation = v;
OnTransformChanged();
@@ -780,7 +778,7 @@ void Actor::SetLocalOrientation(const Quaternion& value)
void Actor::SetLocalScale(const Float3& value)
{
CHECK(!value.IsNanOrInfinity());
- if (!Float3::NearEqual(_localTransform.Scale, value))
+ if (_localTransform.Scale != value)
{
_localTransform.Scale = value;
OnTransformChanged();
diff --git a/Source/Engine/Level/Actors/BoxBrush.cpp b/Source/Engine/Level/Actors/BoxBrush.cpp
index 64f4d208a..06bc047bc 100644
--- a/Source/Engine/Level/Actors/BoxBrush.cpp
+++ b/Source/Engine/Level/Actors/BoxBrush.cpp
@@ -65,7 +65,7 @@ void BoxBrush::SetMode(BrushMode value)
void BoxBrush::SetCenter(const Vector3& value)
{
- if (Vector3::NearEqual(value, _center))
+ if (value == _center)
return;
_center = value;
@@ -77,7 +77,7 @@ void BoxBrush::SetCenter(const Vector3& value)
void BoxBrush::SetSize(const Vector3& value)
{
- if (Vector3::NearEqual(value, _size))
+ if (value == _size)
return;
_size = value;
diff --git a/Source/Engine/Level/Actors/BoxVolume.cpp b/Source/Engine/Level/Actors/BoxVolume.cpp
index bbce7db28..505f18dd5 100644
--- a/Source/Engine/Level/Actors/BoxVolume.cpp
+++ b/Source/Engine/Level/Actors/BoxVolume.cpp
@@ -12,7 +12,7 @@ BoxVolume::BoxVolume(const SpawnParams& params)
void BoxVolume::SetSize(const Vector3& value)
{
- if (!Vector3::NearEqual(value, _size))
+ if (value != _size)
{
const auto prevBounds = _box;
_size = value;
diff --git a/Source/Engine/Level/Actors/Camera.cpp b/Source/Engine/Level/Actors/Camera.cpp
index ef8bd812a..490f9d786 100644
--- a/Source/Engine/Level/Actors/Camera.cpp
+++ b/Source/Engine/Level/Actors/Camera.cpp
@@ -70,7 +70,7 @@ float Camera::GetFieldOfView() const
void Camera::SetFieldOfView(float value)
{
value = Math::Clamp(value, 1.0f, 179.9f);
- if (Math::NotNearEqual(_fov, value))
+ if (_fov != value)
{
_fov = value;
UpdateCache();
@@ -85,7 +85,7 @@ float Camera::GetCustomAspectRatio() const
void Camera::SetCustomAspectRatio(float value)
{
value = Math::Clamp(value, 0.0f, 100.0f);
- if (Math::NotNearEqual(_customAspectRatio, value))
+ if (_customAspectRatio != value)
{
_customAspectRatio = value;
UpdateCache();
@@ -100,7 +100,7 @@ float Camera::GetNearPlane() const
void Camera::SetNearPlane(float value)
{
value = Math::Clamp(value, 0.001f, _far - 1.0f);
- if (Math::NotNearEqual(_near, value))
+ if (_near != value)
{
_near = value;
UpdateCache();
@@ -115,7 +115,7 @@ float Camera::GetFarPlane() const
void Camera::SetFarPlane(float value)
{
value = Math::Max(value, _near + 1.0f);
- if (Math::NotNearEqual(_far, value))
+ if (_far != value)
{
_far = value;
UpdateCache();
@@ -130,7 +130,7 @@ float Camera::GetOrthographicSize() const
void Camera::SetOrthographicSize(float value)
{
value = Math::Clamp(value, 0.0f, 1000000.0f);
- if (Math::NotNearEqual(_orthoSize, value))
+ if (_orthoSize != value)
{
_orthoSize = value;
UpdateCache();
@@ -145,7 +145,7 @@ float Camera::GetOrthographicScale() const
void Camera::SetOrthographicScale(float value)
{
value = Math::Clamp(value, 0.0001f, 1000000.0f);
- if (Math::NotNearEqual(_orthoScale, value))
+ if (_orthoScale != value)
{
_orthoScale = value;
UpdateCache();
diff --git a/Source/Engine/Level/Actors/EnvironmentProbe.cpp b/Source/Engine/Level/Actors/EnvironmentProbe.cpp
index 9e6827ff7..3c49611d4 100644
--- a/Source/Engine/Level/Actors/EnvironmentProbe.cpp
+++ b/Source/Engine/Level/Actors/EnvironmentProbe.cpp
@@ -41,7 +41,7 @@ float EnvironmentProbe::GetRadius() const
void EnvironmentProbe::SetRadius(float value)
{
value = Math::Max(0.0f, value);
- if (Math::NearEqual(value, _radius))
+ if (value == _radius)
return;
_radius = value;
diff --git a/Source/Engine/Level/Actors/PointLight.cpp b/Source/Engine/Level/Actors/PointLight.cpp
index 94f1e77c6..607bf1bc4 100644
--- a/Source/Engine/Level/Actors/PointLight.cpp
+++ b/Source/Engine/Level/Actors/PointLight.cpp
@@ -49,7 +49,7 @@ float PointLight::GetScaledRadius() const
void PointLight::SetRadius(float value)
{
value = Math::Max(0.0f, value);
- if (Math::NearEqual(value, _radius))
+ if (value == _radius)
return;
_radius = value;
diff --git a/Source/Engine/Level/Actors/SkyLight.cpp b/Source/Engine/Level/Actors/SkyLight.cpp
index 498d28663..4e1c0e58c 100644
--- a/Source/Engine/Level/Actors/SkyLight.cpp
+++ b/Source/Engine/Level/Actors/SkyLight.cpp
@@ -26,7 +26,7 @@ SkyLight::SkyLight(const SpawnParams& params)
void SkyLight::SetRadius(float value)
{
value = Math::Max(0.0f, value);
- if (Math::NearEqual(value, _radius))
+ if (value == _radius)
return;
_radius = value;
diff --git a/Source/Engine/Level/Actors/SplineModel.cpp b/Source/Engine/Level/Actors/SplineModel.cpp
index e4fcff857..8680fb8d5 100644
--- a/Source/Engine/Level/Actors/SplineModel.cpp
+++ b/Source/Engine/Level/Actors/SplineModel.cpp
@@ -59,7 +59,7 @@ float SplineModel::GetQuality() const
void SplineModel::SetQuality(float value)
{
value = Math::Clamp(value, 0.0f, 100.0f);
- if (Math::NearEqual(value, _quality))
+ if (value == _quality)
return;
_quality = value;
OnSplineUpdated();
@@ -72,7 +72,7 @@ float SplineModel::GetBoundsScale() const
void SplineModel::SetBoundsScale(float value)
{
- if (Math::NearEqual(_boundsScale, value))
+ if (_boundsScale == value)
return;
_boundsScale = value;
OnSplineUpdated();
diff --git a/Source/Engine/Level/Actors/SpotLight.cpp b/Source/Engine/Level/Actors/SpotLight.cpp
index ca577c41f..85b77647a 100644
--- a/Source/Engine/Level/Actors/SpotLight.cpp
+++ b/Source/Engine/Level/Actors/SpotLight.cpp
@@ -57,7 +57,7 @@ float SpotLight::GetScaledRadius() const
void SpotLight::SetRadius(float value)
{
value = Math::Max(0.0f, value);
- if (Math::NearEqual(value, _radius))
+ if (value == _radius)
return;
_radius = value;
@@ -70,7 +70,7 @@ void SpotLight::SetOuterConeAngle(float value)
value = Math::Clamp(value, 0.0f, 89.0f);
// Check if value will change
- if (!Math::NearEqual(value, _outerConeAngle))
+ if (value != _outerConeAngle)
{
// Change values
_innerConeAngle = Math::Min(_innerConeAngle, value - ZeroTolerance);
@@ -86,7 +86,7 @@ void SpotLight::SetInnerConeAngle(float value)
value = Math::Clamp(value, 0.0f, 89.0f);
// Check if value will change
- if (!Math::NearEqual(value, _innerConeAngle))
+ if (value != _innerConeAngle)
{
// Change values
_innerConeAngle = value;
diff --git a/Source/Engine/Level/Actors/StaticModel.cpp b/Source/Engine/Level/Actors/StaticModel.cpp
index f944da26b..38c1eed90 100644
--- a/Source/Engine/Level/Actors/StaticModel.cpp
+++ b/Source/Engine/Level/Actors/StaticModel.cpp
@@ -60,7 +60,7 @@ float StaticModel::GetBoundsScale() const
void StaticModel::SetBoundsScale(float value)
{
- if (Math::NearEqual(_boundsScale, value))
+ if (_boundsScale == value)
return;
_boundsScale = value;
diff --git a/Source/Engine/Navigation/NavMeshRuntime.cpp b/Source/Engine/Navigation/NavMeshRuntime.cpp
index baa8b0320..37e09294d 100644
--- a/Source/Engine/Navigation/NavMeshRuntime.cpp
+++ b/Source/Engine/Navigation/NavMeshRuntime.cpp
@@ -292,7 +292,7 @@ void NavMeshRuntime::SetTileSize(float tileSize)
ScopeLock lock(Locker);
// Skip if the same or invalid
- if (Math::NearEqual(_tileSize, tileSize) || tileSize < 1)
+ if (_tileSize == tileSize || tileSize < 1)
return;
// Dispose the existing mesh (its invalid)
diff --git a/Source/Engine/Navigation/Navigation.cpp b/Source/Engine/Navigation/Navigation.cpp
index 446464634..570db86c7 100644
--- a/Source/Engine/Navigation/Navigation.cpp
+++ b/Source/Engine/Navigation/Navigation.cpp
@@ -107,7 +107,7 @@ Color NavMeshRuntime::NavAreasColors[64];
bool NavAgentProperties::operator==(const NavAgentProperties& other) const
{
- return Math::NearEqual(Radius, other.Radius) && Math::NearEqual(Height, other.Height) && Math::NearEqual(StepHeight, other.StepHeight) && Math::NearEqual(MaxSlopeAngle, other.MaxSlopeAngle) && Math::NearEqual(MaxSpeed, other.MaxSpeed) && Math::NearEqual(CrowdSeparationWeight, other.CrowdSeparationWeight);
+ return Radius == other.Radius && Height == other.Height && StepHeight == other.StepHeight && MaxSlopeAngle == other.MaxSlopeAngle && MaxSpeed == other.MaxSpeed && CrowdSeparationWeight == other.CrowdSeparationWeight;
}
bool NavAgentMask::IsAgentSupported(int32 agentIndex) const
@@ -148,12 +148,12 @@ bool NavAgentMask::operator==(const NavAgentMask& other) const
bool NavAreaProperties::operator==(const NavAreaProperties& other) const
{
- return Name == other.Name && Id == other.Id && Math::NearEqual(Cost, other.Cost);
+ return Name == other.Name && Id == other.Id && Cost == other.Cost;
}
bool NavMeshProperties::operator==(const NavMeshProperties& other) const
{
- return Name == other.Name && Quaternion::NearEqual(Rotation, other.Rotation, 0.001f) && Agent == other.Agent && Vector3::NearEqual(DefaultQueryExtent, other.DefaultQueryExtent);
+ return Name == other.Name && Rotation == other.Rotation && Agent == other.Agent && DefaultQueryExtent == other.DefaultQueryExtent;
}
class NavigationService : public EngineService
diff --git a/Source/Engine/Physics/Actors/RigidBody.cpp b/Source/Engine/Physics/Actors/RigidBody.cpp
index 23b32598e..a58911dfb 100644
--- a/Source/Engine/Physics/Actors/RigidBody.cpp
+++ b/Source/Engine/Physics/Actors/RigidBody.cpp
@@ -44,7 +44,7 @@ void RigidBody::SetIsKinematic(const bool value)
void RigidBody::SetLinearDamping(float value)
{
- if (Math::NearEqual(value, _linearDamping))
+ if (value == _linearDamping)
return;
_linearDamping = value;
if (_actor)
@@ -53,7 +53,7 @@ void RigidBody::SetLinearDamping(float value)
void RigidBody::SetAngularDamping(float value)
{
- if (Math::NearEqual(value, _angularDamping))
+ if (value == _angularDamping)
return;
_angularDamping = value;
if (_actor)
@@ -108,7 +108,7 @@ void RigidBody::SetUpdateMassWhenScaleChanges(bool value)
void RigidBody::SetMaxAngularVelocity(float value)
{
- if (Math::NearEqual(value, _maxAngularVelocity))
+ if (value == _maxAngularVelocity)
return;
_maxAngularVelocity = value;
if (_actor)
@@ -135,7 +135,7 @@ float RigidBody::GetMass() const
void RigidBody::SetMass(float value)
{
- if (Math::NearEqual(value, _mass))
+ if (value == _mass)
return;
_mass = value;
_overrideMass = true;
@@ -149,7 +149,7 @@ float RigidBody::GetMassScale() const
void RigidBody::SetMassScale(float value)
{
- if (Math::NearEqual(value, _massScale))
+ if (value == _massScale)
return;
_massScale = value;
UpdateMass();
@@ -157,7 +157,7 @@ void RigidBody::SetMassScale(float value)
void RigidBody::SetCenterOfMassOffset(const Float3& value)
{
- if (Float3::NearEqual(value, _centerOfMassOffset))
+ if (value == _centerOfMassOffset)
return;
_centerOfMassOffset = value;
if (_actor)
@@ -380,7 +380,7 @@ void RigidBody::UpdateBounds()
void RigidBody::UpdateScale()
{
const Float3 scale = GetScale();
- if (Float3::NearEqual(_cachedScale, scale))
+ if (_cachedScale == scale)
return;
_cachedScale = scale;
diff --git a/Source/Engine/Physics/Colliders/BoxCollider.cpp b/Source/Engine/Physics/Colliders/BoxCollider.cpp
index 78e9e4207..0bc6dcc68 100644
--- a/Source/Engine/Physics/Colliders/BoxCollider.cpp
+++ b/Source/Engine/Physics/Colliders/BoxCollider.cpp
@@ -12,7 +12,7 @@ BoxCollider::BoxCollider(const SpawnParams& params)
void BoxCollider::SetSize(const Float3& value)
{
- if (Float3::NearEqual(value, _size))
+ if (value == _size)
return;
_size = value;
diff --git a/Source/Engine/Physics/Colliders/CapsuleCollider.cpp b/Source/Engine/Physics/Colliders/CapsuleCollider.cpp
index e85c7075d..78820d0a6 100644
--- a/Source/Engine/Physics/Colliders/CapsuleCollider.cpp
+++ b/Source/Engine/Physics/Colliders/CapsuleCollider.cpp
@@ -11,7 +11,7 @@ CapsuleCollider::CapsuleCollider(const SpawnParams& params)
void CapsuleCollider::SetRadius(const float value)
{
- if (Math::NearEqual(value, _radius))
+ if (value == _radius)
return;
_radius = value;
@@ -22,7 +22,7 @@ void CapsuleCollider::SetRadius(const float value)
void CapsuleCollider::SetHeight(const float value)
{
- if (Math::NearEqual(value, _height))
+ if (value == _height)
return;
_height = value;
diff --git a/Source/Engine/Physics/Colliders/CharacterController.cpp b/Source/Engine/Physics/Colliders/CharacterController.cpp
index 6bfe1514c..57e0a92a2 100644
--- a/Source/Engine/Physics/Colliders/CharacterController.cpp
+++ b/Source/Engine/Physics/Colliders/CharacterController.cpp
@@ -33,7 +33,7 @@ float CharacterController::GetRadius() const
void CharacterController::SetRadius(const float value)
{
- if (Math::NearEqual(value, _radius))
+ if (value == _radius)
return;
_radius = value;
@@ -49,7 +49,7 @@ float CharacterController::GetHeight() const
void CharacterController::SetHeight(const float value)
{
- if (Math::NearEqual(value, _height))
+ if (value == _height)
return;
_height = value;
@@ -66,7 +66,7 @@ float CharacterController::GetSlopeLimit() const
void CharacterController::SetSlopeLimit(float value)
{
value = Math::Clamp(value, 0.0f, 89.0f);
- if (Math::NearEqual(value, _slopeLimit))
+ if (value == _slopeLimit)
return;
_slopeLimit = value;
if (_controller)
@@ -94,7 +94,7 @@ float CharacterController::GetStepOffset() const
void CharacterController::SetStepOffset(float value)
{
- if (Math::NearEqual(value, _stepOffset))
+ if (value == _stepOffset)
return;
_stepOffset = value;
@@ -384,7 +384,7 @@ void CharacterController::OnTransformChanged()
{
PhysicsBackend::SetControllerPosition(_controller, position);
const Float3 scale = GetScale();
- if (!Float3::NearEqual(_cachedScale, scale))
+ if (_cachedScale != scale)
UpdateGeometry();
UpdateBounds();
}
diff --git a/Source/Engine/Physics/Colliders/Collider.cpp b/Source/Engine/Physics/Colliders/Collider.cpp
index 39ef47686..04fe0a2a8 100644
--- a/Source/Engine/Physics/Colliders/Collider.cpp
+++ b/Source/Engine/Physics/Colliders/Collider.cpp
@@ -49,7 +49,7 @@ void Collider::SetIsTrigger(bool value)
void Collider::SetCenter(const Vector3& value)
{
- if (Vector3::NearEqual(value, _center))
+ if (value == _center)
return;
_center = value;
if (_staticActor)
@@ -62,7 +62,7 @@ void Collider::SetCenter(const Vector3& value)
void Collider::SetContactOffset(float value)
{
value = Math::Clamp(value, 0.0f, 100.0f);
- if (Math::NearEqual(value, _contactOffset))
+ if (value == _contactOffset)
return;
_contactOffset = value;
if (_shape)
@@ -428,7 +428,7 @@ void Collider::OnTransformChanged()
}
const Float3 scale = GetScale();
- if (!Float3::NearEqual(_cachedScale, scale))
+ if (_cachedScale != scale)
UpdateGeometry();
UpdateBounds();
}
diff --git a/Source/Engine/Physics/Colliders/SphereCollider.cpp b/Source/Engine/Physics/Colliders/SphereCollider.cpp
index 3c5e78350..897a34a51 100644
--- a/Source/Engine/Physics/Colliders/SphereCollider.cpp
+++ b/Source/Engine/Physics/Colliders/SphereCollider.cpp
@@ -10,7 +10,7 @@ SphereCollider::SphereCollider(const SpawnParams& params)
void SphereCollider::SetRadius(const float value)
{
- if (Math::NearEqual(value, _radius))
+ if (value == _radius)
return;
_radius = value;
diff --git a/Source/Engine/Physics/Joints/DistanceJoint.cpp b/Source/Engine/Physics/Joints/DistanceJoint.cpp
index 8bb45ce5b..b17c6b135 100644
--- a/Source/Engine/Physics/Joints/DistanceJoint.cpp
+++ b/Source/Engine/Physics/Joints/DistanceJoint.cpp
@@ -25,7 +25,7 @@ void DistanceJoint::SetFlags(DistanceJointFlag value)
void DistanceJoint::SetMinDistance(float value)
{
value = Math::Clamp(value, 0.0f, _maxDistance);
- if (Math::NearEqual(value, _minDistance))
+ if (value == _minDistance)
return;
_minDistance = value;
if (_joint)
@@ -35,7 +35,7 @@ void DistanceJoint::SetMinDistance(float value)
void DistanceJoint::SetMaxDistance(float value)
{
value = Math::Max(_minDistance, value);
- if (Math::NearEqual(value, _maxDistance))
+ if (value == _maxDistance)
return;
_maxDistance = value;
if (_joint)
@@ -45,7 +45,7 @@ void DistanceJoint::SetMaxDistance(float value)
void DistanceJoint::SetTolerance(float value)
{
value = Math::Max(0.1f, value);
- if (Math::NearEqual(value, _tolerance))
+ if (value == _tolerance)
return;
_tolerance = value;
if (_joint)
diff --git a/Source/Engine/Physics/Joints/HingeJoint.h b/Source/Engine/Physics/Joints/HingeJoint.h
index 82a42edef..e3fdbe719 100644
--- a/Source/Engine/Physics/Joints/HingeJoint.h
+++ b/Source/Engine/Physics/Joints/HingeJoint.h
@@ -59,7 +59,7 @@ API_STRUCT() struct HingeJointDrive
public:
bool operator==(const HingeJointDrive& other) const
{
- return Math::NearEqual(Velocity, other.Velocity) && Math::NearEqual(ForceLimit, other.ForceLimit) && Math::NearEqual(GearRatio, other.GearRatio) && FreeSpin == other.FreeSpin;
+ return Velocity == other.Velocity && ForceLimit == other.ForceLimit && GearRatio == other.GearRatio && FreeSpin == other.FreeSpin;
}
};
diff --git a/Source/Engine/Physics/Joints/Joint.cpp b/Source/Engine/Physics/Joints/Joint.cpp
index e4dceab86..950f2d146 100644
--- a/Source/Engine/Physics/Joints/Joint.cpp
+++ b/Source/Engine/Physics/Joints/Joint.cpp
@@ -24,7 +24,7 @@ Joint::Joint(const SpawnParams& params)
void Joint::SetBreakForce(float value)
{
- if (Math::NearEqual(value, _breakForce))
+ if (value == _breakForce)
return;
_breakForce = value;
if (_joint)
@@ -33,7 +33,7 @@ void Joint::SetBreakForce(float value)
void Joint::SetBreakTorque(float value)
{
- if (Math::NearEqual(value, _breakTorque))
+ if (value == _breakTorque)
return;
_breakTorque = value;
if (_joint)
@@ -61,7 +61,7 @@ void Joint::SetEnableAutoAnchor(bool value)
void Joint::SetTargetAnchor(const Vector3& value)
{
- if (Vector3::NearEqual(value, _targetAnchor))
+ if (value == _targetAnchor)
return;
_targetAnchor = value;
if (_joint && !_enableAutoAnchor)
diff --git a/Source/Engine/Terrain/Terrain.cpp b/Source/Engine/Terrain/Terrain.cpp
index f8c9bc22e..ebbfd70e6 100644
--- a/Source/Engine/Terrain/Terrain.cpp
+++ b/Source/Engine/Terrain/Terrain.cpp
@@ -261,7 +261,7 @@ void Terrain::SetScaleInLightmap(float value)
void Terrain::SetBoundsExtent(const Vector3& value)
{
- if (Vector3::NearEqual(_boundsExtent, value))
+ if (_boundsExtent == value)
return;
_boundsExtent = value;
@@ -892,7 +892,7 @@ void Terrain::OnTransformChanged()
auto patch = _patches[i];
patch->UpdateTransform();
}
- if (!Float3::NearEqual(_cachedScale, _transform.Scale))
+ if (_cachedScale != _transform.Scale)
{
_cachedScale = _transform.Scale;
for (int32 i = 0; i < _patches.Count(); i++)
diff --git a/Source/Engine/Tests/TestFloatR10G10B10A2.cs b/Source/Engine/Tests/TestFloatR10G10B10A2.cs
index e67272b41..1435f305e 100644
--- a/Source/Engine/Tests/TestFloatR10G10B10A2.cs
+++ b/Source/Engine/Tests/TestFloatR10G10B10A2.cs
@@ -11,13 +11,13 @@ namespace FlaxEngine.Tests
[Test]
public void TestConversion()
{
- Assert.AreEqual(Float4.Zero, new FloatR10G10B10A2(Float4.Zero).ToFloat4());
- Assert.AreEqual(Float4.One, new FloatR10G10B10A2(Float4.One).ToFloat4());
- Assert.AreEqual(new Float4(0.5004888f, 0.5004888f, 0.5004888f, 0.666667f), new FloatR10G10B10A2(new Float4(0.5f)).ToFloat4());
- Assert.AreEqual(new Float4(1, 0, 0, 0), new FloatR10G10B10A2(new Float4(1, 0, 0, 0)).ToFloat4());
- Assert.AreEqual(new Float4(0, 1, 0, 0), new FloatR10G10B10A2(new Float4(0, 1, 0, 0)).ToFloat4());
- Assert.AreEqual(new Float4(0, 0, 1, 0), new FloatR10G10B10A2(new Float4(0, 0, 1, 0)).ToFloat4());
- Assert.AreEqual(new Float4(0, 0, 0, 1), new FloatR10G10B10A2(new Float4(0, 0, 0, 1)).ToFloat4());
+ Assert.IsTrue(Float4.NearEqual(Float4.Zero, new FloatR10G10B10A2(Float4.Zero).ToFloat4()));
+ Assert.IsTrue(Float4.NearEqual(Float4.One, new FloatR10G10B10A2(Float4.One).ToFloat4()));
+ Assert.IsTrue(Float4.NearEqual(new Float4(0.5004888f, 0.5004888f, 0.5004888f, 0.666667f), new FloatR10G10B10A2(new Float4(0.5f)).ToFloat4()));
+ Assert.IsTrue(Float4.NearEqual(new Float4(1, 0, 0, 0), new FloatR10G10B10A2(new Float4(1, 0, 0, 0)).ToFloat4()));
+ Assert.IsTrue(Float4.NearEqual(new Float4(0, 1, 0, 0), new FloatR10G10B10A2(new Float4(0, 1, 0, 0)).ToFloat4()));
+ Assert.IsTrue(Float4.NearEqual(new Float4(0, 0, 1, 0), new FloatR10G10B10A2(new Float4(0, 0, 1, 0)).ToFloat4()));
+ Assert.IsTrue(Float4.NearEqual(new Float4(0, 0, 0, 1), new FloatR10G10B10A2(new Float4(0, 0, 0, 1)).ToFloat4()));
}
}
}
diff --git a/Source/Engine/Tests/TestFloatR11G11B10.cs b/Source/Engine/Tests/TestFloatR11G11B10.cs
index 593989710..2fd080594 100644
--- a/Source/Engine/Tests/TestFloatR11G11B10.cs
+++ b/Source/Engine/Tests/TestFloatR11G11B10.cs
@@ -11,13 +11,13 @@ namespace FlaxEngine.Tests
[Test]
public void TestConversion()
{
- Assert.AreEqual(Float3.Zero, new FloatR11G11B10(Float3.Zero).ToFloat3());
- Assert.AreEqual(Float3.One, new FloatR11G11B10(Float3.One).ToFloat3());
- Assert.AreEqual(new Float3(0.5f, 0.5f, 0.5f), new FloatR11G11B10(new Float3(0.5f)).ToFloat3());
- Assert.AreEqual(new Float3(1, 0, 0), new FloatR11G11B10(new Float3(1, 0, 0)).ToFloat3());
- Assert.AreEqual(new Float3(0, 1, 0), new FloatR11G11B10(new Float3(0, 1, 0)).ToFloat3());
- Assert.AreEqual(new Float3(0, 0, 1), new FloatR11G11B10(new Float3(0, 0, 1)).ToFloat3());
- Assert.AreEqual(new Float3(10, 11, 12), new FloatR11G11B10(new Float3(10, 11, 12)).ToFloat3());
+ Assert.IsTrue(Float3.NearEqual(Float3.Zero, new FloatR11G11B10(Float3.Zero).ToFloat3()));
+ Assert.IsTrue(Float3.NearEqual(Float3.One, new FloatR11G11B10(Float3.One).ToFloat3()));
+ Assert.IsTrue(Float3.NearEqual(new Float3(0.5f, 0.5f, 0.5f), new FloatR11G11B10(new Float3(0.5f)).ToFloat3()));
+ Assert.IsTrue(Float3.NearEqual(new Float3(1, 0, 0), new FloatR11G11B10(new Float3(1, 0, 0)).ToFloat3()));
+ Assert.IsTrue(Float3.NearEqual(new Float3(0, 1, 0), new FloatR11G11B10(new Float3(0, 1, 0)).ToFloat3()));
+ Assert.IsTrue(Float3.NearEqual(new Float3(0, 0, 1), new FloatR11G11B10(new Float3(0, 0, 1)).ToFloat3()));
+ Assert.IsTrue(Float3.NearEqual(new Float3(10, 11, 12), new FloatR11G11B10(new Float3(10, 11, 12)).ToFloat3()));
}
}
}
diff --git a/Source/Engine/Tests/TestQuaternion.cs b/Source/Engine/Tests/TestQuaternion.cs
index bafa1b3e5..749f7ee81 100644
--- a/Source/Engine/Tests/TestQuaternion.cs
+++ b/Source/Engine/Tests/TestQuaternion.cs
@@ -17,10 +17,10 @@ namespace FlaxEngine.Tests
[Test]
public void TestEuler()
{
- Assert.AreEqual(Quaternion.Euler(90, 0, 0), new Quaternion(0.7071068f, 0, 0, 0.7071068f));
- Assert.AreEqual(Quaternion.Euler(25, 0, 10), new Quaternion(0.215616f, -0.018864f, 0.0850898f, 0.9725809f));
- Assert.AreEqual(new Float3(25, 0, 10), Quaternion.Euler(25, 0, 10).EulerAngles);
- Assert.AreEqual(new Float3(25, -5, 10), Quaternion.Euler(25, -5, 10).EulerAngles);
+ Assert.IsTrue(Quaternion.NearEqual(Quaternion.Euler(90, 0, 0), new Quaternion(0.7071068f, 0, 0, 0.7071068f)));
+ Assert.IsTrue(Quaternion.NearEqual(Quaternion.Euler(25, 0, 10), new Quaternion(0.215616f, -0.018864f, 0.0850898f, 0.9725809f)));
+ Assert.IsTrue(Float3.NearEqual(new Float3(25, 0, 10), Quaternion.Euler(25, 0, 10).EulerAngles, 0.00001f));
+ Assert.IsTrue(Float3.NearEqual(new Float3(25, -5, 10), Quaternion.Euler(25, -5, 10).EulerAngles, 0.00001f));
}
///
@@ -33,7 +33,7 @@ namespace FlaxEngine.Tests
var delta = Quaternion.Euler(0, 10, 0);
for (int i = 0; i < 9; i++)
q *= delta;
- Assert.AreEqual(Quaternion.Euler(0, 90, 0), q);
+ Assert.IsTrue(Quaternion.NearEqual(Quaternion.Euler(0, 90, 0), q));
}
}
}
diff --git a/Source/Engine/Tests/TestTransform.cs b/Source/Engine/Tests/TestTransform.cs
index 24edcb989..a3f3b2f03 100644
--- a/Source/Engine/Tests/TestTransform.cs
+++ b/Source/Engine/Tests/TestTransform.cs
@@ -68,9 +68,9 @@ namespace FlaxEngine.Tests
t1.LocalToWorld(new Vector3[1] { t2.Translation }, a4T);
Vector3 a4 = a4T[0];
- Assert.AreEqual(a1.Translation, a2);
- Assert.AreEqual(a2, a3);
- Assert.AreEqual(a2, a4);
+ Assert.IsTrue(Vector3.NearEqual(a1.Translation, a2));
+ Assert.IsTrue(Vector3.NearEqual(a2, a3));
+ Assert.IsTrue(Vector3.NearEqual(a2, a4));
}
///
@@ -100,9 +100,9 @@ namespace FlaxEngine.Tests
t1.WorldToLocal(new Vector3[1] { t2.Translation }, a4T);
Float3 a4 = a4T[0];
- Assert.AreEqual((Float3)a1.Translation, a2);
- Assert.AreEqual(a2, a3);
- Assert.AreEqual(a2, a4);
+ Assert.IsTrue(Float3.NearEqual((Float3)a1.Translation, a2));
+ Assert.IsTrue(Float3.NearEqual(a2, a3, 0.0001f));
+ Assert.IsTrue(Float3.NearEqual(a2, a4));
}
///
@@ -113,28 +113,28 @@ namespace FlaxEngine.Tests
{
Transform trans = new Transform(new Vector3(1, 2, 3));
- Assert.AreEqual(new Float3(1, 2, 3), (Float3)trans.LocalToWorld(new Float3(0, 0, 0)));
- Assert.AreEqual(new Float3(4, 4, 4), (Float3)trans.LocalToWorld(new Float3(3, 2, 1)));
- Assert.AreEqual(new Float3(-1, -2, -3), (Float3)trans.WorldToLocal(new Float3(0, 0, 0)));
- Assert.AreEqual(new Float3(0, 0, 0), (Float3)trans.WorldToLocal(new Float3(1, 2, 3)));
+ Assert.IsTrue(Float3.NearEqual(new Float3(1, 2, 3), (Float3)trans.LocalToWorld(new Float3(0, 0, 0))));
+ Assert.IsTrue(Float3.NearEqual(new Float3(4, 4, 4), (Float3)trans.LocalToWorld(new Float3(3, 2, 1))));
+ Assert.IsTrue(Float3.NearEqual(new Float3(-1, -2, -3), (Float3)trans.WorldToLocal(new Float3(0, 0, 0))));
+ Assert.IsTrue(Float3.NearEqual(new Float3(0, 0, 0), (Float3)trans.WorldToLocal(new Float3(1, 2, 3))));
trans = new Transform(Vector3.Zero, Quaternion.Euler(0, 90, 0));
- Assert.AreEqual(new Float3(0, 2, -1), (Float3)trans.LocalToWorld(new Float3(1, 2, 0)));
+ Assert.IsTrue(Float3.NearEqual(new Float3(0, 2, -1), (Float3)trans.LocalToWorld(new Float3(1, 2, 0))));
trans.Translation = new Vector3(1, 0, 0);
trans.Orientation = Quaternion.RotationX((float)Math.PI * 0.5f);
trans.Scale = new Vector3(2, 2, 2);
- Assert.AreEqual(new Float3(1, 0, 2), (Float3)trans.LocalToWorld(new Float3(0, 1, 0)));
+ Assert.IsTrue(Float3.NearEqual(new Float3(1, 0, 2), (Float3)trans.LocalToWorld(new Float3(0, 1, 0))));
Transform t1 = trans.LocalToWorld(Transform.Identity);
- Assert.AreEqual(new Float3(1.0f, 0, 0), (Float3)t1.Translation);
- Assert.AreEqual(Quaternion.RotationX((float)Math.PI * 0.5f), t1.Orientation);
- Assert.AreEqual(new Float3(2.0f, 2.0f, 2.0f), t1.Scale);
+ Assert.IsTrue(Float3.NearEqual(new Float3(1.0f, 0, 0), (Float3)t1.Translation));
+ Assert.IsTrue(Quaternion.NearEqual(Quaternion.RotationX((float)Math.PI * 0.5f), t1.Orientation));
+ Assert.IsTrue(Float3.NearEqual(new Float3(2.0f, 2.0f, 2.0f), t1.Scale));
Transform t2 = trans.WorldToLocal(Transform.Identity);
- Assert.AreEqual(new Float3(-0.5f, 0, 0), (Float3)t2.Translation);
- Assert.AreEqual(Quaternion.RotationX((float)Math.PI * -0.5f), t2.Orientation);
- Assert.AreEqual(new Float3(0.5f, 0.5f, 0.5f), t2.Scale);
+ Assert.IsTrue(Float3.NearEqual(new Float3(-0.5f, 0, 0), (Float3)t2.Translation));
+ Assert.IsTrue(Quaternion.NearEqual(Quaternion.RotationX((float)Math.PI * -0.5f), t2.Orientation));
+ Assert.IsTrue(Float3.NearEqual(new Float3(0.5f, 0.5f, 0.5f), t2.Scale));
var rand = new Random(10);
for (int i = 0; i < 10; i++)
diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp
index 51584504d..fe268c350 100644
--- a/Source/Engine/Tools/ModelTool/ModelTool.cpp
+++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp
@@ -676,6 +676,9 @@ void ModelTool::Options::Serialize(SerializeStream& stream, const void* otherObj
SERIALIZE(CalculateBoneOffsetMatrices);
SERIALIZE(LightmapUVsSource);
SERIALIZE(CollisionMeshesPrefix);
+ SERIALIZE(CollisionType);
+ SERIALIZE(PositionFormat);
+ SERIALIZE(TexCoordFormat);
SERIALIZE(Scale);
SERIALIZE(Rotation);
SERIALIZE(Translation);
@@ -727,6 +730,9 @@ void ModelTool::Options::Deserialize(DeserializeStream& stream, ISerializeModifi
DESERIALIZE(CalculateBoneOffsetMatrices);
DESERIALIZE(LightmapUVsSource);
DESERIALIZE(CollisionMeshesPrefix);
+ DESERIALIZE(CollisionType);
+ DESERIALIZE(PositionFormat);
+ DESERIALIZE(TexCoordFormat);
DESERIALIZE(Scale);
DESERIALIZE(Rotation);
DESERIALIZE(Translation);
@@ -1137,6 +1143,10 @@ bool ModelTool::ImportModel(const String& path, ModelData& data, Options& option
if (ImportData(path, data, options, errorMsg))
return true;
+ // Copy over data format options
+ data.PositionFormat = (ModelData::PositionFormats)options.PositionFormat;
+ data.TexCoordFormat = (ModelData::TexCoordFormats)options.TexCoordFormat;
+
// Validate result data
if (EnumHasAnyFlags(options.ImportTypes, ImportDataTypes::Geometry))
{
@@ -1921,9 +1931,43 @@ bool ModelTool::ImportModel(const String& path, ModelData& data, Options& option
auto mesh = lod.Meshes[i];
if (mesh->Name.StartsWith(options.CollisionMeshesPrefix, StringSearchCase::IgnoreCase))
{
+ // Remove material slot used by this mesh (if no other mesh else uses it)
+ int32 materialSlotUsageCount = 0;
+ for (const auto& e : data.LODs)
+ {
+ for (const MeshData* q : e.Meshes)
+ {
+ if (q->MaterialSlotIndex == mesh->MaterialSlotIndex)
+ materialSlotUsageCount++;
+ }
+ }
+ if (materialSlotUsageCount == 1)
+ {
+ data.Materials.RemoveAt(mesh->MaterialSlotIndex);
+
+ // Fixup linkage of other meshes to materials
+ for (auto& e : data.LODs)
+ {
+ for (MeshData* q : e.Meshes)
+ {
+ if (q->MaterialSlotIndex > mesh->MaterialSlotIndex)
+ {
+ q->MaterialSlotIndex--;
+ }
+ }
+ }
+ }
+
+ // Remove data linkage
+ mesh->NodeIndex = 0;
+ mesh->MaterialSlotIndex = 0;
+
+ // Add mesh to collision
if (collisionModel.LODs.Count() == 0)
collisionModel.LODs.AddOne();
collisionModel.LODs[0].Meshes.Add(mesh);
+
+ // Remove mesh from model
lod.Meshes.RemoveAtKeepOrder(i);
if (lod.Meshes.IsEmpty())
break;
diff --git a/Source/Engine/Tools/ModelTool/ModelTool.h b/Source/Engine/Tools/ModelTool/ModelTool.h
index 7e0587c3d..b09583471 100644
--- a/Source/Engine/Tools/ModelTool/ModelTool.h
+++ b/Source/Engine/Tools/ModelTool/ModelTool.h
@@ -142,6 +142,28 @@ public:
ExtractCenterOfMass = 2,
};
+ ///
+ /// Declares the imported vertex positions data formats.
+ ///
+ API_ENUM(Attributes="HideInEditor") enum class PositionFormat
+ {
+ // XYZ channels with 32-bit precision (12 bytes per vertex).
+ Float32,
+ // XYZ(W) channels with 12-bit precision (8 bytes per vertex).
+ Float16,
+ };
+
+ ///
+ /// Declares the imported vertex texture coordinates data formats.
+ ///
+ API_ENUM(Attributes="HideInEditor") enum class TexCoordFormats
+ {
+ // XY channels with 16-bit precision (4 bytes per vertex).
+ Float16,
+ // XY channels with 8-bit precision (2 bytes per vertex). Valid only for normalized UVs within range [0; 1], scaled or negative UVs won't work.
+ UNorm8,
+ };
+
///
/// Model import options.
///
@@ -201,6 +223,14 @@ public:
API_FIELD(Attributes="EditorOrder(105), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))")
CollisionDataType CollisionType = CollisionDataType::ConvexMesh;
+ public:
+ // The imported vertex positions data format to use by meshes. Changing this affects memory usage of the mesh data, performance and overall quality.
+ API_FIELD(Attributes = "EditorOrder(200), EditorDisplay(\"Data Format\"), VisibleIf(nameof(ShowGeometry))")
+ PositionFormat PositionFormat = PositionFormat::Float32;
+ // The imported vertex texture coordinates data format to use by meshes. Changing this affects memory usage of the mesh data, performance and overall quality.
+ API_FIELD(Attributes = "EditorOrder(205), EditorDisplay(\"Data Format\"), VisibleIf(nameof(ShowGeometry))")
+ TexCoordFormats TexCoordFormat = TexCoordFormats::Float16;
+
public: // Transform
// Custom uniform import scale.
diff --git a/Source/Engine/UI/GUI/Common/TextBox.cs b/Source/Engine/UI/GUI/Common/TextBox.cs
index 76727cc07..9ee052581 100644
--- a/Source/Engine/UI/GUI/Common/TextBox.cs
+++ b/Source/Engine/UI/GUI/Common/TextBox.cs
@@ -298,9 +298,13 @@ namespace FlaxEngine.GUI
color *= 0.85f;
Render2D.DrawText(font, text, color, ref _layout, TextMaterial);
}
- else if (!string.IsNullOrEmpty(_watermarkText))
+ else
{
- Render2D.DrawText(font, _watermarkText, WatermarkTextColor, ref _layout, TextMaterial);
+ text = _watermarkText;
+ if (text.Length > 0)
+ {
+ Render2D.DrawText(font, _watermarkText, WatermarkTextColor, ref _layout, TextMaterial);
+ }
}
// Caret