- 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
- 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
- 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
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).
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.
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.
- 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.
- 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.
- 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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.