import * as THREE from 'three';
import type { Group, Mesh, Object3D } from 'three';
import { Vector3 } from 'three';
import type { Direction, PositionFrom } from '../typing';
import type { tipsDom } from '../utils/tipsDom';
export interface BaseHelperConfig {
    onRender?: () => any;
    /**
     * @description: helper 初始位置来源
     * @default 'objectPosition'
     */
    positionFrom?: PositionFrom;
}
export declare abstract class BaseHelper<OriginObject3D extends Object3D = Object3D> extends THREE.Object3D {
    protected originObject3D: OriginObject3D;
    protected onRender: () => any;
    private positionFrom;
    removeChildren(): this;
    add(...objects: Object3D[]): this;
    addIfNotExists(...objects: Object3D[]): this;
    remove(...objects: Object3D[]): this;
    removeFromParent(): this;
    get helperObject(): Object3D;
    constructor(originObject3D: OriginObject3D, config?: BaseHelperConfig);
    render(): void;
    enable(): void;
    disable(): void;
    show(): void;
    hide(): void;
    raycasterIntersectObject(raycaster: THREE.Raycaster, intersection?: THREE.Intersection[]): THREE.Intersection[];
    initialPosition(offset?: THREE.Vector3): void;
    setScaleByCamera(camera: THREE.PerspectiveCamera | THREE.OrthographicCamera): void;
    initQuaternion(config?: {
        xAxis?: Vector3 | (() => Vector3);
        yAxis?: Vector3 | (() => Vector3);
        zAxis?: Vector3 | (() => Vector3);
    }): void;
    applyHelperScaleMatrix4(matrix: THREE.Matrix4, origin?: Vector3): void;
    setHelperQuaternion(quaternion: THREE.Quaternion, origin?: Vector3): void;
    applyHelperQuaternion(quaternion: THREE.Quaternion, origin?: Vector3): void;
    dispose(): void;
}
export declare abstract class MoveHelperAbstract<OriginObject3D extends Object3D = Object3D> extends BaseHelper<OriginObject3D> {
    abstract xArrow?: Object3D & {
        arrow: Object3D;
        line?: Object3D;
        direction: Direction;
    };
    abstract yArrow?: Object3D & {
        arrow: Object3D;
        line?: Object3D;
        direction: Direction;
    };
    abstract zArrow?: Object3D & {
        arrow: Object3D;
        line?: Object3D;
        direction: Direction;
    };
    abstract centerHandle?: Object3D & {
        direction: Direction;
    };
    abstract xyPlane?: Object3D & {
        direction: Direction;
    };
    abstract xzPlane?: Object3D & {
        direction: Direction;
    };
    abstract yzPlane?: Object3D & {
        direction: Direction;
    };
    abstract moveTips?: {
        element: HTMLElement;
        show: () => void;
        hide: () => void;
        setLeftTop: (left: string, top: string) => void;
    };
    abstract showDraggingHelper(directions?: Direction[]): void;
    abstract update(camera: THREE.Camera): void;
}
export declare abstract class BoundingBoxHelperAbstract<OriginObject3D extends Object3D = Object3D> extends BaseHelper<OriginObject3D> {
}
export type Circle = (Mesh | Group) & {
    direction: Direction;
    circle: Mesh;
    angleSector?: Mesh & {
        angleDirection: number;
        baseAxes: Vector3;
    };
};
export declare abstract class RotateHelperAbstract<OriginObject3D extends Object3D = Object3D> extends BaseHelper<OriginObject3D> {
    abstract xCircle?: Circle;
    abstract yCircle?: Circle;
    abstract zCircle?: Circle;
    abstract angleTips?: ReturnType<typeof tipsDom>;
    abstract showDraggingHelper(directions: Direction[]): void;
    abstract update(camera: THREE.Camera): void;
}
