
# Objective - Adding a node to the render_graph can be quite verbose and error prone because there's a lot of moving parts to it. ## Solution - Encapsulate this in a simple utility method - Mostly intended for optional nodes that have specific ordering - Requires that the `Node` impl `FromWorld`, but every internal node is built using a new function taking a `&mut World` so it was essentially already `FromWorld` - Use it for the bloom, fxaa and taa, nodes. - The main nodes don't use it because they rely more on the order of many nodes being added --- ## Changelog - Impl `FromWorld` for `BloomNode`, `FxaaNode` and `TaaNode` - Added `RenderGraph::add_node_edges()` - Added `RenderGraph::sub_graph()` - Added `RenderGraph::sub_graph_mut()` - Added `RenderGraphApp`, `RenderGraphApp::add_render_graph_node`, `RenderGraphApp::add_render_graph_edges`, `RenderGraphApp::add_render_graph_edge` ## Notes ~~This was taken out of https://github.com/bevyengine/bevy/pull/7995 because it works on it's own. Once the linked PR is done, the new `add_node()` will be simplified a bit since the input/output params won't be necessary.~~ This feature will be useful in most of the upcoming render nodes so it's impact will be more relevant at that point. Partially fixes #7985 ## Future work * Add a way to automatically label nodes or at least make it part of the trait. This would remove one more field from the functions added in this PR * Use it in the main pass 2d/3d --------- Co-authored-by: Carter Anderson <mcanders1@gmail.com>
49 lines
1.4 KiB
Rust
49 lines
1.4 KiB
Rust
mod app;
|
|
mod context;
|
|
mod edge;
|
|
mod graph;
|
|
mod node;
|
|
mod node_slot;
|
|
|
|
pub use app::*;
|
|
pub use context::*;
|
|
pub use edge::*;
|
|
pub use graph::*;
|
|
pub use node::*;
|
|
pub use node_slot::*;
|
|
|
|
use thiserror::Error;
|
|
|
|
#[derive(Error, Debug, Eq, PartialEq)]
|
|
pub enum RenderGraphError {
|
|
#[error("node does not exist")]
|
|
InvalidNode(NodeLabel),
|
|
#[error("output node slot does not exist")]
|
|
InvalidOutputNodeSlot(SlotLabel),
|
|
#[error("input node slot does not exist")]
|
|
InvalidInputNodeSlot(SlotLabel),
|
|
#[error("node does not match the given type")]
|
|
WrongNodeType,
|
|
#[error("attempted to connect a node output slot to an incompatible input node slot")]
|
|
MismatchedNodeSlots {
|
|
output_node: NodeId,
|
|
output_slot: usize,
|
|
input_node: NodeId,
|
|
input_slot: usize,
|
|
},
|
|
#[error("attempted to add an edge that already exists")]
|
|
EdgeAlreadyExists(Edge),
|
|
#[error("attempted to remove an edge that does not exist")]
|
|
EdgeDoesNotExist(Edge),
|
|
#[error("node has an unconnected input slot")]
|
|
UnconnectedNodeInputSlot { node: NodeId, input_slot: usize },
|
|
#[error("node has an unconnected output slot")]
|
|
UnconnectedNodeOutputSlot { node: NodeId, output_slot: usize },
|
|
#[error("node input slot already occupied")]
|
|
NodeInputSlotAlreadyOccupied {
|
|
node: NodeId,
|
|
input_slot: usize,
|
|
occupied_by_node: NodeId,
|
|
},
|
|
}
|