Browse Source

Enable chain lighting from nanoBanana output nodes

- findUpstreamLightingSettings now reads lighting from both imageInput
  and upstream nanoBanana nodes, fixing broken lighting propagation
- Clicking lighting on a nanoBanana node auto-creates a downstream
  nanoBanana if none exists, connects it, applies lighting, and runs
TEST-x
xuzhijie 2 months ago
parent
commit
01a610f5a1
  1. 26
      src/components/WorkflowCanvas.tsx
  2. 13
      src/store/execution/nanoBananaExecutor.ts

26
src/components/WorkflowCanvas.tsx

@ -1284,9 +1284,31 @@ export function WorkflowCanvas() {
}
}
} else if (sourceNode.type === "nanoBanana") {
updateNodeData(sourceNode.id, { lighting: settings } as Partial<NanoBananaNodeData>);
// nanoBanana 打光:查找下游是否已有 nanoBanana 节点,没有则自动创建
const downstreamImageNode = edges
.filter((edge) => edge.source === sourceNode.id && !edge.data?.isLoop)
.map((edge) => nodes.find((node) => node.id === edge.target))
.find((node) => node?.type === "nanoBanana");
if (downstreamImageNode) {
updateNodeData(downstreamImageNode.id, { lighting: settings } as Partial<NanoBananaNodeData>);
if (!isRunning) {
targetNodeId = sourceNode.id;
targetNodeId = downstreamImageNode.id;
}
} else if (!isRunning) {
// 没有下游 nanoBanana,自动创建一个并连接
const sourceW = sourceNode.measured?.width ?? 300;
const genX = sourceNode.position.x + sourceW + 160;
const genY = sourceNode.position.y;
const genNodeId = addNode("nanoBanana", { x: genX, y: genY });
updateNodeData(genNodeId, { lighting: settings } as Partial<NanoBananaNodeData>);
onConnect({
source: sourceNode.id,
sourceHandle: "image",
target: genNodeId,
targetHandle: "image",
});
targetNodeId = genNodeId;
}
}

13
src/store/execution/nanoBananaExecutor.ts

@ -39,9 +39,18 @@ function findUpstreamLightingSettings(
if (edge.target !== nodeId || edge.data?.isLoop) continue;
const sourceNode = nodes.find((candidate) => candidate.id === edge.source);
if (sourceNode?.type !== "imageInput") continue;
if (!sourceNode) continue;
// 从 imageInput 或 nanoBanana 节点读取打光设置
let lighting: LightingSettings | undefined;
if (sourceNode.type === "imageInput") {
lighting = (sourceNode.data as ImageInputNodeData).lighting;
} else if (sourceNode.type === "nanoBanana") {
lighting = (sourceNode.data as NanoBananaNodeData).lighting;
} else {
continue;
}
const lighting = (sourceNode.data as ImageInputNodeData).lighting;
if (lighting?.enabled) {
return lighting;
}

Loading…
Cancel
Save