817 Commits
Author SHA1 Message Date
Virgile Bello 9b2a53fc57 Editor: a project the opened solution does not hold is added to the script workspace on its own (MSBuildWorkspace.OpenProjectAsync), with the projects it references; the workspace opened the solution once, so the projects of a plugin added by Add plugin while a session is open were never found, their packages were never tracked, and editing their code offered no assembly reload until the next Game Studio start 2026-10-06 22:51:07 +09:00
Virgile Bello 6075d73250 Editor: undoing an assembly reload puts back the previous asset, assemblies and their categories
- Editor: replacing a whole asset during an assembly reload is undone by putting the previous asset back (AssetChangeOperation over AssetViewModel.UpdateAsset); it was recorded as a content change on the asset's root node, which holds no value, so undoing the reload of an asset whose own type was reloaded threw a NullReferenceException
- Editor: undoing an assembly reload puts the previous assemblies back into the session's container (AssemblyContainer.RemoveAssembly returns what it knew, RestoreAssembly takes it back); the container resolves what an assembly references through the assembly that asks, so a restored assembly that the container no longer held could not resolve its own dependencies
- Editor: an assembly loaded again by a reload takes back the categories it was registered with (AssemblyRegistry.GetCategories), instead of only the asset one; the Engine category comes from the assembly's module initializer, which runs once, so an assembly put back by an undo lost its content types and their asset pickers became read-only text
2026-10-06 22:51:06 +09:00
Virgile Bello 53eaadf608 Editor: an assembly reload converts the live objects and rebuilds the scene game content of every assembly it swaps
- Editor: the scene game's content references skip a node that cannot take the value, and content loaded before an assembly reload is built again instead of being pushed into a node of the new assembly; a reloaded type keeps its name but is a different type, so an object still waiting for the change propagator threw 'Can not convert value to the required type' in the middle of the content reload, leaving the assets being reloaded never completed
- Editor: an assembly reload converts the live objects of every assembly it swaps, instead of only those whose recorded path exists on disk; the objects of a skipped assembly kept types of the unloaded copy, and cloning their asset then found no serializer
2026-10-06 22:51:06 +09:00
Virgile Bello ac042b74dd Editor: overlapping builds queue, and the reload question waits for an open progress window
- Projects: builds queue on the shared MSBuild BuildManager (one build session at a time) instead of failing with 'a build is already in progress' when project loading, the debugging view's build or assembly reload and a restore overlap; a build canceled while queued does not start
- Editor: a delayed question waits while a progress window or a message box is up, instead of being asked on top of it (the assembly reload question landed on the Creating project window); WindowManager raises MainWindowUnblocked when the last one closes, which flushes the pending questions
2026-10-06 22:51:06 +09:00
Virgile Bello 0688aa6942 Merge branch 'master' into feature/xplat/rename-projectcs
# Conflicts:
#	docs/launcher/settings.md
#	sources/editor/Stride.Editor.Wpf/GraphicsDeviceLoss.cs
2026-10-06 11:11:42 +09:00
Virgile Bello cdbfb1b88b Launcher, VS extension: a project edited since its restore shows the Stride version written in it (csproj or Directory.Packages.props), one shared reader 2026-09-30 22:26:52 +02:00
Virgile Bello dd14309eb5 Graphics: temporary Direct3D11 present path for Direct3D12 (WARP DWM workaround)
With the pinned WARP 1.0.13+ (d3d10warp.dll), DWM crashes in a loop while a
Direct3D12 swap-chain presents on an indirect display (IDD) virtual monitor.
STRIDE_GRAPHICS_PRESENT_THROUGH_D3D11=1 renders into a shared back-buffer that a
Direct3D11 swap-chain copies and presents; the editor tests turn it on.

