auto-git:

[change] src/app/App.tsx
 [change] src/document/migrate-scene-document.ts
 [change] src/document/scene-document-validation.ts
 [change] src/document/scene-document.ts
 [change] src/document/world-settings.ts
 [change] src/rendering/advanced-rendering.ts
 [change] tests/domain/advanced-rendering.test.ts
 [change] tests/serialization/scene-document-json.test.ts
This commit is contained in:
2026-05-21 08:11:20 +02:00
parent 69b13e9738
commit 572e1434e4
8 changed files with 160 additions and 41 deletions

View File

@@ -14044,8 +14044,7 @@ export function App({
"Set foliage wind direction",
"Updated the foliage wind direction.",
(advancedRendering) => {
advancedRendering.foliage.windDirectionDegrees =
windDirectionDegrees;
advancedRendering.foliage.windDirectionDegrees = windDirectionDegrees;
}
);
} catch (error) {
@@ -21920,9 +21919,7 @@ export function App({
type="number"
min="0"
step="0.05"
value={
advancedRenderingLensFlareIntensityDraft
}
value={advancedRenderingLensFlareIntensityDraft}
onChange={(event) =>
setAdvancedRenderingLensFlareIntensityDraft(
event.currentTarget.value
@@ -21965,9 +21962,7 @@ export function App({
event.currentTarget.value
)
}
onBlur={
applyAdvancedRenderingLensFlareHaloSize
}
onBlur={applyAdvancedRenderingLensFlareHaloSize}
onKeyDown={(event) =>
handleDraftVectorKeyDown(
event,

View File

@@ -889,9 +889,7 @@ function readAdvancedRenderingSettings(
}
if (value.antiAliasing !== undefined && !isRecord(value.antiAliasing)) {
throw new Error(
"world.advancedRendering.antiAliasing must be an object."
);
throw new Error("world.advancedRendering.antiAliasing must be an object.");
}
if (value.depthOfField !== undefined && !isRecord(value.depthOfField)) {

View File

@@ -1147,7 +1147,9 @@ function validateWorldSettings(
);
}
if (!isAdvancedRenderingAntiAliasingMode(advancedRendering.antiAliasing.mode)) {
if (
!isAdvancedRenderingAntiAliasingMode(advancedRendering.antiAliasing.mode)
) {
diagnostics.push(
createDiagnostic(
"error",
@@ -1261,9 +1263,7 @@ function validateWorldSettings(
);
}
if (
!isNonNegativeFiniteNumber(advancedRendering.distanceFog.nearDistance)
) {
if (!isNonNegativeFiniteNumber(advancedRendering.distanceFog.nearDistance)) {
diagnostics.push(
createDiagnostic(
"error",
@@ -3611,7 +3611,12 @@ function validateSplineCorridorJunction(
)
);
} else {
validateScenePathRoadEdge(junction.edge, `${path}.edge`, document, diagnostics);
validateScenePathRoadEdge(
junction.edge,
`${path}.edge`,
document,
diagnostics
);
}
if (!Array.isArray(junction.connections) || junction.connections.length < 2) {
@@ -3950,8 +3955,7 @@ function validateTerrain(
);
}
const expectedFoliageMaskValueCount =
mask.resolutionX * mask.resolutionZ;
const expectedFoliageMaskValueCount = mask.resolutionX * mask.resolutionZ;
if (mask.values.length !== expectedFoliageMaskValueCount) {
diagnostics.push(
@@ -5172,9 +5176,7 @@ function validatePlayerStartEntity(
);
}
if (
!isPlayerStartGamepadActionBinding(entity.inputBindings?.gamepad.climb)
) {
if (!isPlayerStartGamepadActionBinding(entity.inputBindings?.gamepad.climb)) {
diagnostics.push(
createDiagnostic(
"error",
@@ -5957,10 +5959,7 @@ function validateNpcEntity(
);
}
if (
typeof entity.targetAnchor !== "object" ||
entity.targetAnchor === null
) {
if (typeof entity.targetAnchor !== "object" || entity.targetAnchor === null) {
diagnostics.push(
createDiagnostic(
"error",

View File

@@ -41,8 +41,10 @@ export const ANTI_ALIASING_SCENE_DOCUMENT_VERSION = 113 as const;
export const FOLIAGE_WIND_SCENE_DOCUMENT_VERSION = 112 as const;
export const LENS_FLARE_SCENE_DOCUMENT_VERSION = 111 as const;
export const CUSTOM_PBR_MATERIALS_SCENE_DOCUMENT_VERSION = 110 as const;
export const SPLINE_CORRIDOR_JUNCTION_SHAPE_SCENE_DOCUMENT_VERSION = 109 as const;
export const SPLINE_CORRIDOR_JUNCTION_EDGE_SCENE_DOCUMENT_VERSION = 108 as const;
export const SPLINE_CORRIDOR_JUNCTION_SHAPE_SCENE_DOCUMENT_VERSION =
109 as const;
export const SPLINE_CORRIDOR_JUNCTION_EDGE_SCENE_DOCUMENT_VERSION =
108 as const;
export const SPLINE_CORRIDOR_JUNCTIONS_SCENE_DOCUMENT_VERSION = 107 as const;
export const SPLINE_CORRIDOR_COLLISION_SCENE_DOCUMENT_VERSION = 106 as const;
export const SPLINE_REPEATERS_SCENE_DOCUMENT_VERSION = 105 as const;

View File

@@ -759,8 +759,7 @@ export function createDefaultAdvancedRenderingSettings(): AdvancedRenderingSetti
enabled: false,
intensity: DEFAULT_ADVANCED_RENDERING_LENS_FLARE_INTENSITY,
haloSize: DEFAULT_ADVANCED_RENDERING_LENS_FLARE_HALO_SIZE,
ghostIntensity:
DEFAULT_ADVANCED_RENDERING_LENS_FLARE_GHOST_INTENSITY,
ghostIntensity: DEFAULT_ADVANCED_RENDERING_LENS_FLARE_GHOST_INTENSITY,
ghostCount: DEFAULT_ADVANCED_RENDERING_LENS_FLARE_GHOST_COUNT
},
foliage: createDefaultFoliageQualitySettings(),

View File

@@ -423,7 +423,11 @@ export function createAdvancedRenderingComposer(
}
const effects: Array<
BloomEffect | DepthOfFieldEffect | FXAAEffect | ToneMappingEffect | SMAAEffect
| BloomEffect
| DepthOfFieldEffect
| FXAAEffect
| ToneMappingEffect
| SMAAEffect
> = [];
if (settings.ambientOcclusion.enabled || dynamicGlobalIlluminationEnabled) {

View File

@@ -486,9 +486,9 @@ describe("god rays parameters", () => {
}
};
expect(
resolveDominantScreenSpaceGodRaysLightInput(visibleSun, null)
).toBe(visibleSun);
expect(resolveDominantScreenSpaceGodRaysLightInput(visibleSun, null)).toBe(
visibleSun
);
expect(
resolveDominantScreenSpaceGodRaysLightInput(visibleSun, visibleMoon)
).toBe(visibleMoon);
@@ -532,9 +532,9 @@ describe("god rays parameters", () => {
).toBeGreaterThan(0.5);
expect(resolveGodRaysSourceMask(0.035)).toBeLessThan(0.5);
expect(resolveGodRaysSourceMask(0.035, 2)).toBeGreaterThan(0.5);
expect(
resolveGodRaysSourceMask(GOD_RAYS_SOURCE_MASK_RADII.haloOuter)
).toBe(0);
expect(resolveGodRaysSourceMask(GOD_RAYS_SOURCE_MASK_RADII.haloOuter)).toBe(
0
);
});
});
@@ -667,6 +667,131 @@ describe("createAdvancedRenderingComposer", () => {
expect(postprocessingState.ssaoCalls).toHaveLength(0);
});
it("keeps SMAA as the default post-process anti-aliasing effect", () => {
resetPostprocessingState();
const settings = createDefaultWorldSettings().advancedRendering;
settings.enabled = true;
createAdvancedRenderingComposer(
{
capabilities: {
isWebGL2: true
}
} as unknown as never,
new Scene(),
new PerspectiveCamera(),
settings
);
expect(postprocessingState.composerOptions[0]).toMatchObject({
multisampling: 0
});
expect(getLastEffectPassEffectNames()).toEqual([
"MockToneMappingEffect",
"MockSMAAEffect"
]);
});
it("can disable anti-aliasing in the post stack", () => {
resetPostprocessingState();
const settings = createDefaultWorldSettings().advancedRendering;
settings.enabled = true;
settings.antiAliasing.enabled = false;
createAdvancedRenderingComposer(
{
capabilities: {
isWebGL2: true
}
} as unknown as never,
new Scene(),
new PerspectiveCamera(),
settings
);
expect(postprocessingState.composerOptions[0]).toMatchObject({
multisampling: 0
});
expect(getLastEffectPassEffectNames()).toEqual(["MockToneMappingEffect"]);
});
it("uses FXAA when selected", () => {
resetPostprocessingState();
const settings = createDefaultWorldSettings().advancedRendering;
settings.enabled = true;
settings.antiAliasing.mode = "fxaa";
createAdvancedRenderingComposer(
{
capabilities: {
isWebGL2: true
}
} as unknown as never,
new Scene(),
new PerspectiveCamera(),
settings
);
expect(postprocessingState.composerOptions[0]).toMatchObject({
multisampling: 0
});
expect(getLastEffectPassEffectNames()).toEqual([
"MockToneMappingEffect",
"MockFXAAEffect"
]);
});
it("uses composer MSAA samples on WebGL2 when an MSAA mode is selected", () => {
resetPostprocessingState();
const settings = createDefaultWorldSettings().advancedRendering;
settings.enabled = true;
settings.antiAliasing.mode = "msaa4x";
createAdvancedRenderingComposer(
{
capabilities: {
isWebGL2: true
}
} as unknown as never,
new Scene(),
new PerspectiveCamera(),
settings
);
expect(postprocessingState.composerOptions[0]).toMatchObject({
multisampling: 4
});
expect(getLastEffectPassEffectNames()).toEqual(["MockToneMappingEffect"]);
});
it("falls back to no composer MSAA samples outside WebGL2", () => {
resetPostprocessingState();
const settings = createDefaultWorldSettings().advancedRendering;
settings.enabled = true;
settings.antiAliasing.mode = "msaa8x";
createAdvancedRenderingComposer(
{
capabilities: {
isWebGL2: false
}
} as unknown as never,
new Scene(),
new PerspectiveCamera(),
settings
);
expect(postprocessingState.composerOptions[0]).toMatchObject({
multisampling: 0
});
expect(getLastEffectPassEffectNames()).toEqual(["MockToneMappingEffect"]);
});
it("adds distance fog before post-world overlay layers", () => {
postprocessingState.composerOptions.length = 0;
postprocessingState.composerPasses.length = 0;

View File

@@ -1877,11 +1877,8 @@ describe("scene document JSON", () => {
const legacyDocument = JSON.parse(
serializeSceneDocument(emptyScene)
) as Record<string, any>;
const legacyFoliage =
legacyDocument.world.advancedRendering.foliage as Record<
string,
unknown
>;
const legacyFoliage = legacyDocument.world.advancedRendering
.foliage as Record<string, unknown>;
legacyDocument.version = LENS_FLARE_SCENE_DOCUMENT_VERSION;
delete legacyFoliage.windEnabled;