import { Constructor, valueof } from '../../../types/GlobalTypes';
import { Camera } from 'three';
import { LayersController } from './utils/LayersController';
import { TransformController } from './utils/TransformController';
import { ObjChildrenDisplayController } from './utils/ObjChildrenDisplayController';
import { DisplayNodeController } from '../utils/DisplayNodeController';
import { NodeContext } from '../../poly/NodeContext';
import { ThreejsViewer } from '../../viewers/Threejs';
import { FlagsControllerD } from '../utils/FlagsController';
import { BaseParamType } from '../../params/_Base';
import { BaseNodeType } from '../_Base';
import { BaseSopNodeType } from '../sop/_Base';
import { TypedObjNode } from './_Base';
import { BaseViewerType } from '../../viewers/_Base';
import { HierarchyController } from './utils/HierarchyController';
import { GeoNodeChildrenMap } from '../../poly/registers/nodes/Sop';
import { NodeParamsConfig } from '../utils/params/ParamsConfig';
import { NodeCreateOptions } from '../utils/hierarchy/ChildrenController';
export interface OrthoOrPerspCamera extends Camera {
    near: number;
    far: number;
    updateProjectionMatrix: () => void;
    getFocalLength?: () => void;
}
export declare function CameraMainCameraParamConfig<TBase extends Constructor>(Base: TBase): {
    new (...args: any[]): {
        setMainCamera: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BUTTON>;
    };
} & TBase;
export declare function ThreejsCameraTransformParamConfig<TBase extends Constructor>(Base: TBase): {
    new (...args: any[]): {
        camera: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.FOLDER>;
        /** @param controls node to allow the camera to be moved by user input */
        controls: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.NODE_PATH>;
        /** @param near */
        near: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.FLOAT>;
        /** @param far */
        far: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.FLOAT>;
        /** @param display */
        display: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BOOLEAN>;
        /** @param show helper */
        showHelper: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BOOLEAN>;
    };
} & TBase;
declare const BaseCameraObjParamsConfig_base: {
    new (...args: any[]): {
        setMainCamera: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BUTTON>;
    };
} & typeof NodeParamsConfig;
export declare class BaseCameraObjParamsConfig extends BaseCameraObjParamsConfig_base {
}
declare const BaseThreejsCameraObjParamsConfig_base: {
    new (...args: any[]): {
        doPostProcess: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BOOLEAN>;
        postProcessNode: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.NODE_PATH>;
    };
} & {
    new (...args: any[]): {
        render: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.FOLDER>;
        setScene: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BOOLEAN>;
        scene: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.NODE_PATH>;
        setRenderer: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BOOLEAN>;
        renderer: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.NODE_PATH>;
        setCSSRenderer: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BOOLEAN>;
        CSSRenderer: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.NODE_PATH>;
    };
} & {
    new (...args: any[]): {
        frameMode: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.INTEGER>;
        expectedAspectRatio: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.FLOAT>;
    };
} & {
    new (...args: any[]): {
        transform: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.FOLDER>;
        keepPosWhenParenting: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BOOLEAN>;
        rotationOrder: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.INTEGER>;
        t: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.VECTOR3>;
        r: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.VECTOR3>;
        s: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.VECTOR3>;
        scale: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.FLOAT>;
        matrixAutoUpdate: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BOOLEAN>;
        updateTransformFromObject: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BUTTON>;
    };
} & {
    new (...args: any[]): {
        layer: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.INTEGER>;
    };
} & {
    new (...args: any[]): {
        camera: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.FOLDER>;
        /** @param controls node to allow the camera to be moved by user input */
        controls: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.NODE_PATH>;
        /** @param near */
        near: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.FLOAT>;
        /** @param far */
        far: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.FLOAT>;
        /** @param display */
        display: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BOOLEAN>;
        /** @param show helper */
        showHelper: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BOOLEAN>;
    };
} & {
    new (...args: any[]): {
        setMainCamera: import("../utils/params/ParamsConfig").ParamTemplate<import("../../index_all").ParamType.BUTTON>;
    };
} & typeof NodeParamsConfig;
export declare class BaseThreejsCameraObjParamsConfig extends BaseThreejsCameraObjParamsConfig_base {
}
export interface BaseViewerOptions {
    element?: HTMLElement;
    updateAutoRenderOnIntersectionChange?: boolean;
}
export declare abstract class TypedCameraObjNode<O extends OrthoOrPerspCamera, K extends BaseCameraObjParamsConfig> extends TypedObjNode<O, K> {
    readonly renderOrder: number;
    protected _object: O;
    protected _aspect: number;
    get object(): O;
    cook(): Promise<void>;
    camera(): O;
    updateCamera(): void;
    static PARAM_CALLBACK_setMainCamera(node: BaseCameraObjNodeType): void;
    setAsMainCamera(): void;
    setupForAspectRatio(aspect: number): void;
    update_transform_params_from_object(): void;
    abstract createViewer(options?: BaseViewerOptions | HTMLElement): Promise<BaseViewerType | undefined>;
    static PARAM_CALLBACK_update_from_param(node: BaseCameraObjNodeType, param: BaseParamType): void;
}
export declare class TypedThreejsCameraObjNode<O extends OrthoOrPerspCamera, K extends BaseThreejsCameraObjParamsConfig> extends TypedCameraObjNode<O, K> {
    readonly flags: FlagsControllerD;
    readonly hierarchyController: HierarchyController;
    readonly transformController: TransformController;
    protected __layersController__: LayersController | undefined;
    private _layersController;
    readonly childrenDisplayController: ObjChildrenDisplayController;
    readonly displayNodeController: DisplayNodeController;
    protected _childrenControllerContext: NodeContext;
    initializeBaseNode(): void;
    createNode<S extends keyof GeoNodeChildrenMap>(node_class: S, options?: NodeCreateOptions): GeoNodeChildrenMap[S];
    createNode<K extends valueof<GeoNodeChildrenMap>>(node_class: Constructor<K>, options?: NodeCreateOptions): K;
    children(): BaseSopNodeType[];
    nodesByType<K extends keyof GeoNodeChildrenMap>(type: K): GeoNodeChildrenMap[K][];
    cook(): Promise<void>;
    static PARAM_CALLBACK_update_near_far_from_param(node: BaseThreejsCameraObjNodeType, param: BaseParamType): void;
    updateNearFar(): void;
    createViewer(options?: BaseViewerOptions | HTMLElement): Promise<ThreejsViewer<Camera> | undefined>;
    private _helper;
    initHelperHook(): void;
    helperVisible(): boolean;
    private _createHelper;
    _updateHelper(): void;
}
export type BaseCameraObjNodeType = TypedCameraObjNode<OrthoOrPerspCamera, BaseCameraObjParamsConfig>;
export declare abstract class BaseCameraObjNodeClass extends TypedCameraObjNode<OrthoOrPerspCamera, BaseCameraObjParamsConfig> {
}
export type BaseThreejsCameraObjNodeType = TypedThreejsCameraObjNode<OrthoOrPerspCamera, BaseThreejsCameraObjParamsConfig>;
export declare class BaseThreejsCameraObjNodeClass extends TypedThreejsCameraObjNode<OrthoOrPerspCamera, BaseThreejsCameraObjParamsConfig> {
    PARAM_CALLBACK_update_effects_composer(node: BaseNodeType): void;
}
export {};
