macro_rules! unwrap_node {
($node:expr, $name:ident) => {
if let AnyNode::$name(v) = $node {
v
} else {
panic!("expected {} node, found {:?}", stringify!($name), $node);
}
};
}
mod triangle;
pub use self::triangle::{DrawTriangle, DrawTrianglePlan};
use std::fmt::Debug;
use std::hash::Hash;
use enum_dispatch::enum_dispatch;
use gfx_hal::Backend;
use crate::encoder::Encoder;
use crate::factory::Factory;
#[enum_dispatch]
pub trait Node<B: Backend>: Debug {
fn run(&mut self, factory: &mut Factory<B>, encoder: Encoder<'_, B>);
fn destroy(self, factory: &mut Factory<B>);
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct NodeId(pub u16);
impl From<u16> for NodeId {
fn from(v: u16) -> NodeId {
NodeId(v)
}
}
impl Into<u16> for NodeId {
fn into(self) -> u16 {
self.0
}
}
#[enum_dispatch]
pub trait NodePlan<B: Backend>: Clone + Hash + Eq {
fn build(&self, factory: &mut Factory<B>) -> AnyNode<B>;
fn rebuild(&self, factory: &mut Factory<B>, node: &mut AnyNode<B>);
}
#[enum_dispatch(Node)]
#[derive(Debug)]
pub enum AnyNode<B: Backend> {
DrawTriangle(DrawTriangle<B>),
}
#[enum_dispatch(NodePlan)]
#[derive(Clone, Eq, Hash, PartialEq)]
pub enum AnyNodePlan<B: Backend> {
DrawTrianglePlan(DrawTrianglePlan<B>),
}