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.
ImageSharpTexLib only handles 8-bit BGRA/RGBA but claimed every non-Nearest
rescale, so Lanczos3 on R16G16B16A16_Float or R16_Float threw. Since the
FreeImage removal no other library implements Lanczos3, so TextureTool now
falls back to Bicubic (DirectXTex) for formats ImageSharp cannot process.
build/tools/Stride.TestSuites prints the suites a test filter can hit, or the
ones an explicit project list names. It parses each suite's sources with
Roslyn for test methods and evaluates the filter on them with vstest's own
engine. When unsure (no filter, bad filter, no match) it answers every suite.
With --slnf it writes a solution filter narrowed to those suites.
Stride.Tests.Combined takes -p:StrideCombinedSuites="<name> <name>" to bundle
only those suites.
Adds OpenAssetEditor + WaitForSyntaxHighlighting to the AutoTesting harness,
a comparison preset that tolerates script text but flags missing syntax
highlighting, and the dpi100 baseline (xen2 CI run 28671029922).
Resolve launcher (Avalonia) vs WPF conflicts; take master's xunit runner; add Stride.Cli to launcher solution; implement multi-checkbox dialog for Avalonia.
The bare Stride assembly held the API-agnostic graphics/rendering
foundation (Image, PixelFormat, ParameterCollection, media interfaces),
not the engine, so the name was misleading. Renaming it frees the
Stride id and clarifies the layering. Bumps the binary serialization
format version since the assembly identity changed.
Test projects now set <TargetFramework(s)> from props-time sets (StrideTestTargetFrameworks
[/MacOS]) computed from StrideTestPlatforms, instead of the targets-time expansion in the
Tests SDK. TargetFrameworks are identical across platform configs (verified); the literal
element makes Roslyn MSBuildWorkspace tooling treat tests as SDK-style. Tests that already
declared a TargetFramework are untouched.
- ObservableCollection<TestNodeViewModel> so async discovery surfaces in the tree
- Tap (not press) drives drill-in so touch-scroll doesn't swap pages
- TreeView row shows method name only; filter still matches the full name
- Desktop-only filter auto-focus (no soft-keyboard pop on mobile)
- Qualify Application as Avalonia.Application to avoid Android.App clash
MainActivity reads Intent xunit_command=run and sets App.HeadlessMode; the
single-view branch awaits discovery, runs the assembly via RunTestsAsync,
and exits with FailedCount. Discovery runs on a background task so Android
doesn't ANR. trx/test root live in FilesDir (targetSdk 30+ scoped storage).
Multi-target xunit.runner.stride for net10.0-android with an Avalonia
activity entry; the Tests SDK packages test projects as APKs. Re-derive
StrideGraphicsApi to Vulkan and pin RuntimeIdentifier=android-x64 for
mobile, gate per-RID inner builds (StrideHostGraphicsApi decouples
build-host from device API), and collapse MainActivity onto
AvaloniaMainActivity<App>.
ASTC superseded ETC2 on Android/iOS for compressed sprite output, leaving
PVRTT (the ETC2/PVRTC encoder) with no callers. Drops:
- deps/PVRTT/ (~10 binaries + headers + license)
- Stride.TextureConverter.TexLibraries.PvrttTexLib + its C# wrapper layer
- Stride.TextureConverter.Tests.PvrttTexLibTest
- PVRTexLib preload in TextureTool
ETC* / EAC* PixelFormat entries stay in the enum for backward compatibility
with already-built content. There is just no encoder for them anymore.
DetermineOutputFormat Level_9_x branch (pre-Vulkan GLES 2.0 era) now falls
back to uncompressed R8G8B8A8 instead of ETC1; the path is effectively dead
for a Vulkan-targeted engine.
TextureTool's static ctor still PreloadLibrary'd "DxtWrapper" — eager
load failed with DllNotFoundException before any P/Invoke could fire.
Renamed to "stride_directxtex" to match the actual lib filename.
Added a non-skipped Fact in DxtTexLibTest: load+convert+save round-trip
on an existing fixture. Exercises native lib loading, P/Invoke
marshalling, struct layout, and the DDS encode path end-to-end — caught
the preload-name regression above.
Replace the FreeImage-backed FITexLib with a managed ImageSharpTexLib for
common bitmap I/O and pixel-space operations (rescale, flip, R/B swap,
gamma, sub-image swap). Operates on Image<Bgra32>; supports B8G8R8A8 /
R8G8B8A8 and their SRgb/Typeless variants. Rescale-filter mapping:
Bilinear -> Triangle, BSpline -> Spline; others 1:1. Gamma matches
FreeImage's out = 255 * (in/255)^(1/gamma).
With no remaining consumers, fully remove the Stride.FreeImage project,
the deps/FreeImage native bundle, and the Stride.csproj reference left
over from the StandardImageHelper migration. Drop libfreeimage-dev from
the Linux CI job and the FreeImage-era "BMP save not supported on Linux"
test skips (ImageSharp is cross-platform). Refresh THIRD PARTY.md.
Brief Anthropic overload was surfacing as fake drift regressions in the
screenshot suite. Retry up to 3x with 2s/4s backoff; on persistent failure
the message says 'unavailable, retry the run' so operators don't chase a
phantom drift.
Adds support for committing multiple acceptable variants of a frame as
'<frame>.<tag>.png' siblings of the canonical '<frame>.png' baseline.
LPIPS picks the closest match across the variant set (best-of); the
Claude vision fallback receives all variants in one request and is asked
whether the capture is consistent with the demonstrated variance range.
Single-baseline path is unchanged.
Adds an overrideable record-based prompt builder (ComparisonPrompt with
sealed Gameplay/Editor variants, each carrying its own tolerance and
regression-trigger toggles plus a curated static Default). Threads the
prompt through ClaudeVisionFallback.Compare and ScreenshotComparator's
new defaultPrompt parameter. Existing samples flow keeps the gameplay
preset as the default; editor flow can opt into EditorComparisonPrompt.
Move the LPIPS / Claude vision comparator out of samples/Tests/Comparator/
into sources/tests/Stride.ScreenshotComparator/ so other test pipelines
(notably the GameStudio AutoTesting fixtures in tests/editor/) can reuse
it via ProjectReference. Namespace renamed Stride.SampleScreenshotComparator
to Stride.Tests.ScreenshotComparator. The lpips_alex.onnx model propagates
to consumers' bins via <None CopyToOutputDirectory>.
samples/Tests/Stride.Samples.Tests.csproj drops its inline OnnxRuntime +
ImageSharp PackageRefs and the explicit model <None> item — all come
transitively from the shared lib now. SampleScreenshotTests.cs uses the
new namespace and lets the comparator default to AppContext.BaseDirectory
for model lookup.
Stride.sln update is intentionally deferred — bundle it with the AutoTesting
sln entry when those land together.
Copies the ViewModelBase implementation from Stride.Core.Presentation (minus
IDestroyable/IViewModelServiceProvider) so the runner has no external MVVM
dependency. Renames SetProperty → SetValue to match Stride's API.
The Avalonia UI used to fire whenever STRIDE_TESTS_GPU=1, conflating the
GPU-vs-software backend choice with whether to launch the runner UI.
Now keyed off STRIDE_TESTS_INTERACTIVE=1; Test Explorer / dotnet test /
CI all bypass our Main entirely and stay headless.
Each test project's launchSettings.json gets four profiles: Software/GPU
each in (console) and (interactive) variants. Default first profile is
Software (console), so F5 from VS runs xunit in-process via
XunitFrontController + a console-printing sink and exits with status —
matches what direct exe invocation produces under dotnet test.
Projects no longer use `<Project Sdk="Stride.Build.Sdk">`. Every .csproj
now imports SDK props/targets directly from source:
<Project>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove(...))\sdk\...\Sdk.props" />
...
<Import Project="$(StrideRoot)sources\sdk\...\Sdk.targets" />
</Project>
The props import uses GetDirectoryNameOfFileAbove (no pre-set property
needed) and the targets import uses $(StrideRoot) (safe after the SDK
chain is loaded).
SDK internal cross-references (Editor and Tests SDKs) now use
$(MSBuildThisFileDirectory) relative paths instead of the Sdk= resolver.
Other changes:
- global.json: msbuild-sdks entries commented out
- nuget.config: stride-sdks source and packageSourceMapping commented out
- .github/actions/build-sdk: removed (no longer a prerequisite)
- build/compile.bat: removed SDK build step
- sources/Directory.Build.props: replaced TODO with explanatory comment
- build/docs/SDK-GUIDE.md: added direct-import section and revert guide
- sources/sdk/README.md: new file explaining import modes and revert steps
To revert to full-SDK mode: build SDK packages, uncomment global.json
and nuget.config entries, restore <Project Sdk="..."> opening tags, and
revert the four SDK internal files. See sources/sdk/README.md.