import { Box3, BufferGeometry, Color, type ColorRepresentation, LineSegments, Matrix4, Mesh, Object3D } from 'three';
import type { Vec3, Vec4 } from './engine_types.js';
export type LabelHandle = {
    setText(str: string): any;
};
declare type ColorWithAlpha = Color & {
    a: number;
};
/** Gizmos are temporary objects that are drawn in the scene for debugging or visualization purposes
 * They are automatically removed after a given duration and cached internally to reduce overhead.
 * Use the static methods of this class to draw gizmos in the scene.
 */
export declare class Gizmos {
    private constructor();
    /**
     * Allow creating gizmos
     * If disabled then no gizmos will be added to the scene anymore
     */
    static enabled: boolean;
    /**
     * Returns true if a given object is a gizmo
     */
    static isGizmo(obj: Object3D): boolean;
    /**
     * Draw a label in the scene or attached to an object (if a parent is provided)
     * @returns a handle to the label that can be used to change the text
     */
    static DrawLabel(position: Vec3, text: string, size?: number, duration?: number, color?: ColorRepresentation, backgroundColor?: ColorRepresentation | ColorWithAlpha, parent?: Object3D): LabelHandle | null;
    static DrawRay(origin: Vec3, dir: Vec3, color?: ColorRepresentation, duration?: number, depthTest?: boolean): void;
    static DrawDirection(pt: Vec3, direction: Vec3 | Vec4, color?: ColorRepresentation, duration?: number, depthTest?: boolean, lengthFactor?: number): void;
    static DrawLine(pt0: Vec3, pt1: Vec3, color?: ColorRepresentation, duration?: number, depthTest?: boolean): void;
    static DrawCircle(pt0: Vec3, normal: Vec3, radius: number, color?: ColorRepresentation, duration?: number, depthTest?: boolean): void;
    static DrawWireSphere(center: Vec3, radius: number, color?: ColorRepresentation, duration?: number, depthTest?: boolean): void;
    static DrawSphere(center: Vec3, radius: number, color?: ColorRepresentation, duration?: number, depthTest?: boolean): void;
    static DrawWireBox(center: Vec3, size: Vec3, color?: ColorRepresentation, duration?: number, depthTest?: boolean): void;
    static DrawWireBox3(box: Box3, color?: ColorRepresentation, duration?: number, depthTest?: boolean): void;
    private static _up;
    static DrawArrow(pt0: Vec3, pt1: Vec3, color?: ColorRepresentation, duration?: number, depthTest?: boolean, wireframe?: boolean): void;
    /**
     * Render a wireframe mesh in the scene. The mesh will be removed after the given duration (if duration is 0 it will be rendered for one frame).
     * If a mesh object is provided then the mesh's matrixWorld and geometry will be used. Otherwise, the provided matrix and geometry will be used.
     * @param options the options for the wire mesh
     * @param options.duration the duration in seconds the mesh will be rendered. If 0 it will be rendered for one frame
     * @param options.color the color of the wire mesh
     * @param options.depthTest if true the wire mesh will be rendered with depth test
     * @param options.mesh the mesh object to render (if it is provided the matrix and geometry will be used)
     * @param options.matrix the matrix of the mesh to render
     * @param options.geometry the geometry of the mesh to render
     * @example
     * ```typescript
     * Gizmos.DrawWireMesh({ duration: 1, color: 0xff0000, mesh: myMesh });
     * ```
     */
    static DrawWireMesh(options: {
        duration?: number;
        color?: ColorRepresentation;
        depthTest?: boolean;
    } & ({
        mesh: Mesh;
    } | {
        matrix: Matrix4;
        geometry: BufferGeometry;
    })): void;
    /** Set visibility of all currently rendered gizmos */
    static setVisible(visible: boolean): void;
}
export declare function CreateWireCube(col?: ColorRepresentation | null): LineSegments;
export {};
