ohm 0.0.0

High performance 2D graphics library
Documentation
//! Nodes used in the frame graph.

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 containing any possible Node
#[enum_dispatch(Node)]
#[derive(Debug)]
pub enum AnyNode<B: Backend> {
    DrawTriangle(DrawTriangle<B>),
}

/// Enum containing any possible NodePlan
#[enum_dispatch(NodePlan)]
#[derive(Clone, Eq, Hash, PartialEq)]
pub enum AnyNodePlan<B: Backend> {
    DrawTrianglePlan(DrawTrianglePlan<B>),
}