import type { AnimationAction } from "three";
import { AnimationTree } from "./AnimationTree";
/**
 * Configuration for a polar animation action in the blend tree.
 * Associates an animation action with polar coordinates (radius, azimuth).
 *
 * @public
 */
export interface PolarAction {
    /** The Three.js animation action to be played */
    action: AnimationAction;
    /** Radial distance from the origin. Must be finite and positive. */
    radius: number;
    /** Angular position in radians. Must be finite. Will be normalized to [0, 2π) range. */
    azimuth: number;
}
/**
 * Configuration options for polar blend tree behavior.
 *
 * @public
 */
export interface PolarBlendTreeOptions {
    /** Animation action to play at the center (origin) of the polar space */
    centerAction: AnimationAction;
    /** Whether the blend tree should loop azimuthal blending at 2π */
    isLooped: boolean;
}
/**
 * Polar blend tree implementation for 2D animation blending in polar coordinates.
 *
 * Manages animation actions positioned in polar space (radius, azimuth), blending
 * between adjacent animations using bilinear interpolation. Organizes actions into
 * rays (constant azimuth) and rings (constant radius).
 *
 * @example
 * ```typescript
 * const blendTree = new PolarBlendTree([
 *   { action: walkForward, radius: 1, azimuth: 0 },
 *   { action: walkLeft, radius: 1, azimuth: Math.PI / 2 },
 *   { action: runForward, radius: 2, azimuth: 0 },
 *   { action: runLeft, radius: 2, azimuth: Math.PI / 2 }
 * ], idleAction);
 *
 * blendTree.setBlend(Math.PI / 4, 1.5);
 * ```
 */
export declare class PolarBlendTree extends AnimationTree {
    private readonly tempAnchorMap;
    private readonly trackableAnchors;
    /** Optional center anchor at origin (0,0) for special blending behavior */
    private readonly centerAnchor?;
    /** Array of rays (constant azimuth lines) containing anchors, sorted by azimuth */
    private readonly rays;
    /** Array of rings (constant radius circles) containing anchors, sorted by radius */
    private readonly rings;
    /** Current radial position for blending calculations */
    private currentRadius;
    /** Current angular position for blending calculations, normalized to [0, 2π) */
    private currentAzimuth;
    /**
     * Creates a new polar blend tree with the specified animation actions.
     * Actions are organized into rays (by azimuth) and rings (by radius).
     *
     * @param polarActions - Array of polar actions defining the blend space.
     *                      Must contain at least 2 actions with unique coordinates.
     * @param centerAction - Optional center action at origin (0,0)
     * @throws {Error} When fewer than 2 actions are provided
     * @throws {Error} When any action has non-finite radius or azimuth values
     * @throws {Error} When any action has non-positive radius
     * @throws {Error} When multiple actions have the same polar coordinates
     * @throws {Error} When fewer than 2 rays are created
     * @throws {Error} When rays don't have consistent anchor counts
     * @throws {Error} When any animation clip duration is not positive
     */
    constructor(polarActions: PolarAction[], centerAction?: AnimationAction);
    get blendValue(): {
        azimuth: number;
        radius: number;
    };
    /**
     * Sets the blend position in polar coordinates to determine animation weights.
     * Azimuth is normalized to [0, 2π) range and radius must be non-negative.
     * Recalculates weights using bilinear interpolation between the closest anchors.
     *
     * @param azimuth - Target angular position in radians. Will be normalized to [0, 2π).
     * @param radius - Target radial distance from origin.
     * @throws {Error} When azimuth is not a finite number
     * @throws {Error} When radius is not a finite non-negative number
     */
    setBlend(azimuth: number, radius: number): void;
    protected ["onEnterInternal"](): void;
    /**
     * Updates the influence for all active anchors in the polar blend tree.
     * Called when the tree's influence changes but relative weights remain the same.
     */
    protected updateAnchorsInfluence(): void;
    /**
     * Recalculates and updates animation weights based on current blend position.
     * Finds the two adjacent rays containing the current azimuth and applies
     * appropriate interpolation (linear for center, bilinear for grid).
     */
    private updateAnchors;
    /**
     * Calculates bilinear interpolation weights for the four corner anchors in the polar grid.
     * Performs interpolation between four points in a rectangular grid pattern.
     *
     * @param weights - Map to store calculated weights for each anchor
     * @param lRayT - Weight for the left ray
     * @param rRayT - Weight for the right ray
     * @param lRayIndex - Index of the left ray in the rays array
     * @param rRayIndex - Index of the right ray in the rays array
     */
    private calculateBilinearWeights;
}
