bevy/examples/shader
IceSentry 2c21d423fd
Make render graph slots optional for most cases (#8109)
# Objective

- Currently, the render graph slots are only used to pass the
view_entity around. This introduces significant boilerplate for very
little value. Instead of using slots for this, make the view_entity part
of the `RenderGraphContext`. This also means we won't need to have
`IN_VIEW` on every node and and we'll be able to use the default impl of
`Node::input()`.

## Solution

- Add `view_entity: Option<Entity>` to the `RenderGraphContext`
- Update all nodes to use this instead of entity slot input

---

## Changelog

- Add optional `view_entity` to `RenderGraphContext`

## Migration Guide

You can now get the view_entity directly from the `RenderGraphContext`. 

When implementing the Node:

```rust
// 0.10
struct FooNode;
impl FooNode {
    const IN_VIEW: &'static str = "view";
}
impl Node for FooNode {
    fn input(&self) -> Vec<SlotInfo> {
        vec![SlotInfo::new(Self::IN_VIEW, SlotType::Entity)]
    }
    fn run(
        &self,
        graph: &mut RenderGraphContext,
        // ... 
    ) -> Result<(), NodeRunError> {
        let view_entity = graph.get_input_entity(Self::IN_VIEW)?;
        // ...
        Ok(())
    }
}

// 0.11
struct FooNode;
impl Node for FooNode {
    fn run(
        &self,
        graph: &mut RenderGraphContext,
        // ... 
    ) -> Result<(), NodeRunError> {
        let view_entity = graph.view_entity();
        // ...
        Ok(())
    }
}
```

When adding the node to the graph, you don't need to specify a slot_edge
for the view_entity.

```rust
// 0.10
let mut graph = RenderGraph::default();
graph.add_node(FooNode::NAME, node);
let input_node_id = draw_2d_graph.set_input(vec![SlotInfo::new(
    graph::input::VIEW_ENTITY,
    SlotType::Entity,
)]);
graph.add_slot_edge(
    input_node_id,
    graph::input::VIEW_ENTITY,
    FooNode::NAME,
    FooNode::IN_VIEW,
);
// add_node_edge ...

// 0.11
let mut graph = RenderGraph::default();
graph.add_node(FooNode::NAME, node);
// add_node_edge ...
```

## Notes

This PR paired with #8007 will help reduce a lot of annoying boilerplate
with the render nodes. Depending on which one gets merged first. It will
require a bit of clean up work to make both compatible.

I tagged this as a breaking change, because using the old system to get
the view_entity will break things because it's not a node input slot
anymore.

## Notes for reviewers

A lot of the diffs are just removing the slots in every nodes and graph
creation. The important part is mostly in the
graph_runner/CameraDriverNode.
2023-03-21 20:11:13 +00:00
..
animate_shader.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
array_texture.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
compute_shader_game_of_life.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
custom_vertex_attribute.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
post_process_pass.rs Make render graph slots optional for most cases (#8109) 2023-03-21 20:11:13 +00:00
post_processing.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
shader_defs.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
shader_instancing.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
shader_material.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
shader_material_glsl.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
shader_material_screenspace_texture.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
shader_prepass.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
texture_binding_array.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00