public virtual void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) { if (asset == null || hasError) { return; } registry.RequiresIncludes(asset.includes); foreach (var function in asset.functions) { registry.ProvideFunction(function.key, s => { s.AppendLines(function.value); }); } }
public virtual void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) { if (asset == null || hasError) { return; } registry.RequiresIncludes(asset.includes); var graphData = registry.builder.currentNode.owner; var graphDefaultConcretePrecision = graphData.graphDefaultConcretePrecision; foreach (var function in asset.functions) { var name = function.key; var source = function.value; var graphPrecisionFlags = function.graphPrecisionFlags; // the subgraph may use multiple precision variants of this function internally // here we iterate through all the requested precisions and forward those requests out to the graph for (int requestedGraphPrecision = 0; requestedGraphPrecision <= (int)GraphPrecision.Half; requestedGraphPrecision++) { // only provide requested precisions if ((graphPrecisionFlags & (1 << requestedGraphPrecision)) != 0) { // when a function coming from a subgraph asset has a graph precision of "Graph", // that means it is up to the subgraph NODE to decide (i.e. us!) GraphPrecision actualGraphPrecision = (GraphPrecision)requestedGraphPrecision; // subgraph asset setting falls back to this node setting (when switchable) actualGraphPrecision = actualGraphPrecision.GraphFallback(this.graphPrecision); // which falls back to the graph default concrete precision ConcretePrecision actualConcretePrecision = actualGraphPrecision.ToConcrete(graphDefaultConcretePrecision); // forward the function into the current graph registry.ProvideFunction(name, actualGraphPrecision, actualConcretePrecision, sb => sb.AppendLines(source)); } } } }