import { type AnyNodeId, type Interactive, type SceneGraph } from '@pascal-app/core'; import { type AnimationAction, type Object3D } from 'three'; /** An interactive item recovered from the scene graph so the baked GLB can be * re-lit / re-animated by joining on `pascalId`. The GLB carries the geometry * + identity; the effects + controls live in the DB scene graph (no sidecar). */ export type GlbInteractiveItem = { pascalId: AnyNodeId; label: string; /** Item height (world units) for placing the controls overlay above it. */ height: number; interactive: Interactive; }; /** A baked zone's identity node + its local floor polygon (from `extras`). */ export type GlbZoneRef = { id: string; node: Object3D; polygon: [number, number][]; }; /** Pull the interactive items out of a scene graph. Only items that actually * carry effects (light / animation) are returned — everything else baked * faithfully and needs no runtime help. */ export declare function buildGlbInteractiveItems(sceneGraph: SceneGraph | null | undefined): GlbInteractiveItem[]; /** * Re-creates the item-driven interactivity the parametric viewer has — pooled * lights, ambient animation, and the controls overlay — on top of a baked GLB. * Effects come from the DB scene graph (`items`); world transforms come from the * baked Object3Ds (`identity`), joined on `pascalId`. Nothing is stamped into * the GLB itself, so the artifact stays integrator-clean. */ export declare function GlbInteractive({ items, identity, zones, actions, levelOrder, }: { items: GlbInteractiveItem[]; identity: Map; zones: GlbZoneRef[]; /** Baked animation actions keyed by clip name — ambient item loops play from * `: loop`. */ actions: Record; /** Level pascalIds bottom-to-top, so the light pool can prefer ground-floor * lights when nothing is focused (mirrors the parametric level factor). */ levelOrder: string[]; }): import("react").JSX.Element; //# sourceMappingURL=glb-interactive.d.ts.map