import { Euler, Material, Matrix4, Mesh, Object3D, Vector3 } from 'three'; import { StyleAppearance, StyleCondition, StyleConditionInput, StyleEulerInput, StyleMaterialMaps, StyleShowInput, StyleVec3Input } from './style-appearance-types'; /** 单个 mesh 在样式应用前的原始 TRS 快照,用于取消样式时复位 */ export type StoredTransform = { position: Vector3; scale: Vector3; rotation: Euler; }; /** * 按 split mesh.uuid 缓存原始材质 / 原始 TRS 的两张表。 * * - 由调用方持有(每个 helper / 每次 setStyle 一份),生命周期与样式应用一致; * - 仅在第一次为某个 mesh 应用样式时写入,后续重复应用不会覆盖原始值; * - 取消样式时由 {@link restoreMeshAppearanceMaps} 读出并删除条目。 */ export interface MeshAppearanceMaps { originalMaterialByMesh: Map; originalTransformByMesh: Map; } /** 从构件材质提取贴图,供 material 回调使用 */ export declare function extractStyleMaterialMaps(material: Material): StyleMaterialMaps; /** 将 Vec3 输入序列化为稳定字符串,仅用作 {@link appearanceGroupKey} 的拼装片段 */ export declare function vec3Key(v: StyleVec3Input | undefined): string; /** 同 {@link vec3Key},但保留 Euler 的 order,以保证不同 order 不会被误合并到同一分组 */ export declare function eulerKey(r: StyleEulerInput | undefined): string; /** 将 {@link StyleVec3Input}(Vector3 或 [x,y,z])写入 target,原地修改 */ export declare function applyVec3(target: Vector3, input: StyleVec3Input): void; /** 将 {@link StyleEulerInput}(Euler 或 [x,y,z(,order)])写入 target,原地修改 */ export declare function applyEuler(target: Euler, input: StyleEulerInput): void; /** * 把一个 {@link StyleAppearance} 序列化为分组 key,决定哪些 OID 会被合并到同一个 * MeshCollector / split mesh 实例中。 * * 包含的字段:material(实例 uuid 或回调身份)、color、opacity、mesh 工厂身份、TRS 与枢轴。 * 任意一项不同即应分到不同 group,否则它们会共用同一终态 Material/Mesh 实例 * 造成"后写覆盖前写"。 * * 注意 {@link resolveStyleMaterial} 是按外观逐 mesh 解析的,本 key 只决定"逻辑分组", * Material 实例的真正共享靠 {@link defaultColorMaterialCache} / * {@link colorOverrideMaterialCache} 兜底。 */ export declare function appearanceGroupKey(a: StyleAppearance): string; /** * 构建"绕枢轴 pivot 的缩放 + 旋转"矩阵:M = T(p) · R · S · T(-p)。 * * 即先把 pivot 平移到原点应用 S/R,再平移回去——这样不同 mesh 即使坐标各异, * 给它们配置相同的 origin(如 mesh 自身中心)就能得到一致的"原地缩放/旋转"效果。 */ export declare function buildPivotStyleMatrix(pivot: Vector3, sx: number, sy: number, sz: number, euler: Euler): Matrix4; /** * 顺序评估条件并返回**首个**命中的外观(first-match 语义,专供 `setStyle` 使用)。 * * 若需要"所有命中条件都生效"(如 highlight 的填充 + 线框叠加),调用方应改走 * `PartHighlightHelper.buildAppearanceGroups` 的 all-match 实现,而非本函数。 */ export declare function resolveConditionsAppearance(conditions: [StyleConditionInput, T][] | undefined, propertyData: Record | null, evaluators?: ReadonlyMap, featureIdAttribute?: number): T | null; /** * setStyle 的核心分组逻辑:把 feature id → propertyData * 经 `show` 过滤、conditions first-match 评估后,按 {@link appearanceGroupKey} 聚合。 */ export declare function buildAppearanceGroupsFromPropertyMap(propertyMap: Map | null>, config: { show?: StyleShowInput; conditions: StyleCondition[]; }, evaluators?: ReadonlyMap, featureIdAttribute?: number): { hiddenFeatureIdsList: number[]; groups: Map; }; /** * 从场景图移除样式 split mesh(及 `appearance.mesh` 工厂产物)。 * 必须在把 `geometry` 置为 `null` 之前调用,否则渲染时 `Frustum.intersectsObject` 会读 `null.boundingSphere` 崩溃。 */ export declare function detachStyledMeshFromScene(mesh: Mesh): void; /** * 撤销 {@link applyStyleAppearanceToMesh} 对该 mesh 的所有副作用: * * 1. 把 material 还原为应用前的原始 Material; * 2. 把 position/scale/rotation 还原为快照值; * 3. 若曾经使用过 `appearance.mesh` 工厂产生的辅助 Object3D,把它从场景图移除。 * * 还原后会从 {@link MeshAppearanceMaps} 中删除对应条目,可重复调用是幂等的。 */ export declare function restoreMeshAppearanceMaps(mesh: Mesh, maps: MeshAppearanceMaps): void; export declare function applyStyleAppearanceToMesh(mesh: Mesh, appearance: StyleAppearance, scene: Object3D, maps: MeshAppearanceMaps): void; //# sourceMappingURL=style-appearance-shared.d.ts.map