import { Point } from '../../types'; /** * three.js 的对象(Scene / Camera / WebGLRenderer / Object3D 等)。 * 本库不依赖 three,也不想把 three 的类型塞进公共 API,交由宿主自行断言。 */ export type ThreeObject = any; /** SDK ThreeLayer 实例上实际存在的成员(取自 v4 bundle) */ export interface ThreeLayerInstance { scene?: ThreeObject; camera?: ThreeObject; renderer?: ThreeObject; map?: ThreeObject; add(object: ThreeObject): void; remove(object: ThreeObject): void; getScene(): ThreeObject; getCamera(): ThreeObject; getRender(): ThreeObject; getMap(): ThreeObject | null; triggerRepaint(): void; triggerStop(): void; refreshMap(): void; pick(x: number, y: number): ThreeObject[] | null; } /** * 生命周期回调。 * * SDK 用 `hook.bind(this)(renderer, scene, camera)` 调用,所以普通函数里的 `this` 是 SDK 图层实例; * 第 4 个参数 `layer` 是组件对外的命令式句柄(与 ref 拿到的是同一个对象),箭头函数用它。 */ export type ThreeLayerHook = (this: ThreeLayerInstance, renderer: ThreeObject, scene: ThreeObject, camera: ThreeObject, layer: ThreeLayerRef) => void; /** 命令式句柄。图层实例要等 GL 就绪才有,所以句柄本身始终存在,成员在就绪前为 null / no-op。 */ export interface ThreeLayerRef { /** SDK 图层实例;GL 就绪(onInit 触发)前为 null */ readonly raw: ThreeLayerInstance | null; readonly scene: ThreeObject | null; readonly camera: ThreeObject | null; readonly renderer: ThreeObject | null; add(object: ThreeObject): void; remove(object: ThreeObject): void; triggerRepaint(): void; triggerStop(): void; refreshMap(): void; pick(x: number, y: number): ThreeObject[] | null; /** * 经纬度 → three.js 世界坐标(相对固定墨卡托基准点的偏移,单位约等于米)。 * * 走 map.toFormatCoords,而不是实例上的 convertLngLat —— 后者在 v4 里是坏的: * 它把 `map.toFormatCoords`(一个函数)当成带 setCenter 的对象用,一调就 TypeError。 */ toWorld(point: Point): [number, number] | null; } export interface ThreeLayerOptions { /** 传给 THREE.WebGLRenderer 的 alpha,默认 false。变化会重建图层。 */ alpha?: boolean; /** 传给 THREE.WebGLRenderer 的 antialias,默认 false。变化会重建图层。 */ antialias?: boolean; /** 是否显示,默认 true */ visible?: boolean; /** 最小显示级别,默认 3 */ minZoom?: number; /** 最大显示级别,默认 21 */ maxZoom?: number; /** 层级,默认 1 */ zIndex?: number; /** * 参考中心点。只会写到实例的 this.center,而 v4 的 ThreeLayer.render 取的矩阵 * (_updatePolyLayerMatrix)并不带它 —— 世界坐标只能相对默认墨卡托基准点, * 传了反而对不上,一般不用给。 */ referCenter?: Point; /** * @deprecated 对 ThreeLayer 无效。NormalLayer 构造函数会存 this.opacity、也提供 * setOpacity/getOpacity,但 ThreeLayer.render 只做 renderer.render(scene, camera), * 整块原型里从不读它(真正消费它的是 LineLayer / FillLayer 这类自己写 shader、 * 把它当 u_opacity uniform 的图层)。three.js 的透明度请设在材质上 * (material.transparent = true 且 material.opacity = x)。 */ opacity?: number; } export interface ThreeLayerProps extends ThreeLayerOptions { /** GL 就绪、场景/相机/渲染器创建完成后调用,在这里往场景里加物体 */ onInit?: ThreeLayerHook; /** * 接管渲染。SDK 里这是 if/else:接了它就**不再**调用默认的 * renderer.render(scene, camera),必须自己渲染。变化会重建图层。 */ onRender?: ThreeLayerHook; /** 每帧渲染前 */ preRender?: ThreeLayerHook; /** 每帧渲染后 */ afterRender?: ThreeLayerHook; /** 图层销毁前。SDK 随后会 dispose 场景与渲染器,场景里的物体不需要自己清 */ onDestroy?: ThreeLayerHook; /** 因 visible / 缩放级别超出 [minZoom, maxZoom] 而隐藏时 */ onHide?: ThreeLayerHook; /** 从隐藏恢复显示时 */ onShow?: ThreeLayerHook; } export declare const ThreeLayer: import('react').MemoExoticComponent>>;