fix(rendering): carry retail SetSurface state to detail draws
Resolve exact SetSurface blend, alpha-test, and fog state once during extraction and preserve it through recipe-10 prepared payloads, Wb/EnvCell command data, Vulkan pipelines, push constants, and both ordinary/atmospheric one-pass shaders. Preserve AP-240 Wb pure-Clip immediate opaque/A2C while EnvCell uses retail premultiplied Clip; detail-off routing remains unchanged. Correct AP-232 and register the remaining detail-off state divergence. Mutation first failures (all restored): - raw Add->SRCALPHA/ONE: WalkStaticStreamPopulatorTests.ImmediateBuildingDetail_UsesExactResolvedSetSurfaceState line 1278, expected wb-mesh-raw-additive-1x. - inverse-add->alpha-add: same test line 1278, expected wb-mesh-inverse-additive-1x. - remove Env inverse: EnvCellAlphaDrawSourceTests.DetailOn_EveryEnvCellFamilyDrawsOnceInPlaceWithAuthoredOpacity line 132, expected envcell-inverse. - raw IsAdditive precedence: same test line 132, Translucent|Clip|Additive expected envcell-alpha. - Wb paletted ParamB=0: OrderPreservingSubmitterTests line 333, expected 0.392156869. - Wb DDS ParamB=0.05: same test line 333, expected 0.784313738. - disable Alpha+Clip test: WalkStaticStreamPopulatorTests line 1286, expected 0.784313738. - always fog raw Add: same test line 1287, expected no-fog true. - disable fog non-Add: same test line 1287, expected no-fog false. - X=a*qA: RetailDetailTextureContractTests line 261, shared squared-alpha substring absent. - X includes base alpha: same test line 262, forbidden baseTexel.a present. - CLIP uses 0.05: EnvCellAlphaDrawSourceTests.ClipShaders_UseGreaterEqualForThePerRangeReference line 367. - second detail draw: EnvCell detail-on line 131, collection contained 2 draws. - straight-alpha substitute: Wb immediate line 1278, expected wb-mesh-additive-1x. - omit ordered detail arm: OrderPreservingSubmitterTests line 318, expected (77,3.5), got (0,0). - omit atmospheric combine: RetailDetailTextureContractTests line 260, shared include absent. - drop serialized opacity: ObjectMeshDataSerializerTests line 292, expected opacity bits, got 1.0. - stale detail arm: atmospheric adjacency line 402, expected slot 0, got 77. - per-frame surface map: EnvCell warmed allocation line 285, expected 0 B, got 204800 B.
This commit is contained in:
parent
75664805f8
commit
15ed57a1e7
44 changed files with 1154 additions and 187 deletions
|
|
@ -8,7 +8,9 @@ using AcDream.App.Rendering.Gpu.Vk;
|
|||
using AcDream.App.Rendering.Wb;
|
||||
using AcDream.App.Tests.Rendering.Gpu;
|
||||
using AcDream.Content;
|
||||
using AcDream.Core.Meshing;
|
||||
using Chorizite.Core.Render.Enums;
|
||||
using DatReaderWriter.Enums;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using CullMode = DatReaderWriter.Enums.CullMode;
|
||||
|
||||
|
|
@ -21,6 +23,11 @@ namespace AcDream.App.Tests.Rendering;
|
|||
/// </summary>
|
||||
public sealed class EnvCellAlphaDrawSourceTests
|
||||
{
|
||||
private static readonly Vector4 MaterialBase = new(0.31f, 0.57f, 0.83f, 0.19f);
|
||||
private static readonly Vector3 MaterialDiffuse = new(0.73f, 0.41f, 0.67f);
|
||||
private static readonly Vector4 MaterialDetail = new(0.91f, 0.23f, 0.49f, 0.62f);
|
||||
private static readonly Vector4 MaterialDestination = new(0.17f, 0.37f, 0.71f, 0.29f);
|
||||
|
||||
/// <summary>
|
||||
/// Canonical F4180104 surface 08000BFF's pure Base1ClipMap mask 0x08
|
||||
/// reaches CLIP while alpha-family 0x02 reaches ALPHA. Mutation check:
|
||||
|
|
@ -75,26 +82,45 @@ public sealed class EnvCellAlphaDrawSourceTests
|
|||
DrawPipelineNames(fixture.Device));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(0, "envcell-opaque", 0f)]
|
||||
[InlineData(1, "envcell-alpha", 0f)]
|
||||
[InlineData(2, "envcell-additive", 0f)]
|
||||
[InlineData(3, "envcell-clip", 200f / 255f)]
|
||||
[InlineData(4, "envcell-clip", 100f / 255f)]
|
||||
public void DetailOn_EveryEnvCellFamilyDrawsOnceInPlaceWithAuthoredOpacity(
|
||||
int specIndex,
|
||||
string expectedPipeline,
|
||||
float expectedReference)
|
||||
public static TheoryData<SurfaceType, bool, string, object, float, bool> ExactMaterialRows() => new()
|
||||
{
|
||||
BatchSpec spec = specIndex switch
|
||||
{
|
||||
0 => BatchSpec.Opaque,
|
||||
1 => BatchSpec.Alpha,
|
||||
2 => BatchSpec.Additive,
|
||||
3 => BatchSpec.ClipDds,
|
||||
4 => BatchSpec.ClipPaletted,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(specIndex)),
|
||||
};
|
||||
{ SurfaceType.Base1Image, false, "envcell-opaque", GpuBlendMode.None, 0f, true },
|
||||
{ SurfaceType.Base1Image | SurfaceType.Alpha, false, "envcell-alpha", GpuBlendMode.StraightAlpha, 0f, true },
|
||||
{ SurfaceType.Base1Image | SurfaceType.Alpha | SurfaceType.Additive, false, "envcell-additive", GpuBlendMode.Additive, 0f, false },
|
||||
{ SurfaceType.Base1Image | SurfaceType.Additive, false, "envcell-raw-additive", GpuBlendMode.RawAdditive, 0f, false },
|
||||
{ SurfaceType.Base1Image | SurfaceType.InvAlpha, false, "envcell-inverse", GpuBlendMode.InverseAlpha, 0f, true },
|
||||
{ SurfaceType.Base1Image | SurfaceType.InvAlpha | SurfaceType.Additive, false, "envcell-inverse-additive", GpuBlendMode.InverseAdditive, 0f, false },
|
||||
{ SurfaceType.Translucent, false, "envcell-alpha", GpuBlendMode.StraightAlpha, 0f, true },
|
||||
{ SurfaceType.Translucent | SurfaceType.Additive, false, "envcell-raw-additive", GpuBlendMode.RawAdditive, 0f, false },
|
||||
{ SurfaceType.Translucent | SurfaceType.InvAlpha, false, "envcell-inverse", GpuBlendMode.InverseAlpha, 0f, true },
|
||||
{ SurfaceType.Base1Image | SurfaceType.Base1ClipMap, false, "envcell-clip", GpuBlendMode.PremultipliedAlpha, 200f / 255f, true },
|
||||
{ SurfaceType.Base1Image | SurfaceType.Base1ClipMap, true, "envcell-clip", GpuBlendMode.PremultipliedAlpha, 100f / 255f, true },
|
||||
{ SurfaceType.Base1Image | SurfaceType.Alpha | SurfaceType.Base1ClipMap, false, "envcell-alpha", GpuBlendMode.StraightAlpha, 200f / 255f, true },
|
||||
{ SurfaceType.Base1Image | SurfaceType.Alpha | SurfaceType.Base1ClipMap, true, "envcell-alpha", GpuBlendMode.StraightAlpha, 100f / 255f, true },
|
||||
{ SurfaceType.Base1Image | SurfaceType.Alpha | SurfaceType.Additive | SurfaceType.Base1ClipMap, false, "envcell-additive", GpuBlendMode.Additive, 200f / 255f, false },
|
||||
{ SurfaceType.Base1Image | SurfaceType.Alpha | SurfaceType.Additive | SurfaceType.Base1ClipMap, true, "envcell-additive", GpuBlendMode.Additive, 100f / 255f, false },
|
||||
{ SurfaceType.Base1Image | SurfaceType.Additive | SurfaceType.Base1ClipMap, false, "envcell-raw-additive", GpuBlendMode.RawAdditive, 200f / 255f, false },
|
||||
{ SurfaceType.Base1Image | SurfaceType.Additive | SurfaceType.Base1ClipMap, true, "envcell-raw-additive", GpuBlendMode.RawAdditive, 100f / 255f, false },
|
||||
{ SurfaceType.Base1Image | SurfaceType.InvAlpha | SurfaceType.Base1ClipMap, false, "envcell-inverse", GpuBlendMode.InverseAlpha, 200f / 255f, true },
|
||||
{ SurfaceType.Base1Image | SurfaceType.InvAlpha | SurfaceType.Base1ClipMap, true, "envcell-inverse", GpuBlendMode.InverseAlpha, 100f / 255f, true },
|
||||
{ SurfaceType.Base1Image | SurfaceType.InvAlpha | SurfaceType.Additive | SurfaceType.Base1ClipMap, false, "envcell-inverse-additive", GpuBlendMode.InverseAdditive, 200f / 255f, false },
|
||||
{ SurfaceType.Base1Image | SurfaceType.InvAlpha | SurfaceType.Additive | SurfaceType.Base1ClipMap, true, "envcell-inverse-additive", GpuBlendMode.InverseAdditive, 100f / 255f, false },
|
||||
{ SurfaceType.Translucent | SurfaceType.Base1ClipMap | SurfaceType.Additive, false, "envcell-alpha", GpuBlendMode.StraightAlpha, 0f, false },
|
||||
{ SurfaceType.Translucent | SurfaceType.Base1ClipMap | SurfaceType.Additive, true, "envcell-alpha", GpuBlendMode.StraightAlpha, 0f, false },
|
||||
};
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(ExactMaterialRows))]
|
||||
public void DetailOn_EveryEnvCellFamilyDrawsOnceInPlaceWithAuthoredOpacity(
|
||||
SurfaceType surfaceType,
|
||||
bool paletted,
|
||||
string expectedPipeline,
|
||||
object expectedBlendValue,
|
||||
float expectedReference,
|
||||
bool expectedFog)
|
||||
{
|
||||
var expectedBlend = (GpuBlendMode)expectedBlendValue;
|
||||
BatchSpec spec = new(surfaceType, paletted, PositiveStippling: false);
|
||||
using var fixture = new ProductionEnvCellFixture(
|
||||
detailSurfaceActive: true,
|
||||
spec);
|
||||
|
|
@ -113,6 +139,20 @@ public sealed class EnvCellAlphaDrawSourceTests
|
|||
DrawPushConstants(fixture.Device),
|
||||
constants => constants.ParamA != 0f);
|
||||
Assert.NotEqual(0u, armed.TextureIndexA);
|
||||
Assert.Equal(
|
||||
!expectedFog,
|
||||
(armed.RenderPass & RetailDetailTextureContract.NoFogRenderPassFlag) != 0);
|
||||
RetailSetSurfaceMaterialState resolved = RetailSetSurfaceMaterialState.Resolve(
|
||||
surfaceType, texturePresent: true, textureHasPalette: paletted);
|
||||
GpuPipelineDescription selected = fixture.Device.CreatedPipelines
|
||||
.Single(pipeline => pipeline.Description.Name == expectedPipeline)
|
||||
.Description;
|
||||
Assert.Equal(expectedBlend, selected.Blend);
|
||||
Assert.True(selected.Depth.Test);
|
||||
Assert.Equal(
|
||||
resolved.Blend is RetailSetSurfaceBlend.Opaque or RetailSetSurfaceBlend.Clip,
|
||||
selected.Depth.Write);
|
||||
Assert.Equal(WorldDepthContract.WorldCompare, selected.Depth.Compare);
|
||||
Assert.Equal(0, fixture.Queue.PendingCount);
|
||||
GpuRecordedStorageBind batchBind = fixture.Device.Calls
|
||||
.OfType<GpuRecordedStorageBind>()
|
||||
|
|
@ -120,10 +160,77 @@ public sealed class EnvCellAlphaDrawSourceTests
|
|||
ReadOnlySpan<ModernBatchData> gpuBatches = MemoryMarshal.Cast<byte, ModernBatchData>(
|
||||
fixture.Device.RingBytes.Slice((int)batchBind.OffsetBytes, (int)batchBind.SizeBytes));
|
||||
Assert.Equal(0.25f, Assert.Single(gpuBatches.ToArray()).SurfaceOpacity);
|
||||
Vector4 source = RetailDetailTextureContract.Combine(
|
||||
MaterialBase, MaterialDiffuse, MaterialDetail, 0.75f, 0.4f);
|
||||
AssertVector(new Vector4(0.3534682f, 0.2330118f, 0.5438054f, 0.11532f), source);
|
||||
RetailDetailTextureContract.FramebufferFamily family = expectedBlend switch
|
||||
{
|
||||
GpuBlendMode.None => RetailDetailTextureContract.FramebufferFamily.Opaque,
|
||||
GpuBlendMode.StraightAlpha => RetailDetailTextureContract.FramebufferFamily.Alpha,
|
||||
GpuBlendMode.Additive => RetailDetailTextureContract.FramebufferFamily.AlphaAdditive,
|
||||
GpuBlendMode.RawAdditive => RetailDetailTextureContract.FramebufferFamily.Additive,
|
||||
GpuBlendMode.InverseAlpha => RetailDetailTextureContract.FramebufferFamily.InverseAlpha,
|
||||
GpuBlendMode.InverseAdditive => RetailDetailTextureContract.FramebufferFamily.InverseAlphaAdditive,
|
||||
GpuBlendMode.PremultipliedAlpha => RetailDetailTextureContract.FramebufferFamily.Clip,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(expectedBlend)),
|
||||
};
|
||||
AssertVector(
|
||||
IndependentComposite(source, MaterialDestination, family),
|
||||
RetailDetailTextureContract.Composite(source, MaterialDestination, family));
|
||||
if (resolved.AlphaTestEnabled)
|
||||
{
|
||||
Assert.False(RetailDetailTextureContract.SurvivesClip(
|
||||
MathF.BitDecrement(expectedReference), expectedReference));
|
||||
Assert.True(RetailDetailTextureContract.SurvivesClip(expectedReference, expectedReference));
|
||||
Assert.True(RetailDetailTextureContract.SurvivesClip(
|
||||
MathF.BitIncrement(expectedReference), expectedReference));
|
||||
}
|
||||
fixture.Queue.EndFrame();
|
||||
Assert.Single(fixture.Device.Calls.OfType<GpuRecordedMultiDrawIndirect>());
|
||||
}
|
||||
|
||||
public static TheoryData<SurfaceType, bool, string, float> DetailOffRows() => new()
|
||||
{
|
||||
{ SurfaceType.Base1Image, false, "envcell-opaque", 0f },
|
||||
{ SurfaceType.Alpha, false, "envcell-alpha", 0f },
|
||||
{ SurfaceType.Alpha | SurfaceType.Additive, false, "envcell-additive", 0f },
|
||||
{ SurfaceType.Additive, false, "envcell-additive", 0f },
|
||||
{ SurfaceType.InvAlpha, false, "envcell-alpha", 0f },
|
||||
{ SurfaceType.InvAlpha | SurfaceType.Additive, false, "envcell-additive", 0f },
|
||||
{ SurfaceType.Base1ClipMap, false, "envcell-clip", 200f / 255f },
|
||||
{ SurfaceType.Base1ClipMap, true, "envcell-clip", 100f / 255f },
|
||||
{ SurfaceType.Alpha | SurfaceType.Base1ClipMap, true, "envcell-alpha", 0f },
|
||||
{ SurfaceType.InvAlpha | SurfaceType.Base1ClipMap, false, "envcell-alpha", 0f },
|
||||
{ SurfaceType.Translucent, false, "envcell-alpha", 0f },
|
||||
{ SurfaceType.Translucent | SurfaceType.Additive, false, "envcell-additive", 0f },
|
||||
{ SurfaceType.Translucent | SurfaceType.InvAlpha, false, "envcell-alpha", 0f },
|
||||
{ SurfaceType.Translucent | SurfaceType.Base1ClipMap | SurfaceType.Additive, true, "envcell-additive", 0f },
|
||||
};
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(DetailOffRows))]
|
||||
public void DetailOff_EveryRawStateRetainsThePreFixLogicalPath(
|
||||
SurfaceType surfaceType,
|
||||
bool paletted,
|
||||
string expectedPipeline,
|
||||
float expectedReference)
|
||||
{
|
||||
using var fixture = new ProductionEnvCellFixture(
|
||||
detailSurfaceActive: false,
|
||||
new BatchSpec(surfaceType, paletted, PositiveStippling: false));
|
||||
fixture.Queue.BeginFrame();
|
||||
fixture.Leaf.DrawCellShell(ProductionEnvCellFixture.CellId);
|
||||
fixture.Queue.EndFrame();
|
||||
|
||||
Assert.Single(fixture.Device.Calls.OfType<GpuRecordedMultiDrawIndirect>());
|
||||
Assert.Equal([expectedPipeline], DrawPipelineNames(fixture.Device));
|
||||
GpuPushConstants constants = Assert.Single(DrawPushConstants(fixture.Device));
|
||||
Assert.Equal(0u, constants.TextureIndexA);
|
||||
Assert.Equal(0f, constants.ParamA);
|
||||
Assert.Equal(expectedReference, constants.ParamB);
|
||||
Assert.Equal(0, constants.RenderPass & RetailDetailTextureContract.NoFogRenderPassFlag);
|
||||
}
|
||||
|
||||
/// <summary>Two cell tokens from the SAME <see cref="RetailPViewPassExecutor.EnvCellAlphaDrawSource"/>,
|
||||
/// with an unrelated source's entry appended between them, must still
|
||||
/// produce TWO separate single-cell draw calls around the interposed
|
||||
|
|
@ -258,9 +365,10 @@ public sealed class EnvCellAlphaDrawSourceTests
|
|||
foreach (string shader in new[] { modern, atmospheric })
|
||||
{
|
||||
Assert.Contains(
|
||||
"if (detailActive ? alpha < alphaCutoff : color.a < alphaCutoff)",
|
||||
"? isRetailClipReference(uParamB) && alpha < uParamB",
|
||||
shader,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("(uRenderPass & 0x200) == 0", shader, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("alpha <= alphaCutoff", shader, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("color.a <= alphaCutoff", shader, StringComparison.Ordinal);
|
||||
Assert.Contains("isRetailClipReference(uParamB) ? uParamB : 0.05", shader, StringComparison.Ordinal);
|
||||
|
|
@ -409,6 +517,38 @@ public sealed class EnvCellAlphaDrawSourceTests
|
|||
return [.. constants];
|
||||
}
|
||||
|
||||
private static void AssertVector(Vector4 expected, Vector4 actual)
|
||||
{
|
||||
Assert.Equal(expected.X, actual.X, 6);
|
||||
Assert.Equal(expected.Y, actual.Y, 6);
|
||||
Assert.Equal(expected.Z, actual.Z, 6);
|
||||
Assert.Equal(expected.W, actual.W, 6);
|
||||
}
|
||||
|
||||
private static Vector4 IndependentComposite(
|
||||
Vector4 source,
|
||||
Vector4 destination,
|
||||
RetailDetailTextureContract.FramebufferFamily family)
|
||||
{
|
||||
float x = source.W;
|
||||
return family switch
|
||||
{
|
||||
RetailDetailTextureContract.FramebufferFamily.Opaque => source,
|
||||
RetailDetailTextureContract.FramebufferFamily.Alpha =>
|
||||
source * x + destination * (1f - x),
|
||||
RetailDetailTextureContract.FramebufferFamily.AlphaAdditive =>
|
||||
source * x + destination,
|
||||
RetailDetailTextureContract.FramebufferFamily.Additive => source + destination,
|
||||
RetailDetailTextureContract.FramebufferFamily.InverseAlpha =>
|
||||
source * (1f - x) + destination * x,
|
||||
RetailDetailTextureContract.FramebufferFamily.InverseAlphaAdditive =>
|
||||
source * (1f - x) + destination,
|
||||
RetailDetailTextureContract.FramebufferFamily.Clip =>
|
||||
source + destination * new Vector4(1f - x),
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(family)),
|
||||
};
|
||||
}
|
||||
|
||||
private static string RepositoryRoot()
|
||||
{
|
||||
DirectoryInfo? cursor = new(AppContext.BaseDirectory);
|
||||
|
|
@ -419,46 +559,32 @@ public sealed class EnvCellAlphaDrawSourceTests
|
|||
}
|
||||
|
||||
private readonly record struct BatchSpec(
|
||||
byte Mask,
|
||||
bool IsTransparent,
|
||||
AcDream.Core.Meshing.TranslucencyKind Translucency,
|
||||
uint PaletteId)
|
||||
SurfaceType Type,
|
||||
bool Paletted,
|
||||
bool PositiveStippling)
|
||||
{
|
||||
internal static BatchSpec Opaque { get; } = new(
|
||||
0x00,
|
||||
IsTransparent: false,
|
||||
AcDream.Core.Meshing.TranslucencyKind.Opaque,
|
||||
PaletteId: 0);
|
||||
SurfaceType.Base1Image, Paletted: false, PositiveStippling: false);
|
||||
|
||||
internal static BatchSpec ClipDds { get; } = new(
|
||||
RetailAlphaMeshRouter.MaskClipMap,
|
||||
IsTransparent: true,
|
||||
AcDream.Core.Meshing.TranslucencyKind.ClipMap,
|
||||
PaletteId: 0);
|
||||
SurfaceType.Base1Image | SurfaceType.Base1ClipMap,
|
||||
Paletted: false, PositiveStippling: false);
|
||||
|
||||
internal static BatchSpec ClipPaletted { get; } = new(
|
||||
RetailAlphaMeshRouter.MaskClipMap,
|
||||
IsTransparent: true,
|
||||
AcDream.Core.Meshing.TranslucencyKind.ClipMap,
|
||||
PaletteId: 0x04000001u);
|
||||
SurfaceType.Base1Image | SurfaceType.Base1ClipMap,
|
||||
Paletted: true, PositiveStippling: false);
|
||||
|
||||
internal static BatchSpec ClipPositiveStippleDds { get; } = new(
|
||||
RetailAlphaMeshRouter.MaskClipMap | RetailAlphaMeshRouter.MaskPositiveStipple,
|
||||
IsTransparent: true,
|
||||
AcDream.Core.Meshing.TranslucencyKind.ClipMap,
|
||||
PaletteId: 0);
|
||||
SurfaceType.Base1Image | SurfaceType.Base1ClipMap,
|
||||
Paletted: false, PositiveStippling: true);
|
||||
|
||||
internal static BatchSpec Alpha { get; } = new(
|
||||
RetailAlphaMeshRouter.MaskAlphaFamily,
|
||||
IsTransparent: true,
|
||||
AcDream.Core.Meshing.TranslucencyKind.AlphaBlend,
|
||||
PaletteId: 0);
|
||||
SurfaceType.Base1Image | SurfaceType.Alpha,
|
||||
Paletted: false, PositiveStippling: false);
|
||||
|
||||
internal static BatchSpec Additive { get; } = new(
|
||||
RetailAlphaMeshRouter.MaskAlphaFamily,
|
||||
IsTransparent: true,
|
||||
AcDream.Core.Meshing.TranslucencyKind.Additive,
|
||||
PaletteId: 0);
|
||||
SurfaceType.Base1Image | SurfaceType.Additive,
|
||||
Paletted: false, PositiveStippling: false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -512,27 +638,45 @@ public sealed class EnvCellAlphaDrawSourceTests
|
|||
for (int i = 0; i < specs.Length; i++)
|
||||
{
|
||||
BatchSpec spec = specs[i];
|
||||
TranslucencyKind translucency =
|
||||
TranslucencyKindExtensions.FromSurfaceType(spec.Type);
|
||||
bool alphaFamily = (spec.Type
|
||||
& (SurfaceType.Alpha | SurfaceType.InvAlpha | SurfaceType.Additive)) != 0;
|
||||
byte mask = RetailAlphaMeshRouter.ConstructSubsetMask(
|
||||
alphaFamily,
|
||||
(spec.Type & SurfaceType.Base1ClipMap) != 0,
|
||||
(spec.Type & SurfaceType.Translucent) != 0,
|
||||
spec.PositiveStippling);
|
||||
uint paletteId = spec.Paletted ? 0x04000001u : 0u;
|
||||
batches.Add(new TextureBatchData
|
||||
{
|
||||
Key = new TextureKey
|
||||
{
|
||||
SurfaceId = 0x08000BFFu + (uint)i,
|
||||
PaletteId = spec.PaletteId,
|
||||
PaletteId = paletteId,
|
||||
},
|
||||
TextureData = new byte[8 * 8 * 4],
|
||||
Indices = [0, 1, 2],
|
||||
IsTransparent = spec.IsTransparent,
|
||||
IsAdditive = spec.Translucency == AcDream.Core.Meshing.TranslucencyKind.Additive,
|
||||
Translucency = spec.Translucency,
|
||||
IsTransparent = translucency != TranslucencyKind.Opaque,
|
||||
IsAdditive = (spec.Type & SurfaceType.Additive) != 0,
|
||||
Translucency = translucency,
|
||||
MaterialState = RetailSetSurfaceMaterialState.Resolve(
|
||||
spec.Type,
|
||||
texturePresent: true,
|
||||
textureHasPalette: spec.Paletted),
|
||||
SurfaceOpacity = 0.25f,
|
||||
RetailSurfaceMask = spec.Mask,
|
||||
RetailSurfaceMask = mask,
|
||||
CullMode = CullMode.Clockwise,
|
||||
IsCellShell = true,
|
||||
SourceSurfaceIndex = i,
|
||||
});
|
||||
}
|
||||
mesh.TextureBatches[(8, 8, TextureFormat.RGBA8)] = batches;
|
||||
Assert.NotNull(_meshManager.UploadMeshData(mesh));
|
||||
ObjectRenderData uploaded = Assert.IsType<ObjectRenderData>(
|
||||
_meshManager.UploadMeshData(mesh));
|
||||
Assert.Equal(
|
||||
batches.Select(static batch => batch.MaterialState),
|
||||
uploaded.Batches.Select(static batch => batch.MaterialState));
|
||||
|
||||
Renderer = new EnvCellRenderer(
|
||||
Device,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue