310 Commits

Author SHA1 Message Date
8cf6979f90 _some prog with dynamic linking perhaps
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-03-15 22:45:36 +02:00
1ff4ac0402 _maybe prog, trying static linking 2026-03-14 15:50:15 +02:00
801f0f7432 _some prog, needs aot for corlib 2026-03-14 15:50:15 +02:00
8b605dff89 _baseline emscripten build 2026-03-14 15:49:23 +02:00
Wojtek Figat
21b2e59fbb Fix ValueBox regression on mouse cursor hover 2026-03-13 23:26:03 +01:00
Wojtek Figat
5fb1ad078b Change default editor windows decorations in SDL on Windows to ClientSide for all windows 2026-03-13 23:23:36 +01:00
Wojtek Figat
1fc5316d12 Adjust new Z Axis color in Transform 2026-03-13 23:21:30 +01:00
Wojtek Figat
1ceb781903 Fix camera preview placement in editor preview when resizing window 2026-03-13 23:21:08 +01:00
Wojtek Figat
6ae68bc6cc Add PhysX and NvCloth to Web 2026-03-13 17:49:11 +01:00
Wojtek Figat
a8e7faec3c Add default icon to Web exported files 2026-03-13 10:21:42 +01:00
Wojtek Figat
ab6e291976 Update file 2026-03-13 10:21:26 +01:00
Wojtek Figat
2cb12e3c0f Add SIMD support to Web with SSE4.2 2026-03-13 10:21:21 +01:00
Wojtek Figat
c91c209974 Build msdfgen for Web and Consoles 2026-03-13 09:55:49 +01:00
Wojtek Figat
45a8d82a83 Merge remote-tracking branch 'origin/master' into 1.12
# Conflicts:
#	Content/Shaders/GI/DDGI.flax
#	Content/Shaders/GUI.flax
#	Flax.flaxproj
#	Source/Editor/Windows/AboutDialog.cs
#	Source/Engine/Serialization/Stream.cpp
#	Source/Shaders/GUICommon.hlsl
2026-03-13 08:09:16 +01:00
Wojtek Figat
b41d25cbce Add msdfgen build for iOS and Mac 2026-03-13 00:12:07 +01:00
Wojtek Figat
3d201ec73f Add msdfgen build for Linux 2026-03-12 23:56:50 +01:00
Wojtek Figat
fa91e3e3ab Update asset 2026-03-12 23:32:37 +01:00
Wojtek Figat
38c87c158a Merge branch 'ThePhantomMask-Improve-HighlightedPopUpColor' 2026-03-12 22:54:54 +01:00
Wojtek Figat
241d37130a Merge branch 'Improve-HighlightedPopUpColor' of https://github.com/ThePhantomMask/FlaxEngine into ThePhantomMask-Improve-HighlightedPopUpColor 2026-03-12 22:54:34 +01:00
Wojtek Figat
21981f666f Merge branch 'fibref-flax-msdf-font' 2026-03-12 22:52:49 +01:00
Wojtek Figat
afe917a7f3 Improve e7016564b1 to reduce recompilation on commit changes 2026-03-12 22:51:29 +01:00
Wojtek Figat
d2a03b90ec Add another utility 2026-03-12 22:50:54 +01:00
Wojtek Figat
88587fb6a4 Add utility function to GUICommon.hlsl for MSDF fonts sampling in shaders
#3944
2026-03-12 20:24:03 +01:00
Phantom
895758d27d Merge branch 'master' into Improve-HighlightedPopUpColor 2026-03-12 17:34:46 +01:00
Wojtek Figat
48d86ac7ae Update engine assets 2026-03-12 17:23:39 +01:00
Wojtek Figat
bc3cddc774 Build msdfgen for Windows and Android with a minor cleanup for a build script
#3944
2026-03-12 17:23:29 +01:00
Wojtek Figat
d784fddf95 Code style cleanup for #3944 2026-03-12 17:22:43 +01:00
Wojtek Figat
fc7abbf541 Merge branch 'flax-msdf-font' of https://github.com/fibref/FlaxEngine into fibref-flax-msdf-font 2026-03-12 16:25:55 +01:00
Wojtek Figat
8b4f8de988 Fix Control.LocalLocation to use parent control GetDesireClientArea rather than Bounds
#3889
2026-03-12 15:27:31 +01:00
Wojtek Figat
549ed76e7c Add warning when importing texture that is non-power-of-two and cannot generate mip maps 2026-03-12 14:32:11 +01:00
Wojtek Figat
e7016564b1 Add Git repository branch name and commit hash injection into generated code module metadata 2026-03-12 14:27:34 +01:00
Wojtek Figat
8318a9c1d0 Fix crash when unloading scene during tick of that scene 2026-03-12 13:39:01 +01:00
Phantom
6b1490dac4 Merge branch 'master' into Improve-HighlightedPopUpColor 2026-03-12 12:26:26 +01:00
Wojtek Figat
5c51652e16 Merge branch 'xxSeys1-NewActorAndUiTransformEditorSkin' 2026-03-12 11:26:28 +01:00
Wojtek Figat
6736f2f77a Merge branch 'NewActorAndUiTransformEditorSkin' of https://github.com/xxSeys1/FlaxEngine into xxSeys1-NewActorAndUiTransformEditorSkin 2026-03-12 11:07:48 +01:00
Wojtek Figat
ab685ccc8c Merge branch 'Tryibion-remove-ui-move-size' 2026-03-12 11:06:46 +01:00
Wojtek Figat
b5d841ffc9 Use total rotation from #3758 in #3760 2026-03-12 11:06:42 +01:00
Wojtek Figat
cb17bcd2ff Merge branch 'remove-ui-move-size' of https://github.com/Tryibion/FlaxEngine into Tryibion-remove-ui-move-size 2026-03-12 11:03:51 +01:00
Wojtek Figat
f17b7b3c79 Merge branch 'Tryibion-better-handle-rot' 2026-03-12 10:53:00 +01:00
Wojtek Figat
1374a0440b Merge branch 'better-handle-rot' of https://github.com/Tryibion/FlaxEngine into Tryibion-better-handle-rot 2026-03-12 10:49:52 +01:00
Wojtek Figat
7fa40eba83 Fix Render2D.DrawRectangle to avoid alpha overdraw on the corners when thickness is large 2026-03-12 10:10:47 +01:00
Wojtek Figat
62e492452d Add UI editor grid toggle 2026-03-12 09:26:23 +01:00
Wojtek Figat
30d7588d9c Fix UI panel controls missing in Editor 2026-03-12 08:53:30 +01:00
Wojtek Figat
e736048fab Ensure probe count is never out of bounds
#3963
2026-03-12 08:41:06 +01:00
Wojtek Figat
14e59281e4 Merge branch 'Tryibion-fix-inverse-squ-light' 2026-03-12 00:00:31 +01:00
Wojtek Figat
895dcf4aa6 Add auto-converting old point/spot lights brightness when using Inverse Squared Falloff to match new shader math
#3907
2026-03-12 00:00:28 +01:00
Wojtek Figat
6d9d606085 Add UNITS_TO_METERS_SCALE to shader sources for world units scale
#3907
2026-03-11 23:56:47 +01:00
Wojtek Figat
a94b9f9426 Merge branch 'fix-inverse-squ-light' of https://github.com/Tryibion/FlaxEngine into Tryibion-fix-inverse-squ-light 2026-03-11 23:35:19 +01:00
Wojtek Figat
ace84ae29f Add limit to max DDGI cascade updates per-frame to 2
#3963
2026-03-11 23:31:44 +01:00
Wojtek Figat
22c88eb59d Fix blocky terrain SDF
#3975
2026-03-11 19:25:18 +01:00
Wojtek Figat
96bbae8e28 Fix Global SDF update when changing Draw Modes of the model
Refactor `DrawModes` field in `StaticModel` and `FoliageType` into property with getter/setter

#3949
2026-03-11 16:01:56 +01:00
Wojtek Figat
479c5f896c Fix MeshAccelerationStructure to use MeshAccessor for proper mesh format access
#3984
2026-03-11 13:43:26 +01:00
Wojtek Figat
0d3642f39d Merge branch 'Tryibion-text-box-allow-char' 2026-03-11 09:39:15 +01:00
Wojtek Figat
e47e1998a1 Merge branch 'text-box-allow-char' of https://github.com/Tryibion/FlaxEngine into Tryibion-text-box-allow-char 2026-03-11 09:39:10 +01:00
Wojtek Figat
62492c7607 Fix importing file when target location already exists
#3579
2026-03-11 09:38:49 +01:00
Chandler Cox
c3aecc1a11 Add allowable characters enum to text box 2026-03-10 19:47:09 -05:00
Phantom
6629ead842 Merge branch 'master' into Improve-HighlightedPopUpColor 2026-03-11 01:22:58 +01:00
Wojtek Figat
14dd70fb3d Merge branch 'xxSeys1-SplineEditorImprovements' 2026-03-10 22:59:22 +01:00
Wojtek Figat
2000a95fa7 Merge branch 'SplineEditorImprovements' of https://github.com/xxSeys1/FlaxEngine into xxSeys1-SplineEditorImprovements 2026-03-10 22:58:02 +01:00
Wojtek Figat
68ac2f4c79 Merge branch 'GoaLitiuM-lastproject' 2026-03-10 22:49:53 +01:00
Wojtek Figat
05aaf0dc99 Merge branch 'lastproject' of https://github.com/GoaLitiuM/FlaxEngine into GoaLitiuM-lastproject 2026-03-10 22:49:46 +01:00
Wojtek Figat
f33db8647a Merge branch 'xxSeys1-DoubleClickSplitterToReset' 2026-03-10 22:35:03 +01:00
Wojtek Figat
0ade65036e Merge branch 'DoubleClickSplitterToReset' of https://github.com/xxSeys1/FlaxEngine into xxSeys1-DoubleClickSplitterToReset 2026-03-10 22:29:07 +01:00
Wojtek Figat
b8bb40fcf8 Merge branch 'GoaLitiuM-codeeditor_fixes' 2026-03-10 22:22:10 +01:00
Wojtek Figat
0d133cfbdc Minor fixes to #3870 2026-03-10 22:22:02 +01:00
Wojtek Figat
337fea0f69 Merge branch 'codeeditor_fixes' of https://github.com/GoaLitiuM/FlaxEngine into GoaLitiuM-codeeditor_fixes 2026-03-10 22:09:28 +01:00
Wojtek Figat
ee23196548 Merge branch 'GoaLitiuM-editor_load_scene_state_fix' 2026-03-10 22:03:10 +01:00
Wojtek Figat
394dc31bb0 Merge branch 'editor_load_scene_state_fix' of https://github.com/GoaLitiuM/FlaxEngine into GoaLitiuM-editor_load_scene_state_fix 2026-03-10 22:03:07 +01:00
Wojtek Figat
deadb6f6d0 Merge branch 'Tryibion-loop-behavior' 2026-03-10 21:53:45 +01:00
Wojtek Figat
a6c6be9c2e Merge branch 'loop-behavior' of https://github.com/Tryibion/FlaxEngine into Tryibion-loop-behavior 2026-03-10 21:53:41 +01:00
Wojtek Figat
93a38566ea Merge branch 'xxSeys1-NewOrthoPerspectiveToggle' 2026-03-10 21:13:41 +01:00
Wojtek Figat
2a2f046f30 Don't snap vertices in camera projection icon for better quality #3875 2026-03-10 21:13:36 +01:00
Wojtek Figat
73b4b0dcee Merge branch 'NewOrthoPerspectiveToggle' of https://github.com/xxSeys1/FlaxEngine into xxSeys1-NewOrthoPerspectiveToggle 2026-03-10 20:02:30 +01:00
Wojtek Figat
b930ae0ca9 Merge branch 'Tryibion-req-actor-inherited-type' 2026-03-10 20:01:41 +01:00
Wojtek Figat
8cdb6d77ab Merge branch 'req-actor-inherited-type' of https://github.com/Tryibion/FlaxEngine into Tryibion-req-actor-inherited-type 2026-03-10 20:01:37 +01:00
Wojtek Figat
afc4d0f3d3 Add Dead Zone to virtual input action for better usage with gamepad sticks/triggers
#3660
2026-03-10 19:58:50 +01:00
Wojtek Figat
3bbaa7025a Fix crash when destroying actor that was left in enabled state
#3880
2026-03-10 17:01:57 +01:00
Wojtek Figat
5509bc4989 Add option to render Canvas into GPUTexture
#3601
2026-03-10 16:29:39 +01:00
Wojtek Figat
3cfa110a48 Merge remote-tracking branch 'origin/master' into 1.12
# Conflicts:
#	Source/Editor/Options/InterfaceOptions.cs
#	Source/Engine/Audio/OpenAL/AudioBackendOAL.cpp
#	Source/Engine/Graphics/Graphics.cpp
#	Source/Engine/GraphicsDevice/Vulkan/CmdBufferVulkan.cpp
#	Source/Engine/GraphicsDevice/Vulkan/CmdBufferVulkan.h
#	Source/Engine/GraphicsDevice/Vulkan/Config.h
#	Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp
#	Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.h
#	Source/Engine/GraphicsDevice/Vulkan/QueueVulkan.cpp
2026-03-10 15:08:43 +01:00
Wojtek Figat
1ab3917332 Merge remote-tracking branch 'origin/1.12' into 1.12 2026-03-10 14:59:33 +01:00
Wojtek Figat
2fb1e5bef7 Merge branch 'alsed-linux_dds_support' into 1.12 2026-03-10 14:44:18 +01:00
Wojtek Figat
a4cb839c6f Minor fixes to #3637 2026-03-10 14:43:57 +01:00
Wojtek Figat
3b1960b977 Merge branch 'linux_dds_support' of https://github.com/alsed/FlaxEngine into alsed-linux_dds_support 2026-03-10 14:39:54 +01:00
Wojtek Figat
116f15f4ae Merge branch 'Tryibion-script-recycle' into 1.12 2026-03-10 14:16:11 +01:00
Wojtek Figat
a0bb8efc2b Adjustment for deleteFileSafety in #3992 2026-03-10 14:16:08 +01:00
Wojtek Figat
90ffc4e5f9 Merge branch 'script-recycle' of https://github.com/Tryibion/FlaxEngine into Tryibion-script-recycle 2026-03-10 14:13:25 +01:00
Wojtek Figat
bf11575346 Merge commit 'ee38f8856229595aee6a1d79020c479605dfa66b' into 1.12 2026-03-10 13:31:20 +01:00
Wojtek Figat
8dc8371a7f Fix headless mode on Linux 2026-03-10 13:30:43 +01:00
Wojtek Figat
ee38f88562 Ensure to fail Github Action test on Linux when gdb detects the crash 2026-03-10 13:23:51 +01:00
Wojtek Figat
e90de5d815 Add gdb package 2026-03-10 13:00:03 +01:00
Wojtek Figat
7fe7a8dd0e Typo 2026-03-10 12:41:35 +01:00
Wojtek Figat
8afc25b19c Attempt to get crash info on Linux Test failure due to segmentation fault 2026-03-10 12:35:28 +01:00
Wojtek Figat
37a39e750f Attempt to fix Linux headless Test run with SDL 2026-03-10 11:25:22 +01:00
Wojtek Figat
59a9137a54 Fix Github Actions 2026-03-10 10:49:33 +01:00
Phantom
f4c1e81f64 Merge branch 'master' into Improve-HighlightedPopUpColor 2026-03-09 18:56:30 +01:00
Wojtek Figat
7391af1c37 Merge branch 'xxSeys1-ObsoleteInScriptsEditor' 2026-03-08 22:47:02 +01:00
Wojtek Figat
c376f220ca Minor adjustments to #3846 2026-03-08 22:46:53 +01:00
Wojtek Figat
5ce0a1535f Merge branch 'ObsoleteInScriptsEditor' of https://github.com/xxSeys1/FlaxEngine into xxSeys1-ObsoleteInScriptsEditor
# Conflicts:
#	Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs
2026-03-08 22:40:35 +01:00
Wojtek Figat
06bf9def8e Merge branch 'xxSeys1-CopyParameterNames' 2026-03-08 22:37:23 +01:00
Wojtek Figat
57489abc3a Minor adjustment to #3934 2026-03-08 22:37:17 +01:00
Wojtek Figat
200aca93d3 Merge branch 'CopyParameterNames' of https://github.com/xxSeys1/FlaxEngine into xxSeys1-CopyParameterNames 2026-03-08 22:33:19 +01:00
Wojtek Figat
f8eae517f0 Merge branch 'xxSeys1-ClearerParticleAgeNodes' 2026-03-08 22:25:24 +01:00
Wojtek Figat
3a651bc660 Merge branch 'ClearerParticleAgeNodes' of https://github.com/xxSeys1/FlaxEngine into xxSeys1-ClearerParticleAgeNodes 2026-03-08 22:25:20 +01:00
Wojtek Figat
4b7828f686 Merge branch 'xxSeys1-CreateAssetOptions' 2026-03-08 22:21:56 +01:00
Wojtek Figat
befb74297a Merge branch 'CreateAssetOptions' of https://github.com/xxSeys1/FlaxEngine into xxSeys1-CreateAssetOptions 2026-03-08 22:19:07 +01:00
Wojtek Figat
c0e16cd34a Merge branch 'xxSeys1-PreSkinningVertexPosMoreClear' 2026-03-08 22:13:34 +01:00
Wojtek Figat
e710a6e2d1 Adjust naming 2026-03-08 22:13:31 +01:00
Wojtek Figat
c378cd1d47 Merge branch 'PreSkinningVertexPosMoreClear' of https://github.com/xxSeys1/FlaxEngine into xxSeys1-PreSkinningVertexPosMoreClear 2026-03-08 22:08:50 +01:00
Wojtek Figat
cd74b300f1 Merge branch 'Tryibion-textbox-max' 2026-03-08 22:07:56 +01:00
Wojtek Figat
26cd07933e Another attempt 2026-03-08 00:04:18 +01:00
Wojtek Figat
c4342b0a20 Add SPIR-V compression with LZ4 of Vulkan shaders (35% avg smaller) 2026-03-07 23:24:40 +01:00
Wojtek Figat
3038c56af4 Attempt to fix iOS cooking issue on Linux 2026-03-07 23:18:03 +01:00
Wojtek Figat
3dc3e25649 Fix deprecation warnings 2026-03-07 23:17:42 +01:00
Wojtek Figat
e7071fbe43 Dummy attempt get more info about segmentation fault 2026-03-07 23:17:21 +01:00
Wojtek Figat
01670ec6ae Attempt to fix Github Action on Linux Tests 2026-03-07 22:41:07 +01:00
Chandler Cox
4d4571ee55 Allow -1 for Max textbox length
Allow -1 to be "no" length or max length. add bottom limit of -1.
2026-03-06 20:02:24 -06:00
Chandler Cox
83bbb4f6ba Add recycle bin to script deleting. 2026-03-06 19:39:49 -06:00
Wojtek Figat
a406d6dba2 Disable running native Linux tests until it's fixed (Windows will be enough) and compile just for Large Worlds on Linux to test it 2026-03-07 00:34:40 +01:00
Wojtek Figat
72bd624384 Fix creating textures when running in headless/null mode 2026-03-07 00:32:26 +01:00
Wojtek Figat
82a02698df Fix boolean command line parsing from int 2026-03-07 00:07:41 +01:00
Wojtek Figat
befac36a4f Check for SDL on Linux that is breaking tests, add missing file for Web libs 2026-03-06 23:41:41 +01:00
Wojtek Figat
1282dffca9 Add packages to other Github Actions on Linux that are used by Editor 2026-03-06 20:23:36 +01:00
Wojtek Figat
b291cd93c3 Fix libportal include path and glib include path on Ubuntu 22 2026-03-06 20:04:34 +01:00
Wojtek Figat
28257296b9 Enable Web builds on Linux 2026-03-06 17:57:43 +01:00
Wojtek Figat
164e380672 Merge branch '1.12' of https://gitlab.flaxengine.com/flax/flaxengine into 1.12 2026-03-06 17:40:00 +01:00
Wojtek Figat
438a9e4c3d Merge remote-tracking branch 'origin/1.12' into 1.12 2026-03-06 17:35:22 +01:00
Wojtek Figat
5942209114 Add basis lib for Web 2026-03-06 17:35:08 +01:00
Wojtek Figat
06788055fe Rebuild vorbis and ogg libs for Linux 2026-03-06 16:42:41 +01:00
Wojtek Figat
26838609db Build Linux deps 2026-03-06 16:29:47 +01:00
Wojtek Figat
b408a8ce21 Fix WebGPU in non-Debug builds 2026-03-06 14:45:00 +01:00
Wojtek Figat
6fcc963cf6 Cleanup dependency modules code a bit 2026-03-06 12:20:16 +01:00
Wojtek Figat
0fa3472f24 Refactor Texture Data function to be reusable 2026-03-06 11:40:43 +01:00
Wojtek Figat
c0056f3d9d Fix running Editor or Game target with console on Windows 2026-03-06 11:11:45 +01:00
Wojtek Figat
b8fcb51aa3 Fix loading cube texture import settings 2026-03-06 11:10:58 +01:00
Wojtek Figat
341dc08f7c Fix dependencies building to check for target platform build support, not the host platform 2026-03-06 11:10:40 +01:00
Wojtek Figat
f0873411df Minor fix for Web no threads 2026-03-06 11:10:13 +01:00
Wojtek Figat
94789712e8 Add basis_universal support for textures on Web
Add implementation for loading interchange texture formats with multiple runtime formats support
2026-03-06 11:09:29 +01:00
Saas
1ef35c3f94 clear up naming of "Pre-skinning Local Vertex Pos" 2026-03-04 23:57:21 +01:00
Wojtek Figat
ac36840037 Add basic options for texture compression on Web 2026-03-04 22:49:15 +01:00
Phantom
dfdcd47ad7 Merge branch 'master' into Improve-HighlightedPopUpColor 2026-03-04 22:33:45 +01:00
Wojtek Figat
414c650550 Fixes for WebGPU 2026-03-04 22:00:50 +01:00
Wojtek Figat
2d9ca4c335 Skip threaded physics actors update when single-threaded mode 2026-03-04 21:30:31 +01:00
Wojtek Figat
6c19996f95 Update engine assets 2026-03-04 21:28:01 +01:00
Wojtek Figat
377d5c00aa Add Compute shaders support to WebGPU 2026-03-04 21:27:42 +01:00
Wojtek Figat
5fb9cf3be1 Fix shadows from wireframe materials 2026-03-04 16:55:45 +01:00
Wojtek Figat
ceebc68d18 Add ShaderProfileFeatures for more expendable shader feature sets 2026-03-04 16:55:04 +01:00
Wojtek Figat
aff8090adb Add LZ4 compression to WebGPU shaders 2026-03-04 09:15:53 +01:00
Wojtek Figat
cee1b72f2f Fix regression from 7b7a92758f
#3932
2026-03-04 00:02:06 +01:00
Wojtek Figat
bd39e449d7 Merge branch 'Tryibion-fix-kin-call' 2026-03-03 23:41:45 +01:00
Wojtek Figat
836e1d4f39 Merge branch 'fix-kin-call' of https://github.com/Tryibion/FlaxEngine into Tryibion-fix-kin-call 2026-03-03 23:41:41 +01:00
Wojtek Figat
792393345d Merge branch 'xxSeys1-CaretBlinkSpeedTweak' 2026-03-03 23:32:13 +01:00
Wojtek Figat
66be7ebc50 Merge branch 'CaretBlinkSpeedTweak' of https://github.com/xxSeys1/FlaxEngine into xxSeys1-CaretBlinkSpeedTweak 2026-03-03 23:32:10 +01:00
Wojtek Figat
f8b161c04e Merge branch 'GoaLitiuM-string_ref_temp' 2026-03-03 23:30:33 +01:00
Wojtek Figat
bac361baf6 Merge branch 'string_ref_temp' of https://github.com/GoaLitiuM/FlaxEngine into GoaLitiuM-string_ref_temp 2026-03-03 23:30:20 +01:00
Wojtek Figat
10bcf9c9a3 Fix Vulkan timeout to be larger (5s)
#3967
2026-03-03 23:29:10 +01:00
Wojtek Figat
075727ab53 Merge branch 'envision3d-patch-1' into 1.12 2026-03-03 23:12:19 +01:00
Wojtek Figat
5a4e94d263 Merge branch 'patch-1' of https://github.com/envision3d/FlaxEngine into envision3d-patch-1 2026-03-03 23:12:15 +01:00
Wojtek Figat
ad3c2be510 Add timer and occlusion queries support to WebGPU 2026-03-03 21:35:42 +01:00
Wojtek Figat
5641bf63e8 Add validation of adapter limits for WebGPU 2026-03-03 16:03:14 +01:00
Wojtek Figat
79a17d8fe3 Add message box to Web via alert 2026-03-03 15:01:36 +01:00
Wojtek Figat
6814a43418 Various changes for WebGPU and hardware instancing support 2026-03-03 14:51:15 +01:00
Wojtek Figat
6891256afe Fix mouse cursor lock regression in cooked game 2026-03-03 10:51:38 +01:00
Wojtek Figat
17b097b1a3 Update engine materials and shaders 2026-03-03 10:30:20 +01:00
Wojtek Figat
a96c7e631e Fix some material nodes on WebGPU 2026-03-03 10:29:29 +01:00
Wojtek Figat
9df5da2a88 Fix compilation warnings from a925c7410a 2026-03-03 10:25:57 +01:00
Wojtek Figat
3e63551e90 Fix hashing pinter on 32-bit systems 2026-03-03 09:48:45 +01:00
Wojtek Figat
2a426e2812 Optimize AtmospherePreCompute to reduce memory usage after sky cache LUTs are rendered 2026-03-03 09:48:29 +01:00
Wojtek Figat
c4f4983f6d Add WebGPU bind groups caching 2026-03-03 09:47:59 +01:00
Wojtek Figat
a925c7410a Deprecate old GPU limits 2026-03-03 08:36:35 +01:00
Chandler Cox
f7e2f3a4d5 Only set kinematic target if rigid body has kinematic flag. 2026-03-02 19:20:15 -06:00
Wojtek Figat
b1befacb84 Fix material templates for WebGPU 2026-03-02 23:06:14 +01:00
Wojtek Figat
23ebb0e754 Fix particles on WebGPU to respect format support flags properly 2026-03-02 23:06:01 +01:00
5f9e8dedec Pass String reference values via temporary values 2026-03-02 23:40:41 +02:00
Wojtek Figat
3b2015e816 Fix creating new particle system or scene animation assets after deprecated code removal 2026-03-02 20:47:57 +01:00
Wojtek Figat
f1e851e1b8 Fix WebGPU by moving user to Australia 2026-03-02 20:37:11 +01:00
Wojtek Figat
b191d3918e Fix rendering various visuals on WebGPU 2026-03-02 20:36:33 +01:00
Saas
db46050b16 tweak caret blink speed 2026-03-01 11:01:55 +01:00
fibref
1cf69361a1 fix MSDF font alignment 2026-02-28 10:13:03 +08:00
envision3d
689fab2ba4 add linux platform case to fix build 2026-02-26 16:46:46 -06:00
Wojtek Figat
b36c757753 Fix WebGPU error when sampling depth texture in shader which requires explicit UnfilterableFloat sampler type 2026-02-26 16:59:25 +01:00
Wojtek Figat
63f19aa4d6 Fix minor issues 2026-02-26 15:52:41 +01:00
Wojtek Figat
8728d88dde Fix vertex layouts binding to match vertex shader inputs on WebGPU 2026-02-26 15:50:36 +01:00
Wojtek Figat
f6888b099e Add cubemap and texture arrays copy/update in WebGPU 2026-02-26 13:27:35 +01:00
Wojtek Figat
239ceb75a9 Fix binding various resources to shaders in WebGPU 2026-02-26 12:23:07 +01:00
Wojtek Figat
20c9ed27fb Add sampler slots usage and inputs/outputs count to GPU shader program bindings meta 2026-02-26 12:02:52 +01:00
Wojtek Figat
ac4526744a Add GPU profile events to WebGPU and use the by default in non-Release builds 2026-02-26 11:08:12 +01:00
Wojtek Figat
d2a8ac54cf Fix depth stencil view format when binding to shader to use depth-only aspect but still render to both 2026-02-26 11:07:19 +01:00
Wojtek Figat
153b16ebd7 Add various graphics improvements 2026-02-25 18:23:49 +01:00
Wojtek Figat
b535791c66 Implement bind groups in WebGPU to provide resources to shaders 2026-02-25 18:22:55 +01:00
Phantom
6ed7e8fa40 Merge branch 'master' into Improve-HighlightedPopUpColor 2026-02-25 17:26:20 +01:00
Wojtek Figat
9d95bbaa8c Add GPU data upload allocator with shared page pool 2026-02-24 23:18:07 +01:00
Wojtek Figat
e41ec4ebfd Add verbosity level to platform log for better integration with Web and Android platforms 2026-02-24 20:09:09 +01:00
Wojtek Figat
195d5b1aa2 Fixes and missing changes 2026-02-24 17:59:42 +01:00
Wojtek Figat
7ea3fb1500 Fix shaders codebase to compile into WGSL 2026-02-24 17:56:14 +01:00
Wojtek Figat
9be8589437 Add shader compiler for WebGPU
Use existing Vulkan compiler to generate SPIR-V and convert it into WGSL with tint compiler
https://github.com/google/dawn/releases/tag/v20260219.200501
2026-02-24 17:55:26 +01:00
Wojtek Figat
ff81d339ef Fix missing doppler factor in cooked game with OpenAL backend
#3959
2026-02-23 17:24:59 +01:00
Wojtek Figat
7858225565 Update docs for #3948 2026-02-23 17:19:14 +01:00
Wojtek Figat
83bd1deafd Optimize shadow maps rendering by using new Graphics.Shadows.MinObjectPixelSize to skip sub-pixel objects 2026-02-23 16:53:17 +01:00
Wojtek Figat
9158e1c270 Improve stack trace printing when module name is not provided 2026-02-23 11:51:15 +01:00
Wojtek Figat
f0d182771d Add missing define 2026-02-23 11:50:44 +01:00
Wojtek Figat
6081ed35bc Add initial base implementation for WebGPU rendering backend 2026-02-23 11:49:45 +01:00
Wojtek Figat
4ca10c7869 Fix mouse position on Web to match canvas coordinates, not entire window 2026-02-22 22:05:13 +01:00
Wojtek Figat
9fc31b1021 Run Web main loop at vsync to avoid browser throttling
This could be customized in future (depending on VSync usage).
2026-02-20 23:51:05 +01:00
Wojtek Figat
366a5162b7 DIsable screensaver blocking via SDL in Editor 2026-02-20 23:50:13 +01:00
Wojtek Figat
6fd58c418e Fixes and updates to graphics api 2026-02-20 23:49:49 +01:00
Wojtek Figat
08d9ae0ae6 Add callstack capturing on Web platform 2026-02-20 23:47:30 +01:00
Wojtek Figat
27eb53e1a1 Fix web window to maintain canvas size on start 2026-02-20 23:47:01 +01:00
Wojtek Figat
31b5685251 Add GPU_ENABLE_PRELOADING_RESOURCES and use it on Web/Android/iOS to reduce engine resources preloading 2026-02-20 23:45:56 +01:00
Wojtek Figat
894cf2c886 Fix missing JS symbols in Web build of the main module 2026-02-20 23:44:20 +01:00
Wojtek Figat
5b3079acde Fix texture GPU resource debug name in non-Release game builds to match the path in project 2026-02-20 23:43:29 +01:00
fibref
0f49503abd add native MSDF font support for Render2D 2026-02-19 15:41:48 +08:00
fibref
be4e1edc3e fix flipped color of MSDF fonts 2026-02-19 15:12:25 +08:00
Wojtek Figat
1982694ef0 Fix Release build for Web 2026-02-17 19:07:43 +01:00
Wojtek Figat
8b475e9f54 Restore profiler for Web for engine stats in non-Release builds 2026-02-17 18:50:24 +01:00
Wojtek Figat
2b546eb4b3 Add OpenAL audio to Web 2026-02-17 18:43:52 +01:00
Wojtek Figat
69cefb6822 Fix miliseconds in date on Emscripten and skip SDL create process (unsupported) 2026-02-17 15:07:42 +01:00
Wojtek Figat
9772227146 Add shared libraries support for Web to load game module (C++) 2026-02-17 15:07:11 +01:00
Wojtek Figat
34bddc7db1 Minor fix 2026-02-17 13:43:54 +01:00
Wojtek Figat
7ff4ce18ff Add web platform icons to editor atlas 2026-02-17 13:21:00 +01:00
Wojtek Figat
6e7a7c9350 Fix Screen.CursorLock in Editor to skip when viewport is unfocused 2026-02-17 11:46:20 +01:00
Wojtek Figat
2a9c6bbd1d Refactor engine main loop to allow external stepping in Web 2026-02-16 22:32:02 +01:00
Wojtek Figat
0835a6559c Fix Web build issues 2026-02-16 21:31:12 +01:00
Wojtek Figat
489c4a3661 Add packaging game files and bundling them into final Web app 2026-02-16 17:41:43 +01:00
Wojtek Figat
43dca143fa Add env vars impl to Web platform 2026-02-16 16:11:12 +01:00
Wojtek Figat
6bd13feba6 Add various fixes 2026-02-16 16:11:00 +01:00
Wojtek Figat
d1557e5292 Add support for running engine with a single-thread only (content, jobs, drawing, physics) 2026-02-16 16:10:31 +01:00
fibref
c9fbafe014 Merge branch 'FlaxEngine:master' into flax-msdf-font 2026-02-16 22:48:19 +08:00
fibref
0612b923e1 fix msdf font layout issue 2026-02-16 19:52:12 +08:00
Wojtek Figat
6f13a33be2 Add LTO and Sanitizers support to Web build 2026-02-16 12:00:24 +01:00
Wojtek Figat
4ccf969f7a Add various fixes for Web 2026-02-16 11:59:44 +01:00
Wojtek Figat
3d206e06d0 Fix ThreadLocal when thread count limit is low on a target platform or if it's only main-thread 2026-02-16 11:59:12 +01:00
Wojtek Figat
25e90deed6 Fix Web (and consoles) to run without exceptions throw/catch support 2026-02-16 11:50:52 +01:00
Wojtek Figat
7bc687194f Fix Web to run without dotnet 2026-02-16 11:49:34 +01:00
fibref
d3bd377264 update msdfgen 2026-02-16 11:04:22 +08:00
fibref
974c55418b fix msdfgen build on Linux (Mac not tested) 2026-02-15 20:35:34 +08:00
Saas
0870a86a3a remove non parameters from parameter list 2026-02-14 18:56:58 +01:00
Saas
dd2e2c5b3a add some utility for copying parameter names to parameter right click menu 2026-02-14 18:35:13 +01:00
fibref
75a1b14beb initial support for MSDF font 2026-02-14 22:12:26 +08:00
Wojtek Figat
8a760dc1e2 Fix typo 2026-02-14 00:07:41 +01:00
Wojtek Figat
fc0b885a14 Fix missing Length in Vector4 2026-02-14 00:07:34 +01:00
Wojtek Figat
f12ad5c874 Add **Web platform with Emscripten** 2026-02-14 00:07:21 +01:00
Wojtek Figat
fd0584b406 Fix build regression from 865a26cbbe 2026-02-12 22:03:13 +01:00
Wojtek Figat
374f6e40bb Merge remote-tracking branch 'origin/1.12' into 1.12 2026-02-12 20:26:54 +01:00
Wojtek Figat
9c9e17a9d9 Fix warning when building C# lib with newer .NET than base version used on deps 2026-02-12 18:26:43 +01:00
Wojtek Figat
865a26cbbe Remove deprecated CommonValue
Deprecated on 31th July 2020
2026-02-12 18:26:08 +01:00
Wojtek Figat
56e825cad4 Build SDL for macOS (x64 and arm64) 2026-02-12 17:23:38 +01:00
Wojtek Figat
1df608e902 Remove deprecated NetworkDriverType 2026-02-12 16:43:01 +01:00
Phantom
c631c37a34 Merge branch 'master' into Improve-HighlightedPopUpColor 2026-02-11 09:38:34 +01:00
Phantom
07b6d3558a Merge branch 'master' into Improve-HighlightedPopUpColor 2026-02-10 17:09:22 +01:00
Phantom
05a0a6b539 Merge branch 'master' into Improve-HighlightedPopUpColor 2026-02-05 19:42:54 +01:00
Phantom
ca54313bd8 Merge branch 'master' into Improve-HighlightedPopUpColor 2026-02-04 05:19:47 +01:00
Phantom
7a96c1ff76 Merge branch 'master' into Improve-HighlightedPopUpColor 2026-02-03 23:26:34 +01:00
Phantom
83c15c05bb Merge branch 'master' into Improve-HighlightedPopUpColor 2026-02-03 23:06:53 +01:00
Phantom
ae46520edf Merge branch 'master' into Improve-HighlightedPopUpColor 2026-02-02 10:31:24 +01:00
Chandler Cox
5d9d64e6e7 Fix missing scale for inverse squared setting for lights. 2026-01-27 22:10:22 -06:00
Phantom
4e8f54bb61 Merge branch 'master' into Improve-HighlightedPopUpColor 2026-01-24 15:29:34 +01:00
fibref
0eac545271 Merge branch 'FlaxEngine:master' into flax-msdf-font 2026-01-24 20:14:30 +08:00
Phantom
ec0877004c Merge branch 'master' into Improve-HighlightedPopUpColor 2026-01-12 22:56:49 +01:00
Phantom
b171071893 Merge branch 'master' into Improve-HighlightedPopUpColor 2026-01-05 06:30:42 +01:00
Phantom
91fd32b708 Merge branch 'master' into Improve-HighlightedPopUpColor 2025-12-29 22:54:40 +01:00
Saas
564c9ff0ca improve orthographic/ perspective viewport cam toggle 2025-12-19 19:00:55 +01:00
71b222e0b0 Fix Editor project file generation to use custom code editor arguments 2025-12-18 23:52:21 +02:00
5921f60af2 Get code editor name through CodeEditingManager 2025-12-18 23:52:21 +02:00
39269583c3 Fix default code editor not using Visual Studio as fallback editor 2025-12-18 23:52:21 +02:00
cba3899c62 Fix invalid code editor when selected editor is not detected 2025-12-18 23:52:21 +02:00
Saas
d8c90184b9 add script only on prefab instance header button
- add some padding to `AddHeaderButton()`
- Add visual indicator (Header button) if script is only in prefab instance and not part of the prefab
2025-12-18 17:19:41 +01:00
Saas
5b1ca13225 choose darker mouse over color 2025-12-18 12:22:24 +01:00
Saas
0d8ac5b7ac implement review
- Remove trailing tooltip "."
- Add `AddSettingsButton` method
- Simplify loop into LINQ expression
2025-12-18 12:17:22 +01:00
f6e9cf644a Verify the last project path before using it 2025-12-17 03:45:15 +02:00
604bfb5fe6 Add -lastproject editor command-line option to open the last project 2025-12-17 03:30:19 +02:00
b3ea47b989 Use last opened project as initial directory in project file dialog 2025-12-17 03:30:19 +02:00
5d368e59a0 Fix SpecialFolder::AppData on Apple systems 2025-12-17 03:30:19 +02:00
3afd3ce2d5 Use XDG user directories on Linux special paths 2025-12-17 03:30:19 +02:00
Phantom
0094216ff8 Renaming Luminance name to Brightness 2025-12-15 14:29:57 +01:00
Phantom
298ee284e1 Merge branch 'master' into Improve-HighlightedPopUpColor 2025-12-15 00:49:49 +01:00
Phantom
7f2f73afd8 Added Luminance property and updated authors
-Added public Luminance property in Color.cs to calculate colour brightness.
-Refactored Dropdown.cs to use Luminance instead of manual calculation.
-Updated author list in AboutDialog.cs by adding ‘Michael Salvini’.
2025-12-15 00:48:42 +01:00
9f8b15f0d5 Fix Editor state after loading a scene without compiled game modules 2025-12-14 19:33:50 +02:00
Phantom
bb2e22ecf2 Improved readability of highlighted text in drop-down menus
TextColorHighlighted is now automatically lightened if too dark, by calculating brightness and interpolating towards white. This ensures better readability of selected items in drop-down menus.
2025-12-14 13:14:45 +01:00
Saas
4b62395d69 add script obsolete icon to script editor 2025-12-10 18:41:57 +01:00
Chandler Cox
bbaa2dfc73 Fix pibot relative movement. 2025-11-29 16:13:46 -06:00
Chandler Cox
ab22b88a53 Better calculation for moving ui by the widgets. 2025-11-29 15:57:35 -06:00
frank
eb978c767e extend msdfgen buildscript for Mac and Android (not tested) 2025-11-01 20:33:46 +08:00
fibref
661dc8ea1c Merge branch 'FlaxEngine:master' into flax-msdf-font 2025-11-01 19:39:37 +08:00
Saas
b6696564f5 tweak colors to be less bright 2025-10-31 18:22:30 +01:00
Saas
316e5b2845 also apply color to border if focused/ selected in ui editor 2025-10-31 18:10:00 +01:00
Saas
c1738bcb0a make the ui editor look like the actor transform editor 2025-10-31 18:02:35 +01:00
Saas
7b3e41efae change how to the actor transform editor looks 2025-10-31 18:02:22 +01:00
fibref
3cef8cfd61 Merge branch 'FlaxEngine:master' into flax-msdf-font 2025-10-26 14:37:20 +08:00
Chandler Cox
09964df198 Removing moving the control when trying to resize it. 2025-10-24 16:19:33 -05:00
Chandler Cox
dd8e6bf694 Change handles back to outside of control. 2025-10-24 15:40:45 -05:00
Chandler Cox
58cd3e82f6 Better rotation on UI handles which handles total parent rotation. 2025-10-24 14:55:38 -05:00
Saas
5dd9171316 fix default value 2025-10-17 21:58:55 +02:00
Saas
d6b1478bf1 make double clicking properties splitter bar auto resize split 2025-10-16 20:04:05 +02:00
Saas
e5bd90f58b revert icon scaling 2025-10-15 19:51:24 +02:00
Saas
d1972a56e2 improve spline editor
- Move "Selected Point" section above keyframes so it is always accessible, even when keyframe array editor is expanded
- Improve icon scaling when editor becomes thin
2025-10-13 18:27:30 +02:00
Saas
69a7e1f25c expand tooltip to hint at being able to create a new folder on shift + left click 2025-10-12 19:57:05 +02:00
Saas
b43ed886b9 add option for what happens with unavailable entries and fix menu positioning 2025-10-12 19:52:18 +02:00
frank
18a0e8d612 add msdfgen for windows 2025-10-07 16:15:07 +08:00
Saas
0917a743cd Re- add particle prefix and improve some descriptions 2025-09-21 17:07:13 +02:00
Saas
fb5cedc575 make particle age/ lifetime nodes more clear 2025-09-19 16:32:59 +02:00
alsed
e52b7170ce fix segfault when generating mipmaps for cubetextures 2025-09-04 11:11:44 -04:00
alsed
dd7233aaf7 Adds support for Cubemaps textures 2025-09-02 22:23:42 -04:00
Chandler Cox
cd0878f810 Simplify code 2025-09-02 20:47:04 -05:00
Chandler Cox
f588d6da51 Add ability to loop root node in behavior trees. 2025-09-02 20:33:41 -05:00
Chandler Cox
2901e3898c Add IncludeInheritedTypes to RequireActor 2025-08-29 16:03:44 -05:00
alsed
c63200cba0 bool error corrected 2025-08-13 11:23:56 -04:00
alsed
c8a02ac607 cleanup 2025-08-13 09:22:30 -04:00
alsed
09a304c214 Add support for dds in linux 2025-08-12 19:18:07 -04:00
xxSeys1
c45cba18a6 fix menu positioning 2025-05-04 21:18:00 +02:00
xxSeys1
fccd43502b add create file Content Panel toolstrip button 2025-05-04 21:14:10 +02:00
654 changed files with 59241 additions and 6566 deletions

17
.github/data/bt.sh vendored Normal file
View File

@@ -0,0 +1,17 @@
#!/bin/sh
# https://gist.github.com/ongardie/aa15f1f0d0e6b59890a9
gdb -q --batch \
-ex 'handle SIGHUP nostop pass' \
-ex 'handle SIGQUIT nostop pass' \
-ex 'handle SIGPIPE nostop pass' \
-ex 'handle SIGALRM nostop pass' \
-ex 'handle SIGTERM nostop pass' \
-ex 'handle SIGUSR1 nostop pass' \
-ex 'handle SIGUSR2 nostop pass' \
-ex 'handle SIGCHLD nostop pass' \
-ex 'set print thread-events off' \
-return-child-result \
-ex 'run' \
-ex 'thread apply all bt' \
--tty=/dev/stdout \
--args $*

View File

@@ -45,7 +45,8 @@ jobs:
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Install dependencies - name: Install dependencies
run: | run: |
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev libwayland-dev sudo apt-get update
sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev libwayland-dev
- name: Setup Vulkan - name: Setup Vulkan
uses: ./.github/actions/vulkan uses: ./.github/actions/vulkan
- name: Setup .NET - name: Setup .NET

View File

@@ -88,7 +88,7 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev libwayland-dev
- name: Setup Vulkan - name: Setup Vulkan
uses: ./.github/actions/vulkan uses: ./.github/actions/vulkan
- name: Setup .NET - name: Setup .NET
@@ -120,7 +120,7 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev libwayland-dev
- name: Setup Vulkan - name: Setup Vulkan
uses: ./.github/actions/vulkan uses: ./.github/actions/vulkan
- name: Setup .NET - name: Setup .NET

View File

@@ -29,25 +29,22 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev libwayland-dev sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev libwayland-dev gdb
chmod +x .github/data/bt.sh
- name: Build - name: Build
run: | run: |
./GenerateProjectFiles.sh -vs2022 -log -verbose -printSDKs -dotnet=8 ./GenerateProjectFiles.sh -vs2022 -log -verbose -printSDKs -dotnet=8
./Development/Scripts/Linux/CallBuildTool.sh -build -log -dotnet=8 -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxTestsTarget ./Development/Scripts/Linux/CallBuildTool.sh -build -log -dotnet=8 -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxTestsTarget -UseLargeWorlds=true
dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo
dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo
- name: Test - name: Test
run: | run: |
${GITHUB_WORKSPACE}/Binaries/Editor/Linux/Development/FlaxTests ${GITHUB_WORKSPACE}/.github/data/bt.sh ./Binaries/Editor/Linux/Development/FlaxTests -headless
dotnet test -f net8.0 Binaries/Tests/Flax.Build.Tests.dll dotnet test -f net8.0 Binaries/Tests/Flax.Build.Tests.dll
cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.dll Binaries/Tests cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.dll Binaries/Tests
cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.runtimeconfig.json Binaries/Tests cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.runtimeconfig.json Binaries/Tests
cp Binaries/Editor/Linux/Development/Newtonsoft.Json.dll Binaries/Tests cp Binaries/Editor/Linux/Development/Newtonsoft.Json.dll Binaries/Tests
dotnet test -f net8.0 Binaries/Tests/FlaxEngine.CSharp.dll dotnet test -f net8.0 Binaries/Tests/FlaxEngine.CSharp.dll
- name: Test UseLargeWorlds
run: |
./Development/Scripts/Linux/CallBuildTool.sh -build -log -dotnet=8 -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxTestsTarget -UseLargeWorlds=true
${GITHUB_WORKSPACE}/Binaries/Editor/Linux/Development/FlaxTests
# Tests on Windows # Tests on Windows
tests-windows: tests-windows:
@@ -77,7 +74,7 @@ jobs:
shell: pwsh shell: pwsh
run: | run: |
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
.\Binaries\Editor\Win64\Development\FlaxTests.exe .\Binaries\Editor\Win64\Development\FlaxTests.exe -headless
if(!$?) { Write-Host "Tests failed with exit code $LastExitCode" -ForegroundColor Red; Exit $LastExitCode } if(!$?) { Write-Host "Tests failed with exit code $LastExitCode" -ForegroundColor Red; Exit $LastExitCode }
dotnet test -f net8.0 Binaries\Tests\Flax.Build.Tests.dll dotnet test -f net8.0 Binaries\Tests\Flax.Build.Tests.dll
xcopy /y Binaries\Editor\Win64\Development\FlaxEngine.CSharp.dll Binaries\Tests xcopy /y Binaries\Editor\Win64\Development\FlaxEngine.CSharp.dll Binaries\Tests

View File

@@ -1,4 +1,4 @@
# Redirect to our own Git LFS server # Redirect to our own Git LFS server
[lfs] [lfs]
url="https://gitlab.flaxengine.com/flax/flaxengine.git/info/lfs" #url="https://gitlab.flaxengine.com/flax/flaxengine.git/info/lfs"
locksverify = false locksverify = false

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -42,10 +42,10 @@ struct MaterialInput
float2 SvPositionToDecalUV(float4 svPosition) float2 SvPositionToDecalUV(float4 svPosition)
{ {
float2 screenUV = svPosition.xy * ScreenSize.zw; float2 screenUV = svPosition.xy * ScreenSize.zw;
svPosition.z = SAMPLE_RT(DepthBuffer, screenUV).r; svPosition.z = SAMPLE_RT_DEPTH(DepthBuffer, screenUV);
float4 positionHS = mul(float4(svPosition.xyz, 1), SvPositionToWorld); float4 positionHS = PROJECT_POINT(float4(svPosition.xyz, 1), SvPositionToWorld);
float3 positionWS = positionHS.xyz / positionHS.w; float3 positionWS = positionHS.xyz / positionHS.w;
float3 positionOS = mul(float4(positionWS, 1), InvWorld).xyz; float3 positionOS = PROJECT_POINT(float4(positionWS, 1), InvWorld).xyz;
return positionOS.xz + 0.5f; return positionOS.xz + 0.5f;
} }
@@ -182,10 +182,10 @@ META_VS_IN_ELEMENT(POSITION, 0, R32G32B32_FLOAT, 0, 0, PER_VERTEX, 0, true)
void VS_Decal(in float3 Position : POSITION0, out float4 SvPosition : SV_Position) void VS_Decal(in float3 Position : POSITION0, out float4 SvPosition : SV_Position)
{ {
// Compute world space vertex position // Compute world space vertex position
float3 worldPosition = mul(float4(Position.xyz, 1), WorldMatrix).xyz; float3 worldPosition = PROJECT_POINT(float4(Position.xyz, 1), WorldMatrix).xyz;
// Compute clip space position // Compute clip space position
SvPosition = mul(float4(worldPosition.xyz, 1), ViewProjectionMatrix); SvPosition = PROJECT_POINT(float4(worldPosition.xyz, 1), ViewProjectionMatrix);
} }
// Pixel Shader function for decals rendering // Pixel Shader function for decals rendering
@@ -213,11 +213,11 @@ void PS_Decal(
} }
float2 screenUV = SvPosition.xy * ScreenSize.zw; float2 screenUV = SvPosition.xy * ScreenSize.zw;
SvPosition.z = SAMPLE_RT(DepthBuffer, screenUV).r; SvPosition.z = SAMPLE_RT_DEPTH(DepthBuffer, screenUV);
float4 positionHS = mul(float4(SvPosition.xyz, 1), SvPositionToWorld); float4 positionHS = PROJECT_POINT(float4(SvPosition.xyz, 1), SvPositionToWorld);
float3 positionWS = positionHS.xyz / positionHS.w; float3 positionWS = positionHS.xyz / positionHS.w;
float3 positionOS = mul(float4(positionWS, 1), InvWorld).xyz; float3 positionOS = PROJECT_POINT(float4(positionWS, 1), InvWorld).xyz;
clip(0.5 - abs(positionOS.xyz)); clip(0.5 - abs(positionOS.xyz));
float2 decalUVs = positionOS.xz + 0.5f; float2 decalUVs = positionOS.xz + 0.5f;

View File

@@ -308,7 +308,7 @@ VertexOutput VS_SplineModel(ModelInput input)
world = mul(world, WorldMatrix); world = mul(world, WorldMatrix);
// Compute clip space position // Compute clip space position
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
// Pass vertex attributes // Pass vertex attributes
output.Geometry.TexCoord = input.TexCoord0; output.Geometry.TexCoord = input.TexCoord0;
@@ -338,7 +338,7 @@ VertexOutput VS_SplineModel(ModelInput input)
#if USE_POSITION_OFFSET #if USE_POSITION_OFFSET
output.Geometry.WorldPosition += material.PositionOffset; output.Geometry.WorldPosition += material.PositionOffset;
output.Geometry.PrevWorldPosition += material.PositionOffset; output.Geometry.PrevWorldPosition += material.PositionOffset;
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
#endif #endif
// Get tessalation multiplier (per vertex) // Get tessalation multiplier (per vertex)

View File

@@ -67,7 +67,7 @@ float Rand(inout uint seed)
float3 ReprojectPosition(float2 uv, float rawDepth) float3 ReprojectPosition(float2 uv, float rawDepth)
{ {
uv = uv * float2(2.0, -2.0) + float2(-1.0, 1.0); uv = uv * float2(2.0, -2.0) + float2(-1.0, 1.0);
float4 pos = mul(float4(uv.x, uv.y, rawDepth, 1.0f), InvViewProjectionMatrix); float4 pos = PROJECT_POINT(float4(uv.x, uv.y, rawDepth, 1.0f), InvViewProjectionMatrix);
return pos.xyz / pos.w; return pos.xyz / pos.w;
} }
@@ -158,7 +158,7 @@ void SpawnParticle(Context context)
@4} @4}
// Main entry point for the particles simulation and spawning // Main entry point for the particles simulation and spawning
META_CS(true, FEATURE_LEVEL_SM5) META_CS(true, AUTO)
[numthreads(THREAD_GROUP_SIZE, 1, 1)] [numthreads(THREAD_GROUP_SIZE, 1, 1)]
void CS_Main(uint3 dispatchThreadId : SV_DispatchThreadID) void CS_Main(uint3 dispatchThreadId : SV_DispatchThreadID)
{ {

View File

@@ -227,7 +227,7 @@ VertexOutput VS_GUI(Render2DVertex input)
if ((int)input.CustomDataAndClipOrigin.y & 1) if ((int)input.CustomDataAndClipOrigin.y & 1)
input.Position = (int2)input.Position; input.Position = (int2)input.Position;
output.Position = mul(float4(input.Position, 0, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(input.Position, 0, 1), ViewProjectionMatrix);
output.WorldPosition = mul(float4(input.Position, 0, 1), WorldMatrix).xyz; output.WorldPosition = mul(float4(input.Position, 0, 1), WorldMatrix).xyz;
output.TexCoord = input.TexCoord; output.TexCoord = input.TexCoord;
output.WindowPos = input.Position; output.WindowPos = input.Position;

View File

@@ -393,7 +393,7 @@ VertexOutput VS_Sprite(SpriteInput input, uint particleIndex : SV_InstanceID)
output.WorldPosition = position + spriteVertexPosition; output.WorldPosition = position + spriteVertexPosition;
// Compute clip space position // Compute clip space position
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
// Pass vertex attributes // Pass vertex attributes
output.TexCoord = input.TexCoord; output.TexCoord = input.TexCoord;
@@ -431,7 +431,7 @@ VertexOutput VS_Sprite(SpriteInput input, uint particleIndex : SV_InstanceID)
// Apply world position offset per-vertex // Apply world position offset per-vertex
#if USE_POSITION_OFFSET #if USE_POSITION_OFFSET
output.WorldPosition += material.PositionOffset; output.WorldPosition += material.PositionOffset;
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
#endif #endif
// Copy interpolants for other shader stages // Copy interpolants for other shader stages
@@ -511,7 +511,7 @@ VertexOutput VS_Model(ModelInput input, uint particleIndex : SV_InstanceID)
output.WorldPosition = mul(float4(input.Position, 1), world).xyz; output.WorldPosition = mul(float4(input.Position, 1), world).xyz;
// Compute clip space position // Compute clip space position
output.Position = mul(float4(output.WorldPosition, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.WorldPosition, 1), ViewProjectionMatrix);
// Pass vertex attributes // Pass vertex attributes
output.TexCoord = input.TexCoord0; output.TexCoord = input.TexCoord0;
@@ -549,7 +549,7 @@ VertexOutput VS_Model(ModelInput input, uint particleIndex : SV_InstanceID)
// Apply world position offset per-vertex // Apply world position offset per-vertex
#if USE_POSITION_OFFSET #if USE_POSITION_OFFSET
output.WorldPosition += material.PositionOffset; output.WorldPosition += material.PositionOffset;
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
#endif #endif
// Copy interpolants for other shader stages // Copy interpolants for other shader stages
@@ -617,7 +617,7 @@ VertexOutput VS_Ribbon(RibbonInput input, uint vertexIndex : SV_VertexID)
output.WorldPosition = position + tangentRight * vertexSign * (ribbonWidth.xxx * 0.5f); output.WorldPosition = position + tangentRight * vertexSign * (ribbonWidth.xxx * 0.5f);
// Compute clip space position // Compute clip space position
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
// Pass vertex attributes // Pass vertex attributes
output.ParticleIndex = particleIndex; output.ParticleIndex = particleIndex;
@@ -655,7 +655,7 @@ VertexOutput VS_Ribbon(RibbonInput input, uint vertexIndex : SV_VertexID)
// Apply world position offset per-vertex // Apply world position offset per-vertex
#if USE_POSITION_OFFSET #if USE_POSITION_OFFSET
output.WorldPosition += material.PositionOffset; output.WorldPosition += material.PositionOffset;
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
#endif #endif
// Copy interpolants for other shader stages // Copy interpolants for other shader stages

View File

@@ -342,7 +342,7 @@ VertexOutput VS(ModelInput input)
output.Geometry.PrevWorldPosition = mul(float4(input.Position.xyz, 1), object.PrevWorldMatrix).xyz; output.Geometry.PrevWorldPosition = mul(float4(input.Position.xyz, 1), object.PrevWorldMatrix).xyz;
// Compute clip space position // Compute clip space position
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
// Pass vertex attributes // Pass vertex attributes
output.Geometry.TexCoords01 = float4(input.TexCoord0, input.TexCoord1); output.Geometry.TexCoords01 = float4(input.TexCoord0, input.TexCoord1);
@@ -378,7 +378,7 @@ VertexOutput VS(ModelInput input)
#if USE_POSITION_OFFSET #if USE_POSITION_OFFSET
output.Geometry.WorldPosition += material.PositionOffset; output.Geometry.WorldPosition += material.PositionOffset;
output.Geometry.PrevWorldPosition += material.PositionOffset; output.Geometry.PrevWorldPosition += material.PositionOffset;
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
#endif #endif
// Get tessalation multiplier (per vertex) // Get tessalation multiplier (per vertex)
@@ -412,7 +412,7 @@ float4 VS_Depth(ModelInput_PosOnly input) : SV_Position
// Transform vertex position into the screen // Transform vertex position into the screen
float3 worldPosition = mul(float4(input.Position.xyz, 1), object.WorldMatrix).xyz; float3 worldPosition = mul(float4(input.Position.xyz, 1), object.WorldMatrix).xyz;
float4 position = mul(float4(worldPosition, 1), ViewProjectionMatrix); float4 position = PROJECT_POINT(float4(worldPosition, 1), ViewProjectionMatrix);
return position; return position;
} }
@@ -518,7 +518,7 @@ VertexOutput VS_Skinned(ModelInput_Skinned input)
#endif #endif
// Compute clip space position // Compute clip space position
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
// Pass vertex attributes // Pass vertex attributes
output.Geometry.TexCoords01 = float4(input.TexCoord0, input.TexCoord1); output.Geometry.TexCoords01 = float4(input.TexCoord0, input.TexCoord1);
@@ -549,7 +549,7 @@ VertexOutput VS_Skinned(ModelInput_Skinned input)
#if USE_POSITION_OFFSET #if USE_POSITION_OFFSET
output.Geometry.WorldPosition += material.PositionOffset; output.Geometry.WorldPosition += material.PositionOffset;
output.Geometry.PrevWorldPosition += material.PositionOffset; output.Geometry.PrevWorldPosition += material.PositionOffset;
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
#endif #endif
// Get tessalation multiplier (per vertex) // Get tessalation multiplier (per vertex)

View File

@@ -388,7 +388,7 @@ VertexOutput VS(TerrainVertexInput input)
output.Geometry.WorldPosition = mul(float4(position, 1), worldMatrix).xyz; output.Geometry.WorldPosition = mul(float4(position, 1), worldMatrix).xyz;
// Compute clip space position // Compute clip space position
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
// Pass vertex attributes // Pass vertex attributes
#if USE_SMOOTH_LOD_TRANSITION #if USE_SMOOTH_LOD_TRANSITION
@@ -436,7 +436,7 @@ VertexOutput VS(TerrainVertexInput input)
// Apply world position offset per-vertex // Apply world position offset per-vertex
#if USE_POSITION_OFFSET #if USE_POSITION_OFFSET
output.Geometry.WorldPosition += material.PositionOffset; output.Geometry.WorldPosition += material.PositionOffset;
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix); output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
#endif #endif
// Get tessalation multiplier (per vertex) // Get tessalation multiplier (per vertex)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -4,7 +4,7 @@
"Major": 1, "Major": 1,
"Minor": 12, "Minor": 12,
"Revision": 0, "Revision": 0,
"Build": 6905 "Build": 6908
}, },
"Company": "Flax", "Company": "Flax",
"Copyright": "Copyright (c) 2012-2026 Wojciech Figat. All rights reserved.", "Copyright": "Copyright (c) 2012-2026 Wojciech Figat. All rights reserved.",

View File

@@ -12,6 +12,6 @@ cd "`dirname "$0"`"
bash ./Development/Scripts/Mac/CallBuildTool.sh --genproject "$@" bash ./Development/Scripts/Mac/CallBuildTool.sh --genproject "$@"
# Build bindings for all editor configurations # Build bindings for all editor configurations
#echo Building C# bindings... echo Building C# bindings...
# TODO: Detect the correct architecture here # TODO: Detect the correct architecture here
#Binaries/Tools/Flax.Build -build -BuildBindingsOnly -arch=ARM64 -platform=Mac --buildTargets=FlaxEditor Binaries/Tools/Flax.Build -build -BuildBindingsOnly -arch=ARM64 -platform=Mac --buildTargets=FlaxEditor

View File

@@ -45,6 +45,8 @@ namespace FlaxEditor.Content.Thumbnails
{ {
if (item == null) if (item == null)
throw new ArgumentNullException(); throw new ArgumentNullException();
if (_task == null)
return;
// Check if use default icon // Check if use default icon
var defaultThumbnail = item.DefaultThumbnail; var defaultThumbnail = item.DefaultThumbnail;
@@ -223,11 +225,12 @@ namespace FlaxEditor.Content.Thumbnails
/// <inheritdoc /> /// <inheritdoc />
public override void OnInit() public override void OnInit()
{ {
if (Editor.IsHeadlessMode || (GPUDevice.Instance != null && GPUDevice.Instance.RendererType == RendererType.Null))
return;
// Create cache folder // Create cache folder
if (!Directory.Exists(_cacheFolder)) if (!Directory.Exists(_cacheFolder))
{
Directory.CreateDirectory(_cacheFolder); Directory.CreateDirectory(_cacheFolder);
}
// Find atlases in a Editor cache directory // Find atlases in a Editor cache directory
var files = Directory.GetFiles(_cacheFolder, "cache_*.flax", SearchOption.TopDirectoryOnly); var files = Directory.GetFiles(_cacheFolder, "cache_*.flax", SearchOption.TopDirectoryOnly);
@@ -482,7 +485,7 @@ namespace FlaxEditor.Content.Thumbnails
public override void OnUpdate() public override void OnUpdate()
{ {
// Wait some frames before start generating previews (late init feature) // Wait some frames before start generating previews (late init feature)
if (Time.TimeSinceStartup < 1.0f || HasAllAtlasesLoaded() == false) if (Time.TimeSinceStartup < 1.0f || HasAllAtlasesLoaded() == false || _task == null)
return; return;
lock (_requests) lock (_requests)

View File

@@ -141,6 +141,11 @@ API_ENUM() enum class BuildPlatform
/// </summary> /// </summary>
API_ENUM(Attributes="EditorDisplay(null, \"Windows ARM64\")") API_ENUM(Attributes="EditorDisplay(null, \"Windows ARM64\")")
WindowsARM64 = 15, WindowsARM64 = 15,
/// <summary>
/// Web
/// </summary>
Web = 16,
}; };
/// <summary> /// <summary>
@@ -188,6 +193,11 @@ enum class DotNetAOTModes
/// Use Mono AOT to cross-compile all used C# assemblies into native platform static libraries which can be linked into a single shared library. /// Use Mono AOT to cross-compile all used C# assemblies into native platform static libraries which can be linked into a single shared library.
/// </summary> /// </summary>
MonoAOTStatic, MonoAOTStatic,
/// <summary>
/// Target platform doesn't support .NET or it has been disabled.
/// </summary>
NoDotnet,
}; };
extern FLAXENGINE_API const Char* ToString(const BuildPlatform platform); extern FLAXENGINE_API const Char* ToString(const BuildPlatform platform);

View File

@@ -69,6 +69,10 @@
#include "Platform/iOS/iOSPlatformTools.h" #include "Platform/iOS/iOSPlatformTools.h"
#include "Engine/Platform/iOS/iOSPlatformSettings.h" #include "Engine/Platform/iOS/iOSPlatformSettings.h"
#endif #endif
#if PLATFORM_TOOLS_WEB
#include "Platform/Web/WebPlatformTools.h"
#include "Engine/Platform/Web/WebPlatformSettings.h"
#endif
namespace GameCookerImpl namespace GameCookerImpl
{ {
@@ -151,6 +155,8 @@ const Char* ToString(const BuildPlatform platform)
return TEXT("iOS ARM64"); return TEXT("iOS ARM64");
case BuildPlatform::WindowsARM64: case BuildPlatform::WindowsARM64:
return TEXT("Windows ARM64"); return TEXT("Windows ARM64");
case BuildPlatform::Web:
return TEXT("Web");
default: default:
return TEXT(""); return TEXT("");
} }
@@ -183,6 +189,8 @@ const Char* ToString(const DotNetAOTModes mode)
return TEXT("MonoAOTDynamic"); return TEXT("MonoAOTDynamic");
case DotNetAOTModes::MonoAOTStatic: case DotNetAOTModes::MonoAOTStatic:
return TEXT("MonoAOTStatic"); return TEXT("MonoAOTStatic");
case DotNetAOTModes::NoDotnet:
return TEXT("NoDotnet");
default: default:
return TEXT(""); return TEXT("");
} }
@@ -307,6 +315,10 @@ void CookingData::GetBuildPlatformName(const Char*& platform, const Char*& archi
platform = TEXT("Windows"); platform = TEXT("Windows");
architecture = TEXT("ARM64"); architecture = TEXT("ARM64");
break; break;
case BuildPlatform::Web:
platform = TEXT("Web");
architecture = TEXT("x86");
break;
default: default:
LOG(Fatal, "Unknown or unsupported build platform."); LOG(Fatal, "Unknown or unsupported build platform.");
} }
@@ -461,6 +473,11 @@ PlatformTools* GameCooker::GetTools(BuildPlatform platform)
case BuildPlatform::iOSARM64: case BuildPlatform::iOSARM64:
result = New<iOSPlatformTools>(); result = New<iOSPlatformTools>();
break; break;
#endif
#if PLATFORM_TOOLS_WEB
case BuildPlatform::Web:
result = New<WebPlatformTools>();
break;
#endif #endif
} }
Tools.Add(platform, result); Tools.Add(platform, result);
@@ -604,6 +621,9 @@ void GameCooker::GetCurrentPlatform(PlatformType& platform, BuildPlatform& build
case PlatformType::iOS: case PlatformType::iOS:
buildPlatform = BuildPlatform::iOSARM64; buildPlatform = BuildPlatform::iOSARM64;
break; break;
case PlatformType::Web:
buildPlatform = BuildPlatform::Web;
break;
default: ; default: ;
} }
} }

View File

@@ -106,6 +106,7 @@ namespace FlaxEditor
case BuildPlatform.MacOSARM64: case BuildPlatform.MacOSARM64:
case BuildPlatform.MacOSx64: return PlatformType.Mac; case BuildPlatform.MacOSx64: return PlatformType.Mac;
case BuildPlatform.iOSARM64: return PlatformType.iOS; case BuildPlatform.iOSARM64: return PlatformType.iOS;
case BuildPlatform.Web: return PlatformType.Web;
default: throw new ArgumentOutOfRangeException(nameof(buildPlatform), buildPlatform, null); default: throw new ArgumentOutOfRangeException(nameof(buildPlatform), buildPlatform, null);
} }
} }

View File

@@ -138,6 +138,7 @@ Array<byte> AndroidPlatformTools::SaveCache(CookingData& data, IBuildCache* cach
result.Add((const byte*)&platformCache, sizeof(platformCache)); result.Add((const byte*)&platformCache, sizeof(platformCache));
return result; return result;
} }
void AndroidPlatformTools::OnBuildStarted(CookingData& data) void AndroidPlatformTools::OnBuildStarted(CookingData& data)
{ {
// Adjust the cooking output folder to be located inside the Gradle assets directory // Adjust the cooking output folder to be located inside the Gradle assets directory
@@ -412,7 +413,6 @@ bool AndroidPlatformTools::OnPostProcess(CookingData& data)
} }
LOG(Info, "Output Android APK application package: {0} (size: {1} MB)", outputApk, FileSystem::GetFileSize(outputApk) / 1024 / 1024); LOG(Info, "Output Android APK application package: {0} (size: {1} MB)", outputApk, FileSystem::GetFileSize(outputApk) / 1024 / 1024);
return false; return false;
} }

View File

@@ -0,0 +1,271 @@
// Copyright (c) Wojciech Figat. All rights reserved.
#if PLATFORM_TOOLS_WEB
#include "WebPlatformTools.h"
#include "Engine/Platform/File.h"
#include "Engine/Platform/FileSystem.h"
#include "Engine/Platform/CreateProcessSettings.h"
#include "Engine/Platform/Web/WebPlatformSettings.h"
#include "Engine/Core/Types/Span.h"
#include "Engine/Core/Math/Vector2.h"
#include "Engine/Core/Config/GameSettings.h"
#include "Engine/Core/Config/BuildSettings.h"
#include "Engine/Content/Content.h"
#include "Engine/Content/JsonAsset.h"
#include "Engine/Graphics/PixelFormatExtensions.h"
#include "Engine/Graphics/Textures/TextureBase.h"
#include "Editor/Cooker/GameCooker.h"
IMPLEMENT_SETTINGS_GETTER(WebPlatformSettings, WebPlatform);
namespace
{
struct WebPlatformCache
{
WebPlatformSettings::TextureCompression TexturesCompression;
};
}
const Char* WebPlatformTools::GetDisplayName() const
{
return TEXT("Web");
}
const Char* WebPlatformTools::GetName() const
{
return TEXT("Web");
}
PlatformType WebPlatformTools::GetPlatform() const
{
return PlatformType::Web;
}
ArchitectureType WebPlatformTools::GetArchitecture() const
{
return ArchitectureType::x86;
}
DotNetAOTModes WebPlatformTools::UseAOT() const
{
return DotNetAOTModes::MonoAOTDynamic;//MonoAOTStatic;// DotNetAOTModes::None;//DotNetAOTModes::MonoAOTStatic;//DotNetAOTModes::NoDotnet;
}
PixelFormat WebPlatformTools::GetTextureFormat(CookingData& data, TextureBase* texture, PixelFormat format)
{
const auto platformSettings = WebPlatformSettings::Get();
const auto uncompressed = PixelFormatExtensions::FindUncompressedFormat(format);
switch (platformSettings->TexturesCompression)
{
case WebPlatformSettings::TextureCompression::Uncompressed:
return uncompressed;
case WebPlatformSettings::TextureCompression::BC:
return format;
case WebPlatformSettings::TextureCompression::ASTC:
switch (format)
{
case PixelFormat::BC4_SNorm:
return PixelFormat::R8_SNorm;
case PixelFormat::BC5_SNorm:
return PixelFormat::R16G16_SNorm;
case PixelFormat::BC6H_Typeless:
case PixelFormat::BC6H_Uf16:
case PixelFormat::BC6H_Sf16:
case PixelFormat::BC7_Typeless:
case PixelFormat::BC7_UNorm:
case PixelFormat::BC7_UNorm_sRGB:
return PixelFormat::R16G16B16A16_Float; // TODO: ASTC HDR
default:
return PixelFormatExtensions::IsSRGB(format) ? PixelFormat::ASTC_6x6_UNorm_sRGB : PixelFormat::ASTC_6x6_UNorm;
}
case WebPlatformSettings::TextureCompression::Basis:
switch (format)
{
case PixelFormat::BC7_Typeless:
case PixelFormat::BC7_UNorm:
case PixelFormat::BC7_UNorm_sRGB:
return PixelFormat::R16G16B16A16_Float; // Basic Universal doesn't support alpha in BC7 (and it can be loaded only from LDR formats)
default:
if (uncompressed != format && texture->Size().MinValue() >= 16)
return PixelFormat::Basis;
return uncompressed;
}
default:
return format;
}
}
void WebPlatformTools::LoadCache(CookingData& data, IBuildCache* cache, const Span<byte>& bytes)
{
const auto platformSettings = WebPlatformSettings::Get();
bool invalidTextures = true;
if (bytes.Length() == sizeof(WebPlatformCache))
{
auto* platformCache = (WebPlatformCache*)bytes.Get();
invalidTextures = platformCache->TexturesCompression != platformSettings->TexturesCompression;
}
if (invalidTextures)
{
LOG(Info, "{0} option has been modified.", TEXT("TexturesQuality"));
cache->InvalidateCacheTextures();
}
}
Array<byte> WebPlatformTools::SaveCache(CookingData& data, IBuildCache* cache)
{
const auto platformSettings = WebPlatformSettings::Get();
WebPlatformCache platformCache;
platformCache.TexturesCompression = platformSettings->TexturesCompression;
Array<byte> result;
result.Add((const byte*)&platformCache, sizeof(platformCache));
return result;
}
bool WebPlatformTools::IsNativeCodeFile(CookingData& data, const String& file)
{
String extension = FileSystem::GetExtension(file);
return extension.IsEmpty() || extension == TEXT("html") || extension == TEXT("js") || extension == TEXT("wasm");
}
void WebPlatformTools::OnBuildStarted(CookingData& data)
{
// Adjust the cooking output folder for the data files so file_packager tool can compress and output final data inside the cooker output folder
data.DataOutputPath = data.CacheDirectory / TEXT("Files");
}
bool WebPlatformTools::OnPostProcess(CookingData& data)
{
const auto gameSettings = GameSettings::Get();
const auto platformSettings = WebPlatformSettings::Get();
const auto platformDataPath = data.GetPlatformBinariesRoot();
// Get name of the output binary (JavaScript and WebAssembly files match)
String gameJs;
{
Array<String> files;
FileSystem::DirectoryGetFiles(files, data.OriginalOutputPath, TEXT("*"), DirectorySearchOption::TopDirectoryOnly);
for (const String& file : files)
{
if (file.EndsWith(TEXT(".js")))
{
String outputWasm = String(StringUtils::GetPathWithoutExtension(file)) + TEXT(".wasm");
if (files.Contains(outputWasm))
{
gameJs = file;
break;
}
}
}
}
if (gameJs.IsEmpty())
{
data.Error(TEXT("Failed to find the main JavaScript for the output game"));
return true;
}
// Move .wasm assemblies into the data files in order for dlopen to work (blocking)
{
Array<String> files, files2;
FileSystem::DirectoryGetFiles(files, data.OriginalOutputPath, TEXT("*.wasm"), DirectorySearchOption::AllDirectories);
FileSystem::DirectoryGetFiles(files, data.OriginalOutputPath, TEXT("*.so"), DirectorySearchOption::AllDirectories);
StringView gameWasm = StringUtils::GetFileNameWithoutExtension(gameJs);
for (const String& file : files)
{
if (StringUtils::GetFileNameWithoutExtension(file) == gameWasm)
continue; // Skip the main game module
FileSystem::MoveFile(data.DataOutputPath / StringUtils::GetFileName(file), file, true);
}
for (const String& file : files2)
{
if (StringUtils::GetFileNameWithoutExtension(file) == gameWasm)
continue; // Skip the main game module
FileSystem::MoveFile(data.DataOutputPath / StringUtils::GetFileName(file), file, true);
}
}
// Pack data files into a single file using Emscripten's file_packager tool
{
CreateProcessSettings procSettings;
String emscriptenSdk = TEXT("EMSDK");
Platform::GetEnvironmentVariable(emscriptenSdk, emscriptenSdk);
procSettings.FileName = emscriptenSdk / TEXT("upstream/emscripten/tools/file_packager");
#if PLATFORM_WIN32
procSettings.FileName += TEXT(".bat");
#endif
procSettings.Arguments = String::Format(TEXT("files.data --preload \"{}@/\" --lz4 --js-output=files.js"), data.DataOutputPath);
procSettings.WorkingDirectory = data.OriginalOutputPath;
const int32 result = Platform::CreateProcess(procSettings);
if (result != 0)
{
if (!FileSystem::FileExists(procSettings.FileName))
data.Error(TEXT("Missing file_packager.bat. Ensure Emscripten SDK installation is valid and 'EMSDK' environment variable points to it."));
data.Error(String::Format(TEXT("Failed to package project files (result code: {0}). See log for more info."), result));
return true;
}
}
// Copy icon file
{
String dstIcon = data.OriginalOutputPath / TEXT("favicon.ico");
if (!FileSystem::FileExists(dstIcon))
FileSystem::CopyFile(dstIcon, platformDataPath / TEXT("favicon.ico"));
}
// TODO: customizable HTML templates
// Insert packaged file system with game data
{
String gameJsText;
if (File::ReadAllText(gameJs, gameJsText))
{
data.Error(String::Format(TEXT("Failed to load file '{}'"), gameJs));
return true;
}
const String filesIncludeBegin = TEXT("// include: files.js");
const String filesIncludeEnd = TEXT("// end include: files.js");
String fileJs = data.OriginalOutputPath / TEXT("files.js");
if (!gameJsText.Contains(filesIncludeBegin))
{
// Insert generated files.js into the main game file after the minimum_runtime_check.js include
String fileJsText;
if (File::ReadAllText(fileJs, fileJsText))
{
data.Error(String::Format(TEXT("Failed to load file '{}'"), fileJs));
return true;
}
const String insertPrefixLocation = TEXT("// end include: minimum_runtime_check.js");
int32 location = gameJsText.Find(insertPrefixLocation);
if (location != -1)
{
location += insertPrefixLocation.Length() + 1;
fileJsText = filesIncludeBegin + TEXT("\n") + fileJsText + TEXT("\n") + filesIncludeEnd + TEXT("\n");
gameJsText.Insert(location, fileJsText);
}
else
{
// Comments are missing in Release when JS/HTML are minified
fileJsText.Insert(0, filesIncludeBegin);
fileJsText.Insert(0, TEXT("\n"));
gameJsText.Insert(0, fileJsText);
}
File::WriteAllText(gameJs, gameJsText, Encoding::UTF8);
}
// Remove the generated files.js as it's now included in the main game JS file
FileSystem::DeleteFile(fileJs);
}
const auto buildSettings = BuildSettings::Get();
if (buildSettings->SkipPackaging)
return false;
GameCooker::PackageFiles();
// TODO: minify/compress output JS files (in Release builds)
LOG(Info, "Output website size: {0} MB", FileSystem::GetDirectorySize(data.OriginalOutputPath) / 1024 / 1024);
return false;
}
#endif

View File

@@ -0,0 +1,29 @@
// Copyright (c) Wojciech Figat. All rights reserved.
#pragma once
#if PLATFORM_TOOLS_WEB
#include "../../PlatformTools.h"
/// <summary>
/// The Web platform support tools.
/// </summary>
class WebPlatformTools : public PlatformTools
{
public:
// [PlatformTools]
const Char* GetDisplayName() const override;
const Char* GetName() const override;
PlatformType GetPlatform() const override;
ArchitectureType GetArchitecture() const override;
DotNetAOTModes UseAOT() const override;
PixelFormat GetTextureFormat(CookingData& data, TextureBase* texture, PixelFormat format) override;
void LoadCache(CookingData& data, IBuildCache* cache, const Span<byte>& bytes) override;
Array<byte> SaveCache(CookingData& data, IBuildCache* cache) override;
bool IsNativeCodeFile(CookingData& data, const String& file) override;
void OnBuildStarted(CookingData& data) override;
bool OnPostProcess(CookingData& data) override;
};
#endif

View File

