gods-eye-view/src/bloom.js

83 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* bloom.js — Bloom intensity normalization and version migration.
*
* The bloom slider was rescaled from 0–100 (v1) to 0–200 (v2) to provide
* finer control. Share links and saved scene projects may carry either scale,
* so all ingestion paths pass through {@link decodeBloomIntensity} which
* detects the version and converts to the v2 range.
*/
/** Current bloom scale version. Persisted in share links / scene projects. */
export const BLOOM_SCALE_VERSION = 2;
/** Maximum bloom intensity on the v2 scale. */
export const BLOOM_INTENSITY_MAX = 200;
/** Default bloom intensity (off). */
export const BLOOM_INTENSITY_DEFAULT = 0;
/** Maximum intensity on the legacy v1 scale (used for migration). */
const LEGACY_BLOOM_INTENSITY_MAX = 100;
/** @param {number} value @param {number} min @param {number} max */
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
/**
* Clamp a raw bloom value to the valid v2 range [0, 200].
* @param {number} value — raw intensity (may be out of range or NaN)
* @returns {number} integer in [0, BLOOM_INTENSITY_MAX]
*/
export function clampBloomIntensity(value) {
const num = Number(value);
if (!Number.isFinite(num)) return BLOOM_INTENSITY_DEFAULT;
return clamp(Math.round(num), 0, BLOOM_INTENSITY_MAX);
}
/**
* Convert a v1 (0–100) bloom value to the v2 (0–200) scale.
* The v1 scale was inverted (100 = no bloom, 0 = max bloom),
* so this also un-inverts.
* @param {number} value — legacy v1 intensity
* @returns {number} equivalent v2 intensity
*/
export function legacyBloomToV2(value) {
const legacy = clamp(Math.round(Number(value) || 0), 0, LEGACY_BLOOM_INTENSITY_MAX);
return clampBloomIntensity((LEGACY_BLOOM_INTENSITY_MAX - legacy) * 2);
}
/**
* Decode a bloom intensity from a share link or saved project.
* Handles both v1 (0–100, inverted) and v2 (0–200) scales.
* @param {number} value — persisted intensity
* @param {number} [version=1] — bloom scale version from the saved state
* @returns {number} v2-scale intensity in [0, 200]
*/
export function decodeBloomIntensity(value, version = 1) {
const num = Number(value);
if (!Number.isFinite(num)) return BLOOM_INTENSITY_DEFAULT;
const normalizedVersion = Number(version);
if (Number.isFinite(normalizedVersion) && normalizedVersion >= BLOOM_SCALE_VERSION) {
return clampBloomIntensity(num);
}
// Tolerate unversioned links/projects that already use the new 0..200 scale.
if (num > LEGACY_BLOOM_INTENSITY_MAX) {
return clampBloomIntensity(num);
}
return legacyBloomToV2(num);
}
/**
* Convert a bloom intensity (0–200) to a normalized strength (0.0–1.0)
* suitable for passing to the CesiumJS bloom post-process stage.
* @param {number} value — v2-scale intensity
* @returns {number} normalized strength in [0, 1]
*/
export function bloomStrengthFromIntensity(value) {
return clampBloomIntensity(value) / BLOOM_INTENSITY_MAX;
}