/**
 * @typedef VFXComponentData
 * @property {string} type  The VFX component type.
 */

/**
 * @typedef VFXComponentAnimation
 * @property {(state: object, params: object) => void} [setup]
 * @property {(t: number, state: object, params: object) => void} animate
 * @property {(state: object, params: object) => void} [tearDown]
 */

/**
 * @callback VFXPathGenerator
 * @param {VFXBasePathPoint[]} points
 * @param {object} params
 * @returns {VFXPath}
 */

/**
 * @typedef VFXBasePathPoint
 * @property {number} x             The x coordinate of the point
 * @property {number} y             The y coordinate of the point
 * @property {number} elevation     The elevation of the point
 * @property {number} [rotation]    The rotation at the point in radians
 * @property {number} [sort]        The sort order of the point
 * @property {string} [sortLayer=PrimaryCanvasGroup.SORT_LAYERS.TOKENS] The sort layer for the point
 */

/**
 * @typedef {VFXBasePathPoint
 * & {rotation: number; distance: number; index: number; elevation: number; sort: number}} VFXPathPoint
 */

/**
 * @typedef VFXPositionalSoundData
 * @property {string} src         Sound source path
 * @property {number} align       How sound playback aligns with animation, a value in SOUND_ALIGNMENT (default END)
 * @property {number} volume      Playback volume (default 1.0)
 * @property {number} radius      Local sound radius in distance units (default 60)
 * @property {boolean} easing     Whether to apply easing to local sound (default true)
 * @property {boolean} walls      Whether sound should be constrained by walls (default true)
 */