@@ -572,6 +572,14 @@ bool ProcessShaderBase(CookAssetsStep::AssetCookData& data, ShaderAssetBase* ass
COMPILE_PROFILE(Vulkan_SM5, SHADER_FILE_CHUNK_INTERNAL_VULKAN_SM5_CACHE); COMPILE_PROFILE(Vulkan_SM5, SHADER_FILE_CHUNK_INTERNAL_VULKAN_SM5_CACHE);
break; break;
} }
#endif
#if PLATFORM_TOOLS_WEB
case BuildPlatform::Web:
{
const char* platformDefineName = "PLATFORM_WEB";
COMPILE_PROFILE(WebGPU, SHADER_FILE_CHUNK_INTERNAL_GENERIC_CACHE);
break;
}
#endif #endif
default: default:
{ {
@@ -734,37 +742,8 @@ bool ProcessTextureBase(CookAssetsStep::AssetCookData& data)
{ {
auto chunk = New<FlaxChunk>(); auto chunk = New<FlaxChunk>();
data.InitData.Header.Chunks[mipIndex] = chunk; data.InitData.Header.Chunks[mipIndex] = chunk;
if (TextureTool::WriteTextureData(chunk->Data, *textureData, mipIndex))
// Calculate the texture data storage layout return true;
uint32 rowPitch, slicePitch;
const int32 mipWidth = Math::Max(1, textureData->Width >> mipIndex);
const int32 mipHeight = Math::Max(1, textureData->Height >> mipIndex);
RenderTools::ComputePitch(textureData->Format, mipWidth, mipHeight, rowPitch, slicePitch);
chunk->Data.Allocate(slicePitch * textureData->GetArraySize());
// Copy array slices into mip data (sequential)
for (int32 arrayIndex = 0; arrayIndex < textureData->Items.Count(); arrayIndex++)
{
auto& mipData = textureData->Items[arrayIndex].Mips[mipIndex];
byte* src = mipData.Data.Get();
byte* dst = chunk->Data.Get() + (slicePitch * arrayIndex);
// Faster path if source and destination data layout matches
if (rowPitch == mipData.RowPitch && slicePitch == mipData.DepthPitch)
{
Platform::MemoryCopy(dst, src, slicePitch);
}
else
{
const auto copyRowSize = Math::Min(mipData.RowPitch, rowPitch);
for (uint32 line = 0; line < mipData.Lines; line++)
{
Platform::MemoryCopy(dst, src, copyRowSize);
src += mipData.RowPitch;
dst += rowPitch;
}
}
}
} }
// Clone any custom asset chunks (eg. sprite atlas data, mips are in 0-13 chunks) // Clone any custom asset chunks (eg. sprite atlas data, mips are in 0-13 chunks)

View File

@@ -39,17 +39,23 @@ bool DeployDataStep::Perform(CookingData& data)
} }
String dstDotnet = data.DataOutputPath / TEXT("Dotnet"); String dstDotnet = data.DataOutputPath / TEXT("Dotnet");
const DotNetAOTModes aotMode = data.Tools->UseAOT(); const DotNetAOTModes aotMode = data.Tools->UseAOT();
const bool usAOT = aotMode != DotNetAOTModes::None; const bool usAOT = aotMode != DotNetAOTModes::None && aotMode != DotNetAOTModes::NoDotnet;
if (usAOT) if (usAOT)
{ {
// Deploy Dotnet files into intermediate cooking directory for AOT // Deploy Dotnet files into intermediate cooking directory for AOT
FileSystem::DeleteDirectory(dstDotnet); FileSystem::DeleteDirectory(dstDotnet);
dstDotnet = data.ManagedCodeOutputPath; dstDotnet = data.ManagedCodeOutputPath;
} }
if (buildSettings.SkipDotnetPackaging && data.Tools->UseSystemDotnet()) if (aotMode == DotNetAOTModes::NoDotnet)
{
// No .NET
FileSystem::DeleteDirectory(dstDotnet);
}
else if (buildSettings.SkipDotnetPackaging && data.Tools->UseSystemDotnet())
{ {
// Use system-installed .NET Runtime // Use system-installed .NET Runtime
FileSystem::DeleteDirectory(dstDotnet); FileSystem::DeleteDirectory(dstDotnet);
LOG(Info, "Not using .NET Runtime");
} }
else else
{ {

View File

@@ -12,7 +12,9 @@
void PrecompileAssembliesStep::OnBuildStarted(CookingData& data) void PrecompileAssembliesStep::OnBuildStarted(CookingData& data)
{ {
const DotNetAOTModes aotMode = data.Tools->UseAOT(); const DotNetAOTModes aotMode = data.Tools->UseAOT();
if (aotMode == DotNetAOTModes::None || EnumHasAllFlags(data.Options, BuildOptions::NoCook)) if (aotMode == DotNetAOTModes::None ||
aotMode == DotNetAOTModes::NoDotnet ||
EnumHasAllFlags(data.Options, BuildOptions::NoCook))
return; return;
const auto& buildSettings = *BuildSettings::Get(); const auto& buildSettings = *BuildSettings::Get();
@@ -35,8 +37,8 @@ void PrecompileAssembliesStep::OnBuildStarted(CookingData& data)
if (cachedData != aotModeCacheValue) if (cachedData != aotModeCacheValue)
{ {
LOG(Info, "AOT cache invalidation"); LOG(Info, "AOT cache invalidation");
FileSystem::DeleteDirectory(data.ManagedCodeOutputPath); // Remove AOT cache //FileSystem::DeleteDirectory(data.ManagedCodeOutputPath); // Remove AOT cache
FileSystem::DeleteDirectory(data.DataOutputPath / TEXT("Dotnet")); // Remove deployed Dotnet libs (be sure to remove any leftovers from previous build) //FileSystem::DeleteDirectory(data.DataOutputPath / TEXT("Dotnet")); // Remove deployed Dotnet libs (be sure to remove any leftovers from previous build)
} }
} }
if (!FileSystem::DirectoryExists(data.ManagedCodeOutputPath)) if (!FileSystem::DirectoryExists(data.ManagedCodeOutputPath))
@@ -49,7 +51,8 @@ void PrecompileAssembliesStep::OnBuildStarted(CookingData& data)
bool PrecompileAssembliesStep::Perform(CookingData& data) bool PrecompileAssembliesStep::Perform(CookingData& data)
{ {
const DotNetAOTModes aotMode = data.Tools->UseAOT(); const DotNetAOTModes aotMode = data.Tools->UseAOT();
if (aotMode == DotNetAOTModes::None) if (aotMode == DotNetAOTModes::None ||
aotMode == DotNetAOTModes::NoDotnet)
return false; return false;
const auto& buildSettings = *BuildSettings::Get(); const auto& buildSettings = *BuildSettings::Get();
if (buildSettings.SkipDotnetPackaging && data.Tools->UseSystemDotnet()) if (buildSettings.SkipDotnetPackaging && data.Tools->UseSystemDotnet())

View File

@@ -103,13 +103,14 @@ namespace FlaxEditor.CustomEditors.Dedicated
var actors = ScriptsEditor.ParentEditor.Values; var actors = ScriptsEditor.ParentEditor.Values;
foreach (var a in actors) foreach (var a in actors)
{ {
if (a.GetType() != requireActor.RequiredType) if (a.GetType() == requireActor.RequiredType)
{ continue;
if (requireActor.IncludeInheritedTypes && a.GetType().IsSubclassOf(requireActor.RequiredType))
continue;
item.Enabled = false; item.Enabled = false;
break; break;
} }
} }
}
cm.AddItem(item); cm.AddItem(item);
} }
cm.TextChanged += text => cm.TextChanged += text =>
@@ -739,6 +740,8 @@ namespace FlaxEditor.CustomEditors.Dedicated
/// <inheritdoc /> /// <inheritdoc />
public override void Initialize(LayoutElementsContainer layout) public override void Initialize(LayoutElementsContainer layout)
{ {
var style = FlaxEngine.GUI.Style.Current;
// Area for drag&drop scripts // Area for drag&drop scripts
var dragArea = layout.CustomContainer<DragAreaControl>(); var dragArea = layout.CustomContainer<DragAreaControl>();
dragArea.CustomControl.ScriptsEditor = this; dragArea.CustomControl.ScriptsEditor = this;
@@ -800,17 +803,10 @@ namespace FlaxEditor.CustomEditors.Dedicated
bool hasAllRequirements = true; bool hasAllRequirements = true;
if (scriptType.HasAttribute(typeof(RequireScriptAttribute), false)) if (scriptType.HasAttribute(typeof(RequireScriptAttribute), false))
{ {
RequireScriptAttribute scriptAttribute = null; var attribute = (RequireScriptAttribute)scriptType.GetAttributes(false).FirstOrDefault(x => x is RequireScriptAttribute);
foreach (var e in scriptType.GetAttributes(false)) if (attribute != null)
{ {
if (e is not RequireScriptAttribute requireScriptAttribute) foreach (var type in attribute.RequiredTypes)
continue;
scriptAttribute = requireScriptAttribute;
}
if (scriptAttribute != null)
{
foreach (var type in scriptAttribute.RequiredTypes)
{ {
if (!type.IsSubclassOf(typeof(Script))) if (!type.IsSubclassOf(typeof(Script)))
continue; continue;
@@ -825,19 +821,11 @@ namespace FlaxEditor.CustomEditors.Dedicated
} }
if (scriptType.HasAttribute(typeof(RequireActorAttribute), false)) if (scriptType.HasAttribute(typeof(RequireActorAttribute), false))
{ {
RequireActorAttribute attribute = null; var attribute = (RequireActorAttribute)scriptType.GetAttributes(false).FirstOrDefault(x => x is RequireActorAttribute);
foreach (var e in scriptType.GetAttributes(false))
{
if (e is not RequireActorAttribute requireActorAttribute)
continue;
attribute = requireActorAttribute;
break;
}
if (attribute != null) if (attribute != null)
{ {
var actor = script.Actor; var actor = script.Actor;
if (actor.GetType() != attribute.RequiredType && !actor.GetType().IsSubclassOf(attribute.RequiredType)) if (actor.GetType() != attribute.RequiredType && (attribute.IncludeInheritedTypes && !actor.GetType().IsSubclassOf(attribute.RequiredType)))
{ {
Editor.LogWarning($"`{Utilities.Utils.GetPropertyNameUI(scriptType.Name)}` on `{script.Actor}` is missing a required Actor of type `{attribute.RequiredType}`."); Editor.LogWarning($"`{Utilities.Utils.GetPropertyNameUI(scriptType.Name)}` on `{script.Actor}` is missing a required Actor of type `{attribute.RequiredType}`.");
hasAllRequirements = false; hasAllRequirements = false;
@@ -850,7 +838,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
var title = Utilities.Utils.GetPropertyNameUI(scriptType.Name); var title = Utilities.Utils.GetPropertyNameUI(scriptType.Name);
var group = layout.Group(title, editor); var group = layout.Group(title, editor);
if (!hasAllRequirements) if (!hasAllRequirements)
group.Panel.HeaderTextColor = FlaxEngine.GUI.Style.Current.Statusbar.Failed; group.Panel.HeaderTextColor = style.Statusbar.Failed;
if ((Presenter.Features & FeatureFlags.CacheExpandedGroups) != 0) if ((Presenter.Features & FeatureFlags.CacheExpandedGroups) != 0)
{ {
if (Editor.Instance.ProjectCache.IsGroupToggled(title)) if (Editor.Instance.ProjectCache.IsGroupToggled(title))
@@ -863,9 +851,10 @@ namespace FlaxEditor.CustomEditors.Dedicated
group.Panel.Open(); group.Panel.Open();
// Customize // Customize
float totalHeaderButtonsOffset = 0f;
group.Panel.TooltipText = Editor.Instance.CodeDocs.GetTooltip(scriptType); group.Panel.TooltipText = Editor.Instance.CodeDocs.GetTooltip(scriptType);
if (script.HasPrefabLink) if (script.HasPrefabLink)
group.Panel.HeaderTextColor = FlaxEngine.GUI.Style.Current.ProgressNormal; group.Panel.HeaderTextColor = style.ProgressNormal;
// Add toggle button to the group // Add toggle button to the group
var headerHeight = group.Panel.HeaderHeight; var headerHeight = group.Panel.HeaderHeight;
@@ -889,7 +878,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
TooltipText = "Script reference.", TooltipText = "Script reference.",
AutoFocus = true, AutoFocus = true,
IsScrollable = false, IsScrollable = false,
Color = FlaxEngine.GUI.Style.Current.ForegroundGrey, Color = style.ForegroundGrey,
Parent = group.Panel, Parent = group.Panel,
Bounds = new Rectangle(scriptToggle.Right, 0.5f, headerHeight, headerHeight), Bounds = new Rectangle(scriptToggle.Right, 0.5f, headerHeight, headerHeight),
Margin = new Margin(1), Margin = new Margin(1),
@@ -908,10 +897,35 @@ namespace FlaxEditor.CustomEditors.Dedicated
var settingsButton = group.AddSettingsButton(); var settingsButton = group.AddSettingsButton();
settingsButton.Tag = script; settingsButton.Tag = script;
settingsButton.Clicked += OnSettingsButtonClicked; settingsButton.Clicked += OnSettingsButtonClicked;
totalHeaderButtonsOffset += settingsButton.Width + FlaxEditor.Utilities.Constants.UIMargin;
// Add script obsolete icon to the group
if (scriptType.HasAttribute(typeof(ObsoleteAttribute), false))
{
var attribute = (ObsoleteAttribute)scriptType.GetAttributes(false).First(x => x is ObsoleteAttribute);
var tooltip = "Script marked as obsolete." +
(string.IsNullOrEmpty(attribute.Message) ? "" : $"\n{attribute.Message}") +
(string.IsNullOrEmpty(attribute.DiagnosticId) ? "" : $"\n{attribute.DiagnosticId}");
var obsoleteButton = group.AddHeaderButton(tooltip, totalHeaderButtonsOffset, Editor.Instance.Icons.Info32);
obsoleteButton.Color = Color.Orange;
obsoleteButton.MouseOverColor = Color.DarkOrange;
totalHeaderButtonsOffset += obsoleteButton.Width;
}
// Show visual indicator if script only exists in prefab instance and is not part of the prefab
bool isPrefabActor = scripts.Any(s => s.Actor.HasPrefabLink);
if (isPrefabActor && script.PrefabID == Guid.Empty)
{
var prefabInstanceButton = group.AddHeaderButton("Script only exists in this prefab instance.", totalHeaderButtonsOffset, Editor.Instance.Icons.Add32);
prefabInstanceButton.Color = style.ProgressNormal;
prefabInstanceButton.MouseOverColor = style.ProgressNormal * 0.9f;
totalHeaderButtonsOffset += prefabInstanceButton.Width;
}
// Adjust margin to not overlap with other ui elements in the header // Adjust margin to not overlap with other ui elements in the header
group.Panel.HeaderTextMargin = group.Panel.HeaderTextMargin with { Left = scriptDrag.Right - 12, Right = settingsButton.Width + Utilities.Constants.UIMargin }; group.Panel.HeaderTextMargin = group.Panel.HeaderTextMargin with { Left = scriptDrag.Right - 12, Right = settingsButton.Width + Utilities.Constants.UIMargin };
group.Object(values, editor); group.Object(values, editor);
// Remove drop down arrows and containment lines if no objects in the group // Remove drop down arrows and containment lines if no objects in the group
if (group.Children.Count == 0) if (group.Children.Count == 0)
{ {

View File

@@ -18,7 +18,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
public class SplineEditor : ActorEditor public class SplineEditor : ActorEditor
{ {
/// <summary> /// <summary>
/// Storage undo spline data /// Stores undo spline data.
/// </summary> /// </summary>
private struct UndoData private struct UndoData
{ {
@@ -83,7 +83,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
} }
/// <summary> /// <summary>
/// Edit curve options manipulate the curve as free mode /// Edit curve options manipulate the curve as free mode.
/// </summary> /// </summary>
private sealed class FreeTangentMode : EditTangentOptionBase private sealed class FreeTangentMode : EditTangentOptionBase
{ {
@@ -98,7 +98,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
} }
/// <summary> /// <summary>
/// Edit curve options to set tangents to linear /// Edit curve options to set tangents to linear.
/// </summary> /// </summary>
private sealed class LinearTangentMode : EditTangentOptionBase private sealed class LinearTangentMode : EditTangentOptionBase
{ {
@@ -107,13 +107,13 @@ namespace FlaxEditor.CustomEditors.Dedicated
{ {
SetKeyframeLinear(spline, index); SetKeyframeLinear(spline, index);
// change the selection to tangent parent (a spline point / keyframe) // Change the selection to tangent parent (a spline point / keyframe)
Editor.SetSelectSplinePointNode(spline, index); Editor.SetSelectSplinePointNode(spline, index);
} }
} }
/// <summary> /// <summary>
/// Edit curve options to align tangents of selected spline /// Edit curve options to align tangents of selected spline.
/// </summary> /// </summary>
private sealed class AlignedTangentMode : EditTangentOptionBase private sealed class AlignedTangentMode : EditTangentOptionBase
{ {
@@ -168,8 +168,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
} }
/// <summary> /// <summary>
/// Edit curve options manipulate the curve setting selected point /// Edit curve options manipulate the curve setting selected point tangent in as smoothed but tangent out as linear.
/// tangent in as smoothed but tangent out as linear
/// </summary> /// </summary>
private sealed class SmoothInTangentMode : EditTangentOptionBase private sealed class SmoothInTangentMode : EditTangentOptionBase
{ {
@@ -182,8 +181,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
} }
/// <summary> /// <summary>
/// Edit curve options manipulate the curve setting selected point /// Edit curve options manipulate the curve setting selected point tangent in as linear but tangent out as smoothed.
/// tangent in as linear but tangent out as smoothed
/// </summary> /// </summary>
private sealed class SmoothOutTangentMode : EditTangentOptionBase private sealed class SmoothOutTangentMode : EditTangentOptionBase
{ {
@@ -219,7 +217,8 @@ namespace FlaxEditor.CustomEditors.Dedicated
var enabled = EnabledInHierarchy && tab.EnabledInHierarchy; var enabled = EnabledInHierarchy && tab.EnabledInHierarchy;
var style = FlaxEngine.GUI.Style.Current; var style = FlaxEngine.GUI.Style.Current;
var size = Size; var size = Size;
var textHeight = 16.0f; var textHeight = 30.0f;
// Make icons smaller when tabs get thinner
var iconSize = size.Y - textHeight; var iconSize = size.Y - textHeight;
var iconRect = new Rectangle((Width - iconSize) / 2, 0, iconSize, iconSize); var iconRect = new Rectangle((Width - iconSize) / 2, 0, iconSize, iconSize);
if (tab._mirrorIcon) if (tab._mirrorIcon)
@@ -230,8 +229,11 @@ namespace FlaxEditor.CustomEditors.Dedicated
var color = style.Foreground; var color = style.Foreground;
if (!enabled) if (!enabled)
color *= 0.6f; color *= 0.6f;
var textRect = new Rectangle(0, size.Y - textHeight, size.X, textHeight);
Render2D.PushClip(new Rectangle(Float2.Zero, Size));
Render2D.DrawSprite(tab._customIcon, iconRect, color); Render2D.DrawSprite(tab._customIcon, iconRect, color);
Render2D.DrawText(style.FontMedium, tab._customText, new Rectangle(0, iconSize, size.X, textHeight), color, TextAlignment.Center, TextAlignment.Center); Render2D.DrawText(style.FontMedium, tab._customText, textRect, color, TextAlignment.Center, TextAlignment.Center, TextWrapping.WrapWords, 0.65f);
Render2D.PopClip();
} }
} }
@@ -291,18 +293,21 @@ namespace FlaxEditor.CustomEditors.Dedicated
return; return;
_selectedSpline = spline; _selectedSpline = spline;
layout.Space(10); //var tabSize = 46;
var tabSize = 46; var tabSize = 60;
var icons = Editor.Instance.Icons; var icons = Editor.Instance.Icons;
layout.Header("Selected spline point"); var group = layout.Group("Selected Point");
_selectedPointsTabs = new Tabs _selectedPointsTabs = new Tabs
{ {
Height = tabSize, Height = tabSize,
TabsSize = new Float2(tabSize), TabsSize = new Float2(tabSize),
AutoTabsSize = true, AutoTabsSize = true,
Parent = layout.ContainerControl, Parent = group.ContainerControl,
}; };
// Move the group above the group containing spline points
group.Control.IndexInParent = 3;
_linearTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedLinear, "Linear", icons.SplineLinear64)); _linearTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedLinear, "Linear", icons.SplineLinear64));
_freeTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedFree, "Free", icons.SplineFree64)); _freeTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedFree, "Free", icons.SplineFree64));
_alignedTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedAligned, "Aligned", icons.SplineAligned64)); _alignedTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedAligned, "Aligned", icons.SplineAligned64));
@@ -310,13 +315,13 @@ namespace FlaxEditor.CustomEditors.Dedicated
_smoothOutTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedSmoothOut, "Smooth Out", icons.SplineSmoothIn64, true)); _smoothOutTangentTab = _selectedPointsTabs.AddTab(new IconTab(OnSetSelectedSmoothOut, "Smooth Out", icons.SplineSmoothIn64, true));
_selectedPointsTabs.SelectedTabIndex = -1; _selectedPointsTabs.SelectedTabIndex = -1;
layout.Header("All spline points"); group = layout.Group("All Points");
_allPointsTabs = new Tabs _allPointsTabs = new Tabs
{ {
Height = tabSize, Height = tabSize,
TabsSize = new Float2(tabSize), TabsSize = new Float2(tabSize),
AutoTabsSize = true, AutoTabsSize = true,
Parent = layout.ContainerControl, Parent = group.ContainerControl,
}; };
_setLinearAllTangentsTab = _allPointsTabs.AddTab(new IconTab(OnSetTangentsLinear, "Set Linear Tangents", icons.SplineLinear64)); _setLinearAllTangentsTab = _allPointsTabs.AddTab(new IconTab(OnSetTangentsLinear, "Set Linear Tangents", icons.SplineLinear64));
_setSmoothAllTangentsTab = _allPointsTabs.AddTab(new IconTab(OnSetTangentsSmooth, "Set Smooth Tangents", icons.SplineAligned64)); _setSmoothAllTangentsTab = _allPointsTabs.AddTab(new IconTab(OnSetTangentsSmooth, "Set Smooth Tangents", icons.SplineAligned64));

View File

@@ -690,7 +690,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
return grid; return grid;
} }
private CustomElementsContainer<UniformGridPanel> UniformPanelCapsuleForObjectWithText(LayoutElementsContainer el, string text, ValueContainer values, Color borderColor, out FloatValueBox valueBox) private CustomElementsContainer<UniformGridPanel> UniformPanelCapsuleForObjectWithText(LayoutElementsContainer el, string text, ValueContainer values, Color highlightColor, out FloatValueBox valueBox)
{ {
valueBox = null; valueBox = null;
var grid = UniformGridTwoByOne(el); var grid = UniformGridTwoByOne(el);
@@ -701,8 +701,8 @@ namespace FlaxEditor.CustomEditors.Dedicated
{ {
valueBox = floatEditorElement.ValueBox; valueBox = floatEditorElement.ValueBox;
var back = FlaxEngine.GUI.Style.Current.TextBoxBackground; var back = FlaxEngine.GUI.Style.Current.TextBoxBackground;
valueBox.BorderColor = Color.Lerp(borderColor, back, ActorTransformEditor.AxisGreyOutFactor); valueBox.HighlightColor = highlightColor;
valueBox.BorderSelectedColor = borderColor; valueBox.BorderSelectedColor = highlightColor;
} }
return grid; return grid;
} }

