diff --git a/Flax.flaxproj b/Flax.flaxproj index 70cfd649d..660b10494 100644 --- a/Flax.flaxproj +++ b/Flax.flaxproj @@ -4,7 +4,7 @@ "Major": 1, "Minor": 10, "Revision": 0, - "Build": 6702 + "Build": 6703 }, "Company": "Flax", "Copyright": "Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.", diff --git a/Source/Editor/Content/Create/ParticleEmitterCreateEntry.cs b/Source/Editor/Content/Create/ParticleEmitterCreateEntry.cs index 8aefc58b2..a88d74c18 100644 --- a/Source/Editor/Content/Create/ParticleEmitterCreateEntry.cs +++ b/Source/Editor/Content/Create/ParticleEmitterCreateEntry.cs @@ -18,32 +18,32 @@ namespace FlaxEditor.Content.Create public enum Templates { /// - /// The empty asset. + /// An empty emitter. /// Empty, /// - /// The simple particle system that uses constant emission rate. + /// An emitter that emits particles at a constant emission rate. /// ConstantBurst, /// - /// The simple periodic burst particle system. + /// An emitter that produces simple, periodic bursts of particles. /// PeriodicBurst, /// - /// The layers and tags settings. + /// An emitter that uses a blended spritesheet to produce a smooth, thick cloud of smoke. /// Smoke, /// - /// The GPU sparks with depth-buffer collisions. + /// A GPU emitter that produces sparks that can collide, thanks to depth-buffer based collisions. /// Sparks, /// - /// The ribbon spiral particles. + /// An emitter that produces a spiral shaped ribbon. /// RibbonSpiral, } diff --git a/Source/Editor/CustomEditors/Dedicated/TerrainEditor.cs b/Source/Editor/CustomEditors/Dedicated/TerrainEditor.cs index 8aaf5b7d6..05945efe7 100644 --- a/Source/Editor/CustomEditors/Dedicated/TerrainEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/TerrainEditor.cs @@ -2,6 +2,7 @@ using FlaxEditor.Utilities; using FlaxEngine; +using FlaxEngine.GUI; namespace FlaxEditor.CustomEditors.Dedicated { @@ -33,8 +34,12 @@ namespace FlaxEditor.CustomEditors.Dedicated totalSize.X / Units.Meters2Units * 0.001f, totalSize.Z / Units.Meters2Units * 0.001f ); - var label = layout.Label(text); + + var group = layout.Group("Info"); + var label = group.Label(text); label.Label.AutoHeight = true; + // Add a bit of padding to make it look nicer + label.Label.Margin = new Margin(3); } } } diff --git a/Source/Editor/CustomEditors/Editors/CollectionEditor.cs b/Source/Editor/CustomEditors/Editors/CollectionEditor.cs index f76bd4d89..1a4bcab4d 100644 --- a/Source/Editor/CustomEditors/Editors/CollectionEditor.cs +++ b/Source/Editor/CustomEditors/Editors/CollectionEditor.cs @@ -81,7 +81,7 @@ namespace FlaxEditor.CustomEditors.Editors b.Enabled = Index + 1 < Editor.Count && !Editor._readOnly; b = menu.AddButton("Remove", OnRemoveClicked); - b.Enabled = !Editor._readOnly; + b.Enabled = !Editor._readOnly && Editor._canResize; } /// diff --git a/Source/Editor/Editor.cpp b/Source/Editor/Editor.cpp index a62799097..e72f90149 100644 --- a/Source/Editor/Editor.cpp +++ b/Source/Editor/Editor.cpp @@ -50,30 +50,31 @@ bool Editor::CheckProjectUpgrade() const auto versionFilePath = Globals::ProjectCacheFolder / TEXT("version"); // Load version cache file - int32 lastMajor = FLAXENGINE_VERSION_MAJOR; - int32 lastMinor = FLAXENGINE_VERSION_MINOR; - int32 lastBuild = FLAXENGINE_VERSION_BUILD; + struct VersionCache + { + int32 Major = FLAXENGINE_VERSION_MAJOR; + int32 Minor = FLAXENGINE_VERSION_MINOR; + int32 Build = FLAXENGINE_VERSION_BUILD; + int32 RealSize = sizeof(Real); // Rebuild when changing between Large Worlds + }; + VersionCache lastVersion; if (FileSystem::FileExists(versionFilePath)) { auto file = FileReadStream::Open(versionFilePath); if (file) { - file->ReadInt32(&lastMajor); - file->ReadInt32(&lastMinor); - file->ReadInt32(&lastBuild); + file->ReadBytes(&lastVersion, sizeof(lastVersion)); // Invalidate results if data has issues - if (file->HasError() || lastMajor < 0 || lastMinor < 0 || lastMajor > 100 || lastMinor > 1000) + if (file->HasError() || lastVersion.Major < 0 || lastVersion.Minor < 0 || lastVersion.Major > 100 || lastVersion.Minor > 1000) { - lastMajor = FLAXENGINE_VERSION_MAJOR; - lastMinor = FLAXENGINE_VERSION_MINOR; - lastBuild = FLAXENGINE_VERSION_BUILD; + lastVersion = VersionCache(); LOG(Warning, "Invalid version cache data"); } else { - LOG(Info, "Last project open version: {0}.{1}.{2}", lastMajor, lastMinor, lastBuild); - LastProjectOpenedEngineBuild = lastBuild; + LOG(Info, "Last project open version: {0}.{1}.{2}", lastVersion.Major, lastVersion.Minor, lastVersion.Build); + LastProjectOpenedEngineBuild = lastVersion.Build; } Delete(file); @@ -256,13 +257,13 @@ bool Editor::CheckProjectUpgrade() LOG(Warning, "Project layout upgraded!"); } // Check if last version was the same - else if (lastMajor == FLAXENGINE_VERSION_MAJOR && lastMinor == FLAXENGINE_VERSION_MINOR) + else if (lastVersion.Major == FLAXENGINE_VERSION_MAJOR && lastVersion.Minor == FLAXENGINE_VERSION_MINOR) { // Do nothing IsOldProjectOpened = false; } // Check if last version was older - else if (lastMajor < FLAXENGINE_VERSION_MAJOR || (lastMajor == FLAXENGINE_VERSION_MAJOR && lastMinor < FLAXENGINE_VERSION_MINOR)) + else if (lastVersion.Major < FLAXENGINE_VERSION_MAJOR || (lastVersion.Major == FLAXENGINE_VERSION_MAJOR && lastVersion.Minor < FLAXENGINE_VERSION_MINOR)) { LOG(Warning, "The project was opened with the older editor version last time"); const auto result = MessageBox::Show(TEXT("The project was opened with the older editor version last time. Loading it may modify existing data so older editor version won't open it. Do you want to perform a backup before or cancel operation?"), TEXT("Project upgrade"), MessageBoxButtons::YesNoCancel, MessageBoxIcon::Question); @@ -285,7 +286,7 @@ bool Editor::CheckProjectUpgrade() } } // Check if last version was newer - else if (lastMajor > FLAXENGINE_VERSION_MAJOR || (lastMajor == FLAXENGINE_VERSION_MAJOR && lastMinor > FLAXENGINE_VERSION_MINOR)) + else if (lastVersion.Major > FLAXENGINE_VERSION_MAJOR || (lastVersion.Major == FLAXENGINE_VERSION_MAJOR && lastVersion.Minor > FLAXENGINE_VERSION_MINOR)) { LOG(Warning, "The project was opened with the newer editor version last time"); const auto result = MessageBox::Show(TEXT("The project was opened with the newer editor version last time. Loading it may fail and corrupt existing data. Do you want to perform a backup before or cancel operation?"), TEXT("Project upgrade"), MessageBoxButtons::YesNoCancel, MessageBoxIcon::Warning); @@ -309,7 +310,7 @@ bool Editor::CheckProjectUpgrade() } // When changing between major/minor version clear some caches to prevent possible issues - if (lastMajor != FLAXENGINE_VERSION_MAJOR || lastMinor != FLAXENGINE_VERSION_MINOR) + if (lastVersion.Major != FLAXENGINE_VERSION_MAJOR || lastVersion.Minor != FLAXENGINE_VERSION_MINOR || lastVersion.RealSize != sizeof(Real)) { LOG(Info, "Cleaning cache files from different engine version"); FileSystem::DeleteDirectory(Globals::ProjectFolder / TEXT("Cache/Cooker")); @@ -318,7 +319,7 @@ bool Editor::CheckProjectUpgrade() // Upgrade old 0.7 projects // [Deprecated: 01.11.2020, expires 01.11.2021] - if (lastMajor == 0 && lastMinor == 7 && lastBuild <= 6197) + if (lastVersion.Major == 0 && lastVersion.Minor == 7 && lastVersion.Build <= 6197) { Array files; FileSystem::DirectoryGetFiles(files, Globals::ProjectSourceFolder, TEXT("*.Gen.cs")); @@ -331,9 +332,8 @@ bool Editor::CheckProjectUpgrade() auto file = FileWriteStream::Open(versionFilePath); if (file) { - file->WriteInt32(FLAXENGINE_VERSION_MAJOR); - file->WriteInt32(FLAXENGINE_VERSION_MINOR); - file->WriteInt32(FLAXENGINE_VERSION_BUILD); + lastVersion = VersionCache(); + file->WriteBytes(&lastVersion, sizeof(lastVersion)); Delete(file); } else diff --git a/Source/Editor/Gizmo/ViewportRubberBandSelector.cs b/Source/Editor/Gizmo/ViewportRubberBandSelector.cs index 36b1884ad..164868fc7 100644 --- a/Source/Editor/Gizmo/ViewportRubberBandSelector.cs +++ b/Source/Editor/Gizmo/ViewportRubberBandSelector.cs @@ -74,8 +74,7 @@ public sealed class ViewportRubberBandSelector /// /// Whether the creation can start. /// The current mouse position. - /// The view frustum. - public void TryCreateRubberBand(bool canStart, Float2 mousePosition, BoundingFrustum viewFrustum) + public void TryCreateRubberBand(bool canStart, Float2 mousePosition) { if (_isRubberBandSpanning && !canStart) { @@ -101,32 +100,43 @@ public sealed class ViewportRubberBandSelector _isMosueCaptured = true; _owner.Viewport.StartMouseCapture(); } - UpdateRubberBand(ref viewFrustum); + UpdateRubberBand(); } } } private struct ViewportProjection { - private Viewport _viewport; private Matrix _viewProjection; + private BoundingFrustum _frustum; + private Viewport _viewport; + private Vector3 _origin; public void Init(EditorViewport editorViewport) { // Inline EditorViewport.ProjectPoint to save on calculation for large set of points _viewport = new Viewport(0, 0, editorViewport.Width, editorViewport.Height); - var frustum = editorViewport.ViewFrustum; - _viewProjection = frustum.Matrix; + _frustum = editorViewport.ViewFrustum; + _viewProjection = _frustum.Matrix; + _origin = editorViewport.Task.View.Origin; } - public void ProjectPoint(ref Vector3 worldSpaceLocation, out Float2 viewportSpaceLocation) + public void ProjectPoint(Vector3 worldSpaceLocation, out Float2 viewportSpaceLocation) { + worldSpaceLocation -= _origin; _viewport.Project(ref worldSpaceLocation, ref _viewProjection, out var projected); viewportSpaceLocation = new Float2((float)projected.X, (float)projected.Y); } + + public ContainmentType FrustumCull(ref BoundingBox bounds) + { + bounds.Minimum -= _origin; + bounds.Maximum -= _origin; + return _frustum.Contains(ref bounds); + } } - private void UpdateRubberBand(ref BoundingFrustum viewFrustum) + private void UpdateRubberBand() { Profiler.BeginEvent("UpdateRubberBand"); @@ -169,7 +179,7 @@ public sealed class ViewportRubberBandSelector // Skip actor if outside of view frustum var actorBox = a.EditorBox; - if (viewFrustum.Contains(actorBox) == ContainmentType.Disjoint) + if (projection.FrustumCull(ref actorBox) == ContainmentType.Disjoint) continue; // Get valid selection points @@ -220,7 +230,7 @@ public sealed class ViewportRubberBandSelector bool containsAllPoints = points.Length != 0; for (int i = 0; i < points.Length; i++) { - projection.ProjectPoint(ref points[i], out var loc); + projection.ProjectPoint(points[i], out var loc); if (!adjustedRect.Contains(loc)) { containsAllPoints = false; diff --git a/Source/Editor/States/ChangingScenesState.cs b/Source/Editor/States/ChangingScenesState.cs index e1a95e6ab..17fa30ff7 100644 --- a/Source/Editor/States/ChangingScenesState.cs +++ b/Source/Editor/States/ChangingScenesState.cs @@ -164,21 +164,10 @@ namespace FlaxEditor.States { Assert.AreEqual(Guid.Empty, _lastSceneFromRequest, "Invalid state."); - // Bind events, only bind loading event and error if re-loading the same scene to avoid issues. - if (_scenesToUnload.Count == 1 && _scenesToLoad.Count == 1) - { - if (_scenesToLoad[0] == _scenesToUnload[0].ID) - { - Level.SceneLoaded += OnSceneEvent; - Level.SceneLoadError += OnSceneEvent; - } - } - else - { - Level.SceneLoaded += OnSceneEvent; - Level.SceneLoadError += OnSceneEvent; - Level.SceneUnloaded += OnSceneEvent; - } + // Bind events + Level.SceneLoaded += OnSceneEvent; + Level.SceneLoadError += OnSceneEvent; + Level.SceneUnloaded += OnSceneEvent; // Push scenes changing requests for (int i = 0; i < _scenesToUnload.Count; i++) diff --git a/Source/Editor/Surface/Elements/FloatValue.cs b/Source/Editor/Surface/Elements/FloatValue.cs index d01abcf06..d7766426c 100644 --- a/Source/Editor/Surface/Elements/FloatValue.cs +++ b/Source/Editor/Surface/Elements/FloatValue.cs @@ -114,6 +114,18 @@ namespace FlaxEditor.Surface.Elements { result = (arch.BoxID == 0 ? asFloat4.X : arch.BoxID == 1 ? asFloat4.Y : arch.BoxID == 2 ? asFloat4.Z : asFloat4.W); } + else if (value is Double2 asDouble2) + { + result = (float)(arch.BoxID == 0 ? asDouble2.X : asDouble2.Y); + } + else if (value is Double3 asDouble3) + { + result = (float)(arch.BoxID == 0 ? asDouble3.X : arch.BoxID == 1 ? asDouble3.Y : asDouble3.Z); + } + else if (value is Double4 asDouble4) + { + result = (float)(arch.BoxID == 0 ? asDouble4.X : arch.BoxID == 1 ? asDouble4.Y : arch.BoxID == 2 ? asDouble4.Z : asDouble4.W); + } else { result = 0; @@ -212,6 +224,36 @@ namespace FlaxEditor.Surface.Elements asFloat4.W = toSet; value = asFloat4; } + else if (value is Double2 asDouble2) + { + if (arch.BoxID == 0) + asDouble2.X = toSet; + else + asDouble2.Y = toSet; + value = asDouble2; + } + else if (value is Double3 asDouble3) + { + if (arch.BoxID == 0) + asDouble3.X = toSet; + else if (arch.BoxID == 1) + asDouble3.Y = toSet; + else + asDouble3.Z = toSet; + value = asDouble3; + } + else if (value is Double4 asDouble4) + { + if (arch.BoxID == 0) + asDouble4.X = toSet; + else if (arch.BoxID == 1) + asDouble4.Y = toSet; + else if (arch.BoxID == 2) + asDouble4.Z = toSet; + else + asDouble4.W = toSet; + value = asDouble4; + } else { value = 0; @@ -269,6 +311,18 @@ namespace FlaxEditor.Surface.Elements { value = new Float4(toSet); } + else if (value is Double2) + { + value = new Double2(toSet); + } + else if (value is Double3) + { + value = new Double3(toSet); + } + else if (value is Double4) + { + value = new Double4(toSet); + } else { value = 0; diff --git a/Source/Editor/Viewport/MainEditorGizmoViewport.cs b/Source/Editor/Viewport/MainEditorGizmoViewport.cs index ab1b8b312..ad6836f1b 100644 --- a/Source/Editor/Viewport/MainEditorGizmoViewport.cs +++ b/Source/Editor/Viewport/MainEditorGizmoViewport.cs @@ -611,8 +611,8 @@ namespace FlaxEditor.Viewport // Don't allow rubber band selection when gizmo is controlling mouse, vertex painting mode, or cloth painting is enabled bool canStart = !(IsControllingMouse || IsRightMouseButtonDown || IsAltKeyDown) && - Gizmos.Active is TransformGizmo && !Gizmos.Active.IsControllingMouse; - _rubberBandSelector.TryCreateRubberBand(canStart, _viewMousePos, ViewFrustum); + Gizmos?.Active is TransformGizmo && !Gizmos.Active.IsControllingMouse; + _rubberBandSelector.TryCreateRubberBand(canStart, _viewMousePos); } /// diff --git a/Source/Editor/Windows/Assets/AnimationGraphWindow.cs b/Source/Editor/Windows/Assets/AnimationGraphWindow.cs index aacf1aa4e..f27c3158f 100644 --- a/Source/Editor/Windows/Assets/AnimationGraphWindow.cs +++ b/Source/Editor/Windows/Assets/AnimationGraphWindow.cs @@ -149,6 +149,10 @@ namespace FlaxEditor.Windows.Assets (instance, parameter, tag) => ((AnimationGraphWindow)instance).PreviewActor.GetParameterValue(parameter.Identifier), (instance, value, parameter, tag) => ((AnimationGraphWindow)instance).PreviewActor.SetParameterValue(parameter.Identifier, value), Values); + + // Parameters will always have one element + if (parameters.Length < 2) + layout.Label("No parameters", TextAlignment.Center); } } } diff --git a/Source/Editor/Windows/Assets/ParticleEmitterWindow.cs b/Source/Editor/Windows/Assets/ParticleEmitterWindow.cs index c373b4cdc..39b4d6ac2 100644 --- a/Source/Editor/Windows/Assets/ParticleEmitterWindow.cs +++ b/Source/Editor/Windows/Assets/ParticleEmitterWindow.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using System.Linq; using FlaxEditor.Content; using FlaxEditor.CustomEditors; using FlaxEditor.Scripting; @@ -104,6 +105,9 @@ namespace FlaxEditor.Windows.Assets (instance, parameter, tag) => ((ParticleEmitterWindow)instance).Preview.PreviewActor.GetParameterValue(string.Empty, parameter.Name), (instance, value, parameter, tag) => ((ParticleEmitterWindow)instance).Preview.PreviewActor.SetParameterValue(string.Empty, parameter.Name, value), Values); + + if (!parameters.Any()) + layout.Label("No parameters", TextAlignment.Center); } } } diff --git a/Source/Editor/Windows/SceneTreeWindow.cs b/Source/Editor/Windows/SceneTreeWindow.cs index 7b5e84c02..d865d384a 100644 --- a/Source/Editor/Windows/SceneTreeWindow.cs +++ b/Source/Editor/Windows/SceneTreeWindow.cs @@ -62,6 +62,7 @@ namespace FlaxEditor.Windows AnchorPreset = AnchorPresets.HorizontalStretchMiddle, Parent = headerPanel, Bounds = new Rectangle(4, 4, headerPanel.Width - 8, 18), + TooltipText = "Search the scene tree.\n\nYou can prefix your search with different search operators:\ns: -> Actor with script of type\na: -> Actor type\nc: -> Control type", }; _searchBox.TextChanged += OnSearchBoxTextChanged; diff --git a/Source/Engine/Animations/Graph/AnimGraph.Base.cpp b/Source/Engine/Animations/Graph/AnimGraph.Base.cpp index b23d55b9e..2b206839c 100644 --- a/Source/Engine/Animations/Graph/AnimGraph.Base.cpp +++ b/Source/Engine/Animations/Graph/AnimGraph.Base.cpp @@ -223,7 +223,7 @@ bool AnimGraphBase::onNodeLoaded(Node* n) // Store triangles vertices indices (map the back to the anim node slots) n->Data.MultiBlend2D.TrianglesCount = triangles.Count(); - n->Data.MultiBlend2D.Triangles = (ANIM_GRAPH_MULTI_BLEND_INDEX*)Allocator::Allocate(triangles.Count() * 3 - sizeof(ANIM_GRAPH_MULTI_BLEND_INDEX)); + n->Data.MultiBlend2D.Triangles = (ANIM_GRAPH_MULTI_BLEND_INDEX*)Allocator::Allocate(triangles.Count() * 3 * sizeof(ANIM_GRAPH_MULTI_BLEND_INDEX)); for (int32 i = 0, t = 0; i < triangles.Count(); i++) { n->Data.MultiBlend2D.Triangles[t++] = vertexToAnim[triangles[i].Indices[0]]; diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp index 98d399efe..5ac267b00 100644 --- a/Source/Engine/Level/Level.cpp +++ b/Source/Engine/Level/Level.cpp @@ -888,9 +888,9 @@ bool Level::loadScene(rapidjson_flax::Value& data, int32 engineBuild, Scene** ou if (!CommandLine::Options.Headless.IsTrue()) { if (ScriptsBuilder::LastCompilationFailed()) - MessageBox::Show(TEXT("Scripts compilation failed. Cannot load scene without game script modules. Please fix the compilation issues. See logs for more info."), TEXT("Failed to compile scripts"), MessageBoxButtons::OK, MessageBoxIcon::Error); + MessageBox::Show(TEXT("Script compilation failed.\n\nCannot load scene without game script modules. Please fix any compilation issues.\n\nSee Output Log or logs for more info."), TEXT("Failed to compile scripts"), MessageBoxButtons::OK, MessageBoxIcon::Error); else - MessageBox::Show(TEXT("Failed to load scripts. Cannot load scene without game script modules. See logs for more info."), TEXT("Missing game modules"), MessageBoxButtons::OK, MessageBoxIcon::Error); + MessageBox::Show(TEXT("Failed to load scripts.\n\nCannot load scene without game script modules.\n\nSee logs for more info."), TEXT("Missing game modules"), MessageBoxButtons::OK, MessageBoxIcon::Error); } #endif return true; diff --git a/Source/Engine/Tools/ModelTool/ModelTool.h b/Source/Engine/Tools/ModelTool/ModelTool.h index c13e84b3c..1f14054d1 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.h +++ b/Source/Engine/Tools/ModelTool/ModelTool.h @@ -258,10 +258,10 @@ public: API_FIELD(Attributes="EditorOrder(1100), EditorDisplay(\"Level Of Detail\", \"Generate LODs\"), VisibleIf(nameof(ShowGeometry))") bool GenerateLODs = false; // The index of the LOD from the source model data to use as a reference for following LODs generation. - API_FIELD(Attributes="EditorOrder(1110), EditorDisplay(\"Level Of Detail\", \"Base LOD\"), VisibleIf(nameof(ShowGeometry)), Limit(0, 5)") + API_FIELD(Attributes="EditorOrder(1110), EditorDisplay(\"Level Of Detail\", \"Base LOD\"), VisibleIf(nameof(ShowGeometry)), Limit(0, 5, 0.065f)") int32 BaseLOD = 0; // The amount of LODs to include in the model (all remaining ones starting from Base LOD will be generated). - API_FIELD(Attributes="EditorOrder(1120), EditorDisplay(\"Level Of Detail\", \"LOD Count\"), VisibleIf(nameof(ShowGeometry)), Limit(1, 6)") + API_FIELD(Attributes="EditorOrder(1120), EditorDisplay(\"Level Of Detail\", \"LOD Count\"), VisibleIf(nameof(ShowGeometry)), Limit(1, 6, 0.065f)") int32 LODCount = 4; // The target amount of triangles for the generated LOD (based on the higher LOD). Normalized to range 0-1. For instance 0.4 cuts the triangle count to 40%. API_FIELD(Attributes="EditorOrder(1130), EditorDisplay(\"Level Of Detail\"), VisibleIf(nameof(ShowGeometry)), Limit(0, 1, 0.001f)") @@ -309,7 +309,7 @@ public: API_FIELD(Attributes="EditorOrder(2000), EditorDisplay(\"Splitting\"), VisibleIf(nameof(ShowSplitting))") bool SplitObjects = false; // The zero-based index for the mesh/animation clip to import. If the source file has more than one mesh/animation it can be used to pick a desired object. Default -1 imports all objects. - API_FIELD(Attributes="EditorOrder(2010), EditorDisplay(\"Splitting\"), VisibleIf(nameof(ShowSplitting))") + API_FIELD(Attributes="EditorOrder(2010), EditorDisplay(\"Splitting\"), VisibleIf(nameof(ShowSplitting)), Limit(int.MinValue, int.MaxValue, 0.065f)") int32 ObjectIndex = -1; public: // Other diff --git a/Source/Engine/Visject/VisjectGraph.cpp b/Source/Engine/Visject/VisjectGraph.cpp index aacaf8800..d1829250a 100644 --- a/Source/Engine/Visject/VisjectGraph.cpp +++ b/Source/Engine/Visject/VisjectGraph.cpp @@ -230,7 +230,8 @@ void VisjectExecutor::ProcessGroupMath(Box* box, Node* node, Value& value) case VariantType::Double4: value = Double3(v1.AsDouble4()).Length(); break; - default: CRASH; + default: + value = 0.0f; break; } break; @@ -265,7 +266,8 @@ void VisjectExecutor::ProcessGroupMath(Box* box, Node* node, Value& value) case VariantType::Double4: value = Double4(Double3::Normalize(Double3(v1.AsDouble3())), 0.0f); break; - default: CRASH; + default: + value = 0.0f; break; } break; @@ -290,13 +292,25 @@ void VisjectExecutor::ProcessGroupMath(Box* box, Node* node, Value& value) case VariantType::Double3: value = Double3::Cross(v1.AsDouble3(), v2.AsDouble3()); break; - default: CRASH; + default: + value = 0.0f; break; } break; case 19: switch (v1.Type.Type) { + case VariantType::Bool: + case VariantType::Int16: + case VariantType::Uint16: + case VariantType::Int: + case VariantType::Uint: + case VariantType::Int64: + case VariantType::Uint64: + case VariantType::Float: + case VariantType::Double: + value = Math::Abs((float)v1 - (float)v2); + break; case VariantType::Float2: value = Float2::Distance(v1.AsFloat2(), v2.AsFloat2()); break; @@ -316,7 +330,8 @@ void VisjectExecutor::ProcessGroupMath(Box* box, Node* node, Value& value) case VariantType::Double4: value = Double3::Distance((Double3)v1, (Double3)v2); break; - default: CRASH; + default: + value = 0.0f; break; } break; @@ -342,7 +357,8 @@ void VisjectExecutor::ProcessGroupMath(Box* box, Node* node, Value& value) case VariantType::Double4: value = Double3::Dot((Double3)v1, (Double3)v2); break; - default: CRASH; + default: + value = 0.0f; break; } break; @@ -386,7 +402,8 @@ void VisjectExecutor::ProcessGroupMath(Box* box, Node* node, Value& value) case VariantType::Float4: value = Float4(v1.AsFloat4() - 2.0f * v2.AsFloat4() * Float3::Dot((Float3)v1, (Float3)v2)); break; - default: CRASH; + default: + value = 0.0f; break; } break;