diff --git a/node-graph/node-macro/src/shader_nodes/mod.rs b/node-graph/node-macro/src/shader_nodes/mod.rs index 3eff7fed1..26e1ebba8 100644 --- a/node-graph/node-macro/src/shader_nodes/mod.rs +++ b/node-graph/node-macro/src/shader_nodes/mod.rs @@ -21,6 +21,10 @@ pub fn modify_cfg(attributes: &NodeFnAttributes) -> TokenStream { #[derive(Debug, Clone, VariantNames)] pub(crate) enum ShaderNodeType { + /// Marker for this node being a generated gpu node implementation, that should not emit anything to prevent + /// recursively generating more gpu nodes. But it still counts as a gpu node and will get the + /// `#[cfg(feature = "std")]` feature gate around it's impl. + GpuNode, PerPixelAdjust(PerPixelAdjust), } @@ -41,17 +45,24 @@ pub trait CodegenShaderEntryPoint { impl CodegenShaderEntryPoint for ShaderNodeType { fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result { - if parsed.is_async { - return Err(Error::new_spanned(&parsed.fn_name, "Shader nodes must not be async")); + match self { + ShaderNodeType::GpuNode => (), + _ => { + if parsed.is_async { + return Err(Error::new_spanned(&parsed.fn_name, "Shader nodes must not be async")); + } + } } match self { + ShaderNodeType::GpuNode => Ok(TokenStream::new()), ShaderNodeType::PerPixelAdjust(x) => x.codegen_shader_entry_point(parsed), } } fn codegen_gpu_node(&self, parsed: &ParsedNodeFn) -> syn::Result { match self { + ShaderNodeType::GpuNode => Ok(TokenStream::new()), ShaderNodeType::PerPixelAdjust(x) => x.codegen_gpu_node(parsed), } } diff --git a/node-graph/node-macro/src/shader_nodes/per_pixel_adjust.rs b/node-graph/node-macro/src/shader_nodes/per_pixel_adjust.rs index 7e3a64417..36cbff50b 100644 --- a/node-graph/node-macro/src/shader_nodes/per_pixel_adjust.rs +++ b/node-graph/node-macro/src/shader_nodes/per_pixel_adjust.rs @@ -1,11 +1,12 @@ use crate::parsing::{Input, NodeFnAttributes, ParsedField, ParsedFieldType, ParsedNodeFn, RegularParsedField}; -use crate::shader_nodes::CodegenShaderEntryPoint; +use crate::shader_nodes::{CodegenShaderEntryPoint, ShaderNodeType}; use convert_case::{Case, Casing}; -use proc_macro2::{Ident, TokenStream}; +use proc_macro2::{Ident, Span, TokenStream}; use quote::{ToTokens, format_ident, quote}; use std::borrow::Cow; use syn::parse::{Parse, ParseStream}; -use syn::{Path, Type, TypePath}; +use syn::punctuated::Punctuated; +use syn::{Path, Token, TraitBound, TraitBoundModifier, Type, TypeImplTrait, TypeParamBound}; #[derive(Debug, Clone)] pub struct PerPixelAdjust {} @@ -115,12 +116,16 @@ impl CodegenShaderEntryPoint for PerPixelAdjust { ParsedFieldType::Node { .. } => Err(syn::Error::new_spanned(&f.pat_ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics")), }) .collect::>()?; - let body = quote! {}; + let body = quote! { + { + + } + }; crate::codegen::generate_node_code(&ParsedNodeFn { vis: parsed.vis.clone(), attributes: NodeFnAttributes { - shader_node: None, + shader_node: Some(ShaderNodeType::GpuNode), ..parsed.attributes.clone() }, fn_name, @@ -130,9 +135,14 @@ impl CodegenShaderEntryPoint for PerPixelAdjust { where_clause: None, input: Input { pat_ident: parsed.input.pat_ident.clone(), - ty: Type::Path(TypePath { - path: Path::from(format_ident!("Ctx")), - qself: None, + ty: Type::ImplTrait(TypeImplTrait { + impl_token: Token![impl](Span::call_site()), + bounds: Punctuated::from_iter([TypeParamBound::Trait(TraitBound { + paren_token: None, + modifier: TraitBoundModifier::None, + lifetimes: None, + path: Path::from(format_ident!("Ctx")), + })]), }), implementations: Default::default(), },