View File

@@ -14,22 +14,17 @@ namespace FlaxEditor.CustomEditors.Editors
/// <summary> /// <summary>
/// The X axis color. /// The X axis color.
/// </summary> /// </summary>
public static Color AxisColorX = new Color(1.0f, 0.0f, 0.02745f, 1.0f); public static Color AxisColorX = new Color(0.8f, 0.0f, 0.027f, 1.0f);
/// <summary> /// <summary>
/// The Y axis color. /// The Y axis color.
/// </summary> /// </summary>
public static Color AxisColorY = new Color(0.239215f, 1.0f, 0.047058f, 1.0f); public static Color AxisColorY = new Color(0.239215f, 0.65f, 0.047058f, 1.0f);
/// <summary> /// <summary>
/// The Z axis color. /// The Z axis color.
/// </summary> /// </summary>
public static Color AxisColorZ = new Color(0.0f, 0.0235294f, 1.0f, 1.0f); public static Color AxisColorZ = new Color(0.0f, 0.42352f, 0.8f, 1.0f);
/// <summary>
/// The axes colors grey out scale when input field is not focused.
/// </summary>
public static float AxisGreyOutFactor = 0.6f;
/// <summary> /// <summary>
/// Custom editor for actor position property. /// Custom editor for actor position property.
@@ -43,18 +38,20 @@ namespace FlaxEditor.CustomEditors.Editors
base.Initialize(layout); base.Initialize(layout);
if (XElement.ValueBox.Parent is UniformGridPanel ug) if (XElement.ValueBox.Parent is UniformGridPanel ug)
{
ug.SlotPadding = new Margin(3.0f, 0.0f, 0.0f, 0.0f);
CheckLayout(ug); CheckLayout(ug);
}
// Override colors // Override colors
var back = FlaxEngine.GUI.Style.Current.TextBoxBackground;
XElement.ValueBox.BorderColor = Color.Lerp(AxisColorX, back, AxisGreyOutFactor);
XElement.ValueBox.BorderSelectedColor = AxisColorX; XElement.ValueBox.BorderSelectedColor = AxisColorX;
XElement.ValueBox.Category = Utils.ValueCategory.Distance;
YElement.ValueBox.BorderColor = Color.Lerp(AxisColorY, back, AxisGreyOutFactor);
YElement.ValueBox.BorderSelectedColor = AxisColorY; YElement.ValueBox.BorderSelectedColor = AxisColorY;
YElement.ValueBox.Category = Utils.ValueCategory.Distance;
ZElement.ValueBox.BorderColor = Color.Lerp(AxisColorZ, back, AxisGreyOutFactor);
ZElement.ValueBox.BorderSelectedColor = AxisColorZ; ZElement.ValueBox.BorderSelectedColor = AxisColorZ;
XElement.ValueBox.HighlightColor = AxisColorX;
XElement.ValueBox.Category = Utils.ValueCategory.Distance;
YElement.ValueBox.HighlightColor = AxisColorY;
YElement.ValueBox.Category = Utils.ValueCategory.Distance;
ZElement.ValueBox.HighlightColor = AxisColorZ;
ZElement.ValueBox.Category = Utils.ValueCategory.Distance; ZElement.ValueBox.Category = Utils.ValueCategory.Distance;
} }
} }
@@ -71,18 +68,20 @@ namespace FlaxEditor.CustomEditors.Editors
base.Initialize(layout); base.Initialize(layout);
if (XElement.ValueBox.Parent is UniformGridPanel ug) if (XElement.ValueBox.Parent is UniformGridPanel ug)
{
ug.SlotPadding = new Margin(3.0f, 0.0f, 0.0f, 0.0f);
CheckLayout(ug); CheckLayout(ug);
}
// Override colors // Override colors
var back = FlaxEngine.GUI.Style.Current.TextBoxBackground;
XElement.ValueBox.BorderColor = Color.Lerp(AxisColorX, back, AxisGreyOutFactor);
XElement.ValueBox.BorderSelectedColor = AxisColorX; XElement.ValueBox.BorderSelectedColor = AxisColorX;
XElement.ValueBox.Category = Utils.ValueCategory.Angle;
YElement.ValueBox.BorderColor = Color.Lerp(AxisColorY, back, AxisGreyOutFactor);
YElement.ValueBox.BorderSelectedColor = AxisColorY; YElement.ValueBox.BorderSelectedColor = AxisColorY;
YElement.ValueBox.Category = Utils.ValueCategory.Angle;
ZElement.ValueBox.BorderColor = Color.Lerp(AxisColorZ, back, AxisGreyOutFactor);
ZElement.ValueBox.BorderSelectedColor = AxisColorZ; ZElement.ValueBox.BorderSelectedColor = AxisColorZ;
XElement.ValueBox.HighlightColor = AxisColorX;
XElement.ValueBox.Category = Utils.ValueCategory.Angle;
YElement.ValueBox.HighlightColor = AxisColorY;
YElement.ValueBox.Category = Utils.ValueCategory.Angle;
ZElement.ValueBox.HighlightColor = AxisColorZ;
ZElement.ValueBox.Category = Utils.ValueCategory.Angle; ZElement.ValueBox.Category = Utils.ValueCategory.Angle;
} }
} }
@@ -129,17 +128,19 @@ namespace FlaxEditor.CustomEditors.Editors
} }
if (XElement.ValueBox.Parent is UniformGridPanel ug) if (XElement.ValueBox.Parent is UniformGridPanel ug)
{
ug.SlotPadding = new Margin(3.0f, 0.0f, 0.0f, 0.0f);
CheckLayout(ug); CheckLayout(ug);
}
// Override colors // Override colors
var back = FlaxEngine.GUI.Style.Current.TextBoxBackground; var back = FlaxEngine.GUI.Style.Current.TextBoxBackground;
var grayOutFactor = 0.6f;
XElement.ValueBox.BorderColor = Color.Lerp(AxisColorX, back, grayOutFactor);
XElement.ValueBox.BorderSelectedColor = AxisColorX; XElement.ValueBox.BorderSelectedColor = AxisColorX;
YElement.ValueBox.BorderColor = Color.Lerp(AxisColorY, back, grayOutFactor);
YElement.ValueBox.BorderSelectedColor = AxisColorY; YElement.ValueBox.BorderSelectedColor = AxisColorY;
ZElement.ValueBox.BorderColor = Color.Lerp(AxisColorZ, back, grayOutFactor);
ZElement.ValueBox.BorderSelectedColor = AxisColorZ; ZElement.ValueBox.BorderSelectedColor = AxisColorZ;
XElement.ValueBox.HighlightColor = AxisColorX;
YElement.ValueBox.HighlightColor = AxisColorY;
ZElement.ValueBox.HighlightColor = AxisColorZ;
} }
/// <summary> /// <summary>

View File

@@ -37,25 +37,35 @@ namespace FlaxEditor.CustomEditors.Elements
public override ContainerControl ContainerControl => Panel; public override ContainerControl ContainerControl => Panel;
/// <summary> /// <summary>
/// Adds utility settings button to the group header. /// Add utility settings button to the group header.
/// </summary> /// </summary>
/// <returns>The created control.</returns> /// <returns>The created control.</returns>
public Image AddSettingsButton() public Image AddSettingsButton()
{
return AddHeaderButton("Settings", 0, Style.Current.Settings);
}
/// <summary>
/// Adds a button to the group header.
/// </summary>
/// <returns>The created control.</returns>
public Image AddHeaderButton(string tooltipText, float xOffset, SpriteHandle sprite)
{ {
var style = Style.Current; var style = Style.Current;
const float padding = 2.0f;
var settingsButtonSize = Panel.HeaderHeight; var settingsButtonSize = Panel.HeaderHeight;
Panel.HeaderTextMargin = Panel.HeaderTextMargin with { Right = settingsButtonSize + Utilities.Constants.UIMargin }; Panel.HeaderTextMargin = Panel.HeaderTextMargin with { Right = settingsButtonSize + Utilities.Constants.UIMargin };
; return new Image ; return new Image
{ {
TooltipText = "Settings", TooltipText = tooltipText,
AutoFocus = true, AutoFocus = true,
AnchorPreset = AnchorPresets.TopRight, AnchorPreset = AnchorPresets.TopRight,
Parent = Panel, Parent = Panel,
Bounds = new Rectangle(Panel.Width - settingsButtonSize, 0, settingsButtonSize, settingsButtonSize), Bounds = new Rectangle(Panel.Width - settingsButtonSize - xOffset, padding * 0.5f, settingsButtonSize - padding, settingsButtonSize - padding),
IsScrollable = false, IsScrollable = false,
Color = style.ForegroundGrey, Color = style.ForegroundGrey,
Margin = new Margin(1), Margin = new Margin(1),
Brush = new SpriteBrush(style.Settings), Brush = new SpriteBrush(sprite),
}; };
} }
} }

View File

@@ -70,9 +70,9 @@ namespace FlaxEditor.CustomEditors.GUI
UpdateSplitRect(); UpdateSplitRect();
} }
private void AutoSizeSplitter() private void AutoSizeSplitter(bool ignoreCustomSplitterValue = false)
{ {
if (_hasCustomSplitterValue || !Editor.Instance.Options.Options.Interface.AutoSizePropertiesPanelSplitter) if (_hasCustomSplitterValue && !ignoreCustomSplitterValue)
return; return;
Font font = Style.Current.FontMedium; Font font = Style.Current.FontMedium;
@@ -178,6 +178,21 @@ namespace FlaxEditor.CustomEditors.GUI
return base.OnMouseDown(location, button); return base.OnMouseDown(location, button);
} }
/// <inheritdoc />
public override bool OnMouseDoubleClick(Float2 location, MouseButton button)
{
if (button == MouseButton.Left && _splitterRect.Contains(location))
{
if (_splitterClicked)
EndTracking();
AutoSizeSplitter(true);
return true;
}
return base.OnMouseDoubleClick(location, button);
}
/// <inheritdoc /> /// <inheritdoc />
public override bool OnMouseUp(Float2 location, MouseButton button) public override bool OnMouseUp(Float2 location, MouseButton button)
{ {
@@ -220,6 +235,7 @@ namespace FlaxEditor.CustomEditors.GUI
// Refresh // Refresh
UpdateSplitRect(); UpdateSplitRect();
PerformLayout(true); PerformLayout(true);
if (Editor.Instance.Options.Options.Interface.AutoSizePropertiesPanelSplitter)
AutoSizeSplitter(); AutoSizeSplitter();
} }

View File

@@ -87,6 +87,7 @@ public class Editor : EditorModule
AddPlatformTools(options, platformToolsRoot, platformToolsRootExternal, "Android", "PLATFORM_TOOLS_ANDROID"); AddPlatformTools(options, platformToolsRoot, platformToolsRootExternal, "Android", "PLATFORM_TOOLS_ANDROID");
AddPlatformTools(options, platformToolsRoot, platformToolsRootExternal, "iOS", "PLATFORM_TOOLS_IOS"); AddPlatformTools(options, platformToolsRoot, platformToolsRootExternal, "iOS", "PLATFORM_TOOLS_IOS");
} }
AddPlatformTools(options, platformToolsRoot, platformToolsRootExternal, "Web", "PLATFORM_TOOLS_WEB");
// Visual Studio integration // Visual Studio integration
if (options.Platform.Target == TargetPlatform.Windows && Flax.Build.Platform.BuildTargetPlatform == TargetPlatform.Windows) if (options.Platform.Target == TargetPlatform.Windows && Flax.Build.Platform.BuildTargetPlatform == TargetPlatform.Windows)

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

@@ -407,7 +407,6 @@ namespace FlaxEditor
// Close splash and show main window // Close splash and show main window
CloseSplashScreen(); CloseSplashScreen();
Assert.IsNotNull(Windows.MainWindow);
if (!IsHeadlessMode) if (!IsHeadlessMode)
{ {
Windows.MainWindow.Show(); Windows.MainWindow.Show();

View File

@@ -151,6 +151,8 @@ namespace FlaxEditor
public SpriteHandle LocalizationSettings128; public SpriteHandle LocalizationSettings128;
public SpriteHandle Json128; public SpriteHandle Json128;
public SpriteHandle AppleSettings128; public SpriteHandle AppleSettings128;
public SpriteHandle Web128;
public SpriteHandle WebSettings128;
internal void LoadIcons() internal void LoadIcons()
{ {

View File

@@ -89,6 +89,11 @@ namespace FlaxEditor.GUI.Input
/// </summary> /// </summary>
public bool IsSliding => _isSliding; public bool IsSliding => _isSliding;
/// <summary>
/// The color of the highlight to the left of the value box.
/// </summary>
public Color HighlightColor;
/// <summary> /// <summary>
/// Occurs when sliding starts. /// Occurs when sliding starts.
/// </summary> /// </summary>
@@ -211,6 +216,12 @@ namespace FlaxEditor.GUI.Input
Render2D.DrawRectangle(bounds, style.SelectionBorder); Render2D.DrawRectangle(bounds, style.SelectionBorder);
} }
} }
if (HighlightColor != Color.Transparent)
{
var highlightRect = new Rectangle(-3.0f, 0.0f, 3.0f, Height);
Render2D.FillRectangle(highlightRect, HighlightColor);
}
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -292,10 +303,10 @@ namespace FlaxEditor.GUI.Input
return base.OnMouseDown(location, button); return base.OnMouseDown(location, button);
} }
#if !PLATFORM_SDL
/// <inheritdoc /> /// <inheritdoc />
public override void OnMouseMove(Float2 location) public override void OnMouseMove(Float2 location)
{ {
#if !PLATFORM_SDL
if (_isSliding && !RootWindow.Window.IsMouseFlippingHorizontally) if (_isSliding && !RootWindow.Window.IsMouseFlippingHorizontally)
{ {
// Update sliding // Update sliding
@@ -303,6 +314,7 @@ namespace FlaxEditor.GUI.Input
ApplySliding(Mathf.RoundToInt(slideLocation.X - _startSlideLocation.X) * _slideSpeed); ApplySliding(Mathf.RoundToInt(slideLocation.X - _startSlideLocation.X) * _slideSpeed);
return; return;
} }
#endif
// Update cursor type so user knows they can slide value // Update cursor type so user knows they can slide value
if (CanUseSliding && SlideRect.Contains(location) && !_isSliding) if (CanUseSliding && SlideRect.Contains(location) && !_isSliding)
@@ -319,8 +331,7 @@ namespace FlaxEditor.GUI.Input
base.OnMouseMove(location); base.OnMouseMove(location);
} }
#else #if PLATFORM_SDL
/// <inheritdoc /> /// <inheritdoc />
public override void OnMouseMoveRelative(Float2 motion) public override void OnMouseMoveRelative(Float2 motion)
{ {
@@ -346,7 +357,6 @@ namespace FlaxEditor.GUI.Input
base.OnMouseMoveRelative(motion); base.OnMouseMoveRelative(motion);
} }
#endif #endif
/// <inheritdoc /> /// <inheritdoc />

