fix(client): restore retail interaction parity
Harden keyboard and camera routing, inventory and vendor interactions, chat/emotes, relog portal flow, and paperdoll rendering. Add retail research, connected gate coverage, and release-gate validation.
This commit is contained in:
parent
0c699240e0
commit
f6fe0f2a4f
151 changed files with 10162 additions and 1211 deletions
|
|
@ -94,6 +94,11 @@ internal sealed class PrivateEntityViewportRenderer :
|
|||
/// feature does not exist for them, not just "unused".</summary>
|
||||
private readonly EntitySlot? _backdropSlot;
|
||||
|
||||
// One stable sampled texture-table slot is part of the retained viewport's
|
||||
// presentation contract. Rotating the slot with the Vulkan flight index
|
||||
// made the UI sample a freshly-created/cleared sibling after world reveal.
|
||||
// The frame submission order already protects this target's write -> sample
|
||||
// transition; keep its identity stable until resize or disposal.
|
||||
private IGpuRenderTarget? _target;
|
||||
private IGpuSampler? _sampler;
|
||||
private GpuTextureSlot _slot = GpuTextureSlot.Unassigned;
|
||||
|
|
@ -170,6 +175,29 @@ internal sealed class PrivateEntityViewportRenderer :
|
|||
|
||||
public void SetEntity(WorldEntity? entity) => _mainSlot.Set(entity);
|
||||
|
||||
/// <summary>
|
||||
/// Advances the private entity's mesh and texture-composite readiness
|
||||
/// without allocating or clearing a render target. Paperdoll uses this
|
||||
/// while its tab is hidden so first-open work is already resident.
|
||||
/// </summary>
|
||||
public bool Prepare()
|
||||
{
|
||||
if (!_mainSlot.PrepareForDraw()
|
||||
|| !(_backdropSlot?.PrepareForDraw() ?? true))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
WorldEntity? entity = _mainSlot.Entity;
|
||||
if (entity is null || entity.MeshRefs.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
IReadOnlyList<WorldEntity> entities = BuildDrawEntities(
|
||||
_backdropSlot?.Entity,
|
||||
entity);
|
||||
return _dispatcher.PreparePrivateEntityResources(entities);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets or clears the environment backdrop entity drawn BEHIND the main
|
||||
/// entity — GF-7/GF-14's fix, retail's <c>gmCG3DView::m_pbgObject</c>. Only
|
||||
|
|
@ -219,6 +247,16 @@ internal sealed class PrivateEntityViewportRenderer :
|
|||
if (entity is null || entity.MeshRefs.Count == 0 || width <= 0 || height <= 0)
|
||||
return 0u;
|
||||
|
||||
IReadOnlyList<WorldEntity> drawEntities = BuildDrawEntities(
|
||||
_backdropSlot?.Entity,
|
||||
entity);
|
||||
if (!_dispatcher.PreparePrivateEntityResources(drawEntities))
|
||||
{
|
||||
return _hasRenderedScene && _slot.IsAssigned
|
||||
? UiTextureTableHandle.FromSlot(_slot)
|
||||
: 0u;
|
||||
}
|
||||
|
||||
EnsureRenderTarget(width, height);
|
||||
if (_target is null)
|
||||
return 0u;
|
||||
|
|
@ -254,7 +292,6 @@ internal sealed class PrivateEntityViewportRenderer :
|
|||
|
||||
UploadCreatureLight();
|
||||
|
||||
IReadOnlyList<WorldEntity> drawEntities = BuildDrawEntities(_backdropSlot?.Entity, entity);
|
||||
var entries =
|
||||
new (uint, Vector3, Vector3, IReadOnlyList<WorldEntity>,
|
||||
IReadOnlyDictionary<uint, WorldEntity>?)[]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue