Implement horizon visibility check for celestial bodies
This commit is contained in:
@@ -27,7 +27,9 @@ const BACKGROUND_SPHERE_HEIGHT_SEGMENTS = 24;
|
|||||||
const DEFAULT_IMAGE_BACKGROUND_FALLBACK_COLOR = "#0d1116";
|
const DEFAULT_IMAGE_BACKGROUND_FALLBACK_COLOR = "#0d1116";
|
||||||
const NIGHT_BACKGROUND_EPSILON = 1e-4;
|
const NIGHT_BACKGROUND_EPSILON = 1e-4;
|
||||||
const MIN_CELESTIAL_BODY_INTENSITY = 1e-4;
|
const MIN_CELESTIAL_BODY_INTENSITY = 1e-4;
|
||||||
const MIN_CELESTIAL_BODY_ALTITUDE = -0.02;
|
const MIN_CELESTIAL_BODY_HORIZON_VISIBILITY = 1e-4;
|
||||||
|
const CELESTIAL_BODY_HORIZON_FADE_START_OFFSET = -0.28;
|
||||||
|
const CELESTIAL_BODY_HORIZON_FADE_END_OFFSET = -0.04;
|
||||||
const CELESTIAL_BODY_DISTANCE = BACKGROUND_SPHERE_RADIUS - 6;
|
const CELESTIAL_BODY_DISTANCE = BACKGROUND_SPHERE_RADIUS - 6;
|
||||||
const SUN_CELESTIAL_BODY_SIZE = 28;
|
const SUN_CELESTIAL_BODY_SIZE = 28;
|
||||||
const MOON_CELESTIAL_BODY_SIZE = 20;
|
const MOON_CELESTIAL_BODY_SIZE = 20;
|
||||||
@@ -88,6 +90,7 @@ export interface WorldCelestialBodyState {
|
|||||||
colorHex: string;
|
colorHex: string;
|
||||||
direction: Vec3;
|
direction: Vec3;
|
||||||
intensity: number;
|
intensity: number;
|
||||||
|
horizonVisibility: number;
|
||||||
size: number;
|
size: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,6 +195,21 @@ function normalizeDirection(direction: Vec3): Vec3 | null {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function resolveWorldCelestialHorizonVisibility(
|
||||||
|
directionY: number,
|
||||||
|
horizonHeight: number = 0
|
||||||
|
): number {
|
||||||
|
if (!Number.isFinite(directionY) || !Number.isFinite(horizonHeight)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return smoothstep(
|
||||||
|
horizonHeight + CELESTIAL_BODY_HORIZON_FADE_START_OFFSET,
|
||||||
|
horizonHeight + CELESTIAL_BODY_HORIZON_FADE_END_OFFSET,
|
||||||
|
directionY
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function resolveWorldCelestialBodyState(
|
function resolveWorldCelestialBodyState(
|
||||||
light: WorldSunLightSettings | null,
|
light: WorldSunLightSettings | null,
|
||||||
size: number
|
size: number
|
||||||
@@ -202,7 +220,13 @@ function resolveWorldCelestialBodyState(
|
|||||||
|
|
||||||
const direction = normalizeDirection(light.direction);
|
const direction = normalizeDirection(light.direction);
|
||||||
|
|
||||||
if (direction === null || direction.y < MIN_CELESTIAL_BODY_ALTITUDE) {
|
if (direction === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const horizonVisibility = resolveWorldCelestialHorizonVisibility(direction.y);
|
||||||
|
|
||||||
|
if (horizonVisibility <= MIN_CELESTIAL_BODY_HORIZON_VISIBILITY) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,6 +234,7 @@ function resolveWorldCelestialBodyState(
|
|||||||
colorHex: light.colorHex,
|
colorHex: light.colorHex,
|
||||||
direction,
|
direction,
|
||||||
intensity: light.intensity,
|
intensity: light.intensity,
|
||||||
|
horizonVisibility,
|
||||||
size
|
size
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user