|
#[macro_use] |
|
extern crate log; |
|
|
|
pub mod animation; |
|
pub mod blending; |
|
pub mod blending_nodes; |
|
pub mod bounds; |
|
pub mod color; |
|
pub mod consts; |
|
pub mod context; |
|
pub mod debug; |
|
pub mod extract_xy; |
|
pub mod generic; |
|
pub mod gradient; |
|
mod graphic_element; |
|
pub mod instances; |
|
pub mod logic; |
|
pub mod math; |
|
pub mod memo; |
|
pub mod misc; |
|
pub mod ops; |
|
pub mod raster; |
|
pub mod raster_types; |
|
pub mod registry; |
|
pub mod structural; |
|
pub mod text; |
|
pub mod transform; |
|
pub mod transform_nodes; |
|
pub mod uuid; |
|
pub mod value; |
|
pub mod vector; |
|
|
|
pub use crate as graphene_core; |
|
pub use blending::*; |
|
pub use context::*; |
|
pub use ctor; |
|
pub use dyn_any::{StaticTypeSized, WasmNotSend, WasmNotSync}; |
|
pub use graphic_element::*; |
|
pub use memo::MemoHash; |
|
pub use num_traits; |
|
pub use raster::Color; |
|
use std::any::TypeId; |
|
use std::future::Future; |
|
use std::pin::Pin; |
|
pub use types::Cow; |
|
|
|
|
|
|
|
|
|
pub trait Node<'i, Input> { |
|
type Output: 'i; |
|
|
|
fn eval(&'i self, input: Input) -> Self::Output; |
|
|
|
fn reset(&self) {} |
|
|
|
fn node_name(&self) -> &'static str { |
|
std::any::type_name::<Self>() |
|
} |
|
|
|
fn serialize(&self) -> Option<std::sync::Arc<dyn std::any::Any + Send + Sync>> { |
|
log::warn!("Node::serialize not implemented for {}", std::any::type_name::<Self>()); |
|
None |
|
} |
|
} |
|
|
|
mod types; |
|
pub use types::*; |
|
|
|
pub trait NodeIO<'i, Input>: Node<'i, Input> |
|
where |
|
Self::Output: 'i + StaticTypeSized, |
|
Input: StaticTypeSized, |
|
{ |
|
fn input_type(&self) -> TypeId { |
|
TypeId::of::<Input::Static>() |
|
} |
|
fn input_type_name(&self) -> &'static str { |
|
std::any::type_name::<Input>() |
|
} |
|
fn output_type(&self) -> TypeId { |
|
TypeId::of::<<Self::Output as StaticTypeSized>::Static>() |
|
} |
|
fn output_type_name(&self) -> &'static str { |
|
std::any::type_name::<Self::Output>() |
|
} |
|
fn to_node_io(&self, inputs: Vec<Type>) -> NodeIOTypes { |
|
NodeIOTypes { |
|
call_argument: concrete!(<Input as StaticTypeSized>::Static), |
|
return_value: concrete!(<Self::Output as StaticTypeSized>::Static), |
|
inputs, |
|
} |
|
} |
|
fn to_async_node_io(&self, inputs: Vec<Type>) -> NodeIOTypes |
|
where |
|
<Self::Output as Future>::Output: StaticTypeSized, |
|
Self::Output: Future, |
|
{ |
|
NodeIOTypes { |
|
call_argument: concrete!(<Input as StaticTypeSized>::Static), |
|
return_value: future!(<<Self::Output as Future>::Output as StaticTypeSized>::Static), |
|
inputs, |
|
} |
|
} |
|
} |
|
|
|
impl<'i, N: Node<'i, I>, I> NodeIO<'i, I> for N |
|
where |
|
N::Output: 'i + StaticTypeSized, |
|
I: StaticTypeSized, |
|
{ |
|
} |
|
|
|
impl<'i, I: 'i, N: Node<'i, I> + ?Sized> Node<'i, I> for &'i N { |
|
type Output = N::Output; |
|
fn eval(&'i self, input: I) -> N::Output { |
|
(*self).eval(input) |
|
} |
|
} |
|
impl<'i, I: 'i, O: 'i, N: Node<'i, I, Output = O> + ?Sized> Node<'i, I> for Box<N> { |
|
type Output = O; |
|
fn eval(&'i self, input: I) -> O { |
|
(**self).eval(input) |
|
} |
|
} |
|
impl<'i, I: 'i, O: 'i, N: Node<'i, I, Output = O> + ?Sized> Node<'i, I> for std::sync::Arc<N> { |
|
type Output = O; |
|
fn eval(&'i self, input: I) -> O { |
|
(**self).eval(input) |
|
} |
|
} |
|
|
|
impl<'i, I, O: 'i> Node<'i, I> for Pin<Box<dyn Node<'i, I, Output = O> + 'i>> { |
|
type Output = O; |
|
fn eval(&'i self, input: I) -> O { |
|
(**self).eval(input) |
|
} |
|
} |
|
impl<'i, I, O: 'i> Node<'i, I> for Pin<&'i (dyn NodeIO<'i, I, Output = O> + 'i)> { |
|
type Output = O; |
|
fn eval(&'i self, input: I) -> O { |
|
(**self).eval(input) |
|
} |
|
} |
|
|
|
pub trait InputAccessorSource<'a, T>: InputAccessorSourceIdentifier + std::fmt::Debug { |
|
fn get_input(&'a self, index: usize) -> Option<&'a T>; |
|
fn set_input(&'a mut self, index: usize, value: T); |
|
} |
|
|
|
pub trait InputAccessorSourceIdentifier { |
|
fn has_identifier(&self, identifier: &str) -> bool; |
|
} |
|
|
|
pub trait InputAccessor<'n, Source: 'n> |
|
where |
|
Self: Sized, |
|
{ |
|
fn new_with_source(source: &'n Source) -> Option<Self>; |
|
} |
|
|
|
pub trait NodeInputDecleration { |
|
const INDEX: usize; |
|
fn identifier() -> &'static str; |
|
type Result; |
|
} |
|
|
|
pub trait AsU32 { |
|
fn as_u32(&self) -> u32; |
|
} |
|
impl AsU32 for u32 { |
|
fn as_u32(&self) -> u32 { |
|
*self |
|
} |
|
} |
|
|