Stopgap only: remove it once the pinned WARP has a fix
(repro: https://github.com/xen2/warp-dwm-repro).
2026-09-28 02:13:25 +09:00
xen2 65045e2ae0 Merge pull request #3476 from xen2/fix/device-loss-clean-failure
A lost graphics device is a clean failure (remove lost device recovery)
2026-09-27 08:16:41 +09:00
Virgile Bello e2b82657b2 Graphics: the device reset recovery is removed
Nothing runs it: a lost device is a clean failure now, and its original reason,
the OpenGL ES context loss on Android, went with that backend. Gone are
ResumeManager, GraphicsResourceBase.Reload, OnRecreate, OnPause / OnResume,
Buffer.RecreateWith, GraphicsDevice.Recreate, the DeviceResetting / DeviceReset
events and the reload lambdas of the texture, buffer and font serializers.

Buffer.Recreate and Texture.Recreate stay (public, and the Direct3D 12
WriteDiscard rename uses them), as do OnDestroyed (the dispose path), the
presenters' OnRecreated (swapchain re-creation) and SimulateReset (test hook).

An existing device is only resized by ApplyChanges: another graphics profile,
or a failed resize, throws instead of re-creating the device in place
(IGraphicsDeviceFactory.ChangeOrCreateDevice becomes CreateDevice). The
resources of a device are destroyed by GraphicsDevice.Destroy instead of by
GameBase on DeviceDisposing.
2026-09-27 07:40:39 +09:00
Virgile Bello 95c1d95e76 Game Studio: a lost graphics device restarts the studio
The loss escaped BeginDraw on the game thread, outside the faulted-state catch,
and killed the process. It is adapter-wide: every editor game, the preview game
and the thumbnail device go with it, so no single game can be revived. The game
that sees it leaves its loop and raises EditorServiceGame.GraphicsDeviceLost;
the studio tells the user and restarts on the same session, with the usual save
prompt, keeping the open editors and the layout.
2026-09-27 06:14:42 +09:00
Virgile Bello 7fc0531b75 Game Studio: recent projects menu gets Open, Copy solution/folder path and icons 2026-09-27 05:58:23 +09:00
Virgile Bello f0ef86fed5 Game Studio: a session from the command line that does not load exits, instead of showing the project selection 2026-09-27 05:58:23 +09:00
Virgile Bello 6d50d062ab Script editor: remove a binding to a save command that does not exist 2026-09-26 04:22:31 +09:00
Virgile Bello 4a34898191 Data binding rethrower: binding messages are printed once 2026-09-26 04:22:29 +09:00
Virgile Bello 640639bb2f Game Studio: the asset view activates when a folder is selected 2026-09-26 04:22:27 +09:00
Virgile Bello aaa9539b72 Game Studio: fix binding errors in pane titles and tool panels
- Pane titles bind the dirty marker only for asset editors, and the tab
  highlight only inside tabs.
- Tool panels set their DataContext, so AvalonDock re-parenting does not give
  them the layout item.
2026-09-26 04:22:27 +09:00
Virgile Bello 77db88cb79 Asset view: fix binding errors
- Asset-only badges are in an asset template, so folder tiles no longer bind them.
- Renaming follows IsEditable: folders in a read-only package can no longer be renamed.
- The content no longer inherits the host's DataContext before AssetCollection is set.
- AssetContextMenu is typed as a ContextMenu.
- Toolbar icon menus no longer bind the icon size to its bitmap pixel size.
- Remove a debug Console.WriteLine.
2026-09-26 04:22:25 +09:00
Virgile Bello e717c5d5f3 Themes: the expander arrow and menu items no longer bind to an ancestor
- The property grid expander arrow no longer looks for a TreeViewItem.
- Menu items use fixed content alignments instead of binding them to the
  parent ItemsControl, which fails for menu items created before they are
  in a menu.
2026-09-26 04:22:24 +09:00
Virgile Bello dadc934765 Themes: remove Freezable warnings
WindowChrome binds its sizing properties to system parameters, so it can
never be frozen: UnfreezableWindowChrome skips the attempt and its warning.
The AvalonDock document floating window chrome now sets all of them, like
its sibling styles, so it can be frozen.
Theme styles use theme brushes instead of brushes built from DynamicResource
colors.
Remove the unused window button bitmaps.
2026-09-26 04:22:22 +09:00
Virgile Bello 8fdc269d52 Scene editor: loading texts blink only while shown 2026-09-26 04:22:21 +09:00
Virgile Bello 0f43ca1a13 Scene and prefab editors: bind the editor UI only once the scene is initialized 2026-09-26 04:22:19 +09:00
Virgile Bello 6c79157b69 Asset preview: the first fit uses the laid-out preview area size 2026-09-26 04:22:18 +09:00
Virgile Bello 74009f5385 Asset preview: zoom and fit run on the game thread 2026-09-26 04:22:16 +09:00
Virgile Bello fc9ab78571 Editor tests: fail on Game Studio crashes
Game Studio exits with a non-zero code after reporting a crash. The screenshot
test fails on a new crash report and on a baseline frame with no capture, and
keeps the logs of a failed fixture.
2026-09-26 02:44:23 +09:00
Virgile Bello 532c433554 Editor: fallback effects draw the untessellated mesh 2026-09-24 15:53:59 +09:00
Nicolas Musset 0016737cd5 Merge branch 'master' into feature/xplat/rename-projects 2026-09-23 18:38:28 +02:00
Virgile Bello 53ca650ee0 Editor tests: WaitIdle waits for the initial editors before draining the queues
Game Studio opens the default scene after its window is loaded. A fixture that
called WaitIdle right after the window appeared found empty queues and no
editor game, and took its screenshot while the scene was still loading.
GameStudioWindow exposes that startup task, the harness awaits it first.
2026-09-23 15:34:04 +09:00
Virgile Bello 8d29706c4e Editor: a thumbnail render is a device frame
The thumbnail generator drew without GraphicsDevice.Begin()/End(). On Direct3D12
and Vulkan, End() advances the frame fence and releases the deferred resources
of the frame (discarded dynamic buffers, upload buffers), so every thumbnail
leaked them until the device was disposed. With WARP on a CI runner, one project
load was enough to run out of memory and lose the device.

The status overlay helper had the same pattern, and created a GraphicsContext
(with its command list) per use without disposing it.
2026-09-23 15:34:00 +09:00
Virgile Bello 8b95f57489 Graphics: a lost device is logged, and a failed re-creation no longer crashes
Direct3D12 logged the removal reason only on a debug device, and polling the
status after a failed re-creation dereferenced the null native device.
GraphicsDeviceManager swallowed the exceptions of a failed presenter resize
and of a failed re-creation. The editor test host writes the warnings and
errors of the global logger to its diag log and to stderr.
2026-09-23 15:33:59 +09:00
Virgile Bello e50c3e334a Editor tests: Game Studio also runs on Direct3D12 and Vulkan in CI
The test host gets the same per-API assembly layout as Game Studio and picks the
API from STRIDE_GRAPHICS_API at startup. The workflow runs the fixtures once per
API (Direct3D11, Direct3D12, Vulkan); the Vulkan job uses Lavapipe with the
validation layers, without synchronization validation: on the 4-core runner it
starves the asset build and the fixtures time out. The games the fixtures build
stay on Direct3D11. A manual run can pick one API.

The Windows Vulkan setup (SDK, validation layer, Lavapipe ICD) becomes a
composite action shared with the game and enduser workflows.
2026-09-23 15:33:58 +09:00
Virgile Bello ca26cb1416 Editor tests: the harness waits for the Game Studio async close before shutdown 2026-09-22 14:20:30 +09:00
Virgile Bello 91486f4b7e Editor: the thumbnail device outlives the running thumbnail command
Closing a session disposed the thumbnail graphics device while a build thread
was still inside a thumbnail command. On Vulkan that was an access violation
in vkCreateImage on a destroyed device.

The close path now awaits the running command without blocking the UI thread.
Dispose never blocks: if a command still runs, the resources are destroyed
when it ends.
2026-09-22 14:20:30 +09:00
Nicolas Musset ff09df9b1f Merge branch 'master' into feature/xplat/rename-projectcs 2026-09-21 17:23:34 +02:00
Virgile Bello e208935f46 assets: the upgrade dialog is asked once, before anything is written
The source migration ran before the dialog, so the backup opt-out and Skip were ignored. The backup choice is made in the first dialog and covers the whole upgrade; later dialogs show it greyed out.

Fixes #3452
2026-09-21 01:27:47 +09:00
Jeremy Pritts 765c7fb89c Update templates and sample code to better support pausing (#3355)
Samples and templates: gameplay follows the time factor, camera and UI don't

Timers, cooldowns, speeds and animation now use UpdateTime.WarpElapsed, so they
stop when Factor is 0, like physics and particles already did. Camera, input and
UI keep UpdateTime.Elapsed.

The animation scripts also read UpdateTime instead of DrawTime, which is the
clock the engine's own animation system uses.

Removes the unused BasicCameraController from ThirdPersonPlatformer.
2026-09-20 18:12:17 +09:00
Virgile Bello 15d401e156 Samples: the content version lives in StrideSamplesVersion.props, not SharedAssemblyInfo.cs
A samples release no longer rebuilds every assembly: Stride.Assets embeds the file as a resource, outside its reference assembly.
2026-09-19 11:35:53 +09:00
xen2 81ba14ed64 Merge pull request #3445 from ds5678/fix-asset-registry
Fix types not being removed from AssetRegistry when assembly unregistered
2026-09-18 22:51:32 +09:00
Virgile Bello ef493c71d4 Editor: the assembly reload passes its log to LoadAssemblyFromPath, so an exception thrown while loading the new assembly (a module initializer failing to register it) is reported instead of only the null assembly that follows 2026-09-18 22:05:38 +09:00
Virgile Bello d92beed9da Templates: show content downloads in the New Project windows 2026-09-18 12:05:25 +09:00
Virgile Bello 75497567c4 Samples: version the content template packs separately from the engine 2026-09-18 09:15:19 +09:00
Nicolas Musset 783ac76001 Merge branch 'master' into feature/xplat/rename-projects 2026-09-16 10:25:02 +02:00
Virgile Bello 482ceb7a4d Tools: roll forward to the next .NET major when their own is not installed 2026-09-15 17:49:36 +09:00
Virgile Bello b180704a79 GameStudio: re-execute on the .NET major the session needs, one restart primitive for every restart path
Also a per-install taskbar identity for the re-executed process, the runtime in the window and progress titles, and the runtime version in crash reports.
2026-09-15 17:49:30 +09:00
Virgile Bello 519eb16f4d GameStudio: root assets default to the asset's package, with a per-package submenu 2026-09-15 16:00:19 +09:00
Nicolas Musset 958268bd01 feat: move Stride.Assets.Presentation.Wpf 2026-09-13 12:32:15 +02:00
Nicolas Musset 65421f96a7 feat: move Stride.Editor.Wpf 2026-09-13 12:32:11 +02:00
Nicolas Musset 6767a12966 feat: move Stride.Core.Assets.Editor.Wpf 2026-09-13 12:32:04 +02:00
Nicolas Musset 8cc3d8dea1 feat: move Stride.Core.Translation.Presentation.Wpf 2026-09-13 03:07:03 +02:00
Nicolas Musset 3cdb5dde90 feat: move Stride.Core.Presentation.Wpf.Graph 2026-09-13 03:06:59 +02:00
Nicolas Musset 639bb46a71 feat: move Stride.Core.Presentation.Wpf.Dialogs 2026-09-13 03:06:56 +02:00