View File

@@ -93,6 +93,7 @@ namespace FlaxEditor.GUI
new PlatformData(PlatformType.PS5, icons.PS5Icon128, "PlayStation 5"), new PlatformData(PlatformType.PS5, icons.PS5Icon128, "PlayStation 5"),
new PlatformData(PlatformType.Mac, icons.MacOSIcon128, "macOS"), new PlatformData(PlatformType.Mac, icons.MacOSIcon128, "macOS"),
new PlatformData(PlatformType.iOS, icons.IOSIcon128, "iOS"), new PlatformData(PlatformType.iOS, icons.IOSIcon128, "iOS"),
new PlatformData(PlatformType.Web, icons.Web128, "Web"),
}; };
const float IconSize = 64.0f; const float IconSize = 64.0f;
@@ -120,7 +121,7 @@ namespace FlaxEditor.GUI
} }
// Select the first platform // Select the first platform
_selected = platforms[0].PlatformType; _selected = PlatformType.Web;
((Image)Children[0]).Color = _selectedColor; ((Image)Children[0]).Color = _selectedColor;
((Image)Children[0]).MouseOverColor = _selectedColor; ((Image)Children[0]).MouseOverColor = _selectedColor;
} }

View File

@@ -201,9 +201,8 @@ namespace FlaxEditor.GUI.Timeline
var idx = stream.ReadInt32(); var idx = stream.ReadInt32();
var id = stream.ReadGuid(); var id = stream.ReadGuid();
object value = null; object value = null;
if (version == 2) if (version <= 2)
stream.ReadCommonValue(ref value); throw new Exception("Not supported asset version. Open and re-save asset with Flax 1.11.");
else
value = stream.ReadVariant(); value = stream.ReadVariant();
Emitters[idx].ParametersOverrides.Add(id, value); Emitters[idx].ParametersOverrides.Add(id, value);

View File

@@ -180,6 +180,11 @@ namespace FlaxEditor
/// </summary> /// </summary>
public bool EnableCamera => _view != null && EnableBackground; public bool EnableCamera => _view != null && EnableBackground;
/// <summary>
/// True if enable grid drawing.
/// </summary>
public bool ShowGrid { get; set; } = true;
/// <summary> /// <summary>
/// Transform gizmo to use sync with (selection, snapping, transformation settings). /// Transform gizmo to use sync with (selection, snapping, transformation settings).
/// </summary> /// </summary>
@@ -387,19 +392,53 @@ namespace FlaxEditor
if (_mouseMovesWidget && _activeWidget.UIControl) if (_mouseMovesWidget && _activeWidget.UIControl)
{ {
// Calculate transform delta // Calculate transform delta
var resizeAxisAbs = _activeWidget.ResizeAxis.Absolute;
var resizeAxisPos = Float2.Clamp(_activeWidget.ResizeAxis, Float2.Zero, Float2.One);
var resizeAxisNeg = Float2.Clamp(-_activeWidget.ResizeAxis, Float2.Zero, Float2.One);
var delta = location - _mouseMovesPos; var delta = location - _mouseMovesPos;
// TODO: scale/size snapping? // TODO: scale/size snapping?
delta *= resizeAxisAbs;
// Resize control via widget // Resize control via widget
var moveLocation = _mouseMovesPos + delta; var moveLocation = _mouseMovesPos + delta;
var control = _activeWidget.UIControl.Control; var control = _activeWidget.UIControl.Control;
var uiControlDelta = GetControlDelta(control, ref _mouseMovesPos, ref moveLocation); var uiControlDelta = GetControlDelta(control, ref _mouseMovesPos, ref moveLocation);
control.LocalLocation += uiControlDelta * resizeAxisNeg;
control.Size += uiControlDelta * resizeAxisPos - uiControlDelta * resizeAxisNeg; // Transform delta to control local space
var rotation = GetTotalRotation(control) * Mathf.DegreesToRadians;
var cos = Mathf.Cos(rotation);
var sin = Mathf.Sin(rotation);
var localDeltaX = uiControlDelta.X * cos + uiControlDelta.Y * sin;
var localDeltaY = uiControlDelta.Y * cos - uiControlDelta.X * sin;
var localDelta = new Float2(localDeltaX, localDeltaY);
localDelta *= _activeWidget.ResizeAxis.Absolute;
// Calculate size change
var resizeAxisPos = Float2.Clamp(_activeWidget.ResizeAxis, Float2.Zero, Float2.One);
var resizeAxisNeg = Float2.Clamp(-_activeWidget.ResizeAxis, Float2.Zero, Float2.One);
var dSizeScaled = localDelta * resizeAxisPos - localDelta * resizeAxisNeg;
var scale = control.Scale;
var dSize = new Float2(
Mathf.Abs(scale.X) > Mathf.Epsilon ? dSizeScaled.X / scale.X : 0,
Mathf.Abs(scale.Y) > Mathf.Epsilon ? dSizeScaled.Y / scale.Y : 0);
// Apply size change
control.Size += dSize;
// Calculate location offset to keep the opposite edge stationary
// When PivotRelative is false, resizing keeps Top-Left (Location) constant,
// so we only need to slide back if we are resizing Left or Top edges.
if (!control.PivotRelative)
{
var pivotOffset = Float2.Zero;
if (_activeWidget.ResizeAxis.X < 0 && Mathf.Abs(dSize.X) > Mathf.Epsilon)
pivotOffset.X = -dSize.X * scale.X;
if (_activeWidget.ResizeAxis.Y < 0 && Mathf.Abs(dSize.Y) > Mathf.Epsilon)
pivotOffset.Y = -dSize.Y * scale.Y;
// Transform offset back to parent space and apply
var dLocationX = pivotOffset.X * cos - pivotOffset.Y * sin;
var dLocationY = pivotOffset.X * sin + pivotOffset.Y * cos;
var dLocation = new Float2(dLocationX, dLocationY);
control.LocalLocation += dLocation;
}
// Don't move if layout doesn't allow it // Don't move if layout doesn't allow it
if (control.Parent != null) if (control.Parent != null)
@@ -492,6 +531,8 @@ namespace FlaxEditor
// Draw background // Draw background
Surface.VisjectSurface.DrawBackgroundDefault(Editor.Instance.UI.VisjectSurfaceBackground, Width, Height); Surface.VisjectSurface.DrawBackgroundDefault(Editor.Instance.UI.VisjectSurfaceBackground, Width, Height);
if (ShowGrid)
{
// Draw grid // Draw grid
var viewRect = GetClientArea(); var viewRect = GetClientArea();
var upperLeft = _view.PointFromParent(viewRect.Location); var upperLeft = _view.PointFromParent(viewRect.Location);
@@ -504,6 +545,7 @@ namespace FlaxEditor
DrawAxis(Float2.UnitY, viewRect, min.Y, max.Y, pixelRange.Y); DrawAxis(Float2.UnitY, viewRect, min.Y, max.Y, pixelRange.Y);
Render2D.PopClip(); Render2D.PopClip();
} }
}
base.Draw(); base.Draw();
@@ -634,7 +676,7 @@ namespace FlaxEditor
// Draw sizing widgets // Draw sizing widgets
if (_widgets == null) if (_widgets == null)
_widgets = new List<Widget>(); _widgets = new List<Widget>();
var widgetSize = 10.0f; var widgetSize = 8.0f;
var viewScale = ViewScale; var viewScale = ViewScale;
if (viewScale < 0.7f) if (viewScale < 0.7f)
widgetSize *= viewScale; widgetSize *= viewScale;
@@ -685,7 +727,7 @@ namespace FlaxEditor
anchorRectSize *= viewScale; anchorRectSize *= viewScale;
// Make anchor rects and rotate if parent is rotated. // Make anchor rects and rotate if parent is rotated.
var parentRotation = controlParent.Rotation * Mathf.DegreesToRadians; var parentRotation = GetTotalRotation(controlParent) * Mathf.DegreesToRadians;
var rect1Axis = new Float2(-1, -1); var rect1Axis = new Float2(-1, -1);
var rect1 = new Rectangle(anchorUpperLeft + var rect1 = new Rectangle(anchorUpperLeft +
@@ -717,16 +759,24 @@ namespace FlaxEditor
} }
} }
private float GetTotalRotation(Control control)
{
if (control.Parent != null)
return control.Rotation + GetTotalRotation(control.Parent);
return control.Rotation;
}
private void DrawControlWidget(UIControl uiControl, ref Float2 pos, ref Float2 mousePos, ref Float2 size, float scale, Float2 resizeAxis, CursorType cursor) private void DrawControlWidget(UIControl uiControl, ref Float2 pos, ref Float2 mousePos, ref Float2 size, float scale, Float2 resizeAxis, CursorType cursor)
{ {
var style = Style.Current; var style = Style.Current;
var control = uiControl.Control; var control = uiControl.Control;
var rotation = control.Rotation; var rotation = GetTotalRotation(control);
var rotationInRadians = rotation * Mathf.DegreesToRadians; var rotationInRadians = rotation * Mathf.DegreesToRadians;
var rect = new Rectangle((pos + var position = (pos + new Float2(resizeAxis.X * Mathf.Cos(rotationInRadians) - resizeAxis.Y * Mathf.Sin(rotationInRadians),
new Float2(resizeAxis.X * Mathf.Cos(rotationInRadians) - resizeAxis.Y * Mathf.Sin(rotationInRadians), resizeAxis.Y * Mathf.Cos(rotationInRadians) + resizeAxis.X * Mathf.Sin(rotationInRadians)) * 4 * (scale < 0.7f ? scale : 1));
resizeAxis.Y * Mathf.Cos(rotationInRadians) + resizeAxis.X * Mathf.Sin(rotationInRadians)) * 10 * scale) - size * 0.5f, var halfSize = size * 0.5f;
size); // Keep at 0, 0 rect position until later to correctly render rotation.
var rect = new Rectangle(0, 0, size);
// Find more correct cursor at different angles // Find more correct cursor at different angles
var unwindRotation = Mathf.UnwindDegrees(rotation); var unwindRotation = Mathf.UnwindDegrees(rotation);
@@ -749,6 +799,10 @@ namespace FlaxEditor
default: break; default: break;
} }
} }
Render2D.PushTransform(Matrix3x3.Translation2D(position));
Render2D.PushTransform(Matrix3x3.RotationZ(rotationInRadians));
Render2D.PushTransform(Matrix3x3.Translation2D(-1 * halfSize));
if (rect.Contains(ref mousePos)) if (rect.Contains(ref mousePos))
{ {
Render2D.FillRectangle(rect, style.Foreground); Render2D.FillRectangle(rect, style.Foreground);
@@ -759,9 +813,14 @@ namespace FlaxEditor
Render2D.FillRectangle(rect, style.ForegroundGrey); Render2D.FillRectangle(rect, style.ForegroundGrey);
Render2D.DrawRectangle(rect, style.Foreground); Render2D.DrawRectangle(rect, style.Foreground);
} }
Render2D.PopTransform();
Render2D.PopTransform();
Render2D.PopTransform();
if (!_mouseMovesWidget && uiControl != null) if (!_mouseMovesWidget && uiControl != null)
{ {
// Collect widget // Collect widget
rect.Location = position - halfSize;
_widgets.Add(new Widget _widgets.Add(new Widget
{ {
UIControl = uiControl, UIControl = uiControl,

View File

@@ -754,6 +754,10 @@ namespace FlaxEditor.Modules
// Delete asset by using content pool // Delete asset by using content pool
FlaxEngine.Content.DeleteAsset(path); FlaxEngine.Content.DeleteAsset(path);
} }
else if (item is ScriptItem)
{
FlaxEngine.Content.DeleteScript(path);
}
else if (deletedByUser) else if (deletedByUser)
{ {
// Delete file // Delete file
@@ -901,7 +905,7 @@ namespace FlaxEditor.Modules
{ {
// Item doesn't exist anymore // Item doesn't exist anymore
Editor.Log(string.Format($"Content item \'{child.Path}\' has been removed")); Editor.Log(string.Format($"Content item \'{child.Path}\' has been removed"));
Delete(child, false); Delete(child);
i--; i--;
} }
else if (canHaveAssets && child is AssetItem childAsset) else if (canHaveAssets && child is AssetItem childAsset)
@@ -1188,6 +1192,7 @@ namespace FlaxEditor.Modules
Proxy.Add(new SettingsProxy(typeof(AndroidPlatformSettings), Editor.Instance.Icons.AndroidSettings128)); Proxy.Add(new SettingsProxy(typeof(AndroidPlatformSettings), Editor.Instance.Icons.AndroidSettings128));
Proxy.Add(new SettingsProxy(typeof(MacPlatformSettings), Editor.Instance.Icons.AppleSettings128)); Proxy.Add(new SettingsProxy(typeof(MacPlatformSettings), Editor.Instance.Icons.AppleSettings128));
Proxy.Add(new SettingsProxy(typeof(iOSPlatformSettings), Editor.Instance.Icons.AppleSettings128)); Proxy.Add(new SettingsProxy(typeof(iOSPlatformSettings), Editor.Instance.Icons.AppleSettings128));
Proxy.Add(new SettingsProxy(typeof(WebPlatformSettings), Editor.Instance.Icons.WebSettings128));
var typePS4PlatformSettings = TypeUtils.GetManagedType(GameSettings.PS4PlatformSettingsTypename); var typePS4PlatformSettings = TypeUtils.GetManagedType(GameSettings.PS4PlatformSettingsTypename);
if (typePS4PlatformSettings != null) if (typePS4PlatformSettings != null)

View File

@@ -325,7 +325,7 @@ namespace FlaxEditor.Modules.SourceCodeEditing
var codeEditor = options.SourceCode.SourceCodeEditor; var codeEditor = options.SourceCode.SourceCodeEditor;
if (codeEditor != "None") if (codeEditor != "None")
{ {
foreach (var e in Editor.Instance.CodeEditing.Editors) foreach (var e in _editors)
{ {
if (string.Equals(codeEditor, e.Name, StringComparison.OrdinalIgnoreCase)) if (string.Equals(codeEditor, e.Name, StringComparison.OrdinalIgnoreCase))
{ {
@@ -334,7 +334,10 @@ namespace FlaxEditor.Modules.SourceCodeEditing
} }
} }
} }
Editor.Instance.CodeEditing.SelectedEditor = editor; if (editor == null && _editors.Count != 0)
editor = _editors[0];
SelectedEditor = editor;
} }
/// <summary> /// <summary>

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

@@ -481,6 +481,8 @@ namespace FlaxEditor.Modules
/// <inheritdoc /> /// <inheritdoc />
public override void OnInit() public override void OnInit()
{ {
if (Editor.IsHeadlessMode)
return;
Editor.Windows.MainWindowClosing += OnMainWindowClosing; Editor.Windows.MainWindowClosing += OnMainWindowClosing;
var mainWindow = Editor.Windows.MainWindow.GUI; var mainWindow = Editor.Windows.MainWindow.GUI;

View File

@@ -758,6 +758,8 @@ namespace FlaxEditor.Modules
_windowsLayoutPath = StringUtils.CombinePaths(Globals.ProjectCacheFolder, "WindowsLayout.xml"); _windowsLayoutPath = StringUtils.CombinePaths(Globals.ProjectCacheFolder, "WindowsLayout.xml");
if (!Editor.IsHeadlessMode)
{
// Create main window // Create main window
var settings = CreateWindowSettings.Default; var settings = CreateWindowSettings.Default;
settings.Title = "Flax Editor"; settings.Title = "Flax Editor";
@@ -788,6 +790,7 @@ namespace FlaxEditor.Modules
// Link for main window events // Link for main window events
MainWindow.Closing += MainWindow_OnClosing; MainWindow.Closing += MainWindow_OnClosing;
MainWindow.Closed += MainWindow_OnClosed; MainWindow.Closed += MainWindow_OnClosed;
}
// Create default editor windows // Create default editor windows
ContentWin = new ContentWindow(Editor); ContentWin = new ContentWindow(Editor);

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