mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-08-10 00:08:03 +00:00
Add GPU support for node graph
This commit is contained in:
parent
49c171b419
commit
f6e4dbf3e3
11 changed files with 232 additions and 52 deletions
|
@ -17,11 +17,11 @@ pub trait DynamicInput<'n> {
|
|||
fn set_arg_by_index(&mut self, index: usize, value: DynAnyNode<'n>);
|
||||
}
|
||||
|
||||
pub trait AnyRef<'n, I: StaticType>: Node<'n, I> {
|
||||
pub trait AnyRef<'n, I: 'n + StaticType>: Node<'n, &'n I> {
|
||||
fn any(&'n self, input: &'n dyn DynAny<'n>) -> Self::Output;
|
||||
}
|
||||
|
||||
impl<'n, T: Node<'n, I>, I: StaticType + 'n> AnyRef<'n, I> for T {
|
||||
impl<'n, N: Node<'n, &'n I>, I: StaticType + 'n> AnyRef<'n, I> for N {
|
||||
fn any(&'n self, input: &'n dyn DynAny<'n>) -> Self::Output {
|
||||
self.eval(downcast_ref::<I>(input).unwrap_or_else(|| {
|
||||
panic!(
|
||||
|
|
|
@ -27,11 +27,11 @@ mod mul {
|
|||
}
|
||||
impl<'n> Node<'n, ()> for MulNodeAnyProxy<'n> {
|
||||
type Output = MulNodeInput<'n>;
|
||||
fn eval(&'n self, _input: &'n ()) -> <Self as graphene_std::Node<'n, ()>>::Output {
|
||||
let a = self.a.unwrap().eval(&());
|
||||
fn eval(&'n self, _input: ()) -> <Self as graphene_std::Node<'n, ()>>::Output {
|
||||
let a = self.a.unwrap().eval(());
|
||||
let a: &f32 = self
|
||||
.a
|
||||
.map(|v| downcast_ref(v.eval(&())).unwrap())
|
||||
.map(|v| downcast_ref(v.eval(())).unwrap())
|
||||
.unwrap_or(&1.);
|
||||
/*let b: &f32 = self
|
||||
.b
|
||||
|
@ -43,9 +43,9 @@ mod mul {
|
|||
}
|
||||
impl<'n> Node<'n, ()> for MulNodeTypedProxy<'n> {
|
||||
type Output = MulNodeInput<'n>;
|
||||
fn eval(&'n self, _input: &'n ()) -> <Self as graphene_std::Node<'n, ()>>::Output {
|
||||
let a = self.a.unwrap().eval(&());
|
||||
let b = self.b.unwrap().eval(&());
|
||||
fn eval(&'n self, _input: ()) -> <Self as graphene_std::Node<'n, ()>>::Output {
|
||||
let a = self.a.unwrap().eval(());
|
||||
let b = self.b.unwrap().eval(());
|
||||
MulNodeInput { a, b }
|
||||
}
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ fn main() {
|
|||
//let node = unsafe { stack.get(0) };
|
||||
//let boxed = Box::new(StorageNode::new(node));
|
||||
//unsafe { stack.push(boxed) };
|
||||
let result = unsafe { &stack.get()[0] }.eval(&());
|
||||
let result = unsafe { &stack.get()[0] }.eval(());
|
||||
/*unsafe {
|
||||
stack
|
||||
.push(Box::new(AnyRefNode::new(stack.get(0).as_ref()))
|
||||
|
|
|
@ -8,7 +8,7 @@ pub struct CacheNode<'n, CachedNode: Node<'n, Input>, Input> {
|
|||
}
|
||||
impl<'n, CashedNode: Node<'n, Input>, Input> Node<'n, Input> for CacheNode<'n, CashedNode, Input> {
|
||||
type Output = &'n CashedNode::Output;
|
||||
fn eval(&'n self, input: &'n Input) -> Self::Output {
|
||||
fn eval(&'n self, input: Input) -> Self::Output {
|
||||
self.cache.get_or_init(|| self.node.eval(input))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ impl<'n, N: Node<'n, I, Output = &'n O>, I, O: DynAny<'n>> Node<'n, I>
|
|||
for AnyRefNode<'n, N, I, &'n O>
|
||||
{
|
||||
type Output = &'n (dyn DynAny<'n>);
|
||||
fn eval(&'n self, input: &'n I) -> Self::Output {
|
||||
fn eval(&'n self, input: I) -> Self::Output {
|
||||
let value: &O = self.0.eval(input);
|
||||
value
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ pub struct StorageNode<'n>(&'n dyn Node<'n, (), Output = &'n dyn DynAny<'n>>);
|
|||
|
||||
impl<'n> Node<'n, ()> for StorageNode<'n> {
|
||||
type Output = &'n (dyn DynAny<'n>);
|
||||
fn eval(&'n self, input: &'n ()) -> Self::Output {
|
||||
fn eval(&'n self, input: ()) -> Self::Output {
|
||||
let value = self.0.eval(input);
|
||||
value
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ impl<'n> StorageNode<'n> {
|
|||
pub struct AnyValueNode<'n, T>(T, PhantomData<&'n ()>);
|
||||
impl<'n, T: 'n + DynAny<'n>> Node<'n, ()> for AnyValueNode<'n, T> {
|
||||
type Output = &'n dyn DynAny<'n>;
|
||||
fn eval(&'n self, _input: &()) -> &'n dyn DynAny<'n> {
|
||||
fn eval(&'n self, _input: ()) -> &'n dyn DynAny<'n> {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue