import type * as THREE from 'three';
import type { BaseHelper, MoveHelperAbstract, RotateHelperAbstract, Circle } from './Helper/BaseHelper';
import type { MoveController, UseFaceNormalInterface } from './Controllers/MoveController';
import type { Object3DHelper, AddObject3DHelperConfig } from './Controller';
import type { BaseController } from './Controllers/BaseController';
import type { RotateController } from './Controllers/RotateController';
import type { BoundingBoxController } from './Controllers/BoundingBoxController';
export interface Object3DHelperPluginState {
    enabled: boolean;
    visible: boolean;
    disposed: boolean;
}
export type HelperConfig<T extends object = object> = boolean | ({
    enable: boolean;
} & T);
export type Object3DHelperPluginEventMap = {
    show: (options?: {
        userAction?: boolean;
    }) => void;
    hide: (options?: {
        userAction?: boolean;
    }) => void;
    enable: (options?: {
        userAction?: boolean;
    }) => void;
    disable: (options?: {
        userAction?: boolean;
    }) => void;
    dispose: () => void;
    stateChange: (params: {
        state: Object3DHelperPluginState;
        prevState?: Object3DHelperPluginState;
    }) => void;
};
export type Direction = 'x' | 'y' | 'z' | 'xy' | 'xz' | 'yz' | 'plane';
export type Direction4 = 'nesw' | 'nwse' | 'ns' | 'ew';
export interface Scissor {
    left: number;
    bottom: number;
    width: number;
    height: number;
}
export type HelperEventMap = {
    wantToMove: (position: THREE.Vector3) => void;
    moveBefore: (position: THREE.Vector3) => void;
    wantToRotate: (quaternion: THREE.Quaternion) => void;
    wantToScale: (scale: THREE.Vector3) => void;
    move: (position: THREE.Vector3) => void;
    rotate: (quaternion: THREE.Quaternion) => void;
    scale: (scale: THREE.Vector3) => void;
    moveStart: (direction?: Direction) => void;
    rotateStart: (direction?: Direction) => void;
    scaleStart: (direction?: Direction | Direction4) => void;
    moveEnd: () => void;
    rotateEnd: () => void;
    scaleEnd: () => void;
    moveByMouseEnable: () => void;
    moveByMouseDisable: () => void;
    updateOtherHelpers: (params: {
        camera: THREE.Camera;
    }) => void;
};
export type InternalHelperEventMap = {
    initialHelperPosition: () => void;
    setObjectPosition: (position: THREE.Vector3) => void;
    setObjectRotate: (quaternion: THREE.Quaternion, origin?: THREE.Vector3) => void;
    setObjectScale: (scale: THREE.Vector3) => void;
    applyObjectPosition: (position: {
        matrix: THREE.Matrix4;
    }) => void;
    applyObjectRotate: (rotate: {
        quaternion: THREE.Quaternion;
        origin: THREE.Vector3;
    }) => void;
    applyObjectScale: (scale: {
        matrix: THREE.Matrix4;
        origin?: THREE.Vector3;
    }) => void;
};
export interface Object3DHelperState {
    enabled: boolean;
    visible: boolean;
    disposed: boolean;
}
export type Object3DHelperEventMap = HelperEventMap & {
    show: (options?: {
        userAction?: boolean;
    }) => void;
    hide: (options?: {
        userAction?: boolean;
    }) => void;
    enable: (options?: {
        userAction?: boolean;
    }) => void;
    disable: (options?: {
        userAction?: boolean;
    }) => void;
    dispose: () => void;
    stateChange: (params: {
        state: Object3DHelperState;
        prevState?: Object3DHelperState;
    }) => void;
};
export interface HelperOffset {
    x: number | {
        percents: number;
    };
    y: number | {
        percents: number;
    };
    z: number | {
        percents: number;
    };
}
export type Color = THREE.Color | string | number;
export type PositionFrom = 'objectPosition' | 'boundingBox' | 'boundingSphere' | THREE.Vector3 | ((object: THREE.Object3D) => THREE.Vector3);
export interface ObjectHelperControllers {
    moveController?: MoveController;
    rotateController?: RotateController;
    boundingBoxController?: BoundingBoxController;
}
export type ScaleCallback = (params: {
    intersectPoint: THREE.Vector3;
    scalePosition: ScalePosition;
    offset: THREE.Vector3;
}) => any;
export type ScalePosition = {
    id?: string;
    handlePosition: THREE.Vector3;
    basePosition: THREE.Vector3;
};
export interface Vector3Position {
    x: number;
    y: number;
    z: number;
}
export type Vector3WithArray = [number, number, number];
export interface Vector2Position {
    x: number;
    y: number;
}
export type Vector2WithArray = [number, number];
export type { BaseController, BoundingBoxController, MoveController, UseFaceNormalInterface, RotateController, MoveHelperAbstract, RotateHelperAbstract, Circle, BaseHelper, Object3DHelper, AddObject3DHelperConfig, };
