64 lines
2.6 KiB
C#
64 lines
2.6 KiB
C#
using System;
|
|
|
|
namespace UnityEditor.ShaderGraph.Internal
|
|
{
|
|
// ------------------------------------------------------------------------------------------
|
|
//
|
|
// The general use of precision follows this data flow
|
|
//
|
|
// Precision -- user selectable precision setting on each node
|
|
// == apply precision inherit rules based on node inputs ==>
|
|
// GraphPrecision -- where "GraphPrecision.Graph" means use the graph default setting
|
|
// == fallback to graph defaults ==>
|
|
// GraphPrecision -- where "GraphPrecision.Graph" means it is switchable when in a subgraph
|
|
// == shadergraph concretization ==>
|
|
// ConcretePrecision -- the actual precision used by the node, half or single
|
|
//
|
|
// We could at some point separate the two GraphPrecision uses into separate enums,
|
|
// but they're close enough we're using one enum for both uses at the moment
|
|
//
|
|
// ------------------------------------------------------------------------------------------
|
|
|
|
// this is generally used for user-selectable precision
|
|
[Serializable]
|
|
enum Precision
|
|
{
|
|
Inherit, // automatically choose the precision based on the inputs
|
|
Single, // force single precision (float)
|
|
Half, // force half precision
|
|
Graph, // use the graph default (for subgraphs this will properly switch based on the subgraph node setting)
|
|
}
|
|
|
|
// this is used when calculating precision within a graph
|
|
// it basically represents the precision after applying the automatic inheritance rules
|
|
// but before applying the fallback to the graph default
|
|
// tracking this explicitly helps us build subgraph switchable precision behavior (any node using Graph can be switched)
|
|
public enum GraphPrecision
|
|
{
|
|
Single = 0, // the ordering is different here so we can use the min function to resolve inherit/automatic behavior
|
|
Graph = 1,
|
|
Half = 2
|
|
}
|
|
|
|
// this is the actual set of precisions we have, a shadergraph must resolve every node to one of these
|
|
// in subgraphs, this concrete precision is only used for preview, and may not represent the actual precision of those nodes
|
|
// when used in a shader graph
|
|
[Serializable]
|
|
public enum ConcretePrecision
|
|
{
|
|
Single,
|
|
Half,
|
|
}
|
|
|
|
// inherit(auto) rules for combining input types
|
|
|
|
// half + half ==> half
|
|
// single + single ==> single
|
|
// single + half ==> single
|
|
// single + graph ==> single
|
|
// half + graph ==> graph
|
|
// single + half + graph ==> single
|
|
//
|
|
// basically: take the min when arranged like so: single(0), graph(1), half(2)
|
|
}
|