UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

251 lines (248 loc) 8.86 kB
import { Debug } from '../../core/debug.js'; /** * @import { Texture } from '../../platform/graphics/texture.js' */ /** * Parameters for GSplat unified system. * * @category Graphics */ class GSplatParams { /** * Enables colorization by selected LOD level when rendering GSplat objects. Defaults to false. * Marks params dirty on change. * * @type {boolean} */ set colorizeLod(value) { if (this._colorizeLod !== value) { this._colorizeLod = value; this.dirty = true; } } /** * Gets colorize-by-LOD flag. * * @returns {boolean} Current enabled state. */ get colorizeLod() { return this._colorizeLod; } /** * Multiplier applied to effective distance for nodes behind the camera when determining LOD. * Value 1 means no penalty; higher values drop LOD faster for nodes behind the camera. * * Note: when using a penalty > 1, it often makes sense to set a positive * {@link GSplatParams#lodUpdateAngle} so LOD is re-evaluated on camera rotation, * not just translation. * * @type {number} */ set lodBehindPenalty(value) { if (this._lodBehindPenalty !== value) { this._lodBehindPenalty = value; this.dirty = true; } } /** * Gets behind-camera LOD penalty multiplier. * * @type {number} */ get lodBehindPenalty() { return this._lodBehindPenalty; } /** * Minimum allowed LOD index (inclusive). Defaults to 0. * * @type {number} */ set lodRangeMin(value) { if (this._lodRangeMin !== value) { this._lodRangeMin = value; this.dirty = true; } } /** * Gets minimum allowed LOD index (inclusive). * * @type {number} */ get lodRangeMin() { return this._lodRangeMin; } /** * Maximum allowed LOD index (inclusive). Defaults to 10. * * @type {number} */ set lodRangeMax(value) { if (this._lodRangeMax !== value) { this._lodRangeMax = value; this.dirty = true; } } /** * Gets maximum allowed LOD index (inclusive). * * @type {number} */ get lodRangeMax() { return this._lodRangeMax; } /** * Maximum number of LOD levels allowed below the optimal level when the optimal data is not * resident in memory. The system may temporarily use a coarser LOD within this limit until the * optimal LOD is available. Defaults to 0, which disables fallback (always load optimal). * Higher values allow faster loading by using lower-quality data. * * @type {number} */ set lodUnderfillLimit(value) { if (this._lodUnderfillLimit !== value) { this._lodUnderfillLimit = value; this.dirty = true; } } /** * Gets the maximum allowed underfill LOD range. * * @type {number} */ get lodUnderfillLimit() { return this._lodUnderfillLimit; } set splatBudget(value) { Debug.removed('GSplatParams.splatBudget is deprecated. Use GSplatComponent.splatBudget instead to set per-component budgets.'); } get splatBudget() { Debug.removed('GSplatParams.splatBudget is deprecated. Use GSplatComponent.splatBudget instead to set per-component budgets.'); return 0; } /** * Gradient texture for elevation-based coloring in overdraw visualization mode. * When set, enables overdraw mode with additive blending. When null, uses normal rendering. * Texture should be (width x 1) size. World Y coordinate (0-20 range) maps to texture U coordinate. * Defaults to null. * * @type {Texture|null} */ set colorRamp(value) { if (this._colorRamp !== value) { this._colorRamp = value; this.dirty = true; } } /** * Gets the color ramp texture for overdraw visualization. * * @type {import('../../platform/graphics/texture.js').Texture|null} */ get colorRamp() { return this._colorRamp; } constructor(){ /** * Enables debug rendering of AABBs for GSplat objects. Defaults to false. * * @type {boolean} */ this.debugAabbs = false; /** * Enables radial sorting based on distance from camera (for cubemap rendering). When false, * uses directional sorting along camera forward vector. Defaults to false. * * Note: Radial sorting helps reduce sorting artifacts when the camera rotates (looks around), * while linear sorting is better at minimizing artifacts when the camera translates (moves). * * @type {boolean} */ this.radialSorting = false; /** * Enables debug rendering of AABBs for GSplat octree nodes. Defaults to false. * * @type {boolean} */ this.debugNodeAabbs = false; /** * Internal dirty flag to trigger update of gsplat managers when some params change. * * @ignore * @type {boolean} */ this.dirty = false; /** * @type {boolean} * @private */ this._colorizeLod = false; /** * Distance threshold in world units to trigger LOD updates for camera and gsplat instances. * Defaults to 1. * * @type {number} */ this.lodUpdateDistance = 1; /** * Angle threshold in degrees to trigger LOD updates based on camera rotation. Set to 0 to * disable rotation-based updates. Defaults to 0. * * @type {number} */ this.lodUpdateAngle = 0; /** * @type {number} * @private */ this._lodBehindPenalty = 1; /** * @type {number} * @private */ this._lodRangeMin = 0; /** * @type {number} * @private */ this._lodRangeMax = 10; /** * @type {number} * @private */ this._lodUnderfillLimit = 0; /** * @type {import('../../platform/graphics/texture.js').Texture|null} * @private */ this._colorRamp = null; /** * Intensity multiplier for overdraw visualization mode. Value of 1 uses alpha of 1/32, * allowing approximately 32 overdraws to reach full brightness with additive blending. * Higher values increase brightness per splat. Defaults to 1. * * @type {number} */ this.colorRampIntensity = 1; /** * Enables debug colorization to visualize when spherical harmonics are evaluated. * When true, each update pass renders with a random color to visualize the behavior * of colorUpdateDistance and colorUpdateAngle thresholds. Defaults to false. * * @type {boolean} */ this.colorizeColorUpdate = false; /** * Distance threshold in world units for triggering spherical harmonics color updates. * Used to control how often SH evaluation occurs based on camera translation. * Only affects resources with spherical harmonics data. Set to 0 to update on * every frame where camera moves. Defaults to 0.2. * * @type {number} */ this.colorUpdateDistance = 0.2; /** * Angle threshold in degrees for triggering spherical harmonics color updates. * Used to control how often SH evaluation occurs based on camera rotation. * Only affects resources with spherical harmonics data. Set to 0 to update on * every frame where camera rotates. Defaults to 2. * * @type {number} */ this.colorUpdateAngle = 2; /** * Scale factor applied to colorUpdateDistance for each LOD level. * Each LOD level multiplies the threshold by this value raised to the power of lodIndex. * For example, with scale=2: LOD 0 uses 1x threshold, LOD 1 uses 2x, LOD 2 uses 4x. * Higher values relax thresholds more aggressively for distant geometry. Defaults to 2. * * @type {number} */ this.colorUpdateDistanceLodScale = 2; /** * Scale factor applied to colorUpdateAngle for each LOD level. * Each LOD level multiplies the threshold by this value raised to the power of lodIndex. * For example, with scale=2: LOD 0 uses 1x threshold, LOD 1 uses 2x, LOD 2 uses 4x. * Higher values relax thresholds more aggressively for distant geometry. Defaults to 2. * * @type {number} */ this.colorUpdateAngleLodScale = 2; /** * Number of update ticks before unloading unused streamed resources. When a streamed resource's * reference count reaches zero, it enters a cooldown period before being unloaded. This allows * recently used data to remain in memory for quick reuse if needed again soon. Set to 0 to * unload immediately when unused. Defaults to 100. * * @type {number} */ this.cooldownTicks = 100; } } export { GSplatParams };