119 Commits

Author SHA1 Message Date
43c4d45080 prog
Some checks failed
Build Android / Game (Android, Release ARM64) (push) Has been cancelled
Build iOS / Game (iOS, Release ARM64) (push) Has been cancelled
Build Linux / Editor (Linux, Development x64) (push) Has been cancelled
Build Linux / Game (Linux, Release x64) (push) Has been cancelled
Build macOS / Editor (Mac, Development ARM64) (push) Has been cancelled
Build macOS / Game (Mac, Release ARM64) (push) Has been cancelled
Build Windows / Editor (Windows, Development x64) (push) Has been cancelled
Build Windows / Game (Windows, Release x64) (push) Has been cancelled
Cooker / Cook (Mac) (push) Has been cancelled
Tests / Tests (Linux) (push) Has been cancelled
Tests / Tests (Windows) (push) Has been cancelled
2026-01-05 15:01:51 +02:00
56a85f6ac0 Use float.Equals in equality checks to handle NaN cases
Some checks failed
Build Android / Game (Android, Release ARM64) (push) Has been cancelled
Build iOS / Game (iOS, Release ARM64) (push) Has been cancelled
Build Linux / Editor (Linux, Development x64) (push) Has been cancelled
Build Linux / Game (Linux, Release x64) (push) Has been cancelled
Build macOS / Editor (Mac, Development ARM64) (push) Has been cancelled
Build macOS / Game (Mac, Release ARM64) (push) Has been cancelled
Build Windows / Editor (Windows, Development x64) (push) Has been cancelled
Build Windows / Game (Windows, Release x64) (push) Has been cancelled
Cooker / Cook (Mac) (push) Has been cancelled
Tests / Tests (Linux) (push) Has been cancelled
Tests / Tests (Windows) (push) Has been cancelled
2026-01-04 03:09:17 +02:00
1b8e25cb86 some 2026-01-04 02:57:02 +02:00
7088ce8742 initial nativestring and nativearray marshalling
Some checks failed
Build Android / Game (Android, Release ARM64) (push) Has been cancelled
Build iOS / Game (iOS, Release ARM64) (push) Has been cancelled
Build Linux / Editor (Linux, Development x64) (push) Has been cancelled
Build Linux / Game (Linux, Release x64) (push) Has been cancelled
Build macOS / Editor (Mac, Development ARM64) (push) Has been cancelled
Build macOS / Game (Mac, Release ARM64) (push) Has been cancelled
Build Windows / Editor (Windows, Development x64) (push) Has been cancelled
Build Windows / Game (Windows, Release x64) (push) Has been cancelled
Cooker / Cook (Mac) (push) Has been cancelled
Tests / Tests (Linux) (push) Has been cancelled
Tests / Tests (Windows) (push) Has been cancelled
2026-01-03 16:00:55 +02:00
c7326ea483 _prog
Some checks failed
Build Android / Game (Android, Release ARM64) (push) Has been cancelled
Build iOS / Game (iOS, Release ARM64) (push) Has been cancelled
Build Linux / Editor (Linux, Development x64) (push) Has been cancelled
Build Linux / Game (Linux, Release x64) (push) Has been cancelled
Build macOS / Editor (Mac, Development ARM64) (push) Has been cancelled
Build macOS / Game (Mac, Release ARM64) (push) Has been cancelled
Build Windows / Editor (Windows, Development x64) (push) Has been cancelled
Build Windows / Game (Windows, Release x64) (push) Has been cancelled
Cooker / Cook (Mac) (push) Has been cancelled
Tests / Tests (Linux) (push) Has been cancelled
Tests / Tests (Windows) (push) Has been cancelled
2025-12-27 17:59:40 +02:00
523cad3b2c Skip including known non-code subfolders from Source folder 2025-12-27 17:59:33 +02:00
ff6816396c _Formatting flags 2025-12-26 21:49:13 +02:00
24b8ad77fe Fix managed wrapper function parameter handling for BytesContainer 2025-12-23 00:36:57 +02:00
3008d8037d _unbox
Some checks failed
Build Android / Game (Android, Release ARM64) (push) Has been cancelled
Build iOS / Game (iOS, Release ARM64) (push) Has been cancelled
Build Linux / Editor (Linux, Development x64) (push) Has been cancelled
Build Linux / Game (Linux, Release x64) (push) Has been cancelled
Build macOS / Editor (Mac, Development ARM64) (push) Has been cancelled
Build macOS / Game (Mac, Release ARM64) (push) Has been cancelled
Build Windows / Editor (Windows, Development x64) (push) Has been cancelled
Build Windows / Game (Windows, Release x64) (push) Has been cancelled
Cooker / Cook (Mac) (push) Has been cancelled
Tests / Tests (Linux) (push) Has been cancelled
Tests / Tests (Windows) (push) Has been cancelled
2025-12-21 20:17:24 +02:00
0973363c64 wip 2 no leaks 2025-12-21 17:45:46 +02:00
5d45b9ea1c Fix managed boolean array conversion to native array 2025-12-20 01:51:37 +02:00
c40f7c12f2 Fix incorrect class namespace in bindings class name lookups 2025-12-19 23:57:31 +02:00
1b2d6372b2 Fix warnings 2025-12-19 13:16:35 +02:00
0782ea889c Fix command-line parsing for SDL CreateProcess arguments 2025-12-19 13:16:35 +02:00
ef89501111 Add function for parsing command-line arguments into argument list 2025-12-19 13:16:35 +02:00
608353b996 _managed handle pool start 2025-12-19 13:14:11 +02:00
221325ef09 _freemanaged dllexport used 2025-12-19 13:14:10 +02:00
8f57c91a9e _track disabled 2025-12-19 13:14:10 +02:00
968de34cae _wip 2025-12-19 13:14:10 +02:00
6586a98f8d Ensure managed converter functions are exported with optimizations 2025-12-19 13:14:10 +02:00
b3510b0e44 Add USED attribute for forcing compiler to emit the symbol 2025-12-19 13:14:10 +02:00
d5a92c1942 Fix missing exports for managed converter structures 2025-12-19 13:14:10 +02:00
417f82826f Expose RenderContext to scripting API 2025-12-19 13:14:10 +02:00
63bed0986a Fix clang bindings code generation for non-const ref parameters 2025-12-19 13:14:10 +02:00
c40eefc79d Fix compilation errors with /permissive- standard conformance mode 2025-12-19 13:14:10 +02:00
d68631dd20 Fix Editor project file generation to use custom code editor arguments 2025-12-19 13:14:10 +02:00
e77b772010 Get code editor name through CodeEditingManager 2025-12-19 13:14:10 +02:00
e41e956386 Fix default code editor not using Visual Studio as fallback editor 2025-12-19 13:14:10 +02:00
33e47c646b Fix invalid code editor when selected editor is not detected 2025-12-19 13:14:10 +02:00
b30ce6b84f Support Visual Studio 2026 as a generator for CMake dependencies 2025-12-19 01:31:42 +02:00
02f67b25f3 Verify the last project path before using it 2025-12-19 01:31:42 +02:00
469a422681 Add -lastproject editor command-line option to open the last project 2025-12-19 01:31:41 +02:00
42fa0ffdd1 Use last opened project as initial directory in project file dialog 2025-12-19 01:31:41 +02:00
f97ee72f1c Fix SpecialFolder::AppData on Apple systems 2025-12-19 01:31:41 +02:00
89c93dd4f7 Use XDG user directories on Linux special paths 2025-12-19 01:31:40 +02:00
60cd8f702e Fix Flax C#-project launchSettings.json to launch without project 2025-12-19 01:31:40 +02:00
f376ec5c8a Launch editor when debugging C++ projects in Rider Linux/macOS 2025-12-19 01:31:40 +02:00
82bb297119 Use standard output for logging by default 2025-12-16 21:16:05 +02:00
ed994cb560 Run editor with selected project configuration in launchSettings.json 2025-12-16 21:16:05 +02:00
8efe2134f0 Fix duplicate properties for default configuration in C# projects 2025-12-16 21:16:05 +02:00
8efc4715c6 Improve Linux .NET runtime identifier detection
Use the runtime identifier detected during runtime instead of
calling the dotnet tool in order to query it.
2025-12-16 00:15:40 +02:00
48c60144ae Set C# language version to 14 with .NET 10 2025-12-16 00:15:40 +02:00
249cde467e Improve installed .NET runtime version detection 2025-12-16 00:15:40 +02:00
e2eadc87b6 Fix Editor state after loading a scene without compiled game modules 2025-12-16 00:15:40 +02:00
bc4b94d2bc Use in over ref modifier in Math functions input parameters 2025-12-16 00:15:30 +02:00
ecf074801f Fix ref usage warnings with in-parameters 2025-12-16 00:15:30 +02:00
74bac97f44 Deprecate UseFastPDBLinking
This is no longer supported in VS2026
2025-12-16 00:15:30 +02:00
d7eebb699c Pass const ref parameters as in parameters in C# bindings
_amend in parameters
2025-12-16 00:15:29 +02:00
dde07bac8d Fix mixed newline characters in generated bindings 2025-12-16 00:14:16 +02:00
5c8e593d89 Show properties without getter in generic editor 2025-12-16 00:14:16 +02:00
46fd5a5855 Ensure Flax.Build tasks and utilities output error messages as errors 2025-12-16 00:11:06 +02:00
74c1e200ce Implement Platform::CreateProcess with SDL backend
Supports handling process standard output and standard error
streams separately in realtime.
2025-12-16 00:10:01 +02:00
31945a53a2 Update SDL to 3.3.4 2025-12-15 19:32:47 +02:00
3e91ba3fb2 Merge remote-tracking branch 'origin/master' into sdl_platform 2025-12-15 19:03:05 +02:00
Wojtek Figat
e257f9e4a0 Merge branch 'Tryibion-fix-anim-slot-replay' 2025-12-14 23:03:45 +01:00
Wojtek Figat
056de752ed Add docs 2025-12-14 23:03:34 +01:00
Wojtek Figat
76700c0b24 Merge branch 'fix-anim-slot-replay' of https://github.com/Tryibion/FlaxEngine into Tryibion-fix-anim-slot-replay 2025-12-14 23:01:21 +01:00
Wojtek Figat
9fdcff657d Merge branch 'VitaminCpp-late_join_fix' 2025-12-14 22:58:55 +01:00
Wojtek Figat
2b6339c05c Minor code cleanup 2025-12-14 22:58:53 +01:00
Wojtek Figat
bb91202439 Merge branch 'late_join_fix' of https://github.com/VitaminCpp/FlaxEngine into VitaminCpp-late_join_fix 2025-12-14 22:49:49 +01:00
Wojtek Figat
f25e9f262a Merge branch 'VitaminCpp-replication_hashing_fix' 2025-12-14 22:48:09 +01:00
Wojtek Figat
ee51077f49 Merge branch 'replication_hashing_fix' of https://github.com/VitaminCpp/FlaxEngine into VitaminCpp-replication_hashing_fix 2025-12-14 22:43:58 +01:00
Wojtek Figat
950e958a58 Merge branch 'VitaminCpp-hash_set_crash_fix' 2025-12-14 22:41:11 +01:00
Wojtek Figat
5fdbed2b56 Minor codestyle adjustments 2025-12-14 22:41:00 +01:00
Chandler Cox
0e627577fc Simplify code. 2025-12-14 15:00:44 -06:00
Wojtek Figat
4846d4b024 Merge branch 'hash_set_crash_fix' of https://github.com/VitaminCpp/FlaxEngine into VitaminCpp-hash_set_crash_fix 2025-12-14 21:52:40 +01:00
Wojtek Figat
5e5293bf7b Merge branch 'GoaLitiuM-oob_write_fix' 2025-12-14 21:31:42 +01:00
Wojtek Figat
d88477dcae Merge branch 'oob_write_fix' of https://github.com/GoaLitiuM/FlaxEngine into GoaLitiuM-oob_write_fix 2025-12-14 21:31:37 +01:00
Wojtek Figat
bd58bd91b4 Merge branch 'ThePhantomMask-AddDropdownHighlightedColor' 2025-12-13 23:14:47 +01:00
Wojtek Figat
7ce0d88bdc Merge branch 'AddDropdownHighlightedColor' of https://github.com/ThePhantomMask/FlaxEngine into ThePhantomMask-AddDropdownHighlightedColor 2025-12-13 23:14:09 +01:00
Wojtek Figat
98bb2d40d6 Merge branch 'Inertia-Squared-hyprland-fix' 2025-12-13 23:13:30 +01:00
Wojtek Figat
f4bc620bbd Merge branch 'hyprland-fix' of https://github.com/Inertia-Squared/FlaxEngine into Inertia-Squared-hyprland-fix 2025-12-13 23:13:26 +01:00
Wojtek Figat
0313bf32c9 Merge branch 'AcidicVoid-master' 2025-12-13 23:11:05 +01:00
Wojtek Figat
0c887cd29e Use fix from #3830 in particle and anim graphs too 2025-12-13 23:11:01 +01:00
Wojtek Figat
5bd9bce634 Merge branch 'master' of https://github.com/AcidicVoid/FlaxEngine into AcidicVoid-master 2025-12-13 23:08:01 +01:00
Wojtek Figat
2a53d0a462 Fix crash on Visual Script missing asset ref after hot-reload in Editor
#3823
2025-12-13 02:10:41 +01:00
82bd915274 Fix out-of-bounds write while parsing command-line arguments 2025-12-12 14:47:15 +02:00
Wojtek Figat
71391cf1cc Fix deprecated tag placement 2025-12-11 16:38:28 +01:00
Wojtek Figat
b5286af526 Attempt to fix regression from 32bd72fecd 2025-12-11 14:48:18 +01:00
Wojtek Figat
9f07a2a54e Attempt to fix regression from 32bd72fecd 2025-12-10 18:58:43 +01:00
Wojtek Figat
c39c642b60 Add safety check for invalid math values in shader graph generation 2025-12-10 17:39:18 +01:00
Wojtek Figat
02cff3973a Bump up engine version 2025-12-10 15:01:53 +01:00
Wojtek Figat
a63b97d31d Add stripping DXIL debug data from the shader cache when not used 2025-12-10 14:58:12 +01:00
Wojtek Figat
ca52122656 Fix validation error on Windows for textures but optimize buffers instead 2025-12-10 14:53:51 +01:00
Wojtek Figat
20a7fcf6a0 Add profiler wait event for GPU wait on D3D12 2025-12-10 13:01:24 +01:00
Wojtek Figat
43665aa7eb Rename GPUContext::ClearState to ResetState for constentency 2025-12-10 13:00:59 +01:00
Wojtek Figat
3b9b49950c Fixes for Xbox One 2025-12-10 09:48:47 +01:00
Wojtek Figat
0a8752ec0a Fix cross-building building engine with separate executable and library for Unix platforms on Windows 2025-12-10 09:48:27 +01:00
Wojtek Figat
47685dc2be Merge branch 'VitaminCpp-missing_move_semantics_fix' 2025-12-09 10:00:55 +01:00
Wojtek Figat
517ee5bb25 Merge branch 'missing_move_semantics_fix' of https://github.com/VitaminCpp/FlaxEngine into VitaminCpp-missing_move_semantics_fix 2025-12-09 10:00:51 +01:00
Wojtek Figat
3ab01d3576 Merge branch 'VitaminCpp-minor_mem_layout_opt' 2025-12-09 10:00:20 +01:00
Wojtek Figat
31b6d4d658 Merge branch 'minor_mem_layout_opt' of https://github.com/VitaminCpp/FlaxEngine into VitaminCpp-minor_mem_layout_opt 2025-12-09 10:00:16 +01:00
Wojtek Figat
08f840d642 Merge branch 'Tryibion-fix-exception-reload' 2025-12-09 09:59:56 +01:00
Wojtek Figat
776b6259cd Merge branch 'fix-exception-reload' of https://github.com/Tryibion/FlaxEngine into Tryibion-fix-exception-reload 2025-12-09 09:59:34 +01:00
Wojtek Figat
5c81c71116 Move constant buffer init for instanced draws only, others do it in all paths 2025-12-09 09:51:53 +01:00
Wojtek Figat
188b635ea0 Merge remote-tracking branch 'origin/master' 2025-12-09 09:48:05 +01:00
Wojtek Figat
56066a3212 Porting to a famous blue platform 2025-12-08 14:41:55 -08:00
Phantom
ed50ce9c90 Change Dropdown's EditorOrder from 2023 to 2024 2025-12-07 18:48:16 +01:00
Phantom
a7e77f6e21 Update CreatePopupItem method
-Modify the `TextColour` property to use a dynamic value based on `TextColour` multiplied by `0.9f` instead of a fixed value (`Colour.White * 0.9f`).
-Modify the `TextColourHighlighted` property to use the dynamic value of `TextColourHighlighted` instead of a fixed value (`Colour.White`).
2025-12-07 18:23:38 +01:00
Phantom
56278b17ee Add Text Color Highlighted on Dropdown 2025-12-07 16:53:43 +01:00
Wojtek Figat
bd78db72b9 Add Mono AOT dynamic module preloading to speed up startup time 2025-12-05 03:46:28 -08:00
Wojtek Figat
32bd72fecd Minor fix to the game cooker assets summary log of a single asset 2025-12-04 23:51:07 +01:00
Wojtek Figat
3a798a70fa Fix collections capacity growing to use the closest power of two
Capacity was incorrectly 2x larger than needed.
Added unit test to ensure it stays correct.
2025-12-04 23:29:15 +01:00
Wojtek Figat
02429266b1 Fix Array::RemoveAtKeepOrder to avoid memory override with large mem copy 2025-12-03 05:03:21 -08:00
Wojtek Figat
77aea0c69c Fix fatal error reporting from multiple therads to sync and properly log (eg. out of memory) 2025-12-01 08:18:54 -08:00
Inertia
6a3ce862cb - Add X11 Class hints for easy hooking by WMs for window-specific rules (required to fix some bugs in WMs like Hyprland) 2025-12-01 11:19:35 +11:00
Wojtek Figat
93217da619 Add option to merge vertex layout with reference order maintained 2025-11-29 15:04:11 -08:00
VitaminCpp
63def54dad Merge branch 'FlaxEngine:master' into hash_set_crash_fix 2025-11-28 15:55:15 +01:00
Michael Herzog
00f9a28729 Fixed HashSet compaction count after mid-compact growth
Ensure HashSetBase::Compact() preserves _elementsCount even when EnsureCapacity() triggers during compaction. The growth path resets the counter; we now cache the original count and restore it after moving all buckets so Count() stays correct in heavy-collision scenarios.
2025-11-28 15:51:57 +01:00
Michael Herzog
56beca0db4 Fixed network replicated-object deduplication by hashing/equality on ObjectId
Aligned NetworkReplicatedObject equality with its hash (compare ObjectId, not pointer).
2025-11-27 23:28:17 +01:00
Alex Ray
64cd898a65 Bypassing Call Logic in Editor Preview 2025-11-27 18:09:11 +01:00
VitaminCpp
90472a4b31 Merge branch 'FlaxEngine:master' into late_join_fix 2025-11-27 10:33:53 +01:00
Michael Herzog
0007185b5f Fixed late-join network replication
- Adjusted replication to resend unchanged state only to missing clients.
- Skip server serialization when no recipients, and downgrade unknown-despawn noise.
2025-11-26 17:54:49 +01:00
Chandler Cox
1bf6612002 Fix exception thrown when reloading open windows. 2025-11-25 17:26:57 -06:00
Michael Herzog
d9a18b1d31 Fixed HashSet compact rehash under heavy collisions
- Compact now iterates over the old bucket array using the saved oldSize, and frees with that size, avoiding out-of-bounds when _size changes.
- If reinsertion finds no free slot during compaction (pathological collisions), the table grows once and retries, preventing AVs.
- This fix addresses problems with weak hash keys (like #3824).
2025-11-25 21:23:49 +01:00
Michael Herzog
465f30661f Minor memory layout optimization 2025-11-25 17:36:49 +01:00
Michael Herzog
a62ca5452e Fixed missing move semantics in script object reference 2025-11-25 17:33:11 +01:00
Chandler Cox
2d56411e5f Add slot stop methods without anim param. 2025-11-23 14:19:37 -06:00
Chandler Cox
f8dc8ab903 Fix not being able to replay same animation in animation slot. 2025-11-23 14:19:11 -06:00
384 changed files with 11874 additions and 3439 deletions

View File

@@ -4,7 +4,7 @@
"Major": 1, "Major": 1,
"Minor": 11, "Minor": 11,
"Revision": 0, "Revision": 0,
"Build": 6804 "Build": 6805
}, },
"Company": "Flax", "Company": "Flax",
"Copyright": "Copyright (c) 2012-2025 Wojciech Figat. All rights reserved.", "Copyright": "Copyright (c) 2012-2025 Wojciech Figat. All rights reserved.",

View File

@@ -15,7 +15,7 @@ if errorlevel 1 goto BuildToolFailed
:: Build bindings for all editor configurations :: Build bindings for all editor configurations
echo Building C# bindings... echo Building C# bindings...
Binaries\Tools\Flax.Build.exe -build -BuildBindingsOnly -arch=x64 -platform=Windows --buildTargets=FlaxEditor Binaries\Tools\Flax.Build.exe -build -BuildBindingsOnly -arch=x64 -platform=Windows --buildTargets=FlaxEditor,FlaxGame
popd popd
echo Done! echo Done!

View File

@@ -749,7 +749,7 @@ namespace FlaxEditor.Content
} }
// Draw short name // Draw short name
Render2D.PushClip(ref textRect); Render2D.PushClip(textRect);
var scale = 0.95f * view.ViewScale; var scale = 0.95f * view.ViewScale;
Render2D.DrawText(style.FontMedium, ShowFileExtension || view.ShowFileExtensions ? FileName : ShortName, textRect, style.Foreground, nameAlignment, TextAlignment.Center, TextWrapping.WrapWords, 1f, scale); Render2D.DrawText(style.FontMedium, ShowFileExtension || view.ShowFileExtensions ? FileName : ShortName, textRect, style.Foreground, nameAlignment, TextAlignment.Center, TextWrapping.WrapWords, 1f, scale);
Render2D.PopClip(); Render2D.PopClip();

View File

@@ -281,6 +281,13 @@ namespace FlaxEditor.Content
private void CacheData() private void CacheData()
{ {
if (!_asset)
{
_parameters = Utils.GetEmptyArray<ScriptMemberInfo>();
_methods = Utils.GetEmptyArray<ScriptMemberInfo>();
_attributes = Utils.GetEmptyArray<Attribute>();
return;
}
if (_parameters != null) if (_parameters != null)
return; return;
if (_asset.WaitForLoaded()) if (_asset.WaitForLoaded())
@@ -344,13 +351,13 @@ namespace FlaxEditor.Content
} }
/// <inheritdoc /> /// <inheritdoc />
public string Name => Path.GetFileNameWithoutExtension(_asset.Path); public string Name => _asset ? Path.GetFileNameWithoutExtension(_asset.Path) : null;
/// <inheritdoc /> /// <inheritdoc />
public string Namespace => string.Empty; public string Namespace => string.Empty;
/// <inheritdoc /> /// <inheritdoc />
public string TypeName => JsonSerializer.GetStringID(_asset.ID); public string TypeName => _asset ? JsonSerializer.GetStringID(_asset.ID) : null;
/// <inheritdoc /> /// <inheritdoc />
public bool IsPublic => true; public bool IsPublic => true;

View File

@@ -263,7 +263,7 @@ namespace FlaxEditor.Content.Thumbnails
// Create render task but disabled for now // Create render task but disabled for now
_output = GPUDevice.Instance.CreateTexture("ThumbnailsOutput"); _output = GPUDevice.Instance.CreateTexture("ThumbnailsOutput");
var desc = GPUTextureDescription.New2D(PreviewsCache.AssetIconSize, PreviewsCache.AssetIconSize, PreviewsCache.AssetIconsAtlasFormat); var desc = GPUTextureDescription.New2D(PreviewsCache.AssetIconSize, PreviewsCache.AssetIconSize, PreviewsCache.AssetIconsAtlasFormat);
_output.Init(ref desc); _output.Init(desc);
_task = Object.New<RenderTask>(); _task = Object.New<RenderTask>();
_task.Order = 50; // Render this task later _task.Order = 50; // Render this task later
_task.Enabled = false; _task.Enabled = false;

View File

@@ -1368,7 +1368,10 @@ bool CookAssetsStep::Perform(CookingData& data)
{ {
typeName = e.TypeName; typeName = e.TypeName;
} }
LOG(Info, "{0}: {1:>4} assets of total size {2}", typeName, e.Count, Utilities::BytesToText(e.ContentSize)); if (e.Count == 1)
LOG(Info, "{0}: 1 asset of total size {1}", typeName, Utilities::BytesToText(e.ContentSize));
else
LOG(Info, "{0}: {1:>4} assets of total size {2}", typeName, e.Count, Utilities::BytesToText(e.ContentSize));
} }
LOG(Info, ""); LOG(Info, "");
} }

View File

@@ -139,7 +139,7 @@ namespace FlaxEditor.CustomEditors
return new GenericEditor(); return new GenericEditor();
} }
[LibraryImport("FlaxEngine", EntryPoint = "CustomEditorsUtilInternal_GetCustomEditor", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "CustomEditorsUtilInternal_GetCustomEditor", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
[return: MarshalUsing(typeof(SystemTypeMarshaller))] [return: MarshalUsing(typeof(SystemTypeMarshaller))]
internal static partial Type Internal_GetCustomEditor([MarshalUsing(typeof(SystemTypeMarshaller))] Type targetType); internal static partial Type Internal_GetCustomEditor([MarshalUsing(typeof(SystemTypeMarshaller))] Type targetType);
} }

View File

@@ -60,14 +60,14 @@ namespace FlaxEditor.CustomEditors.Dedicated
if (prefab && !prefab.WaitForLoaded()) if (prefab && !prefab.WaitForLoaded())
{ {
var prefabObjectId = actor.PrefabObjectID; var prefabObjectId = actor.PrefabObjectID;
var prefabInstance = prefab.GetDefaultInstance(ref prefabObjectId); var prefabInstance = prefab.GetDefaultInstance(prefabObjectId);
if (prefabInstance != null) if (prefabInstance != null)
{ {
// Use default prefab instance as a reference for the editor // Use default prefab instance as a reference for the editor
Values.SetReferenceValue(prefabInstance); Values.SetReferenceValue(prefabInstance);
// Display prefab UI (when displaying object inside Prefab Window then display only nested prefabs) // Display prefab UI (when displaying object inside Prefab Window then display only nested prefabs)
prefab.GetNestedObject(ref prefabObjectId, out var nestedPrefabId, out var nestedPrefabObjectId); prefab.GetNestedObject(prefabObjectId, out var nestedPrefabId, out var nestedPrefabObjectId);
var nestedPrefab = FlaxEngine.Content.Load<Prefab>(nestedPrefabId); var nestedPrefab = FlaxEngine.Content.Load<Prefab>(nestedPrefabId);
var panel = layout.UniformGrid(); var panel = layout.UniformGrid();
panel.CustomControl.Height = 20.0f; panel.CustomControl.Height = 20.0f;
@@ -207,7 +207,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
{ {
var actor = (Actor)Values[0]; var actor = (Actor)Values[0];
var prefabObjectId = actor.PrefabObjectID; var prefabObjectId = actor.PrefabObjectID;
var prefabInstance = prefab.GetDefaultInstance(ref prefabObjectId); var prefabInstance = prefab.GetDefaultInstance(prefabObjectId);
if (prefabInstance != null) if (prefabInstance != null)
{ {
Values.SetReferenceValue(prefabInstance); Values.SetReferenceValue(prefabInstance);
@@ -525,7 +525,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
var restored = actor.AddScript(removed.PrefabObject.GetType()); var restored = actor.AddScript(removed.PrefabObject.GetType());
var prefabId = actor.PrefabID; var prefabId = actor.PrefabID;
var prefabObjectId = restored.PrefabObjectID; var prefabObjectId = restored.PrefabObjectID;
Script.Internal_LinkPrefab(FlaxEngine.Object.GetUnmanagedPtr(restored), ref prefabId, ref prefabObjectId); Script.Internal_LinkPrefab(FlaxEngine.Object.GetUnmanagedPtr(restored), prefabId, prefabObjectId);
string data = JsonSerializer.Serialize(removed.PrefabObject); string data = JsonSerializer.Serialize(removed.PrefabObject);
JsonSerializer.Deserialize(restored, data); JsonSerializer.Deserialize(restored, data);
@@ -547,7 +547,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
string data = JsonSerializer.Serialize(removedActor.PrefabObject); string data = JsonSerializer.Serialize(removedActor.PrefabObject);
JsonSerializer.Deserialize(restored, data); JsonSerializer.Deserialize(restored, data);
Presenter.Owner.SceneContext.Spawn(restored, parentActor, removedActor.OrderInParent); Presenter.Owner.SceneContext.Spawn(restored, parentActor, removedActor.OrderInParent);
Actor.Internal_LinkPrefab(FlaxEngine.Object.GetUnmanagedPtr(restored), ref prefabId, ref prefabObjectId); Actor.Internal_LinkPrefab(FlaxEngine.Object.GetUnmanagedPtr(restored), prefabId, prefabObjectId);
return; return;
} }

View File

@@ -164,11 +164,11 @@ namespace FlaxEditor.CustomEditors.Dedicated
var button2Rect = new Rectangle(button1Rect.Right + 2, 1, 14, 14); var button2Rect = new Rectangle(button1Rect.Right + 2, 1, 14, 14);
// Deselect // Deselect
if (isSelected && button1Rect.Contains(ref location)) if (isSelected && button1Rect.Contains(location))
Value = new ModelInstanceActor.MeshReference { Actor = null, LODIndex = -1, MeshIndex = -1 }; Value = new ModelInstanceActor.MeshReference { Actor = null, LODIndex = -1, MeshIndex = -1 };
// Picker dropdown menu // Picker dropdown menu
if ((isSelected ? button2Rect : button1Rect).Contains(ref location)) if ((isSelected ? button2Rect : button1Rect).Contains(location))
ShowDropDownMenu(); ShowDropDownMenu();
return base.OnMouseUp(location, button); return base.OnMouseUp(location, button);

View File

@@ -40,7 +40,7 @@ public class ModelPrefabEditor : GenericEditor
if (prefab) if (prefab)
{ {
var prefabObjectId = modelPrefab.PrefabObjectID; var prefabObjectId = modelPrefab.PrefabObjectID;
var prefabObject = prefab.GetDefaultInstance(ref prefabObjectId); var prefabObject = prefab.GetDefaultInstance(prefabObjectId);
if (prefabObject.PrefabID == _prefabId) if (prefabObject.PrefabID == _prefabId)
break; break;
_prefabId = prefabObject.PrefabID; _prefabId = prefabObject.PrefabID;

View File

@@ -192,7 +192,7 @@ namespace FlaxEditor.CustomEditors.Editors
public override bool OnMouseDown(Float2 location, MouseButton button) public override bool OnMouseDown(Float2 location, MouseButton button)
{ {
if (DropdownRect.Contains(ref location)) if (DropdownRect.Contains(location))
{ {
Focus(); Focus();
ShowPicker(); ShowPicker();
@@ -206,7 +206,7 @@ namespace FlaxEditor.CustomEditors.Editors
{ {
base.OnMouseMove(location); base.OnMouseMove(location);
if (DropdownRect.Contains(ref location)) if (DropdownRect.Contains(location))
Cursor = CursorType.Default; Cursor = CursorType.Default;
else else
Cursor = CursorType.IBeam; Cursor = CursorType.IBeam;

View File

@@ -155,7 +155,7 @@ namespace FlaxEditor.CustomEditors.Editors
/// <inheritdoc /> /// <inheritdoc />
public override bool OnMouseDown(Float2 location, MouseButton button) public override bool OnMouseDown(Float2 location, MouseButton button)
{ {
if (button == MouseButton.Left && _arrangeButtonRect.Contains(ref location)) if (button == MouseButton.Left && _arrangeButtonRect.Contains(location))
{ {
_arrangeButtonInUse = true; _arrangeButtonInUse = true;
Focus(); Focus();
@@ -371,7 +371,7 @@ namespace FlaxEditor.CustomEditors.Editors
/// <inheritdoc /> /// <inheritdoc />
public override bool OnMouseDown(Float2 location, MouseButton button) public override bool OnMouseDown(Float2 location, MouseButton button)
{ {
if (button == MouseButton.Left && _arrangeButtonRect.Contains(ref location)) if (button == MouseButton.Left && _arrangeButtonRect.Contains(location))
{ {
_arrangeButtonInUse = true; _arrangeButtonInUse = true;
Focus(); Focus();

View File

@@ -321,11 +321,11 @@ namespace FlaxEditor.CustomEditors.Editors
var button2Rect = new Rectangle(button1Rect.Right + 2, 1, 14, 14); var button2Rect = new Rectangle(button1Rect.Right + 2, 1, 14, 14);
// Deselect // Deselect
if (_value != null && button1Rect.Contains(ref location)) if (_value != null && button1Rect.Contains(location))
Value = null; Value = null;
// Picker dropdown menu // Picker dropdown menu
if (_supportsPickDropDown && (isSelected ? button2Rect : button1Rect).Contains(ref location)) if (_supportsPickDropDown && (isSelected ? button2Rect : button1Rect).Contains(location))
{ {
ShowDropDownMenu(); ShowDropDownMenu();
return true; return true;

View File

@@ -247,7 +247,7 @@ namespace FlaxEditor.CustomEditors.Editors
/// <returns>The items.</returns> /// <returns>The items.</returns>
protected virtual List<ItemInfo> GetItemsForType(ScriptType type) protected virtual List<ItemInfo> GetItemsForType(ScriptType type)
{ {
return GetItemsForType(type, type.IsClass, true); return GetItemsForType(type, type.IsClass, true, true);
} }
/// <summary> /// <summary>
@@ -273,10 +273,14 @@ namespace FlaxEditor.CustomEditors.Editors
var attributes = p.GetAttributes(true); var attributes = p.GetAttributes(true);
var showInEditor = attributes.Any(x => x is ShowInEditorAttribute); var showInEditor = attributes.Any(x => x is ShowInEditorAttribute);
// Skip properties without getter or setter // Skip properties without getter
if (!p.HasGet || (!p.HasSet && !showInEditor && !usePropertiesWithoutSetter)) if (!p.HasGet || (!p.HasSet && !showInEditor && !usePropertiesWithoutSetter))
continue; continue;
// Skip getter-only properties declared in built-in types
if (!p.HasSet && usePropertiesWithoutSetter && p.Type.DeclaringType.Assembly == typeof(Editor).Assembly)
continue;
// Skip hidden fields, handle special attributes // Skip hidden fields, handle special attributes
if ((!p.IsPublic && !showInEditor) || attributes.Any(x => x is HideInEditorAttribute)) if ((!p.IsPublic && !showInEditor) || attributes.Any(x => x is HideInEditorAttribute))
continue; continue;

View File

@@ -219,11 +219,11 @@ namespace FlaxEditor.CustomEditors.Editors
var button2Rect = new Rectangle(button1Rect.Right + 2, 1, 14, 14); var button2Rect = new Rectangle(button1Rect.Right + 2, 1, 14, 14);
// Deselect // Deselect
if (_value && button1Rect.Contains(ref location) && _type == ScriptType.Null) if (_value && button1Rect.Contains(location) && _type == ScriptType.Null)
Value = ScriptType.Null; Value = ScriptType.Null;
// Picker dropdown menu // Picker dropdown menu
if ((isSelected && _type == ScriptType.Null ? button2Rect : button1Rect).Contains(ref location)) if ((isSelected && _type == ScriptType.Null ? button2Rect : button1Rect).Contains(location))
ShowDropDownMenu(); ShowDropDownMenu();
return base.OnMouseUp(location, button); return base.OnMouseUp(location, button);

View File

@@ -526,6 +526,23 @@ int32 Editor::LoadProduct()
return 12; return 12;
} }
// Get the last opened project path
String localCachePath;
FileSystem::GetSpecialFolderPath(SpecialFolder::AppData, localCachePath);
String editorConfigPath = localCachePath / TEXT("Flax");
String lastProjectSettingPath = editorConfigPath / TEXT("LastProject.txt");
if (!FileSystem::DirectoryExists(editorConfigPath))
FileSystem::CreateDirectory(editorConfigPath);
String lastProjectPath;
if (FileSystem::FileExists(lastProjectSettingPath))
File::ReadAllText(lastProjectSettingPath, lastProjectPath);
if (!FileSystem::DirectoryExists(lastProjectPath))
lastProjectPath = String::Empty;
// Try to open the last project when requested
if (projectPath.IsEmpty() && CommandLine::Options.LastProject.IsTrue() && !lastProjectPath.IsEmpty())
projectPath = lastProjectPath;
// Missing project case // Missing project case
if (projectPath.IsEmpty()) if (projectPath.IsEmpty())
{ {
@@ -541,7 +558,7 @@ int32 Editor::LoadProduct()
Array<String> files; Array<String> files;
if (FileSystem::ShowOpenFileDialog( if (FileSystem::ShowOpenFileDialog(
nullptr, nullptr,
StringView::Empty, lastProjectPath,
TEXT("Project files (*.flaxproj)\0*.flaxproj\0All files (*.*)\0*.*\0"), TEXT("Project files (*.flaxproj)\0*.flaxproj\0All files (*.*)\0*.*\0"),
false, false,
TEXT("Select project to open in Editor"), TEXT("Select project to open in Editor"),
@@ -625,6 +642,10 @@ int32 Editor::LoadProduct()
} }
} }
// Update the last opened project path
if (lastProjectPath.Compare(Project->ProjectFolderPath) != 0)
File::WriteAllText(lastProjectSettingPath, Project->ProjectFolderPath, Encoding::UTF8);
return 0; return 0;
} }

View File

@@ -69,18 +69,18 @@ namespace FlaxEditor
/// <summary> /// <summary>
/// Gets a value indicating whether this Editor is running a dev instance of the engine. /// Gets a value indicating whether this Editor is running a dev instance of the engine.
/// </summary> /// </summary>
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_IsDevInstance", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_IsDevInstance")]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool IsDevInstance(); internal static partial bool IsDevInstance();
/// <summary> /// <summary>
/// Gets a value indicating whether this Editor is running as official build (distributed via Flax services). /// Gets a value indicating whether this Editor is running as official build (distributed via Flax services).
/// </summary> /// </summary>
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_IsOfficialBuild", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_IsOfficialBuild")]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool IsOfficialBuild(); internal static partial bool IsOfficialBuild();
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_IsPlayMode", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_IsPlayMode")]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool Internal_IsPlayMode(); internal static partial bool Internal_IsPlayMode();
@@ -1056,7 +1056,7 @@ namespace FlaxEditor
if (actor) if (actor)
{ {
Internal_GetEditorBoxWithChildren(FlaxEngine.Object.GetUnmanagedPtr(actor), out var box); Internal_GetEditorBoxWithChildren(FlaxEngine.Object.GetUnmanagedPtr(actor), out var box);
BoundingSphere.FromBox(ref box, out sphere); BoundingSphere.FromBox(box, out sphere);
if (sphere == BoundingSphere.Empty) if (sphere == BoundingSphere.Empty)
sphere = new BoundingSphere(actor.Position, sphere.Radius); sphere = new BoundingSphere(actor.Position, sphere.Radius);
sphere.Radius = Math.Max(sphere.Radius, 15.0f); sphere.Radius = Math.Max(sphere.Radius, 15.0f);
@@ -1647,96 +1647,103 @@ namespace FlaxEditor
} }
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_ReadOutputLogs", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_ReadOutputLogs", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
internal static partial int Internal_ReadOutputLogs([MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "outCapacity")] ref string[] outMessages, [MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "outCapacity")] ref byte[] outLogTypes, [MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "outCapacity")] ref long[] outLogTimes, int outCapacity); internal static partial int Internal_ReadOutputLogs([MarshalUsing(typeof(FlaxEngine.Interop.NativeArrayMarshaller<string, FlaxEngine.Interop.NativeString>), CountElementName = "outCapacity")] ref string[] outMessages, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U1, SizeParamIndex = 3)] ref byte[] outLogTypes, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I8, SizeParamIndex = 3)] ref long[] outLogTimes, int outCapacity);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SetPlayMode", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SetPlayMode")]
internal static partial void Internal_SetPlayMode([MarshalAs(UnmanagedType.U1)] bool value); internal static partial void Internal_SetPlayMode([MarshalAs(UnmanagedType.U1)] bool value);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetProjectPath", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] internal static string Internal_GetProjectPath()
internal static partial string Internal_GetProjectPath(); {
Internal_GetProjectPath(out string projectPath);
return projectPath;
}
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CloneAssetFile", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetProjectPath", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
internal static partial void Internal_GetProjectPath([MarshalUsing(typeof(FlaxEngine.Interop.StringViewMarshaller))] out string projectPath);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CloneAssetFile", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool Internal_CloneAssetFile(string dstPath, string srcPath, ref Guid dstId); internal static partial bool Internal_CloneAssetFile(string dstPath, string srcPath, ref Guid dstId);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetAudioClipMetadata", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetAudioClipMetadata")]
internal static partial void Internal_GetAudioClipMetadata(IntPtr obj, out int originalSize, out int importedSize); internal static partial void Internal_GetAudioClipMetadata(IntPtr obj, out int originalSize, out int importedSize);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SaveJsonAsset", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SaveJsonAsset", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool Internal_SaveJsonAsset(string outputPath, string data, string typename); internal static partial bool Internal_SaveJsonAsset(string outputPath, string data, string typename);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CopyCache", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CopyCache")]
internal static partial void Internal_CopyCache(ref Guid dstId, ref Guid srcId); internal static partial void Internal_CopyCache(ref Guid dstId, ref Guid srcId);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_BakeLightmaps", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_BakeLightmaps")]
internal static partial void Internal_BakeLightmaps([MarshalAs(UnmanagedType.U1)] bool cancel); internal static partial void Internal_BakeLightmaps([MarshalAs(UnmanagedType.U1)] bool cancel);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetShaderAssetSourceCode", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetShaderAssetSourceCode", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
[return: MarshalUsing(typeof(FlaxEngine.Interop.StringViewMarshaller))]
internal static partial string Internal_GetShaderAssetSourceCode(IntPtr obj); internal static partial string Internal_GetShaderAssetSourceCode(IntPtr obj);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CookMeshCollision", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CookMeshCollision", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool Internal_CookMeshCollision(string path, CollisionDataType type, IntPtr model, int modelLodIndex, uint materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int convexVertexLimit); internal static partial bool Internal_CookMeshCollision(string path, CollisionDataType type, IntPtr model, int modelLodIndex, uint materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int convexVertexLimit);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetCollisionWires", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetCollisionWires")]
internal static partial void Internal_GetCollisionWires(IntPtr collisionData, [MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "trianglesCount")] out Float3[] triangles, [MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "indicesCount")] out int[] indices, out int trianglesCount, out int indicesCount); internal static partial void Internal_GetCollisionWires(IntPtr collisionData, [MarshalUsing(typeof(FlaxEngine.Interop.NativeArrayMarshaller<,>), CountElementName = "trianglesCount")] out Float3[] triangles, [MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "indicesCount")] out int[] indices, out int trianglesCount, out int indicesCount);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetEditorBoxWithChildren", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetEditorBoxWithChildren")]
internal static partial void Internal_GetEditorBoxWithChildren(IntPtr obj, out BoundingBox resultAsRef); internal static partial void Internal_GetEditorBoxWithChildren(IntPtr obj, out BoundingBox resultAsRef);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SetOptions", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SetOptions")]
internal static partial void Internal_SetOptions(ref InternalOptions options); internal static partial void Internal_SetOptions(ref InternalOptions options);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_DrawNavMesh", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_DrawNavMesh")]
internal static partial void Internal_DrawNavMesh(); internal static partial void Internal_DrawNavMesh();
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CloseSplashScreen", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CloseSplashScreen")]
internal static partial void Internal_CloseSplashScreen(); internal static partial void Internal_CloseSplashScreen();
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CreateVisualScript", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CreateVisualScript", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool Internal_CreateVisualScript(string outputPath, string baseTypename); internal static partial bool Internal_CreateVisualScript(string outputPath, string baseTypename);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CanImport", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CanImport", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
internal static partial string Internal_CanImport(string extension); internal static partial string Internal_CanImport(string extension);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CanExport", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CanExport", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool Internal_CanExport(string path); internal static partial bool Internal_CanExport(string path);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_Export", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_Export", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool Internal_Export(string inputPath, string outputFolder); internal static partial bool Internal_Export(string inputPath, string outputFolder);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetIsEveryAssemblyLoaded", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetIsEveryAssemblyLoaded")]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool Internal_GetIsEveryAssemblyLoaded(); internal static partial bool Internal_GetIsEveryAssemblyLoaded();
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetLastProjectOpenedEngineBuild", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetLastProjectOpenedEngineBuild")]
internal static partial int Internal_GetLastProjectOpenedEngineBuild(); internal static partial int Internal_GetLastProjectOpenedEngineBuild();
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetIsCSGActive", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetIsCSGActive")]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool Internal_GetIsCSGActive(); internal static partial bool Internal_GetIsCSGActive();
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_RunVisualScriptBreakpointLoopTick", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_RunVisualScriptBreakpointLoopTick")]
internal static partial void Internal_RunVisualScriptBreakpointLoopTick(float deltaTime); internal static partial void Internal_RunVisualScriptBreakpointLoopTick(float deltaTime);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_DeserializeSceneObject", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_DeserializeSceneObject", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))]
internal static partial void Internal_DeserializeSceneObject(IntPtr sceneObject, string json); internal static partial void Internal_DeserializeSceneObject(IntPtr sceneObject, string json);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_LoadAsset", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_LoadAsset")]
internal static partial void Internal_LoadAsset(ref Guid id); internal static partial void Internal_LoadAsset(ref Guid id);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CanSetToRoot", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CanSetToRoot")]
[return: MarshalAs(UnmanagedType.U1)] [return: MarshalAs(UnmanagedType.U1)]
internal static partial bool Internal_CanSetToRoot(IntPtr prefab, IntPtr newRoot); internal static partial bool Internal_CanSetToRoot(IntPtr prefab, IntPtr newRoot);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetAnimationTime", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetAnimationTime")]
internal static partial float Internal_GetAnimationTime(IntPtr animatedModel); internal static partial float Internal_GetAnimationTime(IntPtr animatedModel);
[LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SetAnimationTime", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SetAnimationTime")]
internal static partial void Internal_SetAnimationTime(IntPtr animatedModel, float time); internal static partial void Internal_SetAnimationTime(IntPtr animatedModel, float time);
#endregion #endregion

View File

@@ -96,7 +96,7 @@ namespace FlaxEditor.GUI
private void DoDrag() private void DoDrag()
{ {
// Do the drag drop operation if has selected element // Do the drag drop operation if has selected element
if (new Rectangle(Float2.Zero, Size).Contains(ref _mouseDownPos)) if (new Rectangle(Float2.Zero, Size).Contains(_mouseDownPos))
{ {
if (Validator.SelectedAsset != null) if (Validator.SelectedAsset != null)
DoDragDrop(DragAssets.GetDragData(Validator.SelectedAsset)); DoDragDrop(DragAssets.GetDragData(Validator.SelectedAsset));

View File

@@ -62,7 +62,7 @@ namespace FlaxEditor.GUI
for (int i = 0; i < children.Count; i++) for (int i = 0; i < children.Count; i++)
{ {
if (children[i] is KeyframePoint p) if (children[i] is KeyframePoint p)
p.IsSelected = p.Bounds.Intersects(ref selectionRect); p.IsSelected = p.Bounds.Intersects(selectionRect);
} }
_editor.UpdateTangents(); _editor.UpdateTangents();
} }
@@ -85,7 +85,7 @@ namespace FlaxEditor.GUI
internal void OnMove(Float2 location) internal void OnMove(Float2 location)
{ {
// Skip updating keyframes until move actual starts to be meaningful // Skip updating keyframes until move actual starts to be meaningful
if (Float2.Distance(ref _movingSelectionStartPosLock, ref location) < 1.5f) if (Float2.Distance(_movingSelectionStartPosLock, location) < 1.5f)
return; return;
_movingSelectionStartPosLock = Float2.Minimum; _movingSelectionStartPosLock = Float2.Minimum;

View File

@@ -689,8 +689,8 @@ namespace FlaxEditor.GUI
if (selectedOnly && !point.IsSelected) if (selectedOnly && !point.IsSelected)
continue; continue;
var pos = point.Point; var pos = point.Point;
Float2.Min(ref posMin, ref pos, out posMin); Float2.Min(posMin, pos, out posMin);
Float2.Max(ref posMax, ref pos, out posMax); Float2.Max(posMax, pos, out posMax);
} }
// Apply margin around the area // Apply margin around the area
@@ -703,16 +703,16 @@ namespace FlaxEditor.GUI
PointFromKeyframesToContents(ref posMin, ref viewRect); PointFromKeyframesToContents(ref posMin, ref viewRect);
PointFromKeyframesToContents(ref posMax, ref viewRect); PointFromKeyframesToContents(ref posMax, ref viewRect);
var tmp = posMin; var tmp = posMin;
Float2.Min(ref posMin, ref posMax, out posMin); Float2.Min(posMin, posMax, out posMin);
Float2.Max(ref posMax, ref tmp, out posMax); Float2.Max(posMax, tmp, out posMax);
var contentsSize = posMax - posMin; var contentsSize = posMax - posMin;
// Convert from Contents to Main Panel // Convert from Contents to Main Panel
posMin = _contents.PointToParent(posMin); posMin = _contents.PointToParent(posMin);
posMax = _contents.PointToParent(posMax); posMax = _contents.PointToParent(posMax);
tmp = posMin; tmp = posMin;
Float2.Min(ref posMin, ref posMax, out posMin); Float2.Min(posMin, posMax, out posMin);
Float2.Max(ref posMax, ref tmp, out posMax); Float2.Max(posMax, tmp, out posMax);
// Update zoom (leave unchanged when focusing a single point) // Update zoom (leave unchanged when focusing a single point)
var zoomMask = EnableZoom; var zoomMask = EnableZoom;
@@ -941,7 +941,7 @@ namespace FlaxEditor.GUI
{ {
SetupGrid(out var min, out var max, out var pixelRange); SetupGrid(out var min, out var max, out var pixelRange);
Render2D.PushClip(ref viewRect); Render2D.PushClip(viewRect);
if ((ShowAxes & UseMode.Vertical) == UseMode.Vertical) if ((ShowAxes & UseMode.Vertical) == UseMode.Vertical)
DrawAxis(Float2.UnitX, viewRect, min.X, max.X, pixelRange.X); DrawAxis(Float2.UnitX, viewRect, min.X, max.X, pixelRange.X);
@@ -954,7 +954,7 @@ namespace FlaxEditor.GUI
// Draw curve // Draw curve
if (!_showCollapsed) if (!_showCollapsed)
{ {
Render2D.PushClip(ref rect); Render2D.PushClip(rect);
DrawCurve(ref viewRect); DrawCurve(ref viewRect);
Render2D.PopClip(); Render2D.PopClip();
} }

View File

@@ -180,7 +180,7 @@ namespace FlaxEditor.GUI.Input
Focus(); Focus();
float mousePosition = location.X; float mousePosition = location.X;
if (_thumbRect.Contains(ref location)) if (_thumbRect.Contains(location))
{ {
// Start sliding // Start sliding
_isSliding = true; _isSliding = true;

View File

@@ -144,7 +144,7 @@ namespace FlaxEditor.GUI.Timeline
var k = keyframes[i]; var k = keyframes[i];
var sphere = new BoundingSphere(k.Value, KeyframeSize); var sphere = new BoundingSphere(k.Value, KeyframeSize);
if (sphere.Intersects(ref selectRay)) if (sphere.Intersects(selectRay))
{ {
SelectKeyframe(_track, i, 0); SelectKeyframe(_track, i, 0);
return; return;
@@ -154,7 +154,7 @@ namespace FlaxEditor.GUI.Timeline
{ {
var t = k.Value + k.TangentIn; var t = k.Value + k.TangentIn;
var box = BoundingBox.FromSphere(new BoundingSphere(t, TangentSize)); var box = BoundingBox.FromSphere(new BoundingSphere(t, TangentSize));
if (box.Intersects(ref selectRay)) if (box.Intersects(selectRay))
{ {
SelectKeyframe(_track, i, 1); SelectKeyframe(_track, i, 1);
return; return;
@@ -165,7 +165,7 @@ namespace FlaxEditor.GUI.Timeline
{ {
var t = k.Value + k.TangentOut; var t = k.Value + k.TangentOut;
var box = BoundingBox.FromSphere(new BoundingSphere(t, TangentSize)); var box = BoundingBox.FromSphere(new BoundingSphere(t, TangentSize));
if (box.Intersects(ref selectRay)) if (box.Intersects(selectRay))
{ {
SelectKeyframe(_track, i, 2); SelectKeyframe(_track, i, 2);
return; return;

View File

@@ -115,7 +115,7 @@ namespace FlaxEditor.GUI.Timeline.GUI
/// <inheritdoc /> /// <inheritdoc />
public override void OnMouseMove(Float2 location) public override void OnMouseMove(Float2 location)
{ {
if (_isMoving && Float2.DistanceSquared(ref location, ref _startMovePos) > 25.0f) if (_isMoving && Float2.DistanceSquared(location, _startMovePos) > 25.0f)
{ {
_startMovePos = Float2.Minimum; _startMovePos = Float2.Minimum;
var x = PointToParent(location).X; var x = PointToParent(location).X;
@@ -387,7 +387,7 @@ namespace FlaxEditor.GUI.Timeline.GUI
{ {
// Push clipping mask // Push clipping mask
GetDesireClientArea(out var clientArea); GetDesireClientArea(out var clientArea);
Render2D.PushClip(ref clientArea); Render2D.PushClip(clientArea);
var style = Style.Current; var style = Style.Current;
var bounds = new Rectangle(Float2.Zero, Size); var bounds = new Rectangle(Float2.Zero, Size);

View File

@@ -115,7 +115,7 @@ namespace FlaxEditor.GUI
{ {
if (Children[i] is KeyframePoint p) if (Children[i] is KeyframePoint p)
{ {
p.IsSelected = p.Bounds.Intersects(ref selectionRect); p.IsSelected = p.Bounds.Intersects(selectionRect);
} }
} }
} }
@@ -401,7 +401,7 @@ namespace FlaxEditor.GUI
Cursor = CursorType.Default; Cursor = CursorType.Default;
// Check if no move has been made at all // Check if no move has been made at all
if (Float2.Distance(ref location, ref _rightMouseDownPos) < 2.0f) if (Float2.Distance(location, _rightMouseDownPos) < 2.0f)
{ {
var selectionCount = _editor.SelectionCount; var selectionCount = _editor.SelectionCount;
var point = GetChildAt(location) as KeyframePoint; var point = GetChildAt(location) as KeyframePoint;

View File

@@ -50,14 +50,14 @@ namespace FlaxEditor.GUI.Timeline.GUI
var color = (_timeline.IsMovingPositionHandle ? style.SelectionBorder : style.Foreground).AlphaMultiplied(0.6f); var color = (_timeline.IsMovingPositionHandle ? style.SelectionBorder : style.Foreground).AlphaMultiplied(0.6f);
Matrix3x3.RotationZ(Mathf.PiOverTwo, out var m1); Matrix3x3.RotationZ(Mathf.PiOverTwo, out var m1);
var m2 = Matrix3x3.Translation2D(0, timeAxisHeaderOffset); var m2 = Matrix3x3.Translation2D(0, timeAxisHeaderOffset);
Matrix3x3.Multiply(ref m1, ref m2, out var m3); Matrix3x3.Multiply(m1, m2, out var m3);
Render2D.PushTransform(ref m3); Render2D.PushTransform(m3);
// TODO: Convert to its own sprite or 9 slice // TODO: Convert to its own sprite or 9 slice
Render2D.DrawSprite(icon, new Rectangle(new Float2(10, -icon.Size.X * 0.5f - 1), Size + new Float2(0, 1)), color); Render2D.DrawSprite(icon, new Rectangle(new Float2(10, -icon.Size.X * 0.5f - 1), Size + new Float2(0, 1)), color);
Render2D.FillRectangle(new Rectangle(new Float2(-6, -icon.Size.Y * 0.5f + 7), new Float2(timeAxisOverlap, 5)), color); Render2D.FillRectangle(new Rectangle(new Float2(-6, -icon.Size.Y * 0.5f + 7), new Float2(timeAxisOverlap, 5)), color);
Render2D.PopTransform(); Render2D.PopTransform();
var textMatrix = Matrix3x3.Translation2D(12, timeAxisHeaderOffset); var textMatrix = Matrix3x3.Translation2D(12, timeAxisHeaderOffset);
Render2D.PushTransform(ref textMatrix); Render2D.PushTransform(textMatrix);
Render2D.DrawText(style.FontSmall, labelText, style.Foreground, new Float2(2, -6)); Render2D.DrawText(style.FontSmall, labelText, style.Foreground, new Float2(2, -6));
Render2D.PopTransform(); Render2D.PopTransform();

View File

@@ -356,7 +356,7 @@ namespace FlaxEditor.GUI.Timeline
{ {
Render2D.DrawLine(bounds.UpperLeft, bounds.BottomLeft, moveColor, moveThickness); Render2D.DrawLine(bounds.UpperLeft, bounds.BottomLeft, moveColor, moveThickness);
} }
else if (IsMouseOver && CanResize && MoveLeftEdgeRect.Contains(ref _mouseLocation)) else if (IsMouseOver && CanResize && MoveLeftEdgeRect.Contains(_mouseLocation))
{ {
Render2D.DrawLine(bounds.UpperLeft, bounds.BottomLeft, Color.Yellow); Render2D.DrawLine(bounds.UpperLeft, bounds.BottomLeft, Color.Yellow);
} }
@@ -364,7 +364,7 @@ namespace FlaxEditor.GUI.Timeline
{ {
Render2D.DrawLine(bounds.UpperRight, bounds.BottomRight, moveColor, moveThickness); Render2D.DrawLine(bounds.UpperRight, bounds.BottomRight, moveColor, moveThickness);
} }
else if (IsMouseOver && CanResize && MoveRightEdgeRect.Contains(ref _mouseLocation)) else if (IsMouseOver && CanResize && MoveRightEdgeRect.Contains(_mouseLocation))
{ {
Render2D.DrawLine(bounds.UpperRight, bounds.BottomRight, Color.Yellow); Render2D.DrawLine(bounds.UpperRight, bounds.BottomRight, Color.Yellow);
} }
@@ -384,8 +384,8 @@ namespace FlaxEditor.GUI.Timeline
_startMoveLocation = Root.MousePosition; _startMoveLocation = Root.MousePosition;
_startMoveStartFrame = StartFrame; _startMoveStartFrame = StartFrame;
_startMoveDuration = DurationFrames; _startMoveDuration = DurationFrames;
_startMoveLeftEdge = MoveLeftEdgeRect.Contains(ref location) && CanResize; _startMoveLeftEdge = MoveLeftEdgeRect.Contains(location) && CanResize;
_startMoveRightEdge = MoveRightEdgeRect.Contains(ref location) && CanResize; _startMoveRightEdge = MoveRightEdgeRect.Contains(location) && CanResize;
StartMouseCapture(true); StartMouseCapture(true);
if (_startMoveLeftEdge || _startMoveRightEdge) if (_startMoveLeftEdge || _startMoveRightEdge)
return true; return true;

View File

@@ -337,7 +337,7 @@ namespace FlaxEditor.GUI.Timeline
DebugDraw.DrawSphere(sphere, selected ? Color.Yellow : Color.Red); DebugDraw.DrawSphere(sphere, selected ? Color.Yellow : Color.Red);
sphere.Radius *= 0.95f; sphere.Radius *= 0.95f;
DebugDraw.DrawSphere(sphere, new Color(1, 0, 0, coveredAlpha), 0, false); DebugDraw.DrawSphere(sphere, new Color(1, 0, 0, coveredAlpha), 0, false);
if (select && sphere.Intersects(ref selectRay)) if (select && sphere.Intersects(selectRay))
SelectKeyframeGizmo(curveTrack, i, 0); SelectKeyframeGizmo(curveTrack, i, 0);
if (!k.TangentIn.IsZero) if (!k.TangentIn.IsZero)
@@ -349,7 +349,7 @@ namespace FlaxEditor.GUI.Timeline
var box = BoundingBox.FromSphere(new BoundingSphere(t, EditCurveTrackGizmo.TangentSize)); var box = BoundingBox.FromSphere(new BoundingSphere(t, EditCurveTrackGizmo.TangentSize));
DebugDraw.DrawBox(box, selected ? Color.Yellow : Color.AliceBlue); DebugDraw.DrawBox(box, selected ? Color.Yellow : Color.AliceBlue);
DebugDraw.DrawBox(box, Color.AliceBlue.AlphaMultiplied(coveredAlpha), 0, false); DebugDraw.DrawBox(box, Color.AliceBlue.AlphaMultiplied(coveredAlpha), 0, false);
if (select && box.Intersects(ref selectRay)) if (select && box.Intersects(selectRay))
SelectKeyframeGizmo(curveTrack, i, 2); SelectKeyframeGizmo(curveTrack, i, 2);
} }
@@ -362,7 +362,7 @@ namespace FlaxEditor.GUI.Timeline
var box = BoundingBox.FromSphere(new BoundingSphere(t, EditCurveTrackGizmo.TangentSize)); var box = BoundingBox.FromSphere(new BoundingSphere(t, EditCurveTrackGizmo.TangentSize));
DebugDraw.DrawBox(box, selected ? Color.Yellow : Color.AliceBlue); DebugDraw.DrawBox(box, selected ? Color.Yellow : Color.AliceBlue);
DebugDraw.DrawBox(box, Color.AliceBlue.AlphaMultiplied(coveredAlpha), 0, false); DebugDraw.DrawBox(box, Color.AliceBlue.AlphaMultiplied(coveredAlpha), 0, false);
if (select && box.Intersects(ref selectRay)) if (select && box.Intersects(selectRay))
SelectKeyframeGizmo(curveTrack, i, 2); SelectKeyframeGizmo(curveTrack, i, 2);
} }

View File

@@ -2078,7 +2078,7 @@ namespace FlaxEditor.GUI.Timeline
if (button == MouseButton.Right && _isRightMouseButtonDown) if (button == MouseButton.Right && _isRightMouseButtonDown)
{ {
_isRightMouseButtonDown = false; _isRightMouseButtonDown = false;
if (Float2.Distance(ref location, ref _rightMouseButtonDownPos) < 4.0f) if (Float2.Distance(location, _rightMouseButtonDownPos) < 4.0f)
ShowContextMenu(location); ShowContextMenu(location);
} }
@@ -2243,7 +2243,7 @@ namespace FlaxEditor.GUI.Timeline
foreach (var media in _tracks[i].Media) foreach (var media in _tracks[i].Media)
{ {
if (media.Bounds.Intersects(ref mediaRect)) if (media.Bounds.Intersects(mediaRect))
{ {
SelectedMedia.Add(media); SelectedMedia.Add(media);
selectionChanged = true; selectionChanged = true;

View File

@@ -810,7 +810,7 @@ namespace FlaxEditor.GUI.Timeline
/// <returns>True if hits it.</returns> /// <returns>True if hits it.</returns>
protected virtual bool TestHeaderHit(ref Float2 location) protected virtual bool TestHeaderHit(ref Float2 location)
{ {
return new Rectangle(0, 0, Width, HeaderHeight).Contains(ref location); return new Rectangle(0, 0, Width, HeaderHeight).Contains(location);
} }
/// <summary> /// <summary>

View File

@@ -208,7 +208,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks
// Hit-test dot // Hit-test dot
var size = Height - 2.0f; var size = Height - 2.0f;
var rect = new Rectangle(new Float2(size * -0.5f) + Size * 0.5f, new Float2(size)); var rect = new Rectangle(new Float2(size * -0.5f) + Size * 0.5f, new Float2(size));
return rect.Contains(ref location); return rect.Contains(location);
} }
return base.ContainsPoint(ref location, precise); return base.ContainsPoint(ref location, precise);

View File

@@ -527,7 +527,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks
{ {
_output = GPUDevice.Instance.CreateTexture("CameraCutMedia.Output"); _output = GPUDevice.Instance.CreateTexture("CameraCutMedia.Output");
var desc = GPUTextureDescription.New2D(Width, Height, PixelFormat.R8G8B8A8_UNorm); var desc = GPUTextureDescription.New2D(Width, Height, PixelFormat.R8G8B8A8_UNorm);
_output.Init(ref desc); _output.Init(desc);
} }
if (_task == null) if (_task == null)
{ {

View File

@@ -258,7 +258,7 @@ namespace FlaxEditor.GUI.Tree
} }
var nodeArea = new Rectangle(pos, child.Size); var nodeArea = new Rectangle(pos, child.Size);
if (child.IsExpanded && range.Intersects(ref nodeArea)) if (child.IsExpanded && range.Intersects(nodeArea))
WalkSelectRangeExpandedTree(selection, child, ref range); WalkSelectRangeExpandedTree(selection, child, ref range);
} }
} }

View File

@@ -555,7 +555,7 @@ namespace FlaxEditor.GUI.Tree
/// <returns>True if hits it.</returns> /// <returns>True if hits it.</returns>
protected virtual bool TestHeaderHit(ref Float2 location) protected virtual bool TestHeaderHit(ref Float2 location)
{ {
return _headerRect.Contains(ref location); return _headerRect.Contains(location);
} }
/// <summary> /// <summary>
@@ -864,14 +864,14 @@ namespace FlaxEditor.GUI.Tree
var child = children[i]; var child = children[i];
if (!child.Visible) if (!child.Visible)
continue; continue;
Render2D.PushTransform(ref child._cachedTransform); Render2D.PushTransform(child._cachedTransform);
child.Draw(); child.Draw();
Render2D.PopTransform(); Render2D.PopTransform();
} }
static Rectangle GetChildGlobalRectangle(Control control, ref Matrix3x3 globalTransform) static Rectangle GetChildGlobalRectangle(Control control, ref Matrix3x3 globalTransform)
{ {
Matrix3x3.Multiply(ref control._cachedTransform, ref globalTransform, out var globalChildTransform); Matrix3x3.Multiply(control._cachedTransform, globalTransform, out var globalChildTransform);
return new Rectangle(globalChildTransform.M31, globalChildTransform.M32, control.Width * globalChildTransform.M11, control.Height * globalChildTransform.M22); return new Rectangle(globalChildTransform.M31, globalChildTransform.M32, control.Width * globalChildTransform.M11, control.Height * globalChildTransform.M22);
} }
} }
@@ -882,7 +882,7 @@ namespace FlaxEditor.GUI.Tree
var child = children[i]; var child = children[i];
if (child.Visible) if (child.Visible)
{ {
Render2D.PushTransform(ref child._cachedTransform); Render2D.PushTransform(child._cachedTransform);
child.Draw(); child.Draw();
Render2D.PopTransform(); Render2D.PopTransform();
} }

View File

@@ -24,7 +24,7 @@ namespace FlaxEditor.GUI.Tree
foreach (var child in Addons) foreach (var child in Addons)
{ {
Render2D.PushTransform(ref child._cachedTransform); Render2D.PushTransform(child._cachedTransform);
child.Draw(); child.Draw();
Render2D.PopTransform(); Render2D.PopTransform();
} }

View File

@@ -56,9 +56,9 @@ namespace FlaxEditor.Gizmo
var width = output.Width; var width = output.Width;
var height = output.Height; var height = output.Height;
var desc = GPUTextureDescription.New2D(width, height, format, GPUTextureFlags.RenderTarget | GPUTextureFlags.ShaderResource, 1, 1, msaaLevel); var desc = GPUTextureDescription.New2D(width, height, format, GPUTextureFlags.RenderTarget | GPUTextureFlags.ShaderResource, 1, 1, msaaLevel);
var target = RenderTargetPool.Get(ref desc); var target = RenderTargetPool.Get(desc);
desc = GPUTextureDescription.New2D(width, height, PixelFormat.D24_UNorm_S8_UInt, GPUTextureFlags.DepthStencil, 1, 1, msaaLevel); desc = GPUTextureDescription.New2D(width, height, PixelFormat.D24_UNorm_S8_UInt, GPUTextureFlags.DepthStencil, 1, 1, msaaLevel);
var targetDepth = RenderTargetPool.Get(ref desc); var targetDepth = RenderTargetPool.Get(desc);
// Copy frame and clear depth // Copy frame and clear depth
context.Draw(target, input); context.Draw(target, input);
@@ -81,16 +81,16 @@ namespace FlaxEditor.Gizmo
} }
// Sort draw calls // Sort draw calls
renderList.SortDrawCalls(ref renderContext, false, DrawCallsListType.GBuffer); renderList.SortDrawCalls(renderContext, false, DrawCallsListType.GBuffer);
renderList.SortDrawCalls(ref renderContext, false, DrawCallsListType.GBufferNoDecals); renderList.SortDrawCalls(renderContext, false, DrawCallsListType.GBufferNoDecals);
renderList.SortDrawCalls(ref renderContext, true, DrawCallsListType.Forward); renderList.SortDrawCalls(renderContext, true, DrawCallsListType.Forward);
// Perform the rendering // Perform the rendering
renderContext.View.Pass = DrawPass.GBuffer; renderContext.View.Pass = DrawPass.GBuffer;
renderList.ExecuteDrawCalls(ref renderContext, DrawCallsListType.GBuffer); renderList.ExecuteDrawCalls(renderContext, DrawCallsListType.GBuffer);
renderList.ExecuteDrawCalls(ref renderContext, DrawCallsListType.GBufferNoDecals); renderList.ExecuteDrawCalls(renderContext, DrawCallsListType.GBufferNoDecals);
renderContext.View.Pass = DrawPass.Forward; renderContext.View.Pass = DrawPass.Forward;
renderList.ExecuteDrawCalls(ref renderContext, DrawCallsListType.Forward); renderList.ExecuteDrawCalls(renderContext, DrawCallsListType.Forward);
// Resolve MSAA texture // Resolve MSAA texture
if (enableMsaa) if (enableMsaa)

View File

@@ -70,7 +70,7 @@ namespace FlaxEditor.Gizmo
_vertexBuffer = new GPUBuffer(); _vertexBuffer = new GPUBuffer();
var layout = GPUVertexLayout.Get([new VertexElement(VertexElement.Types.Position, 0, 0, false, PixelFormat.R32G32B32_Float)]); var layout = GPUVertexLayout.Get([new VertexElement(VertexElement.Types.Position, 0, 0, false, PixelFormat.R32G32B32_Float)]);
var desc = GPUBufferDescription.Vertex(layout, sizeof(Float3), 4); var desc = GPUBufferDescription.Vertex(layout, sizeof(Float3), 4);
_vertexBuffer.Init(ref desc); _vertexBuffer.Init(desc);
} }
if (_indexBuffer == null) if (_indexBuffer == null)
{ {
@@ -78,7 +78,7 @@ namespace FlaxEditor.Gizmo
fixed (uint* ptr = _triangles) fixed (uint* ptr = _triangles)
{ {
var desc = GPUBufferDescription.Index(sizeof(uint), _triangles.Length, new IntPtr(ptr)); var desc = GPUBufferDescription.Index(sizeof(uint), _triangles.Length, new IntPtr(ptr));
_indexBuffer.Init(ref desc); _indexBuffer.Init(desc);
} }
} }
if (_psGrid == null) if (_psGrid == null)
@@ -90,7 +90,7 @@ namespace FlaxEditor.Gizmo
desc.VS = _shader.GPU.GetVS("VS_Grid"); desc.VS = _shader.GPU.GetVS("VS_Grid");
desc.PS = _shader.GPU.GetPS("PS_Grid"); desc.PS = _shader.GPU.GetPS("PS_Grid");
desc.DepthWriteEnable = false; desc.DepthWriteEnable = false;
_psGrid.Init(ref desc); _psGrid.Init(desc);
} }
// Update vertices of the plane // Update vertices of the plane
@@ -113,8 +113,8 @@ namespace FlaxEditor.Gizmo
if (cb != IntPtr.Zero) if (cb != IntPtr.Zero)
{ {
var data = new Data(); var data = new Data();
Matrix.Multiply(ref renderContext.View.View, ref renderContext.View.Projection, out var viewProjection); Matrix.Multiply(renderContext.View.View, renderContext.View.Projection, out var viewProjection);
Matrix.Transpose(ref viewProjection, out data.ViewProjectionMatrix); Matrix.Transpose(viewProjection, out data.ViewProjectionMatrix);
data.ViewPos = renderContext.View.WorldPosition; data.ViewPos = renderContext.View.WorldPosition;
data.GridColor = options.Viewport.ViewportGridColor; data.GridColor = options.Viewport.ViewportGridColor;
data.Far = renderContext.View.Far; data.Far = renderContext.View.Far;

View File

@@ -128,7 +128,7 @@ namespace FlaxEditor.Gizmo
// Pick a temporary depth buffer // Pick a temporary depth buffer
var desc = GPUTextureDescription.New2D(input.Width, input.Height, PixelFormat.D32_Float, GPUTextureFlags.DepthStencil | GPUTextureFlags.ShaderResource); var desc = GPUTextureDescription.New2D(input.Width, input.Height, PixelFormat.D32_Float, GPUTextureFlags.DepthStencil | GPUTextureFlags.ShaderResource);
var customDepth = RenderTargetPool.Get(ref desc); var customDepth = RenderTargetPool.Get(desc);
context.ClearDepth(customDepth.View()); context.ClearDepth(customDepth.View());
// Draw objects to depth buffer // Draw objects to depth buffer
@@ -148,7 +148,7 @@ namespace FlaxEditor.Gizmo
_material.SetParameterValue("OutlineColor1", _color1); _material.SetParameterValue("OutlineColor1", _color1);
_material.SetParameterValue("CustomDepth", customDepth); _material.SetParameterValue("CustomDepth", customDepth);
_material.SetParameterValue("ViewInfo", new Float4(1.0f / projection.M11, 1.0f / projection.M22, far / (far - near), (-far * near) / (far - near) / far)); _material.SetParameterValue("ViewInfo", new Float4(1.0f / projection.M11, 1.0f / projection.M22, far / (far - near), (-far * near) / (far - near) / far));
Renderer.DrawPostFxMaterial(context, ref renderContext, _material, output, input.View()); Renderer.DrawPostFxMaterial(context, renderContext, _material, output, input.View());
// Cleanup // Cleanup
RenderTargetPool.Release(customDepth); RenderTargetPool.Release(customDepth);

View File

@@ -129,7 +129,7 @@ namespace FlaxEditor.Gizmo
if (_selectionParents[i] is ActorNode actorNode) if (_selectionParents[i] is ActorNode actorNode)
{ {
var b = actorNode.Actor.EditorBoxChildren; var b = actorNode.Actor.EditorBoxChildren;
BoundingBox.Merge(ref editorBounds, ref b, out editorBounds); BoundingBox.Merge(editorBounds, b, out editorBounds);
bottomToCenter = Mathf.Min(bottomToCenter, actorNode.Actor.Position.Y - editorBounds.Minimum.Y); bottomToCenter = Mathf.Min(bottomToCenter, actorNode.Actor.Position.Y - editorBounds.Minimum.Y);
} }
} }

View File

@@ -135,7 +135,7 @@ namespace FlaxEditor.Gizmo
Mesh sphereMesh = _modelSphere.LODs[0].Meshes[0]; Mesh sphereMesh = _modelSphere.LODs[0].Meshes[0];
Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m3); Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m3);
Matrix.Multiply(ref m3, ref world, out m1); Matrix.Multiply(m3, world, out m1);
mx1 = m1; mx1 = m1;
mx1.M41 += 0.05f; mx1.M41 += 0.05f;
@@ -149,44 +149,44 @@ namespace FlaxEditor.Gizmo
// X axis // X axis
Matrix.RotationY(-Mathf.PiOverTwo, out m2); Matrix.RotationY(-Mathf.PiOverTwo, out m2);
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance xAxisMaterialTransform = (isXAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisX; MaterialInstance xAxisMaterialTransform = (isXAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisX;
transAxisMesh.Draw(ref renderContext, xAxisMaterialTransform, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); transAxisMesh.Draw(renderContext, xAxisMaterialTransform, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// Y axis // Y axis
Matrix.RotationX(Mathf.PiOverTwo, out m2); Matrix.RotationX(Mathf.PiOverTwo, out m2);
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance yAxisMaterialTransform = (isYAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisY; MaterialInstance yAxisMaterialTransform = (isYAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisY;
transAxisMesh.Draw(ref renderContext, yAxisMaterialTransform, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); transAxisMesh.Draw(renderContext, yAxisMaterialTransform, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// Z axis // Z axis
Matrix.RotationX(Mathf.Pi, out m2); Matrix.RotationX(Mathf.Pi, out m2);
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance zAxisMaterialTransform = (isZAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisZ; MaterialInstance zAxisMaterialTransform = (isZAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisZ;
transAxisMesh.Draw(ref renderContext, zAxisMaterialTransform, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); transAxisMesh.Draw(renderContext, zAxisMaterialTransform, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// XY plane // XY plane
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationX(Mathf.PiOverTwo), new Vector3(boxSize * boxScale, boxSize * boxScale, 0.0f)); m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationX(Mathf.PiOverTwo), new Vector3(boxSize * boxScale, boxSize * boxScale, 0.0f));
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance xyPlaneMaterialTransform = (_activeAxis == Axis.XY && !_isDisabled) ? _materialAxisFocus : _materialAxisX; MaterialInstance xyPlaneMaterialTransform = (_activeAxis == Axis.XY && !_isDisabled) ? _materialAxisFocus : _materialAxisX;
cubeMesh.Draw(ref renderContext, xyPlaneMaterialTransform, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); cubeMesh.Draw(renderContext, xyPlaneMaterialTransform, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// ZX plane // ZX plane
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.Identity, new Vector3(boxSize * boxScale, 0.0f, boxSize * boxScale)); m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.Identity, new Vector3(boxSize * boxScale, 0.0f, boxSize * boxScale));
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance zxPlaneMaterialTransform = (_activeAxis == Axis.ZX && !_isDisabled) ? _materialAxisFocus : _materialAxisY; MaterialInstance zxPlaneMaterialTransform = (_activeAxis == Axis.ZX && !_isDisabled) ? _materialAxisFocus : _materialAxisY;
cubeMesh.Draw(ref renderContext, zxPlaneMaterialTransform, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); cubeMesh.Draw(renderContext, zxPlaneMaterialTransform, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// YZ plane // YZ plane
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationZ(Mathf.PiOverTwo), new Vector3(0.0f, boxSize * boxScale, boxSize * boxScale)); m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationZ(Mathf.PiOverTwo), new Vector3(0.0f, boxSize * boxScale, boxSize * boxScale));
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance yzPlaneMaterialTransform = (_activeAxis == Axis.YZ && !_isDisabled) ? _materialAxisFocus : _materialAxisZ; MaterialInstance yzPlaneMaterialTransform = (_activeAxis == Axis.YZ && !_isDisabled) ? _materialAxisFocus : _materialAxisZ;
cubeMesh.Draw(ref renderContext, yzPlaneMaterialTransform, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); cubeMesh.Draw(renderContext, yzPlaneMaterialTransform, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// Center sphere // Center sphere
Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2); Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2);
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
sphereMesh.Draw(ref renderContext, isCenter ? _materialAxisFocus : _materialSphere, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); sphereMesh.Draw(renderContext, isCenter ? _materialAxisFocus : _materialSphere, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
break; break;
} }
@@ -199,24 +199,24 @@ namespace FlaxEditor.Gizmo
// X axis // X axis
Matrix.RotationZ(Mathf.PiOverTwo, out m2); Matrix.RotationZ(Mathf.PiOverTwo, out m2);
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance xAxisMaterialRotate = (isXAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisX; MaterialInstance xAxisMaterialRotate = (isXAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisX;
rotationAxisMesh.Draw(ref renderContext, xAxisMaterialRotate, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); rotationAxisMesh.Draw(renderContext, xAxisMaterialRotate, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// Y axis // Y axis
MaterialInstance yAxisMaterialRotate = (isYAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisY; MaterialInstance yAxisMaterialRotate = (isYAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisY;
rotationAxisMesh.Draw(ref renderContext, yAxisMaterialRotate, ref m1, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); rotationAxisMesh.Draw(renderContext, yAxisMaterialRotate, m1, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// Z axis // Z axis
Matrix.RotationX(-Mathf.PiOverTwo, out m2); Matrix.RotationX(-Mathf.PiOverTwo, out m2);
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance zAxisMaterialRotate = (isZAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisZ; MaterialInstance zAxisMaterialRotate = (isZAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisZ;
rotationAxisMesh.Draw(ref renderContext, zAxisMaterialRotate, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); rotationAxisMesh.Draw(renderContext, zAxisMaterialRotate, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// Center box // Center box
Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2); Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2);
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
sphereMesh.Draw(ref renderContext, isCenter ? _materialAxisFocus : _materialSphere, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); sphereMesh.Draw(renderContext, isCenter ? _materialAxisFocus : _materialSphere, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
break; break;
} }
@@ -229,44 +229,44 @@ namespace FlaxEditor.Gizmo
// X axis // X axis
Matrix.RotationY(-Mathf.PiOverTwo, out m2); Matrix.RotationY(-Mathf.PiOverTwo, out m2);
Matrix.Multiply(ref m2, ref mx1, out m3); Matrix.Multiply(m2, mx1, out m3);
MaterialInstance xAxisMaterialRotate = (isXAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisX; MaterialInstance xAxisMaterialRotate = (isXAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisX;
scaleAxisMesh.Draw(ref renderContext, xAxisMaterialRotate, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); scaleAxisMesh.Draw(renderContext, xAxisMaterialRotate, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// Y axis // Y axis
Matrix.RotationX(Mathf.PiOverTwo, out m2); Matrix.RotationX(Mathf.PiOverTwo, out m2);
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance yAxisMaterialRotate = (isYAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisY; MaterialInstance yAxisMaterialRotate = (isYAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisY;
scaleAxisMesh.Draw(ref renderContext, yAxisMaterialRotate, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); scaleAxisMesh.Draw(renderContext, yAxisMaterialRotate, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// Z axis // Z axis
Matrix.RotationX(Mathf.Pi, out m2); Matrix.RotationX(Mathf.Pi, out m2);
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance zAxisMaterialRotate = (isZAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisZ; MaterialInstance zAxisMaterialRotate = (isZAxis && !_isDisabled) ? _materialAxisFocus : _materialAxisZ;
scaleAxisMesh.Draw(ref renderContext, zAxisMaterialRotate, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); scaleAxisMesh.Draw(renderContext, zAxisMaterialRotate, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// XY plane // XY plane
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationX(Mathf.PiOverTwo), new Vector3(boxSize * boxScale, boxSize * boxScale, 0.0f)); m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationX(Mathf.PiOverTwo), new Vector3(boxSize * boxScale, boxSize * boxScale, 0.0f));
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance xyPlaneMaterialScale = (_activeAxis == Axis.XY && !_isDisabled) ? _materialAxisFocus : _materialAxisX; MaterialInstance xyPlaneMaterialScale = (_activeAxis == Axis.XY && !_isDisabled) ? _materialAxisFocus : _materialAxisX;
cubeMesh.Draw(ref renderContext, xyPlaneMaterialScale, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); cubeMesh.Draw(renderContext, xyPlaneMaterialScale, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// ZX plane // ZX plane
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.Identity, new Vector3(boxSize * boxScale, 0.0f, boxSize * boxScale)); m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.Identity, new Vector3(boxSize * boxScale, 0.0f, boxSize * boxScale));
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance zxPlaneMaterialScale = (_activeAxis == Axis.ZX && !_isDisabled) ? _materialAxisFocus : _materialAxisZ; MaterialInstance zxPlaneMaterialScale = (_activeAxis == Axis.ZX && !_isDisabled) ? _materialAxisFocus : _materialAxisZ;
cubeMesh.Draw(ref renderContext, zxPlaneMaterialScale, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); cubeMesh.Draw(renderContext, zxPlaneMaterialScale, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// YZ plane // YZ plane
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationZ(Mathf.PiOverTwo), new Vector3(0.0f, boxSize * boxScale, boxSize * boxScale)); m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationZ(Mathf.PiOverTwo), new Vector3(0.0f, boxSize * boxScale, boxSize * boxScale));
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
MaterialInstance yzPlaneMaterialScale = (_activeAxis == Axis.YZ && !_isDisabled) ? _materialAxisFocus : _materialAxisY; MaterialInstance yzPlaneMaterialScale = (_activeAxis == Axis.YZ && !_isDisabled) ? _materialAxisFocus : _materialAxisY;
cubeMesh.Draw(ref renderContext, yzPlaneMaterialScale, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); cubeMesh.Draw(renderContext, yzPlaneMaterialScale, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
// Center box // Center box
Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2); Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2);
Matrix.Multiply(ref m2, ref m1, out m3); Matrix.Multiply(m2, m1, out m3);
sphereMesh.Draw(ref renderContext, isCenter ? _materialAxisFocus : _materialSphere, ref m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); sphereMesh.Draw(renderContext, isCenter ? _materialAxisFocus : _materialSphere, m3, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
break; break;
} }
@@ -278,7 +278,7 @@ namespace FlaxEditor.Gizmo
Transform t = _vertexSnapObject?.Transform ?? _vertexSnapObjectTo.Transform; Transform t = _vertexSnapObject?.Transform ?? _vertexSnapObjectTo.Transform;
Vector3 p = t.LocalToWorld(_vertexSnapObject != null ? _vertexSnapPoint : _vertexSnapPointTo); Vector3 p = t.LocalToWorld(_vertexSnapObject != null ? _vertexSnapPoint : _vertexSnapPointTo);
Matrix matrix = new Transform(p, t.Orientation, new Float3(gizmoModelsScale2RealGizmoSize)).GetWorld(); Matrix matrix = new Transform(p, t.Orientation, new Float3(gizmoModelsScale2RealGizmoSize)).GetWorld();
cubeMesh.Draw(ref renderContext, _materialSphere, ref matrix, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder); cubeMesh.Draw(renderContext, _materialSphere, matrix, StaticFlags.None, true, DrawPass.Default, 0.0f, sortOrder);
} }
} }
} }

View File

@@ -36,7 +36,7 @@ namespace FlaxEditor.Gizmo
private bool IntersectsRotateCircle(Vector3 normal, ref Ray ray, out Real distance) private bool IntersectsRotateCircle(Vector3 normal, ref Ray ray, out Real distance)
{ {
var plane = new Plane(Vector3.Zero, normal); var plane = new Plane(Vector3.Zero, normal);
if (!plane.Intersects(ref ray, out distance)) if (!plane.Intersects(ray, out distance))
return false; return false;
Vector3 hitPoint = ray.Position + ray.Direction * distance; Vector3 hitPoint = ray.Position + ray.Direction * distance;
Real distanceNormalized = hitPoint.Length / RotateRadiusRaw; Real distanceNormalized = hitPoint.Length / RotateRadiusRaw;
@@ -50,8 +50,8 @@ namespace FlaxEditor.Gizmo
// Transform ray into local space of the gizmo // Transform ray into local space of the gizmo
Ray localRay; Ray localRay;
_gizmoWorld.WorldToLocalVector(ref ray.Direction, out localRay.Direction); _gizmoWorld.WorldToLocalVector(ray.Direction, out localRay.Direction);
_gizmoWorld.WorldToLocal(ref ray.Position, out localRay.Position); _gizmoWorld.WorldToLocal(ray.Position, out localRay.Position);
// Find gizmo collisions with mouse // Find gizmo collisions with mouse
Real closestIntersection = Real.MaxValue; Real closestIntersection = Real.MaxValue;
@@ -62,19 +62,19 @@ namespace FlaxEditor.Gizmo
case Mode.Translate: case Mode.Translate:
{ {
// Axis boxes collision // Axis boxes collision
if (XAxisBox.Intersects(ref localRay, out intersection) && intersection < closestIntersection) if (XAxisBox.Intersects(localRay, out intersection) && intersection < closestIntersection)
{ {
_activeAxis = Axis.X; _activeAxis = Axis.X;
closestIntersection = intersection; closestIntersection = intersection;
} }
if (YAxisBox.Intersects(ref localRay, out intersection) && intersection < closestIntersection) if (YAxisBox.Intersects(localRay, out intersection) && intersection < closestIntersection)
{ {
_activeAxis = Axis.Y; _activeAxis = Axis.Y;
closestIntersection = intersection; closestIntersection = intersection;
} }
if (ZAxisBox.Intersects(ref localRay, out intersection) && intersection < closestIntersection) if (ZAxisBox.Intersects(localRay, out intersection) && intersection < closestIntersection)
{ {
_activeAxis = Axis.Z; _activeAxis = Axis.Z;
closestIntersection = intersection; closestIntersection = intersection;
@@ -83,25 +83,25 @@ namespace FlaxEditor.Gizmo
// Quad planes collision // Quad planes collision
if (closestIntersection >= float.MaxValue) if (closestIntersection >= float.MaxValue)
closestIntersection = float.MinValue; closestIntersection = float.MinValue;
if (XYBox.Intersects(ref localRay, out intersection) && intersection > closestIntersection) if (XYBox.Intersects(localRay, out intersection) && intersection > closestIntersection)
{ {
_activeAxis = Axis.XY; _activeAxis = Axis.XY;
closestIntersection = intersection; closestIntersection = intersection;
} }
if (XZBox.Intersects(ref localRay, out intersection) && intersection > closestIntersection) if (XZBox.Intersects(localRay, out intersection) && intersection > closestIntersection)
{ {
_activeAxis = Axis.ZX; _activeAxis = Axis.ZX;
closestIntersection = intersection; closestIntersection = intersection;
} }
if (YZBox.Intersects(ref localRay, out intersection) && intersection > closestIntersection) if (YZBox.Intersects(localRay, out intersection) && intersection > closestIntersection)
{ {
_activeAxis = Axis.YZ; _activeAxis = Axis.YZ;
closestIntersection = intersection; closestIntersection = intersection;
} }
/*// Center /*// Center
if (CenterBoxRaw.Intersects(ref localRay, out intersection) && intersection > closestIntersection) if (CenterBoxRaw.Intersects(localRay, out intersection) && intersection > closestIntersection)
{ {
_activeAxis = Axis.Center; _activeAxis = Axis.Center;
closestIntersection = intersection; closestIntersection = intersection;
@@ -133,17 +133,17 @@ namespace FlaxEditor.Gizmo
case Mode.Scale: case Mode.Scale:
{ {
// Boxes collision // Boxes collision
if (XAxisBox.Intersects(ref localRay, out intersection) && intersection < closestIntersection) if (XAxisBox.Intersects(localRay, out intersection) && intersection < closestIntersection)
{ {
_activeAxis = Axis.X; _activeAxis = Axis.X;
closestIntersection = intersection; closestIntersection = intersection;
} }
if (YAxisBox.Intersects(ref localRay, out intersection) && intersection < closestIntersection) if (YAxisBox.Intersects(localRay, out intersection) && intersection < closestIntersection)
{ {
_activeAxis = Axis.Y; _activeAxis = Axis.Y;
closestIntersection = intersection; closestIntersection = intersection;
} }
if (ZAxisBox.Intersects(ref localRay, out intersection) && intersection < closestIntersection) if (ZAxisBox.Intersects(localRay, out intersection) && intersection < closestIntersection)
{ {
_activeAxis = Axis.Z; _activeAxis = Axis.Z;
closestIntersection = intersection; closestIntersection = intersection;
@@ -153,24 +153,24 @@ namespace FlaxEditor.Gizmo
if (closestIntersection >= float.MaxValue) if (closestIntersection >= float.MaxValue)
closestIntersection = float.MinValue; closestIntersection = float.MinValue;
if (XYBox.Intersects(ref localRay, out intersection) && intersection > closestIntersection) if (XYBox.Intersects(localRay, out intersection) && intersection > closestIntersection)
{ {
_activeAxis = Axis.XY; _activeAxis = Axis.XY;
closestIntersection = intersection; closestIntersection = intersection;
} }
if (XZBox.Intersects(ref localRay, out intersection) && intersection > closestIntersection) if (XZBox.Intersects(localRay, out intersection) && intersection > closestIntersection)
{ {
_activeAxis = Axis.ZX; _activeAxis = Axis.ZX;
closestIntersection = intersection; closestIntersection = intersection;
} }
if (YZBox.Intersects(ref localRay, out intersection) && intersection > closestIntersection) if (YZBox.Intersects(localRay, out intersection) && intersection > closestIntersection)
{ {
_activeAxis = Axis.YZ; _activeAxis = Axis.YZ;
closestIntersection = intersection; closestIntersection = intersection;
} }
// Center // Center
if (CenterBoxRaw.Intersects(ref localRay, out intersection) && intersection > closestIntersection) if (CenterBoxRaw.Intersects(localRay, out intersection) && intersection > closestIntersection)
{ {
_activeAxis = Axis.Center; _activeAxis = Axis.Center;
closestIntersection = intersection; closestIntersection = intersection;

View File

@@ -212,10 +212,10 @@ namespace FlaxEditor.Gizmo
Vector3 delta = Vector3.Zero; Vector3 delta = Vector3.Zero;
Ray ray = Owner.MouseRay; Ray ray = Owner.MouseRay;
Matrix.RotationQuaternion(ref _gizmoWorld.Orientation, out var rotationMatrix); Matrix.RotationQuaternion(_gizmoWorld.Orientation, out var rotationMatrix);
Matrix.Invert(ref rotationMatrix, out var invRotationMatrix); Matrix.Invert(rotationMatrix, out var invRotationMatrix);
ray.Position = Vector3.Transform(ray.Position, invRotationMatrix); ray.Position = Vector3.Transform(ray.Position, invRotationMatrix);
Vector3.TransformNormal(ref ray.Direction, ref invRotationMatrix, out ray.Direction); Vector3.TransformNormal(ray.Direction, invRotationMatrix, out ray.Direction);
var position = Position; var position = Position;
var planeXY = new Plane(Vector3.Backward, Vector3.Transform(position, invRotationMatrix).Z); var planeXY = new Plane(Vector3.Backward, Vector3.Transform(position, invRotationMatrix).Z);
@@ -232,7 +232,7 @@ namespace FlaxEditor.Gizmo
case Axis.X: case Axis.X:
{ {
var plane = planeDotXY > planeDotZX ? planeXY : planeZX; var plane = planeDotXY > planeDotZX ? planeXY : planeZX;
if (ray.Intersects(ref plane, out intersection)) if (ray.Intersects(plane, out intersection))
{ {
_intersectPosition = ray.GetPoint(intersection); _intersectPosition = ray.GetPoint(intersection);
if (!_lastIntersectionPosition.IsZero) if (!_lastIntersectionPosition.IsZero)
@@ -244,7 +244,7 @@ namespace FlaxEditor.Gizmo
case Axis.Y: case Axis.Y:
{ {
var plane = planeDotXY > planeDotYZ ? planeXY : planeYZ; var plane = planeDotXY > planeDotYZ ? planeXY : planeYZ;
if (ray.Intersects(ref plane, out intersection)) if (ray.Intersects(plane, out intersection))
{ {
_intersectPosition = ray.GetPoint(intersection); _intersectPosition = ray.GetPoint(intersection);
if (!_lastIntersectionPosition.IsZero) if (!_lastIntersectionPosition.IsZero)
@@ -256,7 +256,7 @@ namespace FlaxEditor.Gizmo
case Axis.Z: case Axis.Z:
{ {
var plane = planeDotZX > planeDotYZ ? planeZX : planeYZ; var plane = planeDotZX > planeDotYZ ? planeZX : planeYZ;
if (ray.Intersects(ref plane, out intersection)) if (ray.Intersects(plane, out intersection))
{ {
_intersectPosition = ray.GetPoint(intersection); _intersectPosition = ray.GetPoint(intersection);
if (!_lastIntersectionPosition.IsZero) if (!_lastIntersectionPosition.IsZero)
@@ -267,7 +267,7 @@ namespace FlaxEditor.Gizmo
} }
case Axis.YZ: case Axis.YZ:
{ {
if (ray.Intersects(ref planeYZ, out intersection)) if (ray.Intersects(planeYZ, out intersection))
{ {
_intersectPosition = ray.GetPoint(intersection); _intersectPosition = ray.GetPoint(intersection);
if (!_lastIntersectionPosition.IsZero) if (!_lastIntersectionPosition.IsZero)
@@ -288,7 +288,7 @@ namespace FlaxEditor.Gizmo
} }
case Axis.XY: case Axis.XY:
{ {
if (ray.Intersects(ref planeXY, out intersection)) if (ray.Intersects(planeXY, out intersection))
{ {
_intersectPosition = ray.GetPoint(intersection); _intersectPosition = ray.GetPoint(intersection);
if (!_lastIntersectionPosition.IsZero) if (!_lastIntersectionPosition.IsZero)
@@ -309,7 +309,7 @@ namespace FlaxEditor.Gizmo
} }
case Axis.ZX: case Axis.ZX:
{ {
if (ray.Intersects(ref planeZX, out intersection)) if (ray.Intersects(planeZX, out intersection))
{ {
_intersectPosition = ray.GetPoint(intersection); _intersectPosition = ray.GetPoint(intersection);
if (!_lastIntersectionPosition.IsZero) if (!_lastIntersectionPosition.IsZero)
@@ -332,7 +332,7 @@ namespace FlaxEditor.Gizmo
{ {
var gizmoToView = Position - Owner.ViewPosition; var gizmoToView = Position - Owner.ViewPosition;
var plane = new Plane(-Vector3.Normalize(gizmoToView), gizmoToView.Length); var plane = new Plane(-Vector3.Normalize(gizmoToView), gizmoToView.Length);
if (ray.Intersects(ref plane, out intersection)) if (ray.Intersects(plane, out intersection))
{ {
_intersectPosition = ray.GetPoint(intersection); _intersectPosition = ray.GetPoint(intersection);
if (!_lastIntersectionPosition.IsZero) if (!_lastIntersectionPosition.IsZero)
@@ -473,11 +473,11 @@ namespace FlaxEditor.Gizmo
dir = Float3.Forward * _gizmoWorld.Orientation; dir = Float3.Forward * _gizmoWorld.Orientation;
Float3 viewDir = Owner.ViewPosition - Position; Float3 viewDir = Owner.ViewPosition - Position;
Float3.Dot(ref viewDir, ref dir, out float dot); Float3.Dot(viewDir, dir, out float dot);
if (dot < 0.0f) if (dot < 0.0f)
delta *= -1; delta *= -1;
Quaternion.RotationAxis(ref dir, delta, out _rotationDelta); Quaternion.RotationAxis(dir, delta, out _rotationDelta);
break; break;
} }

View File

@@ -240,7 +240,7 @@ namespace FlaxEditor
{ {
foreach (var widget in _widgets) foreach (var widget in _widgets)
{ {
if (widget.Bounds.Contains(ref location)) if (widget.Bounds.Contains(location))
{ {
// Initialize widget movement // Initialize widget movement
_activeWidget = widget; _activeWidget = widget;
@@ -326,7 +326,7 @@ namespace FlaxEditor
{ {
foreach (var widget in _widgets) foreach (var widget in _widgets)
{ {
if (widget.Bounds.Contains(ref location)) if (widget.Bounds.Contains(location))
{ {
Cursor = widget.Cursor; Cursor = widget.Cursor;
cursorChanged = true; cursorChanged = true;
@@ -499,7 +499,7 @@ namespace FlaxEditor
var min = Float2.Min(upperLeft, bottomRight); var min = Float2.Min(upperLeft, bottomRight);
var max = Float2.Max(upperLeft, bottomRight); var max = Float2.Max(upperLeft, bottomRight);
var pixelRange = (max - min) * ViewScale; var pixelRange = (max - min) * ViewScale;
Render2D.PushClip(ref viewRect); Render2D.PushClip(viewRect);
DrawAxis(Float2.UnitX, viewRect, min.X, max.X, pixelRange.X); DrawAxis(Float2.UnitX, viewRect, min.X, max.X, pixelRange.X);
DrawAxis(Float2.UnitY, viewRect, min.Y, max.Y, pixelRange.Y); DrawAxis(Float2.UnitY, viewRect, min.Y, max.Y, pixelRange.Y);
Render2D.PopClip(); Render2D.PopClip();
@@ -605,7 +605,7 @@ namespace FlaxEditor
if (!drawAnySelectedControl) if (!drawAnySelectedControl)
{ {
drawAnySelectedControl = true; drawAnySelectedControl = true;
Render2D.PushTransform(ref _cachedTransform); Render2D.PushTransform(_cachedTransform);
} }
var options = Editor.Instance.Options.Options.Visual; var options = Editor.Instance.Options.Options.Visual;
@@ -643,10 +643,10 @@ namespace FlaxEditor
DrawControlWidget(uiControl, ref ur, ref mousePos, ref widgetHandleSize, viewScale, new Float2(1, -1), CursorType.SizeNESW); DrawControlWidget(uiControl, ref ur, ref mousePos, ref widgetHandleSize, viewScale, new Float2(1, -1), CursorType.SizeNESW);
DrawControlWidget(uiControl, ref bl, ref mousePos, ref widgetHandleSize, viewScale, new Float2(-1, 1), CursorType.SizeNESW); DrawControlWidget(uiControl, ref bl, ref mousePos, ref widgetHandleSize, viewScale, new Float2(-1, 1), CursorType.SizeNESW);
DrawControlWidget(uiControl, ref br, ref mousePos, ref widgetHandleSize, viewScale, new Float2(1, 1), CursorType.SizeNWSE); DrawControlWidget(uiControl, ref br, ref mousePos, ref widgetHandleSize, viewScale, new Float2(1, 1), CursorType.SizeNWSE);
Float2.Lerp(ref ul, ref bl, 0.5f, out var el); Float2.Lerp(ul, bl, 0.5f, out var el);
Float2.Lerp(ref ur, ref br, 0.5f, out var er); Float2.Lerp(ur, br, 0.5f, out var er);
Float2.Lerp(ref ul, ref ur, 0.5f, out var eu); Float2.Lerp(ul, ur, 0.5f, out var eu);
Float2.Lerp(ref bl, ref br, 0.5f, out var eb); Float2.Lerp(bl, br, 0.5f, out var eb);
DrawControlWidget(uiControl, ref el, ref mousePos, ref widgetHandleSize, viewScale, new Float2(-1, 0), CursorType.SizeWE); DrawControlWidget(uiControl, ref el, ref mousePos, ref widgetHandleSize, viewScale, new Float2(-1, 0), CursorType.SizeWE);
DrawControlWidget(uiControl, ref er, ref mousePos, ref widgetHandleSize, viewScale, new Float2(1, 0), CursorType.SizeWE); DrawControlWidget(uiControl, ref er, ref mousePos, ref widgetHandleSize, viewScale, new Float2(1, 0), CursorType.SizeWE);
DrawControlWidget(uiControl, ref eu, ref mousePos, ref widgetHandleSize, viewScale, new Float2(0, -1), CursorType.SizeNS); DrawControlWidget(uiControl, ref eu, ref mousePos, ref widgetHandleSize, viewScale, new Float2(0, -1), CursorType.SizeNS);
@@ -749,7 +749,7 @@ namespace FlaxEditor
default: break; default: break;
} }
} }
if (rect.Contains(ref mousePos)) if (rect.Contains(mousePos))
{ {
Render2D.FillRectangle(rect, style.Foreground); Render2D.FillRectangle(rect, style.Foreground);
Render2D.DrawRectangle(rect, style.SelectionBorder); Render2D.DrawRectangle(rect, style.SelectionBorder);

View File

@@ -124,7 +124,7 @@ public sealed class ViewportRubberBandSelector
public void ProjectPoint(Vector3 worldSpaceLocation, out Float2 viewportSpaceLocation) public void ProjectPoint(Vector3 worldSpaceLocation, out Float2 viewportSpaceLocation)
{ {
worldSpaceLocation -= _origin; worldSpaceLocation -= _origin;
_viewport.Project(ref worldSpaceLocation, ref _viewProjection, out var projected); _viewport.Project(worldSpaceLocation, _viewProjection, out var projected);
viewportSpaceLocation = new Float2((float)projected.X, (float)projected.Y); viewportSpaceLocation = new Float2((float)projected.X, (float)projected.Y);
} }
@@ -132,7 +132,7 @@ public sealed class ViewportRubberBandSelector
{ {
bounds.Minimum -= _origin; bounds.Minimum -= _origin;
bounds.Maximum -= _origin; bounds.Maximum -= _origin;
return _frustum.Contains(ref bounds); return _frustum.Contains(bounds);
} }
} }

View File

@@ -58,22 +58,22 @@ void OnLogMessage(LogType type, const StringView& msg)
{ {
ScopeLock lock(CachedLogDataLocker); ScopeLock lock(CachedLogDataLocker);
CachedLogData.EnsureCapacity(4 + 8 + 4 + msg.Length() * 2); CachedLogData.EnsureCapacity(sizeof(int32) + sizeof(DateTime) + sizeof(int32) + msg.Length() * sizeof(Char));
// Log Type // Log Type
int32 buf = (int32)type; int32 buf = (int32)type;
CachedLogData.Add((byte*)&buf, 4); CachedLogData.Add((byte*)&buf, sizeof(int32));
// Time // Time
auto time = DateTime::Now(); auto time = DateTime::Now();
CachedLogData.Add((byte*)&time.Ticks, 8); CachedLogData.Add((byte*)&time.Ticks, sizeof(DateTime));
// Message Length // Message Length
buf = msg.Length(); buf = msg.Length();
CachedLogData.Add((byte*)&buf, 4); CachedLogData.Add((byte*)&buf, sizeof(int32));
// Message // Message
CachedLogData.Add((byte*)msg.Get(), msg.Length() * 2); CachedLogData.Add((byte*)msg.Get(), msg.Length() * sizeof(Char));
} }
DEFINE_INTERNAL_CALL(bool) EditorInternal_IsDevInstance() DEFINE_INTERNAL_CALL(bool) EditorInternal_IsDevInstance()
@@ -99,7 +99,7 @@ DEFINE_INTERNAL_CALL(bool) EditorInternal_IsPlayMode()
return Editor::IsPlayMode; return Editor::IsPlayMode;
} }
DEFINE_INTERNAL_CALL(int32) EditorInternal_ReadOutputLogs(MArray** outMessages, MArray** outLogTypes, MArray** outLogTimes, int outArraySize) DEFINE_INTERNAL_CALL(int32) EditorInternal_ReadOutputLogs(NativeArray<String>* outMessages, NativeArray<byte>* outLogTypes, NativeArray<int64>* outLogTimes, int outArraySize)
{ {
ScopeLock lock(CachedLogDataLocker); ScopeLock lock(CachedLogDataLocker);
if (CachedLogData.IsEmpty() || CachedLogData.Get() == nullptr) if (CachedLogData.IsEmpty() || CachedLogData.Get() == nullptr)
@@ -108,27 +108,30 @@ DEFINE_INTERNAL_CALL(int32) EditorInternal_ReadOutputLogs(MArray** outMessages,
int32 count = 0; int32 count = 0;
const int32 maxCount = outArraySize; const int32 maxCount = outArraySize;
String* messages = &outMessages->data[0];
byte* ptr = CachedLogData.Get(); byte* ptr = CachedLogData.Get();
byte* end = ptr + CachedLogData.Count(); byte* end = ptr + CachedLogData.Count();
byte* outLogTypesPtr = MCore::Array::GetAddress<byte>(*outLogTypes); byte* outLogTypesPtr = outLogTypes->data;
int64* outLogTimesPtr = MCore::Array::GetAddress<int64>(*outLogTimes); int64* outLogTimesPtr = outLogTimes->data;
while (count < maxCount && ptr != end) while (count < maxCount && ptr != end)
{ {
auto type = (byte)*(int32*)ptr; auto type = (byte)*(int32*)ptr;
ptr += 4; ptr += sizeof(int32);
auto time = *(int64*)ptr; auto time = *(int64*)ptr;
ptr += 8; ptr += sizeof(int64);
auto length = *(int32*)ptr; auto length = *(int32*)ptr;
ptr += 4; ptr += sizeof(int32);
auto msg = (Char*)ptr; auto msg = (Char*)ptr;
ptr += length * 2; ptr += length * sizeof(Char);
auto msgObj = MUtils::ToString(StringView(msg, length)); auto msgObj = String(msg, length);
MCore::GC::WriteArrayRef(*outMessages, (MObject*)msgObj, count); String& str = messages[count];
ASSERT(str.Get() == nullptr && str.Length() == 0);
str = msgObj;
outLogTypesPtr[count] = type; outLogTypesPtr[count] = type;
outLogTimesPtr[count] = time; outLogTimesPtr[count] = time;
@@ -147,9 +150,9 @@ DEFINE_INTERNAL_CALL(void) EditorInternal_SetPlayMode(bool value)
Editor::IsPlayMode = value; Editor::IsPlayMode = value;
} }
DEFINE_INTERNAL_CALL(MString*) EditorInternal_GetProjectPath() DEFINE_INTERNAL_CALL(void) EditorInternal_GetProjectPath(StringView* projectPath)
{ {
return MUtils::ToString(Editor::Project->ProjectPath); *projectPath = Editor::Project->ProjectPath;
} }
DEFINE_INTERNAL_CALL(void) EditorInternal_CloseSplashScreen() DEFINE_INTERNAL_CALL(void) EditorInternal_CloseSplashScreen()
@@ -159,6 +162,7 @@ DEFINE_INTERNAL_CALL(void) EditorInternal_CloseSplashScreen()
DEFINE_INTERNAL_CALL(bool) EditorInternal_CloneAssetFile(MString* dstPathObj, MString* srcPathObj, Guid* dstId) DEFINE_INTERNAL_CALL(bool) EditorInternal_CloneAssetFile(MString* dstPathObj, MString* srcPathObj, Guid* dstId)
{ {
PLATFORM_DEBUG_BREAK;
// Get normalized paths // Get normalized paths
String dstPath, srcPath; String dstPath, srcPath;
MUtils::ToString(dstPathObj, dstPath); MUtils::ToString(dstPathObj, dstPath);
@@ -172,6 +176,7 @@ DEFINE_INTERNAL_CALL(bool) EditorInternal_CloneAssetFile(MString* dstPathObj, MS
DEFINE_INTERNAL_CALL(bool) EditorInternal_CreateVisualScript(MString* outputPathObj, MString* baseTypenameObj) DEFINE_INTERNAL_CALL(bool) EditorInternal_CreateVisualScript(MString* outputPathObj, MString* baseTypenameObj)
{ {
PLATFORM_DEBUG_BREAK;
String outputPath; String outputPath;
MUtils::ToString(outputPathObj, outputPath); MUtils::ToString(outputPathObj, outputPath);
FileSystem::NormalizePath(outputPath); FileSystem::NormalizePath(outputPath);
@@ -182,6 +187,7 @@ DEFINE_INTERNAL_CALL(bool) EditorInternal_CreateVisualScript(MString* outputPath
DEFINE_INTERNAL_CALL(MString*) EditorInternal_CanImport(MString* extensionObj) DEFINE_INTERNAL_CALL(MString*) EditorInternal_CanImport(MString* extensionObj)
{ {
PLATFORM_DEBUG_BREAK;
String extension; String extension;
MUtils::ToString(extensionObj, extension); MUtils::ToString(extensionObj, extension);
if (extension.Length() > 0 && extension[0] == '.') if (extension.Length() > 0 && extension[0] == '.')
@@ -199,6 +205,7 @@ DEFINE_INTERNAL_CALL(void) EditorInternal_GetAudioClipMetadata(AudioClip* clip,
DEFINE_INTERNAL_CALL(bool) EditorInternal_SaveJsonAsset(MString* outputPathObj, MString* dataObj, MString* dataTypeNameObj) DEFINE_INTERNAL_CALL(bool) EditorInternal_SaveJsonAsset(MString* outputPathObj, MString* dataObj, MString* dataTypeNameObj)
{ {
PLATFORM_DEBUG_BREAK;
String outputPath; String outputPath;
MUtils::ToString(outputPathObj, outputPath); MUtils::ToString(outputPathObj, outputPath);
FileSystem::NormalizePath(outputPath); FileSystem::NormalizePath(outputPath);
@@ -216,6 +223,7 @@ DEFINE_INTERNAL_CALL(bool) EditorInternal_SaveJsonAsset(MString* outputPathObj,
DEFINE_INTERNAL_CALL(bool) EditorInternal_CanExport(MString* pathObj) DEFINE_INTERNAL_CALL(bool) EditorInternal_CanExport(MString* pathObj)
{ {
PLATFORM_DEBUG_BREAK;
#if COMPILE_WITH_ASSETS_EXPORTER #if COMPILE_WITH_ASSETS_EXPORTER
String path; String path;
MUtils::ToString(pathObj, path); MUtils::ToString(pathObj, path);
@@ -229,6 +237,7 @@ DEFINE_INTERNAL_CALL(bool) EditorInternal_CanExport(MString* pathObj)
DEFINE_INTERNAL_CALL(bool) EditorInternal_Export(MString* inputPathObj, MString* outputFolderObj) DEFINE_INTERNAL_CALL(bool) EditorInternal_Export(MString* inputPathObj, MString* outputFolderObj)
{ {
PLATFORM_DEBUG_BREAK;
#if COMPILE_WITH_ASSETS_EXPORTER #if COMPILE_WITH_ASSETS_EXPORTER
String inputPath; String inputPath;
MUtils::ToString(inputPathObj, inputPath); MUtils::ToString(inputPathObj, inputPath);
@@ -246,6 +255,7 @@ DEFINE_INTERNAL_CALL(bool) EditorInternal_Export(MString* inputPathObj, MString*
DEFINE_INTERNAL_CALL(void) EditorInternal_CopyCache(Guid* dstId, Guid* srcId) DEFINE_INTERNAL_CALL(void) EditorInternal_CopyCache(Guid* dstId, Guid* srcId)
{ {
PLATFORM_DEBUG_BREAK;
ShaderCacheManager::CopyCache(*dstId, *srcId); ShaderCacheManager::CopyCache(*dstId, *srcId);
} }
@@ -260,6 +270,7 @@ DEFINE_INTERNAL_CALL(void) EditorInternal_BakeLightmaps(bool cancel)
DEFINE_INTERNAL_CALL(MString*) EditorInternal_GetShaderAssetSourceCode(BinaryAsset* obj) DEFINE_INTERNAL_CALL(MString*) EditorInternal_GetShaderAssetSourceCode(BinaryAsset* obj)
{ {
PLATFORM_DEBUG_BREAK;
INTERNAL_CALL_CHECK_RETURN(obj, nullptr); INTERNAL_CALL_CHECK_RETURN(obj, nullptr);
if (obj->WaitForLoaded()) if (obj->WaitForLoaded())
DebugLog::ThrowNullReference(); DebugLog::ThrowNullReference();
@@ -287,6 +298,7 @@ DEFINE_INTERNAL_CALL(MString*) EditorInternal_GetShaderAssetSourceCode(BinaryAss
DEFINE_INTERNAL_CALL(bool) EditorInternal_CookMeshCollision(MString* pathObj, CollisionDataType type, ModelBase* modelObj, int32 modelLodIndex, uint32 materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit) DEFINE_INTERNAL_CALL(bool) EditorInternal_CookMeshCollision(MString* pathObj, CollisionDataType type, ModelBase* modelObj, int32 modelLodIndex, uint32 materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit)
{ {
PLATFORM_DEBUG_BREAK;
#if COMPILE_WITH_PHYSICS_COOKING #if COMPILE_WITH_PHYSICS_COOKING
CollisionCooking::Argument arg; CollisionCooking::Argument arg;
String path; String path;
@@ -307,6 +319,7 @@ DEFINE_INTERNAL_CALL(bool) EditorInternal_CookMeshCollision(MString* pathObj, Co
DEFINE_INTERNAL_CALL(void) EditorInternal_GetCollisionWires(CollisionData* collisionData, MArray** triangles, MArray** indices, int* trianglesCount, int* indicesCount) DEFINE_INTERNAL_CALL(void) EditorInternal_GetCollisionWires(CollisionData* collisionData, MArray** triangles, MArray** indices, int* trianglesCount, int* indicesCount)
{ {
PLATFORM_DEBUG_BREAK;
if (!collisionData || collisionData->WaitForLoaded() || collisionData->GetOptions().Type == CollisionDataType::None) if (!collisionData || collisionData->WaitForLoaded() || collisionData->GetOptions().Type == CollisionDataType::None)
return; return;
@@ -332,6 +345,7 @@ DEFINE_INTERNAL_CALL(void) EditorInternal_GetCollisionWires(CollisionData* colli
DEFINE_INTERNAL_CALL(void) EditorInternal_GetEditorBoxWithChildren(Actor* obj, BoundingBox* result) DEFINE_INTERNAL_CALL(void) EditorInternal_GetEditorBoxWithChildren(Actor* obj, BoundingBox* result)
{ {
PLATFORM_DEBUG_BREAK;
INTERNAL_CALL_CHECK(obj); INTERNAL_CALL_CHECK(obj);
*result = obj->GetEditorBoxChildren(); *result = obj->GetEditorBoxChildren();
} }
@@ -461,6 +475,7 @@ DEFINE_INTERNAL_CALL(void) EditorInternal_RunVisualScriptBreakpointLoopTick(floa
DEFINE_INTERNAL_CALL(void) EditorInternal_DeserializeSceneObject(SceneObject* sceneObject, MString* jsonObj) DEFINE_INTERNAL_CALL(void) EditorInternal_DeserializeSceneObject(SceneObject* sceneObject, MString* jsonObj)
{ {
PLATFORM_DEBUG_BREAK;
PROFILE_CPU_NAMED("DeserializeSceneObject"); PROFILE_CPU_NAMED("DeserializeSceneObject");
StringAnsi json; StringAnsi json;
@@ -531,10 +546,9 @@ DEFINE_INTERNAL_CALL(MTypeObject*) CustomEditorsUtilInternal_GetCustomEditor(MTy
return CustomEditorsUtil::GetCustomEditor(targetType); return CustomEditorsUtil::GetCustomEditor(targetType);
} }
DEFINE_INTERNAL_CALL(MArray*) LayersAndTagsSettingsInternal_GetCurrentLayers(int* layersCount) DEFINE_INTERNAL_CALL(NativeSpan<String>) LayersAndTagsSettingsInternal_GetCurrentLayers()
{ {
*layersCount = Math::Max(1, Level::GetNonEmptyLayerNamesCount()); return NativeSpan<String>::AsSpan(Level::Layers, Math::Max(1, Level::GetNonEmptyLayerNamesCount()));
return MUtils::ToArray(Span<String>(Level::Layers, *layersCount));
} }
DEFINE_INTERNAL_CALL(void) GameSettingsInternal_Apply() DEFINE_INTERNAL_CALL(void) GameSettingsInternal_Apply()

View File

@@ -334,7 +334,7 @@ Window* ManagedEditor::GetMainWindow()
ASSERT(HasManagedInstance()); ASSERT(HasManagedInstance());
const auto method = GetClass()->GetMethod("GetMainWindowPtr"); const auto method = GetClass()->GetMethod("GetMainWindowPtr");
ASSERT(method); ASSERT(method);
return (Window*)MUtils::Unbox<void*>(method->Invoke(GetManagedInstance(), nullptr, nullptr)); return (Window*)MUtils::Unbox<void*>(method->Invoke(GetManagedInstance(), nullptr, nullptr), true);
} }
bool ManagedEditor::CanReloadScripts() bool ManagedEditor::CanReloadScripts()
@@ -346,7 +346,7 @@ bool ManagedEditor::CanReloadScripts()
Internal_CanReloadScripts = GetClass()->GetMethod("Internal_CanReloadScripts"); Internal_CanReloadScripts = GetClass()->GetMethod("Internal_CanReloadScripts");
ASSERT(Internal_CanReloadScripts); ASSERT(Internal_CanReloadScripts);
} }
return MUtils::Unbox<bool>(Internal_CanReloadScripts->Invoke(GetManagedInstance(), nullptr, nullptr)); return MUtils::Unbox<bool>(Internal_CanReloadScripts->Invoke(GetManagedInstance(), nullptr, nullptr), true);
} }
bool ManagedEditor::CanAutoBuildCSG() bool ManagedEditor::CanAutoBuildCSG()
@@ -365,7 +365,7 @@ bool ManagedEditor::CanAutoBuildCSG()
Internal_CanAutoBuildCSG = GetClass()->GetMethod("Internal_CanAutoBuildCSG"); Internal_CanAutoBuildCSG = GetClass()->GetMethod("Internal_CanAutoBuildCSG");
ASSERT(Internal_CanAutoBuildCSG); ASSERT(Internal_CanAutoBuildCSG);
} }
return MUtils::Unbox<bool>(Internal_CanAutoBuildCSG->Invoke(GetManagedInstance(), nullptr, nullptr)); return MUtils::Unbox<bool>(Internal_CanAutoBuildCSG->Invoke(GetManagedInstance(), nullptr, nullptr), true);
} }
bool ManagedEditor::CanAutoBuildNavMesh() bool ManagedEditor::CanAutoBuildNavMesh()
@@ -384,7 +384,7 @@ bool ManagedEditor::CanAutoBuildNavMesh()
Internal_CanAutoBuildNavMesh = GetClass()->GetMethod("Internal_CanAutoBuildNavMesh"); Internal_CanAutoBuildNavMesh = GetClass()->GetMethod("Internal_CanAutoBuildNavMesh");
ASSERT(Internal_CanAutoBuildNavMesh); ASSERT(Internal_CanAutoBuildNavMesh);
} }
return MUtils::Unbox<bool>(Internal_CanAutoBuildNavMesh->Invoke(GetManagedInstance(), nullptr, nullptr)); return MUtils::Unbox<bool>(Internal_CanAutoBuildNavMesh->Invoke(GetManagedInstance(), nullptr, nullptr), true);
} }
bool ManagedEditor::HasGameViewportFocus() const bool ManagedEditor::HasGameViewportFocus() const
@@ -397,7 +397,8 @@ bool ManagedEditor::HasGameViewportFocus() const
Internal_HasGameViewportFocus = GetClass()->GetMethod("Internal_HasGameViewportFocus"); Internal_HasGameViewportFocus = GetClass()->GetMethod("Internal_HasGameViewportFocus");
ASSERT(Internal_HasGameViewportFocus); ASSERT(Internal_HasGameViewportFocus);
} }
result = MUtils::Unbox<bool>(Internal_HasGameViewportFocus->Invoke(GetManagedInstance(), nullptr, nullptr)); auto invk = Internal_HasGameViewportFocus->Invoke(GetManagedInstance(), nullptr, nullptr);
result = MUtils::Unbox<bool>(invk, true);
} }
return result; return result;
} }
@@ -495,7 +496,7 @@ bool ManagedEditor::OnAppExit()
Internal_OnAppExit = GetClass()->GetMethod("Internal_OnAppExit"); Internal_OnAppExit = GetClass()->GetMethod("Internal_OnAppExit");
ASSERT(Internal_OnAppExit); ASSERT(Internal_OnAppExit);
} }
return MUtils::Unbox<bool>(Internal_OnAppExit->Invoke(GetManagedInstance(), nullptr, nullptr)); return MUtils::Unbox<bool>(Internal_OnAppExit->Invoke(GetManagedInstance(), nullptr, nullptr), true);
} }
void ManagedEditor::RequestStartPlayOnEditMode() void ManagedEditor::RequestStartPlayOnEditMode()

View File

@@ -334,6 +334,9 @@ namespace FlaxEditor.Modules.SourceCodeEditing
} }
} }
} }
if (editor == null)
editor = Editor.Instance.CodeEditing.Editors[0];
Editor.Instance.CodeEditing.SelectedEditor = editor; Editor.Instance.CodeEditing.SelectedEditor = editor;
} }

View File

@@ -41,9 +41,9 @@ namespace FlaxEditor.Modules.SourceCodeEditing
var vsCode = codeEditing.GetInBuildEditor(CodeEditorTypes.VSCode); var vsCode = codeEditing.GetInBuildEditor(CodeEditorTypes.VSCode);
var rider = codeEditing.GetInBuildEditor(CodeEditorTypes.Rider); var rider = codeEditing.GetInBuildEditor(CodeEditorTypes.Rider);
#if PLATFORM_WINDOW #if PLATFORM_WINDOWS
// Favor the newest Visual Studio // Favor the newest Visual Studio
for (int i = (int)CodeEditorTypes.VS2019; i >= (int)CodeEditorTypes.VS2008; i--) for (int i = (int)CodeEditorTypes.VS2026; i >= (int)CodeEditorTypes.VS2008; i--)
{ {
var visualStudio = codeEditing.GetInBuildEditor((CodeEditorTypes)i); var visualStudio = codeEditing.GetInBuildEditor((CodeEditorTypes)i);
if (visualStudio != null) if (visualStudio != null)
@@ -74,7 +74,7 @@ namespace FlaxEditor.Modules.SourceCodeEditing
public string Name => "Default"; public string Name => "Default";
/// <inheritdoc /> /// <inheritdoc />
public string GenerateProjectCustomArgs => null; public string GenerateProjectCustomArgs => _currentEditor?.GenerateProjectCustomArgs;
/// <inheritdoc /> /// <inheritdoc />
public void OpenSolution() public void OpenSolution()

View File

@@ -22,71 +22,14 @@ namespace FlaxEditor.Modules.SourceCodeEditing
public InBuildSourceCodeEditor(CodeEditorTypes type) public InBuildSourceCodeEditor(CodeEditorTypes type)
{ {
Type = type; Type = type;
switch (type) Name = CodeEditingManager.GetName(type);
{
case CodeEditorTypes.Custom:
Name = "Custom";
break;
case CodeEditorTypes.SystemDefault:
Name = "System Default";
break;
case CodeEditorTypes.VS2008:
Name = "Visual Studio 2008";
break;
case CodeEditorTypes.VS2010:
Name = "Visual Studio 2010";
break;
case CodeEditorTypes.VS2012:
Name = "Visual Studio 2012";
break;
case CodeEditorTypes.VS2013:
Name = "Visual Studio 2013";
break;
case CodeEditorTypes.VS2015:
Name = "Visual Studio 2015";
break;
case CodeEditorTypes.VS2017:
Name = "Visual Studio 2017";
break;
case CodeEditorTypes.VS2019:
Name = "Visual Studio 2019";
break;
case CodeEditorTypes.VS2022:
Name = "Visual Studio 2022";
break;
case CodeEditorTypes.VS2026:
Name = "Visual Studio 2026";
break;
case CodeEditorTypes.VSCode:
Name = "Visual Studio Code";
break;
case CodeEditorTypes.VSCodeInsiders:
Name = "Visual Studio Code - Insiders";
break;
case CodeEditorTypes.Rider:
Name = "Rider";
break;
default: throw new ArgumentOutOfRangeException(nameof(type), type, null);
}
} }
/// <inheritdoc /> /// <inheritdoc />
public string Name { get; set; } public string Name { get; set; }
/// <inheritdoc /> /// <inheritdoc />
public string GenerateProjectCustomArgs public string GenerateProjectCustomArgs => CodeEditingManager.GetGenerateProjectCustomArgs(Type);
{
get
{
switch (Type)
{
case CodeEditorTypes.VSCodeInsiders:
case CodeEditorTypes.VSCode: return "-vscode -vs2022";
case CodeEditorTypes.Rider: return "-vs2022";
default: return null;
}
}
}
/// <inheritdoc /> /// <inheritdoc />
public void OpenSolution() public void OpenSolution()

View File

@@ -897,9 +897,11 @@ namespace FlaxEditor.Modules
if (type.IsAssignableTo(typeof(AssetEditorWindow))) if (type.IsAssignableTo(typeof(AssetEditorWindow)))
{ {
var ctor = type.GetConstructor(new Type[] { typeof(Editor), typeof(AssetItem) });
var assetItem = Editor.ContentDatabase.FindAsset(winData.AssetItemID); var assetItem = Editor.ContentDatabase.FindAsset(winData.AssetItemID);
var assetType = assetItem.GetType();
var ctor = type.GetConstructor(new Type[] { typeof(Editor), assetType });
var win = (AssetEditorWindow)ctor.Invoke(new object[] { Editor.Instance, assetItem }); var win = (AssetEditorWindow)ctor.Invoke(new object[] { Editor.Instance, assetItem });
win.Show(winData.DockState, winData.DockState != DockState.Float ? winData.DockedTo : null, winData.SelectOnShow, winData.SplitterValue); win.Show(winData.DockState, winData.DockState != DockState.Float ? winData.DockedTo : null, winData.SelectOnShow, winData.SplitterValue);
if (winData.DockState == DockState.Float) if (winData.DockState == DockState.Float)
{ {

View File

@@ -36,8 +36,8 @@ namespace FlaxEditor.SceneGraph
} }
var center = _actor.Transform.Translation; var center = _actor.Transform.Translation;
ViewportIconsRenderer.GetBounds(ref center, ref ray.Ray.Position, out var sphere); ViewportIconsRenderer.GetBounds(center, ray.Ray.Position, out var sphere);
return CollisionsHelper.RayIntersectsSphere(ref ray.Ray, ref sphere, out distance); return CollisionsHelper.RayIntersectsSphere(ray.Ray, sphere, out distance);
} }
} }
} }

View File

@@ -109,10 +109,10 @@ namespace FlaxEditor.SceneGraph.Actors
// Skin vertex position with the current pose // Skin vertex position with the current pose
var position = positionStream.GetFloat3(j); var position = positionStream.GetFloat3(j);
Float3.Transform(ref position, ref skinningMatrices[indices[0]], out Float3 pos0); Float3.Transform(position, skinningMatrices[indices[0]], out Float3 pos0);
Float3.Transform(ref position, ref skinningMatrices[indices[1]], out Float3 pos1); Float3.Transform(position, skinningMatrices[indices[1]], out Float3 pos1);
Float3.Transform(ref position, ref skinningMatrices[indices[2]], out Float3 pos2); Float3.Transform(position, skinningMatrices[indices[2]], out Float3 pos2);
Float3.Transform(ref position, ref skinningMatrices[indices[3]], out Float3 pos3); Float3.Transform(position, skinningMatrices[indices[3]], out Float3 pos3);
position = pos0 * weights[0] + pos1 * weights[1] + pos2 * weights[2] + pos3 * weights[3]; position = pos0 * weights[0] + pos1 * weights[1] + pos2 * weights[2] + pos3 * weights[3];
// Add vertex to the bone list // Add vertex to the bone list
@@ -269,8 +269,8 @@ namespace FlaxEditor.SceneGraph.Actors
for (int i = 0; i < boneVertices.Count; i++) for (int i = 0; i < boneVertices.Count; i++)
{ {
var pos = boneTransform.WorldToLocal(boneVertices[i]); var pos = boneTransform.WorldToLocal(boneVertices[i]);
Vector3.Min(ref boneLocalBounds.Minimum, ref pos, out boneLocalBounds.Minimum); Vector3.Min(boneLocalBounds.Minimum, pos, out boneLocalBounds.Minimum);
Vector3.Max(ref boneLocalBounds.Maximum, ref pos, out boneLocalBounds.Maximum); Vector3.Max(boneLocalBounds.Maximum, pos, out boneLocalBounds.Maximum);
} }
// Add collision shape // Add collision shape
@@ -415,7 +415,7 @@ namespace FlaxEditor.SceneGraph.Actors
float bkLength = bk.Length; float bkLength = bk.Length;
if (bkLength > 0.0f) if (bkLength > 0.0f)
{ {
Float3.Transform(ref bk, ref matrix, out Float3 bkA); Float3.Transform(bk, matrix, out Float3 bkA);
bk = bkA / bkLength; bk = bkA / bkLength;
} }
} }

View File

@@ -184,7 +184,7 @@ namespace FlaxEditor.SceneGraph.Actors
/// <inheritdoc /> /// <inheritdoc />
public override bool RayCastSelf(ref RayCastData ray, out Real distance, out Vector3 normal) public override bool RayCastSelf(ref RayCastData ray, out Real distance, out Vector3 normal)
{ {
return Brush.Intersects(Index, ref ray.Ray, out distance, out normal); return Brush.Intersects(Index, ray.Ray, out distance, out normal);
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -207,7 +207,7 @@ namespace FlaxEditor.SceneGraph.Actors
/// <inheritdoc /> /// <inheritdoc />
public override bool RayCastSelf(ref RayCastData ray, out Real distance, out Vector3 normal) public override bool RayCastSelf(ref RayCastData ray, out Real distance, out Vector3 normal)
{ {
if (((BoxBrush)_actor).OrientedBox.Intersects(ref ray.Ray)) if (((BoxBrush)_actor).OrientedBox.Intersects(ray.Ray))
{ {
for (int i = 0; i < ChildNodes.Count; i++) for (int i = 0; i < ChildNodes.Count; i++)
{ {

View File

@@ -107,7 +107,7 @@ namespace FlaxEditor.SceneGraph.Actors
{ {
normal = Vector3.Up; normal = Vector3.Up;
var sphere = new BoundingSphere(Transform.Translation, 10.0f); var sphere = new BoundingSphere(Transform.Translation, 10.0f);
return sphere.Intersects(ref ray.Ray, out distance); return sphere.Intersects(ray.Ray, out distance);
} }
/// <inheritdoc /> /// <inheritdoc />

View File

@@ -56,7 +56,7 @@ namespace FlaxEditor.SceneGraph.Actors
return false; return false;
} }
return Camera.Internal_IntersectsItselfEditor(FlaxEngine.Object.GetUnmanagedPtr(_actor), ref ray.Ray, out distance); return Camera.Internal_IntersectsItselfEditor(FlaxEngine.Object.GetUnmanagedPtr(_actor), ray.Ray, out distance);
} }
/// <inheritdoc /> /// <inheritdoc />

View File

@@ -58,7 +58,7 @@ namespace FlaxEditor.SceneGraph.Actors
public override Transform Transform public override Transform Transform
{ {
get => Actor.GetInstance(Index).Transform; get => Actor.GetInstance(Index).Transform;
set => Actor.SetInstanceTransform(Index, ref value); set => Actor.SetInstanceTransform(Index, value);
} }
/// <inheritdoc /> /// <inheritdoc />

View File

@@ -63,7 +63,7 @@ namespace FlaxEditor.SceneGraph.Actors
{ {
normal = Vector3.Up; normal = Vector3.Up;
var sphere = new BoundingSphere(Transform.Translation, 10.0f); var sphere = new BoundingSphere(Transform.Translation, 10.0f);
return sphere.Intersects(ref ray.Ray, out distance); return sphere.Intersects(ray.Ray, out distance);
} }
/// <inheritdoc /> /// <inheritdoc />

View File

@@ -177,7 +177,7 @@ namespace FlaxEditor.SceneGraph.Actors
var actor = (Spline)_node.Actor; var actor = (Spline)_node.Actor;
var pos = actor.GetSplinePoint(Index); var pos = actor.GetSplinePoint(Index);
var nodeSize = NodeSizeByDistance(Transform.Translation, PointNodeSize, ray.View.Position); var nodeSize = NodeSizeByDistance(Transform.Translation, PointNodeSize, ray.View.Position);
return new BoundingSphere(pos, nodeSize).Intersects(ref ray.Ray, out distance); return new BoundingSphere(pos, nodeSize).Intersects(ray.Ray, out distance);
} }
public override void OnDebugDraw(ViewportDebugDrawData data) public override void OnDebugDraw(ViewportDebugDrawData data)
@@ -264,7 +264,7 @@ namespace FlaxEditor.SceneGraph.Actors
var actor = (Spline)_node.Actor; var actor = (Spline)_node.Actor;
var pos = actor.GetSplineTangent(_index, _isIn).Translation; var pos = actor.GetSplineTangent(_index, _isIn).Translation;
var tangentSize = NodeSizeByDistance(Transform.Translation, TangentNodeSize, ray.View.Position); var tangentSize = NodeSizeByDistance(Transform.Translation, TangentNodeSize, ray.View.Position);
return new BoundingSphere(pos, tangentSize).Intersects(ref ray.Ray, out distance); return new BoundingSphere(pos, tangentSize).Intersects(ray.Ray, out distance);
} }
public override void OnDebugDraw(ViewportDebugDrawData data) public override void OnDebugDraw(ViewportDebugDrawData data)

View File

@@ -37,15 +37,15 @@ namespace FlaxEditor.SceneGraph.Actors
{ {
var up = Float3.Up; var up = Float3.Up;
Float3 translation = transform.Translation; Float3 translation = transform.Translation;
Matrix.Billboard(ref translation, ref viewPosition, ref up, ref viewDirection, out m2); Matrix.Billboard(translation, viewPosition, up, viewDirection, out m2);
Matrix.Multiply(ref m1, ref m2, out m3); Matrix.Multiply(m1, m2, out m3);
Matrix.Scaling(ref transform.Scale, out m1); Matrix.Scaling(transform.Scale, out m1);
Matrix.Multiply(ref m1, ref m3, out world); Matrix.Multiply(m1, m3, out world);
} }
else else
{ {
transform.GetWorld(out m2); transform.GetWorld(out m2);
Matrix.Multiply(ref m1, ref m2, out world); Matrix.Multiply(m1, m2, out world);
} }
OrientedBoundingBox bounds; OrientedBoundingBox bounds;
@@ -53,7 +53,7 @@ namespace FlaxEditor.SceneGraph.Actors
world.Decompose(out bounds.Transformation); world.Decompose(out bounds.Transformation);
normal = -ray.Ray.Direction; normal = -ray.Ray.Direction;
return bounds.Intersects(ref ray.Ray, out distance); return bounds.Intersects(ray.Ray, out distance);
} }
/// <inheritdoc /> /// <inheritdoc />

View File

@@ -96,7 +96,7 @@ namespace FlaxEditor.SceneGraph.Actors
for (int i = 0; i < verts.Length; i++) for (int i = 0; i < verts.Length; i++)
{ {
ref var v = ref verts[i]; ref var v = ref verts[i];
var distance = Float3.DistanceSquared(ref pointLocal, ref v); var distance = Float3.DistanceSquared(pointLocal, v);
if (distance <= minDistance) if (distance <= minDistance)
{ {
hit = true; hit = true;

View File

@@ -64,7 +64,7 @@ namespace FlaxEditor.SceneGraph.Actors
normal = Vector3.Up; normal = Vector3.Up;
if (Actor is UICanvas uiCanvas && uiCanvas.Is3D) if (Actor is UICanvas uiCanvas && uiCanvas.Is3D)
return uiCanvas.Bounds.Intersects(ref ray.Ray, out distance); return uiCanvas.Bounds.Intersects(ray.Ray, out distance);
distance = 0; distance = 0;
return false; return false;

View File

@@ -352,7 +352,7 @@ namespace FlaxEditor.SceneGraph
for (int i = 0; i < ChildNodes.Count; i++) for (int i = 0; i < ChildNodes.Count; i++)
{ {
ChildNodes[i].GetEditorSphere(out var childSphere); ChildNodes[i].GetEditorSphere(out var childSphere);
BoundingSphere.Merge(ref sphere, ref childSphere, out sphere); BoundingSphere.Merge(sphere, childSphere, out sphere);
} }
} }

View File

@@ -139,6 +139,34 @@ CodeEditor* CodeEditingManager::GetCodeEditor(CodeEditorTypes editorType)
return nullptr; return nullptr;
} }
String CodeEditingManager::GetName(CodeEditorTypes editorType)
{
const auto editor = GetCodeEditor(editorType);
if (editor)
{
return editor->GetName();
}
else
{
LOG(Warning, "Missing code editor type {0}", (int32)editorType);
return String::Empty;
}
}
String CodeEditingManager::GetGenerateProjectCustomArgs(CodeEditorTypes editorType)
{
const auto editor = GetCodeEditor(editorType);
if (editor)
{
return editor->GetGenerateProjectCustomArgs();
}
else
{
LOG(Warning, "Missing code editor type {0}", (int32)editorType);
return String::Empty;
}
}
void CodeEditingManager::OpenFile(CodeEditorTypes editorType, const String& path, int32 line) void CodeEditingManager::OpenFile(CodeEditorTypes editorType, const String& path, int32 line)
{ {
const auto editor = GetCodeEditor(editorType); const auto editor = GetCodeEditor(editorType);

View File

@@ -109,9 +109,18 @@ public:
/// <summary> /// <summary>
/// Gets the name of the editor. /// Gets the name of the editor.
/// </summary> /// </summary>
/// <returns>The name</returns> /// <returns>The name.</returns>
virtual String GetName() const = 0; virtual String GetName() const = 0;
/// <summary>
/// Gets the custom arguments for the Flax.Build tool to add when generating project files for this code editor.
/// </summary>
/// <returns>The custom arguments to generate project files.</returns>
virtual String GetGenerateProjectCustomArgs() const
{
return String::Empty;
}
/// <summary> /// <summary>
/// Opens the file. /// Opens the file.
/// </summary> /// </summary>
@@ -169,6 +178,20 @@ public:
/// <returns>The editor object or null if not found.</returns> /// <returns>The editor object or null if not found.</returns>
static CodeEditor* GetCodeEditor(CodeEditorTypes editorType); static CodeEditor* GetCodeEditor(CodeEditorTypes editorType);
/// <summary>
/// Gets the name of the editor.
/// </summary>
/// <param name="editorType">The code editor type.</param>
/// <returns>The name.</returns>
API_FUNCTION() static String GetName(CodeEditorTypes editorType);
/// <summary>
/// Gets the custom arguments for the Flax.Build tool to add when generating project files for this code editor.
/// </summary>
/// <param name="editorType">The code editor type.</param>
/// <returns>The custom arguments to generate project files.</returns>
API_FUNCTION() static String GetGenerateProjectCustomArgs(CodeEditorTypes editorType);
/// <summary> /// <summary>
/// Opens the file. Handles async opening. /// Opens the file. Handles async opening.
/// </summary> /// </summary>

View File

@@ -257,12 +257,17 @@ String RiderCodeEditor::GetName() const
return TEXT("Rider"); return TEXT("Rider");
} }
String RiderCodeEditor::GetGenerateProjectCustomArgs() const
{
return TEXT("-vs2022");
}
void RiderCodeEditor::OpenFile(const String& path, int32 line) void RiderCodeEditor::OpenFile(const String& path, int32 line)
{ {
// Generate project files if solution is missing // Generate project files if solution is missing
if (!FileSystem::FileExists(_solutionPath)) if (!FileSystem::FileExists(_solutionPath))
{ {
ScriptsBuilder::GenerateProject(TEXT("-vs2022")); ScriptsBuilder::GenerateProject(GetGenerateProjectCustomArgs());
} }
// Open file // Open file
@@ -290,7 +295,7 @@ void RiderCodeEditor::OpenSolution()
// Generate project files if solution is missing // Generate project files if solution is missing
if (!FileSystem::FileExists(_solutionPath)) if (!FileSystem::FileExists(_solutionPath))
{ {
ScriptsBuilder::GenerateProject(TEXT("-vs2022")); ScriptsBuilder::GenerateProject(GetGenerateProjectCustomArgs());
} }
// Open solution // Open solution
@@ -312,5 +317,5 @@ void RiderCodeEditor::OpenSolution()
void RiderCodeEditor::OnFileAdded(const String& path) void RiderCodeEditor::OnFileAdded(const String& path)
{ {
ScriptsBuilder::GenerateProject(); ScriptsBuilder::GenerateProject(GetGenerateProjectCustomArgs());
} }

View File

@@ -35,6 +35,7 @@ public:
// [CodeEditor] // [CodeEditor]
CodeEditorTypes GetType() const override; CodeEditorTypes GetType() const override;
String GetName() const override; String GetName() const override;
String GetGenerateProjectCustomArgs() const override;
void OpenFile(const String& path, int32 line) override; void OpenFile(const String& path, int32 line) override;
void OpenSolution() override; void OpenSolution() override;
void OnFileAdded(const String& path) override; void OnFileAdded(const String& path) override;

View File

@@ -148,12 +148,17 @@ String VisualStudioEditor::GetName() const
return String(ToString(_version)); return String(ToString(_version));
} }
String VisualStudioEditor::GetGenerateProjectCustomArgs() const
{
return String::Format(TEXT("-{0}"), String(ToString(_version)).ToLower());
}
void VisualStudioEditor::OpenFile(const String& path, int32 line) void VisualStudioEditor::OpenFile(const String& path, int32 line)
{ {
// Generate project files if solution is missing // Generate project files if solution is missing
if (!FileSystem::FileExists(_solutionPath)) if (!FileSystem::FileExists(_solutionPath))
{ {
ScriptsBuilder::GenerateProject(); ScriptsBuilder::GenerateProject(GetGenerateProjectCustomArgs());
} }
// Open file // Open file
@@ -172,7 +177,7 @@ void VisualStudioEditor::OpenSolution()
// Generate project files if solution is missing // Generate project files if solution is missing
if (!FileSystem::FileExists(_solutionPath)) if (!FileSystem::FileExists(_solutionPath))
{ {
ScriptsBuilder::GenerateProject(); ScriptsBuilder::GenerateProject(GetGenerateProjectCustomArgs());
} }
// Open solution // Open solution
@@ -187,7 +192,7 @@ void VisualStudioEditor::OpenSolution()
void VisualStudioEditor::OnFileAdded(const String& path) void VisualStudioEditor::OnFileAdded(const String& path)
{ {
// TODO: finish dynamic files adding to the project - for now just regenerate it // TODO: finish dynamic files adding to the project - for now just regenerate it
ScriptsBuilder::GenerateProject(); ScriptsBuilder::GenerateProject(GetGenerateProjectCustomArgs());
return; return;
if (!FileSystem::FileExists(_solutionPath)) if (!FileSystem::FileExists(_solutionPath))
{ {

View File

@@ -56,6 +56,7 @@ public:
// [CodeEditor] // [CodeEditor]
CodeEditorTypes GetType() const override; CodeEditorTypes GetType() const override;
String GetName() const override; String GetName() const override;
String GetGenerateProjectCustomArgs() const override;
void OpenFile(const String& path, int32 line) override; void OpenFile(const String& path, int32 line) override;
void OpenSolution() override; void OpenSolution() override;
void OnFileAdded(const String& path) override; void OnFileAdded(const String& path) override;

View File

@@ -128,6 +128,11 @@ String VisualStudioCodeEditor::GetName() const
return _isInsiders ? TEXT("Visual Studio Code - Insiders") : TEXT("Visual Studio Code"); return _isInsiders ? TEXT("Visual Studio Code - Insiders") : TEXT("Visual Studio Code");
} }
String VisualStudioCodeEditor::GetGenerateProjectCustomArgs() const
{
return TEXT("-vs2022 -vscode");
}
void VisualStudioCodeEditor::OpenFile(const String& path, int32 line) void VisualStudioCodeEditor::OpenFile(const String& path, int32 line)
{ {
// Generate VS solution files for intellisense // Generate VS solution files for intellisense

View File

@@ -37,6 +37,7 @@ public:
// [CodeEditor] // [CodeEditor]
CodeEditorTypes GetType() const override; CodeEditorTypes GetType() const override;
String GetName() const override; String GetName() const override;
String GetGenerateProjectCustomArgs() const override;
void OpenFile(const String& path, int32 line) override; void OpenFile(const String& path, int32 line) override;
void OpenSolution() override; void OpenSolution() override;
bool UseAsyncForOpen() const override; bool UseAsyncForOpen() const override;

View File

@@ -406,6 +406,8 @@ namespace FlaxEngine.Utilities
{ {
if (type == ScriptType.Null) if (type == ScriptType.Null)
return null; return null;
if (type.BaseType == null)
return type.Type;
while (type.Type == null) while (type.Type == null)
type = type.BaseType; type = type.BaseType;
return type.Type; return type.Type;

View File

@@ -479,7 +479,7 @@ namespace FlaxEditor.Surface.Archetypes
// Scale debug pointer when it moves to make it more visible when investigating blending // Scale debug pointer when it moves to make it more visible when investigating blending
const float debugMaxSize = 2.0f; const float debugMaxSize = 2.0f;
float debugScale = Mathf.Saturate(Float2.Distance(ref _debugPos, ref prev) / new Float2(_rangeX.Absolute.ValuesSum, _rangeY.Absolute.ValuesSum).Length * 100.0f) * debugMaxSize + 1.0f; float debugScale = Mathf.Saturate(Float2.Distance(_debugPos, prev) / new Float2(_rangeX.Absolute.ValuesSum, _rangeY.Absolute.ValuesSum).Length * 100.0f) * debugMaxSize + 1.0f;
float debugBlendSpeed = _debugScale <= debugScale ? 4.0f : 1.0f; float debugBlendSpeed = _debugScale <= debugScale ? 4.0f : 1.0f;
_debugScale = Mathf.Lerp(_debugScale, debugScale, deltaTime * debugBlendSpeed); _debugScale = Mathf.Lerp(_debugScale, debugScale, deltaTime * debugBlendSpeed);
} }
@@ -1189,9 +1189,9 @@ namespace FlaxEditor.Surface.Archetypes
_triangleColors = new Color[_triangles.Length]; _triangleColors = new Color[_triangles.Length];
for (int i = 0; i < _triangles.Length; i += 3) for (int i = 0; i < _triangles.Length; i += 3)
{ {
var is0 = Float2.NearEqual(ref _triangles[i + 0], ref pos); var is0 = Float2.NearEqual(_triangles[i + 0], pos);
var is1 = Float2.NearEqual(ref _triangles[i + 1], ref pos); var is1 = Float2.NearEqual(_triangles[i + 1], pos);
var is2 = Float2.NearEqual(ref _triangles[i + 2], ref pos); var is2 = Float2.NearEqual(_triangles[i + 2], pos);
if (is0 || is1 || is2) if (is0 || is1 || is2)
{ {
selectedTriangles.Add(_triangles[i + 0]); selectedTriangles.Add(_triangles[i + 0]);
@@ -1233,7 +1233,7 @@ namespace FlaxEditor.Surface.Archetypes
if (point != null) if (point != null)
{ {
var highlightColor = point.IsMouseDown ? style.SelectionBorder : style.BackgroundSelected; var highlightColor = point.IsMouseDown ? style.SelectionBorder : style.BackgroundSelected;
Render2D.PushTint(ref highlightColor); Render2D.PushTint(highlightColor);
Render2D.DrawTriangles(_selectedTriangles, _selectedColors); Render2D.DrawTriangles(_selectedTriangles, _selectedColors);
Render2D.PopTint(); Render2D.PopTint();
} }

View File

@@ -213,7 +213,7 @@ namespace FlaxEditor.Surface.Archetypes
if (base.OnMouseDoubleClick(location, button)) if (base.OnMouseDoubleClick(location, button))
return true; return true;
if (_headerRect.Contains(ref location)) if (_headerRect.Contains(location))
{ {
StartRenaming(); StartRenaming();
return true; return true;
@@ -364,7 +364,7 @@ namespace FlaxEditor.Surface.Archetypes
if (ClipChildren) if (ClipChildren)
{ {
GetDesireClientArea(out var clientArea); GetDesireClientArea(out var clientArea);
Render2D.PushClip(ref clientArea); Render2D.PushClip(clientArea);
} }
DrawChildren(); DrawChildren();
@@ -382,13 +382,13 @@ namespace FlaxEditor.Surface.Archetypes
/// <inheritdoc /> /// <inheritdoc />
public override bool CanSelect(ref Float2 location) public override bool CanSelect(ref Float2 location)
{ {
return _dragAreaRect.MakeOffsetted(Location).Contains(ref location); return _dragAreaRect.MakeOffsetted(Location).Contains(location);
} }
/// <inheritdoc /> /// <inheritdoc />
public override bool OnMouseDown(Float2 location, MouseButton button) public override bool OnMouseDown(Float2 location, MouseButton button)
{ {
if (button == MouseButton.Left && !_dragAreaRect.Contains(ref location)) if (button == MouseButton.Left && !_dragAreaRect.Contains(location))
{ {
_isMouseDown = true; _isMouseDown = true;
Cursor = CursorType.Hand; Cursor = CursorType.Hand;
@@ -687,7 +687,7 @@ namespace FlaxEditor.Surface.Archetypes
var upperLeft = bounds.UpperLeft; var upperLeft = bounds.UpperLeft;
var bottomRight = bounds.BottomRight; var bottomRight = bounds.BottomRight;
bounds = Rectangle.FromPoints(PointToParent(ref upperLeft), PointToParent(ref bottomRight)); bounds = Rectangle.FromPoints(PointToParent(ref upperLeft), PointToParent(ref bottomRight));
CollisionsHelper.ClosestPointRectanglePoint(ref bounds, ref startPos, out endPos); CollisionsHelper.ClosestPointRectanglePoint(bounds, startPos, out endPos);
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -731,15 +731,15 @@ namespace FlaxEditor.Surface.Archetypes
// Check click over the connection // Check click over the connection
var mousePosition = Surface.SurfaceRoot.PointFromParent(ref mouse); var mousePosition = Surface.SurfaceRoot.PointFromParent(ref mouse);
if (!TransitionsRectangle.Contains(ref mousePosition)) if (!TransitionsRectangle.Contains(mousePosition))
return; return;
for (int i = 0; i < Transitions.Count; i++) for (int i = 0; i < Transitions.Count; i++)
{ {
var t = Transitions[i]; var t = Transitions[i];
if (t.Bounds.Contains(ref mousePosition)) if (t.Bounds.Contains(mousePosition))
{ {
CollisionsHelper.ClosestPointPointLine(ref mousePosition, ref t.StartPos, ref t.EndPos, out var point); CollisionsHelper.ClosestPointPointLine(mousePosition, t.StartPos, t.EndPos, out var point);
if (Float2.DistanceSquared(ref mousePosition, ref point) < 25.0f) if (Float2.DistanceSquared(mousePosition, point) < 25.0f)
{ {
OnTransitionClicked(t, ref mouse, ref mousePosition, buttons); OnTransitionClicked(t, ref mouse, ref mousePosition, buttons);
handled = true; handled = true;
@@ -756,15 +756,15 @@ namespace FlaxEditor.Surface.Archetypes
// Check double click over the connection // Check double click over the connection
var mousePosition = Surface.SurfaceRoot.PointFromParent(ref mouse); var mousePosition = Surface.SurfaceRoot.PointFromParent(ref mouse);
if (!TransitionsRectangle.Contains(ref mousePosition)) if (!TransitionsRectangle.Contains(mousePosition))
return; return;
for (int i = 0; i < Transitions.Count; i++) for (int i = 0; i < Transitions.Count; i++)
{ {
var t = Transitions[i]; var t = Transitions[i];
if (t.Bounds.Contains(ref mousePosition)) if (t.Bounds.Contains(mousePosition))
{ {
CollisionsHelper.ClosestPointPointLine(ref mousePosition, ref t.StartPos, ref t.EndPos, out var point); CollisionsHelper.ClosestPointPointLine(mousePosition, t.StartPos, t.EndPos, out var point);
if (Float2.DistanceSquared(ref mousePosition, ref point) < 25.0f) if (Float2.DistanceSquared(mousePosition, point) < 25.0f)
{ {
t.EditRule(); t.EditRule();
handled = true; handled = true;
@@ -1007,7 +1007,7 @@ namespace FlaxEditor.Surface.Archetypes
var offset = diff ? -6.0f : 6.0f; var offset = diff ? -6.0f : 6.0f;
var dir = startPos - endPos; var dir = startPos - endPos;
dir.Normalize(); dir.Normalize();
Float2.Perpendicular(ref dir, out var nrm); Float2.Perpendicular(dir, out var nrm);
nrm *= offset; nrm *= offset;
startPos += nrm; startPos += nrm;
endPos += nrm; endPos += nrm;
@@ -1031,7 +1031,7 @@ namespace FlaxEditor.Surface.Archetypes
t.StartPos = startPos; t.StartPos = startPos;
t.EndPos = endPos; t.EndPos = endPos;
Rectangle.FromPoints(ref startPos, ref endPos, out t.Bounds); Rectangle.FromPoints(startPos, endPos, out t.Bounds);
t.Bounds.Expand(10.0f); t.Bounds.Expand(10.0f);
} }
@@ -1040,7 +1040,7 @@ namespace FlaxEditor.Surface.Archetypes
TransitionsRectangle = Transitions[0].Bounds; TransitionsRectangle = Transitions[0].Bounds;
for (int i = 1; i < Transitions.Count; i++) for (int i = 1; i < Transitions.Count; i++)
{ {
Rectangle.Union(ref TransitionsRectangle, ref Transitions[i].Bounds, out TransitionsRectangle); Rectangle.Union(TransitionsRectangle, Transitions[i].Bounds, out TransitionsRectangle);
} }
} }
else else
@@ -1095,7 +1095,7 @@ namespace FlaxEditor.Surface.Archetypes
if (ClipChildren) if (ClipChildren)
{ {
GetDesireClientArea(out var clientArea); GetDesireClientArea(out var clientArea);
Render2D.PushClip(ref clientArea); Render2D.PushClip(clientArea);
} }
DrawChildren(); DrawChildren();
@@ -1120,7 +1120,7 @@ namespace FlaxEditor.Surface.Archetypes
/// <inheritdoc /> /// <inheritdoc />
public override bool CanSelect(ref Float2 location) public override bool CanSelect(ref Float2 location)
{ {
return _dragAreaRect.MakeOffsetted(Location).Contains(ref location); return _dragAreaRect.MakeOffsetted(Location).Contains(location);
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -1129,7 +1129,7 @@ namespace FlaxEditor.Surface.Archetypes
if (base.OnMouseDoubleClick(location, button)) if (base.OnMouseDoubleClick(location, button))
return true; return true;
if (_renameButtonRect.Contains(ref location) || _closeButtonRect.Contains(ref location)) if (_renameButtonRect.Contains(location) || _closeButtonRect.Contains(location))
return true; return true;
return false; return false;
@@ -1138,7 +1138,7 @@ namespace FlaxEditor.Surface.Archetypes
/// <inheritdoc /> /// <inheritdoc />
public override bool OnMouseDown(Float2 location, MouseButton button) public override bool OnMouseDown(Float2 location, MouseButton button)
{ {
if (button == MouseButton.Left && !_dragAreaRect.Contains(ref location)) if (button == MouseButton.Left && !_dragAreaRect.Contains(location))
{ {
_isMouseDown = true; _isMouseDown = true;
Cursor = CursorType.Hand; Cursor = CursorType.Hand;
@@ -1271,11 +1271,11 @@ namespace FlaxEditor.Surface.Archetypes
for (int i = 0; i < Transitions.Count; i++) for (int i = 0; i < Transitions.Count; i++)
{ {
var t = Transitions[i]; var t = Transitions[i];
var isMouseOver = t.Bounds.Contains(ref mousePosition); var isMouseOver = t.Bounds.Contains(mousePosition);
if (isMouseOver) if (isMouseOver)
{ {
CollisionsHelper.ClosestPointPointLine(ref mousePosition, ref t.StartPos, ref t.EndPos, out var point); CollisionsHelper.ClosestPointPointLine(mousePosition, t.StartPos, t.EndPos, out var point);
isMouseOver = Float2.DistanceSquared(ref mousePosition, ref point) < 25.0f; isMouseOver = Float2.DistanceSquared(mousePosition, point) < 25.0f;
} }
var color = isMouseOver ? Color.Wheat : t.LineColor; var color = isMouseOver ? Color.Wheat : t.LineColor;
SurfaceStyle.DrawStraightConnection(t.StartPos, t.EndPos, color); SurfaceStyle.DrawStraightConnection(t.StartPos, t.EndPos, color);
@@ -1474,7 +1474,7 @@ namespace FlaxEditor.Surface.Archetypes
return true; return true;
// Rename // Rename
if (_renameButtonRect.Contains(ref location)) if (_renameButtonRect.Contains(location))
{ {
StartRenaming(); StartRenaming();
return true; return true;

View File

@@ -308,7 +308,7 @@ namespace FlaxEditor.Surface.Archetypes
if (base.OnMouseDoubleClick(location, button)) if (base.OnMouseDoubleClick(location, button))
return true; return true;
if (_nameField.Bounds.Contains(ref location) && Surface.CanEdit) if (_nameField.Bounds.Contains(location) && Surface.CanEdit)
{ {
StartRenaming(); StartRenaming();
return true; return true;
@@ -1128,7 +1128,7 @@ namespace FlaxEditor.Surface.Archetypes
/// <inheritdoc /> /// <inheritdoc />
public override bool OnMouseDoubleClick(Float2 location, MouseButton button) public override bool OnMouseDoubleClick(Float2 location, MouseButton button)
{ {
if (button == MouseButton.Left && _headerRect.Contains(ref location)) if (button == MouseButton.Left && _headerRect.Contains(location))
{ {
// Open function content item if exists // Open function content item if exists
var method = GetMethod(out var scriptType, out _, out _); var method = GetMethod(out var scriptType, out _, out _);
@@ -1759,7 +1759,7 @@ namespace FlaxEditor.Surface.Archetypes
/// <inheritdoc /> /// <inheritdoc />
public override bool OnMouseDoubleClick(Float2 location, MouseButton button) public override bool OnMouseDoubleClick(Float2 location, MouseButton button)
{ {
if (button == MouseButton.Left && _headerRect.Contains(ref location)) if (button == MouseButton.Left && _headerRect.Contains(location))
{ {
OnEditSignature(); OnEditSignature();
return true; return true;

View File

@@ -347,7 +347,7 @@ namespace FlaxEditor.Surface.Archetypes
public override bool CanSelect(ref Float2 location) public override bool CanSelect(ref Float2 location)
{ {
return base.CanSelect(ref location) && !_resizeButtonRect.MakeOffsetted(Location).Contains(ref location); return base.CanSelect(ref location) && !_resizeButtonRect.MakeOffsetted(Location).Contains(location);
} }
public override void OnSurfaceLoaded(SurfaceNodeActions action) public override void OnSurfaceLoaded(SurfaceNodeActions action)
@@ -414,7 +414,7 @@ namespace FlaxEditor.Surface.Archetypes
if (base.OnMouseDown(location, button)) if (base.OnMouseDown(location, button))
return true; return true;
if (button == MouseButton.Left && _resizeButtonRect.Contains(ref location) && Surface.CanEdit) if (button == MouseButton.Left && _resizeButtonRect.Contains(location) && Surface.CanEdit)
{ {
// Start sliding // Start sliding
_isResizing = true; _isResizing = true;

View File

@@ -182,7 +182,7 @@ namespace FlaxEditor.Surface.Archetypes
/// <inheritdoc /> /// <inheritdoc />
public override bool OnMouseDown(Float2 location, MouseButton button) public override bool OnMouseDown(Float2 location, MouseButton button)
{ {
if (button == MouseButton.Left && _arrangeButtonRect.Contains(ref location)) if (button == MouseButton.Left && _arrangeButtonRect.Contains(location))
{ {
_arrangeButtonInUse = true; _arrangeButtonInUse = true;
Focus(); Focus();

View File

@@ -191,7 +191,7 @@ namespace FlaxEditor.Surface.Archetypes
// Header // Header
var headerColor = style.BackgroundHighlighted; var headerColor = style.BackgroundHighlighted;
if (_headerRect.Contains(ref _mousePosition)) if (_headerRect.Contains(_mousePosition))
headerColor *= 1.07f; headerColor *= 1.07f;
Render2D.FillRectangle(_headerRect, headerColor); Render2D.FillRectangle(_headerRect, headerColor);
Render2D.DrawText(style.FontLarge, Title, _headerRect, style.Foreground, TextAlignment.Center, TextAlignment.Center); Render2D.DrawText(style.FontLarge, Title, _headerRect, style.Foreground, TextAlignment.Center, TextAlignment.Center);

View File

@@ -113,7 +113,7 @@ namespace FlaxEditor.Surface.Archetypes
var icons = Editor.Instance.Icons; var icons = Editor.Instance.Icons;
var icon = isSelected ? icons.VisjectArrowClosed32 : icons.VisjectArrowOpen32; var icon = isSelected ? icons.VisjectArrowClosed32 : icons.VisjectArrowOpen32;
Render2D.PushTransform(ref arrowTransform); Render2D.PushTransform(arrowTransform);
Render2D.DrawSprite(icon, arrowRect, color); Render2D.DrawSprite(icon, arrowRect, color);
Render2D.PopTransform(); Render2D.PopTransform();
} }
@@ -169,7 +169,7 @@ namespace FlaxEditor.Surface.Archetypes
/// <inheritdoc /> /// <inheritdoc />
public override void OnMouseMove(Float2 location) public override void OnMouseMove(Float2 location)
{ {
if (_isMoving && Float2.DistanceSquared(ref location, ref _startMovePos) > 25.0f) if (_isMoving && Float2.DistanceSquared(location, _startMovePos) > 25.0f)
{ {
_startMovePos = Float2.Minimum; _startMovePos = Float2.Minimum;
int index = Node._stops.IndexOf(this); int index = Node._stops.IndexOf(this);
@@ -1076,12 +1076,12 @@ namespace FlaxEditor.Surface.Archetypes
} }
/// <inheritdoc /> /// <inheritdoc />
protected override bool ShowTooltip => !string.IsNullOrEmpty(TooltipText) && _localBounds.Contains(ref _mousePosition) && !Surface.IsLeftMouseButtonDown && !Surface.IsRightMouseButtonDown && !Surface.IsPrimaryMenuOpened; protected override bool ShowTooltip => !string.IsNullOrEmpty(TooltipText) && _localBounds.Contains(_mousePosition) && !Surface.IsLeftMouseButtonDown && !Surface.IsRightMouseButtonDown && !Surface.IsPrimaryMenuOpened;
/// <inheritdoc /> /// <inheritdoc />
public override bool OnTestTooltipOverControl(ref Float2 location) public override bool OnTestTooltipOverControl(ref Float2 location)
{ {
return _localBounds.Contains(ref location) && ShowTooltip; return _localBounds.Contains(location) && ShowTooltip;
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -1150,7 +1150,7 @@ namespace FlaxEditor.Surface.Archetypes
/// <inheritdoc /> /// <inheritdoc />
public override bool CanSelect(ref Float2 location) public override bool CanSelect(ref Float2 location)
{ {
return new Rectangle(Location, DefaultSize).Contains(ref location); return new Rectangle(Location, DefaultSize).Contains(location);
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -1230,7 +1230,7 @@ namespace FlaxEditor.Surface.Archetypes
/// <inheritdoc /> /// <inheritdoc />
public override void OnMouseMove(Float2 location) public override void OnMouseMove(Float2 location)
{ {
_isMouseInConnectingBounds = IsMouseOver && _localBounds.MakeExpanded(ConnectingBounds).Contains(ref location); // Inner area for connecting, outer area for moving _isMouseInConnectingBounds = IsMouseOver && _localBounds.MakeExpanded(ConnectingBounds).Contains(location); // Inner area for connecting, outer area for moving
if (!_isMouseInConnectingBounds && !_isMouseDown) if (!_isMouseInConnectingBounds && !_isMouseDown)
Cursor = CursorType.SizeAll; Cursor = CursorType.SizeAll;
else else

View File

@@ -156,7 +156,7 @@ namespace FlaxEditor.Surface.Elements
Bezier(ref offsetStart, ref control1, ref control2, ref offsetEnd, t, out p); Bezier(ref offsetStart, ref control1, ref control2, ref offsetEnd, t, out p);
// Maybe it would be reasonable to return the point? // Maybe it would be reasonable to return the point?
CollisionsHelper.ClosestPointPointLine(ref point, ref oldp, ref p, out var result); CollisionsHelper.ClosestPointPointLine(point, oldp, p, out var result);
if (Float2.DistanceSquared(point, result) <= squaredDistance) if (Float2.DistanceSquared(point, result) <= squaredDistance)
{ {
return true; return true;
@@ -167,12 +167,12 @@ namespace FlaxEditor.Surface.Elements
private static void Bezier(ref Float2 p0, ref Float2 p1, ref Float2 p2, ref Float2 p3, float alpha, out Float2 result) private static void Bezier(ref Float2 p0, ref Float2 p1, ref Float2 p2, ref Float2 p3, float alpha, out Float2 result)
{ {
Float2.Lerp(ref p0, ref p1, alpha, out var p01); Float2.Lerp(p0, p1, alpha, out var p01);
Float2.Lerp(ref p1, ref p2, alpha, out var p12); Float2.Lerp(p1, p2, alpha, out var p12);
Float2.Lerp(ref p2, ref p3, alpha, out var p23); Float2.Lerp(p2, p3, alpha, out var p23);
Float2.Lerp(ref p01, ref p12, alpha, out var p012); Float2.Lerp(p01, p12, alpha, out var p012);
Float2.Lerp(ref p12, ref p23, alpha, out var p123); Float2.Lerp(p12, p23, alpha, out var p123);
Float2.Lerp(ref p012, ref p123, alpha, out result); Float2.Lerp(p012, p123, alpha, out result);
} }
/// <summary> /// <summary>

View File

@@ -146,13 +146,13 @@ namespace FlaxEditor.Surface
/// <inheritdoc /> /// <inheritdoc />
public override bool CanSelect(ref Float2 location) public override bool CanSelect(ref Float2 location)
{ {
return _headerRect.MakeOffsetted(Location).Contains(ref location) && !_resizeButtonRect.MakeOffsetted(Location).Contains(ref location); return _headerRect.MakeOffsetted(Location).Contains(location) && !_resizeButtonRect.MakeOffsetted(Location).Contains(location);
} }
/// <inheritdoc /> /// <inheritdoc />
public override bool IsSelectionIntersecting(ref Rectangle selectionRect) public override bool IsSelectionIntersecting(ref Rectangle selectionRect)
{ {
return _headerRect.MakeOffsetted(Location).Intersects(ref selectionRect); return _headerRect.MakeOffsetted(Location).Intersects(selectionRect);
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -287,7 +287,7 @@ namespace FlaxEditor.Surface
/// <inheritdoc /> /// <inheritdoc />
public override bool ContainsPoint(ref Float2 location, bool precise) public override bool ContainsPoint(ref Float2 location, bool precise)
{ {
return _headerRect.Contains(ref location) || _resizeButtonRect.Contains(ref location); return _headerRect.Contains(location) || _resizeButtonRect.Contains(location);
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -297,7 +297,7 @@ namespace FlaxEditor.Surface
return true; return true;
// Check if can start resizing // Check if can start resizing
if (button == MouseButton.Left && _resizeButtonRect.Contains(ref location) && Surface.CanEdit) if (button == MouseButton.Left && _resizeButtonRect.Contains(location) && Surface.CanEdit)
{ {
// Start sliding // Start sliding
_isResizing = true; _isResizing = true;
@@ -336,7 +336,7 @@ namespace FlaxEditor.Surface
return true; return true;
// Rename // Rename
if (_headerRect.Contains(ref location) && Surface.CanEdit) if (_headerRect.Contains(location) && Surface.CanEdit)
{ {
StartRenaming(); StartRenaming();
return true; return true;
@@ -404,14 +404,14 @@ namespace FlaxEditor.Surface
return true; return true;
// Close // Close
if (_closeButtonRect.Contains(ref location) && Surface.CanEdit) if (_closeButtonRect.Contains(location) && Surface.CanEdit)
{ {
Surface.Delete(this); Surface.Delete(this);
return true; return true;
} }
// Color // Color
if (_colorButtonRect.Contains(ref location) && Surface.CanEdit) if (_colorButtonRect.Contains(location) && Surface.CanEdit)
{ {
ColorValueBox.ShowPickColorDialog?.Invoke(this, Color, OnColorChanged); ColorValueBox.ShowPickColorDialog?.Invoke(this, Color, OnColorChanged);
return true; return true;

View File

@@ -93,7 +93,7 @@ namespace FlaxEditor.Surface
/// <returns><c>true</c> if the selection rectangle is intersecting with the selectable parts of the control ; otherwise, <c>false</c>.</returns> /// <returns><c>true</c> if the selection rectangle is intersecting with the selectable parts of the control ; otherwise, <c>false</c>.</returns>
public virtual bool IsSelectionIntersecting(ref Rectangle selectionRect) public virtual bool IsSelectionIntersecting(ref Rectangle selectionRect)
{ {
return Bounds.Intersects(ref selectionRect); return Bounds.Intersects(selectionRect);
} }
/// <summary> /// <summary>

View File

@@ -868,7 +868,7 @@ namespace FlaxEditor.Surface
} }
/// <inheritdoc /> /// <inheritdoc />
protected override bool ShowTooltip => base.ShowTooltip && _headerRect.Contains(ref _mousePosition) && !Surface.IsLeftMouseButtonDown && !Surface.IsRightMouseButtonDown && !Surface.IsPrimaryMenuOpened; protected override bool ShowTooltip => base.ShowTooltip && _headerRect.Contains(_mousePosition) && !Surface.IsLeftMouseButtonDown && !Surface.IsRightMouseButtonDown && !Surface.IsPrimaryMenuOpened;
/// <inheritdoc /> /// <inheritdoc />
public override bool OnShowTooltip(out string text, out Float2 location, out Rectangle area) public override bool OnShowTooltip(out string text, out Float2 location, out Rectangle area)
@@ -898,13 +898,13 @@ namespace FlaxEditor.Surface
/// <inheritdoc /> /// <inheritdoc />
public override bool OnTestTooltipOverControl(ref Float2 location) public override bool OnTestTooltipOverControl(ref Float2 location)
{ {
return _headerRect.Contains(ref location) && ShowTooltip && !Surface.IsConnecting && !Surface.IsSelecting; return _headerRect.Contains(location) && ShowTooltip && !Surface.IsConnecting && !Surface.IsSelecting;
} }
/// <inheritdoc /> /// <inheritdoc />
public override bool CanSelect(ref Float2 location) public override bool CanSelect(ref Float2 location)
{ {
return _headerRect.MakeOffsetted(Location).Contains(ref location); return _headerRect.MakeOffsetted(Location).Contains(location);
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -1056,7 +1056,7 @@ namespace FlaxEditor.Surface
// Header // Header
var headerColor = style.BackgroundHighlighted; var headerColor = style.BackgroundHighlighted;
if (_headerRect.Contains(ref _mousePosition) && !Surface.IsConnecting && !Surface.IsSelecting) if (_headerRect.Contains(_mousePosition) && !Surface.IsConnecting && !Surface.IsSelecting)
headerColor *= 1.07f; headerColor *= 1.07f;
Render2D.FillRectangle(_headerRect, headerColor); Render2D.FillRectangle(_headerRect, headerColor);
Render2D.DrawText(style.FontLarge, Title, _headerRect, style.Foreground, TextAlignment.Center, TextAlignment.Center); Render2D.DrawText(style.FontLarge, Title, _headerRect, style.Foreground, TextAlignment.Center, TextAlignment.Center);
@@ -1099,7 +1099,7 @@ namespace FlaxEditor.Surface
if (base.OnMouseDown(location, button)) if (base.OnMouseDown(location, button))
return true; return true;
if (button == MouseButton.Left && (Archetype.Flags & NodeFlags.NoCloseButton) == 0 && _closeButtonRect.Contains(ref location)) if (button == MouseButton.Left && (Archetype.Flags & NodeFlags.NoCloseButton) == 0 && _closeButtonRect.Contains(location))
return true; return true;
if (button == MouseButton.Right) if (button == MouseButton.Right)
mouseDownMousePosition = Input.Mouse.Position; mouseDownMousePosition = Input.Mouse.Position;
@@ -1115,7 +1115,7 @@ namespace FlaxEditor.Surface
// Close/ delete // Close/ delete
bool canDelete = !Surface.IsConnecting && !Surface.WasSelecting && !Surface.WasMovingSelection; bool canDelete = !Surface.IsConnecting && !Surface.WasSelecting && !Surface.WasMovingSelection;
if (button == MouseButton.Left && canDelete && (Archetype.Flags & NodeFlags.NoCloseButton) == 0 && _closeButtonRect.Contains(ref location)) if (button == MouseButton.Left && canDelete && (Archetype.Flags & NodeFlags.NoCloseButton) == 0 && _closeButtonRect.Contains(location))
{ {
Surface.Delete(this); Surface.Delete(this);
return true; return true;

View File

@@ -32,13 +32,13 @@ namespace FlaxEditor.Surface
/// </summary> /// </summary>
public virtual void DrawComments() public virtual void DrawComments()
{ {
Render2D.PushTransform(ref _cachedTransform); Render2D.PushTransform(_cachedTransform);
// Push clipping mask // Push clipping mask
if (ClipChildren) if (ClipChildren)
{ {
GetDesireClientArea(out Rectangle clientArea); GetDesireClientArea(out Rectangle clientArea);
Render2D.PushClip(ref clientArea); Render2D.PushClip(clientArea);
} }
// Draw all visible child comments // Draw all visible child comments
@@ -48,7 +48,7 @@ namespace FlaxEditor.Surface
if (child is SurfaceComment && child.Visible) if (child is SurfaceComment && child.Visible)
{ {
Render2D.PushTransform(ref child._cachedTransform); Render2D.PushTransform(child._cachedTransform);
child.Draw(); child.Draw();
Render2D.PopTransform(); Render2D.PopTransform();
} }
@@ -74,11 +74,11 @@ namespace FlaxEditor.Surface
var child = _children[i]; var child = _children[i];
if (!(child is SurfaceComment) && child.Visible) if (!(child is SurfaceComment) && child.Visible)
{ {
Matrix3x3.Multiply(ref child._cachedTransform, ref globalTransform, out var globalChildTransform); Matrix3x3.Multiply(child._cachedTransform, globalTransform, out var globalChildTransform);
var childGlobalRect = new Rectangle(globalChildTransform.M31, globalChildTransform.M32, child.Width * globalChildTransform.M11, child.Height * globalChildTransform.M22); var childGlobalRect = new Rectangle(globalChildTransform.M31, globalChildTransform.M32, child.Width * globalChildTransform.M11, child.Height * globalChildTransform.M22);
if (globalClipping.Intersects(ref childGlobalRect)) if (globalClipping.Intersects(childGlobalRect))
{ {
Render2D.PushTransform(ref child._cachedTransform); Render2D.PushTransform(child._cachedTransform);
child.Draw(); child.Draw();
Render2D.PopTransform(); Render2D.PopTransform();
} }

View File

@@ -320,7 +320,7 @@ namespace FlaxEditor.Surface
Matrix3x3.RotationZ(rotation * Mathf.PiOverTwo) * Matrix3x3.RotationZ(rotation * Mathf.PiOverTwo) *
Matrix3x3.Translation2D(endPos - dir * 8); Matrix3x3.Translation2D(endPos - dir * 8);
Render2D.PushTransform(ref arrowTransform); Render2D.PushTransform(arrowTransform);
Render2D.DrawSprite(sprite, arrowRect, color); Render2D.DrawSprite(sprite, arrowRect, color);
Render2D.PopTransform(); Render2D.PopTransform();

View File

@@ -400,7 +400,7 @@ namespace FlaxEditor.Surface
return scriptType.GetGenericTypeDefinition() == typeof(Dictionary<,>); return scriptType.GetGenericTypeDefinition() == typeof(Dictionary<,>);
} }
var managedType = TypeUtils.GetType(scriptType); var managedType = TypeUtils.GetType(scriptType);
return !TypeUtils.IsDelegate(managedType); return managedType != null && !TypeUtils.IsDelegate(managedType);
} }
internal static bool IsValidVisualScriptFunctionType(ScriptType scriptType) internal static bool IsValidVisualScriptFunctionType(ScriptType scriptType)
@@ -408,7 +408,7 @@ namespace FlaxEditor.Surface
if (scriptType.IsGenericType || scriptType.IsStatic || !scriptType.IsPublic || scriptType.HasAttribute(typeof(HideInEditorAttribute), true)) if (scriptType.IsGenericType || scriptType.IsStatic || !scriptType.IsPublic || scriptType.HasAttribute(typeof(HideInEditorAttribute), true))
return false; return false;
var managedType = TypeUtils.GetType(scriptType); var managedType = TypeUtils.GetType(scriptType);
return !TypeUtils.IsDelegate(managedType); return managedType != null && !TypeUtils.IsDelegate(managedType);
} }
internal static string GetVisualScriptTypeDescription(ScriptType type) internal static string GetVisualScriptTypeDescription(ScriptType type)

View File

@@ -241,7 +241,7 @@ namespace FlaxEditor.Surface
} }
// Push surface view transform (scale and offset) // Push surface view transform (scale and offset)
Render2D.PushTransform(ref _rootControl._cachedTransform); Render2D.PushTransform(_rootControl._cachedTransform);
var features = Render2D.Features; var features = Render2D.Features;
Render2D.Features = Render2D.RenderingFeatures.None; Render2D.Features = Render2D.RenderingFeatures.None;

View File

@@ -502,7 +502,7 @@ namespace FlaxEditor.Surface
/// <inheritdoc /> /// <inheritdoc />
public override bool OnMouseDown(Float2 location, MouseButton button) public override bool OnMouseDown(Float2 location, MouseButton button)
{ {
if (button == MouseButton.Left && _arrangeButtonRect.Contains(ref location)) if (button == MouseButton.Left && _arrangeButtonRect.Contains(location))
{ {
_arrangeButtonInUse = true; _arrangeButtonInUse = true;
Focus(); Focus();

View File

@@ -191,7 +191,7 @@ namespace FlaxEngine.Tools
for (int i = 0; i < clothParticles.Length; i++) for (int i = 0; i < clothParticles.Length; i++)
{ {
var pos = instanceTransform.LocalToWorld(clothParticles[i]); var pos = instanceTransform.LocalToWorld(clothParticles[i]);
var dst = Vector3.Distance(ref pos, ref brushSphere.Center); var dst = Vector3.Distance(pos, brushSphere.Center);
if (dst > brushSphere.Radius) if (dst > brushSphere.Radius)
continue; continue;
float strength = _gizmoMode.BrushStrength * Mathf.Lerp(1.0f, 1.0f - (float)dst / (float)brushSphere.Radius, _gizmoMode.BrushFalloff); float strength = _gizmoMode.BrushStrength * Mathf.Lerp(1.0f, 1.0f - (float)dst / (float)brushSphere.Radius, _gizmoMode.BrushFalloff);
@@ -304,7 +304,7 @@ namespace FlaxEngine.Tools
_brushMaterial.SetParameterValue("DepthBuffer", Owner.RenderTask.Buffers.DepthBuffer); _brushMaterial.SetParameterValue("DepthBuffer", Owner.RenderTask.Buffers.DepthBuffer);
Quaternion rotation = RootNode.RaycastNormalRotation(ref _hitNormal); Quaternion rotation = RootNode.RaycastNormalRotation(ref _hitNormal);
Matrix transform = Matrix.Scaling(_gizmoMode.BrushSize * 0.01f) * Matrix.RotationQuaternion(rotation) * Matrix.Translation(_hitLocation - viewOrigin); Matrix transform = Matrix.Scaling(_gizmoMode.BrushSize * 0.01f) * Matrix.RotationQuaternion(rotation) * Matrix.Translation(_hitLocation - viewOrigin);
_brushModel.Draw(ref renderContext, _brushMaterial, ref transform); _brushModel.Draw(renderContext, _brushMaterial, transform);
} }
} }
} }

View File

@@ -104,7 +104,7 @@ namespace FlaxEditor.Tools.Foliage
if (foliage && instanceIndex >= 0 && instanceIndex < foliage.InstancesCount) if (foliage && instanceIndex >= 0 && instanceIndex < foliage.InstancesCount)
{ {
var instance = foliage.GetInstance(instanceIndex); var instance = foliage.GetInstance(instanceIndex);
BoundingBox.FromSphere(ref instance.Bounds, out bounds); BoundingBox.FromSphere(instance.Bounds, out bounds);
} }
} }
@@ -155,8 +155,8 @@ namespace FlaxEditor.Tools.Foliage
} }
else else
{ {
Matrix.RotationQuaternion(ref trans.Orientation, out var transWorld); Matrix.RotationQuaternion(trans.Orientation, out var transWorld);
Matrix.RotationQuaternion(ref rotationDelta, out var deltaWorld); Matrix.RotationQuaternion(rotationDelta, out var deltaWorld);
Matrix world = transWorld * Matrix.Translation(pivotOffset) * deltaWorld * Matrix.Translation(-pivotOffset); Matrix world = transWorld * Matrix.Translation(pivotOffset) * deltaWorld * Matrix.Translation(-pivotOffset);
trans.SetRotation(ref world); trans.SetRotation(ref world);
trans.Translation += world.TranslationVector; trans.Translation += world.TranslationVector;
@@ -172,7 +172,7 @@ namespace FlaxEditor.Tools.Foliage
// Transform foliage instance // Transform foliage instance
instance.Transform = foliage.Transform.WorldToLocal(trans); instance.Transform = foliage.Transform.WorldToLocal(trans);
foliage.SetInstanceTransform(instanceIndex, ref instance.Transform); foliage.SetInstanceTransform(instanceIndex, instance.Transform);
foliage.RebuildClusters(); foliage.RebuildClusters();
} }
@@ -204,7 +204,7 @@ namespace FlaxEditor.Tools.Foliage
// Duplicate instance and select it // Duplicate instance and select it
var newIndex = foliage.InstancesCount; var newIndex = foliage.InstancesCount;
foliage.AddInstance(ref instance); foliage.AddInstance(instance);
action.RecordEnd(); action.RecordEnd();
Owner.Undo?.AddAction(new MultiUndoAction(action, new EditSelectedInstanceIndexAction(GizmoMode.SelectedInstanceIndex, newIndex))); Owner.Undo?.AddAction(new MultiUndoAction(action, new EditSelectedInstanceIndexAction(GizmoMode.SelectedInstanceIndex, newIndex)));
GizmoMode.SelectedInstanceIndex = newIndex; GizmoMode.SelectedInstanceIndex = newIndex;
@@ -231,7 +231,7 @@ namespace FlaxEditor.Tools.Foliage
{ {
var transform = foliage.Transform.LocalToWorld(instance.Transform); var transform = foliage.Transform.LocalToWorld(instance.Transform);
renderContext.View.GetWorldMatrix(ref transform, out var world); renderContext.View.GetWorldMatrix(ref transform, out var world);
model.Draw(ref renderContext, _highlightMaterial, ref world, StaticFlags.None, false); model.Draw(renderContext, _highlightMaterial, world, StaticFlags.None, false);
} }
} }
@@ -247,7 +247,7 @@ namespace FlaxEditor.Tools.Foliage
if (!foliage) if (!foliage)
return; return;
var ray = Owner.MouseRay; var ray = Owner.MouseRay;
foliage.Intersects(ref ray, out _, out _, out var instanceIndex); foliage.Intersects(ray, out _, out _, out var instanceIndex);
// Change the selection (with undo) // Change the selection (with undo)
if (GizmoMode.SelectedInstanceIndex == instanceIndex) if (GizmoMode.SelectedInstanceIndex == instanceIndex)

View File

@@ -66,7 +66,7 @@ namespace FlaxEditor.Tools.Foliage
{ {
if (Foliage != null && InstanceIndex > -1 && InstanceIndex < Foliage.InstancesCount) if (Foliage != null && InstanceIndex > -1 && InstanceIndex < Foliage.InstancesCount)
{ {
Foliage.SetInstanceTransform(InstanceIndex, ref _instance.Transform); Foliage.SetInstanceTransform(InstanceIndex, _instance.Transform);
Foliage.RebuildClusters(); Foliage.RebuildClusters();
} }
} }

View File

@@ -94,7 +94,7 @@ namespace FlaxEditor.Tools.Foliage
else else
rotation = Quaternion.LookRotation(Vector3.Cross(Vector3.Cross(brushNormal, Vector3.Forward), brushNormal), brushNormal); rotation = Quaternion.LookRotation(Vector3.Cross(Vector3.Cross(brushNormal, Vector3.Forward), brushNormal), brushNormal);
Matrix transform = Matrix.Scaling(Mode.CurrentBrush.Size * 0.01f) * Matrix.RotationQuaternion(rotation) * Matrix.Translation(brushPosition - renderContext.View.Origin); Matrix transform = Matrix.Scaling(Mode.CurrentBrush.Size * 0.01f) * Matrix.RotationQuaternion(rotation) * Matrix.Translation(brushPosition - renderContext.View.Origin);
_brushModel.Draw(ref renderContext, brushMaterial, ref transform); _brushModel.Draw(renderContext, brushMaterial, transform);
} }
} }
} }

View File

@@ -55,7 +55,7 @@ namespace FlaxEditor.Tools.Foliage.Undo
var foliage = FlaxEngine.Object.Find<FlaxEngine.Foliage>(ref foliageId); var foliage = FlaxEngine.Object.Find<FlaxEngine.Foliage>(ref foliageId);
_index = foliage.InstancesCount; _index = foliage.InstancesCount;
foliage.AddInstance(ref _instance); foliage.AddInstance(_instance);
foliage.RebuildClusters(); foliage.RebuildClusters();
Editor.Instance.Scene.MarkSceneEdited(foliage.Scene); Editor.Instance.Scene.MarkSceneEdited(foliage.Scene);

View File

@@ -55,7 +55,7 @@ namespace FlaxEditor.Tools.Foliage.Undo
{ {
var foliageId = _foliageId; var foliageId = _foliageId;
var foliage = FlaxEngine.Object.Find<FlaxEngine.Foliage>(ref foliageId); var foliage = FlaxEngine.Object.Find<FlaxEngine.Foliage>(ref foliageId);
foliage.SetInstanceTransform(_index, ref _after); foliage.SetInstanceTransform(_index, _after);
foliage.RebuildClusters(); foliage.RebuildClusters();
Editor.Instance.Scene.MarkSceneEdited(foliage.Scene); Editor.Instance.Scene.MarkSceneEdited(foliage.Scene);
} }
@@ -65,7 +65,7 @@ namespace FlaxEditor.Tools.Foliage.Undo
{ {
var foliageId = _foliageId; var foliageId = _foliageId;
var foliage = FlaxEngine.Object.Find<FlaxEngine.Foliage>(ref foliageId); var foliage = FlaxEngine.Object.Find<FlaxEngine.Foliage>(ref foliageId);
foliage.SetInstanceTransform(_index, ref _before); foliage.SetInstanceTransform(_index, _before);
foliage.RebuildClusters(); foliage.RebuildClusters();
Editor.Instance.Scene.MarkSceneEdited(foliage.Scene); Editor.Instance.Scene.MarkSceneEdited(foliage.Scene);
} }

View File

@@ -117,7 +117,7 @@ namespace FlaxEditor.Tools.Terrain.Brushes
/// <inheritdoc /> /// <inheritdoc />
public override float Sample(ref Vector3 brushPosition, ref Vector3 samplePosition) public override float Sample(ref Vector3 brushPosition, ref Vector3 samplePosition)
{ {
Vector3.DistanceXZ(ref brushPosition, ref samplePosition, out var distanceXZ); Vector3.DistanceXZ(brushPosition, samplePosition, out var distanceXZ);
float distance = (float)distanceXZ; float distance = (float)distanceXZ;
float halfSize = Size * 0.5f; float halfSize = Size * 0.5f;
float falloff = halfSize * Falloff; float falloff = halfSize * Falloff;

View File

@@ -187,7 +187,7 @@ namespace FlaxEditor.Tools.Terrain
_isDone = false; _isDone = false;
// Call tool to generate the terrain patches from the input data // Call tool to generate the terrain patches from the input data
if (TerrainTools.GenerateTerrain(_terrain, ref _options.NumberOfPatches, _options.Heightmap, _options.HeightmapScale, _options.Splatmap1, _options.Splatmap2)) if (TerrainTools.GenerateTerrain(_terrain, _options.NumberOfPatches, _options.Heightmap, _options.HeightmapScale, _options.Splatmap1, _options.Splatmap2))
{ {
Editor.LogError("Failed to generate terrain. See log for more info."); Editor.LogError("Failed to generate terrain. See log for more info.");
} }

View File

@@ -146,7 +146,7 @@ namespace FlaxEditor.Tools.Terrain
_terrainId = terrain.ID; _terrainId = terrain.ID;
_patchCoord = patchCoord; _patchCoord = patchCoord;
_data = TerrainTools.SerializePatch(terrain, ref patchCoord); _data = TerrainTools.SerializePatch(terrain, patchCoord);
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -159,8 +159,8 @@ namespace FlaxEditor.Tools.Terrain
return; return;
} }
terrain.GetPatchBounds(terrain.GetPatchIndex(ref _patchCoord), out var patchBounds); terrain.GetPatchBounds(terrain.GetPatchIndex(_patchCoord), out var patchBounds);
terrain.RemovePatch(ref _patchCoord); terrain.RemovePatch(_patchCoord);
OnPatchEdit(terrain, ref patchBounds); OnPatchEdit(terrain, ref patchBounds);
} }
@@ -174,9 +174,9 @@ namespace FlaxEditor.Tools.Terrain
return; return;
} }
terrain.AddPatch(ref _patchCoord); terrain.AddPatch(_patchCoord);
TerrainTools.DeserializePatch(terrain, ref _patchCoord, _data); TerrainTools.DeserializePatch(terrain, _patchCoord, _data);
terrain.GetPatchBounds(terrain.GetPatchIndex(ref _patchCoord), out var patchBounds); terrain.GetPatchBounds(terrain.GetPatchIndex(_patchCoord), out var patchBounds);
OnPatchEdit(terrain, ref patchBounds); OnPatchEdit(terrain, ref patchBounds);
} }
@@ -210,7 +210,7 @@ namespace FlaxEditor.Tools.Terrain
return; return;
var patchCoord = Gizmo.SelectedPatchCoord; var patchCoord = Gizmo.SelectedPatchCoord;
if (!CarveTab.SelectedTerrain.HasPatch(ref patchCoord)) if (!CarveTab.SelectedTerrain.HasPatch(patchCoord))
return; return;
var action = new DeletePatchAction(CarveTab.SelectedTerrain, ref patchCoord); var action = new DeletePatchAction(CarveTab.SelectedTerrain, ref patchCoord);
@@ -247,7 +247,7 @@ namespace FlaxEditor.Tools.Terrain
_terrainId = terrain.ID; _terrainId = terrain.ID;
_patchCoord = patchCoord; _patchCoord = patchCoord;
_chunkCoord = chunkCoord; _chunkCoord = chunkCoord;
_beforeMaterial = terrain.GetChunkOverrideMaterial(ref patchCoord, ref chunkCoord)?.ID ?? Guid.Empty; _beforeMaterial = terrain.GetChunkOverrideMaterial(patchCoord, chunkCoord)?.ID ?? Guid.Empty;
_afterMaterial = toSet?.ID ?? Guid.Empty; _afterMaterial = toSet?.ID ?? Guid.Empty;
} }
@@ -277,7 +277,7 @@ namespace FlaxEditor.Tools.Terrain
return; return;
} }
terrain.SetChunkOverrideMaterial(ref _patchCoord, ref _chunkCoord, FlaxEngine.Content.LoadAsync<MaterialBase>(id)); terrain.SetChunkOverrideMaterial(_patchCoord, _chunkCoord, FlaxEngine.Content.LoadAsync<MaterialBase>(id));
Editor.Instance.Scene.MarkSceneEdited(terrain.Scene); Editor.Instance.Scene.MarkSceneEdited(terrain.Scene);
} }
@@ -334,9 +334,9 @@ namespace FlaxEditor.Tools.Terrain
_exportTerrainButton.Visible = false; _exportTerrainButton.Visible = false;
_isUpdatingUI = true; _isUpdatingUI = true;
if (terrain.HasPatch(ref patchCoord)) if (terrain.HasPatch(patchCoord))
{ {
_chunkOverrideMaterial.Validator.SelectedAsset = terrain.GetChunkOverrideMaterial(ref patchCoord, ref chunkCoord); _chunkOverrideMaterial.Validator.SelectedAsset = terrain.GetChunkOverrideMaterial(patchCoord, chunkCoord);
_chunkOverrideMaterial.Enabled = true; _chunkOverrideMaterial.Enabled = true;
} }
else else
@@ -349,7 +349,7 @@ namespace FlaxEditor.Tools.Terrain
} }
case EditTerrainGizmoMode.Modes.Add: case EditTerrainGizmoMode.Modes.Add:
{ {
if (terrain.HasPatch(ref patchCoord)) if (terrain.HasPatch(patchCoord))
{ {
_selectionInfoLabel.Text = string.Format( _selectionInfoLabel.Text = string.Format(
"Selected terrain: {0}\nMove mouse cursor at location without a patch.", "Selected terrain: {0}\nMove mouse cursor at location without a patch.",

View File

@@ -74,10 +74,10 @@ namespace FlaxEditor.Tools.Terrain
{ {
// Highlight selected chunk // Highlight selected chunk
var patchCoord = Mode.SelectedPatchCoord; var patchCoord = Mode.SelectedPatchCoord;
if (terrain.HasPatch(ref patchCoord)) if (terrain.HasPatch(patchCoord))
{ {
var chunkCoord = Mode.SelectedChunkCoord; var chunkCoord = Mode.SelectedChunkCoord;
terrain.DrawChunk(ref renderContext, ref patchCoord, ref chunkCoord, _highlightTerrainMaterial); terrain.DrawChunk(renderContext, patchCoord, chunkCoord, _highlightTerrainMaterial);
} }
break; break;
@@ -86,7 +86,7 @@ namespace FlaxEditor.Tools.Terrain
{ {
// Highlight patch to add location // Highlight patch to add location
var patchCoord = Mode.SelectedPatchCoord; var patchCoord = Mode.SelectedPatchCoord;
if (!terrain.HasPatch(ref patchCoord) && _planeModel) if (!terrain.HasPatch(patchCoord) && _planeModel)
{ {
var planeSize = 100.0f; var planeSize = 100.0f;
var patchSize = terrain.ChunkSize * FlaxEngine.Terrain.UnitsPerVertex * FlaxEngine.Terrain.PatchEdgeChunksCount; var patchSize = terrain.ChunkSize * FlaxEngine.Terrain.UnitsPerVertex * FlaxEngine.Terrain.PatchEdgeChunksCount;
@@ -96,7 +96,7 @@ namespace FlaxEditor.Tools.Terrain
Matrix.Scaling(terrain.Scale) * Matrix.Scaling(terrain.Scale) *
Matrix.RotationQuaternion(terrain.Orientation) * Matrix.RotationQuaternion(terrain.Orientation) *
Matrix.Translation(terrain.Position - renderContext.View.Origin); Matrix.Translation(terrain.Position - renderContext.View.Origin);
_planeModel.Draw(ref renderContext, _highlightMaterial, ref world); _planeModel.Draw(renderContext, _highlightMaterial, world);
} }
break; break;
@@ -105,9 +105,9 @@ namespace FlaxEditor.Tools.Terrain
{ {
// Highlight selected patch // Highlight selected patch
var patchCoord = Mode.SelectedPatchCoord; var patchCoord = Mode.SelectedPatchCoord;
if (terrain.HasPatch(ref patchCoord)) if (terrain.HasPatch(patchCoord))
{ {
terrain.DrawPatch(ref renderContext, ref patchCoord, _highlightTerrainMaterial); terrain.DrawPatch(renderContext, patchCoord, _highlightTerrainMaterial);
} }
break; break;
} }
@@ -173,12 +173,12 @@ namespace FlaxEditor.Tools.Terrain
return; return;
} }
terrain.AddPatch(ref _patchCoord); terrain.AddPatch(_patchCoord);
if (TerrainTools.InitializePatch(terrain, ref _patchCoord)) if (TerrainTools.InitializePatch(terrain, _patchCoord))
{ {
Editor.LogError("Failed to initialize terrain patch."); Editor.LogError("Failed to initialize terrain patch.");
} }
terrain.GetPatchBounds(terrain.GetPatchIndex(ref _patchCoord), out var patchBounds); terrain.GetPatchBounds(terrain.GetPatchIndex(_patchCoord), out var patchBounds);
OnPatchEdit(terrain, ref patchBounds); OnPatchEdit(terrain, ref patchBounds);
} }
@@ -192,8 +192,8 @@ namespace FlaxEditor.Tools.Terrain
return; return;
} }
terrain.GetPatchBounds(terrain.GetPatchIndex(ref _patchCoord), out var patchBounds); terrain.GetPatchBounds(terrain.GetPatchIndex(_patchCoord), out var patchBounds);
terrain.RemovePatch(ref _patchCoord); terrain.RemovePatch(_patchCoord);
OnPatchEdit(terrain, ref patchBounds); OnPatchEdit(terrain, ref patchBounds);
} }
@@ -226,7 +226,7 @@ namespace FlaxEditor.Tools.Terrain
if (terrain) if (terrain)
{ {
var patchCoord = Mode.SelectedPatchCoord; var patchCoord = Mode.SelectedPatchCoord;
if (!terrain.HasPatch(ref patchCoord)) if (!terrain.HasPatch(patchCoord))
{ {
// Add a new patch (with undo) // Add a new patch (with undo)
var action = new AddPatchAction(terrain, ref patchCoord); var action = new AddPatchAction(terrain, ref patchCoord);

View File

@@ -93,7 +93,7 @@ namespace FlaxEditor.Tools.Terrain.Paint
var brushBounds = gizmo.CursorBrushBounds; var brushBounds = gizmo.CursorBrushBounds;
terrain.GetLocalToWorldMatrix(out p.TerrainWorld); terrain.GetLocalToWorldMatrix(out p.TerrainWorld);
terrain.GetWorldToLocalMatrix(out var terrainInvWorld); terrain.GetWorldToLocalMatrix(out var terrainInvWorld);
BoundingBox.Transform(ref brushBounds, ref terrainInvWorld, out var brushBoundsLocal); BoundingBox.Transform(brushBounds, terrainInvWorld, out var brushBoundsLocal);
// TODO: try caching brush weights before apply to reduce complexity and batch brush sampling // TODO: try caching brush weights before apply to reduce complexity and batch brush sampling
@@ -132,11 +132,11 @@ namespace FlaxEditor.Tools.Terrain.Paint
continue; continue;
// Get the patch data (cached internally by the c++ core in editor) // Get the patch data (cached internally by the c++ core in editor)
var sourceData = TerrainTools.GetSplatMapData(terrain, ref patch.PatchCoord, splatmapIndex); var sourceData = TerrainTools.GetSplatMapData(terrain, patch.PatchCoord, splatmapIndex);
if (sourceData == null) if (sourceData == null)
throw new Exception("Cannot modify terrain. Loading splatmap failed. See log for more info."); throw new Exception("Cannot modify terrain. Loading splatmap failed. See log for more info.");
var sourceDataOther = TerrainTools.GetSplatMapData(terrain, ref patch.PatchCoord, splatmapIndexOther); var sourceDataOther = TerrainTools.GetSplatMapData(terrain, patch.PatchCoord, splatmapIndexOther);
if (sourceDataOther == null) if (sourceDataOther == null)
throw new Exception("Cannot modify terrain. Loading splatmap failed. See log for more info."); throw new Exception("Cannot modify terrain. Loading splatmap failed. See log for more info.");

View File

@@ -86,7 +86,7 @@ namespace FlaxEditor.Tools.Terrain.Paint
var src = (Color)p.SourceData[zz * p.HeightmapSize + xx]; var src = (Color)p.SourceData[zz * p.HeightmapSize + xx];
var samplePositionLocal = p.PatchPositionLocal + new Vector3(xx * FlaxEngine.Terrain.UnitsPerVertex, 0, zz * FlaxEngine.Terrain.UnitsPerVertex); var samplePositionLocal = p.PatchPositionLocal + new Vector3(xx * FlaxEngine.Terrain.UnitsPerVertex, 0, zz * FlaxEngine.Terrain.UnitsPerVertex);
Vector3.Transform(ref samplePositionLocal, ref p.TerrainWorld, out Vector3 samplePositionWorld); Vector3.Transform(samplePositionLocal, p.TerrainWorld, out Vector3 samplePositionWorld);
var sample = Mathf.Saturate(p.Brush.Sample(ref brushPosition, ref samplePositionWorld)); var sample = Mathf.Saturate(p.Brush.Sample(ref brushPosition, ref samplePositionWorld));
var paintAmount = sample * strength; var paintAmount = sample * strength;
@@ -115,9 +115,9 @@ namespace FlaxEditor.Tools.Terrain.Paint
Profiler.EndEvent(); Profiler.EndEvent();
// Update terrain patch // Update terrain patch
TerrainTools.ModifySplatMap(p.Terrain, ref p.PatchCoord, p.SplatmapIndex, p.TempBuffer, ref p.ModifiedOffset, ref p.ModifiedSize); TerrainTools.ModifySplatMap(p.Terrain, p.PatchCoord, p.SplatmapIndex, p.TempBuffer, p.ModifiedOffset, p.ModifiedSize);
if (otherModified) if (otherModified)
TerrainTools.ModifySplatMap(p.Terrain, ref p.PatchCoord, p.SplatmapIndexOther, p.TempBufferOther, ref p.ModifiedOffset, ref p.ModifiedSize); TerrainTools.ModifySplatMap(p.Terrain, p.PatchCoord, p.SplatmapIndexOther, p.TempBufferOther, p.ModifiedOffset, p.ModifiedSize);
} }
} }
} }

View File

@@ -81,7 +81,7 @@ namespace FlaxEditor.Tools.Terrain
for (int i = 0; i < Mode.ChunksUnderCursor.Count; i++) for (int i = 0; i < Mode.ChunksUnderCursor.Count; i++)
{ {
var chunk = Mode.ChunksUnderCursor[i]; var chunk = Mode.ChunksUnderCursor[i];
terrain.DrawChunk(ref renderContext, ref chunk.PatchCoord, ref chunk.ChunkCoord, brushMaterial, 0); terrain.DrawChunk(renderContext, chunk.PatchCoord, chunk.ChunkCoord, brushMaterial, 0);
} }
} }
} }

View File

@@ -314,7 +314,7 @@ namespace FlaxEditor.Tools.Terrain
for (int patchIndex = 0; patchIndex < patchesCount; patchIndex++) for (int patchIndex = 0; patchIndex < patchesCount; patchIndex++)
{ {
terrain.GetPatchBounds(patchIndex, out BoundingBox tmp); terrain.GetPatchBounds(patchIndex, out BoundingBox tmp);
if (!tmp.Intersects(ref brushBounds)) if (!tmp.Intersects(brushBounds))
continue; continue;
terrain.GetPatchCoord(patchIndex, out var patchCoord); terrain.GetPatchCoord(patchIndex, out var patchCoord);
@@ -323,7 +323,7 @@ namespace FlaxEditor.Tools.Terrain
for (int chunkIndex = 0; chunkIndex < FlaxEngine.Terrain.PatchChunksCount; chunkIndex++) for (int chunkIndex = 0; chunkIndex < FlaxEngine.Terrain.PatchChunksCount; chunkIndex++)
{ {
terrain.GetChunkBounds(patchIndex, chunkIndex, out tmp); terrain.GetChunkBounds(patchIndex, chunkIndex, out tmp);
if (!tmp.Intersects(ref brushBounds)) if (!tmp.Intersects(brushBounds))
continue; continue;
var chunkCoord = new Int2(chunkIndex % FlaxEngine.Terrain.PatchEdgeChunksCount, chunkIndex / FlaxEngine.Terrain.PatchEdgeChunksCount); var chunkCoord = new Int2(chunkIndex % FlaxEngine.Terrain.PatchEdgeChunksCount, chunkIndex / FlaxEngine.Terrain.PatchEdgeChunksCount);

Some files were not shown because too many files have changed in this diff Show More