Feature: Add foliage quality settings to advanced rendering configuration
This commit is contained in:
@@ -36,6 +36,11 @@ export const ADVANCED_RENDERING_DYNAMIC_GLOBAL_ILLUMINATION_QUALITIES = [
|
|||||||
"low",
|
"low",
|
||||||
"medium"
|
"medium"
|
||||||
] as const;
|
] as const;
|
||||||
|
export const FOLIAGE_QUALITY_SHADOW_MODES = ["off", "near", "full"] as const;
|
||||||
|
export const MIN_FOLIAGE_QUALITY_DENSITY_MULTIPLIER = 0 as const;
|
||||||
|
export const MAX_FOLIAGE_QUALITY_DENSITY_MULTIPLIER = 2 as const;
|
||||||
|
export const MIN_FOLIAGE_QUALITY_MAX_DISTANCE_MULTIPLIER = 0.1 as const;
|
||||||
|
export const MAX_FOLIAGE_QUALITY_MAX_DISTANCE_MULTIPLIER = 2 as const;
|
||||||
|
|
||||||
export type AdvancedRenderingShadowMapSize =
|
export type AdvancedRenderingShadowMapSize =
|
||||||
(typeof ADVANCED_RENDERING_SHADOW_MAP_SIZES)[number];
|
(typeof ADVANCED_RENDERING_SHADOW_MAP_SIZES)[number];
|
||||||
@@ -48,6 +53,8 @@ export type AdvancedRenderingWaterReflectionMode =
|
|||||||
(typeof ADVANCED_RENDERING_WATER_REFLECTION_MODES)[number];
|
(typeof ADVANCED_RENDERING_WATER_REFLECTION_MODES)[number];
|
||||||
export type AdvancedRenderingDynamicGlobalIlluminationQuality =
|
export type AdvancedRenderingDynamicGlobalIlluminationQuality =
|
||||||
(typeof ADVANCED_RENDERING_DYNAMIC_GLOBAL_ILLUMINATION_QUALITIES)[number];
|
(typeof ADVANCED_RENDERING_DYNAMIC_GLOBAL_ILLUMINATION_QUALITIES)[number];
|
||||||
|
export type FoliageQualityShadowMode =
|
||||||
|
(typeof FOLIAGE_QUALITY_SHADOW_MODES)[number];
|
||||||
|
|
||||||
export interface WorldSolidBackgroundSettings {
|
export interface WorldSolidBackgroundSettings {
|
||||||
mode: "solid";
|
mode: "solid";
|
||||||
@@ -189,6 +196,13 @@ export interface AdvancedRenderingGodRaysSettings {
|
|||||||
samples: number;
|
samples: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface FoliageQualitySettings {
|
||||||
|
enabled: boolean;
|
||||||
|
densityMultiplier: number;
|
||||||
|
maxDistanceMultiplier: number;
|
||||||
|
shadows: FoliageQualityShadowMode;
|
||||||
|
}
|
||||||
|
|
||||||
export interface AdvancedRenderingSettings {
|
export interface AdvancedRenderingSettings {
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
shadows: AdvancedRenderingShadowsSettings;
|
shadows: AdvancedRenderingShadowsSettings;
|
||||||
@@ -200,6 +214,7 @@ export interface AdvancedRenderingSettings {
|
|||||||
whiteboxBevel: AdvancedRenderingWhiteboxBevelSettings;
|
whiteboxBevel: AdvancedRenderingWhiteboxBevelSettings;
|
||||||
distanceFog: AdvancedRenderingDistanceFogSettings;
|
distanceFog: AdvancedRenderingDistanceFogSettings;
|
||||||
godRays: AdvancedRenderingGodRaysSettings;
|
godRays: AdvancedRenderingGodRaysSettings;
|
||||||
|
foliage: FoliageQualitySettings;
|
||||||
fogPath: BoxVolumeRenderPath;
|
fogPath: BoxVolumeRenderPath;
|
||||||
waterPath: BoxVolumeRenderPath;
|
waterPath: BoxVolumeRenderPath;
|
||||||
waterReflectionMode: AdvancedRenderingWaterReflectionMode;
|
waterReflectionMode: AdvancedRenderingWaterReflectionMode;
|
||||||
@@ -304,6 +319,10 @@ const DEFAULT_ADVANCED_RENDERING_GOD_RAYS_EXPOSURE = 0.28;
|
|||||||
const DEFAULT_ADVANCED_RENDERING_GOD_RAYS_DENSITY = 0.72;
|
const DEFAULT_ADVANCED_RENDERING_GOD_RAYS_DENSITY = 0.72;
|
||||||
const DEFAULT_ADVANCED_RENDERING_GOD_RAYS_SOURCE_SIZE = 1;
|
const DEFAULT_ADVANCED_RENDERING_GOD_RAYS_SOURCE_SIZE = 1;
|
||||||
const DEFAULT_ADVANCED_RENDERING_GOD_RAYS_SAMPLES = 48;
|
const DEFAULT_ADVANCED_RENDERING_GOD_RAYS_SAMPLES = 48;
|
||||||
|
const DEFAULT_FOLIAGE_QUALITY_ENABLED = true;
|
||||||
|
const DEFAULT_FOLIAGE_QUALITY_DENSITY_MULTIPLIER = 1;
|
||||||
|
const DEFAULT_FOLIAGE_QUALITY_MAX_DISTANCE_MULTIPLIER = 1;
|
||||||
|
const DEFAULT_FOLIAGE_QUALITY_SHADOWS: FoliageQualityShadowMode = "near";
|
||||||
const DEFAULT_BOX_VOLUME_RENDER_PATH: BoxVolumeRenderPath = "performance";
|
const DEFAULT_BOX_VOLUME_RENDER_PATH: BoxVolumeRenderPath = "performance";
|
||||||
const DEFAULT_ADVANCED_RENDERING_WATER_REFLECTION_MODE: AdvancedRenderingWaterReflectionMode =
|
const DEFAULT_ADVANCED_RENDERING_WATER_REFLECTION_MODE: AdvancedRenderingWaterReflectionMode =
|
||||||
"none";
|
"none";
|
||||||
@@ -515,6 +534,74 @@ export function isAdvancedRenderingDynamicGlobalIlluminationQuality(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isFoliageQualityShadowMode(
|
||||||
|
value: unknown
|
||||||
|
): value is FoliageQualityShadowMode {
|
||||||
|
return FOLIAGE_QUALITY_SHADOW_MODES.includes(
|
||||||
|
value as FoliageQualityShadowMode
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createDefaultFoliageQualitySettings(): FoliageQualitySettings {
|
||||||
|
return {
|
||||||
|
enabled: DEFAULT_FOLIAGE_QUALITY_ENABLED,
|
||||||
|
densityMultiplier: DEFAULT_FOLIAGE_QUALITY_DENSITY_MULTIPLIER,
|
||||||
|
maxDistanceMultiplier: DEFAULT_FOLIAGE_QUALITY_MAX_DISTANCE_MULTIPLIER,
|
||||||
|
shadows: DEFAULT_FOLIAGE_QUALITY_SHADOWS
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function resolveFoliageQualitySettings(
|
||||||
|
settings: FoliageQualitySettings | null | undefined
|
||||||
|
): FoliageQualitySettings {
|
||||||
|
const defaults = createDefaultFoliageQualitySettings();
|
||||||
|
|
||||||
|
if (settings === null || settings === undefined) {
|
||||||
|
return defaults;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
enabled: settings.enabled,
|
||||||
|
densityMultiplier: Number.isFinite(settings.densityMultiplier)
|
||||||
|
? clamp(
|
||||||
|
settings.densityMultiplier,
|
||||||
|
MIN_FOLIAGE_QUALITY_DENSITY_MULTIPLIER,
|
||||||
|
MAX_FOLIAGE_QUALITY_DENSITY_MULTIPLIER
|
||||||
|
)
|
||||||
|
: defaults.densityMultiplier,
|
||||||
|
maxDistanceMultiplier: Number.isFinite(settings.maxDistanceMultiplier)
|
||||||
|
? clamp(
|
||||||
|
settings.maxDistanceMultiplier,
|
||||||
|
MIN_FOLIAGE_QUALITY_MAX_DISTANCE_MULTIPLIER,
|
||||||
|
MAX_FOLIAGE_QUALITY_MAX_DISTANCE_MULTIPLIER
|
||||||
|
)
|
||||||
|
: defaults.maxDistanceMultiplier,
|
||||||
|
shadows: isFoliageQualityShadowMode(settings.shadows)
|
||||||
|
? settings.shadows
|
||||||
|
: defaults.shadows
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function cloneFoliageQualitySettings(
|
||||||
|
settings: FoliageQualitySettings
|
||||||
|
): FoliageQualitySettings {
|
||||||
|
return {
|
||||||
|
...settings
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function areFoliageQualitySettingsEqual(
|
||||||
|
left: FoliageQualitySettings,
|
||||||
|
right: FoliageQualitySettings
|
||||||
|
): boolean {
|
||||||
|
return (
|
||||||
|
left.enabled === right.enabled &&
|
||||||
|
left.densityMultiplier === right.densityMultiplier &&
|
||||||
|
left.maxDistanceMultiplier === right.maxDistanceMultiplier &&
|
||||||
|
left.shadows === right.shadows
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export function createDefaultAdvancedRenderingSettings(): AdvancedRenderingSettings {
|
export function createDefaultAdvancedRenderingSettings(): AdvancedRenderingSettings {
|
||||||
return {
|
return {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
@@ -578,6 +665,7 @@ export function createDefaultAdvancedRenderingSettings(): AdvancedRenderingSetti
|
|||||||
sourceSize: DEFAULT_ADVANCED_RENDERING_GOD_RAYS_SOURCE_SIZE,
|
sourceSize: DEFAULT_ADVANCED_RENDERING_GOD_RAYS_SOURCE_SIZE,
|
||||||
samples: DEFAULT_ADVANCED_RENDERING_GOD_RAYS_SAMPLES
|
samples: DEFAULT_ADVANCED_RENDERING_GOD_RAYS_SAMPLES
|
||||||
},
|
},
|
||||||
|
foliage: createDefaultFoliageQualitySettings(),
|
||||||
fogPath: DEFAULT_BOX_VOLUME_RENDER_PATH,
|
fogPath: DEFAULT_BOX_VOLUME_RENDER_PATH,
|
||||||
waterPath: DEFAULT_BOX_VOLUME_RENDER_PATH,
|
waterPath: DEFAULT_BOX_VOLUME_RENDER_PATH,
|
||||||
waterReflectionMode: DEFAULT_ADVANCED_RENDERING_WATER_REFLECTION_MODE
|
waterReflectionMode: DEFAULT_ADVANCED_RENDERING_WATER_REFLECTION_MODE
|
||||||
@@ -906,6 +994,7 @@ export function cloneAdvancedRenderingSettings(
|
|||||||
godRays: {
|
godRays: {
|
||||||
...settings.godRays
|
...settings.godRays
|
||||||
},
|
},
|
||||||
|
foliage: cloneFoliageQualitySettings(settings.foliage),
|
||||||
fogPath: settings.fogPath,
|
fogPath: settings.fogPath,
|
||||||
waterPath: settings.waterPath,
|
waterPath: settings.waterPath,
|
||||||
waterReflectionMode: settings.waterReflectionMode
|
waterReflectionMode: settings.waterReflectionMode
|
||||||
@@ -1109,6 +1198,7 @@ export function areAdvancedRenderingSettingsEqual(
|
|||||||
left.godRays.density === right.godRays.density &&
|
left.godRays.density === right.godRays.density &&
|
||||||
left.godRays.sourceSize === right.godRays.sourceSize &&
|
left.godRays.sourceSize === right.godRays.sourceSize &&
|
||||||
left.godRays.samples === right.godRays.samples &&
|
left.godRays.samples === right.godRays.samples &&
|
||||||
|
areFoliageQualitySettingsEqual(left.foliage, right.foliage) &&
|
||||||
left.fogPath === right.fogPath &&
|
left.fogPath === right.fogPath &&
|
||||||
left.waterPath === right.waterPath &&
|
left.waterPath === right.waterPath &&
|
||||||
left.waterReflectionMode === right.waterReflectionMode
|
left.waterReflectionMode === right.waterReflectionMode
|
||||||
|
|||||||
Reference in New Issue
Block a user