@pixi-ui-editor/schema 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assetReferences.d.ts +17 -0
- package/dist/assetReferences.d.ts.map +1 -0
- package/dist/assetReferences.js +79 -0
- package/dist/assetReferences.js.map +1 -0
- package/dist/bindingKeys.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -20
- package/dist/index.js.map +1 -1
- package/dist/nodeReferences.js.map +1 -1
- package/dist/prefabs.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeReferences.js","sourceRoot":"","sources":["../src/nodeReferences.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PrefabInstanceNode } from \"./prefabs.js\";\
|
|
1
|
+
{"version":3,"file":"nodeReferences.js","sourceRoot":"","sources":["../src/nodeReferences.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PrefabInstanceNode } from \"./prefabs.js\";\nimport type { SpineConnector, UINode } from \"./index.js\";\n\n/** A reference can be rewritten, or removed when its target no longer belongs to the operation. */\nexport type NodeReferenceRewriter = (address: string) => string | undefined;\n\nfunction rewriteAddress(value: string | undefined, rewrite: NodeReferenceRewriter): string | undefined {\n return value === undefined ? undefined : rewrite(value);\n}\n\nfunction rewriteConnectorArray(value: SpineConnector[] | undefined, rewrite: NodeReferenceRewriter): SpineConnector[] | undefined {\n if (value === undefined) return undefined;\n const connectors = value.flatMap((connector) => {\n const targetNodeId = rewrite(connector.targetNodeId);\n return targetNodeId === undefined ? [] : [{ ...connector, targetNodeId }];\n });\n return connectors.length === 0 ? undefined : connectors;\n}\n\n/**\n * The sole inventory of semantic node-to-node reference fields.\n *\n * Structural hierarchy links (`parentId` and `children`) intentionally do not participate: their\n * remapping has different ownership rules. Every operation which copies, deletes, materializes or\n * unpacks semantic node references must call this helper instead of switching on node types itself.\n */\nexport function rewriteNodeReferences(node: UINode, rewrite: NodeReferenceRewriter): void {\n if (node.type === \"spine\") {\n const connectors = rewriteConnectorArray(node.connectors, rewrite);\n if (connectors === undefined) delete node.connectors;\n else node.connectors = connectors;\n return;\n }\n if (node.type === \"pagination\") {\n const prevButtonNodeId = rewriteAddress(node.prevButtonNodeId, rewrite);\n const nextButtonNodeId = rewriteAddress(node.nextButtonNodeId, rewrite);\n if (prevButtonNodeId === undefined) delete node.prevButtonNodeId;\n else node.prevButtonNodeId = prevButtonNodeId;\n if (nextButtonNodeId === undefined) delete node.nextButtonNodeId;\n else node.nextButtonNodeId = nextButtonNodeId;\n return;\n }\n if (node.type === \"page-group\") {\n const pageUpButtonNodeId = rewriteAddress(node.pageUpButtonNodeId, rewrite);\n const pageDownButtonNodeId = rewriteAddress(node.pageDownButtonNodeId, rewrite);\n if (pageUpButtonNodeId === undefined) delete node.pageUpButtonNodeId;\n else node.pageUpButtonNodeId = pageUpButtonNodeId;\n if (pageDownButtonNodeId === undefined) delete node.pageDownButtonNodeId;\n else node.pageDownButtonNodeId = pageDownButtonNodeId;\n return;\n }\n if (node.type === \"item-table\" && node.items !== undefined) {\n const items = node.items.flatMap((itemId) => {\n const mapped = rewrite(itemId);\n return mapped === undefined ? [] : [mapped];\n });\n if (items.length === 0) delete node.items;\n else node.items = items;\n }\n}\n\n/**\n * Applies the same inventory to sparse prefab patches. Patches are intentionally untyped records,\n * so this is the only permitted place to inspect their reference-shaped fields.\n */\nexport function rewritePrefabInstanceReferencePatches(instance: PrefabInstanceNode, rewrite: NodeReferenceRewriter): void {\n for (const override of instance.propertyOverrides ?? []) {\n const patch = override.patch as Record<string, unknown>;\n if (Array.isArray(patch.connectors)) {\n const connectors = patch.connectors.flatMap((value) => {\n if (typeof value !== \"object\" || value === null) return [];\n const connector = value as Partial<SpineConnector>;\n if ((connector.partType !== \"bone\" && connector.partType !== \"slot\") || typeof connector.partName !== \"string\" || typeof connector.targetNodeId !== \"string\") return [];\n const targetNodeId = rewrite(connector.targetNodeId);\n return targetNodeId === undefined ? [] : [{ ...connector, targetNodeId }];\n });\n if (connectors.length === 0) delete patch.connectors;\n else patch.connectors = connectors;\n }\n for (const field of [\"prevButtonNodeId\", \"nextButtonNodeId\", \"pageUpButtonNodeId\", \"pageDownButtonNodeId\"] as const) {\n if (typeof patch[field] !== \"string\") continue;\n const mapped = rewrite(patch[field]);\n if (mapped === undefined) delete patch[field];\n else patch[field] = mapped;\n }\n if (Array.isArray(patch.items)) {\n const items = patch.items.flatMap((item) => typeof item === \"string\" ? (() => {\n const mapped = rewrite(item);\n return mapped === undefined ? [] : [mapped];\n })() : []);\n if (items.length === 0) delete patch.items;\n else patch.items = items;\n }\n }\n}\n"]}
|
package/dist/prefabs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefabs.js","sourceRoot":"","sources":["../src/prefabs.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PrefabDefinition, PrefabNodeOverride, ProjectDocument, UINode } from \"./index.js\";\r\nimport { collectBindingKeys, collectBindingKeyScopes } from \"./bindingKeys.js\";\r\nimport { rewriteNodeReferences, rewritePrefabInstanceReferencePatches } from \"./nodeReferences.js\";\r\n\r\nconst STRUCTURAL_OVERRIDE_KEYS = new Set([\"id\", \"type\", \"parentId\", \"children\", \"editorOnly\", \"locked\", \"prefabId\", \"propertyOverrides\", \"locallyAddedNodes\"]);\r\n\r\n/**\r\n * Разделитель сегментов адреса внутри инстанса пресета.\r\n *\r\n * Адрес — это путь по вложенным пресетам: `defA` — узел определения самого инстанса,\r\n * `defA::prefab-node::defB` — узел `defB` внутри инстанса `defA`, вложенного в определение. Документ\r\n * до вложенных пресетов хранил ровно один сегмент, поэтому старые адреса остаются валидными путями.\r\n */\r\nexport const PREFAB_NODE_PATH_SEPARATOR = \"::prefab-node::\";\r\n\r\nexport type PrefabInstanceNode = Extract<UINode, { type: \"prefab-instance\" }>;\r\n\r\n/**\r\n * Откуда взялся узел развёрнутого инстанса.\r\n *\r\n * `instanceId` всегда указывает на **персистентный** узел-инстанс: сцену/пресет-владельца или\r\n * локально добавленный инстанс. Именно в нём хранятся `propertyOverrides` и `locallyAddedNodes` для\r\n * этого узла. `inherited` — часть структуры пресета: её можно переопределить по свойствам (patch\r\n * адресуется `nodePath`), но нельзя удалить или перенести. `local` — обычный редактируемый узел.\r\n */\r\nexport type MaterializedPrefabNodeOrigin =\r\n | { kind: \"inherited\"; instanceId: string; nodePath: string }\r\n | { kind: \"local\"; instanceId: string; localNodeId: string };\r\n\r\nexport type MaterializedPrefab = {\r\n rootNodeIds: string[];\r\n nodes: UINode[];\r\n origins: Map<string, MaterializedPrefabNodeOrigin>;\r\n};\r\n\r\nexport function materializedPrefabNodeId(instanceId: string, nodePath: string): string {\r\n return `${instanceId}${PREFAB_NODE_PATH_SEPARATOR}${nodePath}`;\r\n}\r\n\r\n/** Первый разделитель отделяет персистентный инстанс от адреса узла внутри него. */\r\nexport function parseMaterializedPrefabNodeId(id: string): { instanceId: string; nodePath: string } | undefined {\r\n const separator = id.indexOf(PREFAB_NODE_PATH_SEPARATOR);\r\n if (separator < 0) return undefined;\r\n return { instanceId: id.slice(0, separator), nodePath: id.slice(separator + PREFAB_NODE_PATH_SEPARATOR.length) };\r\n}\r\n\r\n/** Склеивает адрес узла с адресом инстанса, внутри которого он объявлен. */\r\nexport function composePrefabNodePath(prefix: string, address: string): string {\r\n return prefix === \"\" ? address : `${prefix}${PREFAB_NODE_PATH_SEPARATOR}${address}`;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\n/** Applies a persisted sparse patch without allowing prefab hierarchy identity to change. */\r\nexport function applyPrefabNodePatch(base: UINode, patch: Readonly<Record<string, unknown>>): UINode {\r\n const merge = (current: unknown, next: unknown, root = false): unknown => {\r\n if (!isRecord(next)) return structuredClone(next);\r\n const result: Record<string, unknown> = isRecord(current) ? structuredClone(current) : {};\r\n for (const [key, value] of Object.entries(next)) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (value === null) delete result[key];\r\n else result[key] = isRecord(value) ? merge(result[key], value) : structuredClone(value);\r\n }\r\n return result;\r\n };\r\n return merge(base, patch, true) as UINode;\r\n}\r\n\r\n/** Produces the smallest deterministic merge patch used by instance property overrides. */\r\nexport function createPrefabNodePatch(base: UINode, effective: UINode): Record<string, unknown> {\r\n const diff = (before: unknown, after: unknown, root = false): unknown => {\r\n if (Object.is(before, after)) return undefined;\r\n if (!isRecord(before) || !isRecord(after)) return structuredClone(after);\r\n const patch: Record<string, unknown> = {};\r\n const keys = new Set([...Object.keys(before), ...Object.keys(after)]);\r\n for (const key of [...keys].sort()) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (!Object.hasOwn(after, key)) patch[key] = null;\r\n else {\r\n const value = diff(before[key], after[key]);\r\n if (value !== undefined) patch[key] = value;\r\n }\r\n }\r\n return Object.keys(patch).length === 0 ? undefined : patch;\r\n };\r\n return (diff(base, effective, true) as Record<string, unknown> | undefined) ?? {};\r\n}\r\n\r\n/** Один слой property overrides, адресованный в пространстве адресов персистентного инстанса. */\r\ntype PatchLayer = ReadonlyMap<string, Readonly<Record<string, unknown>>>;\r\n\r\n/**\r\n * Разворачивает один персистентный инстанс во все его узлы, включая вложенные пресеты.\r\n *\r\n * Приоритет патчей — как у Unity: чем ближе инстанс к сцене, тем он старше. Слои идут от владельца\r\n * (индекс 0) к самым глубоким определениям, поэтому применяются в обратном порядке.\r\n */\r\nfunction materializeInstance(\r\n document: ProjectDocument,\r\n instance: PrefabInstanceNode,\r\n expandingPrefabIds: ReadonlySet<string>,\r\n applyInstanceOverrides: boolean,\r\n): MaterializedPrefab | undefined {\r\n const rootPrefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (rootPrefab === undefined) return undefined;\r\n\r\n const ownerId = instance.id;\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const editableLocalIds = new Set(localNodes.map((node) => node.id));\r\n // Локальный узел персистентен сам по себе, поэтому сохраняет собственный stable ID; всё\r\n // унаследованное получает ID, привязанный к инстансу, чтобы два инстанса не конфликтовали.\r\n const idOf = (address: string): string => (editableLocalIds.has(address) ? address : materializedPrefabNodeId(ownerId, address));\r\n\r\n const nodes: UINode[] = [];\r\n const nodesById = new Map<string, UINode>();\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n const emit = (source: UINode, effective: UINode, prefix: string, address: string, origin: MaterializedPrefabNodeOrigin): void => {\r\n const id = idOf(address);\r\n const node = {\r\n ...structuredClone(effective),\r\n id,\r\n parentId: source.parentId === null\r\n ? (prefix === \"\" ? null : idOf(prefix))\r\n : idOf(composePrefabNodePath(prefix, source.parentId)),\r\n children: source.children.map((childId) => idOf(composePrefabNodePath(prefix, childId))),\r\n } as UINode;\r\n nodes.push(node);\r\n nodesById.set(id, node);\r\n origins.set(id, origin);\r\n };\r\n\r\n const patched = (base: UINode, address: string, layers: readonly PatchLayer[]): UINode => {\r\n let effective = base;\r\n for (let index = layers.length - 1; index >= 0; index -= 1) {\r\n const patch = layers[index]!.get(address);\r\n if (patch !== undefined) effective = applyPrefabNodePatch(effective, patch);\r\n }\r\n return effective;\r\n };\r\n\r\n const layerOf = (node: PrefabInstanceNode, prefix: string): PatchLayer =>\r\n new Map((node.propertyOverrides ?? []).map((override) => [composePrefabNodePath(prefix, override.nodeId), override.patch] as const));\r\n\r\n /**\r\n * Разворачивает локально добавленный инстанс: он персистентен и владеет собственной конфигурацией.\r\n *\r\n * Развёртка начинается с чистого набора: бесконечной иерархия становится только если определение\r\n * пресета содержит само себя, а локальное добавление — конечные данные документа. Инстанс пресета\r\n * внутри развёртки того же пресета поэтому допустим, как и в Unity.\r\n */\r\n const mergeOwnedInstance = (local: PrefabInstanceNode): void => {\r\n const sub = materializeInstance(document, local, new Set(), true);\r\n if (sub === undefined) return;\r\n const host = nodesById.get(local.id);\r\n for (const subNode of sub.nodes) {\r\n if (subNode.parentId === null) subNode.parentId = local.id;\r\n nodes.push(subNode);\r\n nodesById.set(subNode.id, subNode);\r\n }\r\n sub.origins.forEach((origin, id) => origins.set(id, origin));\r\n if (host === undefined) return;\r\n for (const rootId of sub.rootNodeIds) if (!host.children.includes(rootId)) host.children.push(rootId);\r\n };\r\n\r\n const expandContent = (host: PrefabInstanceNode, prefix: string, layers: readonly PatchLayer[], expanding: ReadonlySet<string>): void => {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === host.prefabId);\r\n const expandable = prefab !== undefined && !expanding.has(prefab.id);\r\n const nextExpanding = prefab === undefined ? expanding : new Set([...expanding, prefab.id]);\r\n const nested: { node: PrefabInstanceNode; address: string }[] = [];\r\n\r\n if (expandable) {\r\n for (const definitionNode of prefab.nodes) {\r\n const address = composePrefabNodePath(prefix, definitionNode.id);\r\n emit(definitionNode, patched(definitionNode, address, layers), prefix, address, { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (definitionNode.type === \"prefab-instance\") nested.push({ node: definitionNode, address });\r\n }\r\n // Корни определения становятся детьми самого узла-инстанса; на верхнем уровне их забирает владелец.\r\n const hostNode = prefix === \"\" ? undefined : nodesById.get(idOf(prefix));\r\n if (hostNode !== undefined) {\r\n for (const rootId of prefab.rootNodeIds) {\r\n const childId = idOf(composePrefabNodePath(prefix, rootId));\r\n if (nodesById.has(childId) && !hostNode.children.includes(childId)) hostNode.children.push(childId);\r\n }\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n nested.length = 0;\r\n }\r\n\r\n // Локальные добавления владельца редактируемы; те, что пришли из определения, унаследованы.\r\n const editable = prefix === \"\";\r\n for (const local of host.locallyAddedNodes ?? []) {\r\n const address = composePrefabNodePath(prefix, local.id);\r\n emit(local, editable ? local : patched(local, address, layers), prefix, address, editable\r\n ? { kind: \"local\", instanceId: ownerId, localNodeId: local.id }\r\n : { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (local.type !== \"prefab-instance\") continue;\r\n if (editable) mergeOwnedInstance(local);\r\n else nested.push({ node: local, address });\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n };\r\n\r\n expandContent(instance, \"\", [applyInstanceOverrides ? layerOf(instance, \"\") : new Map()], expandingPrefabIds);\r\n\r\n // Единая до-привязка: локальные узлы и корни вложенных развёрток попадают в children родителя,\r\n // если тот их ещё не перечисляет. Порядок повторяет порядок выпуска узлов: сначала структура\r\n // определения, затем локальные добавления от самого глубокого пресета к сцене.\r\n for (const node of nodes) {\r\n if (node.parentId === null) continue;\r\n const parent = nodesById.get(node.parentId);\r\n if (parent !== undefined && !parent.children.includes(node.id)) parent.children.push(node.id);\r\n }\r\n\r\n // Semantic references authored inside a reusable definition are relative to that definition.\r\n // Materialization gives all their targets the same instance-scoped IDs as the hierarchy itself.\r\n const idByAddress = new Map<string, string>();\r\n origins.forEach((origin, id) => {\r\n if (origin.kind === \"inherited\" && origin.instanceId === ownerId) idByAddress.set(origin.nodePath, id);\r\n });\r\n for (const node of nodes) {\r\n const origin = origins.get(node.id);\r\n const ownPath = origin?.kind === \"inherited\" ? origin.nodePath : \"\";\r\n const ownSegments = ownPath === \"\" ? [] : splitNodePath(ownPath);\r\n const prefix = ownSegments.slice(0, -1).join(PREFAB_NODE_PATH_SEPARATOR);\r\n rewriteNodeReferences(node, (targetNodeId) => nodesById.has(targetNodeId)\r\n ? targetNodeId\r\n : idByAddress.get(composePrefabNodePath(prefix, targetNodeId)) ?? idByAddress.get(targetNodeId) ?? targetNodeId);\r\n }\r\n\r\n return {\r\n rootNodeIds: [\r\n ...rootPrefab.rootNodeIds.map((id) => idOf(id)).filter((id) => nodesById.has(id)),\r\n ...localNodes.filter((node) => node.parentId === null).map((node) => node.id),\r\n ],\r\n nodes,\r\n origins,\r\n };\r\n}\r\n\r\nexport function materializePrefabInstance(document: ProjectDocument, instance: PrefabInstanceNode): MaterializedPrefab | undefined {\r\n return materializeInstance(document, instance, new Set(), true);\r\n}\r\n\r\n/**\r\n * Узлы инстанса до применения его собственных property overrides, по адресам.\r\n *\r\n * Это «база» для нормализации и валидации: она уже включает конфигурацию вложенных инстансов,\r\n * записанную в определениях пресетов, поэтому override, повторяющий её значение, схлопывается.\r\n */\r\nexport function resolvePrefabInstanceBaseNodes(document: ProjectDocument, instance: PrefabInstanceNode): Map<string, UINode> {\r\n const base = new Map<string, UINode>();\r\n const materialized = materializeInstance(document, instance, new Set(), false);\r\n if (materialized === undefined) return base;\r\n for (const node of materialized.nodes) {\r\n const origin = materialized.origins.get(node.id);\r\n if (origin?.kind === \"inherited\" && origin.instanceId === instance.id) base.set(origin.nodePath, node);\r\n }\r\n return base;\r\n}\r\n\r\nexport function normalizePrefabNodeOverrides(document: ProjectDocument, instance: PrefabInstanceNode): void {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance);\r\n const normalized: PrefabNodeOverride[] = [];\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const baseNode = base.get(override.nodeId);\r\n if (baseNode === undefined) {\r\n normalized.push(override);\r\n continue;\r\n }\r\n const patch = createPrefabNodePatch(baseNode, applyPrefabNodePatch(baseNode, override.patch));\r\n if (Object.keys(patch).length > 0) normalized.push({ nodeId: override.nodeId, patch });\r\n }\r\n if (normalized.length === 0) delete instance.propertyOverrides;\r\n else instance.propertyOverrides = normalized;\r\n if (instance.locallyAddedNodes?.length === 0) delete instance.locallyAddedNodes;\r\n}\r\n\r\nfunction splitNodePath(path: string): string[] {\r\n return path.split(PREFAB_NODE_PATH_SEPARATOR);\r\n}\r\n\r\nfunction storeNestedOverride(document: ProjectDocument, instance: PrefabInstanceNode, nodePath: string, patch: Readonly<Record<string, unknown>>): boolean {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance).get(nodePath);\r\n if (base === undefined) return false;\r\n const overrides = instance.propertyOverrides ??= [];\r\n const existing = overrides.find((candidate) => candidate.nodeId === nodePath);\r\n const effective = applyPrefabNodePatch(existing === undefined ? base : applyPrefabNodePatch(base, existing.patch), patch);\r\n const mergedPatch = createPrefabNodePatch(base, effective);\r\n if (Object.keys(mergedPatch).length === 0) {\r\n if (existing !== undefined) overrides.splice(overrides.indexOf(existing), 1);\r\n } else if (existing === undefined) overrides.push({ nodeId: nodePath, patch: mergedPatch });\r\n else existing.patch = mergedPatch;\r\n if (overrides.length === 0) delete instance.propertyOverrides;\r\n return true;\r\n}\r\n\r\ntype LocalDestination = { prefab: PrefabDefinition } | { instance: PrefabInstanceNode; prefix: string };\r\n\r\n/**\r\n * Переносит конфигурацию инстанса (overrides и локально добавленные узлы) в его определение.\r\n *\r\n * Прямые overrides переписывают узлы определения, вложенные — становятся конфигурацией того\r\n * persisted-инстанса, к которому относятся, а локальные поддеревья переезжают целиком, сохраняя\r\n * stable ID. Сам инстанс после успешного переноса теряет конфигурацию: она уже в определении.\r\n *\r\n * Это же преобразование лежит в основе распаковки инстанса (`unpackPrefabInstances`): там оно\r\n * применяется к одноразовой копии определения, которая потом встраивается в сцену как обычные узлы.\r\n */\r\nexport function applyPrefabInstanceConfiguration(document: ProjectDocument, instance: PrefabInstanceNode): boolean {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return false;\r\n const definitionNodes = new Map(prefab.nodes.map((node) => [node.id, node]));\r\n\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(override.nodeId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return false;\r\n if (nestedPath.length === 0) {\r\n const patched = applyPrefabNodePatch(definitionNode, override.patch);\r\n const mutableDefinitionNode = definitionNode as unknown as Record<string, unknown>;\r\n for (const key of Object.keys(mutableDefinitionNode)) delete mutableDefinitionNode[key];\r\n Object.assign(mutableDefinitionNode, patched);\r\n continue;\r\n }\r\n if (definitionNode.type !== \"prefab-instance\" || !storeNestedOverride(document, definitionNode, nestedPath.join(PREFAB_NODE_PATH_SEPARATOR), override.patch)) return false;\r\n }\r\n\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const localsById = new Map(localNodes.map((node) => [node.id, node]));\r\n const destinations = new Map<string, LocalDestination>();\r\n const destinationOf = (node: UINode): LocalDestination | undefined => {\r\n const cached = destinations.get(node.id);\r\n if (cached !== undefined) return cached;\r\n const localParent = node.parentId === null ? undefined : localsById.get(node.parentId);\r\n if (localParent !== undefined) {\r\n const destination = destinationOf(localParent);\r\n if (destination !== undefined) destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n if (node.parentId !== null) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(node.parentId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return undefined;\r\n if (definitionNode.type === \"prefab-instance\") {\r\n const destination = { instance: definitionNode, prefix: nestedPath.join(PREFAB_NODE_PATH_SEPARATOR) };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n }\r\n const destination = { prefab };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n };\r\n\r\n for (const local of localNodes) {\r\n const destination = destinationOf(local);\r\n if (destination === undefined) return false;\r\n const copy = structuredClone(local);\r\n const parentIsLocal = copy.parentId !== null && localsById.has(copy.parentId);\r\n if (\"instance\" in destination) {\r\n if (!parentIsLocal) copy.parentId = destination.prefix === \"\" ? null : destination.prefix;\r\n (destination.instance.locallyAddedNodes ??= []).push(copy);\r\n continue;\r\n }\r\n destination.prefab.nodes.push(copy);\r\n definitionNodes.set(copy.id, copy);\r\n if (parentIsLocal) continue;\r\n if (copy.parentId === null) destination.prefab.rootNodeIds.push(copy.id);\r\n else {\r\n const parent = definitionNodes.get(copy.parentId);\r\n if (parent === undefined) return false;\r\n if (!parent.children.includes(copy.id)) parent.children.push(copy.id);\r\n }\r\n }\r\n\r\n delete instance.propertyOverrides;\r\n delete instance.locallyAddedNodes;\r\n return true;\r\n}\r\n\r\n/** Обходит все персистентные инстансы владельца, включая локально добавленные. */\r\nexport function forEachPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, visit: (instance: PrefabInstanceNode) => void): void {\r\n const walk = (nodes: readonly UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n visit(node);\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n walk(owner.nodes);\r\n}\r\n\r\nexport function forEachPrefabInstance(document: ProjectDocument, visit: (instance: PrefabInstanceNode) => void): void {\r\n for (const owner of [...document.scenes, ...document.prefabs]) forEachPrefabInstanceInOwner(owner, visit);\r\n}\r\n\r\nexport function findPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, instanceId: string): PrefabInstanceNode | undefined {\r\n let found: PrefabInstanceNode | undefined;\r\n forEachPrefabInstanceInOwner(owner, (instance) => {\r\n if (found === undefined && instance.id === instanceId) found = instance;\r\n });\r\n return found;\r\n}\r\n\r\nexport function findPrefabInstance(document: ProjectDocument, instanceId: string): PrefabInstanceNode | undefined {\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const instance = findPrefabInstanceInOwner(owner, instanceId);\r\n if (instance !== undefined) return instance;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Ссылается ли пресет на другой — сам собой или через любую цепочку вложенных инстансов.\r\n *\r\n * Так проверяется рекурсия: вставлять инстанс пресета туда, где он уже раскрывается, нельзя, иначе\r\n * иерархия стала бы бесконечной.\r\n */\r\nexport function prefabReferencesPrefab(document: ProjectDocument, prefabId: string, searchedPrefabId: string): boolean {\r\n const visited = new Set<string>();\r\n const visit = (id: string): boolean => {\r\n if (id === searchedPrefabId) return true;\r\n if (visited.has(id)) return false;\r\n visited.add(id);\r\n const prefab = document.prefabs.find((candidate) => candidate.id === id);\r\n if (prefab === undefined) return false;\r\n let found = false;\r\n forEachPrefabInstanceInOwner(prefab, (instance) => { found ||= visit(instance.prefabId); });\r\n return found;\r\n };\r\n return visit(prefabId);\r\n}\r\n\r\n/** Сколько раз пресет используется в документе, включая вложенные и локально добавленные инстансы. */\r\nexport function countPrefabInstances(document: ProjectDocument, prefabId: string): number {\r\n let count = 0;\r\n forEachPrefabInstance(document, (instance) => {\r\n if (instance.prefabId === prefabId) count += 1;\r\n });\r\n return count;\r\n}\r\n\r\n/**\r\n * Плоский граф авторинга владельца: его собственные узлы плюс развёрнутые поддеревья всех инстансов.\r\n *\r\n * Единственный резолвер иерархии: им пользуются и редактор (иерархия, selection, gizmos), и runtime\r\n * (сборка Pixi-дерева, сбор ассетов), поэтому расхождений между ними быть не может.\r\n */\r\ntype InstanceLocation = { nodes: UINode[]; instance: PrefabInstanceNode };\r\n\r\n/** Все персистентные инстансы пресета вместе с массивом узлов, в котором каждый из них лежит. */\r\nfunction locatePrefabInstances(document: ProjectDocument, prefabId: string): InstanceLocation[] {\r\n const found: InstanceLocation[] = [];\r\n const walk = (nodes: UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n if (node.prefabId === prefabId) found.push({ nodes, instance: node });\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n for (const owner of [...document.scenes, ...document.prefabs]) walk(owner.nodes);\r\n return found;\r\n}\r\n\r\n/**\r\n * Заменяет один инстанс обычным контейнером с тем же id, transform и содержимым.\r\n *\r\n * Развёртка идёт через одноразовую копию определения: конфигурация инстанса переносится в неё тем же\r\n * `applyPrefabInstanceConfiguration`, что и «Apply to preset», после чего узлы копии получают свежие\r\n * stable ID и встают на место инстанса. Вложенные инстансы других пресетов остаются инстансами и\r\n * сохраняют свою конфигурацию — распаковывается ровно один слой.\r\n *\r\n * Возвращает соответствие «адрес узла внутри инстанса → новый id узла»: по нему переписываются\r\n * адреса, которыми на это содержимое ссылались инстансы пресета-владельца.\r\n */\r\nfunction unpackInstance(document: ProjectDocument, location: InstanceLocation, createId: () => string): { idByAddress: Map<string, string>; inserted: UINode[] } | undefined {\r\n const { nodes, instance } = location;\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return undefined;\r\n\r\n const draftPrefab: PrefabDefinition = { ...structuredClone(prefab), id: createId() };\r\n const draftInstance = structuredClone(instance);\r\n draftInstance.prefabId = draftPrefab.id;\r\n document.prefabs.push(draftPrefab);\r\n const applied = applyPrefabInstanceConfiguration(document, draftInstance);\r\n document.prefabs.splice(document.prefabs.indexOf(draftPrefab), 1);\r\n if (!applied) return undefined;\r\n\r\n const idByAddress = new Map(draftPrefab.nodes.map((node) => [node.id, createId()] as const));\r\n const remap = (address: string): string => idByAddress.get(address) ?? address;\r\n for (const node of draftPrefab.nodes) {\r\n node.id = remap(node.id);\r\n node.children = node.children.map(remap);\r\n node.parentId = node.parentId === null ? instance.id : remap(node.parentId);\r\n rewriteNodeReferences(node, remap);\r\n }\r\n\r\n const { prefabId: _prefabId, propertyOverrides: _overrides, locallyAddedNodes: _locals, ...base } = instance;\r\n const container = { ...structuredClone(base), type: \"container\", children: draftPrefab.rootNodeIds.map(remap) } as UINode;\r\n nodes.splice(nodes.indexOf(instance), 1, container, ...draftPrefab.nodes);\r\n return { idByAddress, inserted: draftPrefab.nodes };\r\n}\r\n\r\n/**\r\n * Переписывает адреса, которые вели внутрь распакованного инстанса.\r\n *\r\n * Инстанс мог лежать в определении пресета, и тогда его содержимое было адресуемо снаружи как\r\n * `…::instanceId::prefab-node::address`. После распаковки этот узел — обычная нода владельца, поэтому\r\n * оба сегмента схлопываются в её новый id. Адрес самого инстанса не меняется: контейнер сохранил id.\r\n */\r\nfunction rewriteUnpackedAddresses(document: ProjectDocument, instanceId: string, idByAddress: ReadonlyMap<string, string>): void {\r\n const rewrite = (path: string): string => {\r\n const segments = splitNodePath(path);\r\n const index = segments.indexOf(instanceId);\r\n const inner = index < 0 ? undefined : segments[index + 1];\r\n const mapped = inner === undefined ? undefined : idByAddress.get(inner);\r\n if (mapped === undefined) return path;\r\n return [...segments.slice(0, index), mapped, ...segments.slice(index + 2)].join(PREFAB_NODE_PATH_SEPARATOR);\r\n };\r\n forEachPrefabInstance(document, (instance) => {\r\n for (const override of instance.propertyOverrides ?? []) override.nodeId = rewrite(override.nodeId);\r\n rewritePrefabInstanceReferencePatches(instance, rewrite);\r\n for (const local of instance.locallyAddedNodes ?? []) if (local.parentId !== null) local.parentId = rewrite(local.parentId);\r\n for (const local of instance.locallyAddedNodes ?? []) rewriteNodeReferences(local, rewrite);\r\n });\r\n}\r\n\r\n/**\r\n * Снимает binding-ключи, которые распаковка размножила в одной области разрешения.\r\n *\r\n * Внутри инстанса ключ принадлежал области этого инстанса, поэтому один и тот же пресет мог стоять на\r\n * сцене сколько угодно раз. Распакованные узлы попадают в область владельца, где ключ обязан быть\r\n * уникальным, поэтому конфликт разрешается в пользу узла, который существовал до распаковки, а среди\r\n * одних только новых узлов — в пользу первого.\r\n */\r\nfunction dropDuplicateBindingKeys(document: ProjectDocument, unpackedNodes: ReadonlyMap<string, UINode>): string[] {\r\n const dropped: string[] = [];\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const graph = resolveOwnerNodeGraph(document, owner);\r\n for (const scopeNodes of collectBindingKeyScopes(graph).values()) {\r\n for (const [key, nodeIds] of collectBindingKeys(scopeNodes)) {\r\n if (key === \"\" || nodeIds.length <= 1) continue;\r\n const unpacked = nodeIds.filter((id) => unpackedNodes.has(id));\r\n const victims = unpacked.length === nodeIds.length ? unpacked.slice(1) : unpacked;\r\n for (const id of victims) {\r\n delete unpackedNodes.get(id)!.bindingKey;\r\n if (!dropped.includes(key)) dropped.push(key);\r\n }\r\n }\r\n }\r\n }\r\n return dropped;\r\n}\r\n\r\nexport type PrefabUnpackResult = { instances: number; droppedBindingKeys: string[] };\r\n\r\n/**\r\n * Разворачивает все инстансы пресета обратно в обычные узлы своих владельцев.\r\n *\r\n * Так удаление пресета перестаёт зависеть от того, используется он или нет: сцена сохраняет ровно то\r\n * же изображение, но её узлы больше не ссылаются на определение. Операция идёт по документу целиком —\r\n * сцены, определения других пресетов и локально добавленные поддеревья внутри инстансов.\r\n *\r\n * `undefined` означает, что конфигурация одного из инстансов не разложилась на узлы; вызывающий\r\n * должен отбросить весь кандидат-документ, а не применять его частично.\r\n */\r\nexport function unpackPrefabInstances(document: ProjectDocument, prefabId: string, createId: () => string): PrefabUnpackResult | undefined {\r\n const unpackedNodes = new Map<string, UINode>();\r\n let instances = 0;\r\n // Локация ищется заново на каждом шаге: распаковка внешнего инстанса переносит вложенные в новые\r\n // массивы узлов, поэтому собранные заранее ссылки протухли бы.\r\n for (let location = locatePrefabInstances(document, prefabId)[0]; location !== undefined; location = locatePrefabInstances(document, prefabId)[0]) {\r\n const instanceId = location.instance.id;\r\n const unpacked = unpackInstance(document, location, createId);\r\n if (unpacked === undefined) return undefined;\r\n rewriteUnpackedAddresses(document, instanceId, unpacked.idByAddress);\r\n for (const node of unpacked.inserted) unpackedNodes.set(node.id, node);\r\n instances += 1;\r\n }\r\n return { instances, droppedBindingKeys: dropDuplicateBindingKeys(document, unpackedNodes) };\r\n}\r\n\r\nexport function resolveOwnerNodeGraph(\r\n document: ProjectDocument,\r\n owner: { readonly rootNodeIds: readonly string[]; readonly nodes: readonly UINode[] },\r\n): { rootNodeIds: string[]; nodes: UINode[]; origins: Map<string, MaterializedPrefabNodeOrigin> } {\r\n const nodes = structuredClone(owner.nodes) as UINode[];\r\n const nodesById = new Map(nodes.map((node) => [node.id, node]));\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n for (const ownerNode of owner.nodes) {\r\n if (ownerNode.type !== \"prefab-instance\") continue;\r\n const instanceCopy = nodesById.get(ownerNode.id);\r\n const materialized = materializePrefabInstance(document, ownerNode);\r\n if (materialized === undefined || instanceCopy === undefined) continue;\r\n instanceCopy.children = [...materialized.rootNodeIds];\r\n for (const materializedNode of materialized.nodes) {\r\n if (materializedNode.parentId === null) materializedNode.parentId = ownerNode.id;\r\n nodes.push(materializedNode);\r\n nodesById.set(materializedNode.id, materializedNode);\r\n }\r\n materialized.origins.forEach((origin, id) => origins.set(id, origin));\r\n }\r\n\r\n return { rootNodeIds: [...owner.rootNodeIds], nodes, origins };\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"prefabs.js","sourceRoot":"","sources":["../src/prefabs.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PrefabDefinition, PrefabNodeOverride, ProjectDocument, UINode } from \"./index.js\";\nimport { collectBindingKeys, collectBindingKeyScopes } from \"./bindingKeys.js\";\nimport { rewriteNodeReferences, rewritePrefabInstanceReferencePatches } from \"./nodeReferences.js\";\n\r\nconst STRUCTURAL_OVERRIDE_KEYS = new Set([\"id\", \"type\", \"parentId\", \"children\", \"editorOnly\", \"locked\", \"prefabId\", \"propertyOverrides\", \"locallyAddedNodes\"]);\r\n\r\n/**\r\n * Разделитель сегментов адреса внутри инстанса пресета.\r\n *\r\n * Адрес — это путь по вложенным пресетам: `defA` — узел определения самого инстанса,\r\n * `defA::prefab-node::defB` — узел `defB` внутри инстанса `defA`, вложенного в определение. Документ\r\n * до вложенных пресетов хранил ровно один сегмент, поэтому старые адреса остаются валидными путями.\r\n */\r\nexport const PREFAB_NODE_PATH_SEPARATOR = \"::prefab-node::\";\r\n\r\nexport type PrefabInstanceNode = Extract<UINode, { type: \"prefab-instance\" }>;\r\n\r\n/**\r\n * Откуда взялся узел развёрнутого инстанса.\r\n *\r\n * `instanceId` всегда указывает на **персистентный** узел-инстанс: сцену/пресет-владельца или\r\n * локально добавленный инстанс. Именно в нём хранятся `propertyOverrides` и `locallyAddedNodes` для\r\n * этого узла. `inherited` — часть структуры пресета: её можно переопределить по свойствам (patch\r\n * адресуется `nodePath`), но нельзя удалить или перенести. `local` — обычный редактируемый узел.\r\n */\r\nexport type MaterializedPrefabNodeOrigin =\r\n | { kind: \"inherited\"; instanceId: string; nodePath: string }\r\n | { kind: \"local\"; instanceId: string; localNodeId: string };\r\n\r\nexport type MaterializedPrefab = {\r\n rootNodeIds: string[];\r\n nodes: UINode[];\r\n origins: Map<string, MaterializedPrefabNodeOrigin>;\r\n};\r\n\r\nexport function materializedPrefabNodeId(instanceId: string, nodePath: string): string {\r\n return `${instanceId}${PREFAB_NODE_PATH_SEPARATOR}${nodePath}`;\r\n}\r\n\r\n/** Первый разделитель отделяет персистентный инстанс от адреса узла внутри него. */\r\nexport function parseMaterializedPrefabNodeId(id: string): { instanceId: string; nodePath: string } | undefined {\r\n const separator = id.indexOf(PREFAB_NODE_PATH_SEPARATOR);\r\n if (separator < 0) return undefined;\r\n return { instanceId: id.slice(0, separator), nodePath: id.slice(separator + PREFAB_NODE_PATH_SEPARATOR.length) };\r\n}\r\n\r\n/** Склеивает адрес узла с адресом инстанса, внутри которого он объявлен. */\r\nexport function composePrefabNodePath(prefix: string, address: string): string {\r\n return prefix === \"\" ? address : `${prefix}${PREFAB_NODE_PATH_SEPARATOR}${address}`;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\n/** Applies a persisted sparse patch without allowing prefab hierarchy identity to change. */\r\nexport function applyPrefabNodePatch(base: UINode, patch: Readonly<Record<string, unknown>>): UINode {\r\n const merge = (current: unknown, next: unknown, root = false): unknown => {\r\n if (!isRecord(next)) return structuredClone(next);\r\n const result: Record<string, unknown> = isRecord(current) ? structuredClone(current) : {};\r\n for (const [key, value] of Object.entries(next)) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (value === null) delete result[key];\r\n else result[key] = isRecord(value) ? merge(result[key], value) : structuredClone(value);\r\n }\r\n return result;\r\n };\r\n return merge(base, patch, true) as UINode;\r\n}\r\n\r\n/** Produces the smallest deterministic merge patch used by instance property overrides. */\r\nexport function createPrefabNodePatch(base: UINode, effective: UINode): Record<string, unknown> {\r\n const diff = (before: unknown, after: unknown, root = false): unknown => {\r\n if (Object.is(before, after)) return undefined;\r\n if (!isRecord(before) || !isRecord(after)) return structuredClone(after);\r\n const patch: Record<string, unknown> = {};\r\n const keys = new Set([...Object.keys(before), ...Object.keys(after)]);\r\n for (const key of [...keys].sort()) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (!Object.hasOwn(after, key)) patch[key] = null;\r\n else {\r\n const value = diff(before[key], after[key]);\r\n if (value !== undefined) patch[key] = value;\r\n }\r\n }\r\n return Object.keys(patch).length === 0 ? undefined : patch;\r\n };\r\n return (diff(base, effective, true) as Record<string, unknown> | undefined) ?? {};\r\n}\r\n\r\n/** Один слой property overrides, адресованный в пространстве адресов персистентного инстанса. */\r\ntype PatchLayer = ReadonlyMap<string, Readonly<Record<string, unknown>>>;\r\n\r\n/**\r\n * Разворачивает один персистентный инстанс во все его узлы, включая вложенные пресеты.\r\n *\r\n * Приоритет патчей — как у Unity: чем ближе инстанс к сцене, тем он старше. Слои идут от владельца\r\n * (индекс 0) к самым глубоким определениям, поэтому применяются в обратном порядке.\r\n */\r\nfunction materializeInstance(\r\n document: ProjectDocument,\r\n instance: PrefabInstanceNode,\r\n expandingPrefabIds: ReadonlySet<string>,\r\n applyInstanceOverrides: boolean,\r\n): MaterializedPrefab | undefined {\r\n const rootPrefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (rootPrefab === undefined) return undefined;\r\n\r\n const ownerId = instance.id;\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const editableLocalIds = new Set(localNodes.map((node) => node.id));\r\n // Локальный узел персистентен сам по себе, поэтому сохраняет собственный stable ID; всё\r\n // унаследованное получает ID, привязанный к инстансу, чтобы два инстанса не конфликтовали.\r\n const idOf = (address: string): string => (editableLocalIds.has(address) ? address : materializedPrefabNodeId(ownerId, address));\r\n\r\n const nodes: UINode[] = [];\r\n const nodesById = new Map<string, UINode>();\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n const emit = (source: UINode, effective: UINode, prefix: string, address: string, origin: MaterializedPrefabNodeOrigin): void => {\r\n const id = idOf(address);\r\n const node = {\r\n ...structuredClone(effective),\r\n id,\r\n parentId: source.parentId === null\r\n ? (prefix === \"\" ? null : idOf(prefix))\r\n : idOf(composePrefabNodePath(prefix, source.parentId)),\r\n children: source.children.map((childId) => idOf(composePrefabNodePath(prefix, childId))),\r\n } as UINode;\r\n nodes.push(node);\r\n nodesById.set(id, node);\r\n origins.set(id, origin);\r\n };\r\n\r\n const patched = (base: UINode, address: string, layers: readonly PatchLayer[]): UINode => {\r\n let effective = base;\r\n for (let index = layers.length - 1; index >= 0; index -= 1) {\r\n const patch = layers[index]!.get(address);\r\n if (patch !== undefined) effective = applyPrefabNodePatch(effective, patch);\r\n }\r\n return effective;\r\n };\r\n\r\n const layerOf = (node: PrefabInstanceNode, prefix: string): PatchLayer =>\r\n new Map((node.propertyOverrides ?? []).map((override) => [composePrefabNodePath(prefix, override.nodeId), override.patch] as const));\r\n\r\n /**\r\n * Разворачивает локально добавленный инстанс: он персистентен и владеет собственной конфигурацией.\r\n *\r\n * Развёртка начинается с чистого набора: бесконечной иерархия становится только если определение\r\n * пресета содержит само себя, а локальное добавление — конечные данные документа. Инстанс пресета\r\n * внутри развёртки того же пресета поэтому допустим, как и в Unity.\r\n */\r\n const mergeOwnedInstance = (local: PrefabInstanceNode): void => {\r\n const sub = materializeInstance(document, local, new Set(), true);\r\n if (sub === undefined) return;\r\n const host = nodesById.get(local.id);\r\n for (const subNode of sub.nodes) {\r\n if (subNode.parentId === null) subNode.parentId = local.id;\r\n nodes.push(subNode);\r\n nodesById.set(subNode.id, subNode);\r\n }\r\n sub.origins.forEach((origin, id) => origins.set(id, origin));\r\n if (host === undefined) return;\r\n for (const rootId of sub.rootNodeIds) if (!host.children.includes(rootId)) host.children.push(rootId);\r\n };\r\n\r\n const expandContent = (host: PrefabInstanceNode, prefix: string, layers: readonly PatchLayer[], expanding: ReadonlySet<string>): void => {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === host.prefabId);\r\n const expandable = prefab !== undefined && !expanding.has(prefab.id);\r\n const nextExpanding = prefab === undefined ? expanding : new Set([...expanding, prefab.id]);\r\n const nested: { node: PrefabInstanceNode; address: string }[] = [];\r\n\r\n if (expandable) {\r\n for (const definitionNode of prefab.nodes) {\r\n const address = composePrefabNodePath(prefix, definitionNode.id);\r\n emit(definitionNode, patched(definitionNode, address, layers), prefix, address, { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (definitionNode.type === \"prefab-instance\") nested.push({ node: definitionNode, address });\r\n }\r\n // Корни определения становятся детьми самого узла-инстанса; на верхнем уровне их забирает владелец.\r\n const hostNode = prefix === \"\" ? undefined : nodesById.get(idOf(prefix));\r\n if (hostNode !== undefined) {\r\n for (const rootId of prefab.rootNodeIds) {\r\n const childId = idOf(composePrefabNodePath(prefix, rootId));\r\n if (nodesById.has(childId) && !hostNode.children.includes(childId)) hostNode.children.push(childId);\r\n }\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n nested.length = 0;\r\n }\r\n\r\n // Локальные добавления владельца редактируемы; те, что пришли из определения, унаследованы.\r\n const editable = prefix === \"\";\r\n for (const local of host.locallyAddedNodes ?? []) {\r\n const address = composePrefabNodePath(prefix, local.id);\r\n emit(local, editable ? local : patched(local, address, layers), prefix, address, editable\r\n ? { kind: \"local\", instanceId: ownerId, localNodeId: local.id }\r\n : { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (local.type !== \"prefab-instance\") continue;\r\n if (editable) mergeOwnedInstance(local);\r\n else nested.push({ node: local, address });\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n };\r\n\r\n expandContent(instance, \"\", [applyInstanceOverrides ? layerOf(instance, \"\") : new Map()], expandingPrefabIds);\r\n\r\n // Единая до-привязка: локальные узлы и корни вложенных развёрток попадают в children родителя,\r\n // если тот их ещё не перечисляет. Порядок повторяет порядок выпуска узлов: сначала структура\r\n // определения, затем локальные добавления от самого глубокого пресета к сцене.\r\n for (const node of nodes) {\n if (node.parentId === null) continue;\n const parent = nodesById.get(node.parentId);\n if (parent !== undefined && !parent.children.includes(node.id)) parent.children.push(node.id);\n }\n\n // Semantic references authored inside a reusable definition are relative to that definition.\n // Materialization gives all their targets the same instance-scoped IDs as the hierarchy itself.\n const idByAddress = new Map<string, string>();\n origins.forEach((origin, id) => {\n if (origin.kind === \"inherited\" && origin.instanceId === ownerId) idByAddress.set(origin.nodePath, id);\n });\n for (const node of nodes) {\n const origin = origins.get(node.id);\n const ownPath = origin?.kind === \"inherited\" ? origin.nodePath : \"\";\n const ownSegments = ownPath === \"\" ? [] : splitNodePath(ownPath);\n const prefix = ownSegments.slice(0, -1).join(PREFAB_NODE_PATH_SEPARATOR);\n rewriteNodeReferences(node, (targetNodeId) => nodesById.has(targetNodeId)\n ? targetNodeId\n : idByAddress.get(composePrefabNodePath(prefix, targetNodeId)) ?? idByAddress.get(targetNodeId) ?? targetNodeId);\n }\n\r\n return {\r\n rootNodeIds: [\r\n ...rootPrefab.rootNodeIds.map((id) => idOf(id)).filter((id) => nodesById.has(id)),\r\n ...localNodes.filter((node) => node.parentId === null).map((node) => node.id),\r\n ],\r\n nodes,\r\n origins,\r\n };\r\n}\r\n\r\nexport function materializePrefabInstance(document: ProjectDocument, instance: PrefabInstanceNode): MaterializedPrefab | undefined {\r\n return materializeInstance(document, instance, new Set(), true);\r\n}\r\n\r\n/**\r\n * Узлы инстанса до применения его собственных property overrides, по адресам.\r\n *\r\n * Это «база» для нормализации и валидации: она уже включает конфигурацию вложенных инстансов,\r\n * записанную в определениях пресетов, поэтому override, повторяющий её значение, схлопывается.\r\n */\r\nexport function resolvePrefabInstanceBaseNodes(document: ProjectDocument, instance: PrefabInstanceNode): Map<string, UINode> {\r\n const base = new Map<string, UINode>();\r\n const materialized = materializeInstance(document, instance, new Set(), false);\r\n if (materialized === undefined) return base;\r\n for (const node of materialized.nodes) {\r\n const origin = materialized.origins.get(node.id);\r\n if (origin?.kind === \"inherited\" && origin.instanceId === instance.id) base.set(origin.nodePath, node);\r\n }\r\n return base;\r\n}\r\n\r\nexport function normalizePrefabNodeOverrides(document: ProjectDocument, instance: PrefabInstanceNode): void {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance);\r\n const normalized: PrefabNodeOverride[] = [];\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const baseNode = base.get(override.nodeId);\r\n if (baseNode === undefined) {\r\n normalized.push(override);\r\n continue;\r\n }\r\n const patch = createPrefabNodePatch(baseNode, applyPrefabNodePatch(baseNode, override.patch));\r\n if (Object.keys(patch).length > 0) normalized.push({ nodeId: override.nodeId, patch });\r\n }\r\n if (normalized.length === 0) delete instance.propertyOverrides;\r\n else instance.propertyOverrides = normalized;\r\n if (instance.locallyAddedNodes?.length === 0) delete instance.locallyAddedNodes;\r\n}\r\n\r\nfunction splitNodePath(path: string): string[] {\r\n return path.split(PREFAB_NODE_PATH_SEPARATOR);\r\n}\r\n\r\nfunction storeNestedOverride(document: ProjectDocument, instance: PrefabInstanceNode, nodePath: string, patch: Readonly<Record<string, unknown>>): boolean {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance).get(nodePath);\r\n if (base === undefined) return false;\r\n const overrides = instance.propertyOverrides ??= [];\r\n const existing = overrides.find((candidate) => candidate.nodeId === nodePath);\r\n const effective = applyPrefabNodePatch(existing === undefined ? base : applyPrefabNodePatch(base, existing.patch), patch);\r\n const mergedPatch = createPrefabNodePatch(base, effective);\r\n if (Object.keys(mergedPatch).length === 0) {\r\n if (existing !== undefined) overrides.splice(overrides.indexOf(existing), 1);\r\n } else if (existing === undefined) overrides.push({ nodeId: nodePath, patch: mergedPatch });\r\n else existing.patch = mergedPatch;\r\n if (overrides.length === 0) delete instance.propertyOverrides;\r\n return true;\r\n}\r\n\r\ntype LocalDestination = { prefab: PrefabDefinition } | { instance: PrefabInstanceNode; prefix: string };\r\n\r\n/**\r\n * Переносит конфигурацию инстанса (overrides и локально добавленные узлы) в его определение.\r\n *\r\n * Прямые overrides переписывают узлы определения, вложенные — становятся конфигурацией того\r\n * persisted-инстанса, к которому относятся, а локальные поддеревья переезжают целиком, сохраняя\r\n * stable ID. Сам инстанс после успешного переноса теряет конфигурацию: она уже в определении.\r\n *\r\n * Это же преобразование лежит в основе распаковки инстанса (`unpackPrefabInstances`): там оно\r\n * применяется к одноразовой копии определения, которая потом встраивается в сцену как обычные узлы.\r\n */\r\nexport function applyPrefabInstanceConfiguration(document: ProjectDocument, instance: PrefabInstanceNode): boolean {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return false;\r\n const definitionNodes = new Map(prefab.nodes.map((node) => [node.id, node]));\r\n\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(override.nodeId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return false;\r\n if (nestedPath.length === 0) {\r\n const patched = applyPrefabNodePatch(definitionNode, override.patch);\r\n const mutableDefinitionNode = definitionNode as unknown as Record<string, unknown>;\r\n for (const key of Object.keys(mutableDefinitionNode)) delete mutableDefinitionNode[key];\r\n Object.assign(mutableDefinitionNode, patched);\r\n continue;\r\n }\r\n if (definitionNode.type !== \"prefab-instance\" || !storeNestedOverride(document, definitionNode, nestedPath.join(PREFAB_NODE_PATH_SEPARATOR), override.patch)) return false;\r\n }\r\n\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const localsById = new Map(localNodes.map((node) => [node.id, node]));\r\n const destinations = new Map<string, LocalDestination>();\r\n const destinationOf = (node: UINode): LocalDestination | undefined => {\r\n const cached = destinations.get(node.id);\r\n if (cached !== undefined) return cached;\r\n const localParent = node.parentId === null ? undefined : localsById.get(node.parentId);\r\n if (localParent !== undefined) {\r\n const destination = destinationOf(localParent);\r\n if (destination !== undefined) destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n if (node.parentId !== null) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(node.parentId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return undefined;\r\n if (definitionNode.type === \"prefab-instance\") {\r\n const destination = { instance: definitionNode, prefix: nestedPath.join(PREFAB_NODE_PATH_SEPARATOR) };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n }\r\n const destination = { prefab };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n };\r\n\r\n for (const local of localNodes) {\r\n const destination = destinationOf(local);\r\n if (destination === undefined) return false;\r\n const copy = structuredClone(local);\r\n const parentIsLocal = copy.parentId !== null && localsById.has(copy.parentId);\r\n if (\"instance\" in destination) {\r\n if (!parentIsLocal) copy.parentId = destination.prefix === \"\" ? null : destination.prefix;\r\n (destination.instance.locallyAddedNodes ??= []).push(copy);\r\n continue;\r\n }\r\n destination.prefab.nodes.push(copy);\r\n definitionNodes.set(copy.id, copy);\r\n if (parentIsLocal) continue;\r\n if (copy.parentId === null) destination.prefab.rootNodeIds.push(copy.id);\r\n else {\r\n const parent = definitionNodes.get(copy.parentId);\r\n if (parent === undefined) return false;\r\n if (!parent.children.includes(copy.id)) parent.children.push(copy.id);\r\n }\r\n }\r\n\r\n delete instance.propertyOverrides;\r\n delete instance.locallyAddedNodes;\r\n return true;\r\n}\r\n\r\n/** Обходит все персистентные инстансы владельца, включая локально добавленные. */\r\nexport function forEachPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, visit: (instance: PrefabInstanceNode) => void): void {\r\n const walk = (nodes: readonly UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n visit(node);\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n walk(owner.nodes);\r\n}\r\n\r\nexport function forEachPrefabInstance(document: ProjectDocument, visit: (instance: PrefabInstanceNode) => void): void {\r\n for (const owner of [...document.scenes, ...document.prefabs]) forEachPrefabInstanceInOwner(owner, visit);\r\n}\r\n\r\nexport function findPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, instanceId: string): PrefabInstanceNode | undefined {\r\n let found: PrefabInstanceNode | undefined;\r\n forEachPrefabInstanceInOwner(owner, (instance) => {\r\n if (found === undefined && instance.id === instanceId) found = instance;\r\n });\r\n return found;\r\n}\r\n\r\nexport function findPrefabInstance(document: ProjectDocument, instanceId: string): PrefabInstanceNode | undefined {\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const instance = findPrefabInstanceInOwner(owner, instanceId);\r\n if (instance !== undefined) return instance;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Ссылается ли пресет на другой — сам собой или через любую цепочку вложенных инстансов.\r\n *\r\n * Так проверяется рекурсия: вставлять инстанс пресета туда, где он уже раскрывается, нельзя, иначе\r\n * иерархия стала бы бесконечной.\r\n */\r\nexport function prefabReferencesPrefab(document: ProjectDocument, prefabId: string, searchedPrefabId: string): boolean {\r\n const visited = new Set<string>();\r\n const visit = (id: string): boolean => {\r\n if (id === searchedPrefabId) return true;\r\n if (visited.has(id)) return false;\r\n visited.add(id);\r\n const prefab = document.prefabs.find((candidate) => candidate.id === id);\r\n if (prefab === undefined) return false;\r\n let found = false;\r\n forEachPrefabInstanceInOwner(prefab, (instance) => { found ||= visit(instance.prefabId); });\r\n return found;\r\n };\r\n return visit(prefabId);\r\n}\r\n\r\n/** Сколько раз пресет используется в документе, включая вложенные и локально добавленные инстансы. */\r\nexport function countPrefabInstances(document: ProjectDocument, prefabId: string): number {\r\n let count = 0;\r\n forEachPrefabInstance(document, (instance) => {\r\n if (instance.prefabId === prefabId) count += 1;\r\n });\r\n return count;\r\n}\r\n\r\n/**\r\n * Плоский граф авторинга владельца: его собственные узлы плюс развёрнутые поддеревья всех инстансов.\r\n *\r\n * Единственный резолвер иерархии: им пользуются и редактор (иерархия, selection, gizmos), и runtime\r\n * (сборка Pixi-дерева, сбор ассетов), поэтому расхождений между ними быть не может.\r\n */\r\ntype InstanceLocation = { nodes: UINode[]; instance: PrefabInstanceNode };\r\n\r\n/** Все персистентные инстансы пресета вместе с массивом узлов, в котором каждый из них лежит. */\r\nfunction locatePrefabInstances(document: ProjectDocument, prefabId: string): InstanceLocation[] {\r\n const found: InstanceLocation[] = [];\r\n const walk = (nodes: UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n if (node.prefabId === prefabId) found.push({ nodes, instance: node });\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n for (const owner of [...document.scenes, ...document.prefabs]) walk(owner.nodes);\r\n return found;\r\n}\r\n\r\n/**\r\n * Заменяет один инстанс обычным контейнером с тем же id, transform и содержимым.\r\n *\r\n * Развёртка идёт через одноразовую копию определения: конфигурация инстанса переносится в неё тем же\r\n * `applyPrefabInstanceConfiguration`, что и «Apply to preset», после чего узлы копии получают свежие\r\n * stable ID и встают на место инстанса. Вложенные инстансы других пресетов остаются инстансами и\r\n * сохраняют свою конфигурацию — распаковывается ровно один слой.\r\n *\r\n * Возвращает соответствие «адрес узла внутри инстанса → новый id узла»: по нему переписываются\r\n * адреса, которыми на это содержимое ссылались инстансы пресета-владельца.\r\n */\r\nfunction unpackInstance(document: ProjectDocument, location: InstanceLocation, createId: () => string): { idByAddress: Map<string, string>; inserted: UINode[] } | undefined {\r\n const { nodes, instance } = location;\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return undefined;\r\n\r\n const draftPrefab: PrefabDefinition = { ...structuredClone(prefab), id: createId() };\r\n const draftInstance = structuredClone(instance);\r\n draftInstance.prefabId = draftPrefab.id;\r\n document.prefabs.push(draftPrefab);\r\n const applied = applyPrefabInstanceConfiguration(document, draftInstance);\r\n document.prefabs.splice(document.prefabs.indexOf(draftPrefab), 1);\r\n if (!applied) return undefined;\r\n\r\n const idByAddress = new Map(draftPrefab.nodes.map((node) => [node.id, createId()] as const));\r\n const remap = (address: string): string => idByAddress.get(address) ?? address;\r\n for (const node of draftPrefab.nodes) {\n node.id = remap(node.id);\n node.children = node.children.map(remap);\n node.parentId = node.parentId === null ? instance.id : remap(node.parentId);\n rewriteNodeReferences(node, remap);\n }\n\r\n const { prefabId: _prefabId, propertyOverrides: _overrides, locallyAddedNodes: _locals, ...base } = instance;\r\n const container = { ...structuredClone(base), type: \"container\", children: draftPrefab.rootNodeIds.map(remap) } as UINode;\r\n nodes.splice(nodes.indexOf(instance), 1, container, ...draftPrefab.nodes);\r\n return { idByAddress, inserted: draftPrefab.nodes };\r\n}\r\n\r\n/**\r\n * Переписывает адреса, которые вели внутрь распакованного инстанса.\r\n *\r\n * Инстанс мог лежать в определении пресета, и тогда его содержимое было адресуемо снаружи как\r\n * `…::instanceId::prefab-node::address`. После распаковки этот узел — обычная нода владельца, поэтому\r\n * оба сегмента схлопываются в её новый id. Адрес самого инстанса не меняется: контейнер сохранил id.\r\n */\r\nfunction rewriteUnpackedAddresses(document: ProjectDocument, instanceId: string, idByAddress: ReadonlyMap<string, string>): void {\n const rewrite = (path: string): string => {\r\n const segments = splitNodePath(path);\r\n const index = segments.indexOf(instanceId);\r\n const inner = index < 0 ? undefined : segments[index + 1];\r\n const mapped = inner === undefined ? undefined : idByAddress.get(inner);\r\n if (mapped === undefined) return path;\r\n return [...segments.slice(0, index), mapped, ...segments.slice(index + 2)].join(PREFAB_NODE_PATH_SEPARATOR);\r\n };\n forEachPrefabInstance(document, (instance) => {\n for (const override of instance.propertyOverrides ?? []) override.nodeId = rewrite(override.nodeId);\n rewritePrefabInstanceReferencePatches(instance, rewrite);\n for (const local of instance.locallyAddedNodes ?? []) if (local.parentId !== null) local.parentId = rewrite(local.parentId);\n for (const local of instance.locallyAddedNodes ?? []) rewriteNodeReferences(local, rewrite);\n });\n}\r\n\r\n/**\r\n * Снимает binding-ключи, которые распаковка размножила в одной области разрешения.\r\n *\r\n * Внутри инстанса ключ принадлежал области этого инстанса, поэтому один и тот же пресет мог стоять на\r\n * сцене сколько угодно раз. Распакованные узлы попадают в область владельца, где ключ обязан быть\r\n * уникальным, поэтому конфликт разрешается в пользу узла, который существовал до распаковки, а среди\r\n * одних только новых узлов — в пользу первого.\r\n */\r\nfunction dropDuplicateBindingKeys(document: ProjectDocument, unpackedNodes: ReadonlyMap<string, UINode>): string[] {\r\n const dropped: string[] = [];\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const graph = resolveOwnerNodeGraph(document, owner);\r\n for (const scopeNodes of collectBindingKeyScopes(graph).values()) {\r\n for (const [key, nodeIds] of collectBindingKeys(scopeNodes)) {\r\n if (key === \"\" || nodeIds.length <= 1) continue;\r\n const unpacked = nodeIds.filter((id) => unpackedNodes.has(id));\r\n const victims = unpacked.length === nodeIds.length ? unpacked.slice(1) : unpacked;\r\n for (const id of victims) {\r\n delete unpackedNodes.get(id)!.bindingKey;\r\n if (!dropped.includes(key)) dropped.push(key);\r\n }\r\n }\r\n }\r\n }\r\n return dropped;\r\n}\r\n\r\nexport type PrefabUnpackResult = { instances: number; droppedBindingKeys: string[] };\r\n\r\n/**\r\n * Разворачивает все инстансы пресета обратно в обычные узлы своих владельцев.\r\n *\r\n * Так удаление пресета перестаёт зависеть от того, используется он или нет: сцена сохраняет ровно то\r\n * же изображение, но её узлы больше не ссылаются на определение. Операция идёт по документу целиком —\r\n * сцены, определения других пресетов и локально добавленные поддеревья внутри инстансов.\r\n *\r\n * `undefined` означает, что конфигурация одного из инстансов не разложилась на узлы; вызывающий\r\n * должен отбросить весь кандидат-документ, а не применять его частично.\r\n */\r\nexport function unpackPrefabInstances(document: ProjectDocument, prefabId: string, createId: () => string): PrefabUnpackResult | undefined {\r\n const unpackedNodes = new Map<string, UINode>();\r\n let instances = 0;\r\n // Локация ищется заново на каждом шаге: распаковка внешнего инстанса переносит вложенные в новые\r\n // массивы узлов, поэтому собранные заранее ссылки протухли бы.\r\n for (let location = locatePrefabInstances(document, prefabId)[0]; location !== undefined; location = locatePrefabInstances(document, prefabId)[0]) {\r\n const instanceId = location.instance.id;\r\n const unpacked = unpackInstance(document, location, createId);\r\n if (unpacked === undefined) return undefined;\r\n rewriteUnpackedAddresses(document, instanceId, unpacked.idByAddress);\r\n for (const node of unpacked.inserted) unpackedNodes.set(node.id, node);\r\n instances += 1;\r\n }\r\n return { instances, droppedBindingKeys: dropDuplicateBindingKeys(document, unpackedNodes) };\r\n}\r\n\r\nexport function resolveOwnerNodeGraph(\r\n document: ProjectDocument,\r\n owner: { readonly rootNodeIds: readonly string[]; readonly nodes: readonly UINode[] },\r\n): { rootNodeIds: string[]; nodes: UINode[]; origins: Map<string, MaterializedPrefabNodeOrigin> } {\r\n const nodes = structuredClone(owner.nodes) as UINode[];\r\n const nodesById = new Map(nodes.map((node) => [node.id, node]));\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n for (const ownerNode of owner.nodes) {\r\n if (ownerNode.type !== \"prefab-instance\") continue;\r\n const instanceCopy = nodesById.get(ownerNode.id);\r\n const materialized = materializePrefabInstance(document, ownerNode);\r\n if (materialized === undefined || instanceCopy === undefined) continue;\r\n instanceCopy.children = [...materialized.rootNodeIds];\r\n for (const materializedNode of materialized.nodes) {\r\n if (materializedNode.parentId === null) materializedNode.parentId = ownerNode.id;\r\n nodes.push(materializedNode);\r\n nodesById.set(materializedNode.id, materializedNode);\r\n }\r\n materialized.origins.forEach((origin, id) => origins.set(id, origin));\r\n }\r\n\r\n return { rootNodeIds: [...owner.rootNodeIds], nodes, origins };\r\n}\r\n"]}
|