An asset could only be picked as a setting on the Spawn node. It could not be wired in, held in a variable or put into a list. Finding an object below the own one needed a scene-wide search by name. - "Asset" is now a kind like Animation or Sound: port, variable, list item and a new "Asset" literal node, with its own cube icon. - Spawn and Is asset have an `asset` input. It uses the key of the old setting, so a saved asset reads as the value of the input and older projects keep spawning without a migration. - New node "Child by name" searches below an object level by level. A child wins over a grandchild of the same name. Nothing found or no object gives null. Tests: - ./check.sh: 168 files, 2453 tests, CHECK EXIT 0. - 9 new unit tests in tests/core/asset-kind.test.ts, catalog cases for Spawn, Is asset, Child by name and the literal. - e2e 6z-ii (2 checks): node rows and a real drag of the literal onto `asset`. e2e 6: 119 checks passed. Spawn checks in 3 and 9 passed. - Counter-checks: depth-first search fails 1, Spawn reading only the old setting fails 3, runtime ignoring the parent fails 1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
21 lines
760 B
TypeScript
21 lines
760 B
TypeScript
import type { NodeDef } from '../../NodeRegistry';
|
||
import { asEntity, asString } from '../../values';
|
||
import { obj, str } from '../shared';
|
||
|
||
export const ChildByName: NodeDef = {
|
||
type: 'ChildByName',
|
||
label: 'Child by name',
|
||
category: 'data',
|
||
description:
|
||
'Finds an object by its name below the given one – among its children, their children and so on. ' +
|
||
'The nearest level wins; within a level, the first in hierarchy order. Nothing when none is called so.',
|
||
inputs: [obj('object'), str('name')],
|
||
outputs: [obj('child')],
|
||
params: [],
|
||
run: (ctx, inputs) => {
|
||
const parent = asEntity(inputs.object);
|
||
const name = asString(inputs.name);
|
||
return { outputs: { child: parent ? ctx.childByName(parent, name) : null } };
|
||
},
|
||
};
|