import * as React from "react";
import * as THREE from "three";
import { Five, Model, State, WorkObserver, EventTypes, Subscribe } from "@realsee/five";
declare const INJECTION_PROPNAME = "$five";
type FiveInjectionDataFeature = "unsafe__fiveInstance" | "currentState" | "currentObserver" | "state" | "works" | "model" | "scene" | "cameraDirection" | "cameraRaycaster" | "modelReadyState" | "shownFloor" | "helperVisible";
type FiveInjectionActionFeature = "loadWork" | "setState" | "on" | "off" | "intersectRaycaster" | "project2d" | "updateCamera" | "getPixels" | "render" | "needsRender" | "preloadPano" | "showFloor" | "toggleHelperVisible";
type FiveInjectionFeature = FiveInjectionDataFeature | FiveInjectionActionFeature;
interface FiveInjectionTypes extends Subscribe<EventTypes> {
    /**
     * Five React Inject: 获取 five 实例
     * @description 不到万不得已，并不推荐直接使用。
     * @deprecated 不到万不得已，并不推荐直接使用。
     */
    unsafe__fiveInstance: Five;
    /**
     * Five React Inject: Five 的目标状态
     * @description
     * ```text
     * five 设置了以下状态
     *
     * - mode: Mode
     * - panoId: string
     * - panoIndex: number
     * - longitude: number
     * - latitude: number
     * - fov: number
     * - offset: THREE.Vector3
     *
     * 可以通过 state, currentState 和 setState 来获取和设置。
     * 通过 state 设置后，five 会通过合适的动画运动来达到设置的位置。
     * 来迎合一些通过数据驱动的场景。
     * ```
     */
    state: State;
    /**
     * Five React Inject: Five 的当前状态
     * @description
     * ```text
     * five 设置了以下状态
     *
     * - mode: Mode
     * - panoId: string
     * - panoIndex: number
     * - longitude: number
     * - latitude: number
     * - fov: number
     * - offset: THREE.Vector3
     *
     * 可以通过 state, currentState 和 setState 来获取和设置。
     * 通过 state 设置后，five 会通过合适的动画运动来达到设置的位置。
     * 来迎合一些通过数据驱动的场景。
     * ```
     */
    currentState: State;
    /**
     * Five React Inject: Five currentState
     */
    currentObserver: WorkObserver;
    /**
     * Five React Inject: Five cameraDirection
     */
    cameraDirection: THREE.Vector3;
    /**
     * Five React Inject: Five cameraRaycaster
     */
    cameraRaycaster: THREE.Raycaster;
    /**
     * Five React Inject: Five Work
     */
    work: Five['work'];
    /**
     * Five React Inject: Five Work
     */
    works: Five['works'];
    /**
     * Five React Inject: Five model
     */
    model: Five['model'];
    /**
     * Five React Inject: Five models
     */
    models: Five['models'];
    /**
     * Five React Inject: Five models
     */
    scene: Five['scene'];
    /**
     * Five React Inject: Five modelReadyState
     */
    modelReadyState: "Empty" | "Loaded" | undefined;
    /**
     * Five React Inject: Five shownFloor
     */
    shownFloor: number | null | undefined;
    /**
     * Five React Inject: Five helperVisible
     */
    helperVisible: boolean | undefined;
    /**
     * 设置 State
     * @description
     * ```text
     * five 设置了以下状态
     *
     * - mode: Mode
     * - panoId: string
     * - panoIndex: number
     * - longitude: number
     * - latitude: number
     * - fov: number
     * - offset: THREE.Vector3
     *
     * 可以通过 state, currentState 和 setState 来获取和设置。
     * 通过 state 设置后，five 会通过合适的动画运动来达到设置的位置。
     * 来迎合一些通过数据驱动的场景。
     * ```
     * @param state - 目标状态
     * @param immediately - 是否马上转换，马上转换会尽快达到目标状态，尽量减少中间状态，更少动画。
     */
    setState: Five["setState"];
    /**
     * 加载 Work 数据
     * @param inputWork - Work 数据
     * @param state - 初始化姿态
     *  - "inherit" 使用当前姿态
     *  - "initial" 使用 Work 数据中的 initial 姿态
     *  - State 自定义姿态
     * @param duration - 切换时间
     */
    loadWork: Five["load"];
    /**
     * 计算模型射线碰撞检测
     * @param raycaster - THREE 射线对象
     * @param floor - 和某一楼层做碰撞检测， 不传为和所有楼层做碰撞检测
     * @returns 返回碰撞
     */
    intersectRaycaster: Model["intersectRaycaster"];
    /**
     * 计算三维坐标对应到屏幕的二维坐标
     * @description
     * 如果三维坐标不在屏幕中，则返回 null
     * @param vector - 三维坐标
     * @param testModel - 是否计算模型遮挡
     * @returns 二维坐标 或者 null
     */
    project2d: Five["project2d"];
    /**
     * 移动相机。（不触发点位移动）
     * @description
     * 如果动画中途被打断（用户触发行为，或者调用 setState, load, changeMode）的等
     * 会 Promise.reject。运动完成则 Promise.resolve
     * @param pose - 相机目标位置
     * @param duration - 动画触发的时常
     * @returns Promise 是否移动成功
     */
    updateCamera: Five["updateCamera"];
    /**
     * 获取画面中的像素颜色
     * @param x - 获取像素区域的起始坐标 x
     * @param y - 获取像素区域的起始坐标 y
     * @param width - 获取像素区域的宽度
     * @param height - 获取像素区域的高度
     * @param pixelRatio - 获取区域的像素比
     * @returns rgba颜色平铺的 Uint8Array
     */
    getPixels: Five["getPixels"];
    /**
     * 强制渲染
     * @description
     * 调用 `render()` 和设置 `needsRender()` 均可在按需渲染时，使得画面渲染一次
     * 区别在于：
     * - `needsRender()` 为在下帧渲染画面
     * - `render()` 在当前帧渲染画面
     * 推荐使用 `needsRender()`, 可以更加流畅。但是如果需要截图等同步操作，可以使用 `render()`
     *
     * @param callback - 渲染完成回调
     */
    render: Five["render"];
    /**
     * 下一帧渲染
     * @description
     * 调用 `render()` 和设置 `needsRender()` 均可在按需渲染时，使得画面渲染一次
     * 区别在于：
     * - `needsRender()` 为在下帧渲染画面
     * - `render()` 在当前帧渲染画面
     * 推荐使用 `needsRender()`, 可以更加流畅。但是如果需要截图等同步操作，可以使用 `render()`
     *
     */
    needsRender: () => void;
    /**
     * 预加载点位图片资源
     * @param panoId - 观察点
     * @param callback - 加载完成回调, 并传递加载用时。
     * @returns 加载完成的 Promise 参数同 callback
     */
    preloadPano: Five["preloadPano"];
    /**
     * 显示楼层
     * @param floorIndex - 楼层，如果不传则都显示
     */
    showFloor: (floorIndex?: number) => void;
    /**
     * 帮助元素的隐藏/显示
     * @param visible - 隐藏/显示
     */
    toggleHelperVisible: (visible: boolean) => void;
}
interface PropTypeOfFiveFeatures<F extends FiveInjectionFeature[]> {
    [INJECTION_PROPNAME]: Pick<FiveInjectionTypes, F[number]>;
}
declare function withFive<F extends FiveInjectionFeature[]>(features: F): <P extends PropTypeOfFiveFeatures<F>, C extends React.ComponentClass<P>>(Component: C & React.ComponentClass<P>) => React.ForwardRefExoticComponent<React.PropsWithoutRef<Omit<P, "$five">> & React.RefAttributes<Omit<InstanceType<C>, "render" | "context" | "state" | "setState" | "forceUpdate" | "componentDidMount" | "shouldComponentUpdate" | "componentWillUnmount" | "componentDidCatch" | "getSnapshotBeforeUpdate" | "componentDidUpdate" | "componentWillMount" | "UNSAFE_componentWillMount" | "componentWillReceiveProps" | "UNSAFE_componentWillReceiveProps" | "componentWillUpdate" | "UNSAFE_componentWillUpdate" | "props" | "refs">>>;
declare function createFiveFeature<T extends FiveInjectionFeature>(...features: T[]): T[];
export { createFiveFeature, withFive, INJECTION_PROPNAME, PropTypeOfFiveFeatures, FiveInjectionTypes, FiveInjectionFeature, FiveInjectionDataFeature, FiveInjectionActionFeature, };
