/** * Scene-graph assembly for non-stellar bodies (rocky / metallic / gaseous). * * Pure assembly: builds every mesh + shell + handle the planet path needs * and packages them in a flat record. View-state management lives in * `createPlanetViewSwitcher`; the body factory glues both together and * exposes the public `Body` handle. * * Stars use a separate pipeline (`useStar`) — they do not flow through * this assembler. */ import * as THREE from 'three'; import type { PlanetConfig } from '../../types/body.types'; import type { TerrainLevel } from '../types/terrain.types'; import type { BodySimulation } from '../../sim/BodySimulation'; import type { BodyVariation } from './bodyVariation'; import type { ShadowUniforms, OccluderUniforms } from '../hex/hexMeshShared'; import type { HoverChannel } from '../state/hoverState'; import type { GraphicsUniforms } from '../hex/hexGraphicsUniforms'; import type { RenderQuality } from '../quality/renderQuality'; import { buildSmoothSphereMesh } from './buildSmoothSphereMesh'; import { buildLayeredInteractiveMesh } from '../layered/buildLayeredInteractiveMesh'; import { buildBodyHoverOverlay } from '../shells/buildBodyHoverOverlay'; import { buildCoreMesh } from '../shells/buildCoreMesh'; import { type AtmoShellHandle } from '../shells/buildAtmoShell'; import { type AtmoBoardMesh } from '../atmo/buildAtmoBoardMesh'; import { makeInteractiveController } from './interactiveController'; import { type BodyTypeStrategy } from './bodyTypeStrategy'; /** Inputs needed by the planet assembler. */ export interface AssemblePlanetInputs { config: PlanetConfig; sim: BodySimulation; palette: TerrainLevel[]; variation: BodyVariation; hoverChannel: HoverChannel; graphicsUniforms: GraphicsUniforms; quality?: RenderQuality; } /** Flat bag of every handle the planet path produces. */ export interface PlanetSceneGraph { group: THREE.Group; strategy: BodyTypeStrategy; smoothSphere: ReturnType; displayMesh: THREE.Mesh; planetMaterial: ReturnType['planetMaterial']; /** Sol interactive mesh (single-band hex prisms). */ interactive: ReturnType; /** Sol-side interactive controller. Atmo board has its own controller. */ ctrl: ReturnType; bodyHover: ReturnType; coreMesh: ReturnType; atmoShell: AtmoShellHandle | null; /** * Atmosphere board — playable hex grid spanning `[solOuterRadius, * config.radius]`, built from its own hexasphere (independent * subdivision count from the sol mesh). `null` on bodies without an * atmosphere (`atmosphereThickness === 0`). Carries its own raycast * proxy (`atmoBoard.queryHover`) so the public `Body.interactive` can * route hover queries to the right board based on the active view. */ atmoBoard: AtmoBoardMesh | null; shadowUniforms: ShadowUniforms; occluderUniforms: OccluderUniforms; } /** * Assembles a non-stellar body's scene graph deterministically. No view * state, no tick loop — the caller wires those on top via * `createPlanetViewSwitcher` and the public factory. */ export declare function assemblePlanetSceneGraph(inputs: AssemblePlanetInputs): PlanetSceneGraph; //# sourceMappingURL=assemblePlanetSceneGraph.d.ts.map