import type { GraphLookup } from '../graph/lookup'; import { startStateOf, statesOf, transitionsOf } from '../graph/stateMachine'; import { pictureSize } from '../properties/aspect'; import { resolveAssetProps } from '../properties/resolve'; import { bagWithoutItemTypes } from './Properties'; import { typeFields } from './structTypes'; import { findAssetOf, type Project } from './Project'; import { resolvePicture } from './texture'; /** * What a graph may see of the project around it. A behavior's `defaults` are its variable values; * every call starts from a copy of them, except for the variables it keeps (#229). */ export function graphLookup(project: Project): GraphLookup { return { behavior: (assetId) => { const asset = findAssetOf(project, assetId, 'behavior'); if (!asset) return null; return { name: asset.name, graph: asset.graph, defaults: bagWithoutItemTypes(resolveAssetProps(project, asset)), kept: asset.keptVariables ?? [], }; }, machine: (assetId) => { const asset = findAssetOf(project, assetId, 'statemachine'); if (!asset) return null; return { name: asset.name, states: statesOf(asset.graph), transitions: transitionsOf(asset.graph), start: startStateOf(asset.graph, asset.start), }; }, curve: (assetId) => findAssetOf(project, assetId, 'curve')?.points ?? null, structType: (assetId) => { const asset = findAssetOf(project, assetId, 'struct'); return asset ? { name: asset.name, fields: typeFields(asset).map((f) => f.key) } : null; }, textureSize: (pictureId) => { const ref = resolvePicture(project, pictureId); return ref ? pictureSize(ref) : null; }, }; }