Repository navigation
Conversation
On Stalker 2 (UE 5.5.4) the hooked draw function takes a TConstArrayView
of per-window args in a3, not FViewportInfo&, and a4 is not the other 5.5
variant either. The viewport was never found, so the UI was not moved to
its own layer and did not show in the headset.
When a4 is not the 5.5 variant, read a3 as {data, num} and take the
viewport of the first window, using the offsets UESDK reads from the code.
Every step checks for a live object: array data in the heap, window and
viewport with a vtable inside a module. The heap check keeps builds that
pass FViewportInfo& here on their old path, since its first field is a
vtable inside the image. There is no capacity after num; that word
measured 0 and must not be used as a bound.
Needs the UESDK change that adds sdk::slate::locate_windows_array_offsets.
Measured: UI shows on Stalker 2, no rejected frames over a session; The
Outer Worlds 2 (UE 5.4) keeps its FViewportInfo path.
Remleo
force-pushed
the
slate-windows-array
branch
from
September 22, 2026 12:05
c068241 to
9ec72e5
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This is a quick fix I made to get STALKER 2 (UE 5.5.4) working. You probably know a better way to solve this; I hope this PR at least helps point at the problem.
Depends on praydog/UESDK#3, which adds
sdk::slate::locate_windows_array_offsets. This PR doesnot bump the submodule, since the commit is not in your repository yet. It builds once that one is merged
and the submodule is updated.
On Stalker 2 (UE 5.5.4) the hooked draw function takes a
TConstArrayViewof per-window args ina3, notFViewportInfo&.a4does not match the other 5.5 variant either (a4[0] == renderer). So neither pathfound the viewport, the UI was never moved to its own layer, and nothing showed in the headset:
The change. When
a4is not the 5.5 variant, reada3as{data, num}and take the viewport of thefirst window, using the offsets UESDK reads from the code. After that it is the existing
slate_viewport->GetViewportRenderTargetTexture()path, nothing new.Each step checks for a live object and falls back to the old path if anything is off:
The heap check keeps builds that pass
FViewportInfo&ina3on their old path. There the first field is avtable inside the image, so the check rejects it before anything is dereferenced.
Beware of
num. There is no capacity after it, since this is an array view and not aTArray. My firstversion bounded
numby that word, measured it at 0 on some frames and dropped those frames. It is nowbounded by a constant (64 windows).
Tested
Release build, Quest 3 over Virtual Desktop, OpenXR, D3D12.
a3FViewportInfo&0xe8as before