7014 Commits
Author SHA1 Message Date
xen2 b14ab0ddff Merge pull request #3554 from xen2/feature/gold-variants
Tests: gold variants for CPU rasterizers, and CompareGold stats
2026-10-10 18:05:02 +09:00
Virgile Bello a3b14d369e Tests: sidecars record pixels per diff, and a pass a threshold rule allowed saves its render
Diffs 0 to 15 are counted one by one, then by band 16-31, 32-63, 64-127, 128+. A pass against the lane's own gold with pixels at diff 3+ keeps its PNG, so CompareGold can tell the renders apart and turn them into variants. ForceSaveImageOnSuccess saves the PNG again.
2026-10-10 17:46:32 +09:00
Virgile Bello a5defce75f CompareGold: web UI shows gold variants under their image and diffs against the one the test matched
Promote can add a render as a variant, and deleting an image's gold deletes its variants.
2026-10-10 17:46:30 +09:00
Virgile Bello 20ee85ade0 Tests: gold variants for CPU rasterizers, a render passes when it matches any <name>.variantN.png of its bucket
Metadata records the CPU's vector features. CompareGold promote --add-variants adds a render from another CPU as a variant, and promote --source takes a normal CI run's failed renders.
2026-10-10 16:59:32 +09:00
Virgile Bello 3d11175177 CompareGold: stats verb, worst diffs seen per threshold rule across CI runs, per lane and CPU 2026-10-10 16:28:22 +09:00
Virgile Bello 0f569cd67b Tests: SpriteRenderer3DTests and TestLightShafts compare exactly, they render the same in every run
TesselationTest golds are refreshed for current Lavapipe and WARP; its thresholds stay, WARP and Lavapipe differ by a few wireframe pixels between CPU models.
2026-10-10 15:41:44 +09:00
Virgile Bello 6d1b13066f Engine.Tests: AnimatedModelTests compares exactly, the knight renders the same in every run 2026-10-10 15:41:44 +09:00
Virgile Bello 17aa80e8ca Rendering: opaque draws sort on keys that are the same in every run, not on object hash codes 2026-10-10 15:41:44 +09:00
Virgile Bello 05f55bde85 Tests: WARP 1.0.21, fixes a device loss with local reflections on Direct3D 11 2026-10-10 10:21:55 +09:00
Virgile Bello 72b092b7d9 Update the EmptyEditor startup baseline for the Starters template category 2026-10-10 09:50:54 +09:00
Virgile Bello 519906fd9c Tests: the vision gate uses Claude Sonnet 5.5, reasons before its verdict and ignores NuGet vulnerability warnings 2026-10-10 09:50:54 +09:00
Virgile Bello 462244d191 Tests: the editor screenshot vision gate tolerates NuGet vulnerability warnings in build logs 2026-10-10 01:56:02 +09:00
Sas van der WesthuizenandClaude Opus 5 de013d8034 feat: ask the graphics device what it provides, instead of comparing profiles (#3368)
Runtime checks now read `GraphicsDeviceFeatures` instead of comparing `GraphicsProfile` levels. A field says what Stride can use on this device with this backend: `false`/`None` when the backend does not implement it, even if the GPU supports it.

New fields:
- `HasIndex32Bits`
- `HasGeometryShaders`
- `HasPixelShaderUnorderedAccess` (Vulkan: `geometryShader` and `fragmentStoresAndAtomics`, now enabled at device creation when offered)

Vulkan now reports `FormatSupport` per format.

The device features are logged at device creation.

Fixes:
- D3D11 `CheckMipLevels` clamped mips on depth-stencil textures instead of the other textures.
- Vulkan refused 32-bit indices when the requested profile was 9_x.
- `LightShafts` throws a clear error without a shadow map renderer, instead of a `NullReferenceException` every frame.
- `VoxelRenderer` needs compute shaders and pixel-shader UAVs. It logs once and skips instead of throwing, and skips volumes whose voxelization or clipmap update method needs geometry shaders when the device has none.
- `ForwardRenderer` names the reason when it lowers the MSAA level. The iOS MSAA clamp is removed (it was for OpenGL ES).

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
2026-10-09 22:42:07 +09:00
Virgile Bello a48c9e0597 Release notes: the copied images link to the docs commit they were read from 2026-10-09 19:45:51 +09:00
Virgile Bello 8fbf61667b Release notes: the copied written notes leave out their contributor and changelog sections 2026-10-09 19:40:35 +09:00
Virgile Bello 6c53ebd5a8 Release notes: no empty highlights section in the run summary when the written notes are used 2026-10-09 19:19:57 +09:00
Virgile Bello fea2e66d27 Release notes: use the written release notes from stride-docs 2026-10-09 19:04:09 +09:00
Virgile Bello 1816f0bab4 Release notes: generate with Claude Opus 5.5 2026-10-09 18:43:34 +09:00
Virgile Bello 0ddd0f5e32 tests/comparator: read STRIDE_ANTHROPIC_API_KEY before ANTHROPIC_API_KEY
A developer can keep the key out of ANTHROPIC_API_KEY, which other tools
(Claude Code among them) pick up and bill. CI keeps the standard name.
2026-10-09 17:54:34 +09:00
icauro 5d933ff7b1 Presentation: keep the main window registered after hide and show (#3531)
WindowManager treated every hide event as a close. When the main window was hidden, MainWindow was cleared. When it was shown again, it was registered as a modal window, which disabled blocking windows such as progress windows for the rest of the session. In Game Studio, this locked the editor after a failed import.

A hidden main window now stays registered until it is destroyed, and it is not activated while hidden.
2026-10-09 13:12:07 +09:00
nicogo.ethandClaude Opus 5.5 ccbda65373 [Graphics] fix: RenderOutputDescription span constructor reads past a short span (#3529)
The constructor taking the render target formats as a span looped over all eight slots and
read past the end of any shorter span, throwing IndexOutOfRangeException.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-09 12:29:41 +09:00
nicogo.ethandClaude Opus 5.5 8d7e401cec [Physics] fix: Bepu debug wireframe artifacts on faces crossing the camera plane (#3525)
Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-09 12:28:32 +09:00
nicogo.ethandClaude Opus 5.5 a26a9a4e4f [Physics] feat: Debug render contact points and normals (#3526)
Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-09 12:27:53 +09:00
nicogo.ethandClaude Opus 5.5 7d685e8b46 [Physics] fix: MaxStepPerFrame now bounds steps per frame, -1 no longer freezes the simulation
The guard `stepCount < MaxStepPerFrame || MaxStepPerFrame != -1` did not depend
on stepCount: any cap other than -1 never bounded the loop, and -1 never ran a step.

Fixes #3522

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-08 16:50:38 +09:00
Jakub Ławreszuk 50a4cbeeab Adjust background for some card elements 2026-10-08 09:12:58 +09:00
nicogo.ethandClaude Fable 5.1 e0bc0a6fd5 Review: keep the enumeration index for the validation lookup, skip software adapters in one pass
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-07 10:33:37 +02:00
nicogo.ethandClaude Fable 5.1 5575f2733a Games: stop skipping the discrete GPU of a hybrid laptop
FindBestDevices skipped every adapter without a display output, to keep WARP and the Basic Render
Driver out. On a hybrid laptop every display is wired to the integrated GPU, so the discrete one -
sorted first by DXGI - had no output and was dropped, and every game ran on the integrated GPU.

The skip now tests what it meant: GraphicsAdapter.IsSoftwareAdapter (the DXGI software flag or the
Microsoft vendor id on Direct3D, the Cpu device type on Vulkan). When nothing survives, the search
runs again without the skip, so a machine with only a software adapter still gets one. Vulkan
enumerates the discrete GPU first, as DXGI's high-performance order already does on Direct3D.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-07 10:33:37 +02:00
Virgile Bello c1907ed971 Dev packages: the stub check reads the stamp files under the generator's mutex 2026-10-07 04:27:16 +02:00
Virgile Bello 5484b930da Dev packages: stubs import the checkout's build props/targets instead of copying them 2026-10-07 04:27:16 +02:00
xen2 5cefe91c1a Packages: load each package assembly once, in the right place (#3521)
* Packages: a package resolves a relative project path and loads its assemblies into the session's container

- Package: resolve a relative project path before loading it as an implicit package
- Packages: a package of a session loads its assemblies into the session's container whoever asks (UpdateAssemblyReferences after a failed first load used the process default one, so a dependent assembly bound to a second copy of its dependency next to itself and the serializer registry rejected it)

* Packages: a package assembly shares the assemblies the host ships and finds the native libraries next to it

- Packages: register the native libraries shipped next to a package assembly when loading it, so they resolve without a file location
- Packages: an assembly the host ships is shared with the packages that load it, never loaded a second time from the package
2026-10-06 16:49:26 +02:00
xen2 685a4f95f4 Editor: reliable assembly reload when editing game code (#3520)
* 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

* 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

* 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

* 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 16:49:12 +02:00
Jeremy PrittsandVirgile Bello ea1984dde7 Use dotnet format analyzers to fix some warnings (#3517)
Fixes from `dotnet format analyzers`:
- Add == / != to ColorHSV, NavigationMeshBuildSettings and ContactPoint
- VirtualFileSystemTests reads with ReadExactly
- IndexingDictionaryTests checks both Count and the enumerated pair

Co-authored-by: Virgile Bello <[email protected]>
2026-10-06 23:24:28 +09:00
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 1765f90a3c Packages: a package assembly shares the assemblies the host ships and finds the native libraries next to it
- Packages: register the native libraries shipped next to a package assembly when loading it, so they resolve without a file location
- Packages: an assembly the host ships is shared with the packages that load it, never loaded a second time from the package
2026-10-06 22:50:51 +09:00
Virgile Bello 2575cd06bc Packages: a package resolves a relative project path and loads its assemblies into the session's container
- Package: resolve a relative project path before loading it as an implicit package
- Packages: a package of a session loads its assemblies into the session's container whoever asks (UpdateAssemblyReferences after a failed first load used the process default one, so a dependent assembly bound to a second copy of its dependency next to itself and the serializer registry rejected it)
2026-10-06 22:50:50 +09:00
Virgile Bello dd9ebaf962 Launcher: version 6.0.4, setup adds a QuietUninstallString (msiexec /qr /norestart: winget doesn't elevate, /qn can't prompt for UAC), and /qr runs the quiet uninstall launcher/6.0.4 2026-10-06 17:11:08 +09:00
Virgile Bello ee455a6326 Launcher: version 6.0.3 launcher/6.0.3 2026-10-06 14:20:56 +09:00
Virgile Bello 3b5016e958 Launcher: the uninstall asks before removing the Stride versions, and is silent with /quiet (msiexec /qn, no desktop) 2026-10-06 14:19:47 +09:00
Jeremy Pritts e6a1481b4a Replace empty array field with collection expression 2026-10-06 04:43:33 +02:00
xen2 dd1244e3be Merge pull request #3433 from Kryptos-FR/feature/xplat/rename-projectcs
feat: rename WPF editors projects
2026-10-06 04:42:13 +02:00
Virgile Bello 91cac65c31 docs: fix renamed project name in registration.md 2026-10-06 11:11:44 +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 3bcd289efb Version: 4.5.0-beta01 2026-10-06 10:18:48 +09:00
github-actions[bot] a0fdf913e1 Samples: content version 4.4.3 (released samples/4.4.3) releases/4.4.0 2026-10-06 01:17:40 +00:00
Virgile Bello 866a57640b Version: 4.4.0 samples/4.4.3 2026-10-06 10:09:00 +09:00
Virgile Bello 53a58a7a15 Launcher: version 6.0.2 launcher/6.0.2 2026-10-05 23:53:09 +09:00
Virgile Bello 85f07184f4 Launcher release: no more -req package (6.0.1-req on NuGet takes the launchers before 6.0.1 to 6.0.1); the docs say the website download changes with the next website release 2026-10-05 23:52:56 +09:00