import { Box3, Intersection, Vector3, WebGLRenderer } from 'three'; import { FeatureInfo } from './mesh-helper'; import { MeshCollector, MeshSplitResolver, MeshCollectorQuery } from './MeshCollector'; import { StyleConfig } from './plugin/StyleHelper'; import { HighlightByPidsOptions, HighlightOptions } from './plugin/PartHighlightHelper'; import { PartVisibilityHelper } from './plugin/part-visibility-helper'; import { TilesRenderer } from '3d-tiles-renderer'; import { GLTFParserPluginOptions, ModelInfo, StructureData, StructureNode } from './plugin-types'; export type { GLTFParserPluginOptions, ModelInfo, StructureData, StructureNode, }; export declare class GLTFParserPlugin { name: string; private tiles; private _loader; private readonly _gltfRegex; private readonly _options; private _structureData; private _oidNodeMap; /** OID → 从根到该节点的斜杠分隔路径,如 "/1/5/7/";用于 condition 里按层级匹配后代 */ private _oidPathMap; /** rootTileset 已存在且已尝试过内嵌解析后仍为 null,则不再重复 gunzip */ private _structureEmbedResolved; /** * 内部数据:在原始属性表数据上注入层级 `_path`(`"/1/5/7/"` 形式)。 * 用法:condition 表达式里写 `_path && _path.indexOf('/7/') >= 0` 即可匹配 OID 7 及其所有后代; * 结构未就绪时 `_path` 为 `""`,表达式短路返回 false,不会抛错。 */ private _internalData; private _modelInfo; private _modelInfoPromise; private _interactionFilter; private _styleHelper; private _partHighlightHelper; /** 构件显隐(原 `hidePartsByOids` / `showPartsByOids` 逻辑) */ readonly partVisibility: PartVisibilityHelper; /** WebGLRenderer 实例,用于 mesh helper 等扩展 */ get renderer(): WebGLRenderer | null; private _renderer; readonly meshSplit: MeshSplitResolver; private collectors; /** 合并缩放时高频的 tile-visibility-change,避免每帧全量 applyStyle/reapplyAll */ private _tileVisibilityFollowUpTimer; /** * Create a GLTFParserPlugin instance * @param options configuration options */ constructor(options?: GLTFParserPluginOptions); /** * Plugin initialization, called by TilesRenderer */ init(tiles: TilesRenderer): void; private _createPartEffectHost; /** * 注销通过 {@link getMeshCollectorByCondition} 创建的收集器(与创建成对调用)。 * 样式/高亮在 clearStyle、切换样式、取消高亮时会内部调用;业务自建收集器也应在不用时调用。 */ releaseMeshCollector(collector: MeshCollector): void; /** * Fetch tile data with IndexedDB caching support */ fetchData(url: string, options?: RequestInit): Promise; /** * Clear all cached tile data from IndexedDB */ clearCache(): Promise; parseTile(buffer: ArrayBuffer, tile: any, extension: any, uri: string, abortSignal: AbortSignal): Promise; /** 与 tileset 同目录的侧车 JSON,如 structure.json / modelInfo.json */ private _tocJsonUrl; private _buildOidNodeMap; /** * 构建 OID → 路径字符串(形如 "/1/5/7/")。 * 无 `id` 的中间节点不写入自身,但它的父路径会继续传递给子节点; * 两端 `/` 是为了让 `path.indexOf('/X/') >= 0` 不会把 `X=7` 误匹配到 `17`/`75`。 */ private _buildOidPathMap; /** 仅根 tileset 变化时重解析 structureUri(子 tileset 的 load-tileset 不会触发) */ private _onLoadRootTilesetCB; /** * 从已加载根 tileset 的内嵌 structure(优先 asset.extras.maptalks.structureUri)同步解压并建索引。 * rootTileset 尚未就绪时返回 null,可稍后再次调用;已成功或已判定无内嵌数据后见 _structureEmbedResolved。 */ private _syncStructureFromTileset; /** * 根据 oid 获取结构树节点(数据来自 tileset 内嵌 structureUri 同步解压) */ getNodeTreeByOid(oid: number): StructureNode | null; /** * 根据 oid 从结构数据取轴对齐包围盒(`bbox` 为 `[minX,minY,minZ,maxX,maxY,maxZ]`,与 `selectByBox` 一致) * @returns 无对应节点或缺少有效 bbox 时返回 `null` */ getBoundingBoxByOid(oid: number): Box3 | null; /** * 计算给定 OID 集合的几何中心(世界坐标系与结构 bbox / 瓦片 mesh 一致)。 * 优先合并结构树中的轴对齐 bbox;若无有效 bbox 则合并对应 split mesh 的世界包围盒。 */ getCenterByOids(oids: readonly number[]): Vector3 | null; /** * 按属性条件筛选构件(语义同 `setStyle` 的 `show` / conditions 中的表达式字符串), * 返回筛选结果的整体中心点;合并方式同 {@link getCenterByOids}。 */ getCenterByCondition(condition: string): Vector3 | null; /** * 完整结构数据(与内嵌 structure JSON 一致) */ getStructureData(): StructureData | null; /** * 选择包围盒范围内的构件(坐标系与结构 bbox 一致) */ selectByBox(box: Box3): number[]; /** * 选择多边形(平面投影)范围内的构件 */ selectByPolygon(polygon: Vector3[], axis?: "xy" | "xz" | "yz"): number[]; /** * 根据 OID 获取精细模型(detail model)的 URL。 * 路径规则:与 tileset.json 同级 `details/{oid % 1000, 三位零填充}/{oid}.glb` */ getDetailModelUrl(oid: number): string; private _fetchModelInfo; private _ensureModelInfoLoaded; /** * 获取 modelInfo.json 数据 * 包含模型的基本信息:动画支持、材质数量、顶点数、三角形数等 * 首次调用时会自动从 tileset URL 推导并请求 modelInfo.json */ getModelInfo(): Promise; /** * Load model callback */ private _onLoadModelCB; /** * LRU 瓦片再次显示时不会走 load-model。 * 仅对本 scene 做轻量显隐;样式/高亮全量重算合并到防抖回调(缩放时会高频触发)。 */ private _onTileVisibilityChangeCB; private _scheduleTileVisibilityFollowUp; /** 防抖后:只刷新隐藏 OID 列表 + 收集器 mesh,不 teardown 样式/高亮收集器 */ private _runTileVisibilityFollowUp; private _clearTileVisibilityFollowUpTimer; /** * 瓦片卸载(LRU 等触发 disposeTile)前,先卸掉依赖该 tile 场景的 split mesh,再清瓦片 userData 上的几何缓存。 * 与 3d-tiles-renderer 中 `TilesRenderer.disposeTile` 派发顺序一致。 */ private _onDisposeModelCB; /** * Tiles load end callback */ private _onTilesLoadEndCB; private _onLoadModel; private _notifyCollectors; /** * Query feature information from intersection * Respects freeze and isolate filters */ queryFeatureFromIntersection(hit: Intersection): FeatureInfo; /** * 将 `freeze` / `unfreeze` / `isolate` / `unisolate` 的参数解析为 OID 列表。 * 数组参数视为 OID 列表;字符串参数视为与 `setStyle` 中 `show` 同语义的属性条件表达式。 */ private _getOidsForInteractionFilterSelection; /** * 冻结构件(射线拾取等交互将忽略这些构件)。参数为 OID 数组,或与 `setStyle` 的 `show` 同语义的属性条件字符串。 */ freeze(selection: number[] | string): void; /** * 取消冻结。参数为 OID 数组,或与 `setStyle` 的 `show` 同语义的属性条件字符串(匹配到的 OID 会从冻结集中移除)。 */ unfreeze(selection: number[] | string): void; /** 取消全部冻结 */ unfreezeAll(): void; /** * 仅显示这些构件的交互(其余构件交互被屏蔽)。参数为 OID 数组,或与 `setStyle` 的 `show` 同语义的属性条件字符串。 */ isolate(selection: number[] | string): void; /** * 从隔离集合中移除指定 OID。参数为 OID 数组,或与 `setStyle` 的 `show` 同语义的属性条件字符串。 */ unisolate(selection: number[] | string): void; /** 取消全部隔离(恢复为未隔离状态) */ unisolateAll(): void; /** * 合并 OID 列表对应的结构 bbox;若无可用 bbox 则使用 split mesh 世界包围盒并求中心。 */ private _getCenterFromOidList; /** * 根据查询创建新的 MeshCollector(featureIds + 可选 condition)。 * 每次调用都会新建实例;相同 condition / featureIds 多次调用会得到多个独立收集器,可同时存在。 */ getMeshCollectorByCondition(query: MeshCollectorQuery): MeshCollector; /** * 设置构件样式(条件可见性 + 条件材质) * @param style 样式配置,传 null 清除样式 */ setStyle(style: StyleConfig | null): void; /** * 当前样式配置。赋值与 `setStyle(...)` 等价,例如 `plugin.style = { show, conditions }`。 */ get style(): StyleConfig | null; set style(style: StyleConfig | null); /** * 清除构件样式 */ clearStyle(): void; /** * 高亮指定构件(语义与 setStyle 一致:show、conditions、可选 featureIds,另需 name 标识分组) * @param options 高亮配置;PID 通道请设 `featureIdAttribute: 1` 或使用 conditions 对象形式 */ highlight(options: HighlightOptions): void; /** * @deprecated 请使用 highlight({ ...options, featureIdAttribute: 1 }) */ highlightByPids(options: HighlightByPidsOptions): void; /** * @deprecated 请使用 getHighlightByName */ getHighlightByPidName(name: string): HighlightByPidsOptions | undefined; /** * 按名称获取最近一次 highlight 传入的配置(取消高亮后返回 undefined) */ getHighlightByName(name: string): HighlightOptions | undefined; /** * 按名称获取 highlight 位姿对应的4×4 矩阵(列主序 16 个数)。多种不同 TRS 条件并存时返回 undefined。 */ getHighlightMatrixByName(name: string): number[] | undefined; /** * 取消指定名称的高亮 * @param name 高亮组名称 */ cancelHighlight(name: string): void; /** * 取消指定名称的 PID 高亮 */ cancelHighlightByPid(name: string): void; /** * 取消所有高亮 */ cancelAllHighlight(): void; /** * 取消所有 PID 高亮 */ cancelAllHighlightByPid(): void; _registerMeshCollector(collector: MeshCollector): void; _unregisterMeshCollector(collector: MeshCollector): void; /** * Plugin disposal */ dispose(): void; } //# sourceMappingURL=GLTFParserPlugin.d.ts.map