import type { Ref } from '@vue/reactivity';
import { Intersection, Material, Object3D } from 'three';
import { ConvertToStrings } from '../../../../../types/GlobalTypes';
import { MouseButton, MouseButtons } from '../../../../../core/MouseButton';
export interface PriorityOptions {
    blockObjectsBehind: boolean;
    skipIfObjectsInFront: boolean;
}
export interface CPUOptions {
    traverseChildren: boolean;
    pointsThreshold: number;
    lineThreshold: number;
    intersectionRef: Ref<Intersection | null>;
}
export interface GPUOptions {
    worldPosMaterial: Material | null;
    distanceRef: Ref<number>;
}
export interface ObjectOptions {
    priority: PriorityOptions;
    cpu?: CPUOptions;
    gpu?: GPUOptions;
}
export interface EmptyOptions {
}
export declare function hasCPUOptions(optionsList: ObjectOptions[]): boolean;
export declare function hasGPUOptions(optionsList: ObjectOptions[]): boolean;
export declare function GPUOptionsDepthBufferRequired(optionsList: ObjectOptions[]): boolean;
export declare function CPUOptionsEqual(optionsList: ObjectOptions[]): boolean;
export declare function CPUOptionsMax(optionsList: ObjectOptions[], target: CPUOptions): CPUOptions;
export declare enum Status {
    REQUIRED = 0,
    OPTIONAL = 1,
    FORBIDDEN = 2
}
export declare const STATUS_OPTIONS: Status[];
export declare const STATUS_OPTION_LABEL: string[];
export declare const DEFAULT_STATUS_OPTION: number;
export declare const STATUS_MENU_OPTIONS: {
    menu: {
        entries: {
            value: Status;
            name: string;
        }[];
    };
};
export interface ButtonOptions {
    left: boolean;
    middle: boolean;
    right: boolean;
}
export interface ButtonsOptions {
    left: Status;
    middle: Status;
    right: Status;
}
export interface ModifierOptions {
    ctrl: Status;
    shift: Status;
    alt: Status;
}
export interface ButtonAndModifierOptions {
    button: ButtonOptions;
    modifier: ModifierOptions;
}
export interface ButtonsAndModifierOptions {
    button: ButtonsOptions;
    modifier: ModifierOptions;
}
export interface OnlyModifierOptions {
    modifier: ModifierOptions;
}
export interface ButtonAndModifierOptionsAsString {
    button: ConvertToStrings<ButtonOptions>;
    modifier: ConvertToStrings<ModifierOptions>;
}
export interface ButtonsAndModifierOptionsAsString {
    button: ConvertToStrings<ButtonsOptions>;
    modifier: ConvertToStrings<ModifierOptions>;
}
export interface ModifierOptionsAsString {
    modifier: ConvertToStrings<ModifierOptions>;
}
interface PropertyWithButtonConfig {
    config: ButtonAndModifierOptions;
}
interface PropertyWithButtonsConfig {
    config: ButtonsAndModifierOptions;
}
interface PropertyWithModifierConfig {
    config: OnlyModifierOptions;
}
export interface ButtonConfig {
    button: MouseButton;
    ctrl: boolean;
    shift: boolean;
    alt: boolean;
}
export interface ButtonsConfig {
    buttons: MouseButtons;
    ctrl: boolean;
    shift: boolean;
    alt: boolean;
}
export declare function propertyMatchesModifiersConfig(propertyConfig: OnlyModifierOptions, buttonsConfig: ButtonsConfig | ButtonConfig): boolean;
export declare function propertyMatchesButtonConfig(propertyConfig: ButtonAndModifierOptions, buttonConfig: ButtonConfig): boolean;
export declare function propertyMatchesButtonsConfig(propertyConfig: ButtonsAndModifierOptions, buttonsConfig: ButtonsConfig): boolean;
export declare function buttonConfigFromEvent(event: Readonly<PointerEvent | MouseEvent | TouchEvent>, target: ButtonConfig): void;
export declare function buttonsConfigFromEvent(event: Readonly<PointerEvent | MouseEvent | TouchEvent>, target: ButtonsConfig): void;
export declare function filterObjectsWithMatchButtonConfig(event: Readonly<PointerEvent | MouseEvent | TouchEvent>, objects: Object3D[], propertiesListByObject: Map<Object3D, PropertyWithButtonConfig[]>, target: Object3D[]): void;
export declare function filterObjectsWithMatchButtonsConfig(event: Readonly<PointerEvent | MouseEvent | TouchEvent>, objects: Object3D[], propertiesListByObject: Map<Object3D, PropertyWithButtonsConfig[]>, target: Object3D[]): void;
export declare function filterObjectsWithMatchModifiersConfig(event: Readonly<PointerEvent | MouseEvent | TouchEvent>, objects: Object3D[], propertiesListByObject: Map<Object3D, PropertyWithModifierConfig[]>, target: Object3D[]): void;
export {};
