fix: complete retail parity stability pass
This commit is contained in:
parent
d3df4cb20a
commit
f7aa8e0eb7
131 changed files with 7765 additions and 1190 deletions
|
|
@ -264,11 +264,8 @@ public sealed unsafe partial class EnvCellRenderer
|
|||
{
|
||||
MdiDrawRange drawRange = _mdiDrawRanges[drawRangeIndex];
|
||||
int groupIndex = drawRange.GroupIndex;
|
||||
var cullMode = (CullMode)(groupIndex % 4);
|
||||
// Phase A8 visual-gate evidence: cell meshes use CullMode.Landblock
|
||||
// uniformly, but the room surfaces need to be visible from inside.
|
||||
// Render cell polys double-sided, exactly as the GL arm does.
|
||||
if (cullMode == CullMode.Landblock) cullMode = CullMode.None;
|
||||
CullMode cullMode = ResolveRetailCellShellCullMode(
|
||||
(CullMode)(groupIndex % 4));
|
||||
|
||||
bool isAdditive = groupIndex >= 4;
|
||||
IGpuPipeline rangeBasePipeline = isAdditive
|
||||
|
|
@ -361,9 +358,8 @@ public sealed unsafe partial class EnvCellRenderer
|
|||
for (int drawRangeIndex = 0; drawRangeIndex < _mdiDrawRanges.Count; drawRangeIndex++)
|
||||
{
|
||||
MdiDrawRange drawRange = _mdiDrawRanges[drawRangeIndex];
|
||||
var cullMode = (CullMode)(drawRange.GroupIndex % 4);
|
||||
if (cullMode == CullMode.Landblock)
|
||||
cullMode = CullMode.None;
|
||||
CullMode cullMode = ResolveRetailCellShellCullMode(
|
||||
(CullMode)(drawRange.GroupIndex % 4));
|
||||
SetCullMode(encoder, cullMode);
|
||||
pushConstants.DrawIdOffset = drawRange.FirstCommand;
|
||||
encoder.SetPushConstants(in pushConstants);
|
||||
|
|
@ -417,6 +413,25 @@ public sealed unsafe partial class EnvCellRenderer
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resolves a CellStruct polygon's DAT <c>sides_type</c> to the render
|
||||
/// state used by retail's constructed EnvCell mesh. The similarly named
|
||||
/// <see cref="CullMode"/> values on <c>Polygon.SidesType</c> are not GPU
|
||||
/// cull states: 0 emits the positive face, 1 emits that face twice with
|
||||
/// reversed indices, and 2 emits the positive and negative surface.
|
||||
/// <c>D3DPolyRender::ConstructMesh @ 0x0059DFA0</c> performs that geometry
|
||||
/// expansion, then every subset is drawn with <c>D3DCULL_CW</c> through
|
||||
/// <c>RenderMeshSubset @ 0x0059CA10</c>. <see cref="MeshExtractor"/>
|
||||
/// already performs the identical expansion, so every shell batch must
|
||||
/// cull clockwise here. Returning <see cref="CullMode.None"/> for DAT 0
|
||||
/// was #178's Phase-A8 double-sided stopgap.
|
||||
/// </summary>
|
||||
internal static CullMode ResolveRetailCellShellCullMode(CullMode sidesType)
|
||||
{
|
||||
_ = sidesType;
|
||||
return CullMode.Clockwise;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reserves this frame's ring, copies into it, and binds the slice. A
|
||||
/// logically empty section still reserves one element so the bound range is
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue