28 lines
1.8 KiB
JavaScript
28 lines
1.8 KiB
JavaScript
const virtualTypes=new Set(['GetNode','SetNode','Reroute','AdachiExclusiveSwitch']);
|
|
function members(group,seen=new Set()) {
|
|
if(seen.has(group))return [];seen.add(group);group.recomputeInsideNodes?.();
|
|
return [...new Set(Array.from(group._children||group._nodes||group.nodes||[]).flatMap(child=>
|
|
typeof child.recomputeInsideNodes==='function'?members(child,seen):[child]))];
|
|
}
|
|
export function workspaceRoutingNodes(roots,controller) {
|
|
const allowed=new Set();
|
|
const plan=controller?.active&&controller.planStates?controller.planStates(controller.active).plan:null;
|
|
for(const root of roots)if(root.mode===4){
|
|
const groups=Array.from(root.graph?.groups||root.graph?._groups||[]).map(group=>{
|
|
const nodes=members(group);return {nodes,area:Math.abs((group.size?.[0]||1)*(group.size?.[1]||1))};
|
|
}).filter(group=>group.nodes.includes(root)).sort((a,b)=>a.area-b.area);
|
|
const group=groups[0];if(!group)continue;
|
|
const inherited=plan?.has(root)?plan.get(root)===4:group.nodes.filter(n=>!['AdachiGroupPresets','Note','MarkdownNote'].includes(n.type)).every(n=>n.mode===4);
|
|
if(inherited)for(const node of group.nodes)allowed.add(node);
|
|
}
|
|
const found=new Set(),seen=new Set();
|
|
const visit=node=>{
|
|
if(!node||seen.has(node))return;seen.add(node);
|
|
if(!roots.includes(node)&&!virtualTypes.has(node.type))return;
|
|
if(virtualTypes.has(node.type)&&node.mode===4&&allowed.has(node))found.add(node);
|
|
if(node.type==='GetNode'){const setter=node.findSetter?.(node.graph);if(setter)visit(setter);}
|
|
for(const input of node.inputs||[]){const g=node.graph,l=g?.getLink?.(input.link)??g?.links?.get?.(input.link)??g?.links?.[input.link];if(l)visit(g.getNodeById(l.origin_id));}
|
|
};
|
|
roots.forEach(visit);return found;
|
|
}
|